ref: 8f211091301af3a465be701bfdfecf049733dc20
dir: /rc/bin/play/
#!/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*opus* audio/opusdec case *m4a* # ? audio/m4adec 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/mod* mod/decode case *audio/x-voc* audio/vocdec case *pls* awk 'BEGIN {FS="="} /^File/{print $2}' | play1 list plain case * switch($1){ case *.opus *.OPUS audio/opusdec case *.m4a *.M4A audio/m4adec case *.aac *.AAC audio/aacdec 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 *.mod *.MOD mod/decode 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 }