Windows多媒体API -低阶(二)

1.1         WAVEOUTUNPREPAREHEADER

//声明:

waveOutUnprepareHeader(

   hWaveOut: HWAVEOUT;       {设备句柄}

   lpWaveOutHdr: PWaveHdr; {TWaveHdr 结构的指针}

   uSize: UINT                   {TWaveHdr 结构大小}

): MMRESULT;                     {成功返回 0; 可能的错误值见下:}

 

MMSYSERR_INVALHANDLE = 5;   {设备句柄无效}

MMSYSERR_HANDLEBUSY   = 12; {设备已被另一线程使用}

WAVERR_STILLPLAYING   = 33; {缓冲区还在队列中}

 

//TWaveHdr 是 wavehdr_tag 结构的重定义

wavehdr_tag = record

   lpData: PChar;               {指向波形数据缓冲区}

   dwBufferLength: DWORD;   {波形数据缓冲区的长度}

   dwBytesRecorded: DWORD; {若首部用于输入, 指出缓冲区中的数据量}

   dwUser: DWORD;               {指定用户的32位数据}

   dwFlags: DWORD;             {缓冲区标志}

   dwLoops: DWORD;             {循环播放次数, 仅用于输出缓冲区}

   lpNext: PWaveHdr;          {保留}

   reserved: DWORD;            {保留}

end;

 

//TWaveHdr 中的 dwFlags 的可选值:

WHDR_DONE         = $00000001; {设备已使用完缓冲区, 并返回给程序}

WHDR_PREPARED   = $00000002; {waveInPrepareHeader 或 waveOutPrepareHeader 已将缓冲区准备好}

WHDR_BEGINLOOP = $00000004; {缓冲区是循环中的第一个缓冲区, 仅用于输出}

WHDR_ENDLOOP    = $00000008; {缓冲区是循环中的最后一个缓冲区, 仅用于输出}

WHDR_INQUEUE    = $00000010; { reserved for driver }

提示:

设备使用完数据块后, 须调用此函数;

释放(GlobalFree)缓冲区前, 须调用此函数;

取消一个尚未准备的缓冲区将无效, 但函数返回 0

1.2         WAVEINGETNUMDEVS

waveInGetNumDevs:UINT;无参数;返回波形输入设备的数目。

1.3         WAVEINCAPSA

typedef struct tagWAVEINCAPSA {

      WORD      wMid;                             

      WORD      wPid;                             

      MMVERSION vDriverVersion;           

      CHAR      szPname[MAXPNAMELEN];     

      DWORD    dwFormats;                    

      WORD      wChannels;                    

      WORD      wReserved1;                    

} WAVEINCAPSA, *PWAVEINCAPSA, *NPWAVEINCAPSA, *LPWAVEINCAPSA;

1.4         WAVEINGETDEVCAPS

waveInGetDevCaps - 查询输入设备的性能

//声明:

waveInGetDevCaps(

   hwo: HWAVEOUT;          {输入设备ID; HWAVEIN ?}

   lpCaps: PWaveInCaps; {TWaveInCaps 结构的指针, 用于接受设备信息}

   uSize: UINT               {TWaveInCaps 结构大小}

): MMRESULT;                {成功返回 0; 可能的错误值见下:}

 

MMSYSERR_BADDEVICEID = 2; {设备ID超界}

MMSYSERR_NODRIVER      = 6; {没有安装驱动程序}

 

//TWaveInCaps 是 tagWAVEINCAPSA 结构的重定义:

tagWAVEINCAPSA = record

   wMid: Word;                                                    {制造商ID}

   wPid: Word;                                                    {产品ID}

   vDriverVersion: MMVERSION;                              {版本号; 高字节是主版本号, 低字节是次版本号}

   szPname: array[0..MAXPNAMELEN-1] of AnsiChar; {产品名称}

   dwFormats: DWORD;                                           {支持的格式}

   wChannels: Word;                                             {单声道(1)还是立体声(2)}

   wReserved1: Word;                                           { structure packing }

end;

 

//dwFormats:

WAVE_INVALIDFORMAT = $00000000; {invalid format}

WAVE_FORMAT_1M08    = $00000001; {11.025 kHz, Mono,    8-bit }

WAVE_FORMAT_1S08    = $00000002; {11.025 kHz, Stereo, 8-bit }

WAVE_FORMAT_1M16    = $00000004; {11.025 kHz, Mono,    16-bit}

WAVE_FORMAT_1S16    = $00000008; {11.025 kHz, Stereo, 16-bit}

WAVE_FORMAT_2M08    = $00000010; {22.05   kHz, Mono,    8-bit }

WAVE_FORMAT_2S08    = $00000020; {22.05   kHz, Stereo, 8-bit }

