Linux: snd_bcm2835和Pulseaudio 5不相处

创建于 2014-09-14  ·  43评论  ·  资料来源: raspberrypi/linux

安装了Pulseaudio 5.0的系统上的音频不可靠。
似乎在安装Pulseaudio且应用程序完成音频播放后,Pulseaudio不会立即关闭音频设备,而是等待5秒钟。
如果出现另一个要在此时间内播放音频的应用程序,它将重新使用相同的连接。
但是似乎在Pi上无法正常工作。

如果我做:

aplay /usr/share/sounds/alsa/Front_Center.wav ; sleep 4 ; aplay /usr/share/sounds/alsa/Front_Center.wav

第一次,文件正确播放,但是第二次没有声音,程序永远不会完成执行。
它只是打印“正在播放WAVE'/usr/share/sounds/alsa/Front_Center.wav':签名的16位Little Endian,速率48000 Hz,单声道”,然后坐在那里。
睡眠至少5秒钟不会出现问题。

不知道如何调试它,以及问题是否出在ALSA模块或Pulseaudio中。
但是以下是bcm2835_snd的输出,其中启用了调试功能以防对任何人有用: https ://paste.ee/r/soht7

能够使用我自己的自定义Linux发行版和Arch Linux来重现该问题(已将Pulse安装为:“ pacman -Sy pulseaudio pulseaudio-alsa alsa-utils; pulseaudio --start”)
对于非常老的Pulse版本,例如通过Raspbian安装它获得的2.0,似乎并没有发生。

最有用的评论

Pulseaudio仍无法与snd_bcm2835一起使用。 您能重新打开这个问题吗?

所有43条评论

我在Pulseaudio 6.0中遇到类似的问题。 Pulseaudio倾向于根本不播放,或者在播放几分钟后锁定。 还使用Arch Linux。 由于我将Pi设置为无头,因此已经尝试了两种用户模式(以root身份运行)以及系统模式。

以下是Pulseaudio挂起时打印的错误(通常在播放大约一两分钟后)

E:[alsa-sink-bcm2835 ALSA] alsa-sink.c:ALSA唤醒了我们,将新数据写入设备,但实际上没有任何内容可写!
E:[alsa-sink-bcm2835 ALSA] alsa-sink.c:这很可能是ALSA驱动程序'(null)'中的错误。 请将此问题报告给ALSA开发人员。
E:[alsa-sink-bcm2835 ALSA] alsa-sink.c:我们在设置POLLOUT的情况下被唤醒-但是随后的snd_pcm_avail()返回0或另一个值<min_avail。

我也对bcm2835和Pulse 6遇到了严重的问题。
如果我启动pulseaudio并在本地(在pi上)运行paplay,它会立即开始播放且所有乱码的音频。 PCM的某些声音听起来像是乱序播放。 音频播放的时间越长,直到音频几乎成为纯噪声之前,它变得越糟。
杀死(CTRL + C)并随后运行paplay会导致可重复的模式,使音频变乱或纯静音,直到第8次运行时它才能完美播放音频。 再次播放,循环重新开始。
模式是乱码,无声,乱码,乱码,无声,乱码,无声,完美。
如果我使用USB耳机,则paplay每次都起作用。
我已经在可以完美地通过USB耳机播放音频的地方安装了它,然后拔下了USB加密狗,并且可以从pi的模拟端口正确播放音频。 停止并重新启动音频,它将出现乱码。

我的设置是:pulseaudio + mpd + ncmpcpp。

我的测试设置是开始播放歌曲并反复播放/暂停。 播放/暂停最多3次后,pulseaudio将挂起,必须重新启动。
这仅在带有bcm2835芯片的Raspberry B +上发生,这两个版本都基于Debian和Arch。 使用带英特尔声卡的台式机上完全相同的设置,我没有任何问题。 该问题在内核3.6中不存在(但我不想使用古老的发行版)。

