|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058
1 s: {1 y" M& u/ _; p( c( zBy Mukta & ToxicDream
6 B2 ^& x6 g7 \- //for delphi 51 [6 h2 _0 Y+ }' b5 T2 x
- unit MMDevApi_tlb;
; e" Y! X) S+ ~% r/ o" n0 | - & r& @8 V3 k% w6 h, d! ]
- interface
3 i4 s' t8 I' { - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
& k% G' _8 U0 ?8 E$ Q9 R2 i7 T: h - const
: U' l" f0 t& N! w9 N; @" ? - // TypeLibrary Major and minor versions
( O5 _. e& i0 T' o2 I
5 m1 O; x6 f6 n8 h- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';3 v9 f w6 \, y/ e& I+ n4 x
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
4 J7 g5 n v) B# P7 I& ]/ u9 R @ - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';& g! a4 y( Y2 G. o( P* S
- IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}'; o/ `) g |3 O# ^9 p; S
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';$ e' O+ ?& i4 }
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';. \& Y: W2 h& G
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';% @9 b, E, u* y* C9 K- k
- 2 k+ f4 r9 I2 w' s) j
- DEVICE_STATE_ACTIVE = $00000001;% R" U8 s2 F" G; y, n
- DEVICE_STATE_UNPLUGGED = $00000002;9 p& g R3 k/ p& W0 I5 p
- DEVICE_STATE_NOTPRESENT = $00000004;2 [5 _( B1 C3 Q5 {
- DEVICE_STATEMASK_ALL = $00000007;
. f0 r& Z$ v* C) {% ?& S - : a% j4 q1 |8 [" q }; u
- type
4 z3 v1 {9 b( L - EDataFlow = TOleEnum;
7 x: q' N" \* _' D, C6 I+ h - const3 z# P8 K* h5 N7 d: O4 ~! F
- eRender = $00000000;
) b& K1 }. q- i M. X" W# W! [ - eCapture = $00000001;/ T7 e) ^# x$ b' h
- eAll = $00000002;
/ z% ^" @$ k4 o - EDataFlow_enum_count = $00000003;
7 T/ ~& `& z$ e1 s W1 f
; ` B* F' @4 w* ^- type8 j/ K! G0 }- @, T: i' m: z( g1 m0 A
- ERole = TOleEnum;( M9 U$ P @7 O( f
- const% e6 f2 F& ^9 d/ v, [1 B- W
- eConsole = $00000000;2 p% s' \% y e K, e1 R
- eMultimedia = $00000001;8 E7 L6 q- n$ ~* n/ g
- eCommunications = $00000002;
; T, X* P2 a; T' u - ERole_enum_count = $00000003; \. E+ L/ [- c, \4 ^* N, n
- 4 n6 c% G; ?/ M5 Z4 ? Q
- type6 A& a9 s: ^/ [ o, B
- IAudioEndpointVolumeCallback = interface(IUnknown)8 d% S2 o+ N' y% v$ L" x( g
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']; E: l% k& X8 \9 N* H
- end;
6 U( n8 M5 ]) }- \ t
0 X$ ^. y$ B. W# X5 G7 U- IMMAudioEndpointVolume = interface(IUnknown)+ V6 A6 P+ H# c
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
8 p) v: [8 \( _ - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;) }# [% M3 f" d
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;, m1 ?, ]8 e2 }( I8 k
- Function GetChannelCount(out PInteger): Integer; stdcall;+ f) Z7 ` b( b5 t' B# ^) h
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;9 Y7 U5 T) _' {" b/ h9 I6 G% u% N7 }6 ~
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;9 K6 V) s! G! }+ z2 D
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
, G; s* m$ H' R6 g8 f5 B) G - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
' j' G, B0 @# E! Z9 j - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;, S3 S3 Q; v, `
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall; c" U$ x: R- D- y q
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;& |; q- r* K* R' Z& ^
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;0 E6 p' I9 \7 d
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;8 } {8 @; e# F! t
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;7 i, Z" N! X6 n% x/ {6 J3 ?1 c
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
. R! o+ I$ L, I9 S - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;
3 G$ {5 L4 ]4 D9 ]: ?- u - Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
: W0 ~3 ?: f* ^( R- B - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;" a" Y) w- M5 l) Q7 T+ v! m
- Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
" w( J ]7 u: @/ w% v+ K$ E - end;' j! X9 I3 s- y$ v8 `
1 a- ]9 a3 q$ p- { IAudioMeterInformation = interface(IUnknown)4 m. I! S: }. c' i) P% M# S
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064'] _- X" Z4 [7 `: a, Q' k
- end;}
# @ R& N( G* e
, V' `5 u. J& e( |# [% l$ |/ r- IPropertyStore = interface(IUnknown); s! {* i6 S: ?9 v
- end;
. I y; D: p, Z
0 i2 |, o8 {$ i: W( _ K- type k" [5 n$ |% y: {! U$ _
- IMMDevice = interface(IUnknown)
5 ~ d6 M; F/ M3 o$ T2 m3 g) M - ['{D666063F-1587-4E43-81F1-B948E807363F}']+ c2 @% A) H# x, ^" `/ F
- Function Activate( refId :TGUID;
/ B. g) k1 I- @ - dwClsCtx: DWORD;: C$ D* t4 N1 k V
- pActivationParams: PInteger ;! Z& M% t' Z# ~* o2 G9 C6 J9 C
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
, h' ^; r" z% F9 o% K6 S" t. X7 s - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;5 O2 f9 j& H+ R
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
5 {! e, `$ `# E - Function GetState(out State :Integer): Hresult; stdcall;
7 r3 i# ^& d% S% A% i - 6 E( d3 p5 Q4 d2 F2 @( N( Q( h8 ]
- end;
4 o& N7 c' o8 [- P) e) @
! b+ ]/ b3 h6 ^% l: z4 R; y
; I- a* ?$ `3 s* h( c l- IMMDeviceCollection = interface(IUnknown)
* L0 y& O5 p7 b# W9 Q+ a6 ], G - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
# b. `# E& u$ W% N' f - end;
3 p# s' w3 v& ^/ M: P - # J7 S7 A2 h+ A8 w p4 }
- IMMNotificationClient = interface (IUnknown)+ `2 y" [+ w5 g
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
) Q* W9 L7 `/ _* d - end;
' y) M z. J# _/ f3 x/ g" ^
2 N! L4 a2 K$ V9 |' n- IMMDeviceEnumerator = interface(IUnknown). s9 R, W1 g1 x5 w* e; N
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}'], c2 {: E, t- t& R! Q
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
) }1 {0 j- y; o& X+ z, g - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;4 w8 O8 G5 |5 O5 k
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
8 }; r8 C9 _% D; W% Y0 [ - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;$ o6 t6 Q, K8 D& r
- end;
4 o, U3 T, @: u i1 N B4 T - 7 _4 {# y/ V! B& D6 I5 e# \% z
- implementation" t. B; W; t( T3 X% Q1 T# ]- a
- end.
. d& i V* s! U9 D - ( S! x) n9 A5 {+ v$ e9 d/ }
- Thanks & Reagrds,
% |! ?9 m& P# U: L6 c/ x - Mukta ...
+ I8 c7 s5 e2 c' ]
复制代码
* u* a: |& W( J9 e0 h9 t- it's work in Delphi 7
1 L; m% |' W9 F0 V. l2 o4 w" S9 Y7 N - //////////////////////////
6 Z8 \0 ]6 Q, _) D' y+ {/ t
* m! Q0 \" Q, i) Y$ r% J* T' i- unit MMDevApi;
# G+ q4 _3 U$ i- s2 E - , Y* E& s5 `% m9 T) q$ H0 g' A4 [
- interface
( \& [7 w: |6 I2 ^ - F, l6 S/ j1 R1 _
- uses
& q9 ]9 \% T" @+ y) ~ - Windows, ActiveX, ComObj;5 P: ^ q7 }7 G; ^0 _$ S$ p
- ) Q- H9 u _3 L; a" R% j
- const
+ ?" h. C5 ^0 u4 q, A# A4 r; o! {) [: C - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';, z5 }, ?2 V# Q' A5 a% c# L
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';- w* m! C+ B" y3 y" [. w
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
) E& v- T( B9 c5 w* W% l2 { - IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
9 K* |. K5 o" F3 B - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';7 b! J8 {' m% L. C
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
0 G5 V& D9 o2 t* W$ m - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';& m/ p' G' w* Y8 Q7 X, k8 |1 p
- : ?/ T( T2 h% N* ^& c
- DEVICE_STATE_ACTIVE = $00000001;
# L. `6 w% j5 r - DEVICE_STATE_UNPLUGGED = $00000002;3 ~; q( h3 w G9 x [
- DEVICE_STATE_NOTPRESENT = $00000004;) M7 {, L! C5 Z% v+ w# a
- DEVICE_STATEMASK_ALL = $00000007;% ^$ I [, i$ d9 F5 h1 k& O" b/ U# H
- E7 l/ o) Q4 Z3 i
- type
G" \, u( a* |- P. Y - EDataFlow = TOleEnum;
: G7 u; R4 c3 Y3 j
/ Q0 W: o. K3 J) z- const
* L1 c( A/ [! a, s! ` - eRender = $00000000;- Q2 ]# [ p4 L
- eCapture = $00000001;
6 V* x, S, V% G- f# U2 z - eAll = $00000002;. u8 C d3 E9 R n; G0 l d
- EDataFlow_enum_count = $00000003;7 u% o- P" P- E- D5 E2 s
- ( ^. _; y, I/ M) t1 x1 Q
- type" u! {& i0 n. N" K9 v# ^% d
- ERole = TOleEnum;" e$ E0 y# a: j7 @5 u1 D% a% z% f5 ]
- . b: F- H" x/ o( V
- const
4 W. e$ [8 f) F2 p4 @ - eConsole = $00000000;
! S. d/ ~ ]2 g7 P, E - eMultimedia = $00000001;
4 c# p \/ q% m5 k3 p: M' V - eCommunications = $00000002;* F4 e0 E0 S6 F" ]/ t4 z, e$ m6 |: l
- ERole_enum_count = $00000003;
/ I+ _/ H8 K" J& a& a8 }# ^2 K' z) @ - # e' V( d5 S2 ^6 @, x
- type, X- l& @7 m- M+ v$ K* W
- IAudioEndpointVolumeCallback = interface(IUnknown)& r' [6 Z2 A8 G* t1 r
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']" ^! h* M6 U& A
- end;
. b9 W* b4 }$ b' r8 q+ l
& p. s, A! r! m" E m J$ V' }- IAudioEndpointVolume = interface(IUnknown)! E7 p+ M7 Y) z; \1 v
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
6 H" F) b8 j3 ^; j3 c - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
- d: S) i+ B* U9 F6 E& N - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;, @" `* V) U _+ L5 f- ^9 V
- function GetChannelCount(out PInteger): Integer; stdcall;7 C/ b* s& k5 ~0 ^ U1 n" S, ]! R' q
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;4 A$ c( A# x' V
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
9 U- M1 h' J% ]/ U* K' f - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;- R* s* f3 _1 n) G5 O
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
* C' }4 M8 l2 u0 I+ P3 i) H' v0 w - function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;+ I5 D2 n/ [) O8 t) U
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
0 W# R. u; H5 ?6 }1 c1 e7 G" o* Q; V - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;& N; c/ t: v1 }; {$ b$ _
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
+ \) A' m1 a. k0 }+ }# I - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;5 w3 {0 }! K8 P& I. [
- function GetMute(out bMute: Boolean): Integer; stdcall;9 e7 n. H6 W3 M5 V
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
* G5 j+ v' J7 L+ |+ D - function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;! d% ]3 v( J+ c
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;6 X9 Q4 U7 I) \( y d1 C' O* Q# S
- function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
" V" H/ b( S, X - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
" w+ d0 L& q: o7 i1 U5 S' M - end;
4 e$ e F2 L5 o9 k/ K - 4 Y ^) M* _/ n' x/ Z& l: M
- IAudioMeterInformation = interface(IUnknown)5 r0 s0 ^% b$ X' u2 @
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']* c- g: o7 I3 t% p+ j' W7 z9 C
- end;) {2 n4 F! G( G9 u$ B! k
- 0 J- u: i5 q% M* w! ~) L
- IPropertyStore = interface(IUnknown). D8 y' l1 H5 m" C: \
- end;4 H9 z/ z2 q8 z8 V
- ; s5 Z5 Y8 V+ N4 a: s
- IMMDevice = interface(IUnknown)4 l, N" ]: ~, Y* D
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
+ a2 K0 f4 a5 P& k - function Activate(const refId: TGUID;
% g: i( B; D" L& p2 L - dwClsCtx: DWORD;# v! i! f& f0 D9 O. u
- pActivationParams: PInteger;
+ w) n. H" E1 B7 l; k3 a - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
0 e' N( D ]5 h. k: L6 K( z% V - function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;* \: V3 g2 W5 V# B4 b
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
) I4 n# p) g, n4 |& d - function GetState(out State: Integer): Hresult; stdcall;. C6 J3 E. O, v8 d7 f
- end;; i1 B2 @3 ^3 V5 N( n3 L9 o5 M
- ! s. I1 H5 S1 _( V% ]4 h# d( T
8 r! d- e$ Z% E ~- IMMDeviceCollection = interface(IUnknown)$ C/ G# r9 J1 w
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']- n) U1 w- k; Y# v/ D; L
- end;
+ `+ [6 L( s/ l. @5 X! x - ' J4 @: J1 h" e9 \- f- ~6 @3 ]
- IMMNotificationClient = interface(IUnknown)$ e5 |7 ?* D' u
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']( u I* \* Y) |
- end;
* [3 f5 J' A ^ v( i. h! {
6 _! ^; y+ n H# n5 h* I- IMMDeviceEnumerator = interface(IUnknown)/ _0 M1 V" X1 Z ~: o. z% H
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
! V6 ^: ]* Y( Z+ ~ - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
" d. {6 v: r4 Y- S2 M$ N3 j" U - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
* }2 I1 q. |- S7 O) S - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;* Q- K; T! G6 ~5 V8 O
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;' S; @2 E. `8 l, W& }" E+ u
- end;
6 X' \& R$ B+ Y6 f - 4 k+ P- `3 `' T6 k& c; |: s
- implementation1 x2 k) V& }; D7 W
- $ @# E* @5 E( j1 u$ w; P( B* o
- end.8 f) y8 G. e% l, O7 z' O+ S
0 o- \+ |! p1 e' M9 P- //////////////////////// c J p0 p% y6 H: u- D+ k
- simple sample :)
2 F1 E* V# [! ]) f4 a! M - ///////////////////////" N1 w6 _# h T ?1 f
- # L( f1 y7 G- g# V
- //...... other code
1 A6 P9 R, F9 [; f/ Q; j
2 N$ j! }' k- ^- uses ... ActiveX, MMDevApi, ...;
( ^( z* o! L! X% X! c' \
8 K/ ~4 [+ _' C! q) ~" k$ ^1 Q8 h8 G X) S- //...... other code
Q; B- m- y$ Q/ g/ i
1 {' R3 ^6 t% u \$ N* X# s7 M! D, q- var2 Y1 f+ D' ], P! i; R
- endpointVolume: IAudioEndpointVolume = nil;
+ e$ |+ ~3 s) h: o# W2 r/ O3 b8 J
# }1 a% `! h4 k' t8 ]6 `; F- procedure TForm1.FormCreate(Sender: TObject);$ g! t$ r( }2 I8 s5 r4 ]
- var& u7 i# V: J' j) I* M# x
- deviceEnumerator: IMMDeviceEnumerator;
- i6 W* c( d- c0 C4 R! l2 v - defaultDevice: IMMDevice;( Z" u4 N7 g+ W) [! a
- begin
" q1 L2 k# V8 ^5 P. c - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);. N# N2 S: D0 s; ]
- deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
" g4 N/ s q6 h) m3 v - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
9 E3 z/ O! S+ N" t3 B - end;
. C$ p, @5 T Z6 ^3 U. t - - t' O3 {- b/ F" R. M0 C8 x
- procedure TForm1.Button1Click(Sender: TObject);
1 M7 d$ X) r, g8 C( h6 |# s - var* S* T& O' I/ i/ [& f" ~9 P+ l. S
- VolumeLevel: Single;# _; [: R# L4 G) R' g0 o( T9 C
- begin
! P1 O. v2 H% m - if endpointVolume = nil then Exit;" t' N* d* M* |
- VolumeLevel := 0.50;: t, j4 w# \0 H% p P: n, W6 f& _# F
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);" J/ X" `) j. I$ k l
- Caption := Format('%1.8f', [VolumeLevel])& f" f: F" r5 f9 ^- K2 q& L
- end;
* o$ w8 b0 ]' \, H) k! l$ S
1 a+ X3 ]5 r) {- /////////////////////////////////////$ }" O/ u9 D2 a, {, ]
9 G n; [: j7 d# S( Y- // with best regards ToxicDream
9 V* o) C6 y, [0 K5 F, n
复制代码 |
|