Windows波形音频MMEAPI简介
使用MMEAPI时需要导入头文件:#include<mmeapi.h>
mmeapi.h文件的主要内容
mmeapi.h
文件是 Windows 多媒体 API 的一部分,主要用于处理波形音频(Waveform Audio)的输入和输出。以下是该文件的主要内容和功能:
- 错误返回值
定义了一些波形音频操作的错误返回值,例如:
- WAVERR_BADFORMAT:不支持的波形格式。
- WAVERR_STILLPLAYING:仍有音频在播放。
• WAVERR_UNPREPARED:音频头未准备好。
• WAVERR_SYNC:设备是同步的。
-
数据类型
定义了一些与波形音频相关的数据类型,例如:
• HWAVE、HWAVEIN、HWAVEOUT:波形音频设备的句柄。
• WAVECALLBACK:波形音频回调函数类型。
-
回调消息
定义了一些波形音频设备的回调消息,例如:
• WOM_OPEN、WOM_CLOSE、WOM_DONE:波形输出设备的回调消息。
• WIM_OPEN、WIM_CLOSE、WIM_DATA:波形输入设备的回调消息。
-
设备 ID
定义了波形设备映射器的设备 ID:
• WAVE_MAPPER:用于波形设备映射器的设备 ID。
-
标志
定义了一些用于 waveOutOpen 和 waveInOpen 函数的标志,例如:
• WAVE_FORMAT_QUERY:查询格式。
• WAVE_ALLOWSYNC:允许同步。
• WAVE_MAPPED、WAVE_FORMAT_DIRECT 等。
-
数据块头
定义了波形数据块头的结构体 WAVEHDR,包括以下字段:
• lpData:指向数据缓冲区的指针。
• dwBufferLength:数据缓冲区的长度。
• dwBytesRecorded:仅用于输入。
• dwUser:供客户端使用。
• dwFlags:各种标志。
• dwLoops:循环控制计数器。
• lpNext、reserved:保留给驱动程序使用。
-
设备能力结构
定义了波形输出设备和输入设备的能力结构体,例如:
• WAVEOUTCAPS、WAVEINCAPS:描述设备的能力,包括制造商 ID、产品 ID、驱动程序版本、支持的格式、通道数等。
-
标志字段
定义了一些用于 WAVEHDR 和设备能力结构体的标志字段,例如:
•
WHDR_DONE
、WHDR_PREPARED
、WHDR_BEGINLOOP
、WHDR_ENDLOOP
、WHDR_INQUEUE
:用于 WAVEHDR 的标志。•
WAVECAPS_PITCH
、WAVECAPS_PLAYBACKRATE
、WAVECAPS_VOLUME
、WAVECAPS_LRVOLUME
、WAVECAPS_SYNC
、WAVECAPS_SAMPLEACCURATE
:用于设备能力结构体的标志。
使用 waveOutOpen
函数打开一个波形音频输出设备
以下是一个简单的示例,展示如何使用 waveOutOpen
函数打开一个波形音频输出设备:
cpp
#include <windows.h>
#include <mmeapi.h>
void OpenWaveOutDevice() {
HWAVEOUT hWaveOut;
WAVEFORMATEX wfx;
// 设置波形格式
wfx.nSamplesPerSec = 44100; // 采样率
wfx.wBitsPerSample = 16; // 每个样本的位数
wfx.nChannels = 2; // 通道数(立体声)
wfx.cbSize = 0; // 额外信息的大小
wfx.wFormatTag = WAVE_FORMAT_PCM; // PCM 格式
wfx.nBlockAlign = (wfx.wBitsPerSample * wfx.nChannels) / 8;
wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
// 打开波形音频输出设备
if (waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfx, 0, 0, CALLBACK_NULL) != MMSYSERR_NOERROR) {
// 处理错误
}
}
使用 waveInOpen 函数打开一个波形音频输入设备
要使用 waveInOpen 函数打开一个波形音频输入设备,你需要按照以下步骤进行操作:
- 定义波形音频格式:使用 WAVEFORMATEX 结构体定义音频格式。
- 调用 waveInOpen 函数:传递设备句柄、设备 ID、音频格式、回调函数等参数。
以下是一个示例,展示如何使用 waveInOpen 函数打开一个波形音频输入设备:
cpp
#include <windows.h>
#include <mmeapi.h>
#include <iostream>
// 回调函数,用于处理音频输入事件
void CALLBACK WaveInProc(
HWAVEIN hwi,
UINT uMsg,
DWORD_PTR dwInstance,
DWORD_PTR dwParam1,
DWORD_PTR dwParam2
) {
switch (uMsg) {
case WIM_OPEN:
std::cout << "Wave input device opened." << std::endl;
break;
case WIM_CLOSE:
std::cout << "Wave input device closed." << std::endl;
break;
case WIM_DATA:
std::cout << "Wave input data received." << std::endl;
break;
}
}
int main() {
HWAVEIN hWaveIn;
WAVEFORMATEX wfx;
// 设置波形格式
wfx.nSamplesPerSec = 44100; // 采样率
wfx.wBitsPerSample = 16; // 每个样本的位数
wfx.nChannels = 2; // 通道数(立体声)
wfx.cbSize = 0; // 额外信息的大小
wfx.wFormatTag = WAVE_FORMAT_PCM; // PCM 格式
wfx.nBlockAlign = (wfx.wBitsPerSample * wfx.nChannels) / 8;
wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
// 打开波形音频输入设备
MMRESULT result = waveInOpen(&hWaveIn, WAVE_MAPPER, &wfx, (DWORD_PTR)WaveInProc, 0, CALLBACK_FUNCTION);
if (result != MMSYSERR_NOERROR) {
std::cerr << "Failed to open wave input device." << std::endl;
return 1;
}
std::cout << "Wave input device opened successfully." << std::endl;
// 关闭波形音频输入设备
waveInClose(hWaveIn);
return 0;
}
WAVE_FORMAT常量解析:
cpp
#define WAVE_FORMAT_1M08 0x00000001 /* 11.025 kHz, Mono, 8-bit */
#define WAVE_FORMAT_1S08 0x00000002 /* 11.025 kHz, Stereo, 8-bit */
#define WAVE_FORMAT_1M16 0x00000004 /* 11.025 kHz, Mono, 16-bit */
#define WAVE_FORMAT_1S16 0x00000008 /* 11.025 kHz, Stereo, 16-bit */
#define WAVE_FORMAT_2M08 0x00000010 /* 22.05 kHz, Mono, 8-bit */
#define WAVE_FORMAT_2S08 0x00000020 /* 22.05 kHz, Stereo, 8-bit */
#define WAVE_FORMAT_2M16 0x00000040 /* 22.05 kHz, Mono, 16-bit */
#define WAVE_FORMAT_2S16 0x00000080 /* 22.05 kHz, Stereo, 16-bit */
#define WAVE_FORMAT_4M08 0x00000100 /* 44.1 kHz, Mono, 8-bit */
#define WAVE_FORMAT_4S08 0x00000200 /* 44.1 kHz, Stereo, 8-bit */
#define WAVE_FORMAT_4M16 0x00000400 /* 44.1 kHz, Mono, 16-bit */
#define WAVE_FORMAT_4S16 0x00000800 /* 44.1 kHz, Stereo, 16-bit */
#define WAVE_FORMAT_44M08 0x00000100 /* 44.1 kHz, Mono, 8-bit */
#define WAVE_FORMAT_44S08 0x00000200 /* 44.1 kHz, Stereo, 8-bit */
#define WAVE_FORMAT_44M16 0x00000400 /* 44.1 kHz, Mono, 16-bit */
#define WAVE_FORMAT_44S16 0x00000800 /* 44.1 kHz, Stereo, 16-bit */
#define WAVE_FORMAT_48M08 0x00001000 /* 48 kHz, Mono, 8-bit */
#define WAVE_FORMAT_48S08 0x00002000 /* 48 kHz, Stereo, 8-bit */
#define WAVE_FORMAT_48M16 0x00004000 /* 48 kHz, Mono, 16-bit */
#define WAVE_FORMAT_48S16 0x00008000 /* 48 kHz, Stereo, 16-bit */
#define WAVE_FORMAT_96M08 0x00010000 /* 96 kHz, Mono, 8-bit */
#define WAVE_FORMAT_96S08 0x00020000 /* 96 kHz, Stereo, 8-bit */
#define WAVE_FORMAT_96M16 0x00040000 /* 96 kHz, Mono, 16-bit */
#define WAVE_FORMAT_96S16 0x00080000 /* 96 kHz, Stereo, 16-bit */
- WAVE_FORMAT_ 后跟采样率(如 1 表示 11.025 kHz,2 表示 22.05 kHz,4 表示 44.1 kHz,48 表示 48 kHz,96 表示 96 kHz)。
- M 表示单声道(Mono),S 表示立体声(Stereo)。
- 数字 08 表示 8 位深度,16 表示 16 位深度。
例如,WAVE_FORMAT_44S16 表示 44.1 kHz 采样率、立体声、16 位深度的音频格式。