Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42114
  • 博文数量: 11
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 120
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-10 10:40
文章分类
文章存档

2010年(1)

2008年(1)

2007年(9)

我的朋友
最近访客

分类: WINDOWS

2007-07-20 08:54:15

关键在于这句话
    m_timerID = timeSetEvent(300, 100, TimerProcess, (DWORD)this, TIME_PERIODIC | TIME_CALLBACK_FUNCTION);
这句话的意思是,每过300ms调用一次TimerPorcess,100ms是延迟时间
我在TimerProcess中将DirectSound要播放的数据放入缓冲
所以
//     DWORD nRetBytes;
//     m_WaveFile.Read(m_lpAudioBuf, m_WFE.nSamplesPerSec * m_WFE.nBlockAlign, &nRetBytes);
这句话也必须在Lock中,否则m_lpAudioBuf将会有被覆盖的危险(也就是其中的数据还没有放入缓冲之前就被后来的数据覆盖了),开始我以为将
//     DWORD nRetBytes;
//     m_WaveFile.Read(m_lpAudioBuf, m_WFE.nSamplesPerSec * m_WFE.nBlockAlign,
放在
    HRESULT hr = WaitForMultipleObjects(2, m_pHEvent, FALSE, 0);
的后面应该会没事,结果我想错了
m_pHEvent为一个事件句柄数组,其中放了两个事件句柄,我是将DirectSound缓冲分成相等的两段,当一段缓冲播放完了就发一个对应的事件,可是在开始的时候第二段缓冲是一定会有事件发来的,所以m_lpAudioBuf还是有被覆盖的可能,对于DirectSound这个功能我还没有完全理解透彻,所以不是很清楚,但是有个这样的模糊的概念。
好了,我想这下可以给自己交个差了。
不过很多概念还是很模糊,先在这里留个记号
timeSetEvent:比较模糊的是最后一个参数
DirectSound:Primary Buffer和Second Sound Buffer、DirectSoundNotify事件机制
还有DirectSound还是刚刚入门很多东西还没接触到!



阅读(713) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~