|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058
& j8 N; Y9 }+ g& Q \By Mukta & ToxicDream
6 {4 J7 ~& ? {( \- //for delphi 5
9 u! e) E M7 ?; g* P% ?; P, D$ [ - unit MMDevApi_tlb;4 B! p, }% V1 |: }5 d
1 o; `% d- ~# |* j- interface. \( f' N+ f+ E p
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
8 l6 D; ]3 p7 m: | ~2 l/ `: F0 C - const
- I2 H4 d Q* V3 B1 G8 u - // TypeLibrary Major and minor versions
: [/ |% K+ @ n, o& g7 X* @9 t8 q H - ( q' {+ g8 |; k" h; W
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';+ E- y+ n/ K8 m( Z7 r
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';( H' ~- v) p9 R6 f/ x- j
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
9 C0 \4 s% f4 Z/ t - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
- I0 O0 V! N% a3 \ - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';, f( U V. L* c
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';6 h- W% t8 W6 E) z4 C& t
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';7 p- \' k6 |3 k4 a3 l' ]& U* O
1 w1 h# A4 p2 q5 M+ Z) g- DEVICE_STATE_ACTIVE = $00000001;6 a/ t' \# O# v4 B/ n( @% u6 {
- DEVICE_STATE_UNPLUGGED = $00000002;% r1 h, Z1 }* X2 {( L7 g: U
- DEVICE_STATE_NOTPRESENT = $00000004;2 I$ v# s$ D- f) i8 H
- DEVICE_STATEMASK_ALL = $00000007;
: J, T8 D. \: u- o g0 a
: j: y$ Y: Y4 I( p q- type
0 K- @2 m% t7 V' S2 ]8 P# f - EDataFlow = TOleEnum;7 S+ A9 D- g" D( x1 F) G X
- const
; |$ k% E- ]9 L" |( O - eRender = $00000000;
* l# @! f" b* ? N, a9 F! T - eCapture = $00000001;$ p, L; H% n% B% H6 {7 _$ \, @
- eAll = $00000002;
3 }; T) ?8 I3 t+ }1 e - EDataFlow_enum_count = $00000003;; p3 r. D7 Z6 O* q& b
& A# b/ t5 C4 _2 k- type, m% a( Y0 x1 {& x, a
- ERole = TOleEnum;
0 w% r2 R" v& A# b) R" ] - const7 ~5 z( I* J+ |
- eConsole = $00000000; w9 e1 Z- j# L8 J+ }
- eMultimedia = $00000001;1 X* z8 p4 C, ^
- eCommunications = $00000002;- i: E" G+ t7 z) u! y$ i
- ERole_enum_count = $00000003;/ R$ F( Z- y& }
% ]+ h8 B$ d2 ~9 a3 ~. S- type
7 l. ~( [0 z+ ?, a - IAudioEndpointVolumeCallback = interface(IUnknown)
6 D) t8 w1 A' H+ I - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
+ z( N0 Z! x+ C" j2 t' S - end;
+ t$ e0 y, O( p* z. V8 X - 1 @! S3 \1 I" L* S# h/ h
- IMMAudioEndpointVolume = interface(IUnknown)
! H9 ]# w9 F8 E3 u - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']# s% ^* M& u" `2 W- \# G
- Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;1 e7 `/ m& I& S# d# {) Q
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
; O/ x6 J/ z: z7 u! ?6 ^! ?, i - Function GetChannelCount(out PInteger): Integer; stdcall;( p: D6 F7 y, m6 K3 E0 Y l( {
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
9 c7 J/ N6 |( m - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;6 ^/ @ i7 ^! c. r4 |3 \, m
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
( F. U+ j8 u% N9 i" Q( B, {" G - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
) L! c8 D; _3 N8 `, Q' f - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
$ N# e: v9 h7 Q" @' t$ C - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
. ^2 X- o) H! p- D8 h# G3 j - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;& R+ e4 | A* O3 P1 o
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;8 n6 u \# U# u2 H, l8 J
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;) `: ]1 v+ a- t8 S) g1 W' h
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;2 A, f1 y: ]1 Y3 U# [' P
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
% [7 w! k# `' h- W1 S+ G2 q$ y3 x - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;( s# x9 \# H9 B+ Y6 C) c% Z! ?" s
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
- v) n; ]& Z7 i9 G2 F9 b/ l - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
5 R+ @5 L) P1 I( R - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;+ ^+ g4 A9 W* F4 z2 w
- end;7 [5 ^$ K& Q% ^/ k m, y3 }9 z) K1 N. Z; F
. K1 c# {, H! G; N- { IAudioMeterInformation = interface(IUnknown)
# H, J4 j& \1 w* B# j - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
% f; Q/ e7 h, i! N - end;}; R' d- U T2 q' d" K/ l2 x
- 8 J8 V/ [7 m$ C( g7 p8 c
- IPropertyStore = interface(IUnknown)
1 `7 ]6 W5 R- b) |! ~) \ - end;! v1 s7 ^+ i! g3 c: I
3 i" V" u% D5 M) {! v F- type, x$ Z6 \$ \* i' _' w+ i
- IMMDevice = interface(IUnknown)! [2 b# r) o& k. w5 m3 P
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
4 v8 P) E2 X3 W: O; I o - Function Activate( refId :TGUID;
( a4 _& F0 F, @0 ~; A - dwClsCtx: DWORD;
) z7 k( \0 J3 E* V - pActivationParams: PInteger ;/ H$ d2 x. m. G+ j w
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;2 h3 z, n1 x; B
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;" ~9 l2 w$ X; D9 @; [
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
: i# A5 B4 q. R" e - Function GetState(out State :Integer): Hresult; stdcall;
- R# |( R+ ~5 Y6 g, t - ; o) m& m/ Y! n7 G1 |1 `; ?
- end;/ [ G* B; y% o" i: O) I. I/ \
- * q$ l3 R4 w5 o0 _
- 4 S1 Y9 w' C% j' J+ ~) `, z% [
- IMMDeviceCollection = interface(IUnknown)
8 u3 y5 H G8 c: P5 t( R+ V8 C - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
- ^& f9 j; m! R - end;1 q0 e; p& l ~- ^( B" @; e
; _8 B& A' Z$ f b# X( }, `6 T- IMMNotificationClient = interface (IUnknown)
$ O o2 N1 }9 J: Q/ { - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']8 Q! s/ i: A, f- h8 P
- end;
, G! j1 K1 @5 z0 A
' `8 A: T- ~ V" i9 i: M) K- IMMDeviceEnumerator = interface(IUnknown)
$ a5 ^) V* \. q/ V8 }3 \ N X - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']# M! a/ ~7 L$ H7 w
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
/ ]4 J1 C. O3 K- c) k. T* _ - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
% G$ [5 d% [- ]5 `+ {! M4 x. l6 } - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
* t9 d i f& V; O" r3 K# D - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;3 n) I3 ~# d( A! D. l/ N
- end;, H; \, [0 P- C8 _
6 _) l& J2 Z: {- implementation7 P, v5 b& t/ |7 E
- end." f6 j/ Z- b7 Z8 `1 Q* r
4 d5 y( D9 y2 i! I6 J; q: n( e- Thanks & Reagrds,& E z% A4 _4 g% l% N+ ]
- Mukta ...
+ ]( ^$ D+ F. n+ z
复制代码
3 K F6 c3 V( j+ u% V. P$ l0 s4 H- it's work in Delphi 7, r ^1 ~$ `; y
- //////////////////////////) O& l( h( E5 k
- * a9 W( ?- @( Q. h; [8 X
- unit MMDevApi;
8 B6 G5 [) C' }) }9 c2 b - : B$ y& ~; w- S+ A! f
- interface) ?4 p6 W5 T i1 |0 r7 p
O' u8 _ V2 W P7 y1 X- uses' A. e2 l* n6 o J: c& x
- Windows, ActiveX, ComObj;! F j | P, f( C
- $ _% H" r# e' p( s1 i
- const
9 u6 i, M) d0 P- f5 D. K. b- ^ - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';% O% S' ^4 @* \/ j- T7 ?# j
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';+ R8 T' G8 j3 s( ?. u
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';0 u' z! {5 [' s& m+ n* P9 I& R
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}'; E, G( ?* ]- v* H8 s
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
) G( V* y# B) S. [( Z" t6 {) Z - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';: c! E! P" m+ a7 D% F
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
: V3 ]. n: _ | ~, b& m
/ A$ }& U( [5 X k) J- DEVICE_STATE_ACTIVE = $00000001;* ?$ B$ m3 W( R5 v; E/ _5 R
- DEVICE_STATE_UNPLUGGED = $00000002;2 ~( S4 ^9 G" W- k4 Q( y% U0 _
- DEVICE_STATE_NOTPRESENT = $00000004;
8 ^- R9 u! T6 T) M - DEVICE_STATEMASK_ALL = $00000007;
* j2 v5 y5 [; a7 T$ h2 B' J9 S - . C1 o+ N' H. V/ M$ T2 J- y
- type! G1 Y* `5 X: P) }( Y7 U2 m7 U' h- B
- EDataFlow = TOleEnum;
8 R1 e, @6 Y& w$ c1 U p: z0 Z( ~ - - N9 `( f5 D. A1 B3 F- y3 l0 M
- const% a4 w* Y! \! X6 m2 W5 L) ~. S
- eRender = $00000000;
: w! V' p3 @( s9 J& n( h ~( S - eCapture = $00000001;
7 Z* m3 [* I2 J. o - eAll = $00000002;
8 s& C n \2 M% Z - EDataFlow_enum_count = $00000003;
: [& p4 \ V5 e; o" \' B" i
5 @8 k3 ^; j! L; ^- type
) Y9 p1 u2 A: i& h8 F d - ERole = TOleEnum;; M. T+ o! U e, Y' ^
. `) L& S1 {2 J5 w# f" i- const9 V# K8 Z1 a- a/ z$ E# l9 O
- eConsole = $00000000;2 N# ?8 L; \( v: p& [& U3 J$ Q
- eMultimedia = $00000001;
. _. z' ^/ s- M# p" L - eCommunications = $00000002;) i$ F* z- s- D+ t" k7 D& p2 n
- ERole_enum_count = $00000003;) y# G) g) |9 i `8 X. }& u* N
- % t. A5 V* V" [, T: A
- type; i9 n, \$ c! M& j1 v. G2 W* [9 T
- IAudioEndpointVolumeCallback = interface(IUnknown)
' n) u# F5 |7 C$ u9 d' J3 o - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']! y9 m4 z; K8 f) n b4 M3 k
- end;
( {/ Q# v+ _- l) E - # Z- l- C& n4 a' p8 N- s
- IAudioEndpointVolume = interface(IUnknown)# o" }/ h9 y. m
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
6 i* Q6 |( _8 G5 ], s& A - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;1 c* }9 F. h8 D# v6 N
- function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;* h! H5 `( Z" X
- function GetChannelCount(out PInteger): Integer; stdcall;
V5 ^& W0 }0 ^- @ - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;: V' u' [5 [* m$ z3 d8 n, M
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
: V0 Q% k: m# F: K: y - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
/ V% N# F( [, Z; k - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;7 x$ q- e0 G! f! S4 r+ Y
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;7 E5 H# {# A7 V$ j
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
) n5 c+ g3 u9 Y5 U- c& b - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;0 q* ?3 i. O4 c
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
1 f! y) i; A$ M- h) s - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
" V, r6 E" p( W8 {, o - function GetMute(out bMute: Boolean): Integer; stdcall;
" z; n& c( U( {8 K - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
' W# s9 W4 P' A Z$ L- Q - function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
4 a/ v( J& r) _6 C - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
. i3 ^9 q9 {2 f - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
2 V l* b2 j# H) {/ m$ S# Q2 T1 `1 _ - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;; b1 g' u. _8 w+ c: \1 c
- end;
" n" [: _9 i* C8 R @# P# q( w - ; H5 }4 K4 U. h5 D6 n* M
- IAudioMeterInformation = interface(IUnknown)9 o; r5 j0 L0 G# U
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}'], {4 _% T( r" H& D! l
- end;
, r% ]- e1 j3 P4 j8 M7 T' Q
$ z4 o. t2 f6 J+ k- IPropertyStore = interface(IUnknown)
1 t# O2 c( R0 b2 j6 Y - end;( x2 G) [9 O6 ^' O7 j: S( t
4 Z8 \9 |4 N$ h$ g E# ~- IMMDevice = interface(IUnknown)7 b! ]! \ l H
- ['{D666063F-1587-4E43-81F1-B948E807363F}']$ O9 G2 Q3 h$ h) o
- function Activate(const refId: TGUID;3 J$ w( z3 d9 T
- dwClsCtx: DWORD;+ O9 z; |: S6 y2 g3 y2 l( r _
- pActivationParams: PInteger;
, ]8 K0 G' e: F# b - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall; A) b+ S% t: w. Y V
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;( z: `/ X) K/ J/ h* e
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;/ V' e: P% [7 \6 S5 [( U3 U
- function GetState(out State: Integer): Hresult; stdcall;- v1 t* \! B' [1 T
- end;+ p+ Z3 M* J8 a3 K- i
- ^1 A. l* p& P3 ]
- * C. n' {, D6 T
- IMMDeviceCollection = interface(IUnknown)
) B2 z' F0 u- N. d5 ]2 p0 H! r - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
& M$ j9 j2 f9 q! \1 ]: Z - end;3 u# E. {% V! ~( e8 D
- ( P7 \, \) m' X+ [! a2 W
- IMMNotificationClient = interface(IUnknown)
3 K* W7 j5 p/ n# |$ a8 b: X - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']! r' ]6 z! b/ x1 `, g0 s8 H
- end;1 i# V' d' i) l f( Y
0 M1 s' Q+ N0 k4 R# k n# y- IMMDeviceEnumerator = interface(IUnknown)
! R( m. x2 r- z- ^. M5 Q( C - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
* p8 \, r* h& u) ^/ o7 E& W - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
9 C/ K8 ] E0 ] - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
1 Y" M) m% v6 g! R - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;! J$ ~: |# U( F! T- {
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;. p; J* b. a* ?8 l& X& `$ w
- end;* Z! f# \6 m5 z0 O" q
/ H2 j ^* i0 h- implementation
7 t) x S! j f8 B' v# M
3 y) _4 H. p D7 q) ?- end.
2 C( T5 R, v1 w: ]! X - . f* e k' G. k! |& \- Q& C
- ///////////////////////% G: L3 T S# Y/ R: e
- simple sample :)& g2 x& Q; V& r- b2 ^
- ///////////////////////
9 B1 f Z- p7 F6 d- M) i - . e1 |' A: k2 ^9 m' B
- //...... other code
' b, f; ^$ y# U# U& @4 l+ p
; ^* S# `$ Y, X. c6 p" I7 K6 z- uses ... ActiveX, MMDevApi, ...;
, {5 C( T! r% ?1 D+ z/ j6 N$ y - 3 l" |3 x6 [7 |1 ~! u
- //...... other code
% g3 w) F) j4 h) e - 7 ]8 C, q4 U6 G2 M/ r3 H8 d9 a
- var
8 _' n7 ?8 g" [) X. K9 k8 U - endpointVolume: IAudioEndpointVolume = nil;: H& A4 O9 c+ j$ w% y R
- 0 l) G4 W& T2 Q2 _1 }+ m
- procedure TForm1.FormCreate(Sender: TObject);- @& }6 A% d3 k4 B' U5 N% _6 V
- var- O% a8 f& q( t6 B) Y
- deviceEnumerator: IMMDeviceEnumerator;
; X' K. M) j6 T9 e( r8 i - defaultDevice: IMMDevice;
7 T" [! v; v8 C" s, g; ]$ l- s - begin
+ [6 v/ {3 M" \8 w' q- {* J- ? - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
2 O% h+ C% Y4 a. V5 U& d5 J - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
( Z& w { y, N0 a4 Q - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
3 i1 G1 Q. M7 f r: P s - end;; v' A, f p+ p0 x$ V- U6 N
- ( q1 v/ L8 Y! s( x$ F
- procedure TForm1.Button1Click(Sender: TObject);4 l# W+ M- Y+ `5 Y- }
- var; Q+ k8 T5 P. Q8 ^
- VolumeLevel: Single;* y* k4 y: ~* P: w" H8 [
- begin6 H% p" \& B* V$ r
- if endpointVolume = nil then Exit;: P0 j1 v8 C5 W1 W W* L
- VolumeLevel := 0.50;, m$ o9 _ b! I4 U0 e2 I+ ]0 p% N% f
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);+ U' }) A; Z( r) r8 Q
- Caption := Format('%1.8f', [VolumeLevel])
. l% e9 U( w/ W' H! B& f - end;4 h, o4 s1 ^ u' n8 t4 @6 j! m
`) ]: L9 x. Q0 y2 f& d2 Z- /////////////////////////////////////
+ |/ i4 h7 N2 U8 J, c - 7 a7 V7 o! s- Y2 ]
- // with best regards ToxicDream
2 p7 s9 P$ I5 {
复制代码 |
|