summaryrefslogtreecommitdiff
path: root/sys/src/cmd/audio
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2022-12-05 15:46:27 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2022-12-05 15:46:27 +0000
commitcff0ebade5fb37b3d5614ae9ff76513e4b0e4640 (patch)
treedce5da7b316b7cf71b4001808cd276f20d26ef16 /sys/src/cmd/audio
parent48f53e57be61f7cee021fdb21849d4759770f722 (diff)
audio/scream: multicast audio protocol
Diffstat (limited to 'sys/src/cmd/audio')
-rw-r--r--sys/src/cmd/audio/mkfile2
-rw-r--r--sys/src/cmd/audio/scream/mkfile21
-rw-r--r--sys/src/cmd/audio/scream/screamdec.c71
-rw-r--r--sys/src/cmd/audio/scream/screamenc.c32
-rwxr-xr-xsys/src/cmd/audio/scream/screamrecv13
-rwxr-xr-xsys/src/cmd/audio/scream/screamsend13
6 files changed, 151 insertions, 1 deletions
diff --git a/sys/src/cmd/audio/mkfile b/sys/src/cmd/audio/mkfile
index 941a094a8..ecdcdb098 100644
--- a/sys/src/cmd/audio/mkfile
+++ b/sys/src/cmd/audio/mkfile
@@ -1,7 +1,7 @@
</$objtype/mkfile
LIBS=libogg libvorbis libFLAC libtags
-PROGS=pcmconv oggdec oggenc mp3dec mp3enc flacdec flacenc wavdec sundec mixfs readtags zuke
+PROGS=pcmconv oggdec oggenc mp3dec mp3enc flacdec flacenc wavdec sundec mixfs readtags zuke scream
#libs must be made first
DIRS=$LIBS $PROGS
diff --git a/sys/src/cmd/audio/scream/mkfile b/sys/src/cmd/audio/scream/mkfile
new file mode 100644
index 000000000..809611330
--- /dev/null
+++ b/sys/src/cmd/audio/scream/mkfile
@@ -0,0 +1,21 @@
+</$objtype/mkfile
+<../config
+
+TARG=screamenc screamdec
+RC=screamsend screamrecv
+
+</sys/src/cmd/mkmany
+
+$O.screamenc: screamenc.$O
+$O.screamdec: screamdec.$O
+
+# Override install target to install rc.
+install:V:
+ for (i in $TARG)
+ mk $MKFLAGS $i.install
+ for (i in $RC)
+ mk $MKFLAGS $i.rcinstall
+
+%.rcinstall:V:
+ cp $stem $BIN/$stem
+ chmod +x $BIN/$stem
diff --git a/sys/src/cmd/audio/scream/screamdec.c b/sys/src/cmd/audio/scream/screamdec.c
new file mode 100644
index 000000000..40f3f386e
--- /dev/null
+++ b/sys/src/cmd/audio/scream/screamdec.c
@@ -0,0 +1,71 @@
+#include <u.h>
+#include <libc.h>
+
+char deffmt[] = "s16c2r44100";
+char fmt[64];
+uchar hdr[5];
+uchar buf[2048];
+int pfd[2];
+
+char*
+getformat(uchar hdr[5])
+{
+ int freq, bits, chan;
+
+ if(hdr[0] & 0x80)
+ freq = 44100;
+ else
+ freq = 48000;
+ freq *= hdr[0] & 0x7F;
+ bits = hdr[1];
+ chan = hdr[2];
+ snprint(fmt, sizeof(fmt), "s%dc%dr%d", bits, chan, freq);
+ return fmt;
+}
+
+void
+main(void)
+{
+ int n;
+
+ for(;;){
+ alarm(500);
+
+ n = read(0, buf, sizeof(buf));
+ if(n < sizeof(hdr))
+ break;
+
+ if(pfd[1] == 0 || memcmp(buf, hdr, sizeof(hdr)) != 0){
+ if(pfd[1] > 1){
+ close(pfd[1]);
+ waitpid();
+ }
+ if(strcmp(getformat(buf), deffmt) == 0){
+ pfd[1] = 1;
+ } else {
+ if(pipe(pfd) < 0)
+ sysfatal("pipe: %r");
+ switch(fork()){
+ case -1:
+ sysfatal("fork: %r");
+ case 0:
+ close(pfd[1]);
+ dup(pfd[0], 0);
+ execl("/bin/audio/pcmconv", "pcmconv", "-i", fmt, nil);
+ sysfatal("exec: %r");
+ return;
+ }
+ close(pfd[0]);
+ }
+ memmove(hdr, buf, sizeof(hdr));
+ }
+
+ n -= sizeof(hdr);
+ if(n <= 0)
+ continue;
+
+ if(write(pfd[1], buf+sizeof(hdr), n) != n)
+ break;
+ }
+ exits(nil);
+}
diff --git a/sys/src/cmd/audio/scream/screamenc.c b/sys/src/cmd/audio/scream/screamenc.c
new file mode 100644
index 000000000..afe088f94
--- /dev/null
+++ b/sys/src/cmd/audio/scream/screamenc.c
@@ -0,0 +1,32 @@
+#include <u.h>
+#include <libc.h>
+
+int freq = 44100;
+int chan = 2;
+int bps = 16;
+int delay = 5;
+
+uchar buf[2048];
+
+void
+main(void)
+{
+ int n, m;
+
+ if((freq % 44100) == 0){
+ buf[0] = 0x80 | (freq / 44100);
+ } else {
+ buf[0] = freq / 48000;
+ }
+ buf[1] = bps;
+ buf[2] = chan;
+ buf[3] = 0;
+ buf[4] = 0;
+
+ n = (bps/8)*chan*((delay*freq+999)/1000);
+ while((m = read(0, buf+5, n)) > 0){
+ if(write(1, buf, 5+m) < 0)
+ sysfatal("write: %r");
+ }
+ exits(nil);
+}
diff --git a/sys/src/cmd/audio/scream/screamrecv b/sys/src/cmd/audio/scream/screamrecv
new file mode 100755
index 000000000..9c247d5e7
--- /dev/null
+++ b/sys/src/cmd/audio/scream/screamrecv
@@ -0,0 +1,13 @@
+#!/bin/rc
+rfork e
+lifc=()
+while(~ $1 *.*.*.*){
+ lifc=($lifc $1)
+ shift
+}
+if(! ~ $#* 0){
+ echo 'Usage: audio/screamrecv [interfaceip]...' >[1=2]
+ exit 'usage'
+}
+if(~ $#lifc 0) lifc=`{awk '/4u/{print $1}' /net/ipselftab}
+exec aux/listen1 -t -p4 -O^'addmulti '^$lifc udp!239.255.77.77!4010 rc -c 'exec audio/screamdec > /dev/audio'
diff --git a/sys/src/cmd/audio/scream/screamsend b/sys/src/cmd/audio/scream/screamsend
new file mode 100755
index 000000000..ed6689f3e
--- /dev/null
+++ b/sys/src/cmd/audio/scream/screamsend
@@ -0,0 +1,13 @@
+#!/bin/rc
+rfork e
+lifc=()
+while(~ $1 *.*.*.*){
+ lifc=($lifc $1)
+ shift
+}
+if(! ~ $#* 0){
+ echo 'Usage: audio/screamsend [interfaceip]...' >[1=2]
+ exit 'usage'
+}
+if(~ $#lifc 0) lifc=`{awk '/4u/{print $1}' /net/ipselftab}
+exec audio/screamenc < /dev/audio | exec aux/trampoline -o^'addmulti '^$lifc udp!239.255.77.77!4010