1

我编写了一个全双工 ALSA 程序并在基于 linux 的嵌入式系统上运行它。它的声音配置是:

  • 采样率:16Hz
  • 频道:1(单声道)
  • 格式:S16_LE
  • 最小可用性:160(帧)

对于实时应用,我需要每 10 毫秒捕获一次声音,所以我将最小可用性设置为 160。

我的问题是:程序运行时,CPU 使用率非常高,可能为 99.9%(通过 top 命令)。有时 CPU 负载很低,但一旦达到 99.9%,就无法回到低 CPU 使用率。

我发现这可能是配置问题。在 asound.conf 文件中(参见后面的代码),我创建了一个名为“asym0”的 asym 类型卡,用于选择两个不同的从卡进行播放和捕获。

最初,我使用“主要”作为捕获设备,但它会导致 CPU 使用率很高。然后我创建了一个名为“rate0”的费率类型卡,并将其设置为捕获设备。CPU 使用率变低,在 20%~60% 之间浮动,但捕获的声音听起来很糟糕。如果我测试麦克风(捕获),我会在我的声音中听到一些“po po po”。

所以...

  • 如果我选择“primary”,CPU使用率很高,但没有“po po po”的声音。
  • 如果我选择“rate0”,CPU使用率较低,但有“po po po”的声音。

与“type hw”和“type rate”有什么不同?
是中断频率不同造成的影响吗?

asound.conf 文件:

pcm.primary { type hw card mycard } pcm.rate0 { type rate slave { pcm "primary" rate 16000 } } pcm.asym0 { type asym playback.pcm "primary" capture.pcm "primary" or "rate0" }

请任何人帮助我解决这个问题。谢谢!!!

4

1 回答 1

0

声音捕获对于 CPU 来说应该是一项非常微不足道的任务,因为大部分都发生在硅硬件中,偶尔它需要启动线程来处理输入音频。通常,如果您的周期或缓冲区非常小,则需要更多的 CPU 关注,并且可能会出现溢出。溢出可能是您的信号丢失发生的地方。

如果您的采样率为 16 kHz,并且您每 10 毫秒捕获一次,那确实是 160 帧。

要查看的一些事情是您的周期是否小于 10 毫秒,您是否正在执行线程中非常繁重的处理。

为了帮助您,gtkIOStream中有一些代码实现了 C++ OO ALSA 层次结构。您可以查看此ALSAFullduplex.C测试应用程序作为参考,并对其进行测试以查看它是否遇到与您相同的问题。

此电子邮件中提供了有关构建 gtkIOStream 的信息: https ://lists.audioinjector.net/pipermail/people/2020-March/000028.html

于 2020-03-26T04:06:08.170 回答