DirectSound 多事件通知发生混乱的问题

hdq123 2010-06-07 12:28:28
[ 问题点数100分]
大家好,有做过 DirectSound采集和播放的高手请进来指点下,[ 问题点数100分]

最近在做 语音通信程序,语音的采集和通信用 微软 DirectX组件中的 DirectSound来实现采集和播放,基本功能已经实现了,能够采到声音,也能播放声音。编程顺序都是按照 微软的DirectX的 API 说明文档来写的。

现在遇到一个比较困惑的问题,采集和播放部分用多事件通知机制的时候,底层的事件执行经常出现乱序,也就是用WaitForMultipleObjects等待通知事件有异常。

//采集部分
dwCapResult=WaitForMultipleObjects(NUM_REC_NOTIFICATIONS,m_aCapNotifyEventArray,FALSE,1000)-WAIT_OBJECT_0;
这一句代码中 NUM_REC_NOTIFICATIONS 是采集通知事件的个数,设定的是 16个,m_aCapNotifyEventArray是采集通知事件数组,通知位置已经设定好了。按DirectSound 的编程API说明,通知设定为 16时,dwResult 应该是按顺序返回 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;并如此反复循环。 我的程序执行的时候 发生混乱,有时还会有事件丢失,不是按上面的规律循环返回事件的。

//播放部分
dwPlayResult=WaitForMultipleObjects(NUM_PLAY_NOTIFICATIONS,m_aPlayNotifyEventArray,FALSE,1000)-WAIT_OBJECT_0;
NUM_PLAY_NOTIFICATIONS 是播放通知事件的个数,设定为 4个,m_aPlayNotifyEventArray为播放通知事件数组,正常执行的话,dwPlayResult 应该是按顺序 0,1,2,3;如此反复循环。 播放事件现在也是发生混乱,程序执行到一会又会出现 0,1,2,0,3,1,2,3。


采集和播放通知混乱,导致播放一直出现断断续续,不连惯的现像。多事件通知机制是 DirectSound 的一个 bug ,我们上层有什么机制可以解决这个 bug吗?现在没有思路解决这个问题,请有做过的同仁指点一下,提供点思路。

自己先顶上去..............

...全文
398 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
99263 2010-07-14
  • 打赏
  • 举报
回复
恩,也希望楼主把经验和大家一起分享,-:)
hdq123 2010-07-13
  • 打赏
  • 举报
回复
谢谢大家的关注,经过一段时间的努力,问题有一些小突破,不过还存在一些问题,希望有经验的开发者一起来讨论,共同学习,大家一起进步。
99263 2010-07-09
  • 打赏
  • 举报
回复
的确,memcpy也会占用较多的CPU时间。
softwarehe 2010-07-09
  • 打赏
  • 举报
回复
我是前面播放多路卡的那个,经过一段时间努力,我的问题终于解决了,现在多路播放很连续了。缓冲区是20ms。

做的过程中发现语音的要求太严格了,我的程序中是加了编解码的,卡的原因就是解码时两路都在一个线程解的,另外还发现过memcpy多一次都会引起卡的情况。
所以我的经验是一定要把每一个地方都做到很高效,否则一点点小地方就可以致命
99263 2010-07-03
  • 打赏
  • 举报
回复
是的,10ms缓冲区肯定小了。
hdq123 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 softwarehe 的回复:]

这个问题解决没,我也遇到这个问题了,不过我的是多路混音时才出问题,不知道楼主的是不是多路语音?
[/Quote]

我的只是单路混音出现的情况,有机会交流一下,my QQ:403174794

lvyinghong 2010-07-02
  • 打赏
  • 举报
回复
10ms这个缓冲区,太小了,没必要,你代码处理不过来的吧,影响性能而已。文档里面好像有说的。
设置大一点试试吧,30ms都算小了的。
99263 2010-06-29
  • 打赏
  • 举报
