|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058
# X# M7 L8 @3 X* C: p$ ~By Mukta & ToxicDream
8 T* Z; ~& Z: q+ J- //for delphi 50 }( [9 o, J; `* ^
- unit MMDevApi_tlb;
! O6 X1 R& s3 ^4 y" @# t
+ F( [2 w7 y0 w ^7 E$ O9 C4 ?0 z; t- interface. r/ y% _+ s3 ~; f+ O$ b5 {# @) G
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;8 N0 x# m0 Y$ j- ^& n3 U
- const, z2 M4 _' Z/ f6 ?5 F) D
- // TypeLibrary Major and minor versions
, m% k$ U7 k$ y6 _" r7 {1 X - ) Q0 y7 o# y- g
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
1 h1 A1 ^. d; [ - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
7 a6 k( m" `2 c/ l0 e( x- w - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';# z& c2 P; X+ d: L7 v; E% v
- IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
# E) p0 _7 c/ Q. m4 J - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';8 [0 v6 T! w- h: s) h
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
/ n1 T+ _" Z P7 ?) C2 P5 v, m - IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';; r' t$ |6 Y8 G( [
4 Q/ h! O5 S) M3 E' w- DEVICE_STATE_ACTIVE = $00000001;) Q; E6 m: j2 ^' Y; E9 w: M7 e# b
- DEVICE_STATE_UNPLUGGED = $00000002;
/ P, P6 t$ d8 |& [; ~ - DEVICE_STATE_NOTPRESENT = $00000004;
8 a4 v5 D# i/ P; b" N - DEVICE_STATEMASK_ALL = $00000007;- c [) s. z! m# p0 J( o9 k6 u) l
6 g; D- ^( E: I, c& s+ C( H- type/ J9 {. o6 A1 m& C7 S5 y
- EDataFlow = TOleEnum;
: N2 G9 P2 m: X& S; D2 u - const
, B( s2 t3 \& B) W% b2 ~ - eRender = $00000000;
d% a# V Q: {7 n9 A' h - eCapture = $00000001;+ u9 S. z9 L7 O" ]9 q6 y2 \
- eAll = $00000002;
) ^9 t1 g% F s - EDataFlow_enum_count = $00000003;+ @. {# }% u& }1 ?6 x
- : @3 M" d) S" h- `0 b. `2 h. t
- type0 r* @4 b: m) G- r6 U
- ERole = TOleEnum;, h- z3 R0 T M; r; s& M# E
- const7 B! T3 ~6 ]' f; r4 }% l& E: S
- eConsole = $00000000;
% K* u# S! H E. I B( J - eMultimedia = $00000001;0 n* I. \ Y! A O5 [- ?" y' s0 \1 A& Z
- eCommunications = $00000002;4 H; r- z; Y+ y& \( S# Y% h5 B
- ERole_enum_count = $00000003;- D t+ U# d+ M5 ]) G3 H* C2 j- v
5 P* a- L) I1 t- G. H4 n- type3 p' n, B! o: w' h9 V7 g# B
- IAudioEndpointVolumeCallback = interface(IUnknown)& o$ e; K3 m; h4 ^
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']: t3 s$ m% b6 E7 U' {
- end;
8 Q1 z8 e a, h
- n0 H8 B j1 C7 S' v2 w- IMMAudioEndpointVolume = interface(IUnknown)/ b. R* E/ a: G/ j& h1 s
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
" @/ Z7 E1 o/ h: V# h* p+ e - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;* A& y2 u- G- J
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall; g; s W2 y1 o
- Function GetChannelCount(out PInteger): Integer; stdcall;8 b* x& t3 x8 E2 q) [
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;, \2 S4 ]- y/ r M2 q" J
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;' v) \3 q0 T7 i9 j) w2 v
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
2 d/ U0 V/ d: r4 ]+ l4 T5 ?/ c - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;+ c: s+ H# I- P# F: S$ p, I: g
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;( b( ]' b U# `8 |3 W) r3 X4 N N4 [: ]
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;8 Q0 n1 L( J2 w% _- S* H( Z. `" ~
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
4 T$ R5 D, f, F4 a - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;
* G% H& i/ V8 z2 i- ~ - Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;
: j& o. [5 Y& B( ^$ l; [& F; d | - Function GetMute(out bMute: Boolean ) :Integer; stdcall;" I4 h: ~# s3 L- j# H' ?
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
# g3 e. N) @, I; b+ Y# R7 J - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;% b* V0 J- z$ c, I
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
1 l) I# I7 A R2 Z9 c - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
& w; g. @3 A4 }. H% @7 n9 p; W$ g - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;6 R$ J" f/ J! n6 z6 P
- end;
/ ?8 P' k7 F) u/ M: w7 t - , [& B8 F: j6 _, V2 x
- { IAudioMeterInformation = interface(IUnknown)
' S# B9 g8 v4 S6 e8 a4 V' H - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']& H. d e+ v5 z6 z& g* e" p/ L+ F
- end;}! b2 g* y% }3 W/ g; w
5 _+ g( \5 D* ]- IPropertyStore = interface(IUnknown)
7 N4 f# G1 b, H) V; ~ - end; Z; h3 _& z* Z& d0 r
$ B" c. ^* q, Q' @- type/ r% x5 B" Q# |" \/ o7 l; F
- IMMDevice = interface(IUnknown)
% ?$ H. `' q$ D - ['{D666063F-1587-4E43-81F1-B948E807363F}']5 }& O2 ~8 y, f0 B3 y
- Function Activate( refId :TGUID;
# x0 {& g/ r( d# F - dwClsCtx: DWORD;8 l+ U) p O$ i5 t2 c
- pActivationParams: PInteger ;1 E, n" m: j9 l4 C
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;7 {8 I5 m; O2 M
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;
7 Y( A6 ^. @& y2 m+ F6 O: J) ` - Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
/ z9 }, [( ^5 Y5 ] - Function GetState(out State :Integer): Hresult; stdcall;
+ ~0 @( P+ J: R& b7 I! E - . |. u& Q# }! u+ u' F
- end;( I: {1 Y# P3 Z+ m5 E( z2 f
- $ `5 p8 x/ m/ ?. C5 M& N$ H
- ! Y' Q5 Z8 ~- z H5 b- r
- IMMDeviceCollection = interface(IUnknown)0 u4 e% E2 X% O1 s9 D% G
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
' N/ Y [3 ~) @0 b! @" q) T - end;
% S8 w5 w. G- L6 ^( w4 C
/ d- b7 i3 ?; Q3 L6 i- IMMNotificationClient = interface (IUnknown)/ W$ W% E. X3 _, l- S
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
+ \: g0 q, T3 Q - end;
' u2 h3 l1 R- V4 e0 O v - ! n! i, K' u- R7 ?- h
- IMMDeviceEnumerator = interface(IUnknown)+ m! T1 U; `. F4 s& H" e+ k
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']( I1 U9 @7 l j; a! h
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
* }, ]: N4 ^6 E. R' k' y. B" M - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
2 f' l( ]0 n. }: N - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;' G; M& c; X9 ~7 Y% ]5 Y+ }- v. b$ W
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;1 [6 T) k0 I# @6 ^3 I8 T/ `6 _5 z: A
- end;
7 C+ Z/ ]0 o# ?; b4 {& p
+ |+ Y1 P. z- s7 J- implementation
% o6 \9 h; X. m! F - end.
' D- i u8 U2 Y' h* Z A1 i4 A
4 P3 _$ \( d3 p8 Z- Thanks & Reagrds,% j9 a% X4 @/ _! ]# r
- Mukta ...
/ H2 N5 a+ n. |+ I
复制代码
3 g- n% Q5 `: |& f: e- it's work in Delphi 7
, R2 ^) v( ]6 P8 l; e" x$ {# Y$ ? - //////////////////////////" ]. A$ Q, K/ h. v p! ]
* }7 L7 T& r0 p9 A' s7 o5 z- unit MMDevApi;6 o' S& t/ `$ I! V- [' r" v. ?* z* p
: S0 i8 ~+ y0 g8 F$ J. o- interface8 M" T. y' z# B$ D1 Q) }
- 4 q' y) T0 P {
- uses
% }$ ~+ z+ p/ ]# q3 @% H% R - Windows, ActiveX, ComObj;' L$ |" t4 n% t7 P) h) |/ ~8 l
8 ?6 H, i. c6 V! v; P- M- n. V* `- const
% v3 s0 m3 R+ C- Q; q7 M - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
1 O C! {/ M0 F M# K" ?! T - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';) S! j5 F" D) C- _
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';( I. [2 X t. p+ W* A: R$ q( l' j
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';) P, r8 L; R) \2 w$ p6 ^
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
+ v# J! w9 [0 t9 v - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
" L/ @7 g+ k, k - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';# R7 d" Z# w! H' a% n, d
' G! N1 e2 v4 G! ~$ V$ K- DEVICE_STATE_ACTIVE = $00000001;
3 Z- _% F T' a7 K/ C* e - DEVICE_STATE_UNPLUGGED = $00000002;
$ c) a- K4 ?& W1 f* I - DEVICE_STATE_NOTPRESENT = $00000004;, s$ n; l6 `. p: D- _3 x+ t: [: v
- DEVICE_STATEMASK_ALL = $00000007;, m. d. q5 }3 m* m$ h- N# b
3 Z& _7 Z, M& c- type
# ]; x, r1 B; Q9 x$ t - EDataFlow = TOleEnum;- {* C# O5 p- _& X" O+ M, k- j
1 m! Q$ G! u" }/ E& d2 q- X- const
, k. `, o8 n, ], B5 B - eRender = $00000000;4 R9 z% _2 V, ~0 z# ^
- eCapture = $00000001;* \; d, I9 m( T* M, Z3 r' K
- eAll = $00000002;
6 S/ V! }3 m e% V! K - EDataFlow_enum_count = $00000003;3 O9 H0 ~9 i5 n! a: n6 t
x4 ^) ]; i1 |4 E- type
" C* {' V) c3 g! G2 e - ERole = TOleEnum;
! Z3 q, j% O+ w1 H
7 o$ y- p0 R4 J9 r$ l7 L& y2 f7 g- const: j& ~" ^, m/ v W; R* d- P
- eConsole = $00000000;
' d& z" R! A6 U" w: Y: E% R; @, t - eMultimedia = $00000001;
( V' M, X2 L# U! l1 N - eCommunications = $00000002;. U k* ]/ J" u
- ERole_enum_count = $00000003;8 `5 F9 o U" {
/ z) h* K0 F0 ]4 G- type
% w* P3 [7 N& c7 e+ ]0 O - IAudioEndpointVolumeCallback = interface(IUnknown)
9 n2 S. |/ y) S: a% e* x. S - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']! a9 ]; p' J1 P) ^
- end;# Z6 W1 u' m' k5 r
! | s+ N7 r# |/ z* z6 S, L- IAudioEndpointVolume = interface(IUnknown)8 @$ I% e3 }, e# g( L G& v' _1 q
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']* ~9 R6 h: l8 A0 U
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;( P( Z' j% v' {8 T7 T- ]
- function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
6 Z/ e0 |- J! U( M+ T - function GetChannelCount(out PInteger): Integer; stdcall;
+ d& p& k" V& q: q: _ - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;" A+ n8 q, p5 T: q- T! t3 u. ~7 w
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
% r6 I# i0 G/ ] - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;3 ~% L5 X# F' d
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
0 p" [" d! j2 p! ~6 l - function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;( _. X* y- V# H. ^% y) T0 d
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall; g- c/ F# ]( z) p K
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;% B3 } E# k- [( \1 Q+ w
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
" e2 i* C7 p& X6 R* ~; f: Q - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;% P2 D6 |" x( M5 [: h: d. F& l2 [8 m
- function GetMute(out bMute: Boolean): Integer; stdcall;" `6 | q# A" q% E
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;$ V5 M. q! \# K6 P
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
3 V( H8 A; m& x5 |9 G% V" l - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;2 U! e: ~0 d, j- v0 g
- function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;" C* Z, i6 o2 ^2 b
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
& x8 {8 V% k/ E4 b: o/ U - end;7 ~4 r+ B' \: J3 Q) M, C' a# O
- . _- e- C8 v; ?% {
- IAudioMeterInformation = interface(IUnknown)" F9 I! G7 u1 p- @
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
9 c* b H- _: S8 u - end;. Q% ^. S' l) b- W8 Z5 x
- 4 e: ]% y% S" w& M X
- IPropertyStore = interface(IUnknown)
5 v9 q) R9 K- a( \* J) N& E - end;! Z, @3 ], x: ?6 r$ G( P& ~4 y6 n
- 6 V7 R& {; j: p/ T
- IMMDevice = interface(IUnknown). Z8 u) ~; Q4 ~$ v4 W0 I
- ['{D666063F-1587-4E43-81F1-B948E807363F}']- S, T$ v# a% W. F
- function Activate(const refId: TGUID;1 _4 i- E3 E& e5 Y
- dwClsCtx: DWORD;1 @; o/ D: I3 R& S: y/ {' f
- pActivationParams: PInteger;
5 o" {0 M+ v2 V - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;0 l+ _1 V& X! X( ^$ U: p, K
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;
; v4 P$ A0 J- T. t$ \# p# P9 p - function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
5 l0 @ G. c Y2 \ - function GetState(out State: Integer): Hresult; stdcall;; h% Z4 q4 g4 t1 e7 W6 Q, N1 g
- end;* U( g& c* D$ I/ t2 E# ^: Q7 V+ `4 g
& ?" N; z2 B5 h! r: Y; U' T
$ ~: e. a# \, A0 B" [- a/ b- IMMDeviceCollection = interface(IUnknown)4 n9 x; h* K- Y& [
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
/ v, R, ^3 |/ i) V2 Y - end;
, A( v" e- p0 r o" s; r - W/ N0 u1 Q' Y) G
- IMMNotificationClient = interface(IUnknown); t+ H( B) t6 f, {$ ?
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']+ \3 L3 h- Z U" d
- end;
% j9 B8 t, O3 |; k8 z - / `/ F' g7 S/ r) c* r
- IMMDeviceEnumerator = interface(IUnknown): k4 X0 m9 d$ K' |' j
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']& o L; Q4 B/ X L$ w
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;0 P2 `( t# k+ l' m
- function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;8 Q9 Z1 Z2 v# n
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;+ T$ W9 j% `. A9 Y/ M$ T
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;8 z! I. j, P7 m' [8 j% J
- end;, T. o- h5 O1 Y' j, `4 _
# w' |" S3 W5 N4 h8 m* d- implementation9 O0 B* w% W3 A/ c
- m+ x i6 }& l& x6 I) V! x- end.
. y6 b( k" z. `/ [+ b1 N/ Y7 ?: x
3 M6 o3 R$ P6 @5 B2 a1 |- ///////////////////////
5 |# w, r: b5 m t W- V - simple sample :)# k1 V9 f& O0 `
- ///////////////////////$ h& Q& w* e* O' T" H. y" U# r
! ]* Y5 U' j% Q2 O7 P+ \( X) `- //...... other code
8 O1 N( g- `$ Q* m" b/ [" O
( ]/ e2 n, ~" M; l$ j& J+ u; J- uses ... ActiveX, MMDevApi, ...;! g& D) }9 m6 C; @
- . y3 P0 W1 R4 ?. m8 O# B5 y
- //...... other code! ^: W' c& R' X3 j; y
- , t# M0 l) R! h
- var
/ A( v2 D" A" `* x# R9 l" l, K - endpointVolume: IAudioEndpointVolume = nil;
' W$ C& `! N1 n5 K5 [5 P' N( | S - ' g( e5 X2 k; R. B7 Y4 |# a
- procedure TForm1.FormCreate(Sender: TObject);' l. S0 I8 g- N/ j! e% ^0 I3 M. C. _
- var
& E7 c- S+ ^& b m. E1 {2 @. p; q - deviceEnumerator: IMMDeviceEnumerator;) ~( M( B0 L1 I5 G& n5 Q& p
- defaultDevice: IMMDevice;8 E! Q* T0 P4 ~5 l
- begin2 j/ M( H) K7 R9 [4 _5 A4 G
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);: A. {- s: D3 e2 C
- deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);0 a) B; }! P. \# B* H4 S" I
- defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);; f# g+ [, S% o, L3 o% f% j
- end;/ }6 [ |$ g6 t, c1 s
- - v5 |1 ~1 _$ z9 s
- procedure TForm1.Button1Click(Sender: TObject);
9 Q2 O! m3 o/ T3 }7 z- h; O - var
- ~( u R: V; j i1 Q7 I# F7 q* v - VolumeLevel: Single;
$ r7 @& s; [ n G1 E/ p - begin
2 D- O) _, p/ Q* E4 i, M, q - if endpointVolume = nil then Exit;7 i8 F! v: {' P8 ]( Y9 C0 {6 l' N/ L
- VolumeLevel := 0.50;* e- j, O, h2 z5 W# L/ J
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
" n% J6 T! R& q5 u - Caption := Format('%1.8f', [VolumeLevel])" s# I! J& D6 u( O+ ]
- end;2 h# P% O6 D7 X
- : U* |+ h6 W4 J; K7 t+ j- |
- /////////////////////////////////////
! o- i& F) K- b& S7 O" B. y - 8 V s5 I7 N! W% A7 K: @# }. y: k
- // with best regards ToxicDream) }' l$ T+ Z5 r# z O, G9 z. [4 @1 ~
复制代码 |
|