diff options
author | tv <tv@also> | 2011-07-26 20:36:01 +0200 |
---|---|---|
committer | tv <tv@also> | 2011-07-26 20:36:01 +0200 |
commit | a92aeb953f14bd362d125370d73511f421a5ead4 (patch) | |
tree | 84b1b0355f2f13e46765942adf9b163e8e5c2012 /Kübelwagen/index.c | |
parent | 709d5fc73f00e58e98c6b97dfaa9d1ff31ee1441 (diff) |
Kübelwagen: initial import
Diffstat (limited to 'Kübelwagen/index.c')
-rw-r--r-- | Kübelwagen/index.c | 206 |
1 files changed, 206 insertions, 0 deletions
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); +} |