shithub: fork

Download patch

ref: 8da25cdb3e811f308df160faa52aae046dbd377e
parent: 3b7c8f9e807c3d6f8a26b5f91ccb1e8c6593876c
author: qwx <qwx@sciops.net>
date: Sat Aug 19 05:16:43 EDT 2023

play: opus, m4a, mod, aac

--- /dev/null
+++ b/rc/bin/play
@@ -1,0 +1,135 @@
+#!/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
+}