When the TV is turned on, the audio plays through the TV, so that the TV remote volume control works.
When the TV is turned off, I want the audio to play through analog audio out so that I can still hear it.
I use the PulseEIGHT CEC controller and cec-client program to talk to the TV.
I have cec-client run as root under SOCAT to broadcast cec-data by UDP.
I have another SOCAT process running as the logged in user to pick up the data, monitor it for TV on/off status and move the playing audio streams.
It works, but is very rough.
In rc.local: /usr/local/bin/cec -s &
In gnome/cinnamon startup programs: /usr/local/bin/cec
And then the script:
#! /bin/bash
MYADDR=8 # because it is. I should probably read this from the cec-client output
# 0 and 1 and the audio device indexes associated with the device names
# later I will normalise these too, but "pacmd list" will show yours.
ext() {
pacmd set-default-sink alsa_output.pci-0000_00_1f.3.analog-stereo
for input in $( pacmd list-sink-inputs | sed -e 's/index: //;t;d' )
do pacmd move-sink-input $input 1
done
}
hdmi() {
pacmd set-default-sink alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1
for input in $( pacmd list-sink-inputs | sed -e 's/index: //;t;d' )
do pacmd move-sink-input $input 0
done
}
cec_client() {
socat -u UDP4-RECV:4224,reuseaddr - | while read type _ _ dir rest
do # echo "$type $dir :$rest"
case "$rest" in
"0f:36") echo "POWER OFF" ; ext ;;
"(0): power status changed"*"to 'on'") echo "POWER ON" ; hdmi ;;
# *"($MYADDR) as inactive source"*) echo INACTIVE ; ext ;;
# *"($MYADDR) the active source"*) echo ACTIVATED ; hdmi ;;
# *active*) echo "$type $dir $rest" ;;
# mmkeys-mate2mpris2
esac
done
}
cec_server() {
read hostname _ < <( hostname )
hex_hostname=$( echo -n "${hostname%.*}" | od -tx1 | sed -e '1!d;s/0* //' )
<<< "tx 80 47 $hex_hostname" exec -a CEC socat -u -L/tmp/cec \
EXEC:'cec-client -t p -p 2' UDP-DATAGRAM:127.0.0.1:4224,broadcast &
wait
}
main() {
if test "$1" = "-s"
then cec_server
else cec_client
fi
}
main "$@"
No comments:
Post a Comment