回复
呵呵,关注的人还挺多的。
softwarehe 2010-06-29
  • 打赏
  • 举报
回复
这个问题解决没,我也遇到这个问题了,不过我的是多路混音时才出问题,不知道楼主的是不是多路语音?
hdq123 2010-06-27
  • 打赏
  • 举报
回复
一个FIFO把待播放的声音数据缓冲一下,然后在event到达后写入buffer,这个 FIFO 我用了哦,加了个 JitterBuffer
99263 2010-06-26
  • 打赏
  • 举报
回复
需要用一个FIFO把待播放的声音数据缓冲一下,然后在event到达后写入buffer,你参考这个软件:[URL=http://www.anychat.cn/faq/]http://www.anychat.cn/faq/[/URL]
hdq123 2010-06-20
  • 打赏
  • 举报
回复
大家顶起来,一起为解决这个问题提建议,谢谢
hdq123 2010-06-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 oversense 的回复:]

你好,你说的指针间距是否指?是指采集通知的大小和播放通知的大小吗?




把线程优先级设成 realtime? 没有这个选项啊,是不是指 THREAD_PRIORITY_TIME_CRITICAL?




最重要的是 每次填充的时候,得到一下实际的指针位置.
[/Quote]



有没有方法处理 DirectSound 抛上来的通知事件, 用 WaitForMultipleObjects 等事件时不出现乱序的方法呢??
Oversense 2010-06-13
  • 打赏
  • 举报
回复
你好,你说的指针间距是否指?是指采集通知的大小和播放通知的大小吗?




把线程优先级设成 realtime? 没有这个选项啊,是不是指 THREAD_PRIORITY_TIME_CRITICAL?




最重要的是 每次填充的时候,得到一下实际的指针位置.
hdq123 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 oversense 的回复:]

呵呵,你的问题,我大概10年前就遇到过了

产生原因为,Event处理不及时,最后一个覆盖前面的了.

处理的方法为,每次填充的时候,得到一下实际的指针位置.

更进一步的建议为,1.把指针间距设大 2.把线程优先级设成realtime 3.用软混音
[/Quote]你好,你说的指针间距是否指?是指采集通知的大小和播放通知的大小吗? 把线程优先级设成 realtime? 没有这个选项啊,是不是指 THREAD_PRIORITY_TIME_CRITICAL? 软件混音我已经强制开启了,谢谢回复,盼解答.
nodiebirdcomeback 2010-06-10
  • 打赏
  • 举报
回复
如果是单声音没必要使用那么个事件对象的,只用一个就够了
nodiebirdcomeback 2010-06-10
  • 打赏
  • 举报
回复
把缓冲区做大点,另外通知接点的步长也设置长点
Oversense 2010-06-09
  • 打赏
  • 举报
回复
呵呵,你的问题,我大概10年前就遇到过了

产生原因为,Event处理不及时,最后一个覆盖前面的了.

处理的方法为,每次填充的时候,得到一下实际的指针位置.

更进一步的建议为,1.把指针间距设大 2.把线程优先级设成realtime 3.用软混音
小时了了 2010-06-09
  • 打赏
  • 举报
回复
有可能,试试把事件处理中的代码先去掉,只打印出时间的序号看是不是乱的。
hdq123 2010-06-08
  • 打赏
  • 举报
回复
谢谢上面兄台的回复。Software 缓冲模式我在 创建采集和播放缓冲区时我强制开启了。我的音频处理时间是 10ms一帧这个不算太长吧。根据录音和放音的情况来看,采集和播放的声音都不会出现严重的破音,采集缓冲区上的采集指针 dwCurrentCapPos,播放缓冲区上的 播放指针 dwCurrentPlayCursor 应该是匀速向前移动的,可以推断DirectSound抛给 上层的采集和播放事件应该是 顺序出现的,会不会是上层处理通知事件不及时造成事件堆积混乱
加载更多回复(4)

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