如果我为录音准备了多缓冲:
 
for( i = 0; i < 10; i++ )
{//增加录音内存 if( MMSYSERR_NOERROR != waveInPrepareHeader( g_hWaveIn, &g_WaveHdrIn[i], sizeof(WAVEHDR)) )
{//无法锁定该内存
return FALSE;
} if( MMSYSERR_NOERROR != waveInAddBuffer( g_hWaveIn, &g_WaveHdrIn[i], sizeof(WAVEHDR)))
{//无法增加该内存
return FALSE;
}
}当我在WIM_DATA消息下处理数据时(使用的是CALLBACK_FUNCTION),而录音还在继续时,系统会自动使用下一个我为其准备的缓冲数据块吗?
如果是的话,那么我想问第二个问题,在我准备了我认为足够多的数据块缓冲的情况下,比如10个数据块,
当我正在WIM_DATA消息下处理数据时(如果够慢的话),下一个WIM_DATA消息来了,会出现什么情况?或者是,还是要等waveInProc退出了,才发送下一个WIM_DATA消息?
如果是的话,那么我想问第三个问题了,呵呵,见笑见笑,我喜欢钻牛角尖。会不会系统刷一下,把我提供的数据块都填满了,而我的第一个数据块的处理都没结束?(有这么快吗?)
请各位朋友帮忙解答一下,谢谢!

解决方案 »

  1.   

    第一个问题应该是这样的,当开始录音时,系统自作选择一个缓冲作为录音数据保存区,当该缓冲区满时将该缓冲区置满标志位,发送MM_WIM_DATA消息,将该缓冲区控制权归还给程序。同时自动启用下一个缓冲区录音,当我们处理完缓冲区数据时,应该再次调用waveInAddBuffer()将缓冲区还给系统,以循环利用第二个问题,应该会造成数据丢失的,因为以上必须满足条件:Time(saveData) < Time(下一个buffer填满)以前只是稍微接触过,没有真正实现过,了解不多,希望对LZ有用处
      

  2.   

    哦,我查了很多资料,明白了在使用waveInAddBuffer时是将缓冲加入了一个系统维护的队列中,由系统自己选择调用。如果所有我提供的缓冲都使用完了,也并未将缓冲再次提供给系统,而录音还在继续,那么数据就都丢失了。
    但是你回答我的第二个问题,意思是说如果我在前一个WIM_DATA消息下数据还没处理完,而下一个WIM_DATA消息又到来时,那么数据也将丢失吗?如果是这样,那这个waveIn系列函数还真是难以控制,尤其是用来做语音通话时,莫非我要用某种机制先将录音得到的数据先用另外一个缓存存下来,然后再在我开的发送线程里慢慢去发送么?
      

  3.   

    嗯,我知道是这样,我的问题不是问存不存,而是消息处理的问题。因为录音是一个连续不间断的过程,只要我不停止,那么录音就会继续下去,那么问题就是WIM_DATA消息是一直发,还是等你的waveInProc处理过程完毕了然后再继续发?
      

  4.   

    是等你的waveInProc处理过程完毕了然后再继续发,也就是saveData之后,再发送,不然会造成数据的丢失
      

  5.   

    非常感谢lsq19871207,你的回答对我很有帮助。
    现在一些问题都清楚了,关于WIM_DATA消息,lsq19871207你说系统会等我处理完了再给我发,所以这里就涉及到我自己的处理速度的问题了,我必须尽快处理数据,因为我不可能准备足够大的缓存数据块,而一般来说,我都是在处理WIM_DATA消息时才会将数据块重新分配给系统,那么如果WIM_DATA消息未返回,系统会自动把数据放入我为其准备的其他的数据块,但是录音是不间断的,数据块也会很快被全部填满,这个时候,由于某种原因,我连第一个WIM_DATA都没结束,就不会有数据块重新分配给系统,系统也就没地方放数据了,那么数据就丢失了。呵呵,lsq19871207,你说我这么说对吧?
    这让我感觉这个问题就像一个人想上厕所,但偏偏门口的大爷不让你进,因为所有的坑位都有人,那没办法,只好那个了,呵呵。
      

  6.   

    最后那个比喻真精辟!呵呵....
    想实现的话,到pudn上去下工程好好研究研究