How to redirect the pulseaudio's default output to the bluetooth headset with a simple script?

Just a note for myself.

#!/bin/bash
#This script connects yours bluetooth headset to your computer and redirects the default pulseaudio sound output to your headset.
#This script has been tested with Linux Mint 18.3, lenovo x220, Phonak Compilot Air II (bluetooth connection module for hearing aid).
#If you'd like this to work comfortably, I suggest you create a launch icon on your desktop or tray.
#The listed packages and dependencies is necessary for running:
#bash, pulseaudio-utils, bluez, sed, libnotify-bin

#The condition of script operation is that you define the identifier of the device you want to connect.
#The device must be paired beforehand!
#Such as blueman bluetooth device manager can be perfectly used for this.
bluetooth_id="00:0F:59:5A:60:7B"

#connecting to bluetooth headphone
bluetoothctl <<< "connect $bluetooth_id" >sound_output_redirect.log 2>&1

#storing the device name
bluetooth_name=`grep -e "Device $bluetooth_id" sound_output_redirect.log | cut -d':' -f 6`

#Convert the ID to match the format used by pacmd.
bluetooth_id=`echo "$bluetooth_id" | sed 's/:/_/g'`

#change the default sink
pacmd set-default-sink bluez_sink.$bluetooth_id >>sound_output_redirect.log 2>&1

#Debugging.
connection_error=`grep -e "$bluetooth_id does not exist" sound_output_redirect.log`

if [[ $connection_error == "" ]]
then
#A notification will be displayed if the connection and redirect are successfully established.
notify-send -i notification-audio-volume-high "Sound output switched to" "${bluetooth_name:3}"
else
#Notification displayed if there is a connection error.
notify-send -i notification-audio-volume-high "Sound output NOT switched" "${bluetooth_name:3} not found."
fi

Hozzászólások

Ha már úgyis bash és bashizm, akkor még a sed is megspórolható:

e helyett:

bluetooth_id=`echo "$bluetooth_id" | sed 's/:/_/g'`

Ez is írható:

bluetooth_id="${bluetooth_id//:/_}"

Én személy szerint az if sorában is idézőjelek közé tenném a változóhivatkozást. Ráadásul a man bash szerint amit írsz, annál a formánál a $connection_error stringet pattern matching-ként fogja kezelni a shell. És amit csinálni akarsz, arra pont van a test parancsnak operátora:

if [ -z "$bluetooth_id" ]

(De ez persze csak kötekedés.)

Ehhez kell bármiféle script? Én a keverőben azt mondtam, hogy küldje az audio stream-et bluetooth-on a mikro hifi erősítőmre, azóta emlékszik rá. Jó, mondjuk programozni én is szeretek..., ha muszáj. ;)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Csak kontárkodom, de köszönöm az építőjellegű hozzászólásokat.
Két kérdés:
1. A bluetooth_name=`grep -e "Device $bluetooth_id" sound_output_redirect.log | cut -d':' -f 6` sornál a bemenet így néz ki:
[.[0;92mNEW.[0m] Device 00:0F:59:5A:60:7B Phonak Compilot Air II
Ebből vágnám ki a cut segítségével az eszköz nevét. Van esetleg valami kevésbé kókány megoldás ennél? Olyasmire gondolok, hogy kivágom az 00:0F:59:5A:60:7B + "1 karakter" utáni részt.

2. A keverőn beállítom alatt mit értsek?
Ha a mate-volume-control felületén módosítom a kimenetet az nem jegyez meg semmit.
Amint kisétálok a bluetooth hatósugarából vége a dalnak.
Ha újra csatlakoztatom is kézzel a headsetet/hallókészüléket (nem jellemző, hogy magától megteszi), a kimenet marad a laptop hangszóróin. Ennek a kétlépéses grafikus felületen való rendszeres matatásnak a kiváltására követtem el a fenti rettenetet.

Amit a korábbi sed-re vonatkozó részben írtam, az a shell konstrukció ide is alkalmas:

bluetooth_name=`grep -e "Device $bluetooth_id" sound_output_redirect.log`
bluetooth_name="${bluetooth_name//*Device $bluetooth_id /}"

A grep-et ezzel nem spóroltuk meg, de a cut-ot igen. Félsiker. (Van itt egy ujjgyakorlatom arról, hogy lehet grep-et shell-beli eszközzel helyettesíteni, lehet ezt még fokozni ;-) )

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

2. pavucontrol

Röptében, dinamikusan nem tudom, mit csinál. Ha elveszti a bluetooth kapcsolatot, akkor a notebook saját hangszóróira teszi át a hangot. Viszont legközelebb, ha van bluetooth link, megint ott lesz a hang. Viszont valakinek valamikor kell kezdeményezni a kapcsolódást. Vagy a másik oldalnak, vagy a PC-nek. Ez megtörténik automatikusan a hangszerver elindulásakor, vagy a másik oldal kezdeményezésére. Már futó pulseaudio esetében van valami bluetooth-os kisalkalmazás, amelyen lehet neki mondani, hogy kapcsolódjon. Legalább is Fedorán így van.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Nekem ez működik, inkább az a baj, hogy szaggat a hang. (Solus OS)

Mindig szaggat, vagy csak néha?

Nálam a helyzet: A nappaliban van a bluetooth adó. A konyhában egy hangfal. Ha a mosogató mellé állok, akkor szaggat a hang. Ha a nappaliban az adót kb. 10 cm-rel arrébb rakom, akkor a csak a hangfal mellett állva szaggat a hang. Ha megint más helyre rakom az adót, akkor az asztal mellett ülve szaggat a hang.

Egy lakásban a többutas terjedés teljesen normális jelenség, és az eredményezhet ilyet. Szerencsére sikerült találnom az adónak olyan helyett, hogy bárhova állok/ülök a konyhában, nem szaggat a hang.