Windows波形音频MMEAPI简介

Windows波形音频MMEAPI简介

使用MMEAPI时需要导入头文件:#include<mmeapi.h>

mmeapi.h文件的主要内容

mmeapi.h 文件是 Windows 多媒体 API 的一部分,主要用于处理波形音频(Waveform Audio)的输入和输出。以下是该文件的主要内容和功能:

  1. 错误返回值
    定义了一些波形音频操作的错误返回值,例如:
  • WAVERR_BADFORMAT:不支持的波形格式。
  • WAVERR_STILLPLAYING:仍有音频在播放。
    • WAVERR_UNPREPARED:音频头未准备好。
    • WAVERR_SYNC:设备是同步的。
  1. 数据类型

    定义了一些与波形音频相关的数据类型,例如:

    • HWAVE、HWAVEIN、HWAVEOUT:波形音频设备的句柄。

    • WAVECALLBACK:波形音频回调函数类型。

  2. 回调消息

    定义了一些波形音频设备的回调消息,例如:

    • WOM_OPEN、WOM_CLOSE、WOM_DONE:波形输出设备的回调消息。

    • WIM_OPEN、WIM_CLOSE、WIM_DATA:波形输入设备的回调消息。

  3. 设备 ID

    定义了波形设备映射器的设备 ID:

    • WAVE_MAPPER:用于波形设备映射器的设备 ID。

  4. 标志

    定义了一些用于 waveOutOpen 和 waveInOpen 函数的标志,例如:

    • WAVE_FORMAT_QUERY:查询格式。

    • WAVE_ALLOWSYNC:允许同步。

    • WAVE_MAPPED、WAVE_FORMAT_DIRECT 等。

  5. 数据块头

    定义了波形数据块头的结构体 WAVEHDR,包括以下字段:

    • lpData:指向数据缓冲区的指针。

    • dwBufferLength:数据缓冲区的长度。

    • dwBytesRecorded:仅用于输入。

    • dwUser:供客户端使用。

    • dwFlags:各种标志。

    • dwLoops:循环控制计数器。

    • lpNext、reserved:保留给驱动程序使用。

  6. 设备能力结构

    定义了波形输出设备和输入设备的能力结构体,例如:

    • WAVEOUTCAPS、WAVEINCAPS:描述设备的能力,包括制造商 ID、产品 ID、驱动程序版本、支持的格式、通道数等。

  7. 标志字段

    定义了一些用于 WAVEHDR 和设备能力结构体的标志字段,例如:

    WHDR_DONEWHDR_PREPAREDWHDR_BEGINLOOPWHDR_ENDLOOPWHDR_INQUEUE:用于 WAVEHDR 的标志。

    WAVECAPS_PITCHWAVECAPS_PLAYBACKRATEWAVECAPS_VOLUMEWAVECAPS_LRVOLUMEWAVECAPS_SYNCWAVECAPS_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 函数打开一个波形音频输入设备,你需要按照以下步骤进行操作:

  1. 定义波形音频格式:使用 WAVEFORMATEX 结构体定义音频格式。
  2. 调用 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 位深度的音频格式。
相关推荐
华清远见IT开放实验室4 小时前
【项目案例】物联网比较好的10+练手项目推荐,附项目文档/源码/视频
物联网·音视频
程序猿小D10 小时前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa
iummature12 小时前
ZLMediaKit Windows编译以及使用
windows
辰哥单片机设计13 小时前
门磁模块详解(防盗感应开关 STM32)
stm32·单片机·嵌入式硬件·传感器
yrx02030713 小时前
stm32 IIC总线busy解决方法
stm32·单片机·嵌入式硬件
YHPsophie15 小时前
ATGM331C-5T杭州中科微BDS/GNSS全星座定位授时模块应用领域
经验分享·笔记·单片机·信息与通信·交通物流
周伯通*15 小时前
Windows上,使用远程桌面连接Ubuntu
linux·windows·ubuntu
Archie_IT16 小时前
【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙SD卡)——文末资料下载
arm开发·stm32·单片机·嵌入式硬件
辰哥单片机设计16 小时前
1×4矩阵键盘详解(STM32)
stm32·单片机·嵌入式硬件·矩阵·传感器