在网络上找不到任何解决方法(tsched = 0,禁用空闲模块-suspend-on,...)。 我最终将放弃这个问题,因为我已经一年多没有找到解决方案了。 我要么给自己买一台Raspberry 2,要么我将mpd与ALSA后端一起使用,因为这样效果很好。

@maxnet这个问题解决了吗? 如果是,那么请关闭此问题。

我不这么认为。 它也不适用于Raspberry 3(这也就不足为奇了,因为它使用相同的芯片/驱动程序:snd_bcm2835)。

我在运行ubuntu 16.04的Raspberry 3上遇到此问题。 作为一种解决方法,我将在程序中设置5秒钟的超时延迟,但这会弄乱输出的自然性(这是语音合成器)

pi3和ubuntu mate 16.04的相同问题和mpd听起来很不错,除非我改变音量(这会造成结结或声音损失),而且在其他问题中也会使声音随机散失。

具有最新内核(684be4bc8cc343f60fdc3240c6d55d41d0a5b56c)的Rpi B(不是2或3)出现相同的问题

可以通过在raspbian上运行Linux raspberrypi 4.9.27-v7+ #997 SMP Tue May 9 19:58:37 BST 2017 armv7l GNU/Linux的rpi3来确认该问题。 当尝试通过mpd播放24bit flac音频以产生脉冲时,它仅播放2秒并冻结。

在运行4.9.30-v7+ rpi3上确认问题。 填充mpds播放列表并开始播放通常可以正常工作,直到播放列表完成为止,但是手动更改曲目(停止和重新启动)将停止音频输出,直到我重新启动mpd。

audio_output {
        type            "alsa"
        name            "ALSA Output"
#       device          "hw:0,0"        # optional
        mixer_type      "software"      # optional
#       mixer_device    "default"       # optional
#       mixer_control   "PCM"           # optional
#       mixer_index     "0"             # optional
#       auto_resample   "no"
#       auto_channels   "no"
#       auto_format     "no"
}

具有与@flittermice描述的相同的问题行为:失望:
系统是RPi2,运行带有Rapbian Stretch(9.1)的全新安装,带有Pulseaudio v10.0-1 + deb9u1,内核4.9.59+
一直在阅读相关文章/教程/线程,但是MPD播放如上所述挂起,直到我终止并重新启动pulseaudio。

有人找到解决方案了吗? :crossed_fingers::微笑:

发现了一些有趣的东西(也许):
当pulseaudio挂起时(如上所述),发出两次“ paplay”命令(!)将恢复音频播放:
$ paplay /usr/share/sounds/alsa/Front_Center.wav

  • 第一次,paplay命令超时(或可以被Ctrl + C中断)
  • paplay命令第二次生效,现在恢复了来自MPD的声音。

工作一段随机的时间,然后回到@flittermice的行为:sob:

我对这个问题进行了进一步调试,发现Pulseaudio使用一种称为“倒带”的深奥ALSA功能导致了此问题。
不幸的是,没有配置选项可以阻止PA使用该功能。
该分支会在源代码中永久禁用它: https :
如果您可以在系统上构建和安装它,请检查是否可以解决您的问题。

我进一步调试了这个问题,发现Pulseaudio使用了深奥的ALSA功能
所谓的“倒带”就是造成此问题的原因。
不幸的是,没有配置选项可以阻止PA使用该功能。

但是,如果您取消该功能,Pulse是否可以正常运行?

请记住,声音服务器提供的部分功能是将可能来自多个应用程序的声音混合在一起。
我可以想象,如果您希望能够让新的应用程序立即将声音添加到混音中,那么您确实需要一种丢弃一部分现有缓冲区的方法。
否则,您只能在缓冲区末尾添加新声音,并且会有滞后,这是应用程序可能无法预期的。 出于某些目的,这可能是个问题(例如带声音的视频)

