|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058* e7 _& O6 }8 `, L! T. ?: m
By Mukta & ToxicDream
' _( t+ ^ g: m2 [- //for delphi 52 N0 G+ _" ?2 D G
- unit MMDevApi_tlb;
l# o0 _. p' X- M; P: w. j
! \ L5 l3 B# \; h- interface
E2 k( s- z4 j0 C2 K& R - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;& N z4 e+ J; ]" g) s1 A
- const
2 E* F+ ?$ ~8 b; O, t- O - // TypeLibrary Major and minor versions
$ F1 Q. z; |" k3 Y4 e - 0 s3 r; g6 T; p# E) ^& {' D1 k
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
; H8 w: f0 W8 ?. C - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
7 o* B! j w% `% t, s& a3 g e - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
# G7 n l5 D5 j p9 r7 L - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';, Z: N+ M1 y! V5 X. Z3 J Q- A
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
4 n5 F: @; i2 Q - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';% z8 Z$ h1 e* y( @
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
* s/ J. L3 M; A9 V/ b* r3 W
3 s- f% D) T( s; R4 D- DEVICE_STATE_ACTIVE = $00000001;8 u" w- s7 d: h$ ]
- DEVICE_STATE_UNPLUGGED = $00000002;
* n& m# B G- d - DEVICE_STATE_NOTPRESENT = $00000004;+ G6 @, H ?" R* }" u" [% r
- DEVICE_STATEMASK_ALL = $00000007;
+ A5 k$ J4 U% F" \2 Z' z* @) O" F5 s - / W0 j3 @* i3 U2 ?1 r
- type3 D" I; ^8 @; F0 p1 H" r
- EDataFlow = TOleEnum;0 l8 |, X( ]/ v5 ]- z, ]
- const
6 u, ~! O7 N1 |- U5 K1 x0 o - eRender = $00000000;- \& w5 d. e* O) \% F' g
- eCapture = $00000001;$ b# v, Z( l' X+ n
- eAll = $00000002;
. X- k6 c$ w; M* o5 \% ] Q! j - EDataFlow_enum_count = $00000003;) i2 t, s4 k' g/ R7 P3 U2 w0 I
- ' f5 K1 _3 W1 j. K1 P% O
- type
7 A z7 @/ Y7 J3 }; g$ t) d - ERole = TOleEnum;
3 Y8 ~% @3 t1 ?* @; ?7 a! m - const
0 K" ~" D$ M J - eConsole = $00000000;
/ z+ {: ]9 w) v, t& o' m5 U, L - eMultimedia = $00000001;8 S' H! K+ l' a! u/ r6 u1 a) r
- eCommunications = $00000002;
% c! M8 ?# K; t* G6 |: C - ERole_enum_count = $00000003;
" C% M" \. D# M7 J$ ]' v5 s
# y j3 s- ~2 g+ F5 O& c0 P- type6 Z: Q% I, K m- l) I, U4 s; S
- IAudioEndpointVolumeCallback = interface(IUnknown) m1 P, x$ W+ z* q, s* i, ~
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
3 ]2 m) ]0 d( Z* H7 u1 G# {. Z! z - end;
) Y' G* r/ f( B1 N4 b; ^
8 a& d4 A6 v$ O1 E' b6 I9 t- IMMAudioEndpointVolume = interface(IUnknown)6 j, c- n& u; ^2 y7 O
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}'], I! u& T6 b* s3 |7 i$ c( `* p
- Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;: d) \! K& r( s6 R5 r% x# m
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
5 c7 k8 q% Y7 b4 T: N7 Y - Function GetChannelCount(out PInteger): Integer; stdcall;
% ]) ^+ x" x _8 F# Z6 M) D) B - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
8 T- f# u" B+ S7 }* @$ v& E - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
+ v4 F3 k: A; [: d u - Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;; F5 V3 H3 ]% o3 F8 g& A7 m) I
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall; r: u# h( i$ X4 ]: m" q
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;6 c# ~# H% q; H r' l' I3 m; |
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;5 N- {* s; i& T; m
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
5 O7 R4 L( Z# [/ o* e) u/ c$ P6 O - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;# ` l3 {& T7 w% t( N# k
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;
" D8 N4 R+ ]& {& x - Function GetMute(out bMute: Boolean ) :Integer; stdcall;" [6 Q1 G* O% B! d& ^, S
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;3 ~6 C" n! i z0 V. @$ ?: r3 q
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;: m+ @! x2 Y3 Q# s" W
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
- e: Z ~9 G. m6 H& V - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;' }' w: |$ M, Q
- Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
2 v8 x& t3 \- s% H7 X - end;
U4 L' O* j+ j1 O- N- \. V) l W - 3 Q% Y9 q; t3 ~7 ~5 ?
- { IAudioMeterInformation = interface(IUnknown)# V1 H' @/ ~; v' r) V
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
6 J" e$ f/ R" j1 Z* h - end;}
; a5 \1 L4 n+ K - ; B# w, K9 P! F2 ]/ r
- IPropertyStore = interface(IUnknown)
2 m* a) ], B6 f/ D2 u# _7 c) ? } - end;
2 V) k9 F3 i( \$ w& g
" \% F a* g; d3 E* f, M: S- type5 |4 }* n* e& k7 C& k
- IMMDevice = interface(IUnknown)+ K% c1 x/ i1 X" j
- ['{D666063F-1587-4E43-81F1-B948E807363F}']( S) ~- M, Z- R+ y6 K
- Function Activate( refId :TGUID;; W7 J# U/ r# f& G! c( R/ p* Q
- dwClsCtx: DWORD;) @3 i3 p' B h, f
- pActivationParams: PInteger ;4 W+ o" H) h! m& d% d+ \- V3 O3 l
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
! p" Z: P8 S. H4 C1 L% K0 j$ _3 G5 p - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;5 [& h; o( B& l* h5 j
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
$ t' n& f& S( D" m# m' ]6 k6 V - Function GetState(out State :Integer): Hresult; stdcall;7 c2 Y, X4 L ?0 l" W. I( U z5 E
: j$ f+ b, }( j. P1 C& h- end;' L7 }8 b: _) b$ ^! O9 Z! p5 e! a
- 1 X4 W3 N3 E% C( ]
1 R& v5 l7 T5 \- B, [- IMMDeviceCollection = interface(IUnknown)
' x H. F+ K R, n: \ { g - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
% g' \, A9 K3 _: h+ M - end;- ]6 U) g. N2 G/ I, \: N
- 0 |0 o9 R% \0 i/ _: u( r4 Y
- IMMNotificationClient = interface (IUnknown)0 L+ W7 c/ U0 O, _% G* O
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']6 d* \' z- ? P9 [ G
- end;
9 e6 j/ P; U6 b0 Y - , I- q6 ^$ R; o
- IMMDeviceEnumerator = interface(IUnknown)4 p6 N" b6 E/ K! |; F6 u
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']0 ?5 |8 Y) f4 {! ?
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
$ h3 k: G3 T% K# A4 [ - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;2 y8 s, Y7 F% q1 ]2 D
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
~: D# d: [2 ~$ e ^1 o; r - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;9 Z8 m+ {! U( m2 {# \1 r/ }
- end;
; F) ?4 c1 B* x$ c- D
' `9 u" c s3 R" N6 @; W2 ?; w- implementation
0 F: s$ @+ B4 z% N - end.
7 m! v7 M9 @% t8 g, y - 3 h* Y* B/ {# i2 w" E
- Thanks & Reagrds,
* u- q9 x+ @% B N - Mukta ...
1 M0 g: P1 H& \* g5 S0 c3 F
复制代码- % z3 [3 L7 q( p0 x& o# z
- it's work in Delphi 7
) l/ J' w1 e6 L* r+ } - //////////////////////////
; K+ y9 A& @* S& ~5 b1 E - ) G; u2 {, D/ \# m9 y8 ]
- unit MMDevApi;7 I1 V2 m8 U# T1 I8 T$ m
1 {# h7 b+ s6 ~% f* S# x( O# A- interface! t% {) N9 h6 B4 m. w0 v2 `
* K; l+ v8 z3 R! m$ I' t- uses
@7 K& ]$ R0 X. e0 E6 S* _ - Windows, ActiveX, ComObj;
, U4 o: Z. Z( A5 `9 O5 C# H" a. r# G
& i7 Z: l, K5 M/ m- const# g0 p0 B, X2 O3 ^
- CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
8 o4 y! k& d! d6 p2 V' N+ _! ~& P - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';. g; s4 Y" g. I! Q2 K6 ^: A- n5 c
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';: H0 ?: F$ f0 s0 Y
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';6 Y5 V- v0 {5 |: z! v4 d
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
6 Q5 f" t4 z1 C% G( i# w - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';# t, G: g+ _3 {0 M( M8 e3 O |
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
5 o4 t$ |$ \* \1 J" C! c5 f
/ p% ~; k" g. H0 \+ M- DEVICE_STATE_ACTIVE = $00000001;
1 y8 U3 t2 a; I4 C& X. J - DEVICE_STATE_UNPLUGGED = $00000002;
! r- S" m) y) N& {& S - DEVICE_STATE_NOTPRESENT = $00000004;. _8 Q6 u7 D3 n" M& ^) A; D
- DEVICE_STATEMASK_ALL = $00000007;, }2 v0 r+ p8 c! P. o' s# A: q
- . w8 M2 W: _) G
- type1 Y5 S! N7 W* c/ _( R6 F
- EDataFlow = TOleEnum;# o- @: |5 z$ r, J7 h
! P% Q7 _ t/ v+ f4 _- const& l. E- b. v( {( W4 ~3 L
- eRender = $00000000;
Y }0 F( z3 w; L4 O" ]/ t6 l - eCapture = $00000001;$ v, [- f* x9 ^7 w2 [! d
- eAll = $00000002;
: Q4 R4 s; d' Z. S! s - EDataFlow_enum_count = $00000003;
4 c$ U j, f3 l6 I8 [ - ; i& k0 l; p: @) _
- type/ f1 `% k4 k( c5 h
- ERole = TOleEnum;9 z+ Z5 w! \6 j" E( F0 w4 {# v# @$ c
3 o. g _. o5 f9 C) C* i5 N- const: l3 h* n: s+ M& R, M1 Z2 c
- eConsole = $00000000;
( S3 A `2 g" d# {6 a& g - eMultimedia = $00000001;
% u ~& H' C( z+ ^6 F2 @, c$ O - eCommunications = $00000002;
. P9 I# o$ O) s6 V& r - ERole_enum_count = $00000003;
" V! _! P* `" x: a7 T8 H- w1 }9 l. G) F
" O& X/ B/ O0 R) h% o# j& Z4 B9 u; ^- type
/ f( H$ F" H5 J% s4 h - IAudioEndpointVolumeCallback = interface(IUnknown)
( e3 R. x$ O+ Y$ l* y - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']7 J% G: z! o# M
- end;
( W+ N# [# |+ B3 y' b/ n6 l i' Z
& t+ d5 X4 U( V: L( j' s$ Y- IAudioEndpointVolume = interface(IUnknown)
+ D, v3 T6 ^8 m, l - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']7 H) [3 j H3 h9 d1 q
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
4 e5 q- {: \: O2 _: h- A8 C6 s - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;* v" ^! E1 @% b9 t7 H
- function GetChannelCount(out PInteger): Integer; stdcall;, s3 j4 x! U- Y) _/ _- O1 E
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;: |0 }( v# z6 r. p% _7 o* G
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;$ r- l, p3 R% d, i/ M6 U, D
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;4 y9 p( F: T- e9 ^
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;- d1 c1 \9 @4 G$ O
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
( A: M% _5 {7 s - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;% B0 v5 [' d' }( a9 n
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;4 e( {4 N9 a9 ~
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;! R+ G0 t# o# i
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;7 F! o# \5 P6 T7 i8 ]: d
- function GetMute(out bMute: Boolean): Integer; stdcall;
0 O) u. G- Q2 C9 m) N& o - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;/ ~$ {3 u R/ P( w( {* P
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;! N3 X, T' [0 ]5 ?8 V0 z
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
- n- v( |$ K( g6 { z( O - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;/ n( D' Y6 t' z+ s. U% f
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;& F3 f# G7 p8 B; ?* G0 y
- end;
* f; o! c! R1 {" Z( R
% S/ Q( E; U# y" @+ r' g% |6 S1 D- IAudioMeterInformation = interface(IUnknown)
: R& u9 `+ U) F* w5 M5 p - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
! [& e- |4 J' n( F9 @$ v! }9 s6 v5 H6 E - end;
5 e, J7 b5 w& Y( G% w/ ]- s - . k# p1 S( S: x9 T
- IPropertyStore = interface(IUnknown)1 r$ ~9 @8 `2 T9 B& f& b
- end;
( c& i6 D1 }3 Y! U+ M3 K
. R) V c' O2 s- |" Q- E- IMMDevice = interface(IUnknown)) [ m: I" F! F
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
3 @; E% g2 A) r/ M5 U - function Activate(const refId: TGUID;9 ?7 u$ q6 I1 K4 v8 A% |: P
- dwClsCtx: DWORD;1 h5 A O/ |/ i- o
- pActivationParams: PInteger;! n! A4 m$ }; ?
- out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
& k$ y1 F5 d# u' e* F) r' f - function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;/ n. q2 f1 B2 D' @# y5 J
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;# ~6 m) _4 A- f2 F; q8 f: H- o
- function GetState(out State: Integer): Hresult; stdcall;& W2 l( u0 B' O( i6 @& x* ~2 h
- end;1 B) W" y% q& q- b( O. S3 E/ N( u' E. \
- # [2 y/ l; D4 a. s7 f, n
% d" y& J5 X: X+ |, D- IMMDeviceCollection = interface(IUnknown)
& b2 s# c8 P4 B. E. N7 C - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
$ q# r6 E+ c/ R - end;. N4 p7 o' s! b8 Z
; [3 U( R2 n( z- IMMNotificationClient = interface(IUnknown)
/ |0 j5 Q! n; A( v, A - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
" t- X) B5 P# ^8 o4 O8 O - end;
* [* }. M+ u" i, P
! U; T) |1 J' D9 R n- V- IMMDeviceEnumerator = interface(IUnknown)
8 I6 M/ u5 E; P6 l8 f$ c - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']6 c/ W, v! ]3 {9 N9 r9 t
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
; y$ d E1 ~% A7 Z& I - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
) x+ u& c" U& U3 Z - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;$ z' [. o( ?' l) M
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
( c8 V. ^- t: u& A- T- T - end;
7 K0 n! r! V$ h3 f: u' I& I
2 i4 F; ], t6 S) N9 g- implementation
@% l! s% R4 G( f# ?: p2 C S9 H0 }
9 M" \$ j7 G, F# X- end.
- R6 A0 ]# ^$ x L& S7 _! M+ y2 h - 4 c8 ?7 M( |9 K) l S
- ///////////////////////
% Y5 I+ }9 q% ]' n2 i" c - simple sample :)& @8 k$ C( K* x! Y
- ///////////////////////4 p# t; ?* b2 d5 A
- : y! i8 f7 [- P3 C0 E: K2 D; Y
- //...... other code
! i* @9 f# J5 r1 J) k
& }- ~' y3 x1 y- uses ... ActiveX, MMDevApi, ...;
) a' {' o2 U! q- e; T: q
! ?; q0 a4 I) P6 _# q- //...... other code
6 r/ H' K; i& N# { - ) j1 z6 V9 E: N7 F( x. [
- var
8 F4 n! @$ U3 \" @7 V( U - endpointVolume: IAudioEndpointVolume = nil;5 _( t; q' z) c, d7 B5 O0 j
- 3 C' m+ r$ ?; `0 X% U/ E
- procedure TForm1.FormCreate(Sender: TObject);$ Q" a& n; W* `5 d
- var9 I! J) @! X. ^9 |4 c& W6 q2 l) h2 u
- deviceEnumerator: IMMDeviceEnumerator;( r4 k- D/ }. w& h; k W
- defaultDevice: IMMDevice;
! G1 N) y- _& ?! v - begin
0 ~. V1 c/ g ~# W - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
3 ?2 B- |/ F& s% V1 p. D. o8 J - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
! b1 N* s8 O, s; }" J& _ - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);3 d6 ^6 Z' O- N
- end;
r( O& A% i4 h& L( A; p - # W# K/ u4 ]7 y' h
- procedure TForm1.Button1Click(Sender: TObject);
! y' I& q! p! l8 _* C1 a" {; {& C2 |: w - var
% v$ j K& z% B1 D4 Y* }% h" P - VolumeLevel: Single;7 K& }4 F. Y0 N# y
- begin
3 g! G" m/ x; s+ M7 }, Z# y - if endpointVolume = nil then Exit;
# M! C1 i: U4 [* g - VolumeLevel := 0.50;
; r! B r0 w3 r+ o4 n - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
2 |# f* w4 H' [" d5 m! @& g4 r - Caption := Format('%1.8f', [VolumeLevel])
( B j: }6 U) K: S' G R - end;3 B* u6 w: ~# m! n8 V6 g( Z
- 3 n6 o8 u \' ?5 n( R- r
- /////////////////////////////////////
% n' ^( K' m* {7 b
9 c( V9 {6 X9 p" X- // with best regards ToxicDream- ], j: H+ l" d! P1 z, O9 s" C1 M
复制代码 |
|