web-dev-qa-db-ja.com

シェルを使用して異なるオーディオ出力ハードウェアを切り替えるにはどうすればよいですか?

ラップトップをスピーカー付きの外部モニターで使用しています。モニターがHDMI経由で接続されている場合、通常のラップトップオーディオ出力とモニター出力を切り替えることができます(GUIを使用:サウンド設定->ハードウェア)。

私はこの手順を何度も繰り返し、自動化できるのか、それともシェルを使用してより高速に実行できるのか疑問に思い始めました。

私のディストリビューションはgnome 3を搭載したUbuntu 12.04です。

編集:

Pacmdを使用してみましたが、list-sinksを使用すると、現在使用しているデバイスのみが表示されます。

pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.hdmi-stereo>

GUIからの切り替え後:

pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>

そして、私がそれを変更しようとすると、次のようになります:

pacmd set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
Welcome to PulseAudio! Use "help" for usage information.
Sink alsa_output.pci-0000_00_1b.0.hdmi-stereo does not exist.
34

この場合、カードは常に同じです。スイッチと別のものとの間で変化しているのは「カードプロファイル」です。

したがって、実際に機能したソリューションは次のとおりです。

pacmd set-card-profile <cardindex> <profilename>

私の場合、私はすべてのカードプロファイルを見つけました:

pacmd list-cards

そして、私はモニターとラップトップスピーカーを切り替えることができた後:

pacmd set-card-profile 0 output:hdmi-stereo

そして:

pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo

ここで、0はカードのインデックスです。

pacmd list-cards
Welcome to PulseAudio! Use "help" for usage information.
>>> 1 card(s) available.
    index: 0
    name: <alsa_card.pci-0000_00_1b.0>

最後に、切り替えを高速化するために、.bashrcファイルに2つのエイリアスを設定しました。

alias audio-hdmi='pacmd set-card-profile 0 output:hdmi-stereo+input:analog-stereo'
alias audio-laptop='pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo'

このようにして、シェルから入力するモニターまたはラップトップ(ヘッドフォン)からのオーディオを切り替えることができます:audio-hdmiまたはaudio-laptop

29

サウンド出力を切り替えることができる小さなインジケーターアプレットを作成しました。シェルスクリプトはありませんが、おそらくあなたや他の読者に役立つでしょう。

https://github.com/lkettenb/sound-output-switcher

Screenshot

6
Lukas

前のスクリプトに基づいて、オーディオだけでなくビデオ出力も切り替える非常に小さなスクリプトを作成しました。 disperを使用して表示を切り替えます。

これがコードです:

#!/bin/bash

CURRENT_PROFILE=$(pacmd list-cards | grep "active profile" | cut -d ' ' -f 3-)

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo>" ]; then
        pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo"
        disper -s
else 
        pacmd set-card-profile 0 "output:hdmi-stereo"
        disper -S        
fi

私にとっては、ディスプレイのクローンを作成したくないので特に便利です。私はどちらか一方を使用します。特定のシステムにオーディオプロファイルを適合させる必要がある場合があります。

3
user56655

