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