admin 管理员组文章数量: 1087139
2024年4月30日发(作者:下载安卓市场)
…~m
PROGRAM LANGUAGE………… …………… … …………………t……………… …… ……… ……… … …………
| t
函数软
i
程荬现蔷频控 荬
|| | 。| |
摘 要:简要介绍了应用程序编程接口以及音频软件组件的组成和结构等相关概念,通过编程实
例,阐述了音频控制实用类的开发和设计方法。
关键词:API;组件;音频;声道;麦克;控制;类
由微软公司提供的主流操作系统,从DOS到Windows的
最大进步其中一方面就表现在由支持字符显示到支持多媒体显
示的变化,使得在计算机中音频、视频处理日趋重要,而如何
使用方法.所以极大地加速了Windows应用程序开发的过程。
有了这些控件和类库,程序员便可以把主要精力放在程序整体
功能的设计上,而不必过于关注技术细节。
在程序中实现对音频的控制也是我们时常遇到的问题.将给出
解决这一问题的实用方法。
虽然在应用软件的开发过程中类库和控件使应用程序的开
发变得简单的多.但它们只提供Windows的一般功能,对于比
较复杂和特殊的功能来说,使用类库和控件是非常难以实现
1 应用程序编程接口
以Windows操作系统平台为核心所组成的计算机软件系统
具有鲜明的层次结构,最下面是Windows的操作系统核心。它
的上面是Windows API(Application Programming Interface,应
的,这时仍需要采用API函数来实现。冈此如果要开发出更灵
活、更实用、更具效率的应用程序,必然要涉及到直接使用
API函数
Windows API中包含了成千上万的函数、例程、类型和常
数定义,不必去刻意研究每个API函数的用法.只是在需要的
用程序编程接口),在Windows程序设计领域处于发展的初期,
Windows程序员所能使用的编程工具唯有API函数,这些函数
是Windows提供给应用程序与操作系统的接口,人们可以象
“搭积木”一样,构建出各种界面丰富、功能灵活的应用程
序,所以可以认为API函数是构筑整个Windows框架的基石。
其上则是所有可以支持图形、图像的Windows应用程序,如图
1所示
时候能够正确查找和使用即可。按照通常的划分标准Windows
API函数分为7大类:
(1)窗口管理类:这类API函数向应用程序提供了一些
创建和管理用户界面的方法,可以使用它们来做出程序的界
面。
(2)窗口通用控制类:系统SHELL提供r一些控制,使
用这些控制可以使窗口具有与众不同的外观.通用控制是由通
用控制库comct132.dll提供的。
(3)SHELL特性类:应用程序可以使用它们来增强系统
SHELL各方面的功能。
图1
(4)图形设备接口(GDI):提供绘图、图形处理、使用显
此后由于基于API的Windows程序开发还是比较复杂的工
示设备等一系列的API函数。
(5)系统服务类:为计算机提供了访问计算机资源以及底
层操作的手段。
(6)国际特性类:有助于我们编写国际化的应用程序,提
作,程序员必须熟悉一大堆常用的API函数,而且还得对
Windows操作系统有深入的了解。随着软件技术的不断发展。
在Windows平台上出现了许多优秀的可视化编程工具,程序员
可以采用“所见即所得”的编程方式来开发具有精美用户界面
和功能强大的应用程序。这些优秀可视化编程环境操作简单、
界面友好,诸如VB、VC、VB.NET、VC.NET和Delphi等,在
供Unicode字符集和多语种支持。如MyControls20C.dll、
MyControls407.dU和MyControls409.dll等等。
(7)网络服务类:允许网络上的 同计算机之间的不同应
这些工具中提供了大量的控件和各种类库,它们替代了API的
用程序之问进行通信,用于在各计算机上创建和管理共享资源
的连接。
最常用的外部过程是组成Microsoft Windows自身的过程
如表1所示。
大部分功能,事实上这些控件和类库都是构架在Windows API
函数基础之上的,是封装了的API函数的集合。它们把常用的
API函数的组合在一起成为一个控件或类库,并赋予其方便的
……
PROGB^啊 NG帅G …………………………………………………一……………… …………… ………
(4)控制麦克风的音量。
此外.为了程序同时适应于16位和32位Windows平台上
运行.采用#IfWin32 Then…#ElselfWinl6 Then…#End If构
造,引用条件式编译器常数,来决定编译那部分语句。
3.1 表单设计
首先在Form1上添加3个Frame控件,name为FrameA,3
个Label控件.name为LabelA,4个Slider控件,name为
SliderA,2个CheckBox控件,name为CheckBoxA,3个Image
控件,name为ImageA,其中重要控件属性设置值如表2所示。
表2
LabelA
标识号 名称 值
O 外观 Caption 左声道
1 外观 Caption 音量
2 外观 Caption 右声道
SliderA
标识号 名称 值
Orientation 1一ccOrientationVertical
TextPosition 1-sldBelowRisht
外观
l'iekFrequency 10
rriekStvle 1-sldTopLefi
LargeChange 10
O SmallChange 1
行为
SelectRange False
SelStart 0
Max 0
杂项 Min 一1oo
Value 一50
Orientation 1一cc0rientationVertical
TextPosition 1-sldBelowRight
外观
TiekFrequency 1O
TiekStyle 2一sldBoth
LargeChange 10
1 SmallChange l
行为
SeleetRange 1'n】e
SelStart O
Max O
杂项 Min —100
ValHe -50
外观 Orientation l—ecOrientationVertical
TbxtP0sition 1-sldBelowRight
2
TickFrequency 10
TickStvle 0-sldBottomRight
LargeChange 10
行为 e iSmallChange l
lSelectRange False
SelStart 0
Max 0
杂项 Min —l00
ValHe 一50
0rientation 1一eeOrientationVertical
T xtP0sition 1-sldBelowRight
外观
TiekFrequeney lO
_riekStvle 2一sldBoth
LargeChange 10
3 SmallChange 1
行为
SeleetRange [rue
SelStart O
Max 0
杂项 Min 一1o0
Value -50
CheckBoxA
标识号 名称 值
外观 Caption 静音
0
杂项 ValHe 0一Unchecked
外观 Caption 静音
l
杂项 ValHe 0一Unchecked
具体各控件在表单上的分布如图3所示。
图3
其中SliderA(0)、SliderA(1)、SliderA(2)和SliderA(3)
分别用于控制左声道的音量、右声道的音量、扬声器总的音量
和麦克风的音量,并加入下述代码:
用于音频控制的对象变量(Mixer自定义类)
Private VarMixer As Mixer
Private Sub Form Load()
初始化VarMixer类的属性值
Set VarMixer:New Mixer
VarMixer.OpenMixer
VarMixer.SpeakerVolume=VarMixer.SpeakerMaxVolume\2
VarMixer.MicrophoneVolume=VarMixer.
赣雏 ≮
实用 第一 智慧密集
…
MicrophoneMaxVolume\2
VatMixer.SpeakerLeftVolume=CLng(&HFFFF&\2)
VarMixer.SpeakerRightVolume=CLngf&HFFFF&\2)
End Sub
Private Sub SliderA
—
Scroll(Index As Integer)
On Error GoTo SliderAScrotlError
Select Case lndex
Case 0
VarMixer.SpeakerVolume = CLng ((VarMixer.
SpeakerMaxVolume Abs(Me!SliderA(Index).Value))\1 O0)
Case 1
VarMixer.SpeakerLeftVolume=CLng((&HFFFF&
Abs(Me!SfiderA(Index).Value)j\1 OO}
Case 2
VarMixer.SpeakerRightVolume=CLng((&HFFFF&
Abs(Me!SliderA(Index).Value))\1 00)
Case 3
VarMixer,MicrophoneVolume=CLng((VarMixer.
MicrophoneMaxVolume Abs(Me!SliderA(Index).Value))\
1OO)
End Select
Exit Sub
SliderAScrolIError:
显示错误信息
End Sub
Private Sub CheckBexA
_
Click(Index As Integer)
0n Error GoTo CheckBoxAClickError
Select Case Index
Case 0
If Me!CheckBoxA(Index).Value=Checked Then
VarMixer.SpeakerVolume=0
Else
VarMixer.SpeakerVolume = CLng((VarMixer.
SpeakerMaxVolume Abs(Me!SliderA(Index).Value))\1 0O)
End If
Case 1
If Me!CheckBoxA(Index).Value=Checked Then
VarMixer.MicrophoneVolume:0
Else
VarMixer.MicrophoneVolume=CLng((VarMixer.Microphone
MaxVolume Abs(Me!SliderA(Index).Value))\1 0O】
End lf
End Select
Exit Sub
CheckBoxAClickError:
显示错误信息
End Sub
3.2公共类模块处理
增加类模块Mixer.cls.定义一个音频控制的类,源程序如下
Option Base 0 在模块级别中使用,用来声明数组下标的缺省
26:
2
一
012 . 壤
下界。
Option Compare Binary 在模块级别中使用,用于声明字符串
比较时所用的缺省比较方法。
Option Explicit 在模块级别中使用,强制显式声明模块中的所
有变量。
引用API函数
#If Win32 Then
Private Declare Function GlobalAIloc Lib“kernel32”{ByVal
wFlags As Long.ByV_al dwBytes As Long)As Long
Private Declare Function GlobalLock Lib”kernel32”(ByVal
hmem As Long)As Long
Private Declare Function GIobalFree Lib“kernel32“(ByVal
hmem As Long)As Long
Private Declare Sub CopyPtrFromStruct Lib’。kernel32“Alias
“RtIMoveMemory (ByVal ptr As Long.struct As Any,ByVal
cbAs Long1
Private Declare Sub CopyStructFromPtr Lib’ kernel32“Alias
“RtlMoveMemory”【struct As Any,BvVal ptr As Long,ByVal
cbAs Long)
#Elself Win1 6 Then
Private Declare Function GlobalAlloc Lib”kernel“(ByVal
wFlags As Long,ByVal dwBytes As Long)As Long
Private Declare Function GlobaILock Lib“kernel“fByVal
hmem As Long)As Long
Private Declare Function GlobalFree Lib”kernel“(ByVal
hmem As Long)As Long
Private Declare Sub CopyPtrFromStruct Lib kernel‘。Alias’‘
RtlMoveMemory”{ByVal ptr As Long,struct As Any,ByVal
cbAs Long)
Private Declare Sub CopyStructFromPtr Lib。‘kernel Alias。。
RtlMoveMemory”(struct As Any,ByVal ptr As Long,ByVal
cbAs Long)
#End If
Private Declare Function mixerOpen Lib”winmm.dll”(phmx
As Long,ByVal uMxld As Long,ByVal dwCallback As Long.
ByVal dwlnstance As Long.ByVaI fdwOpen As Long)As
Long
Private Declare Function mixerGetLinelnfo Lib w;nmm.d
Alias”mixerGetLineInfoAlt (ByVal hmxobj As Long,pmxl As
MIXERLINE,ByVal fdwlnfo As Long)As Long
Private Declare Function mixerGetLineCOntrOls Lib“winmm.
dll“Alias”mixerGetLineControlsA“(ByVal hmxobj As Long,
pmxlc As MIXERLINECONTROLS,ByVaI fdwControls As
Long)As Long
Private Declare Function mixerSetControiDetails Lib”wjnmm,
d (ByVal hmxobj As Long,pmxcd As MI×ERCONTROLDET
AILS,ByVal fdwDetails As Long)As Long
Private Declare Function waveOutGetVolume Lib”winmm.d
(ByVal uDevicelD As Long,IpdwVolume As Long)As Long
Private Declare Function waveOutSetVolume Lib“winmm.d
(ByVal uDevicelD As Long,ByVal dwVolume As Long)As
……
PROGRA啊U_GII^御 ………………………………………………………………………… ………………
Long
‘定义常量
Private Const MMSYSERR
.
N0ERR0R
:
0
Private Const MMSYS ERR INVALIHANDLE=5
PIrivate Const IMMSYSERR N0DRIVER=6
PIrivate Const MMSYSERR N0TSUPP0RTED=8
Pjrivate Const IMAXPNAMELEN=32
Plrivate Const MA×ERR0RLENGTH=1 28
Private Const MI×ER SHORT NAME CHARS=16
PIrivate Const IMI×ER LONG NAME CHARS=64
Plrivate Const Ml×ER GETLINEINFOF DESTINATJON:&HO&
Pjrivate Const jMIXER GETLINEINF0F S0URCE:&H1&
PIrivate Const MIXER GETLINEINFOF LINEID=&H2&
P{rivate Const MIXER GETLINEINF0F
_
COMPONEN T1 PE=
&H3&
Private Const MIXER GETLINEINFOF ̄TARGETTYPE;&H4&
Private Const MIXER GET LINElNFOF
一
・QUERYMASK:&HF&
PIrivate Const Ml×ER GETC0NTR0LDETAILSF VALUE=
&H0&
Pjrivate Const MlXER GETC0NTR0LDETAILSF LISTTE)(T:
&H1&
PJrivateConstMIXER GETCONTR0LDETAILSF Q
.
UERYMASK
=
&HF&
P1rivate Const MIXER SETC0NTR0LD E下AI LSF VALUE=
&HO&
Private Const jMIXER SETCONTR0LDE‘rAILSF CUSTOM=
&H1&
Private Const MIXER SETC0NTR0LDE1_AILsF QUERYMASK
=
&HF&
Private Const MIXER
—
GETLINECONTROLSF.ALL &HO&
Private Const MIXER GETLINECONTROLSF
_
0NEBYID
=
&H1&
Private Const MIXER GETLINECONTROLSF..ONEBY下YPE=
&H2&
Private Const MlXER
.
GETLINEC0NTROLSF QUERYMASK
=
&HF&
MI×ERLINE.dwComponentType
Private Const MIXERLINE C0MP0NENTTYPE DST FlRST
=
&H0&
Private Const MIXERLINE
—
COMPONEN 厂广YPE
_
DST
_
UNDEFI
NJED=(MIXERLINE_COMPONENTTYPE
_
DST
_
FIRST+0)
Private Const MIXERLINE
IGITAL=( MIXERLINE CO MPONEN
C0MP0NE
T丁Y E
N1_T
P DST FI
YPE DST
RST.
D
+1)
Private Const MIXERLINE C0MP0NEN丁TYPE DST LINE=
(MIXERLINE COMPONEN1-1 PE _DST_F RST 4-I 2)
Private Const MIXERLINE COMPONENTTYPE DST MON
ITOR=《MIXERLINE—COMPONEN1_1 PE_DST_FIRST+3)
Private Const MlXERUNE COMP0NEN rrrPE DST SPE
AKERS=(MIXERLINE C0MP0NENTTYPE DST FIRST+4)
PJrivate Const MIXERLINE COMP0NENTTYPE DST HEAD
PHONES=(MI×ERLINE—COMPONENTTYPE_DST_FIRST+5)
Private Const MIXERLINE
—
COMPONENT丁YPE
—
DSUELEP
HONE=(MIXERLINE,C0MPONENTTYPE—DST_FIRST十6)
Private Const MIXERLINE C0MP0NENTTYPE DST
.
WAV
EIN=(MIXERLINE C0MP0NEN1-1 PE DST F JRST 4-7)
Private Const MIXERL!NE C0MP0NENT。r、,PE DST V0ICE
IN:(MIXERL}NE COMP0NEN1] PE DST 1
F RST 4-8
)
Private Const MIXERLINE C0MP0NENTTYPE DST LAST=
(MIXERLINE COMP0NENT下YPE DST FIRST+8)
Private Const MlXERLINE C0MP0NEN1_1 PE SRC F{RST
=&H1000&
Private Const MIXERLINE C0MP0NENTTYPE SRC UNDEF
INED=(MIXERLINE COMP0NENTTYPE SRC FIRST+0)
Private Const MIXERLlNE COMP0NEN丁TYPE SRC DlG
ITA L=(MIXERL1NE COMP0NENTTYPE SRC FIRST 4-1)
Private Const MIXERLINE C0MP0NEN丁TYPE SRC LINE=
lMI×ERLINE COMP0NENT1 PE SRC FIRST 4-2)
Private Const MIXERLINE C0MP0NEN1_rYPE SRC MlCR
OPHONE:fMIXERLINE COMP0NEN1_1 PE SRC FIRST4-3)
Private Const MIXERLINE C0MP0NEN1_1 PE SRC SYNTH
ESIZER=(MIXERLINE C0MP0NENT] PE SRC FIRST 4-4)
Private Const MlXERLINE C0MP0NENTTYPE SRC COMP
ACTDISC:(MIXERLINE C0MP0NEN丁rYPE SRC FIRST -45)
Private Const MIxERL" E COMP0NEN11 PE SRC TELEP
H0NE:(MIXERLINE C0MP0NENT1 PE.SRC FIRST 4-6)
Private Const MIxEF{LlNE COMP0NENTTYPE SRC PCSPE
AKER=(MIXERLINE C0MP0NENTTYPE SRC FIRST+7)
Private Const MlXERLINE COMPONENT—r PE SRC WAVE
OUT=(MIXERLINE C0MP0NEN—rTyPE SRC FIRST 4-8)
Private Const MIXERLINE C0MP0NENTTYPE SRC AUXIL
IARY:(MIXERLINE C0MP0NEN11 PE SRC FIRST 4-9)
Private Const MIXERLINE C0MP0NEN11YPE SRC ANA
LOG=(MIXERLINE C0MP0NENTTYPE SRC FIRST 4-1O)
Private Const MfXERLINE C0MP0NEN1_TYPE SRC LAST=
《MlXERLINE C0MP0NEN1_1 PE SRC FIRST 4-1 0)
MIXERC0NTR0L C0NTR0LTYPE XXX
Private Const MfXERC0NTROL CT CLASS MASK
=
&HFO000000
Private Const M!XERC0NTROLCT—CLASS—CUSTOM
=
&HO&
Private Const MIXERC0NTROL CT CLASS METER
=
&H100000O0
Private Const M J×ER∞NTROLCT_CLAsS—SWITCH
=
&H20000000
Private Const MIXERCONTROL CT CLASS NUMBER
& H30 0000O 0 .
=
Private Const MIXERC0NTROL CT CLASS
—
SLIDER=
&H40000O0O
Private Const MlXERC0NTROL CT CLASS FADER
=&H5O000000
Private Const MlXERC0NTROL CT CLASS TIME
=
&H60000000
籀确 器 1疆 3
实用第一 智慧密集
Private Const MI×ERC0NTROL C丁CLASS LIST:
&H70000000
Private Const Ml×ERCONTROLCT—SUBCLASS
—
MASK=
&HFO00000
Private Const Ml×ERCONTR0L CT SC SWITCH BOOLEAN
=
&HO&
Private Const MIXERCONTROL CT SC SWl1℃H BU丁丁ON
=
&H1000000
Private Const MIXERC0NTR0L CT SC METER POLLED=
&HO&
Private Const MIXERC0NTR0L CT SC TIME MICR0SECS
=
&HO&
Private Const MIXERC0NTR0L CT SC TIME MILLISECS:
&H1 000000
Private Const MIXERC0NTR0L CT SC LIST SINGLE =
&HO&
Private Const MIXERC0NTROL CT SC LIST MULTIPLE=
&H1000000
Private Const MIXERC0NTR0L CT UNITS MASK =
&H FFO000
Private Const
MIXERCONTROL
—
CT
~
UNITS
—
CUSTOM =
&HO&
Private Const
MIXERC0NTR0L
—
CT
—
UNITS
—
BO0LEAN=
&H10000
Private Const MIXERCONTROL
—
CT
—
UNITSSIGNED =
&H20000
Private Const MIXERCONTROL
CTUNITS
—
—
—
UNSIGNED=
&H30000
Private Const
MIXERC0NTR0L
—
CT
—
UNITS
—
DECIBELS:
&H40000
Private Const MlXERC0NTR0L CT UN丌。S PERCENT =
&H50000
MI×ERCONTRO L.dwControlTvpe
Private Const MIXERC0NTR0L C0NTROLTYPE CUST0M
=
(MIXERC0NTR0L CT CLASS CUSTOM Or MIXERCONT
R0L CT UNlTS CUST0M)
Private Const MIXERC0NTR0L C0NTR0L TYPE BOOLEAN
METER:(Mi×ERC0NTR0L CT CLASS METER 0r MI×ER
C0NTR0L CT SC METER P0LLED
Or MI×ERC0NTR0L CT UNITS B00LEAN)
Private Const MfXERCONTR0L CONTROLTYPE SIGNEDM
ETER:(MIXERC0NTR0L CT CLASS METER 0r MlXER
C0NTR0L CT SC METER P0LLED
Or Mf×ERCONTROL CT UNITS S JGNED)
Private Const MI×ERC0NTR0L C0NTROLTYPE PEAKMET
ER:(MlXERC0NTROL C0NTROLTYPE SIGNEDMETER 4-
1)
Private Const MIXERC0NTR0L C0NTR0LTYPE UNSIGN
EDMETER=(MIXERC0NTROL CT CL_ASS METER
Or MIXERC0NTR0L CT SC METER P0LLED
Or MI×ERCONTROL CT UNlTS UNSIGNED)
28_ 譬鞋
Private Const MIXERC0NTROL CONTR0LTYPE BOoLEAN
=
(MI×ERC0NTR0L CT CLASS SWITCH 0r MIXER
C0NTR0L CT SC SWITCH BOOLEAN
Or MlXERCONTROL CT UNITS BOOLEAN)
Private Const MIXERC0NTR0L C0NTRO r PE ON0FF:
《MIXERC0NTROL C0NTROLTYPE BOOLEAN+1)
Private Const MIXERC0NTROL C0NTROLTYPE MUTE:
(MI×ERC0NTROL C0NTR0LTYPE BOOLEAN+2)
Private Const MIXERC0NTR0L C0NTR:0LTYPE M0NO=
(MlXERC0NTR0L C0NTR0L丁yPE BOOLEAN+3)
Private Const MlXERC0NTR0L C0NTR0LTYPE LOUD
NESS=(MIXERC0NTROL CONTROL丁YPE B00LEAN 4-4)
Private Const MIXERC0NTR0L C0NTROLTYPE STERE
0ENH=《MIXERC0NTROL C0NTROLTYPE BOOLEAN+5)
Private Const MIXERC0NTR0L C0NTR0L■、rPE BUTT0N=
(MI×ERC0NTR0L CT CLASS SWITCH 0r MI×ERCO
NTR0L CT SC SWITCH BUTT0N Or MIXERC0NTR0L
CT UNITS B00LEAN)
Private Const MIXERC0NTR0L C0NTR0L1rYPE DEClBELS
=
(MIXERC0NTR0L CT CLASS NUMBER 0r Ml×ERC0NTR
OL CT UNITS DEClBELS)
Private Const MlXERC0NTR0L C0NTR0LTYPE SIGNED:
《MI×ERCONTROL CT CLASS NUMBER 0r Ml×ERC0NTR0
L CT UNlTS SIGNED)
Private Const MI×ERC0NTR0L C0NTR0LTYPE UNSIGNED
=
(MlXERC0NTR0L CT CLASS NUMBER Or MIxERCONT
ROL CT UNITS UNSIGNED)
Private Const MI×ERC0NTR0L C0NTR0L1、rPE PERCENT
=
(MIXERCONTROL CT CLASS NUMBER Or MI×ERCON
TROL CT UNITS PERCENT)
Private Const MlXERC0NTR0L C0NTR0LTYPE SLIDER=
(Ml×ERC0NTROL CT CLASS SLIDER Or MIXERC0NTR0L
CT UNITS SIGNED)
Private Const MIXERC0NTROL CONTROLTYPE PAN =
(MIXERC0NTR0L C0NTR0LTYPE SLIDER 4-1)
Private Const MIXERC0NTR0L C0NTR0LTYPE QS0UND
PAN=(MIXERC0NTR0L C0NTROLTYPE SLlDER+2)
Private Const MfXERC0NTROL CONTROLTYPE FADER=
(MI×ERC0NTR0L CT CLASS FADER 0r MlXERC0NTR0L
CT UNITS UNSIGNED)
Private Const MI×ERCONTROL CONTROLTYPE VOLUME
:
(MIXERCONTROL CONTROL-1、rPE FADER+1)
Private Const MlXERC0NTR0L C0NTROLTYPE BASS=
fMfXERC0NTROL C0NTROLTYPE FADER+2)
Private Const MlXERC0NTR0L C0NTR0LTYPE TREBLE=
(MIXERC0NTR0L C0NTR0L下YPE FADER+3)
Private Const MIXERCONTROL CONTROLTYPE EQU
ALIZER=(MI×ERC0NTR0L C0NTR0L1 PE FADER 4-4)
Private Const MIXERC0NTROL C0NTROLTYPE SlNGLESE
LECT=(MIXERC0NTROL CT CLASS LIST 0r MlXERC0N
TROL CT SC LIST SI
_
NGLE Or
M XERC0NTR0L CT
I UNl
…
PB0BBA啊LANG帅GE……… - ……… … …………r 一 - -… …… …” … - ””… … ……
TS BOOLEAN)
Private Const MIXERC0NTR0LC0NTROLTYPE—MU× =
《MIXERCONTR0L—CONTR0L1 PE—SINGLESELECT+1)
Private Const MI×ERC0NTROLCONTROL PE—MULTIPLE
SELECT=(MIXERCONTROL—CT—CL.ASS—LIST Or MI×ERCO
NTROLCLSC—LIsT—MUL1IPLE Or MI×ERCONTROLC LU
NITS BOOLEAN)
Private Const MlXEROONrROL CONTROLTYPE MIXER=
(MlXERCONTROL CONTROL1、rPE MULTlPLESELECT+1)
Private Const MIXERO0NTROL C0NTROL PE MICROTI
ME=(MlXERCONTR0LCT—CLASS—TIME Or MIXERCON
TROL
—
CT
—
SC
—
丁IME
—
MICROSECS Or MIXERCONTROL
—
CT
—
UNITS .UNSIGNED )
Private Const MIXERCONTROL CONTROLTYPE MILLITIME
=(MIXERCONTROL CT CLASS TIME Or MIXERCONTRO
LCLSCJIME—MILUSECS Or MlxERCON丁ROLCT-UNI
TS UNSIGNED}
定义组合数据类型
Private TVOe MIX:ERCONTROLDETAIILS
cbStruct As Long
dwOontrollD As Long
cChannels As Long
item As Long
cbDetails As Long
paDetails As Long
End T ̄'pe
Private Type MIxERCONTROLDETAlLS
—
UNSlGNED
dwValue As Long
EndTy,pe
Private Tvpe MIXERCONTROL
cbStruct As Long
dwControllD As Long
dwControlType As Long
fdwContrdI As Long
cMultipleltems As Long
szShortName As String MIXER
—
SHORT_NAME—CHARS
szName As String MIXER
—
LONG
—
NAME
—
CHARS
lMinimum As LOng
IMaximum As Long
reserved(1 0)As Long
End Type
Private Tvpe MIXERUNECONTROLS
cbStruct As Long
dwLinelD As Long
dwC;ontrol As Long
cControls As Long
cbmxctrl As Long
pamxctd As Long
End Tvpe
Private Type MIXERLINE
cbStruct As Long
dwDestination As Long
dwSource As Long
dwUneID As Long
fdwUne As Long
dwUser As Long
dwComponentType As Long
cChannels As Long
cConnection ̄s As Long
cControls As Long
szShortName As String MIXER
—
SHORLNAME—CHARS
szName As String MIXER
—
LONG
—
NAME
—
CHARS
dwTypeAs Long
dwD ̄evicelD As Long
wMid As Integer
wPid As Integer
vDdverV ̄'ersion As Long
szPname As String MAXPNAIMELEN
End Type
‘定义类模块内的私有变量
Private VatMixerHandle As Long
Private VarMixerCOntrOISDeakers As MIXERCONTROL
Private VarMixerControlMicrophone As MIXERCONTROL
Private VarMixerError As Long
Private VarSpeakerVcolume As Long
Private VarSpeakerMaxVolume As Long
Private VarSpeakerlMinVolume As Long
Private VarSpeakerLeftVolume As Long
Private VarSpeakerRightVolume As Long
Private VarMicrophoneVolume As Long
Private VatMicrophonelMkaxVolume As Long
Private VarMicrophoneMinVolume As Long
‘定义类模块内的私有函数
Private Function GetDeviceVolume(ByVal VanMixerHandle As
Long,ByVaI VarComponentType As Long,ByVal VarControIT
ype As Long,ByRef VarMixerControl As MI×ERCONTROL)
As Boolean
On Error GoTo GetDeviceVcolumeError
Dim VarMemoryHandle As Long
Dim VarMixerUne As Ml×ERLINE
Dim VarMixer LineCOntrols As MIXERLlNECONTROLS
VarMixerUne.cbStruct=Len(VadMixerLine' ,)
VarMixerUnedwComponentTy,pe=VarComponentType
If mjxerGetLjneInfO I[VarMixerHandle. VarMixerUne
MIXERGETUNEINFOF
_
COMPONEN_n PE)=MMSYSER
R
—
NOERROR Then
Wqth WarMjxerLjneCOntrO}s
瓣垴螭 矗
J… |l IJl ’ “ 、
实用第一 智慧密集
.
cbStruct=Len(VarMixerLineControIs)
dwLinelD=VarMixerLine.dwLinelD
.
dwControI=VarCOntrOIType
.
cControls=1
.
cbmxctrI=Len(VarMixerContro1)
End With
VarMemoryHandle=GlobalAlloc(&H40.Len(VarMixer
Contro1))
VarMixerLineControls.pamxctrl=GlObalLOck《VarMem
oryHandle)
VarMixerContro1.cbStruct=Len(VarMixerContro1)
If mixerGetLineContro}s(VarMixerHandle,VarMixerLine
Controls, MIXER
—
GETLlNECONTROLSF_ONEBY丁 PE) =
MMSYSERR N0ERR0R Then
Call CopyStructFromPtr(VarMixerControl,
VarMixer
LineControls.pamxctrl,Len(VarMixerContro1))
GetDeviceVolume=True
Else
GetDeviceVolume=False
End If
Calj GlOba}FreefVarMemoryHandle)
Else
GetDeviceVolume:False
End If
Exit Function
GetDeviceVolumeError:
GetDeviceVolume=False
End Function
Private Function SetDeviceVolume(ByVa{VarMixerHandle As
Long,VarMixerControl As MIXERCONTROL,By'Val VarVolum
e As Long)As Boolean
On Error GoTo SetDeviceVolumeError
Dim VarMemoryHandle As Long
Djm VarMjxerCOntrOIDetaj Js As MIXERC0NTROLDE_『_AlLS
Dim VarMixerControIDetailsUnsigned As MIXERCONTR
OLDETAILS
—
UNSIGNED
With VatMixerControlDetails
.
item=0
.
dwControlID:VarMixerContro1.dwControllD
.
cbStruct=Len(VarMixerControlDetails)
.
cbDetails=Len(VarMixerControIDetailsUnsigned)
End With
VarMemoryHandle=GlobalAIIoc(&H40,Len(VarMixerCon
troIDetailsUnsigned))
VarMixerControlDetails.paDetails=GlobalLock(VarMem
30 。,菌齄20籀程12.醢13舀
与蛾
oryHandle)
VarMixerControlDetails.cChannels=1
VarMixerCOntrOIDeta;lsUnsigned.dwValue=VarVolume
Call CopyPtrFromStruct(VarMixerControlDetails.paDetails.
VarMixerControIDetailsUnsigned,Len(VarMixerControlDeta
ilsUnsigned))
If mixerSetControtDetails (VarMixerHandte.
VarMixerControlDetails,
MIXER
—
SETCONTROLDETAILSF
—
VALUE)=MMSYSERR—NO
ERR0R Then
SetDeviceVolume:True
Else
SetDeviceVolume:False
End If
Call GIobalFree(VarMemoryHandle)
Exit Function
SetDeviceVolumeError:
SetDeviceVolume=False
End Function
Public Function OpenMixer()As Boolean
On Error GoTo OpenMixerError
VatMixerError=mixerOpen(VarMixerHandle,0,0,0 0)
If VarMixerError;MMSYSERR NOERR0R Then
If GetDeviceVolume(VarMixerHandle,MIXERLINE—
COMP0NENTTYPE DST SPEAKERS.
MI×ERCONTROL C0NTR0L PE VOLUME.
VarMixerControlSpeakers1=True Then
VarSpeakerMaxVolume=VarMixerCOntrOISDeakers.
IMaximum
VarSpeakerMinVolume=VarMi×erContrOISDeakers.
IM mum
Else
VarSpeakerMaxVolume=:0
VarSpeakerMinVolume=0
End If
If GetDeviceVolume(VarMixerHandle,MIXERLINE—COM
PONENT’r、,PE—SRC
_
MlCROPHONE,
MIXERC0NTROL C0NTROLTYPE VOLUME.
VarMixerControlMicrophonel=True Then
VarMicrophoneMaxVolume=VarMixerControlMicrop
hone.}Maximum
VarMicrophoneMinVolume=VarMixerControlMicrop
hone.1Minimum
Else
VarMicrophoneMaxVolume=0
VarMicrophoneMinVolume=0
End If
。…
PROGRAM LANGUAGE ……*… …………m……… …… - 一…r … n…………… …… … n … …… … _… M}
OpenMixer=True End Property
Else
OpenMixer:False
End If
Exit Function
Public Property Let SpeakerRightVolume(ByVal VarVolume
As Long)
VarSpeakerRightVolume=VarVolume
Call waveOutSetVolume(O CLng( &H &Hex¥ arSpeaker
0penMixerError:
OpenMixer=False
RightVolume And&HFFFF&)&Hex¥(VarSpeakerLeftVolume
And&HFFFF&)))
End Property
End Function
‘定义类的属性和事件
Public Property Get MixerErr()As Long
MixerErr=VarMixerError
Public Property Get SpeakerRightVolume()As Long
Dim VarVolume As L0ng
End Propery t
Public Property Get SpeakerMinVolume0 As Long
SpeakerMinVolume=VarSpeakerMinVolume
End Property
lf wave0utGetVolume(0,VarVolume):MMSYSER
R NOERROR Then
VarSpeakerRightVolume=《(VaNolume And&HFFFF00
00)/&H 1 0000)And&HFFFF&
SpeakerRightVolume=VarSpeakerRightVolume
Else
VarSpeakerRightVolume=0
Public Property Get SpeakerMaxVolume()As Long
SpeakerMaxVolume:VarSpeakerMaxVolume
End Property
SpeakerRightVolume=VarSpeakerRightVolume
End lf
End PropertV
Public Property Let SpeakerVolume(ByVal VarVolume.As
L-ong}
VarSpeakerVolume=VarVolume
Public Property Get MicrophoneMinVolume()As Long
MicrophoneMinVolume VarMicrophoneMinVolume
End Property
Call SetDeviceVolume(VarMixerHandle,VarMixerContro}
Speakers,VarVolume)
End Property
Public Property Get MicrophoneMaxVolume()As Long
MicrophoneMaxVolume=VarMicrophoneMaxVolume
End Property
Public Property Get SpeakerVolume().As Long
SpeakerVolume=VarSpeakerVolume
End Property
PubliC Property Let MicrophoneVolume(ByVal VarVolume As
Longj
Public Property Let SpeakerLeftVolume(ByVal VarVolume As
Long}
VarSpeakerLeftVolume=VarVolume
VarMicrophoneVolume=VarVolume
Call SetDeviceVoLume(VarMixerHandle,VatMixerContro
IMicrophone,VarVolume)
Hex
End Property
Cal1 waveOutSetVolume l0. CLng { &H“ &
¥ {VarSpeakerRightVol ume And &HFFFF&】 &
¥(VarSpeakerLeftVolume And&HFFFF&)))
End PropertV
Hex
Public Property Get MicrophoneVolume()As Long
MicrophoneVolume=VarMicrophoneVolume
End Property
Public Property Get SpeakerLeftVolume()As Long
Dim Va ̄olume As Long
4 结语
对于面向对象的编程语言,在编程过程中,经历定义函
If wave0utGetVolume(0,VarVolume)=MMSYSERR—
N0ERROR Then
VarSpeakerLeftVolume=VarVolume And&HFFFF&
SpeakerLeftVolume=VarSpeakerLeftVolume
Else
VarSpeakerLeftVolume=0
SpeakerLeftVolume=VarSpeakerLeftVo}ume
数、定义模块到定义类模块的变化。类模块是面向对象编程语
言的灵魂所在.可以大大提高软件代码的可复用和可维护性。
(收稿日期:2012—02—05)
End lf
脑螭
版权声明:本文标题:利用API函数软件编程实现音频控制实例 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1714469072a681531.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论