【问题标题】:Portaudio and ALSA: "Cannot obtain info for CTL elem"Portaudio 和 ALSA:“无法获取 CTL elem 的信息”
【发布时间】:2015-02-17 14:14:34
【问题描述】:

我正在尝试使用 Portaudio。首先,我想运行发行版中包含的测试程序。将头文件 portaudio.h 和 libportaudio.a 复制到测试目录后,我成功编译了 patest_sine8.c:

$ g++ -o test1 patest_sine8.c -lrt -lm -lpthread -lasound libportaudio.a

当我运行程序时,输出如下:

PortAudio Test: output signed 8 bit sine wave.
ALSA lib setup.c:548:(add_elem) Cannot obtain info for CTL elem (MIXER,'AC97 2ch->4ch Copy Switch',0,0,0): No such file or directory
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround21
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround21
ALSA lib setup.c:548:(add_elem) Cannot obtain info for CTL elem (MIXER,'AC97 2ch->4ch Copy Switch',0,0,0): No such file or directory
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround41
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround50
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround51
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround71
ALSA lib setup.c:548:(add_elem) Cannot obtain info for CTL elem (PCM,'IEC958 Playback PCM Stream',0,0,0): No such file or directory
ALSA lib setup.c:548:(add_elem) Cannot obtain info for CTL elem (PCM,'IEC958 Playback PCM Stream',0,0,0): No such file or directory
ALSA lib setup.c:548:(add_elem) Cannot obtain info for CTL elem (PCM,'IEC958 Playback PCM Stream',0,0,0): No such file or directory
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred

声音确实从扬声器中发出,但显然有问题。 这发生在最近使用 VMware 在虚拟机中安装 Fedora 21 (XFCE) 时。安装后我必须运行 alsaunmute 才能获得声音,它的输出是:

/sbin/alsactl: sysfs_init:48: sysfs path '/sys' is invalid

Found hardware: "ENS1371" "Cirrus Logic CS4297A rev 3" "AC97a:43525913" "0x1274" "0x1371"
Hardware is initialized using a generic method

有人可以指出让 Portaudio 正常工作的正确方向吗?

【问题讨论】:

  • PortAudio 尝试打开许多不存在的设备。不抑制这些消息是 PA 中的一个错误。
  • 好的,谢谢您的回复。但是我应该更清楚一些,消息:ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred 一直打印在终端上,直到我按 Ctrl+C 退出程序。我不知道那是什么意思。

标签: c++ audio alsa portaudio


【解决方案1】:

当声音设备处于活动状态时,数据会在硬件和应用程序缓冲区之间连续传输。在数据捕获(记录)的情况下,如果应用程序没有足够快地读取缓冲区中的数据,则循环缓冲区将被新数据覆盖。由此产生的数据丢失称为溢出。

转自:互联网,google搜索。对不起,我忘记了网站。(_)!

【讨论】:

  • 欢迎来到Stack Overflow。该文本似乎来自另一个来源。如果确实如此,您应该引用文本并提供referencing guidelines 中所述的归属。此外,最好也包括您自己的解释,而不是仅仅引用另一个来源。有关详细信息,请参阅How to Answer。谢谢!
【解决方案2】:

声音缓冲区和数据传输

声卡有一个硬件缓冲区来存储录制的样本。当缓冲区足够满时,它会产生一个中断。然后,内核声音驱动程序使用直接内存访问 (DMA) 将样本传输到内存中的应用程序缓冲区。同样,为了播放,另一个应用程序缓冲区使用 DMA 从内存传输到声卡的硬件缓冲区。

这些硬件缓冲区是环形缓冲区,这意味着当到达缓冲区末尾时,数据会回绕到起点。维护一个指针以跟踪硬件缓冲区和应用程序缓冲区中的当前位置。在内核之外,只对应用程序缓冲区感兴趣,所以从这里开始我们只讨论应用程序缓冲区。

缓冲区的大小可以通过 ALSA 库调用来编程。缓冲区可能非常大,在一次操作中传输它可能会导致不可接受的延迟,称为延迟。为了解决这个问题,ALSA 将缓冲区拆分为一系列周期(在 OSS/Free 中称为片段),并以周期为单位传输数据。

在播放过程中,如果应用程序没有足够快地将数据传递到缓冲区,它就会变得缺乏数据,从而导致称为欠载的错误。 ALSA 文档有时使用术语 XRUN 来指代这两种情况。设计合理的应用程序可以最小化 XRUN 并在发生时恢复。

【讨论】:

  • 如果您有更多信息要添加,请编辑您的其他答案,而不是添加另一个答案。
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多