diff --git a/gdigi.c b/gdigi.c index 4671c89..b1cb4b1 100644 --- a/gdigi.c +++ b/gdigi.c @@ -32,6 +32,7 @@ static char *device_port = "hw:1,0,0"; static GQueue *message_queue = NULL; static GMutex *message_queue_mutex = NULL; +static GCond *message_queue_cond = NULL; /** * \param array data to calculate checksum @@ -128,6 +129,11 @@ GString *pack_data(gchar *data, gint len) return packed; } +static void message_free_func(GString *msg, gpointer user_data) +{ + g_string_free(msg, TRUE); +} + /** * \param msg message to unpack * @@ -178,7 +184,7 @@ static void unpack_message(GString *msg) * * \return MessageID, or -1 on error. **/ -static MessageID get_message_id(GString *msg) +MessageID get_message_id(GString *msg) { /** \todo check if msg is valid SysEx message */ g_return_val_if_fail(msg != NULL, -1); @@ -247,6 +253,7 @@ void push_message(GString *msg) default: g_mutex_lock(message_queue_mutex); g_queue_push_tail(message_queue, msg); + g_cond_signal(message_queue_cond); g_mutex_unlock(message_queue_mutex); } } @@ -308,6 +315,11 @@ gpointer read_data_thread(gboolean *stop) int pos; int bytes; + if (string == NULL) { + while (buf[i] != 0xF0 && i < length) + i++; + } + pos = i; for (bytes = 0; (byteslen) && data->str[i]; i++); + + amt = (unsigned char)data->str[i+2]; + + while (amt) { + data = g_queue_pop_nth(message_queue, x); + if (data == NULL) { + g_cond_wait(message_queue_cond, message_queue_mutex); + } else { + unpack_message(data); + list = g_list_append(list, data); + amt--; + } + } + + done = TRUE; + } + + g_mutex_unlock(message_queue_mutex); + } while (done == FALSE); + + return list; +} + +void preset_list_free(GList *list) +{ + g_return_if_fail(list != NULL); + + g_list_foreach(list, (GFunc) message_free_func, NULL); + g_list_free(list); } /** @@ -725,11 +787,6 @@ static GOptionEntry options[] = { #endif /* DOXYGEN_SHOULD_SKIP_THIS */ -static void message_queue_free_func(GString *msg, gpointer user_data) -{ - g_string_free(msg, TRUE); -} - int main(int argc, char *argv[]) { GError *error = NULL; GOptionContext *context; @@ -757,6 +814,7 @@ int main(int argc, char *argv[]) { } else { message_queue = g_queue_new(); message_queue_mutex = g_mutex_new(); + message_queue_cond = g_cond_new(); read_thread = g_thread_create((GThreadFunc)read_data_thread, &stop_read_thread, TRUE, NULL); @@ -798,7 +856,7 @@ int main(int argc, char *argv[]) { if (message_queue != NULL) { g_message("%d unread messages in queue", g_queue_get_length(message_queue)); - g_queue_foreach(message_queue, (GFunc) message_queue_free_func, NULL); + g_queue_foreach(message_queue, (GFunc) message_free_func, NULL); g_queue_free(message_queue); } diff --git a/gdigi.h b/gdigi.h index 34e69c9..bb4268a 100644 --- a/gdigi.h +++ b/gdigi.h @@ -738,6 +738,7 @@ typedef struct { } SettingParam; void send_message(gint procedure, gchar *data, gint len); +MessageID get_message_id(GString *msg); void append_value(GString *msg, guint value); GString *get_message_by_id(MessageID id); SettingParam *setting_param_new(); @@ -748,6 +749,7 @@ void switch_preset(guint bank, guint x); void store_preset_name(int x, const gchar *name); void set_preset_level(int level); GStrv query_preset_names(gchar bank); -GString *get_current_preset(); +GList *get_current_preset(); +void preset_list_free(GList *list); #endif /* GDIGI_H */ diff --git a/gui.c b/gui.c index a00f858..fa1eddc 100644 --- a/gui.c +++ b/gui.c @@ -192,9 +192,9 @@ static void apply_preset_to_gui(Preset *preset) **/ static void apply_current_preset() { - GString *msg = get_current_preset(); - Preset *preset = create_preset_from_data(msg); - g_string_free(msg, TRUE); + GList *list = get_current_preset(); + Preset *preset = create_preset_from_data(list); + preset_list_free(list); apply_preset_to_gui(preset); preset_free(preset); } diff --git a/preset.c b/preset.c index e4928c6..fbe5d93 100644 --- a/preset.c +++ b/preset.c @@ -173,19 +173,27 @@ Preset *create_preset_from_xml_file(gchar *filename, GError **error) } /** - * \param data unpacked RECEIVE_PRESET_PARAMETERS message + * \param list list containing unpacked preset SysEx messages. * * Parses message * * \return Preset which must be freed using preset_free, or NULL on error. **/ -Preset *create_preset_from_data(GString *data) +Preset *create_preset_from_data(GList *list) { + GString *data; + GList *iter; gint total; gint n; gint x; - g_return_val_if_fail(data != NULL, NULL); + g_return_val_if_fail(list != NULL, NULL); + + iter = list; + do { + data = (GString*) iter->data; + iter = g_list_next(iter); + } while (get_message_id(data) != RECEIVE_PRESET_PARAMETERS); x = 0x09; n = 0; diff --git a/preset.h b/preset.h index 0141d4f..8f6d9c2 100644 --- a/preset.h +++ b/preset.h @@ -25,7 +25,7 @@ typedef struct { } Preset; Preset *create_preset_from_xml_file(gchar *filename, GError **error); -Preset *create_preset_from_data(GString *data); +Preset *create_preset_from_data(GList *list); void preset_free(Preset *preset); #endif /* GDIGI_PRESET_H */