赞
踩
Windows API提供了Winmm
(Windows多媒体)库,其中包括了音频设备相关的函数,可以用来实现音频设备的枚举和测试。
下面是一个简单的示例代码,演示了如何使用Winmm
库中的waveInGetNumDevs()
函数来枚举计算机上的音频输入设备数量,并使用waveInOpen()
函数打开其中一个设备并进行测试录音。
- #include <iostream>
- #include <Windows.h>
- #include <mmsystem.h>
-
- #pragma comment(lib, "winmm.lib")
-
- void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
- {
- // 实现录音回调函数
- }
-
- int main() {
- UINT numDevs = waveInGetNumDevs();
- std::cout << "Number of audio input devices: " << numDevs << std::endl;
-
- WAVEFORMATEX format;
- format.wFormatTag = WAVE_FORMAT_PCM;
- format.nChannels = 1;
- format.nSamplesPerSec = 44100;
- format.wBitsPerSample = 16;
- format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8;
- format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
-
- HWAVEIN hWaveIn;
- MMRESULT result = waveInOpen(&hWaveIn, WAVE_MAPPER, &format, (DWORD_PTR)waveInProc, NULL, CALLBACK_FUNCTION);
- if (result == MMSYSERR_NOERROR) {
- std::cout << "Audio input device opened successfully" << std::endl;
-
- // 开始录音
- result = waveInStart(hWaveIn);
- if (result == MMSYSERR_NOERROR) {
- std::cout << "Recording started" << std::endl;
- }
- else {
- std::cerr << "Failed to start recording" << std::endl;
- waveInClose(hWaveIn);
- return 1;
- }
-
- // 停止录音
- system("pause");
- waveInStop(hWaveIn);
- waveInReset(hWaveIn);
- waveInClose(hWaveIn);
- std::cout << "Recording stopped" << std::endl;
- }
- else {
- std::cerr << "Failed to open audio input device" << std::endl;
- return 1;
- }
-
- return 0;
- }

在这个例子中,waveInGetNumDevs()
函数返回了计算机上可用的音频输入设备数量。waveInOpen()
函数用于打开音频设备,其中参数WAVE_MAPPER
表示使用默认设备,&format
指向一个WAVEFORMATEX
结构体,描述了所需的音频格式,waveInProc
是一个回调函数,用于处理录音数据。然后,waveInStart()
函数开始录音,system("pause")
函数用于暂停程序,以等待用户手动停止录音。最后,waveInStop()
函数停止录音,waveInReset()
函数清除录音缓冲区,waveInClose()
函数关闭音频设备。
waveInProc
是一个回调函数,用于处理录音数据,这个回调函数有五个参数,它们的含义如下:
HWAVEIN hwi
:表示音频设备的句柄,即与音频设备建立的连接。UINT uMsg
:表示回调函数的消息类型,可以是以下值之一:
WIM_OPEN
:当音频设备已经打开并准备好录音时,发送此消息。WIM_DATA
:当音频设备已经采集到音频数据时,发送此消息。WIM_CLOSE
:当音频设备已经关闭时,发送此消息。DWORD_PTR dwInstance
:一个应用程序定义的32位数值,它在打开音频设备时指定,用于传递应用程序特定的信息。DWORD_PTR dwParam1
:当uMsg
为WIM_OPEN
或WIM_CLOSE
时,此参数为0。当uMsg
为WIM_DATA
时,此参数是一个指向WAVEHDR
结构体的指针,表示音频数据的头信息。DWORD_PTR dwParam2
:当uMsg
为WIM_OPEN
或WIM_CLOSE
时,此参数为0。当uMsg
为WIM_DATA
时,此参数为一个DWORD
值,表示已经采集到的音频数据的字节数。需要注意的是,waveInProc
函数是在一个独立的线程中执行的,因此要注意线程安全。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。