code: plan9front

ref: 5622b0bbd878dbc34045cc6fd37cffa64461eabe
dir: /rc/bin/play/

View raw version
#!/bin/rc
rfork en

nl='
'
out=/dev/audio
typ=()
tmp=()
argv0=$0

fn cleanup {
	if(! ~ $#tmp 0)
		rm -f $tmp
	tmp=()
}

fn sigint {
	cleanup
	exit
}

fn sigexit {
	cleanup
}

fn midi {
	if(test -f /mnt/wad/genmidi || games/wadfs /sys/games/lib/doom/doom1.wad >[2]/dev/null)
		games/dmid | games/opl3
	if not
		games/midi -c
}

fn play1 {
	if(! ~ $#* 2){
		tmp=(/tmp/play.$pid.$#tmp.tmp $tmp)
		dd -bs 8192 -count 1 >$tmp(1) >[2]/dev/null
		cat $tmp(1) /fd/0 | play1 $1 `{file -m $tmp(1)}
		cleanup
	}
	if not {
		switch($2){
		case *plain*
			sed 's/
//g' | while(j=`$nl{read}){
				echo $"j >[1=2]
				if(~ $"j http:* https:* HTTP:* HTTPS:*){
					hget -r 'User-Agent: play' -r 'Icy-MetaData: 0' $"j | play1 $"j
				}
				if not {
					if(test -r $"j)
						play1 <$"j $"j
					if not {
						echo $argv0: 'can''t open file:' $"j >[1=2]
					}
				}
			}
		case *aac*
			audio/aacdec
		case *ogg* *vorbis*
			audio/oggdec
		case *mp3* *mpeg*
			audio/mp3dec
		case *wave*
			audio/wavdec
		case *flac*
			audio/flacdec
		case *audio/basic*
			audio/sundec
		case *audio/midi*
			midi
		case *audio/mus*
			games/mus | midi
		case *audio/x-voc*
			games/vocdec
		case *pls*
			awk 'BEGIN {FS="="} /^File/{print $2}' | play1 list plain
		case *
			switch($1){
			case *.mp3 *.MP3
				audio/mp3dec
			case *.ogg *.OGG
				audio/oggdec
			case *.wav *.WAV
				audio/wavdec
			case *.flac *.FLAC
				audio/flacdec
			case *.au *.AU
				audio/sundec
			case *.mid *.MID
				midi
			case *.mus *.MUS
				games/mus | midi
			case *
				echo $argv0: $1: unknown format: $2 >[1=2]
			}
		}
	}
}

fn usage {
	echo usage: $argv0 '[ -o file ] [ file ... ]' >[1=2]
	exit usage
}

while(~ $1 -*){
	switch($1){
	case -o
		out=$2
		shift
	case *
		usage
	}
	shift
}

# boost priority
@{echo pri 13 >/proc/$pid/ctl} >/dev/null >[2=1] 

>$out {
	if(~ $#* 0){play1 stdin; exit}
	for(i){echo $"i} | play1 args plain
}