@maxnet适当的修复方法(不是我的方法)会将延迟固定在一个相当低的值,从而消除了倒带的需要,但会带来稍微更高的CPU负载/功耗的代价。
对于我的低延迟应用程序来说,它工作得很好,对于使用MPD播放音乐,不倒带可能会有些烦人(不对PA进行补丁处理,只做低延迟缓冲区)。

始终具有低延迟,这意味着将使用微小的缓冲区。
这对我来说也不理想。

会认为内核模块中应该有一个适当的修复方法...

@strfry :与ALSA倒带的关系听起来很合理。 当pulseaudio变得“不开心”时,通常在这一行结束:

D:[alsa-sink-bcm2835 ALSA] source.c:处理倒带...

但是,我有点同意@maxnet ,并且ALSA首先这样做可能是有原因的...:wink:

这是Raspberry Pi上唯一不起作用的还是Pulseaudio + ALSA的一般问题?
现在仍然是3年多的问题,我们是否应该向Pulseaudio / ALSA开发人员报告此问题,而不是在此报告?

@ pjotrek-b仅在Raspberry PI内置声音“卡”中不起作用。 我们成功地将Pulseaudio与USB声卡一起用作网络声音服务器达数月之久,没有出现问题。

我可以确认@jekhor的声明。
相同的配置与Raspberry Pi上的USB声卡(snd_usb_audio)完美配合。

如日志文件所述:“ E:[alsa-sink-bcm2835 ALSA] alsa-sink.c:这很可能是ALSA驱动程序'(null)'中的错误。请将此问题报告给ALSA开发人员。”。 有谁知道如何做到这一点?

@jekhor :感谢您清理此错误! :微笑:

现在令人费解的是,我一直以为是这样的:
application > pulseaudio > ALSA > driver > hardware

如果是这样,当直接使用ALSA时,具有此问题的相同应用程序如何能正常工作?
application > ALSA > driver > hardware

现在,如果此问题特定于RPi的内置声卡/芯片,那么仅使用alsa的使用也不会出现这些问题? :困惑:

@strfry :我在的文档中找到

我已经阅读了其中的一部分,现在看来对我来说不再是“神秘”了。 既然您已经看过它的代码:有什么想法可能导致它使Pulseaudio“卡住”?
正如我上面提到的,两次执行“ paplay”似乎给它“轻推”以使其重新开始工作...:smile:

@ pjotrek-b当然,考虑到Pulseaudio的设计目标,这是有道理的。 从某种意义上说,这是“深奥的”,因为99%的正常ALSA应用程序将永远不会使用倒带,因此会触发ALSA驱动程序中未经测试的路径。 不幸的是,Pulseaudio缺少禁用该潜在错误功能的使用的选项(例如其他功能,例如基于计时器的计划)。
我还没有调试确切的细节,但是基本上,Pulseaudio陷入了一个无休止的循环,因为ALSA在该将音频数据再次写入设备时无法正确报告。
尽管有可能在Pulseaudio方面解决此问题,但这是ALSA驱动程序中的错误。
我的怀疑是,发行新的流会在被卡住时生成Pulseaudio正在等待的事件。

@flittermice我猜在这种情况下,负责任的ALSA开发人员是Raspberry Pi内核开发人员中的某人,他们编写了snd_bcm2835驱动程序,因此该存储库将是报告此问题的正确位置。

一个简单的代码示例演示了使用倒带时ALSA的明显错误行为,这对内核开发人员在仔细研究此错误时可能会有所帮助。

@ pjotrek-b当然,考虑到Pulseaudio的设计目标,这是有道理的。 从某种意义上说,这是“深奥的”,因为99%的正常ALSA应用程序将永远不会使用倒带,因此会触发ALSA驱动程序中未经测试的路径。 不幸的是,Pulseaudio缺少禁用该潜在错误功能的使用的选项(例如其他功能,例如基于计时器的计划)。
我还没有调试确切的细节,但是基本上,Pulseaudio陷入了一个无休止的循环,因为ALSA在该将音频数据再次写入设备时无法正确报告。
尽管有可能在Pulseaudio方面解决此问题,但这是ALSA驱动程序中的错误。
我的怀疑是,发行新的流会在被卡住时生成Pulseaudio正在等待的事件。

