WAVEHDR


/* wave data block header */
typedef struct wavehdr_tag {
    LPSTR       lpData;                 /* pointer to locked data buffer */
    DWORD       dwBufferLength;         /* length of data buffer */
    DWORD       dwBytesRecorded;        /* used for input only */
    DWORD       dwUser;                 /* for client's use */
    DWORD       dwFlags;                /* assorted flags (see defines) */
    DWORD       dwLoops;                /* loop control counter */
    struct wavehdr_tag FAR *lpNext;     /* reserved for driver */
    DWORD       reserved;               /* reserved for driver */
} WAVEHDR, *PWAVEHDR, NEAR *NPWAVEHDR, FAR *LPWAVEHDR;

WAVEHDR - 加菲 - 视频会议 - 加菲

 
 
 

音频数据块缓存结构WAVEHDR
其声明如下:
type struct{
LPSTR lpData;  /* 指向锁定的数据缓冲区的指针 */

DWORD dwBufferLength;  /* 数据缓冲区的大小 */

DWORD dwBytesRecorded;  /* 录音时指明缓冲区中的数据量 */

DWORD dwUser;  /* 用户数据 */

DWORD dwFlag;  /* 提供缓冲区信息的标志 */

DWORD dwLoops;  /* 循环播放的次数 */

struct wavehdr_tag *lpNext;     /* 保留 */

DWORD reserved;  /* 保留 */

} WAVEHDR;


 
  

/* flags for dwFlags field of WAVEHDR */
#define WHDR_DONE 0x00000001 /* done bit */
#define WHDR_PREPARED 0x00000002 /* set if this header has been prepared */
#define WHDR_BEGINLOOP 0x00000004 /* loop start block */
#define WHDR_ENDLOOP 0x00000008 /* loop end block */
#define WHDR_INQUEUE 0x00000010 /* reserved for driver */ 0001 0000 :16


依次是:1,2,4,8,16

0000 0001

0000 0010

0000 0100

0000 1000

0001 0000

记的以前经常有这样的定义,这样定义有个好处,可以按位或运算,但是定义时值不能连续,否则就不能按位或了,不过这儿好像用不到.


搜到的一个英文解释,说是MSDN上的,用谷歌翻译了一下:

dwFlags中提供缓冲区信息的标志。定义以下值:

WHDR_DONE
由设备驱动程序设置,以表明它是完成与缓冲区和返回到应用程序。
WHDR_PREPARED
由Windows设置表明,在缓冲区已准备waveInPrepareHeader或waveOutPrepareHeader功能。
WHDR_BEGINLOOP
这个缓冲区是在第一个循环缓冲区。这个标志仅用于输出缓冲器。
WHDR_ENDLOOP
这个缓冲区是在一个循环中的最后一个缓冲区。这个标志仅用于输出缓冲器。
WHDR_INQUEUE
由Windows设置为显示缓冲区排队播放。


dwFlags:

MSDN上的,投递的时候设定为WHDR_PREPARED。

播放完成这个标志会被系统设定为WHDR_DONE


英文原文:

dwFlags
Flags supplying information about the buffer. The following values are defined:
WHDR_BEGINLOOP
This buffer is the first buffer in a loop. This flag is used only with output buffers.
WHDR_DONE
Set by the device driver to indicate that it is finished with the buffer and is returning it to the application. 

被设备驱动程序设置,用来标识它是完成的(缓冲区)并且正在返回它到应用程序
WHDR_ENDLOOP
This buffer is the last buffer in a loop. This flag is used only with output buffers. 

这个缓冲区是最后一个缓冲区(在一个循环中).这个标志只被用在输出缓冲区中.
WHDR_INQUEUE
Set by Windows to indicate that the buffer is queued for playback. 

被Windows标识,这个缓冲被加到回放队列.
WHDR_PREPARED
Set by Windows to indicate that the buffer has been prepared with the waveInPrepareHeader or waveOutPrepareHeader function. 

被Windows用来标识,这个缓冲已经准备好,用waveInPrepareHeader 和 waveOutPrepareHeader 


在录音时,LRESULT CAudioCtrl::OnMM_WIM_DATA (WPARAM wParam, LPARAM lParam)中捕获了一些输出,截个图:
WAVEHDR - 加菲 - 视频会议 - 加菲
 
 其中dwFlags出现了三种值,分别为0、2、3,但是前面没有提到3。
dwBufferLength = 4096 = 1024 * 4

在播放WAVE文件时,在LRESULT CAudioCtrl::OnMM_WOM_DONE (WPARAM wParam, LPARAM lParam)函数中:

WAVEHDR - 加菲 - 视频会议 - 加菲
 
可以看到在播放时,dwUser从0、1、2、3、4、5、6、7都有,共8个值。
dwBufferLength = 4096
dwBytesRecorded = 4096
dwFlags = 3
dwLoops = 0

在另一个函数中,用同样的语句进行测试:
WAVEHDR - 加菲 - 视频会议 - 加菲

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值