summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortv <tv@also>2011-07-26 20:36:01 +0200
committertv <tv@also>2011-07-26 20:36:01 +0200
commit82b6ddb97de5d3c0475f5261c46ccea7a88d5345 (patch)
treec103907db9f1440b46ba9f9afcaebc1449fe7743
parent18a2123b50d5e71da251b5ee2902608fba7ef935 (diff)
Kübelwagen: initial import
-rw-r--r--Kübelwagen/Makefile14
-rw-r--r--Kübelwagen/alarm.sh5
-rw-r--r--Kübelwagen/index.c206
-rw-r--r--Kübelwagen/sin.js37
4 files changed, 262 insertions, 0 deletions
diff --git a/Kübelwagen/Makefile b/Kübelwagen/Makefile
new file mode 100644
index 00000000..e180d047
--- /dev/null
+++ b/Kübelwagen/Makefile
@@ -0,0 +1,14 @@
+
+CC := gcc -std=c99
+CFLAGS := -D_XOPEN_SOURCE=500
+LIBS := $(shell pkg-config --cflags --libs jack)
+
+.PHONY: all clean
+
+all: a.out
+
+clean:
+ rm -f a.out
+
+a.out: index.c
+ $(CC) $(CFLAGS) -o $@ $^ $(LIBS)
diff --git a/Kübelwagen/alarm.sh b/Kübelwagen/alarm.sh
new file mode 100644
index 00000000..601a18db
--- /dev/null
+++ b/Kübelwagen/alarm.sh
@@ -0,0 +1,5 @@
+#! /bin/sh
+echo 'You are made of stupid!' >&2
+exit 23
+
+sleep 5h 19m && while :; do echo $(echo "($(od -tu -An -N 2 /dev/urandom)%1000)+500"|bc) $(echo "($(od -tu -An -N 2 /dev/urandom)%500)+100"|bc) ; done | ./a.out 1
diff --git a/Kübelwagen/index.c b/Kübelwagen/index.c
new file mode 100644
index 00000000..9a15c7c3
--- /dev/null
+++ b/Kübelwagen/index.c
@@ -0,0 +1,206 @@
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <math.h>
+
+#include <jack/jack.h>
+
+const double PI = 3.14;
+
+/*Our output port*/
+jack_port_t *output_port;
+
+typedef jack_default_audio_sample_t sample_t;
+
+/*The current sample rate*/
+jack_nframes_t sr;
+
+/*samples in cycle*/
+jack_nframes_t samincy;
+/*the current offset*/
+long offset=0;
+
+/*frequency of our sound*/
+int tone = 262;
+int length = 1000000;
+
+char const *name = "<undefined>";
+
+int process (jack_nframes_t nframes, void *arg){
+ /*grab our output buffer*/
+ sample_t *out = (sample_t *) jack_port_get_buffer
+ (output_port, nframes);
+
+ int _tone = tone > 0 ? tone : 1;
+
+ /*For each required sample*/
+ for(jack_nframes_t i=0;i < nframes;i++){
+ /*Copy the sample at the current position in the cycle to the buffer*/
+
+ jack_nframes_t samincy = sr / _tone;
+ sample_t scale = 2 * PI / samincy;
+ out[i] = sin(offset * scale);
+
+ /*and increment the offset, wrapping to 0 if needed*/
+ /*(Dumb increment fixed thanks to Jussi Sainio)*/
+ offset++;
+ if(offset >= samincy)
+ offset = 0;
+ }
+
+ return 0;
+}
+
+int srate (jack_nframes_t nframes, void *arg){
+ printf ("the sample rate is now %lu/sec\n", nframes);
+ sr=nframes;
+ return 0;
+}
+
+void error (const char *desc){
+ fprintf (stderr, "JACK error: %s\n", desc);
+}
+
+void jack_shutdown (void *arg){
+ exit (1);
+}
+
+void usage(void) {
+ fprintf (stderr, "usage: %s [Hz [ms]]\n", name);
+}
+
+int main (int argc, char *argv[]){
+ jack_client_t *client;
+ const char **ports;
+
+ name = argv[0];
+
+ if (argc < 2) {
+ usage();
+ return 1;
+ }
+ if (argc >= 2) {
+ tone = atoi(argv[1]);
+ if (tone == 0) {
+ usage();
+ return 1;
+ }
+ fprintf(stderr, "tone: %dHz\n", tone);
+ if (argc >= 3) {
+ length = atoi(argv[2]) * 1000;
+ if (length == 0) {
+ usage();
+ return 1;
+ }
+ fprintf(stderr, "length: %dms\n", length/1000);
+ }
+ }
+
+ /* tell the JACK server to call error() whenever it
+ experiences an error. Notice that this callback is
+ global to this process, not specific to each client.
+
+ This is set here so that it can catch errors in the
+ connection process
+ */
+ jack_set_error_function (error);
+
+ /* try to become a client of the JACK server */
+
+ if ((client = jack_client_open(argv[0], JackNullOption, NULL)) == 0) {
+ fprintf (stderr, "jack server not running?\n");
+ return 1;
+ }
+
+ /* tell the JACK server to call `process()' whenever
+ there is work to be done.
+ */
+
+ jack_set_process_callback (client, process, 0);
+
+ /* tell the JACK server to call `srate()' whenever
+ the sample rate of the system changes.
+ */
+
+
+ jack_set_sample_rate_callback (client, srate, 0);
+
+ /* tell the JACK server to call `jack_shutdown()' if
+ it ever shuts down, either entirely, or if it
+ just decides to stop calling us.
+ */
+
+ jack_on_shutdown (client, jack_shutdown, 0);
+
+ /* display the current sample rate. once the client is activated
+ (see below), you should rely on your own sample rate
+ callback (see above) for this value.
+ */
+ printf ("engine sample rate: %lu\n", jack_get_sample_rate (client));
+
+
+ sr=jack_get_sample_rate (client);
+
+ /* create two ports */
+
+
+ output_port = jack_port_register (client, "output",
+ JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+
+ /* tell the JACK server that we are ready to roll */
+
+ if (jack_activate (client)) {
+ fprintf (stderr, "cannot activate client");
+ return 1;
+ }
+
+ /* connect the ports*/
+ if ((ports = jack_get_ports (client, NULL, NULL,
+ JackPortIsPhysical|JackPortIsInput)) == NULL) {
+ fprintf(stderr, "Cannot find any physical playback ports\n");
+ exit(1);
+ }
+
+ int i=0;
+ while(ports[i]!=NULL){
+ if (jack_connect (client, jack_port_name (output_port), ports[i])) {
+ fprintf (stderr, "cannot connect output ports\n");
+ }
+ i++;
+ }
+
+ free (ports);
+
+ //while (1) { //scanf("%i %i", &tone, &length) == 2) {
+ char buf[BUFSIZ];
+ while (fgets(buf, BUFSIZ, stdin) == buf) {
+ //if (strstr(buf, "Hz\n")) {
+ // sscanf(buf, "%i", &tone);
+ // fprintf(stderr, "%dHz\n", tone);
+ //}
+ //if (strstr(buf, "us\n")) {
+ // sscanf(buf, "%i", &length);
+ // fprintf(stderr, "%dus\n", length);
+ //}
+
+ int length = 0;
+ int c;
+ int pos = 0, n;
+ while ((c = sscanf(buf + pos, "%i%i%n", &tone, &length, &n)) == 2) {
+
+ if (length > 0) {
+ usleep(length * 1000);
+ }
+
+ pos += n;
+
+ fprintf(stderr, "%dHz %dms\n", tone, length);
+ }
+ }
+ ///* 3 seconds of bleep is plenty*/
+ ///usleep(length);
+ jack_client_close(client);
+
+ exit(0);
+}
diff --git a/Kübelwagen/sin.js b/Kübelwagen/sin.js
new file mode 100644
index 00000000..0f472715
--- /dev/null
+++ b/Kübelwagen/sin.js
@@ -0,0 +1,37 @@
+
+
+
+var x = 3000;
+
+var t = 0;
+var i = 0;
+var j = 0.00001;
+var t0 = new Date();
+(function rec () {
+
+ var t1 = new Date();
+ console.error('dt = ' + (t1 - t0));
+ t0 = t1;
+
+ if (x === 3000) {
+ x = 1000;
+ } else {
+ x = 3000;
+ };
+
+ console.log('2000 50 0 50 2000 50 0 50 ' + x + ' 100 0 0');
+ return setTimeout(rec, 1000);
+
+ i += 0.01;
+ console.log((2000 + Math.sin(i) * 1000 | 0) + ' 0');
+ return setTimeout(rec, 1);
+
+ var f = Math.abs(1000 + 500 * Math.tan( t ));
+ var scale = 1;
+
+ console.log(((f * scale)|0) + ' 0');
+
+ t++;
+ setTimeout(rec, 100);
+ //process.nextTick(rec);
+})();