aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorcbdev <cb@cbcdn.com>2019-09-15 23:09:44 +0200
committercbdev <cb@cbcdn.com>2019-09-15 23:09:44 +0200
commit1c8d7c570678c2f4f3bf61529489336f9d085f8d (patch)
treec96fae6d14629160ab2f739ea8bd4741b77db6bd
parent9997c446677e490a0d376701f838e804c3b28644 (diff)
downloadmidimonster-1c8d7c570678c2f4f3bf61529489336f9d085f8d.tar.gz
midimonster-1c8d7c570678c2f4f3bf61529489336f9d085f8d.tar.bz2
midimonster-1c8d7c570678c2f4f3bf61529489336f9d085f8d.zip
Fix minor MIDI issues
-rw-r--r--backends/midi.c27
-rw-r--r--plugin.c22
2 files changed, 31 insertions, 18 deletions
diff --git a/backends/midi.c b/backends/midi.c
index 571a61d..65ce48a 100644
--- a/backends/midi.c
+++ b/backends/midi.c
@@ -84,14 +84,14 @@ static instance* midi_instance(){
return inst;
}
-static int midi_configure_instance(instance* instance, char* option, char* value){
- midi_instance_data* data = (midi_instance_data*) instance->impl;
+static int midi_configure_instance(instance* inst, char* option, char* value){
+ midi_instance_data* data = (midi_instance_data*) inst->impl;
//FIXME maybe allow connecting more than one device
if(!strcmp(option, "read")){
//connect input device
if(data->read){
- fprintf(stderr, "MIDI port already connected to an input device\n");
+ fprintf(stderr, "MIDI instance %s was already connected to an input device\n", inst->name);
return 1;
}
data->read = strdup(value);
@@ -100,7 +100,7 @@ static int midi_configure_instance(instance* instance, char* option, char* value
else if(!strcmp(option, "write")){
//connect output device
if(data->write){
- fprintf(stderr, "MIDI port already connected to an output device\n");
+ fprintf(stderr, "MIDI instance %s was already connected to an output device\n", inst->name);
return 1;
}
data->write = strdup(value);
@@ -111,7 +111,7 @@ static int midi_configure_instance(instance* instance, char* option, char* value
return 1;
}
-static channel* midi_channel(instance* instance, char* spec){
+static channel* midi_channel(instance* inst, char* spec){
midi_channel_ident ident = {
.label = 0
};
@@ -142,13 +142,13 @@ static channel* midi_channel(instance* instance, char* spec){
old_syntax = 1;
}
else{
- fprintf(stderr, "Unknown MIDI channel specification %s\n", spec);
+ fprintf(stderr, "Unknown MIDI channel control type in %s\n", spec);
return NULL;
}
ident.fields.channel = strtoul(channel, &channel, 10);
if(ident.fields.channel > 15){
- fprintf(stderr, "MIDI channel out of range in channel spec %s\n", spec);
+ fprintf(stderr, "MIDI channel out of range in midi channel spec %s\n", spec);
return NULL;
}
@@ -176,18 +176,22 @@ static channel* midi_channel(instance* instance, char* spec){
ident.fields.type = pressure;
channel += 8;
}
- else if(!strncmp(channel, "pitch", 8)){
+ else if(!strncmp(channel, "pitch", 5)){
ident.fields.type = pitchbend;
}
else if(!strncmp(channel, "aftertouch", 10)){
ident.fields.type = aftertouch;
}
+ else{
+ fprintf(stderr, "Unknown MIDI channel control type in %s\n", spec);
+ return NULL;
+ }
}
ident.fields.control = strtoul(channel, NULL, 10);
if(ident.label){
- return mm_channel(instance, ident.label, 1);
+ return mm_channel(inst, ident.label, 1);
}
return NULL;
@@ -196,13 +200,12 @@ static channel* midi_channel(instance* instance, char* spec){
static int midi_set(instance* inst, size_t num, channel** c, channel_value* v){
size_t u;
snd_seq_event_t ev;
- midi_instance_data* data;
+ midi_instance_data* data = (midi_instance_data*) inst->impl;
midi_channel_ident ident = {
.label = 0
};
for(u = 0; u < num; u++){
- data = (midi_instance_data*) c[u]->instance->impl;
ident.label = c[u]->ident;
snd_seq_ev_clear(&ev);
@@ -334,7 +337,7 @@ static int midi_handle(size_t num, managed_fd* fds){
}
static int midi_start(){
- size_t n, p;
+ size_t n = 0, p;
int nfds, rv = 1;
struct pollfd* pfds = NULL;
instance** inst = NULL;
diff --git a/plugin.c b/plugin.c
index a452559..dd99041 100644
--- a/plugin.c
+++ b/plugin.c
@@ -24,7 +24,6 @@ static int plugin_attach(char* path, char* file){
plugin_init init = NULL;
void* handle = NULL;
char* lib = NULL;
- char* error = NULL;
lib = calloc(strlen(path) + strlen(file) + 1, sizeof(char));
if(!lib){
@@ -36,16 +35,15 @@ static int plugin_attach(char* path, char* file){
handle = dlopen(lib, RTLD_NOW);
if(!handle){
#ifdef _WIN32
+ char* error = NULL;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &error, 0, NULL);
- #else
- error = dlerror();
- #endif
fprintf(stderr, "Failed to load plugin %s: %s\n", lib, error);
- free(lib);
- #ifdef _WIN32
LocalFree(error);
+ #else
+ fprintf(stderr, "Failed to load plugin %s: %s\n", lib, dlerror());
#endif
+ free(lib);
return 0;
}
@@ -156,10 +154,22 @@ load_done:
int plugins_close(){
size_t u;
+
for(u = 0; u < plugins; u++){
+#ifdef _WIN32
+ char* error = NULL;
+ //FreeLibrary returns the inverse of dlclose
+ if(!FreeLibrary(plugin_handle[u])){
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &error, 0, NULL);
+ fprintf(stderr, "Failed to unload plugin: %s\n", error);
+ LocalFree(error);
+ }
+#else
if(dlclose(plugin_handle[u])){
fprintf(stderr, "Failed to unload plugin: %s\n", dlerror());
}
+#endif
}
free(plugin_handle);