summaryrefslogtreecommitdiff
path: root/apps/mixer.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/mixer.c')
-rw-r--r--apps/mixer.c91
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_);