shithub: riscv

ref: 247ceabdb640e8642db6d2d90a2b68ad9112b66f
dir: /rc/bin/play/

View raw version
#!/bin/rc

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

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

fn sigint {
	cleanup
	exit
}

fn sigexit {
	cleanup
}

fn play1 {
	if(~ $#* 0){
		tmp=/tmp/play.$pid.tmp
		dd -bs 64 -count 1 >$tmp >[2]/dev/null
		cat $tmp /fd/0 | play1 `{file -m $tmp} xxx
		cleanup
	}
	if not {
		switch($1){
		case *plain*
			sed 's/
//g' | while(j=`{read}){
				echo $"j >[1=2]
				t=$typ
				if(~ $"j http:* https:* HTTP:* HTTPS:*){
					if(~ $#t 0) t=mp3
					hget -r 'Icy-MetaData: 0' $j | play1 $t
				}
				if not {
					if(test -r $"j){
						if(~ $#t 0 && ~ $"j *mp3*) t=mp3
						play1 $t <$"j
					}
					if not {
						echo $argv0: 'can''t open file:' $"j >[1=2]
					}
				}
			}
		case *ogg* *vorbis*
			audio/oggdec
		case *mp3* *mpeg*
			audio/mp3dec
		case *pls*
			awk 'BEGIN {FS="="} /^File/{print $2}' | play1 plain
		case *
			echo $argv0: unknown format: $1 >[1=2]
		}
	}
}

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

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

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