我正在使用libao(ao_play)播放一些缓冲区。我听键盘琴键,每个琴键都有wav声音播放。很简单。
使用ao_play,我看到应用程序在播放声音时阻塞。因为我想同时播放多个音频,所以我需要使用线程(带有pthread lib)。
它可以工作,但是我却遇到了解决方法,如果我播放了很多文件(可能是10个或类似的文件),那么所有内容都会停留几秒钟,然后返回。
好吧,我的问题是:如何使用libao(而不使用线程)同时播放多个声音而不阻塞?
答案 0 :(得分:1)
这不是真实的设计,更像是猜测。
首先,您将需要线程,因为在这种情况下将计算与可视化或听觉化分开是一种很好的传统。您将需要一个音频线程来渲染流并将其发送到输出。
因此,每当您的主线程发现按键时,它都会向音频线程发送一个音符。后者捕获事件,并向当前播放的流中添加一个wave。流以帧(64或1024或10240个样本,或任何您喜欢的延迟)呈现,如果wave本身是少量样本的简单混合,则可能是实时的。)当前应注意音符演奏,每个样本的位置。如果等待时间很短,那么粒度也很高,您甚至可以按缓冲区边缘对齐样本边缘,这将显着简化渲染。
渲染完当前缓冲区后,您只需将其发送到DAC并继续下一帧。
快速浏览libao的帮助页面不会显示任何混音功能,因此您需要自己创建一个简单的混音器,否则您可能实际上需要一个现有的解决方案,即一些简单的开源音频渲染库。