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: 

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.

+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 

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 

脑螭 


本文标签: 使用 函数 编程 音频 控制