• Jackie's blog


    介绍使用winmm.h进行音频流的获取

    首先需要包含以下引用对象

    #include <Windows.h>
    #include "mmsystem.h"
    #pragma comment(lib, "winmm.lib")

    音频的获取需要调用7个函数

    1. waveInGetNumDevs:返回系统中就绪的波形声音输入设备的数量

    UINT waveInGetNumDevs(VOID);

    2. waveInGetDevCaps:检查指定波形输入设备的特性

    MMRESULT waveInGetDevCaps( 
      UINT_PTR     uDeviceID,  
      LPWAVEINCAPS pwic,       
      UINT         cbwic       
    );
    //uDeviceID 音频输入设备标识,也可以为一个打开的音频输入设备的句柄.
    //    个人认为如果上一步获得了多个设备,可以用索引标识每一个设备.
    //    
    //pwic 对WAVEINCAPS结构体的一个指针,包含设备的音频特性.
    //
    //cbwic WAVEINCAPS结构体的大小,使用sizeof即可.
    //
    //MMRESULT 函数执行的结果
    //    MMSYSERR_NOERROR 表示执行成功
    //    MMSYSERR_BADDEVICEID 索引越界 
    //    MMSYSERR_NODRIVER 没有就绪的设备 
    //    MMSYSERR_NOMEM 不能分配或者锁定内存

     介绍WAVEINCAPS结构体的含义

    typedef struct { 
        WORD      wMid;                //音频设备制造商定义的驱动程序标识
        WORD      wPid;                //音频输入设备的产品标识
        MMVERSION vDriverVersion;        //驱动程序版本号
        TCHAR     szPname[MAXPNAMELEN];//制造商名称
        DWORD     dwFormats;            //支持的格式,参见MSDN
        WORD      wChannels;            //支持的声道数
        WORD      wReserved1;            //保留参数
    } WAVEINCAPS;

    3. waveInOpen:打开指定的音频输入设备,进行录音

    MMRESULT waveInOpen(
      LPHWAVEIN       phwi,                //接收打开的音频输入设备标识的HWAVEIN结构的指针
      UINT_PTR       uDeviceID,            //指定一个需要打开的设备标识.可以使用WAVE_MAPPER选择一个按指定录音格式录音的设备
      LPWAVEFORMATEX pwfx,                //一个所需的格式进行录音的WAVEFORMATEX结构的指针 
      DWORD_PTR      dwCallback,        //指向一个回调函数、事件句柄、窗口句柄、线程标识,对录音事件进行处理.
      DWORD_PTR      dwCallbackInstance, //传给回调机制的参数
      DWORD          fdwOpen            //打开设备的方法标识,指定回调的类型.参见CSDN
    );

    介绍WAVEFORMATEX结构体的含义

    typedef struct { 
        WORD  wFormatTag;        大专栏  Jackie's blog //波形声音的格式,单声道双声道使用WAVE_FORMAT_PCM.当包含在WAVEFORMATEXTENSIBLE结构中时,使用WAVE_FORMAT_EXTENSIBLE.
        WORD  nChannels;        //声道数量
        DWORD nSamplesPerSec;    //采样率.wFormatTag为WAVE_FORMAT_PCM时,有8.0kHz,11.025kHz,22.05kHz,和44.1kHz.
        DWORD nAvgBytesPerSec;    //每秒的采样字节数.通过nSamplesPerSec * nChannels * wBitsPerSample / 8计算
        WORD  nBlockAlign;        //每次采样的字节数.通过nChannels * wBitsPerSample / 8计算
        WORD  wBitsPerSample;    //采样位数.wFormatTag为WAVE_FORMAT_PCM时,为8或者16
        WORD  cbSize;            //wFormatTag为WAVE_FORMAT_PCM时,忽略此参数
    } WAVEFORMATEX;

    介绍dwCallback回调函数格式

    void CALLBACK waveInProc(
      HWAVEIN hwi,          //回调此函数的设备句柄
      UINT uMsg,            //波形声音输入信息,标识关闭(WIM_CLOSE)、缓冲区满(WIM_DATA)、打开(WIM_OPEN).
      DWORD_PTR dwInstance, //用户在waveInOpen指定的数据
      DWORD_PTR dwParam1,   //(LPWAVEHDR)dwParam1,用户指定的缓冲区
      DWORD_PTR dwParam2     
    );

    4. waveInPrepareHeader:为音频输入设备准备一个缓冲区

    MMRESULT waveInPrepareHeader(
      HWAVEIN hwi,    //音频输入设备句柄
      LPWAVEHDR pwh,//指向WAVEHDR结构的指针,标识准备的缓冲区
      UINT cbwh        //WAVEHDR结构的大小,使用sizeof即可
    );


    介绍WAVEHDR结构

    typedef struct wavehdr_tag { 
        LPSTR      lpData;          //指向波形格式的缓冲区
        DWORD      dwBufferLength;  //缓冲区的大小
        DWORD      dwBytesRecorded; //当前存储了多少数据
        DWORD_PTR  dwUser;          //用户数据
        DWORD      dwFlags;            //为缓冲区提供的信息,在waveInPrepareHeader函数中使用WHDR_PREPARED
        DWORD      dwLoops;         //输出时使用,标识播放次数
        struct wavehdr_tag * lpNext;//reserved
        DWORD_PTR reserved;         //reserved
    } WAVEHDR, *LPWAVEHDR; 

    5. waveInAddBuffer:将缓冲区发送给设备,若缓冲区填满,则不起作用。(参数同上)

    MMRESULT waveInAddBuffer(
      HWAVEIN hwi, 
      LPWAVEHDR pwh, 
      UINT cbwh 
    ); 

    6. waveInStart:开始进行录制

    MMRESULT waveInStart(
      HWAVEIN hwi  //设备句柄
    );

    7. waveInClose:关闭设备

    MRESULT waveInClose(
      HWAVEIN hwi  //设备句柄
    );

     如下示例:

    http://download.csdn.net/detail/long7782/7771019

  • 相关阅读:
    [翻译] 编写高性能 .NET 代码--第五章 通用编码与对象设计 -- 类 vs 结构体
    [翻译] 编写高性能 .NET 代码--第二章 GC -- 配置选项
    [翻译]编写高性能 .NET 代码 第二章:垃圾回收 基本操作
    [翻译]编写高性能 .NET 代码 第二章:垃圾回收
    [翻译]编写高性能 .NET 代码 第一章:工具介绍 -- Visual Studio
    [翻译]编写高性能 .NET 代码 第一章:工具介绍 -- Performance Counters(性能计数器)
    [翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 平均值 vs 百分比
    [翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 选择什么来衡量
    NGUI锚定系统:UIAnchorUIRect
    NGUI Panel裁剪、层级实现原理
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12302260.html
Copyright © 2020-2023  润新知