PulseAudioがカードプロファイルを 'a2dp_sink'に設定するのに失敗しました。どうすればログを見て、何が問題なのかを知ることができますか?

現在、ubuntu 16.04をインストールしていますが、新規インストール時にはa2dpが動作していましたが、これは最後の選択肢として残しておきたいと思います。bluetoothの設定からペアリングを消去して再度ペアリングすると、たまにa2dpプロファイルになることがありますが、ヘッドセットを切断して再度接続すると、a2dpプロファイルが機能しなくなり(a2dpになっていると表示されます)、HSP/HSFに切り替えて初めて機能しますが、その後はa2dpに設定できません。

私が試したのは

 pacmd set-card-profile <index> a2dp_sink

を実行してみましたが、以下のようなエラーが出てしまいます。

"Failed to set card profile to 'a2dp_sink'"

私は Linux の経験が浅いので、どうやってログを取得するのか、何を見ればいいのかわかりませんが、pacmd list-cards からこれを取得しました。

うまくいったとき

name: <bluez_card.50_C9_71_97_A1_86>
driver: <module-bluez5-device.c>
owner module: 27
properties:
    device.description = "Jabra REVO a4.0.0"
    device.string = "50:C9:71:97:A1:86"
    device.api = "bluez"
    device.class = "sound"
    device.bus = "bluetooth"
    device.form_factor = "headset"
    bluez.path = "/org/bluez/hci0/dev_50_C9_71_97_A1_86"
    bluez.class = "0x240404"
    bluez.alias = "Jabra REVO a4.0.0"
    device.icon_name = "audio-headset-bluetooth"
    device.intended_roles = "phone"
profiles:
    headset_head_unit: Headset Head Unit (HSP/HFP) (priority 20, available: unknown)
    a2dp_sink: High Fidelity Playback (A2DP Sink) (priority 10, available: unknown)
    off: Off (priority 0, available: yes)
active profile: <a2dp_sink>
sinks:
    bluez_sink.50_C9_71_97_A1_86/#6: Jabra REVO a4.0.0
sources:
    bluez_sink.50_C9_71_97_A1_86.monitor/#10: Monitor of Jabra REVO a4.0.0
ports:
    headset-output: Headset (priority 0, latency offset 0 usec, available: unknown)
        properties:

    headset-input: Headset (priority 0, latency offset 0 usec, available: unknown)
        properties:

うまくいかないとき

name: <bluez_card.50_C9_71_97_A1_86>
driver: <module-bluez5-device.c>
owner module: 25
properties:
    device.description = "Jabra REVO a4.0.0"
    device.string = "50:C9:71:97:A1:86"
    device.api = "bluez"
    device.class = "sound"
    device.bus = "bluetooth"
    device.form_factor = "headset"
    bluez.path = "/org/bluez/hci0/dev_50_C9_71_97_A1_86"
    bluez.class = "0x240404"
    bluez.alias = "Jabra REVO a4.0.0"
    device.icon_name = "audio-headset-bluetooth"
    device.intended_roles = "phone"
profiles:
    headset_head_unit: Headset Head Unit (HSP/HFP) (priority 20, available: unknown)
    a2dp_sink: High Fidelity Playback (A2DP Sink) (priority 10, available: yes)
    off: Off (priority 0, available: yes)
active profile: <off>
ports:
    headset-output: Headset (priority 0, latency offset 0 usec, available: yes)
        properties:

    headset-input: Headset (priority 0, latency offset 0 usec, available: unknown)
        properties:

そして、所有するモジュールは

name: <module-bluez5-device>
argument: <path=/org/bluez/hci0/dev_50_C9_71_97_A1_86>
used: 0
load once: no
properties:
    module.author = "João Paulo Rechi Vita"
    module.description = "BlueZ 5 Bluetooth audio sink and source"
    module.version = "8.0"

既に /etc/bluetooth/audio.conf を修正し、blueman をインストールしようとしましたが、うまくいきませんでした。また、bluezとpulseaudioを再インストールしてみましたが、何も変わりませんでした。

何が問題なのか、それを解決する方法はありませんか?

active profile: "という行に基づいて、サウンドプロファイルが有効になりませんでした。

