我编写了一个全双工ALSA程序,并在基于linux的嵌入式系统上运行它。 它的声音配置是:
对于实时应用,我需要每10ms捕获一次声音,所以我将最小值设置为160.
我的问题是:当程序运行时,CPU使用率非常高,可能是99.9%(通过top命令)。有时CPU负载很低,但一旦达到99.9%,就无法恢复到低CPU使用率。
我发现它可能是配置问题。在asound.conf文件中(参见后面的代码),我创建了一个名为" asym0"的asym类型卡。选择两个不同的从卡进行播放和捕捉。
最初,我使用" primary"作为捕获设备,但它会导致高CPU使用率。然后我创建了一个名为" rate0"的速率类型卡,并将其设置为捕获设备。 CPU使用率降低,浮动在20%~60%之间,但捕获的声音听起来很糟糕。我听过一些" po po po"在我的声音中,如果我测试麦克风(捕获)。
因此...
- 如果我选择" primary",CPU使用率很高,但没有" po po po"声音。
- 如果我选择" rate0",CPU使用率较低,但有" po po po"声音。
有什么不同于"输入hw"和"键入率"? 是不是由不同的中断频率引起的影响?
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" }
请有人帮我解决这个问题。谢谢!!!
答案 0 :(得分:0)
对于CPU而言,声音捕获应该是一件非常琐碎的任务,因为大多数声音捕获发生在芯片硬件中,有时还需要启动线程来处理输入音频。通常,如果您的周期或缓冲区非常小,则将需要更多的CPU注意,并且可能会出现超限。超限可能是信号丢失的地方。
如果采样率为16 kHz,并且每10ms捕获一次,则实际上是160帧。
要检查的一些事情是您的周期是否小于10ms,是否正在执行线程中非常繁重的处理。
为帮助您,gtkIOStream中有一些代码实现了C ++ OO ALSA层次结构。您可以将此ALSAFullduplex.C测试应用程序作为参考,并对其进行测试,以查看它是否遇到与您所遭受的相同的问题。
此电子邮件中提供了有关构建gtkIOStream的信息: https://lists.audioinjector.net/pipermail/people/2020-March/000028.html