C++ Portaudio和ALSA:“;无法获取CTL elem的信息;

C++ Portaudio和ALSA:“;无法获取CTL elem的信息;,c++,audio,alsa,portaudio,C++,Audio,Alsa,Portaudio,我正在尝试使用Portaudio。首先,我想运行发行版附带的测试程序。在我将头文件portaudio.h和libportaudio.a复制到test目录后,我成功地编译了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

我正在尝试使用Portaudio。首先,我想运行发行版附带的测试程序。在我将头文件portaudio.h和libportaudio.a复制到test目录后,我成功地编译了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工作吗?

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


转载自:互联网,谷歌搜索。对不起,我忘了网站。(
\u

声音缓冲和数据传输

声卡有一个硬件缓冲区,用于存储录制的样本。当缓冲区足够满时,它会生成一个中断。内核声音驱动程序然后使用直接内存访问(DMA)将样本传输到内存中的应用程序缓冲区。类似地,对于回放,使用DMA将另一个应用程序缓冲区从存储器传输到声卡的硬件缓冲区

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

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


在播放过程中,如果应用程序没有足够快地将数据传递到缓冲区,它将缺少数据,从而导致一个名为underrun的错误。ALSA文档有时使用术语XRUN来指代这两种情况。正确设计的应用程序可以最大限度地减少XRUN并在发生故障时进行恢复。

PortAudio尝试打开大量不存在的设备。不抑制这些消息是PA中的一个错误。好的,谢谢你的回复。但是有件事我应该说得更清楚,消息:
ALSA lib pcm.c:7843:(snd_pcm_recover)underrun发生
一直打印在终端上,直到我按Ctrl+c退出程序。我不知道那是什么意思。欢迎光临。这篇文章似乎来自另一个来源。如果确实是这样,您应该引用文本并提供附录中所述的属性。此外,最好也包括你自己的解释,而不是仅仅引用另一个来源。有关详细信息,请参阅。谢谢如果您有更多信息要添加,请编辑其他答案,而不是添加其他答案。