diff options
-rwxr-xr-x | encode-jack-dls.sh | 292 | ||||
-rwxr-xr-x | encode-jack.sh | 66 |
2 files changed, 300 insertions, 58 deletions
diff --git a/encode-jack-dls.sh b/encode-jack-dls.sh new file mode 100755 index 0000000..44eb62a --- /dev/null +++ b/encode-jack-dls.sh @@ -0,0 +1,292 @@ +#!/bin/bash +# +# Encode programme using mplayer, connect through JACK +# to dabplus-enc or toolame +# +# Read webstream from URL using mplayer +# Launch dabplus-enc or toolame encoder +# connect both through JACK +# monitor processes, and restart if necessary +# Optionally send an email when restart happens +# +# Extract ICY Text from stream and use it for DLS + +printerr() { + echo -e "\033[01;31m$1\033[0m" +} + +printmsg() { + echo -e "\033[01;32m$1\033[0m" +} + +set -u + +# check number of arguments +if [[ "$#" < 3 ]] ; then + echo "Usage $0 url jack-id destination [volume] [encoder]" + echo "The volume setting is optional" + exit 1 +fi + +if [[ "$#" > 2 ]] ; then + URL=$1 + ID=$2 + DST=$3 +fi + +if [[ "$#" == 4 ]] ; then + VOL=$4 + ENC="dabplus-enc" +elif [[ "$#" == 5 ]] ; then + VOL=$4 + ENC=$5 +else + VOL="0" + ENC="dabplus-enc" +fi + + +BITRATE=80 +RATE=32 #kHz + +if [[ "$ENC" == "toolame" && "RATE" == "32" ]] ; then + echo "32kHz not supported for toolame" + exit 1 +fi + +DLSDIR=site/dls +SLIDEDIR=site/slide + +encoderalive=0 +mplayerpid=0 +encoderpid=0 +motencoderpid=0 +running=1 + +mplayer_ok=0 +encoder_ok=0 + +# The trap for Ctrl-C +sigint_trap() { + printerr "Got Ctrl-C, killing mplayer and encoder" + running=0 + + if [[ "$mplayerpid" != "0" ]] ; then + kill -TERM $mplayerpid + sleep 2 + kill -KILL $mplayerpid + fi + + if [[ "$encoderpid" != "0" ]] ; then + kill -TERM $encoderpid + sleep 2 + kill -KILL $encoderpid + fi + + if [[ "$motencoderpid" != "0" ]] ; then + kill -TERM $motencoderpid + sleep 2 + kill -KILL $motencoderpid + fi + + printmsg "Goodbye" + exit +} + +trap sigint_trap SIGTERM +trap sigint_trap SIGINT + +while [[ "$running" == "1" ]] +do + if [[ "$mplayerpid" == "0" ]] ; then + if [[ "$VOL" == "0" ]] ; then + mplayer -quiet -af resample=${RATE}000:0:2 -ao jack:name=$ID $URL | \ + ./icy-info.py $DLSDIR/${ID}.dls $DLSDIR/${ID}-default.dls & + mplayerpid=$! + else + mplayer -quiet -af resample=${RATE}000:0:2 -af volume=$VOL -ao jack:name=$ID $URL | \ + ./icy-info.py $DLSDIR/${ID}.dls $DLSDIR/${ID}-default.dls & + mplayerpid=$! + fi + + printmsg "Started mplayer with pid $mplayerpid" + + # give some time to mplayer to set up and + # wait until port becomes visible + timeout=10 + + while [[ "$mplayer_ok" == "0" ]] + do + printmsg "Waiting for mplayer to connect to jack ($timeout)" + sleep 1 + mplayer_ok=$(jack_lsp $ID:out_0 | wc -l) + + timeout=$(( $timeout - 1 )) + + if [[ "$timeout" == "0" ]] ; then + printerr "mplayer doesn't connect to jack !" + kill $mplayerpid + break + fi + done + else + printmsg "No need to start mplayer: $mplayerpid" + fi + + if [[ "$mplayer_ok" == "1" && "$encoder_ok" == "0" ]] ; then + if [[ "$ENC" == "dabplus-enc" ]] ; then + dabplus-enc -j ${ID}enc -l \ + -p 34 -P $DLSDIR/${ID}.pad \ + -b $BITRATE -r ${RATE}000 -f raw -a -o $DST & + encoderpid=$! + elif [[ "$ENC" == "toolame" ]] ; then + toolame -b $BITRATE -s $RATE \ + -p 34 -P $DLSDIR/${ID}.pad \ + -j ${ID}enc $DST & + encoderpid=$! + fi + + # give some time to the encoder to set up and + # wait until port becomes visible + timeout=10 + + encoder_connected=0 + + while [[ "$encoder_connected" == "0" ]] + do + printmsg "Waiting for encoder to connect to jack ($timeout)" + sleep 1 + encoder_connected=$(jack_lsp ${ID}enc:input0 | wc -l) + + timeout=$(( $timeout - 1)) + + if [[ "$timeout" == "0" ]] ; then + printerr "encoder doesn't connect to jack !" + kill $encoderpid + break + fi + done + + if [[ "$encoder_connected" == "1" ]] ; then + jack_connect ${ID}:out_0 ${ID}enc:input0 && \ + jack_connect ${ID}:out_1 ${ID}enc:input1 + connect_ret=$? + + if [[ "$connect_ret" == "0" ]] ; then + encoder_ok=1 + else + encoder_ok=0 + fi + + if [[ "$encoder_ok" == "1" ]] ; then + printmsg "Started encoder with pid $encoderpid" + else + if [[ "$encoderpid" != "0" ]] ; then + kill -TERM $encoderpid + fi + fi + fi + fi + + if [[ "$encoder_ok" == "1" && "$motencoderpid" == "0" ]] ; then + # Check if the slides folder exists, and start mot-encoder accordingly + if [[ -d "$SLIDEDIR/$ID" ]] ; then + mot-encoder -o $DLSDIR/${ID}.pad -t $DLSDIR/${ID}.dls -p 34 -v \ + -e -d $SLIDEDIR/${ID} & + motencoderpid=$! + else + mot-encoder -o $DLSDIR/${ID}.pad -t $DLSDIR/${ID}.dls -p 34 -v & + motencoderpid=$! + fi + + printmsg "Started mot-encoder with pid $encoderpid" + fi + + + sleep 5 + + checkloop=1 + while [[ "$checkloop" == "1" ]] + do + sleep 2 + + kill -s 0 $mplayerpid + if [[ "$?" != "0" ]] ; then + # mplayer died + # we must kill jack-stdout, because we cannot reconnect it + # to a new mplayer, since we do not know the jack-stdout name. + # And it has no cmdline option to set one, Rrrrongntudtjuuu! + if [[ "$encoderpid" != "0" ]] ; then + kill -TERM $encoderpid + fi + + if [[ "$motencoderpid" != "0" ]] ; then + kill -TERM $motencoderpid + fi + + # mark as dead + mplayerpid=0 + mplayer_ok=0 + encoderpid=0 + encoder_ok=0 + motencoderpid=0 + + checkloop=0 + + printerr "Mplayer died" + fi + + if [[ "$encoderpid" != "0" ]] ; then + kill -s 0 $encoderpid + if [[ "$?" != "0" ]] ; then + # the encoder died, + # no need to kill the mplayer, we can reconnect to it + + if [[ "$motencoderpid" != "0" ]] ; then + kill -TERM $motencoderpid + fi + + motencoderpid=0 + encoderpid=0 + encoder_ok=0 + + checkloop=0 + + printerr "Encoder died" + fi + fi + + if [[ "$motencoderpid" != "0" ]] ; then + kill -s 0 $motencoderpid + if [[ "$?" != "0" ]] ; then + # mot-encoder died + # let's try restarting it + + motencoderpid=0 + + checkloop=0 + + printerr "mot-encoder died" + fi + fi + done + + MAILTO=$(cat site/mail-warning.txt) + + if [[ "$MAILTO" != "" ]] ; then + NOW=$(date) + + mail -s "Encoder $ID restart $URL" $MAILTO << EOF +The encoder id:$ID +encoding $URL -> $DST using encode-jack-dls was restarted at +$NOW + +mplayer ok? $mplayer_ok + +EOF + + fi + sleep 5 + +done + diff --git a/encode-jack.sh b/encode-jack.sh index ab6aa3a..e8fd63c 100755 --- a/encode-jack.sh +++ b/encode-jack.sh @@ -8,8 +8,6 @@ # connect both through JACK # monitor processes, and restart if necessary # Optionally send an email when restart happens -# -# Extract ICY Text from stream and use it for DLS printerr() { echo -e "\033[01;31m$1\033[0m" @@ -47,15 +45,16 @@ fi BITRATE=80 -RATE=48 #kHz +RATE=32 #kHz -DLSDIR=site/dls -SLIDEDIR=site/slide +if [[ "$ENC" == "toolame" && "RATE" == "32" ]] ; then + echo "32kHz not supported for toolame" + exit 1 +fi encoderalive=0 mplayerpid=0 encoderpid=0 -motencoderpid=0 running=1 mplayer_ok=0 @@ -78,12 +77,6 @@ sigint_trap() { kill -KILL $encoderpid fi - if [[ "$motencoderpid" != "0" ]] ; then - kill -TERM $motencoderpid - sleep 2 - kill -KILL $motencoderpid - fi - printmsg "Goodbye" exit } @@ -95,12 +88,10 @@ while [[ "$running" == "1" ]] do if [[ "$mplayerpid" == "0" ]] ; then if [[ "$VOL" == "0" ]] ; then - mplayer -quiet -af resample=${RATE}000:0:2 -ao jack:name=$ID $URL | \ - ./icy-info.py $DLSDIR/${ID}.dls $DLSDIR/${ID}-default.dls & + mplayer -quiet -af resample=${RATE}000:0:2 -ao jack:name=$ID $URL & mplayerpid=$! else - mplayer -quiet -af resample=${RATE}000:0:2 -af volume=$VOL -ao jack:name=$ID $URL | \ - ./icy-info.py $DLSDIR/${ID}.dls $DLSDIR/${ID}-default.dls & + mplayer -quiet -af resample=${RATE}000:0:2 -af volume=$VOL -ao jack:name=$ID $URL & mplayerpid=$! fi @@ -131,12 +122,10 @@ do if [[ "$mplayer_ok" == "1" && "$encoder_ok" == "0" ]] ; then if [[ "$ENC" == "dabplus-enc" ]] ; then dabplus-enc -j ${ID}enc -l \ - -p 34 -P $DLSDIR/${ID}.pad \ -b $BITRATE -r ${RATE}000 -f raw -a -o $DST & encoderpid=$! elif [[ "$ENC" == "toolame" ]] ; then toolame -b $BITRATE -s $RATE \ - -p 34 -P $DLSDIR/${ID}.pad \ -j ${ID}enc $DST & encoderpid=$! fi @@ -183,21 +172,6 @@ do fi fi - if [[ "$encoder_ok" == "1" && "$motencoderpid" == "0" ]] ; then - # Check if the slides folder exists, and start mot-encoder accordingly - if [[ -d "$SLIDEDIR/$ID" ]] ; then - mot-encoder -o $DLSDIR/${ID}.pad -t $DLSDIR/${ID}.dls -p 34 -v \ - -e -d $SLIDEDIR/${ID} & - motencoderpid=$! - else - mot-encoder -o $DLSDIR/${ID}.pad -t $DLSDIR/${ID}.dls -p 34 -v & - motencoderpid=$! - fi - - printmsg "Started mot-encoder with pid $encoderpid" - fi - - sleep 5 checkloop=1 @@ -215,16 +189,11 @@ do kill -TERM $encoderpid fi - if [[ "$motencoderpid" != "0" ]] ; then - kill -TERM $motencoderpid - fi - # mark as dead mplayerpid=0 mplayer_ok=0 encoderpid=0 encoder_ok=0 - motencoderpid=0 checkloop=0 @@ -237,11 +206,6 @@ do # the encoder died, # no need to kill the mplayer, we can reconnect to it - if [[ "$motencoderpid" != "0" ]] ; then - kill -TERM $motencoderpid - fi - - motencoderpid=0 encoderpid=0 encoder_ok=0 @@ -250,20 +214,6 @@ do printerr "Encoder died" fi fi - - if [[ "$motencoderpid" != "0" ]] ; then - kill -s 0 $motencoderpid - if [[ "$?" != "0" ]] ; then - # mot-encoder died - # let's try restarting it - - motencoderpid=0 - - checkloop=0 - - printerr "mot-encoder died" - fi - fi done MAILTO=$(cat site/mail-warning.txt) @@ -273,7 +223,7 @@ do mail -s "Encoder $ID restart $URL" $MAILTO << EOF The encoder id:$ID -encoding $URL -> $DST using mplayer and jack was restarted at +encoding $URL -> $DST using encode-jack was restarted at $NOW mplayer ok? $mplayer_ok |