ラップトップをスピーカー付きの外部モニターで使用しています。モニターが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.
この場合、カードは常に同じです。スイッチと別のものとの間で変化しているのは「カードプロファイル」です。
したがって、実際に機能したソリューションは次のとおりです。
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
サウンド出力を切り替えることができる小さなインジケーターアプレットを作成しました。シェルスクリプトはありませんが、おそらくあなたや他の読者に役立つでしょう。
前のスクリプトに基づいて、オーディオだけでなくビデオ出力も切り替える非常に小さなスクリプトを作成しました。 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
私にとっては、ディスプレイのクローンを作成したくないので特に便利です。私はどちらか一方を使用します。特定のシステムにオーディオプロファイルを適合させる必要がある場合があります。
通知アプレットを実装するLukasのpythonスクリプト( https://github.com/lkettenb/sound-output-switcher ))は、通知アプレットを実装するために適切に機能します。 appindicatorパッケージ。これは、
Sudo apt-get install python-appindicator
pactl
を使用できます。詳細については、そのmanページを参照してください。
次のpython次のスクリプトを作成しました:
#!/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)
スクリプトにキーボードショートカットを割り当てたので、私の人生は今幸せです
このスクリプトを試すことができます: 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
}
私が 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
_で実行できます(他のショートカットとの競合がある場合は警告が表示されます):
また、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
_