diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/dolmetschctl.c | 8 | ||||
-rw-r--r-- | apps/midi.c | 42 | ||||
-rw-r--r-- | apps/midi.h | 6 | ||||
-rw-r--r-- | apps/osc.c | 23 | ||||
-rw-r--r-- | apps/osc.h | 4 |
5 files changed, 61 insertions, 22 deletions
diff --git a/apps/dolmetschctl.c b/apps/dolmetschctl.c index 6e92b2c..fb8f30d 100644 --- a/apps/dolmetschctl.c +++ b/apps/dolmetschctl.c @@ -51,8 +51,12 @@ int main(int argc, char* argv[]) if(midi_init(&m, "hw:2,0,0")) return -1; - osc_start(&o); - midi_run(&m); + if(osc_start(&o) || midi_start(&m)) + return -1; + + sleep(10); + + midi_stop(&m); osc_stop(&o); return 0; diff --git a/apps/midi.c b/apps/midi.c index 8110475..b923316 100644 --- a/apps/midi.c +++ b/apps/midi.c @@ -25,15 +25,16 @@ #include <stdio.h> #include <error.h> #include <poll.h> +#include <assert.h> #include "midi.h" int midi_init(midi_t* m, const char* device) { - if(!m) - return -1; + assert(m != NULL); + m->stop_ = 0; int ret = snd_rawmidi_open(&(m->input_), NULL, device, SND_RAWMIDI_NONBLOCK); if(ret < 0) { error(0, 0, "MIDI: cannot open port '%s': %s", device, snd_strerror(ret)); @@ -43,10 +44,11 @@ int midi_init(midi_t* m, const char* device) return 0; } -void midi_run(midi_t* m) +static void* midi_run(void* p) { - if(!m) - return; + assert(p != NULL); + + midi_t* m = (midi_t*)p; int npfds; struct pollfd *pfds; @@ -62,9 +64,10 @@ void midi_run(midi_t* m) error(0, errno, "MIDI: poll failed"); break; } - /* if(err == 0) { */ - /* // TIMEOUT */ - /* } */ + if(err == 0) { + if(m->stop_) + break; + } unsigned short revents; if((err = snd_rawmidi_poll_descriptors_revents(m->input_, pfds, npfds, &revents)) < 0) { @@ -90,5 +93,28 @@ void midi_run(midi_t* m) for (i = 0; i < ret; ++i) printf("%02X%c", buf[i], (i >= (ret-1)) ? '\n' : ' '); } + return NULL; +} + +int midi_start(midi_t* m) +{ + assert(m != NULL); + + int ret = pthread_create(&(m->thread_), NULL, midi_run, (void*)m); + if(ret) + error(0, ret, "faild to create midi thread"); + + return ret; +} + +int midi_stop(midi_t* m) +{ + assert(m != NULL); + + m->stop_ = 1; + int ret = pthread_join(m->thread_, NULL); + if(ret) + error(0, ret, "faild to join midi thread"); + return ret; } diff --git a/apps/midi.h b/apps/midi.h index 91634a8..2c0153b 100644 --- a/apps/midi.h +++ b/apps/midi.h @@ -24,12 +24,16 @@ #define DOLMETSCHCTL_midi_h_INCLUDED #include <alsa/asoundlib.h> +#include <pthread.h> typedef struct { + pthread_t thread_; snd_rawmidi_t* input_; + u_int8_t stop_; } midi_t; int midi_init(midi_t* m, const char* device); -void midi_run(midi_t* m); +int midi_start(midi_t* m); +int midi_stop(midi_t* m); #endif @@ -24,6 +24,7 @@ #include <stdio.h> #include <stdlib.h> +#include <assert.h> #include "osc.h" @@ -51,27 +52,31 @@ static int generic_handler(const char *path, const char *types, lo_arg ** argv, int osc_init(osc_t* o, const char* port) { - if(!o) - return -1; + assert(o != NULL); - o->st_ = lo_server_thread_new(port, print_error); // TODO: what happends when this fails? + // TODO: what happends when this fails? + o->st_ = lo_server_thread_new(port, print_error); lo_server_thread_add_method(o->st_, NULL, NULL, generic_handler, NULL); return 0; } -void osc_start(osc_t* o) +int osc_start(osc_t* o) { - if(!o) - return; + assert(o != NULL); + // TODO: what happends when this fails? lo_server_thread_start(o->st_); + + return 0; } -void osc_stop(osc_t* o) +int osc_stop(osc_t* o) { - if(!o) - return; + assert(o != NULL); + // TODO: what happends when this fails? lo_server_thread_free(o->st_); + + return 0; } @@ -30,7 +30,7 @@ typedef struct { } osc_t; int osc_init(osc_t* o, const char* port); -void osc_start(osc_t* o); -void osc_stop(osc_t* o); +int osc_start(osc_t* o); +int osc_stop(osc_t* o); #endif |