我们正在使用 ALSA 运行 Debian,我们需要从音频输入行中提取音频样本。我们希望能够用这些样本填充缓冲区,因此在它们到来时对它们执行操作。
我们已经尝试直接查看 ALSA 调用,但由于很多资源都非常陈旧,因此我们遇到了折旧函数的问题。
关于这个问题的方向有什么好的参考或建议吗?
根据维基百科:
JACK 音频连接套件(或 JACK)是一个专业的声音服务器守护程序,它为实现其 API 的应用程序之间的音频和 MIDI 数据提供实时、低延迟的连接。JACK 是递归的缩写。JACK 由 Paul Davis 领导的开源开发者社区开发(他在 2004 年因这项工作获得了开源奖)[3],并且一直是 Linux 上专业音频软件的关键基础设施和事实上的标准自 2002 年成立以来。服务器是自由软件,在 GNU GPL 下获得许可,而库在更宽松的 GNU LGPL 下获得许可。
使用一些最新的示例,如下所示:
#include <alsa/asoundlib.h>
static char *device = "default"; /* capture device */
unsigned short buffer[2 * 24000];
int main(void)
{
int err;
snd_pcm_t *handle;
snd_pcm_sframes_t frames;
if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_CAPTURE, 0)) < 0) {
printf("open error: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}
if ((err = snd_pcm_set_params(handle,
SND_PCM_FORMAT_S16,
SND_PCM_ACCESS_RW_INTERLEAVED,
2,
48000,
1,
500000)) < 0) { /* 0.5 sec */
printf(" open error: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}
for (;;) {
frames = snd_pcm_readi(handle, buffer, 24000);
if (frames < 0)
frames = snd_pcm_recover(handle, frames, 0);
if (frames < 0) {
printf("snd_pcm_readi failed: %s\n", snd_strerror(err));
break;
}
// ...
}
snd_pcm_close(handle);
return 0;
}