|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec0581 Z. w* d1 M0 Y9 @+ f8 j0 D2 ?
By Mukta & ToxicDream- ; {1 e: }# [8 C" k ~
- //for delphi 57 z7 b0 W @2 j% ?, c; b5 `
- unit MMDevApi_tlb;
! D# v; K! {& |) C1 [) R - ; S% q0 s7 T; P0 D( b* J/ `: R1 E+ d
- interface
' y8 ~" y) C8 C' @7 u8 Y - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
( x+ i0 Q) V# ~5 K. ^ - const
3 b2 r I% Y9 e, h7 |1 S2 q - // TypeLibrary Major and minor versions' T' D' A0 L* J0 b/ L
- 5 Y: d+ x( l9 }* c6 B8 T& h9 O2 y
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';! |9 Q- P) H3 M9 y$ z- Q4 U
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';3 o/ M% m- o+ Q' w y$ L. L* W
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';8 v( s3 Y: K9 [: M' a+ A
- IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
8 q( p6 H6 o) H* k. D4 F& m - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';% E+ T2 Q. T% C
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';8 t+ A2 g- P/ ~% A
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';: ?+ }7 _6 I% d: t2 E
- 5 x6 N: {( S% v0 A( Z8 c A. N e
- DEVICE_STATE_ACTIVE = $00000001;( k }- N, L$ U9 Y
- DEVICE_STATE_UNPLUGGED = $00000002;1 H8 c" |7 y. z7 k8 o/ a! S- [
- DEVICE_STATE_NOTPRESENT = $00000004;
; ?4 O7 B) i4 f2 p" s C! I- @6 {! O5 H - DEVICE_STATEMASK_ALL = $00000007;
0 M8 F. Y6 m* f: o6 |5 }
% E1 w& X4 e* A- type5 ]' R# H' a: ^* C; ]
- EDataFlow = TOleEnum;
' |2 O2 I0 u) b# W3 ^8 `* d: D - const; ^% z! ^4 R; H* L/ |! t8 ?5 z& [$ \ x
- eRender = $00000000;
9 V0 X' h6 F- t4 T. w2 q$ W - eCapture = $00000001;) F# Y- _& l* l6 V: l' U2 k9 u
- eAll = $00000002;3 V4 x+ X* l+ \# Q
- EDataFlow_enum_count = $00000003;5 h6 q' L1 l; p3 t* M8 h
0 K M* c/ K. P+ \( X- type
- v1 }" G1 [# X! C; U - ERole = TOleEnum; O- Y. @5 g) G; W$ D& c2 X
- const ?8 x1 ^! D( F9 ^
- eConsole = $00000000;
3 E0 B6 P2 b: A9 i+ _ - eMultimedia = $00000001;
$ b( Y2 s# z! J. V+ L/ n+ i - eCommunications = $00000002;/ D0 F. O* x7 `% Y i& E
- ERole_enum_count = $00000003;
- r: n) b: D% P8 V L - + h. i; D( U* Y: V5 f$ u
- type
( U- z: }) T& ]8 B/ u: O - IAudioEndpointVolumeCallback = interface(IUnknown)) x6 |4 `% X9 D- S! \, d, c
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
" U( L$ n( u. Q' m# f7 f# J - end;
j* {# I$ L" c7 z1 ^1 d5 N, B - 9 P7 @" Q& o2 T! J
- IMMAudioEndpointVolume = interface(IUnknown)
. @7 J* a! R; D k( _/ i" o - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
2 H2 \) r, S u- |2 f, _ - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;: M& C' ^ B8 H# S3 n' l
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;/ l O( O6 y- F+ f8 W
- Function GetChannelCount(out PInteger): Integer; stdcall;
* R" h1 S$ T! k) [! I: E' S - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;; Z/ ^$ U: H2 ~* g" m5 O s! T
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;# w8 Y+ Z: r$ E% T6 s! }% N* z9 M, ?
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;! Q, Y$ q4 q& _5 Q
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;! b2 `# @5 e: _4 A
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;# j" {9 m% l B8 s& l$ R! l
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
c3 R: b/ o0 o& f4 L( [; ^ - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
) y7 s1 O: t5 ` - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;$ i+ z3 Z3 s7 a) c4 [5 w# o, B
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;5 X$ H: b- [" l. A8 Z* u9 @
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;, E6 B2 \% Z1 J$ y6 {8 x
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
0 ?* g7 b7 {) u - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;( T1 Y1 h: b6 G) g& [
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
p" d" B/ ~) ?- z) r B0 K2 J - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;* |7 _$ m! Z E/ u+ `2 k0 y
- Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
1 m- ?& |: T/ `9 x; Q6 Y - end;; I+ _$ U; ~% j! D' c0 v
5 e6 Q: N) T8 |/ o- { IAudioMeterInformation = interface(IUnknown)# w7 k. W, v& S* x' _
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']" F S+ O( Q! I8 f6 D6 H
- end;}9 J! u1 H5 r3 j j& N
- 3 ~. P8 c& e4 ^- v+ S( L7 H) h _
- IPropertyStore = interface(IUnknown)
# m- N, z/ n0 S6 R - end;& E5 e$ S! ` n' }8 q5 D
2 T7 j0 q1 U+ ~* w$ t- type
8 w0 Y3 e+ y6 n. B! j) a6 q3 B/ L - IMMDevice = interface(IUnknown)
4 C9 [! O; y3 W7 y. m+ s - ['{D666063F-1587-4E43-81F1-B948E807363F}']
6 N( Y9 }/ ~5 c! |1 s1 u - Function Activate( refId :TGUID;
; ~8 j) u4 K7 [. v - dwClsCtx: DWORD;9 |4 G& L) k" ?: J+ I
- pActivationParams: PInteger ;
0 c1 L3 M7 [7 G2 ` - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
! s7 c/ O, |5 N. c7 I - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;( p# r z/ [; W- q! v
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;2 ^0 k, {8 F5 G9 u/ h d3 O9 i2 ]3 F
- Function GetState(out State :Integer): Hresult; stdcall;0 K: T% x) x N6 O1 t- I8 v
3 ~) u, y& g$ Z }6 e I8 @6 r- end;. P) }. t: c, J. ]
# R+ B) A! n: Y; Z( X
. N5 C) d/ y2 n1 T. Y. N- IMMDeviceCollection = interface(IUnknown)
1 _& @5 f. l1 S( g! B) y - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
' E4 s4 c) a k, o: f6 j: ~3 k - end;3 D7 w5 v9 B7 ?1 ~! O, @
- * M- d3 }1 l9 G( z+ m% U+ j; l) M
- IMMNotificationClient = interface (IUnknown)' ~5 B9 h, ]7 {. _# y
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
- E+ o$ z% g' I1 E- B - end;! s* Z+ S) x; z2 w
- 9 O2 z c# Y" l3 A% Y% g- @
- IMMDeviceEnumerator = interface(IUnknown)
- h Z; T* e7 V3 G - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']0 t4 K- Y; D5 L0 Q: T/ n
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;4 C5 x& S# f1 y+ j3 O
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;' @* g# e! K A( E! A, h
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;: l/ [7 P& t( j
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;; H0 b8 S* j7 b5 v
- end;( Y4 D1 i) d4 U5 w( `* P" O
- * G/ R1 _6 W! E7 }" o
- implementation7 d% {; T9 r+ m' S9 v) ^
- end.
' T0 t+ @/ n) u4 j; ]" S) V+ a - # I# }; J- C* Q: `# I9 ^
- Thanks & Reagrds,
3 |: M9 ^' `9 v3 O# [6 F: ~; @ n - Mukta ...
" z; }( ]1 n+ J' [) d0 |
复制代码- / D+ p! f; @" u. d4 ^4 l; I, x2 |
- it's work in Delphi 7
2 E9 M1 i4 I3 X) r2 g2 R - //////////////////////////. k' @7 Y {/ ]8 H% W
) w8 F+ F6 l/ v9 L( l: s- unit MMDevApi;" w$ z m. W' C( S
- H% H( `# Q0 T6 C2 |- interface* ?) ^+ C# B. l6 I- I" p1 h b6 L
" ]5 d( N: J$ B. K; G- uses! c: u) e$ C+ G" `: Q# B
- Windows, ActiveX, ComObj;
: @7 o8 r- L3 |# ]1 P. ~: N - % Q, S* c* C& g" z& U: ^
- const8 V8 q2 [& \( p$ [
- CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
: j' f6 o, J z3 \ `$ R - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';/ g0 Q3 H1 s4 ~" g
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
2 Q- F3 l( L( C- F c# q - IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
7 Q. a7 r9 J+ C+ m! n - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
2 p2 f) `8 V/ n. G/ A - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';' v& t {9 R6 P& S" M
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';3 D3 B9 B; S0 M; r D# C% y
! p0 O( C$ O/ E0 h- DEVICE_STATE_ACTIVE = $00000001;) K5 p h/ E5 B' m& Y
- DEVICE_STATE_UNPLUGGED = $00000002;1 A: c3 ]6 H% J
- DEVICE_STATE_NOTPRESENT = $00000004;
: _# m) s# E u1 `1 L - DEVICE_STATEMASK_ALL = $00000007;
- D. C3 Z5 M7 I9 T( i - 3 f" \: [/ g. T: K& K2 Q6 x9 M8 ^9 @- n
- type
& H, `+ z3 @9 \! B5 m) F - EDataFlow = TOleEnum;% R. g+ _8 a/ T
7 c$ _! u9 i$ [' w$ p# Z: u& c' f- const, O) k8 t- t$ R% ^
- eRender = $00000000;
. Y! k2 J5 n8 I# |8 P$ F U - eCapture = $00000001;4 s& I! b( L! s5 E
- eAll = $00000002;
6 }1 t1 M$ C( V3 z) r: i- X - EDataFlow_enum_count = $00000003;8 k; m4 w8 H6 j( u
- 4 }4 H0 P. k" X' U: r0 V
- type
! }- K* S V u! e - ERole = TOleEnum;
& @, { o7 \) I" {1 R' m/ e/ J - ; [ K$ F* E5 e' P4 ?: Q; n
- const' E. D: p. \* M! W
- eConsole = $00000000;
2 l/ q+ c6 ~" ^* \5 k) Q - eMultimedia = $00000001;
: R) o, F" v1 L* _ - eCommunications = $00000002;' E5 R; |8 P4 V# r- t9 h- X1 D% ]
- ERole_enum_count = $00000003;) `5 Y3 l, U% m( b
; m8 `9 E! h& }* R- type+ b' P( a3 k4 c/ D8 N' A
- IAudioEndpointVolumeCallback = interface(IUnknown)0 Y& H9 x4 m3 B+ b8 M% J0 {3 I
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']) X' B, ~$ D+ |
- end;# R# d- a3 Z3 w {1 a" l
7 r V+ X* y& R+ D8 d: Q- IAudioEndpointVolume = interface(IUnknown)) c6 p/ q$ N/ P# }+ |# T8 _' V5 ^
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']! z' Q: K* N5 N c: F
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;" D) Q P, U/ y% Z9 ?6 k+ H
- function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
& p: q5 t$ U1 S4 d7 ?0 p: F7 w - function GetChannelCount(out PInteger): Integer; stdcall;
6 d! I) u6 s- Q% F9 g L* J) Y8 J - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
- s) Y4 K4 ]( C! h! r8 v - function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;" c2 i. s& z# }
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;: D+ U6 Q/ q: L* b2 ^
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;$ s% `( C6 t6 m7 j# B
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
' K* w/ n) y! q& R - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
3 Q, h9 w- `' f2 B* i1 D, \ - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
9 y! g5 H- r9 m# C& y. {+ d! S5 |$ c1 Z - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;; ]$ Y: \) q; x' q3 g a
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
8 w" x# R6 ~. G3 M - function GetMute(out bMute: Boolean): Integer; stdcall;
: [! K$ O0 ~4 ~: P# _$ ] - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;* F3 {) ^8 w' i3 U# i' M( u
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
0 A3 O, E& n6 U# z1 j0 b - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;. e: `- e6 t1 P& a* u
- function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
J* |9 B! P. v7 H( X4 z* O - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;6 v. V- M5 @! ^4 d
- end;; y" S$ N+ V m) e7 Q( D4 c' d
- * @8 l" m5 f# c0 M
- IAudioMeterInformation = interface(IUnknown)
& I6 y5 V" Z$ l/ H0 i - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
0 S3 {$ r, s* p9 T - end;
0 x! N7 @* T4 W& H& K% T; F - 3 P) u3 y/ A; f4 F* `( ~; @' Z
- IPropertyStore = interface(IUnknown)
" l0 U0 J( M, t: m3 _6 d/ Y - end;
! e( g* V* ^6 r. c F - & v }2 U4 @% E4 q
- IMMDevice = interface(IUnknown). `, R ]0 {( q4 f
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
- C- B3 D e. f, | - function Activate(const refId: TGUID;
' V j3 M4 f6 L' B( X. L) I0 o - dwClsCtx: DWORD;
' S, K" R( |( [7 ` - pActivationParams: PInteger;, E# t( i( z2 H& e
- out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;6 H$ A. m1 q% {+ y2 }1 R4 s
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;% n, j+ N5 P z: o: T8 R
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
$ F$ r' M2 I1 n4 ~" j - function GetState(out State: Integer): Hresult; stdcall;* e7 b, P' b( C7 ?4 h* _, G
- end;+ }( m4 ^5 v: }% ^0 V
- 1 O* e% Y) f* t. d2 i
; m" l, k7 H" c- IMMDeviceCollection = interface(IUnknown)2 z% h1 k- s! y% a
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']7 G, d1 J5 N0 \% I& C+ T
- end;; I, T! }1 q) c- {1 v, ~* F3 K
- . L9 o# X- s- K4 d( r3 |, Y" K& R1 |
- IMMNotificationClient = interface(IUnknown)
; ?: A5 r. q) D( I8 W) t - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
8 H" \+ l' \2 m4 D, f# v - end;
3 D H3 Y1 A6 D; K N' F
* n$ T& P/ j4 V! U6 {4 [- IMMDeviceEnumerator = interface(IUnknown)0 I9 ^- I* d1 |
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
( v9 d$ {6 a+ B3 [6 _3 l5 ` - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
" l! [: z6 m9 {/ L - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;, f, F5 W! ^' F2 U. R- W* D
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;- r! K, D1 v4 j$ c
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
! r. o) Z& _& e7 u0 s F - end;
2 z6 S `9 b, C3 {; Y2 v+ e3 i
) g1 v4 F7 x+ b/ W W6 V* q1 y- implementation
7 c& `4 s% T6 L4 o3 I - " O: V* C+ @9 O( n$ v! v' Z
- end.
! ^, j* h# { m/ Y1 D0 } - ; ^* K8 v' T# e' P" n
- ///////////////////////
% l9 W) w. Z- f% R - simple sample :)' S- X$ h- Y( s' x4 n
- ///////////////////////
2 w) b8 P+ A' T4 l! @) T - 9 d. b; E0 Q9 k+ b
- //...... other code" a( e# E" ~$ h& f* g d
7 B) b a6 C9 i9 ~5 C7 g- uses ... ActiveX, MMDevApi, ...;( Z. F* v8 t8 I2 ~& k
- - `5 f" Q0 ?7 u9 J$ o) q2 F4 l
- //...... other code" j) C9 l% g3 |
# D' k3 k, s" T. L- var' M; q' ~3 |$ F, {* r6 \) t
- endpointVolume: IAudioEndpointVolume = nil;
0 g2 n7 L* D0 P( y7 M - , r3 |/ R e/ X. e v$ i0 H
- procedure TForm1.FormCreate(Sender: TObject);- e' }+ @ R5 T* [/ O& d
- var
6 I- I2 ?. k+ j! [ - deviceEnumerator: IMMDeviceEnumerator;* x' g+ J5 y. K$ Z4 [. J
- defaultDevice: IMMDevice; f9 c% u4 Q% x4 r
- begin% _, L# W8 `1 Y$ k; F0 H
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
; {( V; A6 ^3 S5 B8 V: L% | - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
- G. H& k4 {( t - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);0 U& i! x R( r* I
- end;
5 u! L } G+ `- x/ }
; n) O2 T* \: ~+ O! o, z* Y- procedure TForm1.Button1Click(Sender: TObject);# I# y4 y, N5 D; R& a. }2 v
- var
! c. A# T1 ?; M - VolumeLevel: Single;
; r) B$ M" ]; {+ e& _. c$ ]' n* c - begin, j4 b, s" t4 i+ z# R3 v
- if endpointVolume = nil then Exit;2 B2 m: r, \4 S5 e' _9 ~" s
- VolumeLevel := 0.50;3 I+ _& Z! }1 M- ~
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
& R6 ] N# L: J8 ]; E) v - Caption := Format('%1.8f', [VolumeLevel])
) Q8 s1 W8 z$ O) A+ Z4 ~( p - end;
( f: O& r4 @ n2 k' _
4 n8 L' { r8 E- T- p, \- /////////////////////////////////////
' p1 V% k* [; }9 q$ ~ - : }3 [- X: h6 Y1 h" Y( |# {+ u
- // with best regards ToxicDream
' L$ p0 V+ L2 g t
复制代码 |
|