マイユースケース:
私はホームオフィスで働いており、ヘッドフォンといくつかのWeb会議サービスを使用して、同僚との継続的なコミュニケーションを維持しています。外部の騒音に気を散らしたり、迷惑にならないように、同じコンピュータで音楽を再生します。
ハイファイスピーカーで音楽を再生したい。これにより、コミュニケーションを妨げない慎重な背景音楽を再生できます。さらに、集中力も向上するのに役立ちます。
しかし、このアプリはpavucontrol
デフォルトの出力を切り替えないため、問題があるようです(後で音楽プレーヤーのみが別のスピーカーにルーティング)。他のミキサーアプリ(私の場合はCinnamon "Sound"アプレット)を使用し、2つのミキサーを切り替えてすべてを設定する必要があります。何らかの理由でHi-Fi接続が切断されたり音楽が途切れたりする場合は、この操作をすべて繰り返してください。
だから私は主に特定のアプリを使って音楽を再生するので、方法を見つけました。早く路線ただこのアプリは私のハイファイでサウンドを出力します。
答え1
次のbashスクリプトは私のシナリオの問題を解決しました。私は音楽を再生するためにのみBraveブラウザを使用します(他のコンテンツには別のブラウザを使用します)。私のハイファイは、Bluetooth経由で接続されたサラウンドレシーバーです。
#!/bin/bash
# Collect all sinks
sinkList=$(pactl list sinks | tr '\n' '\r' | perl -pe 's/Sink #([0-9]+).+?device\.description = "([^\r]+)"\r.+?(?=Sink #|$)/\1:"\2",/g' | tr '\r' '\n')
IFS="," read -a sinksArray <<< "$sinkList"
# Is our Hi-fi sink available? → Use for loop with indexes to handle spaces in names
for ((i = 0; i < ${#sinksArray[@]}; i++)); do
sink="${sinksArray[$i]}"
#echo "sink found: $sink"
# Search for this output device's name
[[ "$sink" =~ "Philips HTB" ]] && hifiSinkIndex=$(echo $sink | cut -d':' -f1)
done
if [[ $hifiSinkIndex ]]; then
echo "Hi-fi sink has index $hifiSinkIndex"
# Collect all sound streams
musicSourcesList=$(pactl list sink-inputs | tr '\n' '\r' | perl -pe 's/Sink Input #([0-9]+).+?application\.process\.binary = "([^\r]+)"\r.+?(?=Sink Input #|$)/\1:\2\r/g' | tr '\r' '\n')
for soundSource in $musicSourcesList; do
binary=$(echo $soundSource | cut -d':' -f2);
index=$(echo $soundSource | cut -d':' -f1);
#echo "index: $index, binary: $binary";
# Brave browser is our music player, so we only care about that
if [[ "$binary" == "brave" ]]; then
echo "moving Brave output to $hifiSinkIndex"
pactl move-sink-input $index $hifiSinkIndex
fi
done
else
echo "Hi-fi sink was not found"
fi
お探しのプレゼンター名とアプリケーションを見つけるためにスクリプトを簡単に調整できます。
必要なときにのみ実行をクリックできるように、このスクリプトのショートカットをパネルに追加しました。
pactl
包装が付属していますpulseaudio-utils
。を使用すると、pacmd
コマンドは似ています。
ソースとインスピレーション: