Linux: snd_bcm2835とPulseaudio5がうまくいかない

作成日 2014年09月14日  ·  43コメント  ·  ソース: raspberrypi/linux

Pulseaudio5.0がインストールされているシステムで信頼性の低いオーディオが発生しています。
Pulseaudioがインストールされ、アプリケーションがオーディオの再生を終了すると、Pulseaudioはオーディオデバイスをすぐに閉じず、5秒間待機するようです。
その時間内にオーディオを再生したい別のアプリケーションが表示された場合、そのアプリケーションは同じ接続を再利用します。
ただし、Piでは正しく動作しないようです。

私が行った場合:

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

ファイルは最初は正しく再生されますが、2回目は音が出ず、プログラムの実行が終了することはありません。
「PlayingWAVE '/ usr / share / sounds / alsa / Front_Center.wav':Signed 16 bit Little Endian、Rate 48000 Hz、Mono」と出力し、そこに座っています。
5秒以上寝ていても問題ありません。

これをデバッグする方法がわからず、問題がALSAモジュールにあるのかPulseaudioにあるのかわかりません。
しかし、これは誰にとっても役立つ場合に備えてデバッグを有効にしたbcm2835_sndの出力です: https ://paste.ee/r/soht7

私自身のカスタムLinuxディストリビューションとArchLinuxの両方で問題を再現できました(Pulseをインストールしました: "pacman -Sy pulseaudio pulseaudio-alsa alsa-utils; pulseaudio --start")
Raspbianを介してインストールしたときに取得する2.0など、非常に古いバージョンのPulseでは発生しないようです。

Bug

最も参考になるコメント

Pulseaudioはまだsnd_bcm2835で動作していません。 この号を再開していただけますか?

全てのコメント43件

Pulseaudio6.0でも同様の問題が発生しています。 Pulseaudioは、まったく再生されないか、数分の再生後にロックアップする傾向があります。 ArchLinuxも使用しています。 Piをヘッドレスに設定しているので、ユーザーモード(rootとして実行)とシステムモードの両方を試しました。

以下は、Pulseaudioがハングするたびに出力されるエラーです(通常、再生から約1〜2分後)

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とpulse6でひどい問題を抱えています。
私がpulseaudioを起動し、ローカルで(pi上で)paplayを実行すると、オーディオがすべて文字化けしてすぐに再生を開始します。 PCMの一部は、順不同で再生されているように聞こえます。 オーディオの再生時間が長くなると、オーディオがほぼ純粋なノイズになるまで悪化します。
強制終了(CTRL + C)して、その後paplayを実行すると、オーディオが文字化けする、または純粋な無音の繰り返しパターンが発生し、8回目の実行でオーディオが完全に再生されます。 もう一度再生すると、サイクルが再開されます。
パターンは、文字化け、サイレント、文字化け、文字化け、サイレント、文字化け、サイレント、完璧です。
USBヘッドセットを使用すると、paplayは毎回機能します。
USBヘッドセットを介してオーディオを完璧に再生し、USBドングルを抜くと、piのアナログポートからオーディオが正しく再生されます。 オーディオを停止して再起動すると、文字化けします。

私のセットアップ:pulseaudio + mpd + ncmpcpp。

私のテストセットアップは、曲を開始し、繰り返し再生/一時停止することです。 最大3回の再生/一時停止の後、pulseaudioはハングし、再起動する必要があります。
これは、DebianとArchベースのディストリビューションの両方で、bcm2835チップを搭載した私のRaspberry B +でのみ発生します。 Intelサウンドチップを搭載したデスクトップPCでまったく同じセットアップを行っても問題はありません。 この問題はカーネル3.6には存在しませんでした(しかし、私は古いディストリビューションを使いたくありません)。

Web上にある回避策(tsched = 0、module-suspend-on-idleの無効化など)はいずれも機能していません。 1年以上解決策が見つからなかったので、ついにこの問題をあきらめます。 Raspberry 2を自分で購入するか、ALSAバックエンドでmpdを使用します。これはうまく機能するためです。

@maxnetはこの問題を解決しましたか? はいの場合は、この問題を閉じてください。

私はそうは思いません。 Raspberry 3でも動作しません(同じチップ/ドライバーsnd_bcm2835を使用しているので不思議ではありません)。

私はubuntu16.04を実行している私のRaspberry3でこの問題を抱えています。 回避策として、プログラムに5秒のタイムアウト遅延を設定しますが、出力の自然さを台無しにします(これは音声合成装置です)

私のpi3とubuntumate 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の問題を確認できます。Pulseaudioは通常、mpdから(ネットワーク経由で別のホストから)フィードしたトラック間で再生を停止します。 mpdを介して24ビットの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で、pulseaudio v10.0-1 + deb9u1、カーネル4.9.59+を使用してRaspbianStretch(9.1)の新規インストールを実行しています。
関連記事/チュートリアル/スレッドを読んでいますが、pulseaudioを強制終了して再起動するまで、MPDの再生が上記のようにハングします。

誰かがこれに対する解決策をまだ見つけましたか? :crossed_fingers :: smile:

何か面白いものを見つけました(多分):
(上記のように)pulseaudioがハングした場合、「paplay」コマンドを2回(!)発行すると、オーディオの再生が再開されます。
$ paplay /usr/share/sounds/alsa/Front_Center.wav

  • 1回目は、paplayコマンドがタイムアウトします(またはCtrl + Cで中断できます)
  • 2回目の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:

これはRaspberryPiでのみ機能しないのですか、それともpulseaudio + ALSAの一般的な問題ですか?
3年以上も問題になっていますが、ここではなく、pulseaudio / ALSA開発者に報告しますか?

@ pjotrek-b RaspberryPI内蔵サウンド「カード」でのみ機能しません。 私たちは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

もしそうなら、この問題を抱えている同じアプリケーション
application > ALSA > driver > hardware

この問題がRPiの組み込みサウンドカード/チップに固有である場合、これらの問題がalsaのみの使用でも発生しないのはなぜですか? :混乱:

@strfrypulseaudioのドキュメントで「巻き戻し」に関する非常に詳細な記事を見つけまし

私はそれの一部を読みました、そして、それはもう私にとって「難解」であるように思われません。 あなたはそのコードを見たので:pulseaudioを「動かなくなる」原因となる可能性のあるアイデアはありますか?
上で述べたように、「paplay」を2回実行すると、再び作業に戻るための「微調整」が得られるようです...:smile:

@ pjotrek-b Pulseaudioの設計目標を考えると、確かにそれは理にかなっています。 通常のALSAアプリケーションの99%が巻き戻しを使用しないという意味で「難解」であるため、ALSAドライバーでテストされていないパスがトリガーされます。 残念ながら、Pulseaudioには、この潜在的にバグのある機能(他のタイマーベースのスケジューリングなど)の使用を無効にするオプションがありません。
正確な詳細をデバッグしていませんが、オーディオデータをデバイスに再度書き込むときにALSAが正しくレポートできないため、基本的にPulseaudioは無限ループに陥ります。
Pulseaudio側でこれを回避する可能性があるにもかかわらず、これはALSAドライバーのバグです。
私の疑惑は、新しいストリームを発行すると、Pulseaudioがスタックしたときに待機しているイベントが生成されることです。

@flittermiceこの場合、責任のあるALSA開発者は、snd_bcm2835ドライバーを作成したRaspberry Piカーネル開発者の誰かであるため、このリポジトリはこれを報告するのに適切な場所です。

巻き戻しを使用するときのALSAの明らかに間違った動作を示す簡単なコード例は、このバグを詳しく調べるときにカーネル開発者に役立つでしょう。

@ pjotrek-b Pulseaudioの設計目標を考えると、確かにそれは理にかなっています。 通常のALSAアプリケーションの99%が巻き戻しを使用しないという意味で「難解」であるため、ALSAドライバーでテストされていないパスがトリガーされます。 残念ながら、Pulseaudioには、この潜在的にバグのある機能(他のタイマーベースのスケジューリングなど)の使用を無効にするオプションがありません。
正確な詳細をデバッグしていませんが、オーディオデータをデバイスに再度書き込むときにALSAが正しくレポートできないため、基本的にPulseaudioは無限ループに陥ります。
Pulseaudio側でこれを回避する可能性があるにもかかわらず、これはALSAドライバーのバグです。
私の疑惑は、新しいストリームを発行すると、Pulseaudioがスタックしたときに待機しているイベントが生成されることです。

@flittermiceこの場合、責任のあるALSA開発者は、snd_bcm2835ドライバーを作成したRaspberry Piカーネル開発者の誰かであるため、このリポジトリはこれを報告するのに適切な場所です。

巻き戻しを使用するときのALSAの明らかに間違った動作を示す簡単なコード例は、このバグを詳しく調べるときにカーネル開発者に役立つでしょう。

もしそうなら、この問題を抱えている同じアプリケーションが、ALSAを直接使用するときにどのように完璧に機能することができますか?

ALSAを直接使用するアプリケーションは、通常、巻き戻しを使用する必要はありません。
彼らは、今後数秒で再生したいサウンドを正確に把握し、それをオーディオデバイスに送信します。

計画変更がある場合に使用します。
パルスがすでに次の2秒間オーディオをデバイスに送信していて、突然別のパルスクライアントが接続してサウンドも再生したい場合(最初に2秒が経過するのを待たずに)、サウンドを通知する必要があります以前のバッファを破棄し、余分なサウンドがミックスされた新しいデータに置き換えるデバイス。

確かに、数秒のオーディオではなくミリ秒を保持する小さなバッファを使用する場合は、巻き戻しなしで実行できます。
しかし、私はそれが好ましいとは思いません。
Linuxでは、アプリケーションが取得するCPU時間の量についての保証はなく、アプリケーションが均等に分割されるという保証もありません。リアルタイムオペレーティングシステムではありません。
別のアプリケーションが大量に使用していて、Pulseがその小さなバッファーを常に満たしておくのに十分な時間に達しない場合、それはアンダーランし、サウンドが途切れます。

上で述べたように、「paplay」を2回実行すると、再び作業に戻るための「微調整」が得られるようです...:smile:

また、Pulse Audioは、最後に使用したクライアントが切断されてから5秒後にサウンドデバイスへの接続を閉じます(その間に他のクライアントが接続しなかった場合)。
そして、次にクライアントがそれを使用したいときにそれを再び開きます。
したがって、コマンドの間に十分な時間があれば、それが再び機能する理由でもある可能性があります。

@strfry@maxnet
これらの詳細な回答をありがとうございました!

これが最新のRaspbian(カーネル4.14.y)でまだ問題であるかどうか誰かが知っていますか?

この問題は、追加のやり取りが投稿されない限り、30日以内にクローズされます。 この問題を未解決のままにしておきたい場合は、コメントを追加してください。 クローズされた問題は、要求された場合に再開される場合があります。

確認したいのですが、今はテストする時間がありません...:がっかり:
念のため:30日後にテストしても問題が解決しない場合は、再度開くことができますか?

改善はなかったと確信していますが、この特定のバグにはあまり貢献できません。 PCM2704チップセットを搭載した外部USBサウンドカードを購入しましたが、snd_usb_audioドライバーに満足しています。
raspiのHDMI出力を使用するのは良いオプションでしたが、私のraspiはHDMIケーブルをAVレシーバーに接続した状態で起動することさえ拒否しました...しかしそれは別の話です。

活動不足のため閉店。 この問題が引き続き関連していると思われる場合は、再開をリクエストしてください。

これが私のRaspPi3で発生することを確認できます
カーネルバージョン4.14.69で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.

この問題を再開できる可能性はありますか?

