#!/bin/sh -u # # Simple jukebox. # Runs a player in the background, reads keyword selections and commands # in the foreground. # - Cameron Simpson 01jun2002 # : ${TMPDIR:=/tmp} : ${AUDIODIR:=$HOME/ogg} trace=set-x playcopy= dorandom= ptns= cmd=`basename "$0"` usage="Usage: $cmd [-C]" [ $# -gt 0 ] && [ "x$1" = x-C ] && { playcopy=1; shift; } ##statedir= ##trap '[ -n "$statedir" ] && rm -r "$statedir"' 0 1 2 13 15 ##statedir=`mkdirn "$TMPPDIR"` || exit 1 playpid= runplayer() { ( subkill() { [ -z "$subproc" ] && return 1 dodelay= kill $subproc || return 1 while printf .; usleep 200 && kill -0 $subproc do : done echo return 0 } ok=1 subproc= tmpauf= trap 'ok=; subkill; exit' 1 2 15 trap subkill USR1 playlist=$TMPDIR/$cmd.$$ while [ $ok ] do if [ $dorandom ] then auropt=-r echo "Selecting randomly, patterns are: $ptns" else auropt= echo "Selecting sequentially, patterns are: $ptns" fi $trace aulist $auropt $ptns >"$playlist" if [ -s "$playlist" ] then exec <"$playlist" rm -f "$playlist" while [ $ok ] && read -r auf do [ -f "$auf" -a -s "$auf" ] \ || { echo "$cmd: missing audio file: $auf" >&2 continue } echo "[$auf]" dodelay= if [ $playcopy ] then tmpauf=$TMPDIR/$cmd$$`basename "$auf"` (set -x; cp "$auf" "$tmpauf") && auf=$tmpauf fi case "$auf" in *.ogg) dodelay=1 $trace ogg123 -d oss "$auf" & subproc=$! ;; *.mp3) dodelay=1 $trace mpg123 -b 2048 "$auf" & subproc=$! ;; *) echo "$cmd: how to play $auf ?" >&2 continue ;; esac wait subproc= [ $playcopy ] && rm -f "$tmpauf" [ $ok ] && [ $dodelay ] && sleep 2 done else echo "$cmd: no hits found for keywords: $ptns" >&2 ok= fi done ) & playpid=$! } stopplayer() { [ -n "$playpid" ] && { kill "$playpid"; playpid=; } } pauseplayer() { [ -n "$playpid" ] && { kill -STOP "$playpid"; playpid=; } } contplayer() { [ -n "$playpid" ] && { kill -CONT "$playpid"; playpid=; } } bumpplayer() { [ -n "$playpid" ] && { kill -USR1 "$playpid"; } } line= while lastline=$line line=`readline -d "$AUDIODIR" ""` do [ "x$line" = "x!!" ] && line=$lastline set -- $line op=${1:-''} case "$op" in :help | '?') echo "Help:" echo " ? This help message." echo " - Stop the player." echo " . Select with an empty pattern (pick anything)." echo " n Set main volume to n, from 0-100." echo " blank line: Skip to next selection from current criteria." echo " \":random\" Choose matching items random." echo " \":seq\" Choose matching items sequentially." echo " keywords Select tracks using the supplied keywords." ;; :n | :next | '') bumpplayer ;; :stop | -) stopplayer ;; [0-9]|[1-9][0-9]|100) echo "Setting volume to $line." set-x aumix -v "$line" ;; :random) dorandom=1 echo "Reselecting with random play." stopplayer sleep 1 runplayer ;; :seq | :sequential) dorandom= echo "Reselecting with sequential play." stopplayer sleep 1 runplayer ;; .) ptns= stopplayer sleep 1 runplayer ;; *) ptns=`printf "%s\n" "$line" | tr '[A-Z]' '[a-z]'` stopplayer sleep 1 runplayer ;; esac done stopplayer