同时用C和libao播放多个wav音频

Play multiple wav audio with C and libao at same time

我正在使用 libao (ao_play) 播放一些缓冲区。我听键盘按键,对于每个按键,我都会播放一个 wav 声音。很简单。

ao_play 我看到应用程序在播放声音时阻塞。因为我想同时播放多个音频,所以我需要使用线程(使用 pthread 库)。

它有效,但我觉得这是一个解决方法,如果我播放很多文件(可能是 10 个或类似的文件),那么一切都会卡住几秒钟,然后再回来。

好吧,我的问题是:如何使用 libao(而不是使用线程)同时非阻塞地播放多个声音?

这不是真正的设计,更像是一种猜测。

首先,您需要线程,因为在这种情况下,将计算与可视化或听觉分离是一个很好的古老传统。您需要一个音频线程来呈现流并将其发送到输出。

因此,每次您的主线程发现按键时,它都会向音频线程发送一条注释。后者捕获一个事件并向当前播放的流添加一个 wave。流以帧为单位呈现(64、1024 或 10240 个样本,或者任何你喜欢的延迟,如果 wave 本身是几个可能样本的简单混合,它可能是实时的。)你应该跟踪当前的笔记播放,每个样本的位置。如果延迟低,因此粒度高,您甚至可以通过缓冲区边缘对齐样本边缘,这将显着简化渲染。

在渲染当前缓冲区后,您只需将其发送到 DAC 并继续处理下一帧。

快速浏览一下 libao 的帮助页面并没有显示任何混音功能,因此您需要自己创建一个简单的混音器,或者您实际上可能需要一个现有的解决方案,一些简单的开源音频渲染库。