Sin embargo, otra secuencia de comandos Sink Switcher
probado en Ubuntu 16.04
Pero este le permite cambiar solo el audio de la aplicación que desea.
USO: enfoque la aplicación que desea cambiar su sumidero y ejecute este script. ¡¡¡Eso es!!!
Este script detecta la aplicación que está enfocada, encuentra todos los audios que se reproducen desde ella y los cambia al siguiente sumidero disponible.
https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3
Explicando el guión
Necesitamos encontrar el PID de la aplicación en foco
Pero primero necesitamos el xid
xprop -root _NET_ACTIVE_WINDOW
Luego insértelo aquí $xid
para obtener el pid de la aplicación
xprop -id $xid _NET_WM_PID
Ahora necesitamos encontrar las entradas de sumidero relacionadas con ese PID
Primero linealicemos la salida del comando pacmd list-sink-inputs
para enumerar una entrada de sumidero por línea, mostrando su índice, sumidero y pid en la misma línea
pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2
analicémoslo paso a paso:
grep -E 'index:|sink:|process.id
solo mantenga líneas que contengan index:
, sink:
oprocess.id
tr '\n' ' '
une todas las líneas
tr -d '"'
elimina todos los "
personajes Necesario para obtener el pid sin comillas
sed -e 's/index:/\n/g'
reemplaza todas las index:
ocurrencias con un nuevo carácter de línea\n
tail -n +2
elimina la primera línea porque está vacía
Y el resultado es algo como esto:
180 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 3521
181 sink: 1 <alsa_output.pci-0000_00_01.0.analog-stereo> application.process.id = 2733
182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752
Analicemos una línea para entender lo que significa:
# 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752
182
es el índice de entrada de sumidero, 0
es el índice de sumidero y, 13752
al final, es el pid de la aplicación correspondiente
Luego iteramos a través de cada línea
... | while IFS= read -r line || [ -n "$line" ]; do
sink_input_pid=$(echo $line | awk '{print $NF}')
Y finalmente filtre solo el pid de entrada de sumidero que coincida con el pid de la aplicación enfocada
if [ $sink_input_pid = $app_pid ]; then
Extrayendo datos
Con awk
nosotros podemos obtener los elementos que necesitamos
sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')
Obtenga números de sumideros, para saber cuándo la rotación de sumideros debe reiniciarse desde 0.
sink_list_size=${#sink_list_array[@]}
Para encontrar el próximo sumidero, tenemos que recorrer la lista de sumideros para saber cuál coincide con current_sink_index y conocer el índice del próximo sumidero.
i=0
for sink in "${sink_list_array[@]}"; do
i=$((($i+1)%sink_list_size)) # i++ mod(#sinks)
if [ $sink = $current_sink_index ]; then
next_sink_index=${sink_list_array[i]}
break
fi
done
Y finalmente, movemos la entrada del receptor para jugar en next_sink_index
pacmd move-sink-input $sink_input_index $next_sink_index
Nota sobre Ubuntu 16.04:
Al configurar la tecla de acceso directo, no pude hacerlo funcionar con el administrador de accesos directos de ubuntu. Así que tuve que instalar compizconfig-settings-manager
sudo apt-get install compizconfig-settings-manager