diff options
Diffstat (limited to 'apps/mixer.c')
-rw-r--r-- | apps/mixer.c | 91 |
1 files changed, 84 insertions, 7 deletions
diff --git a/apps/mixer.c b/apps/mixer.c index 4a6d128..4112c6d 100644 --- a/apps/mixer.c +++ b/apps/mixer.c @@ -31,6 +31,53 @@ #include "mixer.h" +static void free_lang_entry(void* ptr) +{ + lang_t* l = ptr; + assert(l); + free(l->name_); + slist_clear(&(l->cmds_)); + free(l); +} + +static int mixer_read_config_file(mixer_t* m, int dirfd, const char* filename) +{ + assert(dirfd > 0); + + int fd = openat(dirfd, filename, O_RDONLY); + if(fd < 0) { + error(0, errno, "erorr open('%s')", filename); + return -1; + } + FILE* conf = fdopen(fd, "r"); + if(conf == NULL) { + error(0, errno, "erorr fdopen('%s')", filename); + return -1; + } + + lang_t* lang = malloc(sizeof(lang_t)); + assert(lang); + assert((lang->name_ = strdup(filename))); + slist_init(&(lang->cmds_), free); + assert(slist_add(&(m->langs_), lang)); + + char buf[256]; + while(fgets(buf, sizeof(buf), conf) != NULL) { + midi_cmd_t* cmd = malloc(sizeof(midi_cmd_t)); + if(!cmd) { + error(0, ENOMEM, "can't create midi command stucture"); + break; + } + if(sscanf(buf, "%02hhx %02hhx %02hhx", &(cmd->code_[0]), &(cmd->code_[1]), &(cmd->code_[2])) != 3) { + continue; + } + assert(slist_add(&(lang->cmds_), cmd)); + } + + fclose(conf); + return 0; +} + static int mixer_read_config(mixer_t* m) { char path[1024]; @@ -43,21 +90,20 @@ static int mixer_read_config(mixer_t* m) return -1; } - struct dirent* entry = readdir(d); - while(entry) { + struct dirent* entry; + while((entry = readdir(d))) { if(entry->d_type == DT_REG) { - printf(" > found config file: '%s'\n", entry->d_name); + if((ret = mixer_read_config_file(m, dirfd(d), entry->d_name))) + break; } - entry = readdir(d); } - ret = closedir(d); - if(ret < 0) { + if(closedir(d) < 0) { error(0, errno, "MIXER: cannot closeconfig directory '%s'", path); return -1; } - return 0; + return ret; } int mixer_init(mixer_t* m, const char* name, const char* device) @@ -66,6 +112,7 @@ int mixer_init(mixer_t* m, const char* name, const char* device) m->name_ = name; m->output_ = NULL; + slist_init(&(m->langs_), free_lang_entry); int ret = snd_rawmidi_open(NULL, &(m->output_), device, SND_RAWMIDI_NONBLOCK); if(ret < 0) { error(0, 0, "MIXER: cannot open midi port '%s': %s", device, snd_strerror(ret)); @@ -75,6 +122,36 @@ int mixer_init(mixer_t* m, const char* name, const char* device) return mixer_read_config(m);; } +static void mixer_print_midi_cmds(slist_t cmds) +{ + if(!slist_length(&(cmds))) + printf("<no commands>\n"); + else { + slist_element_t* tmp; + for(tmp = cmds.first_; tmp; tmp = tmp->next_) { + midi_cmd_t* c = (midi_cmd_t*)(tmp->data_); + printf(" 0x%02X 0x%02X 0x%02X\n", c->code_[0], c->code_[1], c->code_[2]); + } + } +} + +void mixer_print_langs(mixer_t* m) +{ + assert(m); + + printf("mixer:\n"); + if(!slist_length(&(m->langs_))) + printf(" <no languages>\n"); + else { + slist_element_t* tmp; + for(tmp = m->langs_.first_; tmp; tmp = tmp->next_) { + lang_t* l = (lang_t*)(tmp->data_); + printf(" %s:\n", l->name_); + mixer_print_midi_cmds(l->cmds_); + } + } +} + int mixer_get_poll_fd_count(mixer_t* m) { return snd_rawmidi_poll_descriptors_count(m->output_); |