通知アプレットを実装するLukasのpythonスクリプト( https://github.com/lkettenb/sound-output-switcher ))は、通知アプレットを実装するために適切に機能します。 appindicatorパッケージ。これは、

Sudo apt-get install python-appindicator
2
P.Windridge

pactlを使用できます。詳細については、そのmanページを参照してください。

2
favadi

次のpython次のスクリプトを作成しました:

  1. IDに関係なく、デフォルトのデバイスをリストの次のデバイスに(ラップアラウンドで)切り替えます
  2. 実行中のすべてのアプリケーションをこのデバイスに移動します。
  3. デバイス名を含む通知をGUIに送信します。
#!/usr/bin/env python3
import subprocess
# Toggle default device to the next device (wrap around the list)
cards_info = subprocess.run(['pacmd','list-sinks'], stdout=subprocess.PIPE)
card_indexes = subprocess.run(['grep', 'index'], stdout=subprocess.PIPE, input=cards_info.stdout)
indexes_list = card_indexes.stdout.decode().splitlines()
card_descriptions = subprocess.run(['grep', 'device.description'], stdout=subprocess.PIPE, input=cards_info.stdout)
indices = [i for i, s in enumerate(indexes_list) if '*' in s]
if (len(indices) != 1):
    print("Error finding default device")
    exit(1)
default_index = indices[0]
next_default = 0
if (default_index != (len(indexes_list) - 1)):
    next_default = default_index + 1
next_default_index =  (indexes_list[next_default].split("index: ",1)[1])
subprocess.run(['pacmd','set-default-sink %s' %(next_default_index)], stdout=subprocess.PIPE)

# Move all existing applications to the new default device
inputs_info = subprocess.run(['pacmd','list-sink-inputs'], stdout=subprocess.PIPE)
inputs_indexes = subprocess.run(['grep', 'index'], stdout=subprocess.PIPE, input=inputs_info.stdout)
inputs_indexes_list = inputs_indexes.stdout.decode().splitlines()
for line in inputs_indexes_list:
    input_index =  (line.split("index: ",1)[1])
    subprocess.run(['pacmd','move-sink-input %s %s' %(input_index, next_default_index)], stdout=subprocess.PIPE)

# Send notification to the GUI
descriptions_list = card_descriptions.stdout.decode().splitlines()
if (len(descriptions_list) == len(indexes_list)):
    description =  (descriptions_list[next_default].split("= ",1)[1])[1:-1]
    args = ["notify-send", "Default audio card changed", 'Default audio card was set to %s' %(description)]
    subprocess.run(args, stdout=subprocess.PIPE)

スクリプトにキーボードショートカットを割り当てたので、私の人生は今幸せです

1
Nimrod.s

このスクリプトを試すことができます: https://github.com/giner/helplinux/tree/master/scripts/switch-sound

Ubuntu 10.04-13.04およびArch Linuxでテスト済み

役に立つ場合。私はBluetoothヘッドフォンを持っているので、ヘッドセットとa2dpプロファイルの切り替えを設定する必要がありました。これらの関数を追加することで解決しました:

talk() {
  card=$(pacmd list-cards | grep 'name:' | grep bluez | cut -d: -f2 | sed -e 's/[< >]//g')
  pacmd set-card-profile $card headset_head_unit
}

mus() {
  card=$(pacmd list-cards | grep 'name:' | grep bluez | cut -d: -f2 | sed -e 's/[< >]//g')
  pacmd set-card-profile $card a2dp_sink
}
0
brutallord

私が here (おそらく重複)に言ったように、 Sound Switcher Indicator (PPAの追加が必要)の代替:

一列に

私の場合は_hdmi-stereo-extra1+input_プロファイルだったので、1行で[[ $(pacmd list-cards | grep "active profile" | cut -d " " -f 3-) = "<output:hdmi-stereo-extra1+input:analog-stereo>" ]] && pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo" || pacmd set-card-profile 0 "output:hdmi-stereo-extra1+input:analog-stereo"になります。

カスタムショートカット を使用して、_bash -c_で実行できます(他のショートカットとの競合がある場合は警告が表示されます):

enter image description here

また、aliasを_.bashrc_に追加することもできます。

スクリプトで

@ user829996(ここでは@ user56655)の回答に基づいていくつかの変更を加えました:

_#!/bin/bash
set -euo pipefail # strict mode

activeProfile() { pacmd list-cards | grep "active profile" | cut -d " " -f 3-; }
CURRENT_PROFILE="$(eval activeProfile)"

# If it doesn't work run  pacmd list-cards  and try the other outputs from profile section
ANALOG_PROFILE="output:analog-stereo+input:analog-stereo"
HDMI_PROFILE="output:hdmi-stereo-extra1+input:analog-stereo"

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo-extra1+input:analog-stereo>" ] ; then
  pacmd set-card-profile 0 "$ANALOG_PROFILE"
else
    pacmd set-card-profile 0 "$HDMI_PROFILE"
fi

activeProfile
_
0
Pablo A