diff options
-rw-r--r-- | apps/dolmetschctl.c | 6 | ||||
-rw-r--r-- | apps/mixer.c | 70 | ||||
-rw-r--r-- | apps/mixer.h | 16 |
3 files changed, 85 insertions, 7 deletions
diff --git a/apps/dolmetschctl.c b/apps/dolmetschctl.c index 2cffff7..b704109 100644 --- a/apps/dolmetschctl.c +++ b/apps/dolmetschctl.c @@ -73,6 +73,12 @@ int main_loop(mixer_t* x, midi_t* m, osc_t* o) mixer_print_langs(x); + + mixer_switch_lang(x, "en", NULL, NULL); + mixer_switch_lang(x, "de", free, &npfds); + + mixer_print_tasks(x); + printf("main_loop running with %d pollfds...\n", npfds); for (;;) { int err = poll(pfds, npfds, 200); diff --git a/apps/mixer.c b/apps/mixer.c index ef4f0fd..098a329 100644 --- a/apps/mixer.c +++ b/apps/mixer.c @@ -23,6 +23,7 @@ #include "config.h" #include <stdio.h> +#include <string.h> #include <error.h> #include <poll.h> #include <assert.h> @@ -40,6 +41,14 @@ static void free_lang_entry(void* ptr) free(l); } +static void free_task_entry(void* ptr) +{ + task_t* t = ptr; + assert(t); + free(t->buf_); + free(t); +} + static int mixer_read_config_file(mixer_t* x, int dirfd, const char* filename) { assert(dirfd > 0); @@ -113,6 +122,7 @@ int mixer_init(mixer_t* x, const char* name, const char* device) x->name_ = name; x->output_ = NULL; slist_init(&(x->langs_), free_lang_entry); + slist_init(&(x->tasks_), free_task_entry); int ret = snd_rawmidi_open(NULL, &(x->output_), device, SND_RAWMIDI_NONBLOCK); if(ret < 0) { error(0, 0, "MIXER: cannot open midi port '%s': %s", device, snd_strerror(ret)); @@ -139,7 +149,7 @@ void mixer_print_langs(mixer_t* x) { assert(x); - printf("mixer:\n"); + printf("languages:\n"); if(!slist_length(&(x->langs_))) printf(" <no languages>\n"); else { @@ -152,6 +162,64 @@ void mixer_print_langs(mixer_t* x) } } +static u_int8_t* mixer_create_task_buf(slist_t cmds, int len) +{ + u_int8_t* buf = malloc(len); + slist_element_t* tmp; + int i; + for(tmp = cmds.first_, i=0; tmp; tmp = tmp->next_, i+=sizeof(midi_cmd_t)) { + midi_cmd_t* c = (midi_cmd_t*)(tmp->data_); + memcpy(&(buf[i]), (*c), sizeof(midi_cmd_t)); + } + return buf; +} + +int mixer_switch_lang(mixer_t* x, const char* lang, void (*done_cb)(void*), void* done_data) +{ + slist_element_t* tmp; + for(tmp = x->langs_.first_; tmp; tmp = tmp->next_) { + lang_t* l = (lang_t*)(tmp->data_); + if(!strcmp(lang, l->name_)) { + int len = slist_length(&(l->cmds_)); + if(len > 0) { + task_t* task = malloc(sizeof(task_t)); + assert(task); + task->len_ = sizeof(midi_cmd_t) * len; + assert((task->buf_ = mixer_create_task_buf(l->cmds_, task->len_))); + task->write_idx_ = 0; + task->done_cb = done_cb; + task->done_data = done_data; + assert(slist_add(&(x->tasks_), task)); + } + return 0; + } + } + error(0, 0, "requested language '%s' not found ... ignoring switch", lang); + return -1; +} + + +void mixer_print_tasks(mixer_t* x) +{ + assert(x); + + printf("tasks:\n"); + if(!slist_length(&(x->tasks_))) + printf(" <no tasks>\n"); + else { + slist_element_t* tmp; + for(tmp = x->tasks_.first_; tmp; tmp = tmp->next_) { + task_t* t = (task_t*)(tmp->data_); + int i; + printf(" buf(%d) = ", t->len_); + for(i = 0; i < t->len_; ++i) { + printf("0x%02X%s", t->buf_[i], (i && !((i+1) % 3)) ? ", " : " "); + } + printf("\n write_idx = %d\n done = %016lX ( %016lX )\n\n", t->write_idx_, (int64_t)(t->done_cb), (int64_t)(t->done_data)); + } + } +} + int mixer_get_poll_fd_count(mixer_t* x) { return snd_rawmidi_poll_descriptors_count(x->output_); diff --git a/apps/mixer.h b/apps/mixer.h index f041da5..17b3282 100644 --- a/apps/mixer.h +++ b/apps/mixer.h @@ -35,21 +35,25 @@ typedef struct { slist_t cmds_; } lang_t; -// typedef struct { -// u_int8_t* buf_; -// (*done_cb)(void*); -// void* done_data; -// } task_t; +typedef struct { + u_int8_t* buf_; + int len_; + int write_idx_; + void (*done_cb)(void*); + void* done_data; +} task_t; typedef struct { const char* name_; snd_rawmidi_t* output_; slist_t langs_; -// slist_t tasks_; + slist_t tasks_; } mixer_t; int mixer_init(mixer_t* x, const char* name, const char* device); void mixer_print_langs(mixer_t* x); +int mixer_switch_lang(mixer_t* x, const char* lang, void (*done_cb)(void*), void* done_data); +void mixer_print_tasks(mixer_t* x); int mixer_get_poll_fd_count(mixer_t* x); int mixer_get_poll_fds(mixer_t* x, struct pollfd *pfds, int npfds); int mixer_handle_revents(mixer_t* x, struct pollfd *pfds, int npfds); |