プロファイルを変更するのに使いやすいプログラムとして、pavucontrolがあります。sudo apt install pavucontrol -y`でインストールできます。その後、コマンドラインからpavucontrolを実行するか、Kubuntuを使用している場合はAlt+F2でpavucontrolを入力してください。

設定タブを選択し、ヘッドフォンのプロファイルを変更してみて、アップデートされるかどうかを確認してください。bluetoothのA2DPにはまだバグがあるようで、私がインストールした16.04のうち2台に影響が出ています。すでにA2DPと表示されている場合は、それをオフに変更し、bluetoothアプレットでデバイスを切断してから再接続してください。そして最後にプロファイルをA2DPに戻すとうまくいくはずです。

また、コマンドラインで以下の操作を行うと、ほとんどの操作が完了するはずです。以下の両方の pacmd コマンドの 2 の数字を現在のインデックス番号に置き換えてください。

pacmd set-card-profile 2 off
bluetoothctl
disconnect 50:C9:71:97:A1:86
connect 50:C9:71:97:A1:86
pacmd set-card-profile 2 a2dp_sink

もっと複雑ですが、プロファイルをオフにしてから a2dp に戻し、bluetooth デバイスの切断と接続を行わないという、同じことを自動で行う方法があります。

index=`pacmd list-cards | grep bluez_card -B1 | grep index | awk '{print $2}'`;pacmd set-card-profile $index off; pacmd set-card-profile $index a2dp_sink 

私は、同じことをするために、動作するがずさんなスクリプトを作りましたが、bluetoothヘッドフォンの切断と再接続も行いました。このスクリプトは、デバイスの切断と再接続のたびにインデックスが変化するため、プロファイルインデックスを取得します。これは、上に挙げたヘッドセットのデバイスIDでハードコードされています。

pacmd set-card-profile `pacmd list-cards | grep bluez_card -B1 | grep index | awk '{print $2}'` off; sleep 2 ; echo -e "disconnect 50:C9:71:97:A1:86\n quit"|bluetoothctl;sleep 5; echo -e "connect 50:C9:71:97:A1:86\n quit"|bluetoothctl; sleep 5; pacmd set-card-profile `pacmd list-cards | grep bluez_card -B1 | grep index | awk '{print $2}'` a2dp_sink

テストでは、デバイスがまだオーディオプロファイルを変更する準備ができていなかったため、スリープ時間を3秒ではなく5秒にしました。あなたの結果は数秒±5秒の違いがあるかもしれません。落とし穴の可能性について編集します。大きなスクリプトを2回実行しないと動作しない場合があることがわかりました。テストしていないので、スリープ時間を増やすことで解決するかどうかはわかりません。しかし、同じブランドのBTヘッドフォンを搭載した2台のマシンで使用したところ、ヘッドフォンで音を出すためのプロセスを自動化するという、想定された通りの効果が得られました。

この問題は最終的にはbluetoothパッケージにパッチが適用されるでしょうが、Ubuntuの新しいリリースや他のバージョンのLinuxでも再発しているようです。いずれにしても、お役に立てれば幸いです。

解説 (5)

この問題はUbuntu 16.04.1 LTSで発生しましたが、https://wiki.debian.org/BluetoothUser/a2dp に掲載されているGDMワークアラウンドを適用することで解決しました。

具体的には、/var/lib/gdm3/.config/pulse/client.confを作成/編集して、次のように読み替えます。

autospawn = no
daemon-binary = /bin/true

次に

sudo chown gdm:gdm /var/lib/gdm3/.config/pulse/client.conf

また、/etc/pulse/default.paにも追加しました。

load-module module-switch-on-connect

これは厳密には必要ないかもしれませんが。

再起動後、bluetoothマネージャーで接続すると、オーディオプロファイルをa2dp_sinkに切り替えることができました。

解説 (2)

lagerismiは、Jamie S.による回答をもとに、here on launchpadというスクリプトを投稿しました。

  • スクリプト内の変数でデバイスのMACアドレスを変更してください。(bluetoothctl --> Device で確認できます)

  • スクリプトを実行可能な状態にする chmod a-x bluetooth_headphone_reactivation.sh

起動時に自動的に実行されるようにします(ヘッドセットがすでにオンになっている場合のみ動作します)。

  • KDE'のコントロールパネルのスタート/シャットダウンスクリプトにスクリプトを追加してください。

手動で素早く実行するには

  • アプリケーションスターターにエントリを追加します(CTRL+ALT+H"のようなキーボードショートカットを設定したり、このスターターをウィンドウバーに固定することもできます)。

スクリプトは

#!/bin/sh
device_mac=''
pacmd set-card-profile `pacmd list-cards | grep bluez_card -B1 | grep index | awk '{print $2}'` off
sleep 2 
echo "disconnect $device_mac\n quit"|bluetoothctl
sleep 5
echo "connect $device_mac\n quit"|bluetoothctl
sleep 5
pacmd set-card-profile `pacmd list-cards | grep bluez_card -B1 | grep index | awk '{print $2}'` a2dp_sink
解説 (1)