plan9fox/rc/bin/play

87 lines
1.2 KiB
Text
Raw Normal View History

#!/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}){
2012-01-22 00:12:28 +00:00
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
}
2012-01-22 00:12:28 +00:00
if not {
echo $argv0: 'can''t open file:' $"j >[1=2]
}
}
}
case *ogg* *vorbis*
audio/oggdec
case *mp3* *mpeg*
audio/mp3dec
2012-02-11 07:33:22 +00:00
case *flac*
audio/flacdec
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
}