欢迎来到天天文库
浏览记录
ID:21926724
大小:54.50 KB
页数:6页
时间:2018-10-25
《基于实时混音的实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、基于实时混音的实现 本文主要讨论多路声音实时混叠的实现方法,以及实现过程中对一些非凡情况的处理。PLElpDest,LPSAMPLErg=iSum+*(rg,(int)225);/*对转换结果处理?*/?*lpDest++=iSum;?ctr++;?wLen--;?}?}注重一点的是对于单声道数据一个字节表示一个采样值,采样值在0-255之间,各个通道的对应Wave数据相加后,就会溢出,还需要将相加结果转换成0-255之间的数值。? 将该目的缓冲区中的Wave数据经WaveOutWrite函数输出,就能同时听到四个不同的声音,当Wave输出设备播放完目的缓冲区中的数据便返回
2、,请求用户提供更多的Wave输出数据,由于Wave输出设备只能输出提交给它的Wave数据;另外,对Wave数据进行混音还需要一定的时间,因此当提交一个目的缓冲区中的数据给Wave输出设备后,就必须马上混叠另一段Wave数据来提交给Wave输出设备,作为下一个输出的数据缓冲区,避免声音输出的中断,后一个目的缓冲区提交后被输出设备放进输出队列中,当第一个目的缓冲区中输出完毕后再输出它的数据,当输出设备在输出第二个目的缓冲区的数据时,又能将第三段数据混合进第一个目的缓冲区中,然后重新提交,直到提交完所有的Wave数据,那时就将停止输出。在实际应用中目的缓冲区的数要多个,一般为3至4个
3、,图3给出了混音、提交的完整过程。3混音、提交过程3.非凡情况的处理?上面讨论了混音及播放的一般过程,但在实际应用中,还需要到对一些非凡情况进行处理。●各通道中待混音的Wave数据长度不同。?...图4各通道中的Wave数据长度不同这种情况是指当前要混音的某一通道中的声音片断数据比Wave混音器所定义的缓冲区长度要小,这时该路被采样的声音没有足够的数据和Wave混音器中的数据相混叠。?对于这种情况,采用以下的方法可以有效地解决,主要包括三步:?a)Wave混音器在混音前首先判定是否有这种情况出现,假如出现,Wave混音器必须确定该Wave通道中所能被采样的数据长度;?b)按照该
4、通道所能被采样的数据长度,将该路的数据和其它多个通道中的数据相混叠存进Wave混音器的目的缓冲区中;?c)停止对该通道Wave数据的采样混叠处理,只采样混叠其它通道中的Wave数据,存进Wave混音器目的缓冲区的余下部分。?由于在接下来的采样混音过程还会出现相同的情况,所以必须重复上述a-c的步骤,直到Wave混音器的缓冲区填充完毕或再没有可填充的数据为止。这时将该Wave混音器的目的缓冲区提交给Wave输出设备。?●当播放混音数据时又有新的一路Wave数据要求混叠并且被播放。?当前正在播放Wave混音器中一个已经混叠的目的缓冲区中Wave数据,这时又有一路声音要求马上混叠并且
5、被播放。?这种情况处理起来比较复杂。多路Wave数据经过混叠,存储到目的缓冲区,该目的缓冲区中的Wave数据在提交给输出设备前,是确定时长的。当有新的一路Wave数据要求加进时,Wave混音器必须要能确定目的缓冲区中的Wave数据已经播放到什么位置了,同时通知Wave播放设备当前所播放的Wave数据以及Wave设备播放队列中的所有Wave数据不再有效,然后从该时间点起,重新采样混叠各通道中余下未播放的Wave数据,采样混叠过程中加进新的一路要求混叠的Wave数据,将重新混叠的Wave数据提交给Wave输出设备,所有这一切必须在很短的时间完成,要不然用户可能听到声音有中断现象出现
6、。而且这种方法中该重新采样的时间点比较难定。? 因此,对于这种情况还可以采用图2所示的方法来处理,也能达到同样的效果。这样Wave混音器不用中断Wave输出当前所在播放的数据,只要重新处理一下Wave设备播放队列中的Wave数据便可以了。?在混叠下一个目的缓冲区中数据时,包含进新的Wave数据。这种方法有一定的延时,延时的时间长度为,从重新混叠的数据提交到Wave设备的播放队列中算起,直到该缓冲区的Wave数据被播放开始为止。假如定义输出队列的长度3个缓冲区,那么延时的长度最长也就2个缓冲区中的Wave数据播放长度,要是缓冲区的长度设置的非常短的话,这种延时一般是不轻易听出来
7、的。?●播放过程中中止其中某一路Wave数据的播放。? 当正在播放多路Wave数据时,在某一通道中的Wave数据还未播放完成前,要求中止该通道中Wave数据的播放。对于这种情况的处理,和前面提到的情况(2)相似。Wave混音器首先确定当前缓冲区中Wave数据已经播放到什么位置,同时通知Wave播放设备当前所播放的Wave数据以及Wave设备播放队列中的所有Wave数据不再有效,然后从该时间点起,重新混叠余下的未播放的Wave数据,但在采样混叠过程不包括要求往除的Wave数据。?同样当前播放
此文档下载收益归作者所有