给自己看的^_^
1.为了保证实时性,给输入设备的单个缓冲块不能太大,最好用1K(相当于延时10多ms),然后多准备几个这样的数据块(一般20个).
2.最好是把WAVEHDR和数据定义在一起,方便传输控制.
SNDDATABLOCK struct
header WAVEHDR <?>
wavedata db 1024 dup(?)
SNDDATABLOCK ends
3.处理录音数据块用回调函数方法是很好的选择.虽然MSDN上很是强调,不要在回调里调用系统函数,除了它列的那几个函数,否则会造成死锁.但是只要仔细地想想,死锁也只会发生在声卡方面,总不可能说录个音,还会造成两个程序因为抢占打印机造成死锁的吧.这里面最容易造成的是数据块上的死锁.所以最好是把这次产生的数据块复制出去,然后再把它再次作为录音用的缓冲.而复制出去的数据,我们可以任意使用.
4.如果采用第2点说那种方法,显然是很好的,但是要注意,如果把数据复制出来后,这个结构体里header的lpData是没有改变的,它还是以前的那个内存地址,应该让它变成新地址.不然复制也没有意义.
mov esi,buffer
mov edi,buffer
add edi,sizeof WAVEHDR
assume esi:ptr SNDDATABLOCK
mov [esi].header.lpData,edi
5.采用UDP传输数据,接收方收到数据后更要注意第四点!!!!
6.接收方处理数据是比较简单的,就是把这个音频数据播放出来就OK了.采用waveOutWrite函数,但之前必须用waveOutPrepareHeader函数准备文件头,当然,这个已在数据包中,很简单,只不过非常要注意的地方就是准备之前,要记得将header里的一些内容设成0,不然会出错.
mov [esi].header.dwLoops,0
mov [esi].header.dwFlags,0
mov [esi].header.lpNext,0
mov [esi].header.Reserved,0
mov [esi].header.dwUser,0