|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec0581 [. w3 j! c- ~0 l$ m
By Mukta & ToxicDream
% T8 v. x" |' Q% p- S- //for delphi 59 x. |! D/ U% A: ~* }
- unit MMDevApi_tlb;2 A, C- c$ i; L; L% p
- 3 [2 n2 N/ h! x& b/ u$ e
- interface
" X `, J9 h: Q2 m3 p+ J- H - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
0 S/ L$ j0 `) a/ D# B - const
& }, r2 {3 y% q1 x - // TypeLibrary Major and minor versions; U- M3 x; m1 k
7 Y. B8 e. n* Y' c. t- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';! y% t% R( n) N! J5 G
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';; _7 S( }4 i c8 G
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
6 j# _8 B# }0 }" ^* S% f - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
+ E$ I6 k6 v1 d4 v" g - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';- r+ b: H# a+ P; [5 p7 s* z; u
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';1 z; W) V# Q$ O7 P9 `: G# c1 l; u+ ^
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
' Y( P D0 I# q% ?. v
1 V; i, N% m$ T# e* S5 X- DEVICE_STATE_ACTIVE = $00000001;+ d2 t. T7 P6 }) f
- DEVICE_STATE_UNPLUGGED = $00000002;
% \+ ~% J' }7 r - DEVICE_STATE_NOTPRESENT = $00000004;
) J# g% U8 P4 G4 l, F( I - DEVICE_STATEMASK_ALL = $00000007;: f- n2 z/ G6 _( s G
% d' I" a; W% L2 X$ E: z- type
4 i% |! e& G6 G, \3 K5 w; _2 o$ m - EDataFlow = TOleEnum;
9 Q2 G7 w3 Q- |) |* F1 w5 w, W - const
" h C4 [$ n+ @4 c# }# D - eRender = $00000000;
1 g8 O4 s/ f' h - eCapture = $00000001;- e- D7 X% ~4 }) c3 m" k( W
- eAll = $00000002;
% H% B \$ Q+ S. P8 ] - EDataFlow_enum_count = $00000003;
7 {. x( J4 }3 e! @" ]
3 N( e* P8 q- Q( `2 ?# O- type
: t6 l+ [3 n* u& o - ERole = TOleEnum;3 v9 S% W; y9 G: F" Q6 \
- const" C& s2 K* r6 A
- eConsole = $00000000;6 t7 s1 n+ w' z, S) S& q4 V2 L9 K* v
- eMultimedia = $00000001;
/ z* `4 V* x: R2 C0 F0 l - eCommunications = $00000002;2 d7 ~3 K$ V; l# [/ O, Y4 C. ~
- ERole_enum_count = $00000003;
5 h* |1 ]9 {. n' u; C; x0 P- P! T - 5 s1 ~" k: F+ O T, ?
- type+ p- Z' x* t; R) `3 |
- IAudioEndpointVolumeCallback = interface(IUnknown)! n: v. l3 _3 c/ ^! ?4 j
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']' Y8 s! S9 R2 C7 F1 N7 N
- end;
+ W' i9 C$ z7 S f4 I- r& x - 8 G5 X3 {3 D7 o5 Q
- IMMAudioEndpointVolume = interface(IUnknown): z& G& x0 R' W; z8 G
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
! f) h D7 Z3 C - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;: I4 ]: s4 \1 e
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
3 x* B% V4 z9 t- F, D$ w6 B- o- X - Function GetChannelCount(out PInteger): Integer; stdcall;/ Q- h* z% R6 F2 a2 z
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;4 P; y2 R6 @7 q: e
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
9 t4 O l. j' }$ v- } y6 S - Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
; Q( H6 b# n* M& R6 t3 e - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
5 c0 n$ Y& r- s5 T U - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;" t! s% y6 g/ X- \, d5 f
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;' F$ b. c7 o/ L$ \( P8 L8 X4 M
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
& L. j4 e5 C. O7 W6 {* p" w4 ^. q - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;
% |' c% ^7 _. K V- `) k8 }+ j - Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;( c% P0 i- {1 a' o7 T6 c
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;
( j5 u/ U' [# E; v: y - Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
8 K' V% @, R5 \# ]7 }* c - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;$ l% j& x" W' y V% g, b+ s
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;2 @1 ?1 x$ x6 S" L" X! q7 r) N a
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
2 c/ {9 j( t" l - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
0 }( ^9 S% {+ _& `" r d4 q* ` - end;$ w$ G. w5 G" T, U6 X: p0 |
- : t; e8 e2 T% ?: O5 S7 l
- { IAudioMeterInformation = interface(IUnknown)
' u8 X3 x6 i0 f% M6 J1 ~ - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
; P) W7 J7 L& a2 Q! J9 k$ _ - end;}, I- [8 C+ D5 @
- : n' ~ x5 e, z& k! h
- IPropertyStore = interface(IUnknown)
* d1 O* S, J5 z5 @0 H - end;
5 N- }' j5 x+ [5 z
* L1 K6 o- n% T- type
7 g+ U2 R' r: ^ - IMMDevice = interface(IUnknown)% s( `, Z0 \3 D0 D- |0 p: G
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
* J8 Y7 A" T* m, ]" l9 A - Function Activate( refId :TGUID;
5 l; n7 X: t8 l/ Y( P4 |; M - dwClsCtx: DWORD;
) Q/ D+ l" p2 w' t; ]* w/ I - pActivationParams: PInteger ;7 P/ M1 h6 t: F1 T
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;: _ I8 J7 J/ y* X1 l) y
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;
L) I4 |4 z$ X3 N$ h - Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
y0 R0 `8 [8 H/ g: s) x. x& Q - Function GetState(out State :Integer): Hresult; stdcall;
7 M# U* f& F: ?' n+ S - 7 D% `9 I/ l; ?
- end;
+ f$ C' c5 [7 v9 x' @ - 0 G' ]1 L! N6 M+ U, |
1 I8 r" `6 y* f$ M7 q+ Y- IMMDeviceCollection = interface(IUnknown)8 ?7 r$ N! U3 ~, A
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}'] D. Q. t0 m E+ ^1 k) W
- end;8 t/ X& I6 M8 ~2 u i# j9 C
9 y& V8 M* z, [8 ?- IMMNotificationClient = interface (IUnknown)
% ]( \, H( w7 r7 [4 Z- _" T - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']( A! a& ?% I. g
- end;
0 |0 n& Z% H: s' x" Q
3 ^& R9 U/ z4 i, q' S9 ^; k- IMMDeviceEnumerator = interface(IUnknown)6 _- |; i+ _; ]; i# x- m$ b; T1 A
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']+ A4 ~8 J# r. e; R9 Q7 ]% C
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
+ L# \: H* f. Y% m- [' y - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
) h, I" ^5 W& t: R8 K3 s: ?9 @ - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
- t. x, n, v4 n$ G' Q - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
: V; C6 _5 e1 \5 j/ T5 L - end;
, i/ d) a8 B4 f3 w
9 v) e- z2 i0 q( K1 F/ r- implementation& u. g6 R( q: R
- end.
; O8 V7 r: O0 |/ {' r U- j5 } - 7 c, W9 J, G$ [
- Thanks & Reagrds,
: X. x* o2 {6 _. M# a0 W& Q4 e' L - Mukta ...
. Q- A5 Z# n' B9 u! B) G* t
复制代码- 7 J: j) h3 t# S% O
- it's work in Delphi 7! f! b0 g, {5 r; J* {6 `
- //////////////////////////1 T/ k( A' w% d; W& |0 m
- ) W2 C) ?" A& _$ H+ M2 }$ u
- unit MMDevApi;
$ E# X: a7 T9 }- G - 2 r6 g( C# L* r
- interface
/ N7 o) m* S+ l y$ O
! w$ `" s; n8 P- uses- A3 q9 \3 o- {! }$ x3 N+ p+ o9 y1 a
- Windows, ActiveX, ComObj;. y& p; ~/ z: r
% p- r. m& d" ?4 s1 {3 i/ ~/ W; W- const
6 L: ?3 g3 c/ H7 u. o8 T* X - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';. Y# X1 L7 v9 g! n0 Y3 i* L
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';) Y( Q* f# a( B+ m4 _: l# h
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';2 _4 x, b4 u0 B! Z. N; j
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';* @5 ?! m, r! z) j! u! N
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
. Y0 f0 `" v6 E: F3 L - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';# @# b: W# Q7 S6 _0 R% m
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
+ q* M! O$ L; Y- }, Y - 0 s3 \0 i; y3 \6 T
- DEVICE_STATE_ACTIVE = $00000001;7 K# e& Q" T9 t6 e# d
- DEVICE_STATE_UNPLUGGED = $00000002;! a4 R" P' K/ k+ B( j* [
- DEVICE_STATE_NOTPRESENT = $00000004;
( G8 E- }' U/ b4 ^* s! w( n, F - DEVICE_STATEMASK_ALL = $00000007;% Y& X# ^3 \) s; \9 U
- ' |) `9 F: G; E4 U7 u1 O% w
- type% i! I7 F* r, R$ N6 E
- EDataFlow = TOleEnum;
# F) s2 e' E% a, @$ ?
4 s. X2 E- i( Y- const
0 X6 X; u& u" ]2 U G! M - eRender = $00000000;! {) f3 e; X2 q. V, S4 Y- {, v/ a
- eCapture = $00000001;- X5 o- g% f* B) a
- eAll = $00000002;5 R& F4 K4 `6 d' O
- EDataFlow_enum_count = $00000003;
6 Z/ k# Z& b* U, B3 Z% ?( p, O
~- Y( c- @: u7 f$ U. B- type
) G/ C/ }9 r: O5 e4 m - ERole = TOleEnum;
; Z. s/ C, x9 ^$ z7 W - " Y4 a. e! c+ ?
- const4 z2 r/ M. w* r
- eConsole = $00000000;2 {# _' T! `# Y; J2 P) H( H4 L
- eMultimedia = $00000001;& X8 d1 k7 c4 U$ U
- eCommunications = $00000002;
' x2 U& D& \: z. l; K! C - ERole_enum_count = $00000003;
( U8 \. V+ t" {: l! i, ] - 1 X" R4 B( ?% {% a+ Y
- type- n- o- w1 v9 {% L U
- IAudioEndpointVolumeCallback = interface(IUnknown)4 Q! n+ }3 Q! n( G2 ^# k
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
* I c" S/ b0 P0 ^! G - end;
, r" Y$ M }1 }) J - : w) \7 E' A( P8 X6 y- f" A
- IAudioEndpointVolume = interface(IUnknown)* E0 D, h5 z$ e# m
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
}) A% `* W0 O2 c6 D: E/ G - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
/ D) v6 P1 T9 c( z3 K; ~2 h - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
1 v% d4 v( B B, Z" S# Y - function GetChannelCount(out PInteger): Integer; stdcall;2 K I. }" k! D0 t$ I1 S
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;7 B* c- O) |" R) I& T
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
+ l+ [. Q, O) h - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;! Z a) H ^# F/ I7 I! ?
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
/ B: n3 ]2 e$ O1 b# K - function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;, ? ~7 I8 \: u3 z
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;$ N- t: Z+ q# U2 V
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
0 i8 f0 i1 N/ {9 \" s% Z0 T7 b, G( g - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;: @8 `7 N/ z2 |3 m( d" F4 C1 F$ E+ Q
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;+ A+ o: K1 ?( e7 e8 t' S$ F
- function GetMute(out bMute: Boolean): Integer; stdcall;
4 S0 r7 _; N( O5 @6 G" t - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
* z1 ~ @, S! Q' ^+ D7 V! j/ K) c - function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
6 e# E1 y0 S% |# Y; E - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;3 J% F# R; i9 U. H$ o7 l* E1 P
- function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
# N0 \: e1 ~1 C6 x- h0 U - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
$ F$ V6 w: s4 ?" I - end;/ r8 F* a$ I1 K; Y) G: a% v( T% u
- \9 ]6 }: r$ U- L' C- IAudioMeterInformation = interface(IUnknown)
: p: [! ]# b$ k' c+ ]) B. b" [: }7 ~) @ - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']& e/ u% ?9 g6 ~8 F m% K# ~1 a3 K
- end; R+ f7 w7 ^- }6 ]2 H3 f
6 R5 [5 ]% U' V# t( T- IPropertyStore = interface(IUnknown)* ~- k2 X7 u' [8 `: |: Z7 ?1 P0 y
- end;
8 s& P& [$ t. r$ E% z" `/ f& ^
+ Q9 u, N- e+ T' m- IMMDevice = interface(IUnknown)
2 D1 v3 w' O4 H3 c: I, M& j7 y - ['{D666063F-1587-4E43-81F1-B948E807363F}']3 I" K$ y* f1 E- f0 \. p- l
- function Activate(const refId: TGUID;
) `' D& z. N. r+ u5 A3 k - dwClsCtx: DWORD;" w! a7 P- l9 N8 p) u1 P+ |
- pActivationParams: PInteger;. r, D0 I4 a" ~5 H# K
- out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;6 Q1 ?+ j* E" X& n2 R
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;4 D. _" d& V: H. `
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
9 i4 R4 C- M9 q' ]# J7 f - function GetState(out State: Integer): Hresult; stdcall;3 a! B! ]/ p% u( V
- end;
8 i3 ^; |$ u) e$ p& r, G - , c }5 ?3 k3 H7 h9 M% M% `" `
- , A2 s# V( ~3 ^) H
- IMMDeviceCollection = interface(IUnknown)* O! }6 \$ l$ E/ ?% E
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
: ]7 R1 I& L' M9 }: Y - end;
0 r" W# H* {4 R2 f" |, `# h# E - & M- ~; @/ j! ^; o
- IMMNotificationClient = interface(IUnknown)2 ?" ]. O, A; Y) v
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']. z O; c) Z! b: j& z. S
- end;
# F1 K9 J8 H+ m
( s) d/ o- K4 [9 J- IMMDeviceEnumerator = interface(IUnknown)
8 @* J( j( i+ Q: O5 h# `! i3 Q - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
! X5 K0 L; V6 ]$ h, B8 |" \( W - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
9 P9 m9 W; f' x, k g - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;) H$ Y7 e$ c: y: w3 ^4 E! f
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
2 b* N, H0 Z7 `, W) O! R. d - function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
& y" Y2 a" I! G2 J! j2 g) h0 \ - end;" ?7 E G; @4 Z# ^
$ h X5 A) M! C, l+ T- implementation& |9 V9 z# C6 E2 q; J( y6 W9 e
+ Y6 J* i/ b! U/ L7 S" Q* c- end.# D8 L% Q& W: }) ?4 }
- 5 X9 n" w+ B: A
- ///////////////////////
8 E( V6 Y; I! Y0 D' A# K' U - simple sample :)
" s" b M, U$ B1 A* l: M - ///////////////////////
q' Y) }5 P' w( F4 { - 3 v- b. P3 O K- P9 I
- //...... other code3 e* z: M% F+ |. i* |* N- M
- + ?+ D+ Z( D% @7 w: c/ A% P
- uses ... ActiveX, MMDevApi, ...;
+ U, p& @3 `& I. t. s, w - 0 l, y. P- ^: d# b
- //...... other code3 d. o- u. e7 a
0 K) a/ X! F) M5 z- var
* Z. w# a6 Y( N9 a5 u1 K8 p7 N - endpointVolume: IAudioEndpointVolume = nil;
3 }7 v- g! X. N
+ I5 L; E& p& J; S- procedure TForm1.FormCreate(Sender: TObject);& B+ S% @: e) o6 L* M9 G
- var- N; y; a5 f( g4 f: ]$ n* n( k
- deviceEnumerator: IMMDeviceEnumerator;
) i ~8 \% ~0 c' W' f - defaultDevice: IMMDevice;. U% A8 e X4 Z4 r7 k5 d) v
- begin$ c" f* R( N( e- _/ K. h; |( `% X+ w* m
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
8 p: l; x0 T ?/ V1 X$ Y" l - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);& J+ c. ?5 `7 X5 a( I
- defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);" Z- G) k: O' |% d3 e
- end;; W4 m* u J1 z
: f- X( N2 ?6 x5 \+ S- procedure TForm1.Button1Click(Sender: TObject);
9 i% L/ E; v8 {3 w2 A3 e - var% e& Y! d$ }4 `* I2 K, g/ R
- VolumeLevel: Single;
z E% s) _# E# W/ }0 [5 ?: w& p - begin4 I; J/ ]3 P ]: ~& t0 m
- if endpointVolume = nil then Exit;& I' c3 @" W' j8 X7 R: M& S+ T
- VolumeLevel := 0.50;/ Q3 _. L6 R! N- E! j
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
1 P0 T8 X# B* M" U" v8 Q- Q; S - Caption := Format('%1.8f', [VolumeLevel])5 V" m& K2 M" u% a1 p( O' ?
- end;3 ~, c7 X) K( A2 R
- / Y) H5 Z* n2 A8 r S( B8 Z( p
- /////////////////////////////////////
4 e! k4 x! B* \/ @$ p$ q
" K1 c; P" S3 J- G- // with best regards ToxicDream5 Q$ U/ R! l, i! @5 n$ @
复制代码 |
|