waveInReset/waveOutReset死锁原因与解决方案

问题背景

 

录音播音实际需求

1、随时终止

2、录音并非文件,而是形成rtp发送

3、播音并非源于文件,而是源于rtp

 

因此Waveform audio使用的buffer较小,不断的装载/发送 buffer,终止的时候Reset并且close.

大致如下调用的循环

 

录音

waveInUnprepareHeader

waveInPrepareHeader

waveInAddBuffer

 

播音

waveOutUnprepareHeader

waveOutPrepareHeader

waveOutWrite

 

循环周期40ms,我采用的是回调函数。问题是有时候调用waveInReset/waveOutReset会形成死锁,调用waveInReset/waveOutReset的线程与回调函数所在的线程死锁在一块了。

 

原因分析

这方面网上有文章提到,就是调用waveInReset/waveOutReset的同时调用了录音/播音循环调用的某个函数会形成死锁。我再稍作解释下,我们知道buffer满了或是调用Reset都会触发消息(回调函数方式的话就是MM_WOM_DONE/MM_WIM_DATA),由于调用waveInReset/waveOutReset所在的线程,与回调函数所在的线程不是一个线程,因此很容易撞车,也就是说,你调用reset的时候,另一个线程正好在处理MM_WOM_DONE/MM_WIM_DATA,于是就这样死锁了。

 

解决方案

方案一

先加上标记(假设标记bReset:bool),令bReset为true;

 

标记作用如下

if(!bReset)

{

录音

waveInUnprepareHeader

waveInPrepareHeader

waveInAddBuffer

 

播音

waveOutUnprepareHeader

waveOutPrepareHeader

waveOutWrite

}

延时调用waveInReset/waveOutReset,延时时间长度以循环周期为妙,我这个例子中也就是采用40ms。

 

当然也可以采用临界保护。

方案二

换一个角度去考虑问题,之所以死锁,是因为两个线程冲突了的缘故,所以可以建立一个线程

录音

waveInUnprepareHeader

waveInPrepareHeader

waveInAddBuffer

 

播音

waveOutUnprepareHeader

waveOutPrepareHeader

waveOutWrite

 

与waveInReset/waveOutReset都放到这个线程去处理,自然不会发生死锁了。

时间: 2024-12-03 22:39:16

waveInReset/waveOutReset死锁原因与解决方案的相关文章

浅谈百度快照跳动和不更新的原因和解决方案

由于百度在中文搜索占据着霸主的地位,所以我们常常会针对百度做一系列的优化方案,一个资深的SEOR应该懂得,最重要的友情链接由之前的以PR来衡量是否门当户对做友链慢慢像由百度的快照日期和关键词排名来确定友情链接是否交换. 然而,让不少人不解的是,百度的快照经常莫名其妙的跳动和不更新,下面我来简单的讲讲快照跳动和不更新的原因和解决方案; 一.百度快照跳动最常见的现象是,快照今天出来为当天,第二天或后几天快照莫名其妙有回档到之前的,而且这种现象常常是循环出现.根据长期对各类网站的观察发现,出现这样的情

Oracle PRKC-1002错误原因和解决方案

小编在 VMware Server 1.0.8 中安装 Oracle RAC 时, 碰到到了 PRKC-1002 错误:WARNING: Error while copying directory /u01/oracle/product/10.2.0/db_1 with exclude file list 'null' to nodes 'rac2′. [PRKC-1002 : All the submitted commands did not execute successfully] 苦搜

win8系统直接发生蓝屏的几种原因及解决方案

  解决方法: 1.如果是QQ,请升级最新版的QQ2012,已经完美兼容WIN8 了(QQ2011 Bate3以上都兼容WIN8). 2.可能是安装错误导致,或优化软件错误,建议修复计算机试试. 3.系统内核的问题在用自带的升级程序更新到最新. 4.QQ2012不需要兼容模式,安装上就能用的,360chrome 问题比较多,暂时选择chrome吧,windows8是ie10 啊,360hold不住的. 5.一般是由于有问题的硬件(比如:内存)或某些软件引起的.有时超频也会产生这个错误. 解决方案

windows7进入桌面很久才能显示图标的原因和解决方案

  windows7进入桌面很久才能显示图标的原因和解决方案          解决方法: 1.按Win+R键,打开运行,输入regedit,点击确定; 2.在打开的注册表编辑器窗口中,展开至HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Explorer,在右侧查看是否有"Max Cached Icons"值,如果没有,则新建一个名为"Max Cached Icons"的字符串值; 3.双击

Win7操作系统已经连接网络但却无法上网的原因和解决方案

  Win7操作系统已经连接网络但却无法上网的原因和解决方案         具体步骤: 1.点击开始菜单,点击"运行" ; 2.在运行框中输入:cmd 点击确定打开"命令提示符"; 3.在命令提示符框中输入:netsh winsock reset 按下回车键; 4.等待提示重置成功,重启计算机即可解决. 上述教程内容就是Win7操作系统已经连接网络但却无法上网的原因和解决方案,通过命令提示符就可以轻松解决问题,重启电脑网络可以正常连接使用了.

win7异常关机的原因和解决方案

  虽然win7 64位旗舰版的功能非常强,而且用户体验也非常之好,但这并不意味着每一个系统都不会出现故障,所以在很多用户在使用的win7旗舰版一段时间之后总会遇到无法正常关机的状况.当系统出现无法关机状况的时候很多用户都会强制关机来解决这个问题,但是大家都知道强制关机对系统的伤害是非常之大的,那如果遇到兵器系统无法正常关机的情况要怎么处理呢?今天我们就来一起了解下win7旗舰版异常关机的原因和解决方案. 电脑中了病毒是导致win7旗舰版无法正常关机的一个重要因素,如果win7旗舰版遭遇到木马或

XP系统没有声音的几个原因及解决方案

虽然微软已经宣布停止对XP系统支持,不过XP系统的用户还是很多,据数据分析XP还拥有27%的用户数量,在XP用户数还如此庞大的情况下,针对XP故障进行解决还是很多XP用户及技主员需要学习的,我们来回顾一下在XP系统中出现没有声音的几个原因及解决方案 原因一.用户把音量调成了静音或者音量很低听不到. 解决方案:查看系统音量 取消静音,调高音量. 原因二.声卡驱动安装不对,表现为没有小喇叭音量调节图标且没声音 解决方案:进入设备管理器查看音频设备驱动是否正常,如有未知设备.或音频设备有黄色感叹号标志

eclipse+hadoop上出现了下面这个错误,请教问题原因,解决方案

问题描述 eclipse+hadoop上出现了下面这个错误,请教问题原因,解决方案 我在eclipse+hadoop上出现了下面这个错误,可以帮我看一下是什么原因,怎么解决吗? 解决方案 自己来顶一下,刚刚接触这个不太会,求大神指导,越详细越好 解决方案二: 没找到类,看看引进的包里有没有这个类

我的WCF之旅(6):在Winform Application中调用Duplex Service出现TimeoutException的原因和解决方案

几个星期之前写了一篇关于如何通过WCF进行 双向通信的文章([原创]我的WCF之旅(3):在WCF中实现双向通信(Bi-directional Communication)),在文章中我提供了一个如果在Console Application 调用Duplex WCF Service的Sample.前几天有个网友在上面留言说,在没有做任何改动得情况下,把 作为Client的Console Application 换成Winform Application,运行程序的时候总是出现Timeout的错误