これが私のRaspPi3で発生することを確認できます
カーネルバージョン4.14.69でArchARMを実行しています
これは間違った許可のためでした、私はそれを働かせました。

@ l4rzy :あなたは私たちを好奇心旺盛にしています。 どの権限?

@flittermice :おっと、私はこれについて何ヶ月もコメントして以来、状況を誤解しました。 それは許可についてではありませんでした。
Raspberry Pi 3をローカルネットワークのPulseオーディオサーバー用にセットアップしようとしましたが、シームレスに動作しましたが、しばらく何も再生しなかったため、Pulseオーディオサーバーが自動的にシャットダウンしました。 後でmpdをインストールしてSoundCloudから音楽を再生します。これにより、常にPulseへの接続が開かれ、実行され続けます。 悪い回避策ではないと思います。

@ l4rzy :回避する方法です:-)

ところで:default.paに「module-suspend-on-idle」をロードしないようにしたことはありますか?

load-modulemodule-suspend-on-idle

@flittermice私が試しました。 助けにはならない。

Pulseaudioはまだsnd_bcm2835で動作していません。 この号を再開していただけますか?

私もそれが機能していないことを確認できます。 さまざまなコードとコンパイルオプションをテストしてきましたが、動作させることができませんでした。 私はArchLinuxARMとすべての最新ソフトウェアを使用しています。 可能であれば、デバッグのお手伝いをさせていただきます。

私の場合、私が知る限り、問題はbcm2835_alsaモジュールによって報告されたバッファサイズに起因します。 パルスとして報告されるオーディオバッファは8816ビットであり、ネットワークストリームからの約1.56ミリ秒のオーディオにちょうど十分です。 スペックを見つけるのにハードウェアオタクでは足りませんが、ここで何かがおかしいようです。 ALSA自体(つまりパルスモジュールではない)によると、バッファサイズははるかに論理的な131072ビットです。 私が推測すると、pulseはカードのバッファをいっぱいに保つことができないと考え、8816ビットのソフトウェア制限があると言われているので巻き戻しを試みます...しかし、おそらく私はここでベースから離れています。

同じ問題が発生しました(本当に厄介です)。

うーん... Raspberry Pi 3 B v1.2と最新の4.19.34カーネル(rpi-updateによってhttps://github.com/Hexxeh/rpi-firmware/commit/99c274691c07480762dcda91a0ebfe3c4f519307に更新)ではこれを再現できません。 理由はわかりませんが、ドライバーは2016年から変更されていないようです。VCファームウェアが変更されている可能性がありますか?

こんにちは、Raspberry Pi 4 B v1.1では、カーネル5.3.0-1014は、pulseaudiov13.0でのサウンドフェードに関して同じ問題を抱えています。 pavucontrolでステレオ出力を選択すると、サウンドが失われます。 解決策はありますか?

@acegallagher

パルスとして報告されるオーディオバッファは8816ビットであり、ネットワークストリームからの約1.56ミリ秒のオーディオにちょうど十分です。

これは、PulseAudioがデフォルトでシンクをMonoとして検出しており(この問題のため)、これらのデフォルトのバッファーサイズが小さいためだと思います。
代わりにステレオシンクが作成されるように、PAのデフォルトのプロファイル構成ファイルを更新してみてください。これにより、PAはdevice.buffering.buffer_size = "17632"でシンクを作成します。

@ olevenets2

こんにちは、Raspberry Pi 4 B v1.1では、カーネル5.3.0-1014は、pulseaudiov13.0でのサウンドフェードに関して同じ問題を抱えています。 pavucontrolでステレオ出力を選択すると、サウンドが失われます。 解決策はありますか?

することを確認しますPAのデフォルトのプロファイル設定ファイルを更新しているステレオ出力が実際にRPI 4にPAを使用して動作し、あなたが持って作るので、 load-module module-udev-detectなくload-module module-alsa-sinkあなたの中に/etc/pulse/default.pa

このページは役に立ちましたか?
0 / 5 - 0 評価