@flittermice我猜在这种情况下,负责任的ALSA开发人员是Raspberry Pi内核开发人员中的某人,他们编写了snd_bcm2835驱动程序,因此该存储库将是报告此问题的正确位置。

一个简单的代码示例演示了使用倒带时ALSA的明显错误行为,这对内核开发人员在仔细研究此错误时可能会有所帮助。

如果是这样,当直接使用ALSA时,具有此问题的相同应用程序如何能正常工作?

直接使用ALSA的应用程序通常不需要使用倒带。
他们确切地知道接下来几秒钟要播放的声音,然后将其发送到音频设备。

它用于计划变更的情况。
如果Pulse已将接下来的2秒钟内的音频发送到设备,并且突然之间有另一个Pulse客户端连接并希望播放声音-不必等到那2秒钟就结束了-它必须告诉声音设备丢弃前一个缓冲区,并用新数据替换它,其中混入了额外的声音。

当然,如果您使用微小的缓冲区来保持毫秒而不是音频的秒数,则可以不倒带。
但是,我认为这不是首选。
在Linux下,不能保证任何应用程序获得的CPU时间量,也不能保证其平均分配,这不是实时操作系统。
如果另一个应用程序使用率很高,而Pulse却没有足够的时间来保持所有微小的缓冲区一直充满,那么它将会欠载,并且声音会变得口吃。

正如我上面提到的,两次执行“ paplay”似乎给它“轻推”以使其重新开始工作...:smile:

如果最后一个使用该客户端的客户端断开连接,则Pulse Audio还会在最后一个使用该客户端的客户端断开连接5秒后关闭与音频设备的连接。
并在下一次客户想要使用它时重新打开它。
因此,如果您的命令之间有足够的时间,那也可能是它再次起作用的原因。

@strfry@maxnet
非常感谢您提供这些详细的答案!

有谁知道这在最新的Raspbian(内核4.14.y)中是否仍然是一个问题?

除非发布进一步的互动,否则此问题将在30天内关闭。 如果您希望此问题继续公开,请添加评论。 如果要求,已关闭的问题可能会重新打开。

我会检查,但目前没有时间进行测试...:失望:
以防万一:如果30天后对其进行测试,是否可以重新打开它?

尽管我很确定没有任何改进,但是我不能为这个特定的错误做出太多贡献。 我购买了带有PCM2704芯片组的外部USB声卡,现在对snd_usb_audio驱动程序感到满意。
使用raspi的HDMI输出将是一个不错的选择,但是我的raspi甚至拒绝将HDMI电缆插入AV接收机来启动...但这是另一回事了。

因缺乏活动而关闭。 如果您认为此问题仍然相关,请请求重新打开。

可以确认我的Rasp Pi 3发生了这种情况
我正在运行带有4.14.19内核版本的ArchARM

可以确认这在我的RPI3上仍在发生:

Linux 4.14.71-v7+ #1145 SMP Fri Sep 21 15:38:35 BST 2018 armv7l GNU/Linux

尝试使用与pulseaudio的mpd我得到:

Nov 05 09:25:17 noise systemd[1]: Started Music Player Daemon.
Nov 05 09:25:19 noise pulseaudio[1567]: [pulseaudio] server-lookup.c: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Nov 05 09:25:19 noise pulseaudio[1567]: [pulseaudio] main.c: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Nov 05 09:25:20 noise pulseaudio[1567]: [alsa-sink-bcm2835 ALSA] alsa-sink.c: ALSA woke us up to write new data to the device, but there was actually nothing to write.
Nov 05 09:25:20 noise pulseaudio[1567]: [alsa-sink-bcm2835 ALSA] alsa-sink.c: Most likely this is a bug in the ALSA driver '(null)'. Please report this issue to the ALSA developers.
Nov 05 09:25:20 noise pulseaudio[1567]: [alsa-sink-bcm2835 ALSA] alsa-sink.c: We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail.

