关键在于这句话
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) |