语音聊天软件完成心得.

给自己看的^_^
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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值