Windows多媒体API -低阶(二)

来源:互联网 发布:知柏地黄丸怎么服用 编辑:程序博客网 时间:2024/04/29 15:39
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
原创粉丝点击