WAVE_FORMAT_2M16    = $00000040; {22.05   kHz, Mono,    16-bit}

WAVE_FORMAT_2S16    = $00000080; {22.05   kHz, Stereo, 16-bit}

WAVE_FORMAT_4M08    = $00000100; {44.1    kHz, Mono,    8-bit }

WAVE_FORMAT_4S08    = $00000200; {44.1    kHz, Stereo, 8-bit }

WAVE_FORMAT_4M16    = $00000400; {44.1    kHz, Mono,    16-bit}

WAVE_FORMAT_4S16    = $00000800; {44.1    kHz, Stereo, 16-bit}

1.5         WAVEINOPEN

waveInOpen是动态连接库winmm.dll之函数,用以开启波形输入设备。

waveInOpen之原形为︰

 

MMRESULT waveInOpen(

   LPHWAVEIN          phwi,       

   UINT_PTR          uDeviceID, 

   LPWAVEFORMATEX pwfx,        

   DWORD_PTR         dwCallback,

   DWORD_PTR         dwCallbackInstance,

   DWORD               fdwOpen     

   );

解述︰

LPHWAVEIN phwi 为一指针,以指示返回输入设备。

UINT_PTR uDeviceID 乃所用波形输入设备之ID。若此为 WAVE_MAPPER,系统则会自动寻找合适设备。

LPWAVEFORMATEX pwfx ,指向波形声音格式数据类型(WAVEFORMAT)之指针。

DWORD_PTR dwCallback 为指向回调函数的指针或窗口句柄,用于处理波形声音输入过程中产生的消息。

DWORD_PTR dwCallbackInstance为传递给回调函数的数据,以回调函数的参数方式传递。注意:若回调方式为窗口方式,该项不适用。

DWORD fdwOpen用于打开一些该函数中定义的选项,通常为0。

函数返回值:

若函数正常调用,返回值为0,其中可能的错误及返回值为︰

MMSYSERR_BADDEVICEID = 2; {设备ID超界};

MMSYSERR_ALLOCATED = 4; {指定的资源已被分配};

MMSYSERR_NODRIVER = 6; {没有安装驱动程序};

MMSYSERR_NOMEM = 7; {不能分配或锁定内存};

WAVERR_BADFORMAT = 32; {设备不支持请求的波形格式}

函数用法:

在一个标准的通过波形声音输入设备记录声音的程序中,函数应该按照以下顺序调用:获取波形声音输入设备,设置波形声音格式;waveInOpen,打开波形声音输入设备;waveInPrepareHeader,为波形声音输入设备准备一个缓冲区;waveInAddBuffer 向波形声音输入设备添加缓冲区;waveInStart 开始录音。

回调函数:

当指定函数回调方式为回调函数时,需定义回调函数,其原形为:

void CALLBACK waveInProc(

      HWAVEIN hwi,      //声音输入设备句柄

        UINT uMsg,         //产生的消息,由系统给出

        DWORD dwInstance,//在waveinopen中给出要传递给该函数的数据

        DWORD dwParam1, //附加数据1

        DWORD dwParam2   //附加数据2

);

注意事项:

该函数不能为动态生成的函数,所以一般情况下不能作为类的成员函数,但可以作为静态函数,此时可通过dwInstance传递类的地址。

可以处理的消息有:

WIM_OPEN 录音设备打开

WIM_CLOSE 录音设备关闭

WIM_DATA 数据缓存区被写满

当消息类型为WIM_DATA时,dwParam1中为指向被写满的header的首地址,此时可以读取写入的数据。

1.6         WAVEINSTOP

waveInStop - 停止输入

提示: 如果未启动则调用无效, 但也返回 0; 缓冲区会被返回, TWaveHdr 结构中的 dwBytesRecorded 将包含返回的实际数据的长度.

//声明:

waveInStop(

   hWaveIn: HWAVEIN {设备句柄}

): MMRESULT;          {成功返回 0; 可能的错误值见下:}

 

 

MMSYSERR_INVALHANDLE = 5;   {设备句柄无效}

MMSYSERR_HANDLEBUSY   = 12; {设备已被另一线程使用}

1.7         WAVEINCLOSE

waveInClose - 关闭指定的波形输入设备

提示: 若 waveInAddBuffer 送出的缓冲区未返回则失败; 可用 waveInReset 放弃所有未用完的缓冲区.

//声明:

waveInClose(

   hWaveIn: HWAVEIN {设备句柄; 函数若成功返回, 句柄则不再有效}

): MMRESULT;          {成功返回 0; 可能的错误值见下:}

 

MMSYSERR_INVALHANDLE = 5;   {设备句柄无效}

WAVERR_STILLPLAYING   = 33; {缓冲区还在队列中}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值