通过计算机系统内置的声卡进行声音的采集,将麦克风等输入设备产生的模拟信号转换成计算机系统能够识别的数字信号,这个过程就是录音。而将计算机中的数字信号经由声卡转换为模拟信号向音箱等输出设备进行声音播放的过程就是回放。
在
Windows
中,系统分别给我们提供了三种接口,用以根据不同的需求来实现对音频硬件设备的访问:
1
、多媒体设备控制接口
(
高级音频
API/MCI API)
2
、波形音频接口
(
低级音频
API/WaveX API)
3
、
DirectSound(
基于
COM
的对象组件,
Windows
中将硬件能力发挥极致的接口
)
DirectSound
具备优秀的硬件加速能力,能充分发挥硬件设备的数据处理功能,但其实现相对困难,要求编程人员具备使用
COM
组件对象的知识,所以对于一般应用的需求,
WaveX API
是一种比较折衷的选择,它比
DirectSound
实现相对比较简单,比
MCI
则运用更加灵活,
WaveX API
提供了更低层的功能,能直接对设备的音频数据进行操作。
下面我们使用
WaveX API
来编写一个录音程序,用以演示
WaveX API
对音频设备进行访问的一般过程。
我们的程序包括最基本的两个功能:录音与回放。
首先是使用
WaveX API
进行录音的调用步骤:
waveInOpen
|_________________WM_WIM_OPEN
waveInPrepareHeader
|
waveInAddBuffer
|
waveInStart
|
录音缓冲区满__________WM_WIM_DATA
|
waveInReset
|
waveInClose
|_________________WM_WIM_CLOSE
Private Declare Function waveInOpen Lib "winmm" ( _
phwi As Long, _
ByVal uDeviceID As Long, _
pwfx As Any, _
ByVal dwCallback As Long, _
ByVal dwCallbackInstance As Long, _
ByVal fdwOpen As Long _
) As Long
Phwi
为该函数调用成功后返回的音频输入设备句柄,uDeviceID设置为要打开的音频输入设备的ID,当系统中存在不止一个音频输入设备时,系统用1,2,3..这样的ID来标识设备。你也可以直接设置为WAVE_MAPPER让系统自动选择一个默认的音频输入设备。Pwfx为一个WAVEHDR波形音频头结构,WAVEHDR结构里包含一些波形音频格式信息。dwCallback的意义由fdwOpen的值决定。WaveX API提供了几种通知应用程序消息的方法。fdwOpen的值有CALLBACK_FUNCTION、CALL_BACKTHREAD、CALLBACK_WINDOW,分别为回调函数方式,线程方式,窗口消息方式。dwCallback的值也分别可以设置为回调函数地址,线程函数地址和窗口句柄。当dwCallbackInstance为传递给相应的回调函数或线程函数的参数,其值的意义由用户自己指定,窗口消息下该值不可用。