我们有机会重新讨论这个问题吗?

可以确认我的Rasp Pi 3发生了这种情况
我正在运行带有4.14.19内核版本的ArchARM
这是由于错误的许可,我已经奏效了。

@ l4rzy :您让我们感到好奇。 哪些权限?

@flittermice :糟糕,因为我对此发表了几个月的评论,所以我误解了这种情况。 这与权限无关。
我试图为本地网络Pulse音频服务器设置Raspberry Pi 3,它可以无缝运行,但过一会儿没有播放任何内容后,Pulse音频服务器会自动关闭。 后来,我安装了mpd来播放SoundCloud中的音乐,该声音始终打开与Pulse的连接并保持其运行。 我认为这不是一个坏的解决方法。

@ l4rzy :解决方法是:-)

顺便说一句:您是否曾经尝试不将default.pa中的“ module-suspend-on-idle”加载?

加载模块空闲状态暂停

我尝试过的@flittermice 。 无济于事。

Pulseaudio仍无法与snd_bcm2835一起使用。 您能重新打开这个问题吗?

我可以确认它也不适合我。 我一直在测试不同的代码和编译选项,但无法使其正常工作。 我正在使用ArchLinux ARM和所有最新软件。 如果可能,我很乐意帮助调试。

对我来说,这个问题几乎是由bcm2835_alsa模块报告的缓冲区大小引起的。 报告为脉冲的音频缓冲区为8816位,或者刚好足以容纳来自网络流的大约1.56 ms的音频。 我还没有足够的硬件专家来找到规格,但这里似乎有些失误。 根据ALSA本身(即不是脉冲模块),缓冲区大小更符合逻辑131072位。 如果我猜到了,Pulse认为它无法使卡的缓冲区保持满,并尝试倒带,因为被告知有8816位的软件限制...但是也许我离这里还很远。

只是有同样的问题(确实很烦人), @ JamesH65您可以重新打开它以进一步跟踪它吗?

嗯...我无法用Raspberry Pi 3 B v1.2和最新的4.19.34内核(由rpi-update更新到https://github.com/Hexxeh/rpi-firmware/commit/99c274691c0748080762dcda91a0ebfe3c4f519307)重现。 我不知道为什么,驱动程序似乎从2016年起没有发生变化。也许某些VC固件发生了变化?

嗨,在Raspberry Pi 4 B v1.1上,内核5.3.0-1014在使用pulseaudio v13.0时声音衰减方面也存在相同的问题。 如果在pavucontrol中选择了立体声输出,则会丢失声音。 有什么解决办法吗?

@acegallagher

报告为脉冲的音频缓冲区为8816位,或者刚好足以容纳来自网络流的大约1.56 ms的音频。

我认为这是因为PulseAudio默认将接收器检测为Mono(由于此问题),并且这些接收器的默认缓冲区大小较小。
尝试更新PA的默认配置文件配置文件,以代替创建立体声接收器,因为这将使PA使用device.buffering.buffer_size = "17632"创建接收器,这似乎更好!

@ olevenets2

嗨,在Raspberry Pi 4 B v1.1上,内核5.3.0-1014在使用pulseaudio v13.0时声音衰减方面也存在相同的问题。 如果在pavucontrol中选择了立体声输出,则会丢失声音。 有什么解决办法吗?

请确保更新PA的默认配置文件配置文件,以使立体声输出实际上可以在RPI 4上使用PA正常工作,并确保load-module module-udev-detect没有load-module module-alsa-sink load-module module-udev-detect而没有load-module module-alsa-sink /etc/pulse/default.pa

此页面是否有帮助?
0 / 5 - 0 等级