web-dev-qa-db-ja.com

Pulseaudioを再起動せずに表示される正しいPulseaudioプロファイルを取得するにはどうすればよいですか?

USBヘッドセットマイクが入力デバイスのリストから消えることがあります。ヘッドセットの再接続は機能しませんが、Pulseaudioを殺すと機能します:

pulseaudio -k

Pulseaudioがバックアップを開始すると、USBヘッドセットが入力デバイスと出力デバイスの両方に表示され、正常に動作します。

問題は、Pulseaudioを強制終了すると、Pulseaudioを使用するすべてのアプリケーションがクラッシュするか、Pulseaudioが音なしのままになることです。つまり、Skype、Steam、XChat、実行中のビデオプレーヤー(SMPlayerがクラッシュする)、実行中のゲームなどを再起動する必要があります。

Pulseaudioの実行中のインスタンスを強制終了せずに、すべてのデバイスを強制的にリロードする方法はありますか?


興味深いことに、Pulseaudioを再起動してUSBヘッドセットを動作させると、ヘッドセットを再接続すると出力デバイスのみが表示されます。入力デバイスを表示するには、ヘッドセットを接続した状態でPulseaudioを再起動する必要があります。


編集:[構成]の下のpavuvontrolをチェックしました:

Screenshot

Pulseaudioを再起動すると、「+ Digital Stereo Input」(またはそのようなもの)で終わる追加のプロファイルがリストに表示され、デフォルトで選択されます。

7
Hubro

私はしばらくの間同じ問題に苦しんでいて、ついにそれを見る機会がありました。オーディオデバイスを担当するPulseaudioモジュールのアンロードとリロードがうまくいくことがわかりました。

手作業によるモジュールのアンロードとリロード

ターミナルウィンドウで、コマンドを入力します

pacmd list-cards

出力から、プロファイルが欠落しているオーディオデバイスを見つけます。あなたはおそらくいくつかのカードを取得し、正しいものを見つける必要があります。私のものは次のようになります。

[...]
index: 8
    name: <alsa_card.usb-Logitech_Logitech_USB_Headset-00-Headset>
    driver: <module-alsa-card.c>
    owner module: 27
    properties:
            alsa.card = "1"
            alsa.card_name = "Logitech USB Headset"
            [... more output ...]
[...]

出力から、「owner module」という行を探します。これがアンロードする必要があるモジュールですが、最初にそのパラメーターを調べる必要があるため、リロードできます。コマンドを入力してください

pacmd list-modules

カードを駆動するモジュールを見つけます。繰り返しますが、私の場合の出力の関連部分は次のようになります(indexマッチowner modulepacmd list-cards)の出力から:

[...]
index: 27
    name: <module-alsa-card>
    argument: <device_id="1" name="usb-Logitech_Logitech_USB_Headset-00-Headset" card_name="alsa_card.usb-Logitech_Logitech_USB_Headset-00-Headset" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes card_properties="module-udev-detect.discovered=1">
    used: 2
    load once: no
    properties:
    [... more output ...]
[...]

リロードするにはモジュール名と引数が必要です。

モジュールをアンロードするには、コマンドを入力します(module-indexを出力の適切な値に置き換えます)

pacmd unload-module module-index

モジュールをアンロードした後にリロードするには、コマンドを入力します

pacmd load-module module-name module-arguments

モジュール名およびモジュール引数pacmd list-modulesの出力からの値に置き換えます。山かっこは省略します。

これでモジュールがリロードされ、幸運にもヘッドセットのプロファイルが戻ってきます。

自動化の適用

上記の手順は、デバイスを頻繁にリセットする必要がある場合、モジュールインデックスが変化し続け、毎回調べる必要があるため、多くの作業です。最悪の事態を自動化するシェルスクリプトを自分で作成しました。

#!/bin/bash

if [ -z "$1" ]; then
  echo "Pulseaudio has these cards:"
  pacmd list-cards | grep 'name: '
  exit 0
fi

MODULE_INDEX=`pacmd list-modules | tac | grep -A 10 -e "argument: .*$1" | grep 'index:' | head -n 1 | cut -d ':' -f 2 | tr -d ' '`
MODULE_NAME=`pacmd list-modules | tac | grep -A 10 -e "argument: .*$1" | grep 'name:' | head -n 1 | cut -d ':' -f 2 | tr -d '<>'`
MODULE_ARGUMENTS=`pacmd list-modules | tac | grep -e "argument: .*$1" | head -n 1 | cut -d ':' -f 2 | tr -d '<>'`
echo "Module index is $MODULE_INDEX"
echo "Module name: $MODULE_NAME"
echo "Module args: $MODULE_ARGUMENTS"

if [ -z "$MODULE_INDEX" ]; then echo "Could not find module index"; exit 0; fi
if [ -z "$MODULE_NAME" ]; then echo "Could not find module name"; exit 0; fi
if [ -z "$MODULE_ARGUMENTS" ]; then echo "Could not find module arguments"; exit 0; fi

echo "Unloading module"
pacmd unload-module $MODULE_INDEX
echo ""
echo "Reloading module"
pacmd load-module $MODULE_NAME $MODULE_ARGUMENTS
echo ""

引数なしで実行すると、スクリプトはPulseaudioが知っているカードをリストします。カードの名前の一部が引数として指定されると、スクリプトは関連するPulseaudioモジュールのアンロードとリロードを試みます。

6
juise