Portaudio和ALSA:“无法获取CTL elem的信息”

时间:2014-12-18 17:41:17

标签: c++ audio alsa portaudio

我正在尝试使用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

声音确实来自扬声器,但有些事情显然是错误的。 这是在最近安装的Fedora 21(XFCE)与VMware的虚拟机中发生的。安装完成后,我必须运行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工作吗?

2 个答案:

答案 0 :(得分:0)

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

转发自:互联网,谷歌搜索。抱歉,我忘记了网站。(_)!

答案 1 :(得分:0)

声音缓冲和数据传输

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

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

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

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