[SCM] gsequencer/master: added critical bug-fixes
jkraehemann-guest at users.alioth.debian.org
jkraehemann-guest at users.alioth.debian.org
Tue Jan 31 05:30:25 UTC 2017
The following commit has been merged in the master branch:
commit ad273b0120c1a1a10994616be526ef0766244ecf
Author: Joël Krähemann <jkraehemann-guest at users.alioth.debian.org>
Date: Tue Jan 31 06:30:01 2017 +0100
added critical bug-fixes
diff --git a/debian/patches/fix-critical-bugs.patch b/debian/patches/fix-critical-bugs.patch
new file mode 100644
index 0000000..297e6ca
--- /dev/null
+++ b/debian/patches/fix-critical-bugs.patch
@@ -0,0 +1,2911 @@
+Description: Critical bug-fixes to concurrent access of memory.
+ Fixed machine selector of automation editor. Fixed NULL pointer
+ access in AgsJackMidiin::stop(). Fixed missing refresh of start
+ animation. Fixed possible memory corruption while AgsExportSoundcard
+ setup. Fixed data-race while clearing buffer. Proper implementation of
+ immediate sync of threads. Minor fixes.
+Author: Joël Krähmann <jkraehemann at gmail.com>
+Applied-Upstream: 0.7.x, http://git.savannah.gnu.org/cgit/gsequencer.git
+Last-Update: 2017-01-31
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -963,6 +963,7 @@
+ ags/audio/task/ags_cancel_channel.h \
+ ags/audio/task/ags_cancel_recall.h \
+ ags/audio/task/ags_change_soundcard.h \
++ ags/audio/task/ags_clear_buffer.h \
+ ags/audio/task/ags_export_output.h \
+ ags/audio/task/ags_free_selection.h \
+ ags/audio/task/ags_init_audio.h \
+@@ -1024,6 +1025,7 @@
+ ags/audio/task/ags_cancel_channel.c \
+ ags/audio/task/ags_cancel_recall.c \
+ ags/audio/task/ags_change_soundcard.c \
++ ags/audio/task/ags_clear_buffer.c \
+ ags/audio/task/ags_export_output.c \
+ ags/audio/task/ags_free_selection.c \
+ ags/audio/task/ags_init_audio.c \
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -308,6 +308,7 @@
+ ags/audio/task/libags_audio_la-ags_cancel_channel.lo \
+ ags/audio/task/libags_audio_la-ags_cancel_recall.lo \
+ ags/audio/task/libags_audio_la-ags_change_soundcard.lo \
++ ags/audio/task/libags_audio_la-ags_clear_buffer.lo \
+ ags/audio/task/libags_audio_la-ags_export_output.lo \
+ ags/audio/task/libags_audio_la-ags_free_selection.lo \
+ ags/audio/task/libags_audio_la-ags_init_audio.lo \
+@@ -2220,6 +2221,7 @@
+ ags/audio/task/ags_cancel_channel.h \
+ ags/audio/task/ags_cancel_recall.h \
+ ags/audio/task/ags_change_soundcard.h \
++ ags/audio/task/ags_clear_buffer.h \
+ ags/audio/task/ags_export_output.h \
+ ags/audio/task/ags_free_selection.h \
+ ags/audio/task/ags_init_audio.h \
+@@ -2280,6 +2282,7 @@
+ ags/audio/task/ags_cancel_channel.c \
+ ags/audio/task/ags_cancel_recall.c \
+ ags/audio/task/ags_change_soundcard.c \
++ ags/audio/task/ags_clear_buffer.c \
+ ags/audio/task/ags_export_output.c \
+ ags/audio/task/ags_free_selection.c \
+ ags/audio/task/ags_init_audio.c \
+@@ -3352,6 +3355,9 @@
+ ags/audio/task/libags_audio_la-ags_change_soundcard.lo: \
+ ags/audio/task/$(am__dirstamp) \
+ ags/audio/task/$(DEPDIR)/$(am__dirstamp)
++ags/audio/task/libags_audio_la-ags_clear_buffer.lo: \
++ ags/audio/task/$(am__dirstamp) \
++ ags/audio/task/$(DEPDIR)/$(am__dirstamp)
+ ags/audio/task/libags_audio_la-ags_export_output.lo: \
+ ags/audio/task/$(am__dirstamp) \
+ ags/audio/task/$(DEPDIR)/$(am__dirstamp)
+@@ -4995,6 +5001,7 @@
+ @AMDEP_TRUE@@am__include@ @am__quote at ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_channel.Plo at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_recall.Plo at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ags/audio/task/$(DEPDIR)/libags_audio_la-ags_change_soundcard.Plo at am__quote@
++ at AMDEP_TRUE@@am__include@ @am__quote at ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Plo at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ags/audio/task/$(DEPDIR)/libags_audio_la-ags_export_output.Plo at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ags/audio/task/$(DEPDIR)/libags_audio_la-ags_free_selection.Plo at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ags/audio/task/$(DEPDIR)/libags_audio_la-ags_init_audio.Plo at am__quote@
+@@ -6126,6 +6133,13 @@
+ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ @am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_change_soundcard.lo `test -f 'ags/audio/task/ags_change_soundcard.c' || echo '$(srcdir)/'`ags/audio/task/ags_change_soundcard.c
+
++ags/audio/task/libags_audio_la-ags_clear_buffer.lo: ags/audio/task/ags_clear_buffer.c
++ at am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_clear_buffer.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Tpo -c -o ags/audio/task/libags_audio_la-ags_clear_buffer.lo `test -f 'ags/audio/task/ags_clear_buffer.c' || echo '$(srcdir)/'`ags/audio/task/ags_clear_buffer.c
++ at am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Plo
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_clear_buffer.c' object='ags/audio/task/libags_audio_la-ags_clear_buffer.lo' libtool=yes @AMDEPBACKSLASH@
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++ at am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_clear_buffer.lo `test -f 'ags/audio/task/ags_clear_buffer.c' || echo '$(srcdir)/'`ags/audio/task/ags_clear_buffer.c
++
+ ags/audio/task/libags_audio_la-ags_export_output.lo: ags/audio/task/ags_export_output.c
+ @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_export_output.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_export_output.Tpo -c -o ags/audio/task/libags_audio_la-ags_export_output.lo `test -f 'ags/audio/task/ags_export_output.c' || echo '$(srcdir)/'`ags/audio/task/ags_export_output.c
+ @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_export_output.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_export_output.Plo
+--- a/ags/X/ags_export_soundcard_callbacks.c
++++ b/ags/X/ags_export_soundcard_callbacks.c
+@@ -61,12 +61,16 @@
+ soundcard = NULL;
+
+ if(application_context != NULL){
+- soundcard = ags_sound_provider_get_soundcard(AGS_SOUNDCARD(application_context));
++ soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context));
+ }
+
+ backend = gtk_combo_box_text_get_active_text(export_soundcard->backend);
+ device = gtk_combo_box_text_get_active_text(export_soundcard->card);
+
++ if(device == NULL){
++ return;
++ }
++
+ found_card = FALSE;
+
+ while(soundcard != NULL){
+@@ -154,12 +158,16 @@
+ soundcard = NULL;
+
+ if(application_context != NULL){
+- soundcard = ags_sound_provider_get_soundcard(AGS_SOUNDCARD(application_context));
++ soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context));
+ }
+
+ backend = gtk_combo_box_text_get_active_text(export_soundcard->backend);
+ device = gtk_combo_box_text_get_active_text(export_soundcard->card);
+
++ if(device == NULL){
++ return;
++ }
++
+ found_card = FALSE;
+
+ while(soundcard != NULL){
+--- a/ags/X/ags_line_callbacks.c
++++ b/ags/X/ags_line_callbacks.c
+@@ -423,27 +423,63 @@
+ AgsChannel *channel;
+ AgsPlayback *playback;
+ AgsChannel *next_pad;
++ AgsRecallID *match_recall_id;
++
++ AgsMutexManager *mutex_manager;
+
+ gboolean all_done;
+
++ pthread_mutex_t *application_mutex;
++ pthread_mutex_t *channel_mutex;
++
++ mutex_manager = ags_mutex_manager_get_instance();
++ application_mutex = ags_mutex_manager_get_application_mutex(mutex_manager);
++
+ gdk_threads_enter();
+
++ /* retrieve channel */
+ channel = AGS_PAD(AGS_LINE(line)->pad)->channel;
++
++ /* retrieve channel mutex */
++ pthread_mutex_lock(application_mutex);
++
++ channel_mutex = ags_mutex_manager_lookup(mutex_manager,
++ (GObject *) channel);
++
++ pthread_mutex_unlock(application_mutex);
++
++ /* get next pad */
++ pthread_mutex_lock(channel_mutex);
++
+ next_pad = channel->next_pad;
+
++ pthread_mutex_unlock(channel_mutex);
++
+ all_done = TRUE;
+
+ while(channel != next_pad){
++ pthread_mutex_lock(channel_mutex);
++
+ playback = AGS_PLAYBACK(channel->playback);
+-
+- if(playback->recall_id[0] != NULL){
++ match_recall_id = playback->recall_id[0];
++
++ pthread_mutex_unlock(channel_mutex);
++
++ /* check if pending */
++ if(match_recall_id != NULL){
+ all_done = FALSE;
+ break;
+ }
+-
++
++ /* iterate */
++ pthread_mutex_lock(channel_mutex);
++
+ channel = channel->next;
++
++ pthread_mutex_unlock(channel_mutex);
+ }
+
++ /* toggle play button if all playback done */
+ if(all_done){
+ AgsPad *pad;
+
+--- a/ags/X/ags_pad_callbacks.c
++++ b/ags/X/ags_pad_callbacks.c
+@@ -33,6 +33,7 @@
+ #include <ags/audio/ags_playback.h>
+ #include <ags/audio/ags_pattern.h>
+ #include <ags/audio/ags_recall.h>
++#include <ags/audio/ags_recall_id.h>
+
+ #include <ags/audio/thread/ags_audio_loop.h>
+ #include <ags/audio/thread/ags_soundcard_thread.h>
+@@ -325,6 +326,7 @@
+ ags_pad_init_channel_launch_callback(AgsTask *task, AgsPad *input_pad)
+ {
+ AgsSoundcard *soundcard;
++ AgsAudio *audio;
+ AgsChannel *channel, *next_pad;
+ AgsRecycling *recycling, *end_recycling;
+
+@@ -338,11 +340,28 @@
+ pthread_mutex_t *application_mutex;
+ pthread_mutex_t *audio_mutex;
+ pthread_mutex_t *channel_mutex;
++ pthread_mutex_t *recycling_mutex;
+
+ mutex_manager = ags_mutex_manager_get_instance();
+ application_mutex = ags_mutex_manager_get_application_mutex(mutex_manager);
+
+- /* get audio loop and audio mutex */
++ /* get channel and its mutex */
++ channel = input_pad->channel;
++
++ pthread_mutex_lock(application_mutex);
++
++ channel_mutex = ags_mutex_manager_lookup(mutex_manager,
++ (GObject *) channel);
++
++ pthread_mutex_unlock(application_mutex);
++
++ /* get audio and its audio mutex */
++ pthread_mutex_lock(channel_mutex);
++
++ audio = AGS_AUDIO(channel->audio);
++
++ pthread_mutex_unlock(channel_mutex);
++
+ pthread_mutex_lock(application_mutex);
+
+ audio_mutex = ags_mutex_manager_lookup(mutex_manager,
+@@ -353,7 +372,7 @@
+ /* get soundcard */
+ pthread_mutex_lock(audio_mutex);
+
+- soundcard = AGS_SOUNDCARD(AGS_AUDIO(input_pad->channel->audio)->soundcard);
++ soundcard = AGS_SOUNDCARD(audio->soundcard);
+
+ pthread_mutex_unlock(audio_mutex);
+
+@@ -361,16 +380,6 @@
+ list_start =
+ list = gtk_container_get_children((GtkContainer *) input_pad->expander_set);
+
+- /* get channel and its mutex */
+- channel = input_pad->channel;
+-
+- pthread_mutex_lock(application_mutex);
+-
+- channel_mutex = ags_mutex_manager_lookup(mutex_manager,
+- (GObject *) channel);
+-
+- pthread_mutex_unlock(application_mutex);
+-
+ /* get next pad */
+ pthread_mutex_lock(channel_mutex);
+
+@@ -407,6 +416,7 @@
+
+ if(recall != NULL){
+ AgsAudioSignal *audio_signal;
++ AgsRecallID *current_recall_id;
+
+ g_signal_connect_after(channel, "done\0",
+ G_CALLBACK(ags_line_channel_done_callback), AGS_LINE(list->data));
+@@ -416,13 +426,25 @@
+
+ recycling = channel->first_recycling;
+ end_recycling = channel->last_recycling->next;
++
++ current_recall_id = AGS_RECALL(recall->data)->recall_id;
+
+ pthread_mutex_unlock(channel_mutex);
+
+ while(recycling != end_recycling){
++ /* get recycling mutex */
++ pthread_mutex_lock(application_mutex);
++
++ recycling_mutex = ags_mutex_manager_lookup(mutex_manager,
++ (GObject *) recycling);
++
++ pthread_mutex_unlock(application_mutex);
++
++ /* instantiate audio signal */
+ audio_signal = ags_audio_signal_new((GObject *) soundcard,
+ (GObject *) recycling,
+- (GObject *) AGS_RECALL(recall->data)->recall_id);
++ (GObject *) current_recall_id);
++
+ /* add audio signal */
+ ags_recycling_create_audio_signal_with_defaults(recycling,
+ audio_signal,
+@@ -436,7 +458,13 @@
+ ags_recycling_add_audio_signal(recycling,
+ audio_signal);
+
++
++ /* iterate recycling */
++ pthread_mutex_lock(recycling_mutex);
++
+ recycling = recycling->next;
++
++ pthread_mutex_unlock(recycling_mutex);
+ }
+ }
+
+--- a/ags/X/ags_xorg_application_context.c
++++ b/ags/X/ags_xorg_application_context.c
+@@ -63,6 +63,9 @@
+ #include <ags/audio/jack/ags_jack_port.h>
+ #include <ags/audio/jack/ags_jack_devout.h>
+
++#include <ags/audio/task/ags_cancel_audio.h>
++#include <ags/audio/task/ags_cancel_channel.h>
++
+ #include <ags/audio/recall/ags_play_audio.h>
+ #include <ags/audio/recall/ags_play_channel.h>
+ #include <ags/audio/recall/ags_play_channel_run.h>
+@@ -634,10 +637,10 @@
+ */
+
+ /* AgsWindow */
+- window = ags_window_new((GObject *) xorg_application_context);
+- g_object_set(window,
+- "soundcard\0", soundcard,
+- NULL);
++ window = g_object_new(AGS_TYPE_WINDOW,
++ "soundcard\0", soundcard,
++ "application-context\0", xorg_application_context,
++ NULL);
+ AGS_XORG_APPLICATION_CONTEXT(xorg_application_context)->window = window;
+ g_object_ref(G_OBJECT(window));
+
+@@ -982,6 +985,12 @@
+ /* */
+ ags_audio_file_get_type();
+ ags_audio_file_link_get_type();
++
++ /* register tasks */
++ ags_cancel_audio_get_type();
++ ags_cancel_channel_get_type();
++
++ //TODO:JK: extend me
+
+ /* register recalls */
+ ags_recall_channel_run_dummy_get_type();
+--- a/ags/X/editor/ags_machine_selector.c
++++ b/ags/X/editor/ags_machine_selector.c
+@@ -25,6 +25,7 @@
+ #include <ags/audio/ags_notation.h>
+
+ #include <ags/X/ags_editor.h>
++#include <ags/X/ags_automation_editor.h>
+
+ #include <ags/X/editor/ags_machine_radio_button.h>
+
+@@ -225,10 +226,7 @@
+
+ GList *list, *list_start;
+
+- editor = (AgsEditor *) gtk_widget_get_ancestor((GtkWidget *) machine_selector,
+- AGS_TYPE_EDITOR);
+-
+- /* emit changed */
++ /* get machine radio button */
+ machine_radio_button = NULL;
+
+ list_start =
+@@ -243,28 +241,106 @@
+ }
+
+ g_list_free(list_start);
++
++ if(machine_radio_button == NULL){
++ return;
++ }
+
+- /* destroy edit widgets */
+- if(machine_radio_button != NULL){
++ /* */
++ editor = (AgsEditor *) gtk_widget_get_ancestor((GtkWidget *) machine_selector,
++ AGS_TYPE_EDITOR);
++
++ if(editor != NULL){
++ /* destroy edit widgets */
+ if(machine_radio_button->machine != NULL){
++ AgsEditorChild *editor_child;
++
++ editor_child = NULL;
++
+ list = editor->editor_child;
+
+ while(list != NULL){
+ if(AGS_EDITOR_CHILD(list->data)->machine == machine_radio_button->machine){
+- gtk_widget_destroy((GtkWidget *) AGS_EDITOR_CHILD(list->data)->notebook);
+- gtk_widget_destroy((GtkWidget *) AGS_EDITOR_CHILD(list->data)->meter);
+- gtk_widget_destroy((GtkWidget *) AGS_EDITOR_CHILD(list->data)->edit_widget);
+-
++ editor_child = AGS_EDITOR_CHILD(list->data);
++
++ gtk_widget_destroy((GtkWidget *) editor_child->notebook);
++ gtk_widget_destroy((GtkWidget *) editor_child->meter);
++ gtk_widget_destroy((GtkWidget *) editor_child->edit_widget);
++
++ editor->current_notebook = NULL;
++ editor->current_meter = NULL;
++ editor->current_edit_widget = NULL;
++
+ break;
+ }
+
+ list = list->next;
+ }
++
++ if(editor_child != NULL){
++ editor->editor_child = g_list_remove(editor->editor_child,
++ editor_child);
++ free(editor_child);
++ }
++ }
++ }else{
++ AgsAutomationEditor *automation_editor;
++
++ automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) machine_selector,
++ AGS_TYPE_AUTOMATION_EDITOR);
++
++ if(automation_editor != NULL){
++ /* destroy edit widgets */
++ if(machine_radio_button->machine != NULL){
++ AgsAutomationEditorChild *automation_editor_child;
++
++ automation_editor_child = NULL;
++
++ list = automation_editor->automation_editor_child;
++
++ while(list != NULL){
++ if(AGS_AUTOMATION_EDITOR_CHILD(list->data)->machine == machine_radio_button->machine){
++ automation_editor_child = AGS_AUTOMATION_EDITOR_CHILD(list->data);
++
++ gtk_widget_destroy((GtkWidget *) automation_editor_child->audio_scale);
++ gtk_widget_destroy((GtkWidget *) automation_editor_child->audio_automation_edit);
++
++ gtk_widget_destroy((GtkWidget *) automation_editor_child->output_scale);
++ gtk_widget_destroy((GtkWidget *) automation_editor_child->output_notebook);
++ gtk_widget_destroy((GtkWidget *) automation_editor_child->output_automation_edit);
++
++ gtk_widget_destroy((GtkWidget *) automation_editor_child->input_scale);
++ gtk_widget_destroy((GtkWidget *) automation_editor_child->input_notebook);
++ gtk_widget_destroy((GtkWidget *) automation_editor_child->input_automation_edit);
++
++ automation_editor->current_audio_scale = NULL;
++ automation_editor->current_audio_automation_edit = NULL;
++
++ automation_editor->current_output_notebook = NULL;
++ automation_editor->current_output_scale = NULL;
++ automation_editor->current_output_automation_edit = NULL;
++
++ automation_editor->current_input_notebook = NULL;
++ automation_editor->current_input_scale = NULL;
++ automation_editor->current_input_automation_edit = NULL;
++
++ break;
++ }
++
++ list = list->next;
++ }
++
++ if(automation_editor_child != NULL){
++ automation_editor->automation_editor_child = g_list_remove(automation_editor->automation_editor_child,
++ automation_editor_child);
++ free(automation_editor_child);
++ }
++ }
+ }
+-
+- /**/
+- gtk_widget_destroy(GTK_WIDGET(machine_radio_button));
+ }
++
++ /**/
++ gtk_widget_destroy(GTK_WIDGET(machine_radio_button));
+ }
+
+ void
+--- a/ags/X/file/ags_simple_file.c
++++ b/ags/X/file/ags_simple_file.c
+@@ -1692,6 +1692,14 @@
+ "reference\0", gobject,
+ NULL));
+
++ /* set name if available */
++ str = xmlGetProp(node,
++ AGS_FILE_NAME_PROP);
++
++ if(str != NULL){
++ gobject->name = g_strdup(str);
++ }
++
+ /* retrieve window */
+ window = AGS_XORG_APPLICATION_CONTEXT(simple_file->application_context)->window;
+
+@@ -5016,7 +5024,11 @@
+ xmlNewProp(node,
+ (xmlChar *) AGS_FILE_TYPE_PROP,
+ (xmlChar *) G_OBJECT_TYPE_NAME(machine));
+-
++
++ xmlNewProp(node,
++ (xmlChar *) AGS_FILE_NAME_PROP,
++ (xmlChar *) machine->name);
++
+ ags_simple_file_add_id_ref(simple_file,
+ g_object_new(AGS_TYPE_FILE_ID_REF,
+ "application-context\0", simple_file->application_context,
+--- a/ags/X/file/ags_simple_file.dtd
++++ b/ags/X/file/ags_simple_file.dtd
+@@ -46,6 +46,7 @@
+ <!ATTLIST ags-sf-machine
+ id CDATA #REQUIRED
+ type CDATA #REQUIRED
++ name CDATA #REQUIRED
+ filename CDATA #IMPLIED
+ preset CDATA #IMPLIED
+ instrument CDATA #IMPLIED
+--- a/ags/audio/ags_devout.c
++++ b/ags/audio/ags_devout.c
+@@ -33,6 +33,7 @@
+ #include <ags/thread/ags_poll_fd.h>
+
+ #include <ags/audio/task/ags_tic_device.h>
++#include <ags/audio/task/ags_clear_buffer.h>
+ #include <ags/audio/task/ags_switch_buffer_flag.h>
+ #include <ags/audio/task/ags_notify_soundcard.h>
+
+@@ -775,6 +776,12 @@
+ devout->buffer[1] = NULL;
+ devout->buffer[2] = NULL;
+ devout->buffer[3] = NULL;
++
++ g_atomic_int_set(&(devout->available),
++ FALSE);
++
++ devout->ring_buffer_size = AGS_DEVOUT_DEFAULT_RING_BUFFER_SIZE;
++ devout->nth_ring_buffer = 0;
+
+ devout->ring_buffer = NULL;
+
+@@ -1830,7 +1837,11 @@
+ #endif
+
+ if((POLLOUT & revents) != 0){
+- return(TRUE);
++ g_atomic_int_set(&(devout->available),
++ TRUE);
++ AGS_POLL_FD(list->data)->poll_fd->revents = 0;
++
++ return(TRUE);
+ }
+ }else{
+ #ifdef AGS_WITH_OSS
+@@ -1840,6 +1851,10 @@
+ FD_SET(AGS_POLL_FD(list->data)->poll_fd->fd, &writefds);
+
+ if(FD_ISSET(AGS_POLL_FD(list->data)->poll_fd->fd, &writefds)){
++ g_atomic_int_set(&(devout->available),
++ TRUE);
++ AGS_POLL_FD(list->data)->poll_fd->revents = 0;
++
+ return(TRUE);
+ }
+ #endif
+@@ -1974,6 +1989,7 @@
+ guint word_size;
+ int format;
+ int tmp;
++ guint i;
+
+ pthread_mutex_t *mutex;
+
+@@ -2051,10 +2067,17 @@
+ memset(devout->buffer[3], 0, devout->pcm_channels * devout->buffer_size * word_size);
+
+ /* allocate ring buffer */
+- devout->ring_buffer = (unsigned char **) malloc(2 * sizeof(unsigned char *));
+- devout->ring_buffer[0] = (unsigned char *) malloc(devout->pcm_channels * devout->buffer_size * word_size * sizeof(unsigned char));
+- devout->ring_buffer[1] = (unsigned char *) malloc(devout->pcm_channels * devout->buffer_size * word_size * sizeof(unsigned char));
++ g_atomic_int_set(&(devout->available),
++ FALSE);
+
++ devout->ring_buffer = (unsigned char **) malloc(devout->ring_buffer_size * sizeof(unsigned char *));
++
++ for(i = 0; i < devout->ring_buffer_size; i++){
++ devout->ring_buffer[i] = (unsigned char *) malloc(devout->pcm_channels *
++ devout->buffer_size * word_size *
++ sizeof(unsigned char));
++ }
++
+ #ifdef AGS_WITH_OSS
+ /* open device fd */
+ str = devout->out.oss.device;
+@@ -2192,6 +2215,8 @@
+ devout->delay_counter = 0.0;
+ devout->tic_counter = 0;
+
++ devout->nth_ring_buffer = 0;
++
+ ags_soundcard_get_poll_fd(soundcard);
+
+ devout->flags |= AGS_DEVOUT_INITIALIZED;
+@@ -2209,27 +2234,34 @@
+ {
+ AgsDevout *devout;
+
++ AgsNotifySoundcard *notify_soundcard;
+ AgsTicDevice *tic_device;
++ AgsClearBuffer *clear_buffer;
+ AgsSwitchBufferFlag *switch_buffer_flag;
+
+ AgsThread *task_thread;
++ AgsPollFd *poll_fd;
+ AgsMutexManager *mutex_manager;
+
+ AgsApplicationContext *application_context;
+
+ GList *task;
+-
++ GList *list;
++
+ gchar *str;
+
+ guint word_size;
+ guint nth_buffer;
+- guint next_buffer;
+- guint nth_ring_buffer;
+
+ int n_write;
+
+ pthread_mutex_t *mutex;
+
++ static const struct timespec poll_interval = {
++ 0,
++ 250,
++ };
++
+ auto void ags_devout_oss_play_fill_ring_buffer(void *buffer, guint ags_format, unsigned char *ring_buffer, guint channels, guint buffer_size);
+
+ void ags_devout_oss_play_fill_ring_buffer(void *buffer, guint ags_format, unsigned char *ring_buffer, guint channels, guint buffer_size){
+@@ -2330,17 +2362,19 @@
+ /* lock */
+ pthread_mutex_lock(mutex);
+
++ notify_soundcard = AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard);
++
+ /* notify cyclic task */
+- pthread_mutex_lock(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->return_mutex);
++ pthread_mutex_lock(notify_soundcard->return_mutex);
+
+- g_atomic_int_or(&(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->flags),
++ g_atomic_int_or(&(notify_soundcard->flags),
+ AGS_NOTIFY_SOUNDCARD_DONE_RETURN);
+
+- if((AGS_NOTIFY_SOUNDCARD_WAIT_RETURN & (g_atomic_int_get(&(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->flags)))) != 0){
+- pthread_cond_signal(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->return_cond);
++ if((AGS_NOTIFY_SOUNDCARD_WAIT_RETURN & (g_atomic_int_get(&(notify_soundcard->flags)))) != 0){
++ pthread_cond_signal(notify_soundcard->return_cond);
+ }
+
+- pthread_mutex_unlock(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->return_mutex);
++ pthread_mutex_unlock(notify_soundcard->return_mutex);
+
+ /* retrieve word size */
+ switch(devout->format){
+@@ -2386,42 +2420,59 @@
+ /* check buffer flag */
+ if((AGS_DEVOUT_BUFFER0 & (devout->flags)) != 0){
+ nth_buffer = 0;
+- next_buffer = 1;
+- nth_ring_buffer = 0;
+ }else if((AGS_DEVOUT_BUFFER1 & (devout->flags)) != 0){
+ nth_buffer = 1;
+- next_buffer = 2;
+- nth_ring_buffer = 1;
+ }else if((AGS_DEVOUT_BUFFER2 & (devout->flags)) != 0){
+ nth_buffer = 2;
+- next_buffer = 3;
+- nth_ring_buffer = 0;
+ }else if((AGS_DEVOUT_BUFFER3 & devout->flags) != 0){
+ nth_buffer = 3;
+- next_buffer = 0;
+- nth_ring_buffer = 1;
+ }
+
+- /* clear next buffer */
+- memset(devout->buffer[next_buffer], 0, (size_t) devout->pcm_channels * devout->buffer_size * word_size);
+-
+ #ifdef AGS_WITH_OSS
+ /* fill ring buffer */
+ ags_devout_oss_play_fill_ring_buffer(devout->buffer[nth_buffer],
+ devout->format,
+- devout->ring_buffer[nth_ring_buffer],
++ devout->ring_buffer[devout->nth_ring_buffer],
+ devout->pcm_channels,
+ devout->buffer_size);
+
++ /* wait until available */
++ list = ags_soundcard_get_poll_fd(soundcard);
++
++ if(!ags_soundcard_is_available(soundcard) &&
++ !g_atomic_int_get(&(devout->available)) &&
++ list != NULL){
++ poll_fd = list->data;
++ poll_fd->poll_fd->events = POLLOUT;
++
++ while(!ags_soundcard_is_available(soundcard) &&
++ !g_atomic_int_get(&(devout->available))){
++ ppoll(poll_fd->poll_fd,
++ 1,
++ &poll_interval,
++ NULL);
++ }
++ }
++
+ /* write ring buffer */
+ n_write = write(devout->out.oss.device_fd,
+- devout->ring_buffer[nth_ring_buffer],
++ devout->ring_buffer[devout->nth_ring_buffer],
+ devout->pcm_channels * devout->buffer_size * word_size * sizeof (char));
+
++ g_atomic_int_set(&(devout->available),
++ FALSE);
++
+ if(n_write != devout->pcm_channels * devout->buffer_size * word_size * sizeof (char)){
+ g_critical("write() return doesn't match written bytes\0");
+ }
+ #endif
++
++ /* increment nth ring-buffer */
++ if(devout->nth_ring_buffer + 1 >= devout->ring_buffer_size){
++ devout->nth_ring_buffer = 0;
++ }else{
++ devout->nth_ring_buffer += 1;
++ }
+
+ pthread_mutex_unlock(mutex);
+
+@@ -2435,6 +2486,11 @@
+ task = g_list_append(task,
+ tic_device);
+
++ /* reset - clear buffer */
++ clear_buffer = ags_clear_buffer_new((GObject *) devout);
++ task = g_list_append(task,
++ clear_buffer);
++
+ /* reset - switch buffer flags */
+ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) devout);
+ task = g_list_append(task,
+@@ -2450,12 +2506,16 @@
+ {
+ AgsDevout *devout;
+
++ AgsNotifySoundcard *notify_soundcard;
++
+ AgsMutexManager *mutex_manager;
+
+ AgsApplicationContext *application_context;
+
+ GList *poll_fd;
+
++ guint i;
++
+ pthread_mutex_t *mutex;
+
+ devout = AGS_DEVOUT(soundcard);
+@@ -2471,19 +2531,50 @@
+
+ pthread_mutex_unlock(application_context->mutex);
+
++ /* */
++ pthread_mutex_lock(mutex);
++
++#ifdef AGS_WITH_OSS
++ /* remove poll fd */
++ poll_fd = devout->poll_fd;
++
++ while(poll_fd != NULL){
++ ags_polling_thread_remove_poll_fd(AGS_POLL_FD(poll_fd->data)->polling_thread,
++ poll_fd->data);
++ g_object_unref(poll_fd->data);
++
++ poll_fd = poll_fd->next;
++ }
++
++ g_list_free(poll_fd);
++
++ devout->poll_fd = NULL;
++#endif
++
++ notify_soundcard = AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard);
++
+ if((AGS_DEVOUT_INITIALIZED & (devout->flags)) == 0){
++ pthread_mutex_unlock(mutex);
++
+ return;
+ }
+
+ close(devout->out.oss.device_fd);
+ devout->out.oss.device_fd = -1;
+
+- free(devout->ring_buffer[0]);
+- free(devout->ring_buffer[1]);
++ /* free ring-buffer */
++ g_atomic_int_set(&(devout->available),
++ FALSE);
++
++ for(i = 0; i < devout->ring_buffer_size; i++){
++ free(devout->ring_buffer[i]);
++ }
++
+ free(devout->ring_buffer);
+
+ devout->ring_buffer = NULL;
+-
++
++ /* reset flags */
+ devout->flags &= (~(AGS_DEVOUT_BUFFER0 |
+ AGS_DEVOUT_BUFFER1 |
+ AGS_DEVOUT_BUFFER2 |
+@@ -2492,19 +2583,21 @@
+ AGS_DEVOUT_INITIALIZED));
+
+ /* notify cyclic task */
+- pthread_mutex_lock(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->return_mutex);
++ pthread_mutex_lock(notify_soundcard->return_mutex);
+
+- g_atomic_int_or(&(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->flags),
++ g_atomic_int_or(&(notify_soundcard->flags),
+ AGS_NOTIFY_SOUNDCARD_DONE_RETURN);
+
+- if((AGS_NOTIFY_SOUNDCARD_WAIT_RETURN & (g_atomic_int_get(&(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->flags)))) != 0){
+- pthread_cond_signal(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->return_cond);
++ if((AGS_NOTIFY_SOUNDCARD_WAIT_RETURN & (g_atomic_int_get(&(notify_soundcard->flags)))) != 0){
++ pthread_cond_signal(notify_soundcard->return_cond);
+ }
+
+- pthread_mutex_unlock(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->return_mutex);
++ pthread_mutex_unlock(notify_soundcard->return_mutex);
+
+ devout->note_offset = 0;
+ devout->note_offset_absolute = 0;
++
++ pthread_mutex_unlock(mutex);
+ }
+
+ void
+@@ -2542,6 +2635,7 @@
+ #endif
+
+ guint word_size;
++ guint i;
+
+ pthread_mutex_t *mutex;
+
+@@ -2628,10 +2722,17 @@
+
+ /* allocate ring buffer */
+ #ifdef AGS_WITH_ALSA
+- devout->ring_buffer = (unsigned char **) malloc(2 * sizeof(unsigned char *));
+- devout->ring_buffer[0] = (unsigned char *) malloc(devout->pcm_channels * devout->buffer_size * (snd_pcm_format_physical_width(format) / 8) * sizeof(unsigned char));
+- devout->ring_buffer[1] = (unsigned char *) malloc(devout->pcm_channels * devout->buffer_size * (snd_pcm_format_physical_width(format) / 8) * sizeof(unsigned char));
++ g_atomic_int_set(&(devout->available),
++ FALSE);
+
++ devout->ring_buffer = (unsigned char **) malloc(devout->ring_buffer_size * sizeof(unsigned char *));
++
++ for(i = 0; i < devout->ring_buffer_size; i++){
++ devout->ring_buffer[i] = (unsigned char *) malloc(devout->pcm_channels *
++ devout->buffer_size * (snd_pcm_format_physical_width(format) / 8) *
++ sizeof(unsigned char));
++ }
++
+ /* */
+ period_event = 0;
+
+@@ -2933,6 +3034,8 @@
+ devout->delay_counter = 0.0;
+ devout->tic_counter = 0;
+
++ devout->nth_ring_buffer = 0;
++
+ ags_soundcard_get_poll_fd(soundcard);
+
+ devout->flags |= AGS_DEVOUT_INITIALIZED;
+@@ -2950,25 +3053,32 @@
+ {
+ AgsDevout *devout;
+
++ AgsNotifySoundcard *notify_soundcard;
+ AgsTicDevice *tic_device;
++ AgsClearBuffer *clear_buffer;
+ AgsSwitchBufferFlag *switch_buffer_flag;
+
+ AgsThread *task_thread;
++ AgsPollFd *poll_fd;
+ AgsMutexManager *mutex_manager;
+
+ AgsApplicationContext *application_context;
+
+ GList *task;
++ GList *list;
+
+ gchar *str;
+
+ guint word_size;
+ guint nth_buffer;
+- guint next_buffer;
+- guint nth_ring_buffer;
+
+ pthread_mutex_t *mutex;
+
++ static const struct timespec poll_interval = {
++ 0,
++ 250,
++ };
++
+ #ifdef AGS_WITH_ALSA
+ auto void ags_devout_alsa_play_fill_ring_buffer(void *buffer, guint ags_format, unsigned char *ring_buffer, guint channels, guint buffer_size);
+
+@@ -3089,17 +3199,19 @@
+ /* lock */
+ pthread_mutex_lock(mutex);
+
++ notify_soundcard = AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard);
++
+ /* notify cyclic task */
+- pthread_mutex_lock(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->return_mutex);
++ pthread_mutex_lock(notify_soundcard->return_mutex);
+
+- g_atomic_int_or(&(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->flags),
++ g_atomic_int_or(&(notify_soundcard->flags),
+ AGS_NOTIFY_SOUNDCARD_DONE_RETURN);
+
+- if((AGS_NOTIFY_SOUNDCARD_WAIT_RETURN & (g_atomic_int_get(&(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->flags)))) != 0){
+- pthread_cond_signal(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->return_cond);
++ if((AGS_NOTIFY_SOUNDCARD_WAIT_RETURN & (g_atomic_int_get(&(notify_soundcard->flags)))) != 0){
++ pthread_cond_signal(notify_soundcard->return_cond);
+ }
+
+- pthread_mutex_unlock(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->return_mutex);
++ pthread_mutex_unlock(notify_soundcard->return_mutex);
+
+ /* retrieve word size */
+ switch(devout->format){
+@@ -3129,7 +3241,10 @@
+ }
+ break;
+ default:
++ pthread_mutex_unlock(mutex);
++
+ g_warning("ags_devout_alsa_play(): unsupported word size\0");
++
+ return;
+ }
+
+@@ -3150,37 +3265,47 @@
+ /* check buffer flag */
+ if((AGS_DEVOUT_BUFFER0 & (devout->flags)) != 0){
+ nth_buffer = 0;
+- next_buffer = 1;
+- nth_ring_buffer = 0;
+ }else if((AGS_DEVOUT_BUFFER1 & (devout->flags)) != 0){
+ nth_buffer = 1;
+- next_buffer = 2;
+- nth_ring_buffer = 1;
+ }else if((AGS_DEVOUT_BUFFER2 & (devout->flags)) != 0){
+ nth_buffer = 2;
+- next_buffer = 3;
+- nth_ring_buffer = 0;
+ }else if((AGS_DEVOUT_BUFFER3 & devout->flags) != 0){
+ nth_buffer = 3;
+- next_buffer = 0;
+- nth_ring_buffer = 1;
+ }
+
+- /* clear next buffer */
+- memset(devout->buffer[next_buffer], 0, (size_t) devout->pcm_channels * devout->buffer_size * word_size);
+-
+ #ifdef AGS_WITH_ALSA
+
+ /* fill ring buffer */
+ ags_devout_alsa_play_fill_ring_buffer(devout->buffer[nth_buffer], devout->format,
+- devout->ring_buffer[nth_ring_buffer],
++ devout->ring_buffer[devout->nth_ring_buffer],
+ devout->pcm_channels, devout->buffer_size);
+
++ /* wait until available */
++ list = ags_soundcard_get_poll_fd(soundcard);
++
++ if(!ags_soundcard_is_available(soundcard) &&
++ !g_atomic_int_get(&(devout->available)) &&
++ list != NULL){
++ poll_fd = list->data;
++ poll_fd->poll_fd->events = POLLOUT;
++
++ while(!ags_soundcard_is_available(soundcard) &&
++ !g_atomic_int_get(&(devout->available))){
++ ppoll(poll_fd->poll_fd,
++ 1,
++ &poll_interval,
++ NULL);
++ }
++ }
++
+ /* write ring buffer */
+ devout->out.alsa.rc = snd_pcm_writei(devout->out.alsa.handle,
+- devout->ring_buffer[nth_ring_buffer],
++ devout->ring_buffer[devout->nth_ring_buffer],
+ (snd_pcm_uframes_t) (devout->buffer_size));
+
++ g_atomic_int_set(&(devout->available),
++ FALSE);
++
+ /* check error flag */
+ if((AGS_DEVOUT_NONBLOCKING & (devout->flags)) == 0){
+ if(devout->out.alsa.rc == -EPIPE){
+@@ -3216,6 +3341,16 @@
+
+ #endif
+
++ /* increment nth ring-buffer */
++ g_atomic_int_set(&(devout->available),
++ FALSE);
++
++ if(devout->nth_ring_buffer + 1 >= devout->ring_buffer_size){
++ devout->nth_ring_buffer = 0;
++ }else{
++ devout->nth_ring_buffer += 1;
++ }
++
+ pthread_mutex_unlock(mutex);
+
+ /* update soundcard */
+@@ -3227,7 +3362,12 @@
+ tic_device = ags_tic_device_new((GObject *) devout);
+ task = g_list_append(task,
+ tic_device);
+-
++
++ /* reset - clear buffer */
++ clear_buffer = ags_clear_buffer_new((GObject *) devout);
++ task = g_list_append(task,
++ clear_buffer);
++
+ /* reset - switch buffer flags */
+ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) devout);
+ task = g_list_append(task,
+@@ -3247,15 +3387,33 @@
+ {
+ AgsDevout *devout;
+
++ AgsNotifySoundcard *notify_soundcard;
++
+ AgsMutexManager *mutex_manager;
+
+ AgsApplicationContext *application_context;
+
+ GList *poll_fd;
+
++ guint i;
++
+ pthread_mutex_t *mutex;
+
+ devout = AGS_DEVOUT(soundcard);
++
++ application_context = ags_soundcard_get_application_context(soundcard);
++
++ pthread_mutex_lock(application_context->mutex);
++
++ mutex_manager = ags_mutex_manager_get_instance();
++
++ mutex = ags_mutex_manager_lookup(mutex_manager,
++ (GObject *) devout);
++
++ pthread_mutex_unlock(application_context->mutex);
++
++ /* lock */
++ pthread_mutex_lock(mutex);
+
+ #ifdef AGS_WITH_ALSA
+ /* remove poll fd */
+@@ -3273,19 +3431,12 @@
+
+ devout->poll_fd = NULL;
+ #endif
+-
+- application_context = ags_soundcard_get_application_context(soundcard);
+-
+- pthread_mutex_lock(application_context->mutex);
+-
+- mutex_manager = ags_mutex_manager_get_instance();
+
+- mutex = ags_mutex_manager_lookup(mutex_manager,
+- (GObject *) devout);
+-
+- pthread_mutex_unlock(application_context->mutex);
++ notify_soundcard = AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard);
+
+ if((AGS_DEVOUT_INITIALIZED & (devout->flags)) == 0){
++ pthread_mutex_unlock(mutex);
++
+ return;
+ }
+
+@@ -3295,12 +3446,16 @@
+ devout->out.alsa.handle = NULL;
+ #endif
+
+- free(devout->ring_buffer[0]);
+- free(devout->ring_buffer[1]);
++ /* free ring-buffer */
++ for(i = 0; i < devout->ring_buffer_size; i++){
++ free(devout->ring_buffer[i]);
++ }
++
+ free(devout->ring_buffer);
+
+ devout->ring_buffer = NULL;
+-
++
++ /* reset flags */
+ devout->flags &= (~(AGS_DEVOUT_BUFFER0 |
+ AGS_DEVOUT_BUFFER1 |
+ AGS_DEVOUT_BUFFER2 |
+@@ -3309,19 +3464,21 @@
+ AGS_DEVOUT_INITIALIZED));
+
+ /* notify cyclic task */
+- pthread_mutex_lock(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->return_mutex);
++ pthread_mutex_lock(notify_soundcard->return_mutex);
+
+- g_atomic_int_or(&(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->flags),
++ g_atomic_int_or(&(notify_soundcard->flags),
+ AGS_NOTIFY_SOUNDCARD_DONE_RETURN);
+
+- if((AGS_NOTIFY_SOUNDCARD_WAIT_RETURN & (g_atomic_int_get(&(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->flags)))) != 0){
+- pthread_cond_signal(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->return_cond);
++ if((AGS_NOTIFY_SOUNDCARD_WAIT_RETURN & (g_atomic_int_get(&(notify_soundcard->flags)))) != 0){
++ pthread_cond_signal(notify_soundcard->return_cond);
+ }
+
+- pthread_mutex_unlock(AGS_NOTIFY_SOUNDCARD(devout->notify_soundcard)->return_mutex);
++ pthread_mutex_unlock(notify_soundcard->return_mutex);
+
+ devout->note_offset = 0;
+ devout->note_offset_absolute = 0;
++
++ pthread_mutex_unlock(mutex);
+ }
+
+ void
+--- a/ags/audio/ags_devout.h
++++ b/ags/audio/ags_devout.h
+@@ -45,6 +45,8 @@
+ #define AGS_DEVOUT_DEFAULT_ALSA_DEVICE "hw:0,0\0"
+ #define AGS_DEVOUT_DEFAULT_OSS_DEVICE "/dev/dsp\0"
+
++#define AGS_DEVOUT_DEFAULT_RING_BUFFER_SIZE (8)
++
+ typedef struct _AgsDevout AgsDevout;
+ typedef struct _AgsDevoutClass AgsDevoutClass;
+
+@@ -95,6 +97,12 @@
+ guint samplerate; // sample_rate
+
+ void** buffer;
++
++ volatile gboolean available;
++
++ guint ring_buffer_size;
++ guint nth_ring_buffer;
++
+ unsigned char **ring_buffer;
+
+ double bpm; // beats per minute
+--- a/ags/audio/jack/ags_jack_client.c
++++ b/ags/audio/jack/ags_jack_client.c
+@@ -722,9 +722,9 @@
+
+ pthread_mutex_unlock(audio_loop->timing_mutex);
+
+- ags_main_loop_interrupt(AGS_MAIN_LOOP(audio_loop),
+- AGS_THREAD_SUSPEND_SIG,
+- 0, &time_spent);
++ // ags_main_loop_interrupt(AGS_MAIN_LOOP(audio_loop),
++ // AGS_THREAD_SUSPEND_SIG,
++ // 0, &time_spent);
+ }
+
+ if(task_thread != NULL){
+@@ -886,14 +886,8 @@
+ }
+
+ if(!no_event){
+- memset(jack_devout->buffer[nth_buffer], 0, (size_t) jack_devout->pcm_channels * jack_devout->buffer_size * word_size);
+-
+ /* signal finish */
+- pthread_mutex_lock(device_mutex);
+-
+ callback_finish_mutex = jack_devout->callback_finish_mutex;
+-
+- pthread_mutex_unlock(device_mutex);
+
+ pthread_mutex_lock(callback_finish_mutex);
+
+@@ -1021,11 +1015,7 @@
+ }
+
+ /* signal finish */
+- pthread_mutex_lock(device_mutex);
+-
+ callback_finish_mutex = jack_midiin->callback_finish_mutex;
+-
+- pthread_mutex_unlock(device_mutex);
+
+ pthread_mutex_lock(callback_finish_mutex);
+
+--- a/ags/audio/jack/ags_jack_devout.c
++++ b/ags/audio/jack/ags_jack_devout.c
+@@ -40,6 +40,7 @@
+
+ #include <ags/audio/task/ags_notify_soundcard.h>
+ #include <ags/audio/task/ags_tic_device.h>
++#include <ags/audio/task/ags_clear_buffer.h>
+ #include <ags/audio/task/ags_switch_buffer_flag.h>
+
+ #include <ags/audio/thread/ags_audio_loop.h>
+@@ -1610,11 +1611,14 @@
+ AgsJackClient *jack_client;
+ AgsJackDevout *jack_devout;
+
++ AgsNotifySoundcard *notify_soundcard;
++
+ AgsMutexManager *mutex_manager;
+ AgsTaskThread *task_thread;
+
+ AgsApplicationContext *application_context;
+
++ guint word_size;
+ gboolean jack_client_activated;
+
+ pthread_mutex_t *mutex;
+@@ -1650,13 +1654,49 @@
+ pthread_mutex_lock(mutex);
+
+ jack_devout->flags &= (~AGS_JACK_DEVOUT_START_PLAY);
+-
++ notify_soundcard = AGS_NOTIFY_SOUNDCARD(jack_devout->notify_soundcard);
++
+ if((AGS_JACK_DEVOUT_INITIALIZED & (jack_devout->flags)) == 0){
+ pthread_mutex_unlock(mutex);
+
+ return;
+ }
+
++ switch(jack_devout->format){
++ case AGS_SOUNDCARD_SIGNED_8_BIT:
++ {
++ word_size = sizeof(signed char);
++ }
++ break;
++ case AGS_SOUNDCARD_SIGNED_16_BIT:
++ {
++ word_size = sizeof(signed short);
++ }
++ break;
++ case AGS_SOUNDCARD_SIGNED_24_BIT:
++ {
++ //NOTE:JK: The 24-bit linear samples use 32-bit physical space
++ word_size = sizeof(signed long);
++ }
++ break;
++ case AGS_SOUNDCARD_SIGNED_32_BIT:
++ {
++ word_size = sizeof(signed long);
++ }
++ break;
++ case AGS_SOUNDCARD_SIGNED_64_BIT:
++ {
++ word_size = sizeof(signed long long);
++ }
++ break;
++ default:
++ pthread_mutex_unlock(mutex);
++
++ g_warning("ags_jack_devout_port_play(): unsupported word size\0");
++
++ return;
++ }
++
+ pthread_mutex_unlock(mutex);
+
+ /* */
+@@ -1715,19 +1755,20 @@
+ }
+
+ /* notify cyclic task */
+- pthread_mutex_lock(AGS_NOTIFY_SOUNDCARD(jack_devout->notify_soundcard)->return_mutex);
++ pthread_mutex_lock(notify_soundcard->return_mutex);
+
+- g_atomic_int_or(&(AGS_NOTIFY_SOUNDCARD(jack_devout->notify_soundcard)->flags),
++ g_atomic_int_or(&(notify_soundcard->flags),
+ AGS_NOTIFY_SOUNDCARD_DONE_RETURN);
+
+- if((AGS_NOTIFY_SOUNDCARD_WAIT_RETURN & (g_atomic_int_get(&(AGS_NOTIFY_SOUNDCARD(jack_devout->notify_soundcard)->flags)))) != 0){
+- pthread_cond_signal(AGS_NOTIFY_SOUNDCARD(jack_devout->notify_soundcard)->return_cond);
++ if((AGS_NOTIFY_SOUNDCARD_WAIT_RETURN & (g_atomic_int_get(&(notify_soundcard->flags)))) != 0){
++ pthread_cond_signal(notify_soundcard->return_cond);
+ }
+
+- pthread_mutex_unlock(AGS_NOTIFY_SOUNDCARD(jack_devout->notify_soundcard)->return_mutex);
++ pthread_mutex_unlock(notify_soundcard->return_mutex);
+
+ if(task_thread != NULL){
+ AgsTicDevice *tic_device;
++ AgsClearBuffer *clear_buffer;
+ AgsSwitchBufferFlag *switch_buffer_flag;
+
+ GList *task;
+@@ -1738,7 +1779,12 @@
+ tic_device = ags_tic_device_new((GObject *) jack_devout);
+ task = g_list_append(task,
+ tic_device);
+-
++
++ /* reset - clear buffer */
++ clear_buffer = ags_clear_buffer_new((GObject *) jack_devout);
++ task = g_list_append(task,
++ clear_buffer);
++
+ /* reset - switch buffer flags */
+ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) jack_devout);
+ task = g_list_append(task,
+@@ -1748,9 +1794,24 @@
+ ags_task_thread_append_tasks((AgsTaskThread *) task_thread,
+ task);
+ }else{
++ guint nth_buffer;
++
+ /* tic */
+ ags_soundcard_tic(AGS_SOUNDCARD(jack_devout));
+-
++
++ /* reset - clear buffer */
++ if((AGS_JACK_DEVOUT_BUFFER0 & (jack_devout->flags)) != 0){
++ nth_buffer = 3;
++ }else if((AGS_JACK_DEVOUT_BUFFER1 & (jack_devout->flags)) != 0){
++ nth_buffer = 0;
++ }else if((AGS_JACK_DEVOUT_BUFFER2 & (jack_devout->flags)) != 0){
++ nth_buffer = 1;
++ }else if((AGS_JACK_DEVOUT_BUFFER3 & jack_devout->flags) != 0){
++ nth_buffer = 2;
++ }
++
++ memset(jack_devout->buffer[nth_buffer], 0, (size_t) jack_devout->pcm_channels * jack_devout->buffer_size * word_size);
++
+ /* reset - switch buffer flags */
+ ags_jack_devout_switch_buffer_flag(jack_devout);
+ }
+@@ -1761,6 +1822,8 @@
+ {
+ AgsJackDevout *jack_devout;
+
++ AgsNotifySoundcard *notify_soundcard;
++
+ AgsMutexManager *mutex_manager;
+
+ AgsApplicationContext *application_context;
+@@ -1786,15 +1849,21 @@
+ pthread_mutex_unlock(application_context->mutex);
+
+ /* */
++ pthread_mutex_lock(mutex);
++
++ notify_soundcard = AGS_NOTIFY_SOUNDCARD(jack_devout->notify_soundcard);
++
+ if((AGS_JACK_DEVOUT_INITIALIZED & (jack_devout->flags)) == 0){
++ pthread_mutex_unlock(mutex);
++
+ return;
+ }
+
++ g_object_ref(notify_soundcard);
++
+ // g_atomic_int_or(&(AGS_THREAD(application_context->main_loop)->flags),
+ // AGS_THREAD_TIMING);
+
+- pthread_mutex_lock(mutex);
+-
+ callback_mutex = jack_devout->callback_mutex;
+ callback_finish_mutex = jack_devout->callback_finish_mutex;
+
+@@ -1808,8 +1877,6 @@
+ AGS_JACK_DEVOUT_PASS_THROUGH);
+ g_atomic_int_and(&(jack_devout->sync_flags),
+ (~AGS_JACK_DEVOUT_INITIAL_CALLBACK));
+-
+- pthread_mutex_unlock(mutex);
+
+ /* signal callback */
+ pthread_mutex_lock(callback_mutex);
+@@ -1836,20 +1903,20 @@
+ pthread_mutex_unlock(callback_finish_mutex);
+
+ /* notify cyclic task */
+- pthread_mutex_lock(AGS_NOTIFY_SOUNDCARD(jack_devout->notify_soundcard)->return_mutex);
++ pthread_mutex_lock(notify_soundcard->return_mutex);
+
+- g_atomic_int_or(&(AGS_NOTIFY_SOUNDCARD(jack_devout->notify_soundcard)->flags),
++ g_atomic_int_or(&(notify_soundcard->flags),
+ AGS_NOTIFY_SOUNDCARD_DONE_RETURN);
+
+- if((AGS_NOTIFY_SOUNDCARD_WAIT_RETURN & (g_atomic_int_get(&(AGS_NOTIFY_SOUNDCARD(jack_devout->notify_soundcard)->flags)))) != 0){
+- pthread_cond_signal(AGS_NOTIFY_SOUNDCARD(jack_devout->notify_soundcard)->return_cond);
++ if((AGS_NOTIFY_SOUNDCARD_WAIT_RETURN & (g_atomic_int_get(&(notify_soundcard->flags)))) != 0){
++ pthread_cond_signal(notify_soundcard->return_cond);
+ }
+
+- pthread_mutex_unlock(AGS_NOTIFY_SOUNDCARD(jack_devout->notify_soundcard)->return_mutex);
++ pthread_mutex_unlock(notify_soundcard->return_mutex);
+
++ g_object_unref(notify_soundcard);
++
+ /* */
+- pthread_mutex_lock(mutex);
+-
+ jack_devout->note_offset = 0;
+ jack_devout->note_offset_absolute = 0;
+
+--- a/ags/audio/jack/ags_jack_midiin.c
++++ b/ags/audio/jack/ags_jack_midiin.c
+@@ -1232,6 +1232,8 @@
+ pthread_mutex_t *callback_mutex;
+ pthread_mutex_t *callback_finish_mutex;
+
++ jack_midiin = AGS_JACK_MIDIIN(sequencer);
++
+ application_context = ags_sequencer_get_application_context(sequencer);
+
+ pthread_mutex_lock(application_context->mutex);
+@@ -1245,8 +1247,6 @@
+
+ pthread_mutex_lock(mutex);
+
+- jack_midiin = AGS_JACK_MIDIIN(sequencer);
+-
+ if((AGS_JACK_MIDIIN_INITIALIZED & (jack_midiin->flags)) == 0){
+ pthread_mutex_unlock(mutex);
+
+--- a/ags/audio/recall/ags_copy_pattern_channel_run.c
++++ b/ags/audio/recall/ags_copy_pattern_channel_run.c
+@@ -364,7 +364,7 @@
+ gdouble delay, guint attack,
+ AgsCopyPatternChannelRun *copy_pattern_channel_run)
+ {
+- AgsChannel *output, *source;
++ AgsChannel *source;
+ AgsPattern *pattern;
+ AgsCopyPatternAudio *copy_pattern_audio;
+ AgsCopyPatternAudioRun *copy_pattern_audio_run;
+@@ -380,7 +380,8 @@
+
+ pthread_mutex_t *application_mutex;
+ pthread_mutex_t *pattern_mutex;
+-
++ pthread_mutex_t *source_mutex;
++
+ if(delay != 0.0){
+ return;
+ }
+@@ -440,34 +441,66 @@
+
+ /* */
+ if(current_bit){
++ AgsChannel *link;
+ AgsRecycling *recycling;
++ AgsRecycling *end_recycling;
+ AgsAudioSignal *audio_signal;
+
+ gdouble delay;
+ guint attack;
+
++ pthread_mutex_t *link_mutex;
++
+ // g_message("ags_copy_pattern_channel_run_sequencer_alloc_callback - playing channel: %u; playing pattern: %u\0",
+ // AGS_RECALL_CHANNEL(copy_pattern_channel)->source->line,
+ // copy_pattern_audio_run->count_beats_audio_run->sequencer_counter);
+
+ /* get source */
+ source = AGS_RECALL_CHANNEL(copy_pattern_channel)->source;
++
++ pthread_mutex_lock(application_mutex);
++
++ source_mutex = ags_mutex_manager_lookup(mutex_manager,
++ (GObject *) source);
++
++ pthread_mutex_unlock(application_mutex);
++
++ /* source fields */
++ pthread_mutex_lock(source_mutex);
++
++ link = source->link;
+
+- /* create new audio signals */
+ recycling = source->first_recycling;
++
++ if(recycling != NULL){
++ end_recycling = source->last_recycling->next;
++ }
+
+- //TODO:JK: unclear
++ pthread_mutex_unlock(source_mutex);
+
++ /* link */
++ if(link != NULL){
++ pthread_mutex_lock(application_mutex);
++
++ link_mutex = ags_mutex_manager_lookup(mutex_manager,
++ (GObject *) link);
++
++ pthread_mutex_unlock(application_mutex);
++ }
++
++ /* create audio signals */
+ if(recycling != NULL){
+ AgsRecallID *child_recall_id;
+
+- while(recycling != source->last_recycling->next){
+- if(source->link == NULL){
++ while(recycling != end_recycling){
++ if(link == NULL){
+ child_recall_id = AGS_RECALL(copy_pattern_channel_run)->recall_id;
+ }else{
+ GList *list;
+
+- list = source->link->recall_id;
++ pthread_mutex_lock(link_mutex);
++
++ list = link->recall_id;
+
+ while(list != NULL){
+ if(AGS_RECALL_ID(list->data)->recycling_context->parent == AGS_RECALL(copy_pattern_channel_run)->recall_id->recycling_context){
+@@ -481,6 +514,8 @@
+ if(list == NULL){
+ child_recall_id = NULL;
+ }
++
++ pthread_mutex_unlock(link_mutex);
+ }
+
+ audio_signal = ags_audio_signal_new(AGS_RECALL(copy_pattern_audio)->soundcard,
+--- a/ags/audio/recall/ags_count_beats_audio_run.c
++++ b/ags/audio/recall/ags_count_beats_audio_run.c
+@@ -1446,38 +1446,87 @@
+ }else{
+ if(count_beats_audio_run->sequencer_counter >= (guint) loop_end - 1.0){
+ AgsAudio *audio;
++
++ AgsMutexManager *mutex_manager;
++
+ GList *playback;
+
++ pthread_mutex_t *application_mutex;
++ pthread_mutex_t *audio_mutex;
++
++ audio = AGS_RECALL_AUDIO_RUN(count_beats_audio_run)->recall_audio->audio;
++
++ mutex_manager = ags_mutex_manager_get_instance();
++ application_mutex = ags_mutex_manager_get_application_mutex(mutex_manager);
++
++ /* lookup audio mutex */
++ pthread_mutex_lock(application_mutex);
++
++ audio_mutex = ags_mutex_manager_lookup(mutex_manager,
++ audio);
++
++ pthread_mutex_unlock(application_mutex);
++
++ /* reset sequencer counter */
+ count_beats_audio_run->sequencer_counter = 0;
+
+- audio = AGS_RECALL_AUDIO_RUN(count_beats_audio_run)->recall_audio->audio;
++ /* get playback */
++ pthread_mutex_lock(audio_mutex);
++
+ playback = AGS_PLAYBACK_DOMAIN(audio->playback_domain)->playback;
+
++ pthread_mutex_unlock(audio_mutex);
++
+ /* emit stop signals */
+ ags_count_beats_audio_run_sequencer_stop(count_beats_audio_run,
+ FALSE);
+
+ /* set done flag in soundcard play */
+ while(playback != NULL){
+- if(AGS_PLAYBACK(playback->data)->recall_id[1] != NULL &&
+- AGS_PLAYBACK(playback->data)->recall_id[1]->recycling_context == AGS_RECALL(count_beats_audio_run)->recall_id->recycling_context){
+- AgsChannel *channel;
++ AgsChannel *channel;
++ AgsRecyclingContext *recycling_context;
++
++ pthread_mutex_lock(audio_mutex);
++
++ channel = audio->output;
++
++ if(AGS_PLAYBACK(playback->data)->recall_id[1] != NULL){
++ recycling_context = AGS_PLAYBACK(playback->data)->recall_id[1]->recycling_context;
++ }else{
++ recycling_context = NULL;
++ }
++
++ pthread_mutex_unlock(audio_mutex);
++
++ if(recycling_context == AGS_RECALL(count_beats_audio_run)->recall_id->recycling_context){
+ AgsStreamChannelRun *stream_channel_run;
++
+ GList *list;
+ GList *recall_recycling_list, *recall_audio_signal_list;
++
+ gboolean found;
+
++ pthread_mutex_t *channel_mutex;
++
+ // AGS_PLAYBACK(playback->data)->flags |= AGS_PLAYBACK_DONE;
+
++ /* lookup channel mutex */
++ pthread_mutex_lock(application_mutex);
++
++ channel_mutex = ags_mutex_manager_lookup(mutex_manager,
++ channel);
++
++ pthread_mutex_unlock(application_mutex);
++
+ /* check if to stop audio processing */
+- channel = audio->output;
+ found = FALSE;
+
++ pthread_mutex_lock(channel_mutex);
++
+ list = channel->play;
+-
+ list = ags_recall_find_type_with_recycling_context(list,
+ AGS_TYPE_STREAM_CHANNEL_RUN,
+- (GObject *) AGS_RECALL(count_beats_audio_run)->recall_id->recycling_context);
++ (GObject *) recycling_context);
+
+ if(list != NULL){
+ stream_channel_run = AGS_STREAM_CHANNEL_RUN(list->data);
+@@ -1500,6 +1549,8 @@
+ }
+ }
+
++ pthread_mutex_unlock(channel_mutex);
++
+ /* stop audio processing*/
+ if(!found){
+ ags_count_beats_audio_run_stop(count_beats_audio_run,
+@@ -1509,7 +1560,12 @@
+ break;
+ }
+
+- playback = playback->next;
++ /* iterate playback */
++ pthread_mutex_lock(audio_mutex);
++
++ playback = playback->next;
++
++ pthread_mutex_unlock(audio_mutex);
+ }
+
+ return;
+--- a/ags/audio/recall/ags_delay_audio_run.c
++++ b/ags/audio/recall/ags_delay_audio_run.c
+@@ -26,6 +26,8 @@
+ #include <ags/object/ags_soundcard.h>
+ #include <ags/object/ags_plugin.h>
+
++#include <ags/thread/ags_mutex_manager.h>
++
+ #include <ags/file/ags_file_stock.h>
+ #include <ags/file/ags_file_id_ref.h>
+ #include <ags/file/ags_file_lookup.h>
+@@ -441,16 +443,24 @@
+ AgsDelayAudio *delay_audio;
+ AgsDelayAudioRun *delay_audio_run;
+
++ AgsMutexManager *mutex_manager;
++
+ gdouble notation_delay, sequencer_delay;
++ gdouble delay;
++ guint attack;
+
+ GValue value = { 0, };
+
++ pthread_mutex_t *application_mutex;
++ pthread_mutex_t *soundcard_mutex;
++
+ AGS_RECALL_CLASS(ags_delay_audio_run_parent_class)->run_pre(recall);
+
+ // g_message("ags_delay_audio_run_run_pre()\0");
+
+ delay_audio_run = AGS_DELAY_AUDIO_RUN(recall);
+
++ /* check done */
+ if((AGS_RECALL_PERSISTENT & (recall->flags)) == 0 &&
+ delay_audio_run->dependency_ref == 0){
+ delay_audio_run->notation_counter = 0;
+@@ -463,6 +473,17 @@
+
+ delay_audio = AGS_DELAY_AUDIO(AGS_RECALL_AUDIO_RUN(delay_audio_run)->recall_audio);
+
++ mutex_manager = ags_mutex_manager_get_instance();
++ application_mutex = ags_mutex_manager_get_application_mutex(mutex_manager);
++
++ /* lookup soundcard mutex */
++ pthread_mutex_lock(application_mutex);
++
++ soundcard_mutex = ags_mutex_manager_lookup(mutex_manager,
++ recall->soundcard);
++
++ pthread_mutex_unlock(application_mutex);
++
+ /* read notation-delay port */
+ g_value_init(&value, G_TYPE_DOUBLE);
+
+@@ -489,22 +510,22 @@
+ }else{
+ delay_audio_run->sequencer_counter += 1;
+ }
++
++ /* delay and attack */
++ pthread_mutex_lock(soundcard_mutex);
++
++ attack = ags_soundcard_get_attack(AGS_SOUNDCARD(recall->soundcard));
++
++ pthread_mutex_unlock(soundcard_mutex);
++
++ delay = 0.0;
+
++ /* notation */
+ if(delay_audio_run->notation_counter == 0){
+ guint run_order;
+- gdouble delay;
+- guint attack;
+
+ run_order = 0; //NOTE:JK: old hide_ref style
+
+- /* delay and attack */
+- //TODO:JK: unclear
+- attack = ags_soundcard_get_attack(AGS_SOUNDCARD(recall->soundcard));
+-
+- delay = 0.0; // soundcard->delay[((soundcard->tic_counter + 1 == AGS_NOTATION_TICS_PER_BEAT) ?
+- // 0:
+- // soundcard->tic_counter + 1)];
+-
+ // g_message("ags_delay_audio_run_run_pre@%llu: alloc notation[%u]\0",
+ // delay_audio_run,
+ // run_order);
+@@ -521,8 +542,6 @@
+ delay, attack);
+ }else{
+ guint run_order;
+- gdouble delay;
+- guint attack;
+
+ run_order = 0;
+
+@@ -541,17 +560,9 @@
+ delay, attack);
+ }
+
++ /* sequencer */
+ if(delay_audio_run->sequencer_counter == 0){
+ guint run_order;
+- gdouble delay;
+- guint attack;
+-
+- /* delay and attack */
+- //TODO:JK: unclear
+- attack = ags_soundcard_get_attack(AGS_SOUNDCARD(recall->soundcard));
+- delay = 0.0; // soundcard->delay[((soundcard->tic_counter + 1 == AGS_NOTATION_TICS_PER_BEAT) ?
+- // 0:
+- // soundcard->tic_counter + 1)];
+
+ run_order = 0;
+
+@@ -572,8 +583,6 @@
+ delay, attack);
+ }else{
+ guint run_order;
+- gdouble delay;
+- guint attack;
+
+ run_order = 0;
+
+--- a/ags/audio/recall/ags_play_audio_signal.c
++++ b/ags/audio/recall/ags_play_audio_signal.c
+@@ -246,7 +246,7 @@
+
+ play_audio_signal = AGS_PLAY_AUDIO_SIGNAL(recall);
+
+- soundcard = AGS_RECALL(play_audio_signal)->soundcard;
++ soundcard = recall->soundcard;
+ source = AGS_AUDIO_SIGNAL(AGS_RECALL_AUDIO_SIGNAL(play_audio_signal)->source);
+ stream = source->stream_current;
+
+--- a/ags/audio/recall/ags_record_midi_audio_run.c
++++ b/ags/audio/recall/ags_record_midi_audio_run.c
+@@ -87,7 +87,7 @@
+ * @section_id:
+ * @include: ags/audio/recall/ags_record_midi_audio_run.h
+ *
+- * The #AgsRecordMidiAudioRun class record midi.
++ * The #AgsRecordMidiAudioRun does record midi.
+ */
+
+ enum{
+@@ -610,7 +610,7 @@
+ AgsRecallID *recall_id,
+ guint *n_params, GParameter *parameter)
+ {
+- AgsRecordMidiAudioRun *copy, *record_midi_audio_run;
++ AgsRecordMidiAudioRun *copy;
+
+ copy = AGS_RECORD_MIDI_AUDIO_RUN(AGS_RECALL_CLASS(ags_record_midi_audio_run_parent_class)->duplicate(recall,
+ recall_id,
+@@ -687,8 +687,10 @@
+
+ glong division, tempo, bpm;
+ guint notation_counter;
++ gboolean reverse_mapping;
+ gboolean pattern_mode;
+ gboolean playback, record;
++ guint midi_channel;
+ guint audio_start_mapping;
+ guint midi_start_mapping, midi_end_mapping;
+ guint input_pads;
+@@ -703,22 +705,15 @@
+ pthread_mutex_t *audio_mutex;
+ pthread_mutex_t *channel_mutex;
+
++ /* */
++ mutex_manager = ags_mutex_manager_get_instance();
++ application_mutex = ags_mutex_manager_get_application_mutex(mutex_manager);
++
++ /* get defaults */
+ record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(recall);
+ record_midi_audio = AGS_RECORD_MIDI_AUDIO(AGS_RECALL_AUDIO_RUN(recall)->recall_audio);
+
+- delay_audio_run = record_midi_audio_run->delay_audio_run;
+- count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(record_midi_audio_run->count_beats_audio_run);
+-
+ audio = AGS_RECALL_AUDIO(record_midi_audio)->audio;
+- sequencer = audio->sequencer;
+-
+- if(sequencer == NULL){
+- return;
+- }
+-
+- /* */
+- mutex_manager = ags_mutex_manager_get_instance();
+- application_mutex = ags_mutex_manager_get_application_mutex(mutex_manager);
+
+ /* get audio mutex */
+ pthread_mutex_lock(application_mutex);
+@@ -728,10 +723,29 @@
+
+ pthread_mutex_unlock(application_mutex);
+
++ /* */
++ pthread_mutex_lock(audio_mutex);
++
++ delay_audio_run = record_midi_audio_run->delay_audio_run;
++ count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(record_midi_audio_run->count_beats_audio_run);
++
++ sequencer = audio->sequencer;
++
++ pthread_mutex_unlock(audio_mutex);
++
++ if(sequencer == NULL){
++ return;
++ }
++
+ /* get audio fields */
+ pthread_mutex_lock(audio_mutex);
+
++ reverse_mapping = ((AGS_AUDIO_REVERSE_MAPPING & (audio->flags)) != 0) ? TRUE: FALSE;
++
+ pattern_mode = ((AGS_AUDIO_PATTERN_MODE & (audio->flags)) != 0) ? TRUE: FALSE;
++
++ midi_channel = audio->midi_channel;
++
+ audio_start_mapping = audio->audio_start_mapping;
+
+ midi_start_mapping = audio->midi_start_mapping;
+@@ -785,10 +799,10 @@
+ notation = NULL;
+ }
+
+- pthread_mutex_unlock(audio_mutex);
+-
+ /* */
+ notation_counter = count_beats_audio_run->notation_counter;
++
++ pthread_mutex_unlock(audio_mutex);
+
+ /* get mode */
+ g_value_init(&value,
+@@ -852,18 +866,20 @@
+ AgsNote *current_note;
+
+ /* key on - check within mapping */
+- if(audio->midi_channel == (0x0f & midi_iter[0])){
++ if(midi_channel == (0x0f & midi_iter[0])){
+ if(midi_start_mapping <= (0x7f & midi_iter[1]) &&
+- (((AGS_AUDIO_REVERSE_MAPPING & (audio->flags)) != 0 &&
++ ((reverse_mapping &&
+ input_pads - ((0x7f & midi_iter[1]) - midi_start_mapping) - 1 > 0) ||
+- ((AGS_AUDIO_REVERSE_MAPPING & (audio->flags)) == 0 &&
++ (!reverse_mapping &&
+ (0x7f & midi_iter[1]) - midi_start_mapping < midi_end_mapping))){
+ current_note = NULL;
+ note = record_midi_audio_run->note;
+
++ pthread_mutex_lock(audio_mutex);
++
+ while(note != NULL){
+ /* check current notes */
+- if((AGS_AUDIO_REVERSE_MAPPING & (audio->flags)) != 0){
++ if(reverse_mapping){
+ if(AGS_NOTE(note->data)->y == input_pads - ((0x7f & midi_iter[1]) - midi_start_mapping) - 1){
+ current_note = note->data;
+
+@@ -879,7 +895,9 @@
+
+ note = note->next;
+ }
+-
++
++ pthread_mutex_unlock(audio_mutex);
++
+ /* add note */
+ if(current_note == NULL){
+ if((0x7f & (midi_iter[2])) != 0){
+@@ -888,7 +906,7 @@
+ current_note->x[0] = notation_counter;
+ current_note->x[1] = notation_counter + 1;
+
+- if((AGS_AUDIO_REVERSE_MAPPING & (audio->flags)) != 0){
++ if(reverse_mapping){
+ current_note->y = input_pads - ((0x7f & midi_iter[1]) - midi_start_mapping) - 1;
+ }else{
+ current_note->y = (0x7f & midi_iter[1]) - midi_start_mapping;
+@@ -946,10 +964,12 @@
+ /* key off - find matching note */
+ current_note = NULL;
+ note = record_midi_audio_run->note;
+-
++
++ pthread_mutex_lock(audio_mutex);
++
+ while(note != NULL){
+ /* check current notes */
+- if((AGS_AUDIO_REVERSE_MAPPING & (audio->flags)) != 0){
++ if(reverse_mapping){
+ if(AGS_NOTE(note->data)->y == input_pads - ((0x7f & midi_iter[1]) - midi_start_mapping) - 1){
+ current_note = note->data;
+
+@@ -965,7 +985,9 @@
+
+ note = note->next;
+ }
+-
++
++ pthread_mutex_unlock(audio_mutex);
++
+ /* remove current note */
+ if(current_note != NULL){
+ pthread_mutex_lock(audio_mutex);
+@@ -992,9 +1014,11 @@
+ current_note = NULL;
+ note = record_midi_audio_run->note;
+
++ pthread_mutex_lock(audio_mutex);
++
+ while(note != NULL){
+ /* check current notes */
+- if((AGS_AUDIO_REVERSE_MAPPING & (audio->flags)) != 0){
++ if(reverse_mapping){
+ if(AGS_NOTE(note->data)->y == input_pads - ((0x7f & midi_iter[1]) - midi_start_mapping) - 1){
+ current_note = note->data;
+
+@@ -1010,7 +1034,9 @@
+
+ note = note->next;
+ }
+-
++
++ pthread_mutex_unlock(audio_mutex);
++
+ /* feed note */
+ if(current_note != NULL){
+ current_note->x[1] = notation_counter + 1;
+@@ -1116,6 +1142,7 @@
+ }
+ }
+
++ /* call parent */
+ AGS_RECALL_CLASS(ags_record_midi_audio_run_parent_class)->run_pre(recall);
+ }
+
+--- /dev/null
++++ b/ags/audio/task/ags_clear_buffer.c
+@@ -0,0 +1,379 @@
++/* GSequencer - Advanced GTK Sequencer
++ * Copyright (C) 2005-2015 Joël Krähemann
++ *
++ * This file is part of GSequencer.
++ *
++ * GSequencer is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation, either version 3 of the License, or
++ * (at your option) any later version.
++ *
++ * GSequencer is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with GSequencer. If not, see <http://www.gnu.org/licenses/>.
++ */
++
++#include <ags/audio/task/ags_clear_buffer.h>
++
++#include <ags/object/ags_connectable.h>
++#include <ags/object/ags_soundcard.h>
++
++#include <ags/audio/ags_devout.h>
++#include <ags/audio/ags_midiin.h>
++
++#include <ags/audio/jack/ags_jack_devout.h>
++#include <ags/audio/jack/ags_jack_midiin.h>
++
++void ags_clear_buffer_class_init(AgsClearBufferClass *clear_buffer);
++void ags_clear_buffer_connectable_interface_init(AgsConnectableInterface *connectable);
++void ags_clear_buffer_init(AgsClearBuffer *clear_buffer);
++void ags_clear_buffer_set_property(GObject *gobject,
++ guint prop_id,
++ const GValue *value,
++ GParamSpec *param_spec);
++void ags_clear_buffer_get_property(GObject *gobject,
++ guint prop_id,
++ GValue *value,
++ GParamSpec *param_spec);
++void ags_clear_buffer_connect(AgsConnectable *connectable);
++void ags_clear_buffer_disconnect(AgsConnectable *connectable);
++void ags_clear_buffer_finalize(GObject *gobject);
++
++void ags_clear_buffer_launch(AgsTask *task);
++
++/**
++ * SECTION:ags_clear_buffer
++ * @short_description: switch buffer flag of device
++ * @title: AgsClearBuffer
++ * @section_id:
++ * @include: ags/audio/task/ags_clear_buffer.h
++ *
++ * The #AgsClearBuffer task switches the buffer flag of device.
++ */
++
++static gpointer ags_clear_buffer_parent_class = NULL;
++static AgsConnectableInterface *ags_clear_buffer_parent_connectable_interface;
++
++enum{
++ PROP_0,
++ PROP_DEVICE,
++};
++
++GType
++ags_clear_buffer_get_type()
++{
++ static GType ags_type_clear_buffer = 0;
++
++ if(!ags_type_clear_buffer){
++ static const GTypeInfo ags_clear_buffer_info = {
++ sizeof (AgsClearBufferClass),
++ NULL, /* base_init */
++ NULL, /* base_finalize */
++ (GClassInitFunc) ags_clear_buffer_class_init,
++ NULL, /* class_finalize */
++ NULL, /* class_data */
++ sizeof (AgsClearBuffer),
++ 0, /* n_preallocs */
++ (GInstanceInitFunc) ags_clear_buffer_init,
++ };
++
++ static const GInterfaceInfo ags_connectable_interface_info = {
++ (GInterfaceInitFunc) ags_clear_buffer_connectable_interface_init,
++ NULL, /* interface_finalize */
++ NULL, /* interface_data */
++ };
++
++ ags_type_clear_buffer = g_type_register_static(AGS_TYPE_TASK,
++ "AgsClearBuffer\0",
++ &ags_clear_buffer_info,
++ 0);
++
++ g_type_add_interface_static(ags_type_clear_buffer,
++ AGS_TYPE_CONNECTABLE,
++ &ags_connectable_interface_info);
++ }
++
++ return (ags_type_clear_buffer);
++}
++
++void
++ags_clear_buffer_class_init(AgsClearBufferClass *clear_buffer)
++{
++ GObjectClass *gobject;
++ AgsTaskClass *task;
++ GParamSpec *param_spec;
++
++ ags_clear_buffer_parent_class = g_type_class_peek_parent(clear_buffer);
++
++ /* gobject */
++ gobject = (GObjectClass *) clear_buffer;
++
++ gobject->set_property = ags_clear_buffer_set_property;
++ gobject->get_property = ags_clear_buffer_get_property;
++
++ gobject->finalize = ags_clear_buffer_finalize;
++
++ /* properties */
++ /**
++ * AgsClearBuffer:device:
++ *
++ * The assigned #AgsSoundcard or #AgsSequencer
++ *
++ * Since: 0.7.124
++ */
++ param_spec = g_param_spec_object("device\0",
++ "device of change device\0",
++ "The device of change device task\0",
++ G_TYPE_OBJECT,
++ G_PARAM_READABLE | G_PARAM_WRITABLE);
++ g_object_class_install_property(gobject,
++ PROP_DEVICE,
++ param_spec);
++
++ /* task */
++ task = (AgsTaskClass *) clear_buffer;
++
++ task->launch = ags_clear_buffer_launch;
++}
++
++void
++ags_clear_buffer_connectable_interface_init(AgsConnectableInterface *connectable)
++{
++ ags_clear_buffer_parent_connectable_interface = g_type_interface_peek_parent(connectable);
++
++ connectable->connect = ags_clear_buffer_connect;
++ connectable->disconnect = ags_clear_buffer_disconnect;
++}
++
++void
++ags_clear_buffer_init(AgsClearBuffer *clear_buffer)
++{
++ clear_buffer->device = NULL;
++}
++
++void
++ags_clear_buffer_set_property(GObject *gobject,
++ guint prop_id,
++ const GValue *value,
++ GParamSpec *param_spec)
++{
++ AgsClearBuffer *clear_buffer;
++
++ clear_buffer = AGS_CLEAR_BUFFER(gobject);
++
++ switch(prop_id){
++ case PROP_DEVICE:
++ {
++ GObject *device;
++
++ device = (GObject *) g_value_get_object(value);
++
++ if(clear_buffer->device == (GObject *) device){
++ return;
++ }
++
++ if(clear_buffer->device != NULL){
++ g_object_unref(clear_buffer->device);
++ }
++
++ if(device != NULL){
++ g_object_ref(device);
++ }
++
++ clear_buffer->device = (GObject *) device;
++ }
++ break;
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
++ break;
++ }
++}
++
++void
++ags_clear_buffer_get_property(GObject *gobject,
++ guint prop_id,
++ GValue *value,
++ GParamSpec *param_spec)
++{
++ AgsClearBuffer *clear_buffer;
++
++ clear_buffer = AGS_CLEAR_BUFFER(gobject);
++
++ switch(prop_id){
++ case PROP_DEVICE:
++ {
++ g_value_set_object(value, clear_buffer->device);
++ }
++ break;
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
++ break;
++ }
++}
++
++void
++ags_clear_buffer_connect(AgsConnectable *connectable)
++{
++ ags_clear_buffer_parent_connectable_interface->connect(connectable);
++
++ /* empty */
++}
++
++void
++ags_clear_buffer_disconnect(AgsConnectable *connectable)
++{
++ ags_clear_buffer_parent_connectable_interface->disconnect(connectable);
++
++ /* empty */
++}
++
++void
++ags_clear_buffer_finalize(GObject *gobject)
++{
++ G_OBJECT_CLASS(ags_clear_buffer_parent_class)->finalize(gobject);
++
++ /* empty */
++}
++
++void
++ags_clear_buffer_launch(AgsTask *task)
++{
++ AgsClearBuffer *clear_buffer;
++
++ guint nth_buffer;
++ guint word_size;
++
++ clear_buffer = AGS_CLEAR_BUFFER(task);
++
++ if(AGS_IS_DEVOUT(clear_buffer->device)){
++ AgsDevout *devout;
++
++ devout = clear_buffer->device;
++
++ /* retrieve word size */
++ switch(devout->format){
++ case AGS_SOUNDCARD_SIGNED_8_BIT:
++ {
++ word_size = sizeof(signed char);
++ }
++ break;
++ case AGS_SOUNDCARD_SIGNED_16_BIT:
++ {
++ word_size = sizeof(signed short);
++ }
++ break;
++ case AGS_SOUNDCARD_SIGNED_24_BIT:
++ {
++ word_size = sizeof(signed long);
++ }
++ break;
++ case AGS_SOUNDCARD_SIGNED_32_BIT:
++ {
++ word_size = sizeof(signed long);
++ }
++ break;
++ case AGS_SOUNDCARD_SIGNED_64_BIT:
++ {
++ word_size = sizeof(signed long long);
++ }
++ break;
++ default:
++ g_warning("ags_clear_buffer_launch(): unsupported word size\0");
++
++ return;
++ }
++
++
++ if((AGS_DEVOUT_BUFFER0 & (devout->flags)) != 0){
++ nth_buffer = 0;
++ }else if((AGS_DEVOUT_BUFFER1 & (devout->flags)) != 0){
++ nth_buffer = 1;
++ }else if((AGS_DEVOUT_BUFFER2 & (devout->flags)) != 0){
++ nth_buffer = 2;
++ }else if((AGS_DEVOUT_BUFFER3 & devout->flags) != 0){
++ nth_buffer = 3;
++ }
++
++ memset(devout->buffer[nth_buffer], 0, (size_t) devout->pcm_channels * devout->buffer_size * word_size);
++ }else if(AGS_IS_JACK_DEVOUT(clear_buffer->device)){
++ AgsJackDevout *jack_devout;
++
++ jack_devout = clear_buffer->device;
++
++ switch(jack_devout->format){
++ case AGS_SOUNDCARD_SIGNED_8_BIT:
++ {
++ word_size = sizeof(signed char);
++ }
++ break;
++ case AGS_SOUNDCARD_SIGNED_16_BIT:
++ {
++ word_size = sizeof(signed short);
++ }
++ break;
++ case AGS_SOUNDCARD_SIGNED_24_BIT:
++ {
++ //NOTE:JK: The 24-bit linear samples use 32-bit physical space
++ word_size = sizeof(signed long);
++ }
++ break;
++ case AGS_SOUNDCARD_SIGNED_32_BIT:
++ {
++ word_size = sizeof(signed long);
++ }
++ break;
++ case AGS_SOUNDCARD_SIGNED_64_BIT:
++ {
++ word_size = sizeof(signed long long);
++ }
++ break;
++ default:
++ g_warning("ags_clear_buffer_launch(): unsupported word size\0");
++
++ return;
++ }
++
++ if((AGS_JACK_DEVOUT_BUFFER0 & (jack_devout->flags)) != 0){
++ nth_buffer = 3;
++ }else if((AGS_JACK_DEVOUT_BUFFER1 & (jack_devout->flags)) != 0){
++ nth_buffer = 0;
++ }else if((AGS_JACK_DEVOUT_BUFFER2 & (jack_devout->flags)) != 0){
++ nth_buffer = 1;
++ }else if((AGS_JACK_DEVOUT_BUFFER3 & jack_devout->flags) != 0){
++ nth_buffer = 2;
++ }
++
++ memset(jack_devout->buffer[nth_buffer], 0, (size_t) jack_devout->pcm_channels * jack_devout->buffer_size * word_size);
++ }else if(AGS_IS_MIDIIN(clear_buffer->device)){
++ //TODO:JK: implement me
++ }else if(AGS_IS_JACK_MIDIIN(clear_buffer->device)){
++ //TODO:JK: implement me
++ }
++}
++
++/**
++ * ags_clear_buffer_new:
++ * @device: the #AgsSoundcard or #AgsSequencer
++ *
++ * Creates an #AgsClearBuffer.
++ *
++ * Returns: an new #AgsClearBuffer.
++ *
++ * Since: 0.7.124
++ */
++AgsClearBuffer*
++ags_clear_buffer_new(GObject *device)
++{
++ AgsClearBuffer *clear_buffer;
++
++ clear_buffer = (AgsClearBuffer *) g_object_new(AGS_TYPE_CLEAR_BUFFER,
++ NULL);
++
++ clear_buffer->device = device;
++
++ return(clear_buffer);
++}
+--- /dev/null
++++ b/ags/audio/task/ags_clear_buffer.h
+@@ -0,0 +1,54 @@
++/* GSequencer - Advanced GTK Sequencer
++ * Copyright (C) 2005-2015 Joël Krähemann
++ *
++ * This file is part of GSequencer.
++ *
++ * GSequencer is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation, either version 3 of the License, or
++ * (at your option) any later version.
++ *
++ * GSequencer is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with GSequencer. If not, see <http://www.gnu.org/licenses/>.
++ */
++
++#ifndef __AGS_CLEAR_BUFFER_H__
++#define __AGS_CLEAR_BUFFER_H__
++
++#include <glib.h>
++#include <glib-object.h>
++
++#include <ags/thread/ags_task.h>
++
++#define AGS_TYPE_CLEAR_BUFFER (ags_clear_buffer_get_type())
++#define AGS_CLEAR_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CLEAR_BUFFER, AgsClearBuffer))
++#define AGS_CLEAR_BUFFER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CLEAR_BUFFER, AgsClearBufferClass))
++#define AGS_IS_CLEAR_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CLEAR_BUFFER))
++#define AGS_IS_CLEAR_BUFFER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_CLEAR_BUFFER))
++#define AGS_CLEAR_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_CLEAR_BUFFER, AgsClearBufferClass))
++
++typedef struct _AgsClearBuffer AgsClearBuffer;
++typedef struct _AgsClearBufferClass AgsClearBufferClass;
++
++struct _AgsClearBuffer
++{
++ AgsTask task;
++
++ GObject *device;
++};
++
++struct _AgsClearBufferClass
++{
++ AgsTaskClass task;
++};
++
++GType ags_clear_buffer_get_type();
++
++AgsClearBuffer* ags_clear_buffer_new(GObject *device);
++
++#endif /*__AGS_CLEAR_BUFFER_H__*/
+--- a/ags/audio/thread/ags_audio_loop.c
++++ b/ags/audio/thread/ags_audio_loop.c
+@@ -294,9 +294,6 @@
+ mutex_manager = ags_mutex_manager_get_instance();
+ application_mutex = ags_mutex_manager_get_application_mutex(mutex_manager);
+
+- // g_atomic_int_or(&(thread->flags),
+- // AGS_THREAD_TIMING);
+-
+ // thread->flags |= AGS_THREAD_WAIT_FOR_CHILDREN;
+ pthread_mutex_lock(application_mutex);
+
+@@ -624,8 +621,8 @@
+ /* */
+ AGS_THREAD_CLASS(ags_audio_loop_parent_class)->start(thread);
+
+- pthread_create(audio_loop->timing_thread, NULL,
+- ags_audio_loop_timing_thread, audio_loop);
++ // pthread_create(audio_loop->timing_thread, NULL,
++ // ags_audio_loop_timing_thread, audio_loop);
+ }
+ }
+
+@@ -832,9 +829,9 @@
+
+ g_atomic_int_set(&(audio_loop->time_spent),
+ audio_loop->time_cycle);
+- ags_main_loop_interrupt(AGS_MAIN_LOOP(thread),
+- AGS_THREAD_SUSPEND_SIG,
+- audio_loop->time_cycle, &time_spent);
++ // ags_main_loop_interrupt(AGS_MAIN_LOOP(thread),
++ // AGS_THREAD_SUSPEND_SIG,
++ // audio_loop->time_cycle, &time_spent);
+
+ // g_message("inter\0");
+ }
+--- a/ags/audio/thread/ags_export_thread.c
++++ b/ags/audio/thread/ags_export_thread.c
+@@ -365,9 +365,9 @@
+ ags_export_thread_run(AgsThread *thread)
+ {
+ AgsExportThread *export_thread;
+- AgsSoundcard *soundcard;
+
+ AgsMutexManager *mutex_manager;
++ AgsSoundcard *soundcard;
+
+ void *soundcard_buffer;
+
+--- a/ags/audio/thread/ags_soundcard_thread.c
++++ b/ags/audio/thread/ags_soundcard_thread.c
+@@ -24,6 +24,7 @@
+ #include <ags/object/ags_connectable.h>
+ #include <ags/object/ags_main_loop.h>
+
++#include <ags/thread/ags_mutex_manager.h>
+ #include <ags/thread/ags_polling_thread.h>
+ #include <ags/thread/ags_poll_fd.h>
+ #include <ags/thread/ags_timestamp_thread.h>
+@@ -179,6 +180,9 @@
+ (AGS_THREAD_START_SYNCED_FREQ |
+ AGS_THREAD_INTERMEDIATE_POST_SYNC));
+
++ // g_atomic_int_or(&(thread->flags),
++ // AGS_THREAD_TIMING);
++
+ config = ags_config_get_instance();
+
+ str0 = ags_config_get_value(config,
+@@ -382,10 +386,19 @@
+
+ while(poll_fd != NULL){
+ if(polling_thread != NULL){
++ gint position;
++
+ ags_polling_thread_add_poll_fd(polling_thread,
+ poll_fd->data);
+ g_signal_connect(G_OBJECT(poll_fd->data), "dispatch\0",
+ G_CALLBACK(ags_soundcard_thread_dispatch_callback), soundcard_thread);
++
++ position = ags_polling_thread_fd_position(polling_thread,
++ AGS_POLL_FD(poll_fd->data)->fd);
++
++ if(position != -1){
++ polling_thread->fds[position].events = POLLOUT;
++ }
+ }
+
+ poll_fd = poll_fd->next;
+@@ -401,18 +414,33 @@
+ {
+ AgsSoundcardThread *soundcard_thread;
+
++ AgsMutexManager *mutex_manager;
+ AgsSoundcard *soundcard;
+
+ GList *poll_fd;
+
+- long delay;
++ gboolean is_playing;
+
+ GError *error;
+
++ pthread_mutex_t *application_mutex;
++ pthread_mutex_t *mutex;
++
+ soundcard_thread = AGS_SOUNDCARD_THREAD(thread);
+
+ soundcard = AGS_SOUNDCARD(soundcard_thread->soundcard);
+-
++
++ /* */
++ mutex_manager = ags_mutex_manager_get_instance();
++ application_mutex = ags_mutex_manager_get_application_mutex(mutex_manager);
++
++ pthread_mutex_lock(application_mutex);
++
++ mutex = ags_mutex_manager_lookup(mutex_manager,
++ (GObject *) soundcard_thread->soundcard);
++
++ pthread_mutex_unlock(application_mutex);
++
+ /* real-time setup */
+ if((AGS_THREAD_RT_SETUP & (g_atomic_int_get(&(thread->flags)))) == 0){
+ struct sched_param param;
+@@ -428,7 +456,14 @@
+ AGS_THREAD_RT_SETUP);
+ }
+
+- if(ags_soundcard_is_playing(soundcard)){
++ /* playback */
++ pthread_mutex_lock(mutex);
++
++ is_playing = ags_soundcard_is_playing(soundcard);
++
++ pthread_mutex_unlock(mutex);
++
++ if(is_playing){
+ error = NULL;
+ ags_soundcard_play(soundcard,
+ &error);
+@@ -447,9 +482,15 @@
+ {
+ AgsSoundcardThread *soundcard_thread;
+
+- AgsSoundcard *soundcard;
++ AgsThread *main_loop;
++ AgsPollingThread *polling_thread;
+
++ AgsSoundcard *soundcard;
++
++ GList *poll_fd;
++
+ soundcard_thread = AGS_SOUNDCARD_THREAD(thread);
++ main_loop = ags_thread_get_toplevel(thread);
+
+ soundcard = AGS_SOUNDCARD(soundcard_thread->soundcard);
+
+@@ -458,6 +499,24 @@
+
+ //FIXME:JK: is this safe?
+ ags_soundcard_stop(soundcard);
++
++ /* find polling thread */
++ polling_thread = (AgsPollingThread *) ags_thread_find_type(main_loop,
++ AGS_TYPE_POLLING_THREAD);
++
++ /* remove poll fd */
++ poll_fd = ags_soundcard_get_poll_fd(soundcard);
++
++ while(poll_fd != NULL){
++ if(polling_thread != NULL){
++ gint position;
++
++ ags_polling_thread_remove_poll_fd(polling_thread,
++ poll_fd->data);
++ }
++
++ poll_fd = poll_fd->next;
++ }
+ }
+
+ void
+@@ -478,9 +537,9 @@
+
+ pthread_mutex_unlock(audio_loop->timing_mutex);
+
+- ags_main_loop_interrupt(AGS_MAIN_LOOP(audio_loop),
+- AGS_THREAD_SUSPEND_SIG,
+- 0, &time_spent);
++ // ags_main_loop_interrupt(AGS_MAIN_LOOP(audio_loop),
++ // AGS_THREAD_SUSPEND_SIG,
++ // 0, &time_spent);
+
+ if(poll_fd->polling_thread != NULL){
+ poll_fd->polling_thread->flags |= AGS_POLLING_THREAD_OMIT;
+--- a/ags/gsequencer_main.c
++++ b/ags/gsequencer_main.c
+@@ -21,6 +21,7 @@
+ #include <glib-object.h>
+
+ #include <gdk/gdk.h>
++#include <pango/pangocairo.h>
+
+ #include <X11/Xlib.h>
+
+@@ -164,10 +165,11 @@
+ {
+ GtkWidget *window;
+ GdkRectangle rectangle;
+-
+- cairo_t *cr;
++
++ cairo_t *gdk_cr, *cr;
+ cairo_surface_t *surface;
+-
++ cairo_surface_t *cached_surface;
++
+ AgsLog *log;
+
+ gchar *filename;
+@@ -187,21 +189,24 @@
+ rectangle.width = 800;
+ rectangle.height = 450;
+
+- cr = gdk_cairo_create(window->window);
++ gdk_cr = gdk_cairo_create(window->window);
+
+ filename = g_strdup_printf("%s%s\0", DESTDIR, "/gsequencer/images/ags_supermoon-800x450.png\0");
+
+ surface = cairo_image_surface_create_from_png(filename);
++ cr = cairo_create(surface);
+
+ cairo_select_font_face(cr, "Georgia\0",
+ CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
+ cairo_set_font_size(cr, (gdouble) 11.0);
+-
++
+ gdk_window_show(window->window);
+
+ gdk_threads_leave();
+
+- log = ags_log_get_instance();
++ cached_surface = NULL;
++
++ log = ags_log_get_instance();
+ nth = 0;
+
+ while(g_atomic_int_get(&(ags_show_start_animation))){
+@@ -226,8 +231,9 @@
+
+ cairo_move_to(cr,
+ x0, y0);
++
+ cairo_show_text(cr, list->data);
+-
++
+ list = list->next;
+ y0 -= 12.0;
+ }
+@@ -235,10 +241,14 @@
+ cairo_move_to(cr,
+ x0, 4.0 + (i + 1) * 12.0);
+ cairo_show_text(cr, "...\0");
+-
+- gdk_flush();
++
+ nth = g_list_length(start);
+- }
++ }
++
++ cairo_set_source_surface(gdk_cr, surface, 0, 0);
++ cairo_paint(gdk_cr);
++ cairo_surface_flush(surface);
++ gdk_flush();
+ }
+
+ gdk_threads_enter();
+@@ -424,6 +434,8 @@
+ ags_application_context->argc = argc;
+ ags_application_context->argv = argv;
+
++ ags_application_context_register_types(ags_application_context);
++
+ /* fix cross-references in managers */
+ lv2_worker_manager->thread_pool = ((AgsXorgApplicationContext *) ags_application_context)->thread_pool;
+
+--- a/ags/thread/ags_polling_thread.c
++++ b/ags/thread/ags_polling_thread.c
+@@ -300,10 +300,10 @@
+ ags_poll_fd_dispatch(list->data);
+
+ AGS_POLL_FD(list->data)->flags &= (~(AGS_POLL_FD_INPUT |
++ AGS_POLL_FD_PRIORITY_INPUT |
+ AGS_POLL_FD_OUTPUT |
+ AGS_POLL_FD_HANG_UP));
+- AGS_POLL_FD(list->data)->poll_fd->revents = 0;
+-
++
+ AGS_POLL_FD(list->data)->delay_counter = 0.0;
+ }else{
+ AGS_POLL_FD(list->data)->delay_counter += 1.0;
+--- a/ags/thread/ags_thread-posix.c
++++ b/ags/thread/ags_thread-posix.c
+@@ -2288,6 +2288,7 @@
+
+ chaos_tree = ags_thread_chaos_tree(thread);
+
++ //FIXME:JK: it works but I think its wrong
+ /* set tic delay */
+ if((AGS_THREAD_INTERMEDIATE_PRE_SYNC & (g_atomic_int_get(&(thread->flags)))) != 0){
+ /* intermediate pre sync */
+@@ -2298,10 +2299,12 @@
+ }
+ }else if((AGS_THREAD_INTERMEDIATE_POST_SYNC & (g_atomic_int_get(&(thread->flags)))) != 0){
+ /* intermediate post sync */
+- if(chaos_tree->tic_delay < thread->delay){
+- thread->tic_delay = chaos_tree->tic_delay + 1;
+- }else{
++ if(chaos_tree->tic_delay + 1 < thread->delay){
++ thread->tic_delay = chaos_tree->tic_delay + 2;
++ }else if(chaos_tree->tic_delay + 1 == thread->delay){
+ thread->tic_delay = 0;
++ }else{
++ thread->tic_delay = 1;
+ }
+ }else{
+ /* ordinary sync */
+@@ -2523,48 +2526,46 @@
+ pthread_mutex_unlock(thread->timer_mutex);
+ }
+ #else
+- if(g_atomic_pointer_get(&(thread->parent)) == NULL){
++ if(thread->tic_delay == thread->delay &&
++ (AGS_THREAD_TIMING & (g_atomic_int_get(&(thread->flags)))) != 0){
+ gdouble time_spent, relative_time_spent;
+ gdouble time_cycle;
+
+ static const gdouble nsec_per_jiffie = NSEC_PER_SEC / AGS_THREAD_HERTZ_JIFFIE;
+
+- if(thread->tic_delay == thread->delay &&
+- (AGS_THREAD_TIMING & (g_atomic_int_get(&(thread->flags)))) != 0){
+- struct timespec timed_sleep = {
+- 0,
+- 0,
+- };
++ struct timespec timed_sleep = {
++ 0,
++ 0,
++ };
+
+- clock_gettime(CLOCK_MONOTONIC, &time_now);
++ clock_gettime(CLOCK_MONOTONIC, &time_now);
+
+- if(time_now.tv_sec == thread->computing_time->tv_sec + 1){
+- time_spent = (time_now.tv_nsec) + (NSEC_PER_SEC - thread->computing_time->tv_nsec);
+- }else if(time_now.tv_sec > thread->computing_time->tv_sec + 1){
+- time_spent = (time_now.tv_sec - thread->computing_time->tv_sec) * NSEC_PER_SEC;
+- time_spent += (time_now.tv_nsec - thread->computing_time->tv_nsec);
+- }else{
+- time_spent = time_now.tv_nsec - thread->computing_time->tv_nsec;
+- }
++ if(time_now.tv_sec == thread->computing_time->tv_sec + 1){
++ time_spent = (time_now.tv_nsec) + (NSEC_PER_SEC - thread->computing_time->tv_nsec);
++ }else if(time_now.tv_sec > thread->computing_time->tv_sec + 1){
++ time_spent = (time_now.tv_sec - thread->computing_time->tv_sec) * NSEC_PER_SEC;
++ time_spent += (time_now.tv_nsec - thread->computing_time->tv_nsec);
++ }else{
++ time_spent = time_now.tv_nsec - thread->computing_time->tv_nsec;
++ }
+
+- time_cycle = NSEC_PER_SEC / thread->freq;
++ time_cycle = NSEC_PER_SEC / thread->freq;
+
+- relative_time_spent = time_cycle - time_spent - g_atomic_int_get(&(thread->time_late)) - AGS_THREAD_TOLERANCE;
++ relative_time_spent = time_cycle - time_spent - g_atomic_int_get(&(thread->time_late)) - AGS_THREAD_TOLERANCE;
+
+- if(relative_time_spent < 0.0){
+- g_atomic_int_set(&(thread->time_late),
+- (guint) ceil(-1.25 * relative_time_spent));
+- }else if(relative_time_spent > 0.0 &&
+- relative_time_spent < time_cycle){
+- g_atomic_int_set(&(thread->time_late),
+- 0);
+- timed_sleep.tv_nsec = (long) relative_time_spent - (1.0 / 45.0) * time_cycle;
++ if(relative_time_spent < 0.0){
++ g_atomic_int_set(&(thread->time_late),
++ (guint) ceil(-1.25 * relative_time_spent));
++ }else if(relative_time_spent > 0.0 &&
++ relative_time_spent < time_cycle){
++ g_atomic_int_set(&(thread->time_late),
++ 0);
++ timed_sleep.tv_nsec = (long) relative_time_spent - (1.0 / 45.0) * time_cycle;
+
+- nanosleep(&timed_sleep, NULL);
+- }
+-
+- clock_gettime(CLOCK_MONOTONIC, thread->computing_time);
++ nanosleep(&timed_sleep, NULL);
+ }
++
++ clock_gettime(CLOCK_MONOTONIC, thread->computing_time);
+ }
+ #endif
+
+--- a/ags/widget/ags_hindicator.h
++++ b/ags/widget/ags_hindicator.h
+@@ -22,6 +22,7 @@
+
+ #include <glib.h>
+ #include <glib-object.h>
++
+ #include <gtk/gtk.h>
+
+ #include "ags_indicator.h"
+@@ -43,7 +44,7 @@
+
+ struct _AgsHIndicatorClass
+ {
+- GtkWidgetClass indicator;
++ AgsIndicatorClass indicator;
+ };
+
+ GType ags_hindicator_get_type(void);
+--- a/ags/widget/ags_vindicator.h
++++ b/ags/widget/ags_vindicator.h
+@@ -22,6 +22,7 @@
+
+ #include <glib.h>
+ #include <glib-object.h>
++
+ #include <gtk/gtk.h>
+
+ #include "ags_indicator.h"
+@@ -43,7 +44,7 @@
+
+ struct _AgsVIndicatorClass
+ {
+- GtkWidgetClass indicator;
++ AgsIndicatorClass indicator;
+ };
+
+ GType ags_vindicator_get_type(void);
diff --git a/debian/patches/fix-generated-symbols.patch b/debian/patches/fix-generated-symbols.patch
new file mode 100644
index 0000000..f5c6b1b
--- /dev/null
+++ b/debian/patches/fix-generated-symbols.patch
@@ -0,0 +1,1960 @@
+Description: Fixes new symbols related to previous patch
+ fix-critical-bugs.patch introduced AgsClearBuffer task.
+ Note you could do `make gen-symbols-ags-audio` to achieve
+ the same result.
+Author: Joël Krähmann <jkraehemann at gmail.com>
+Applied-Upstream: 0.7.x, http://git.savannah.gnu.org/cgit/gsequencer.git
+Last-Update: 2017-01-31
+--- a/libags_audio.sym
++++ b/libags_audio.sym
+@@ -1,36 +1,20 @@
+-ags_lv2_conversion_get_type
+-ags_lv2_conversion_new
+-ags_base_plugin_get_type
+-ags_port_descriptor_alloc
+-ags_port_descriptor_free
+-ags_base_plugin_find_filename
+-ags_base_plugin_find_effect
+-ags_base_plugin_sort
+-ags_base_plugin_apply_port_group_by_prefix
+-ags_base_plugin_instantiate
+-ags_base_plugin_connect_port
+-ags_base_plugin_activate
+-ags_base_plugin_deactivate
+-ags_base_plugin_run
+-ags_base_plugin_load_plugin
+-ags_base_plugin_new
++ags_lv2_uri_map_manager_get_type
++ags_lv2_uri_map_manager_insert
++ags_lv2_uri_map_manager_remove
++ags_lv2_uri_map_manager_lookup
++ags_lv2_uri_map_manager_load_default
++ags_lv2_uri_map_manager_uri_to_id
++ags_lv2_uri_map_manager_get_instance
++ags_lv2_uri_map_manager_new
+ ags_ladspa_plugin_get_type
+ ags_ladspa_plugin_new
+-ags_ladspa_manager_get_type
+-ags_ladspa_manager_get_filenames
+-ags_ladspa_manager_find_ladspa_plugin
+-ags_ladspa_manager_load_blacklist
+-ags_ladspa_manager_load_file
+-ags_ladspa_manager_load_default_directory
+-ags_ladspa_manager_get_instance
+-ags_ladspa_manager_new
+-ags_ladspa_conversion_get_type
+-ags_ladspa_conversion_new
+-ags_lv2_log_manager_get_type
+-ags_lv2_log_manager_printf
+-ags_lv2_log_manager_vprintf
+-ags_lv2_log_manager_get_instance
+-ags_lv2_log_manager_new
++ags_lv2_worker_manager_get_type
++ags_lv2_worker_manager_pull_worker
++ags_lv2_worker_manager_get_instance
++ags_lv2_worker_manager_new
++ags_dssi_plugin_get_type
++ags_dssi_plugin_change_program
++ags_dssi_plugin_new
+ ags_lv2_urid_manager_get_type
+ ags_lv2_urid_manager_insert
+ ags_lv2_urid_manager_remove
+@@ -40,6 +24,36 @@
+ ags_lv2_urid_manager_unmap
+ ags_lv2_urid_manager_get_instance
+ ags_lv2_urid_manager_new
++ags_lv2_worker_get_type
++ags_lv2_worker_alloc_response_data
++ags_lv2_worker_free_response_data
++ags_lv2_worker_respond
++ags_lv2_worker_schedule_work
++ags_lv2_worker_safe_run
++ags_lv2_worker_interrupted_callback
++ags_lv2_worker_new
++ags_lv2ui_plugin_get_type
++ags_lv2ui_plugin_new
++ags_lv2ui_manager_get_type
++ags_lv2ui_manager_get_filenames
++ags_lv2ui_manager_find_lv2ui_plugin
++ags_lv2ui_manager_load_blacklist
++ags_lv2ui_manager_load_file
++ags_lv2ui_manager_load_default_directory
++ags_lv2ui_manager_get_instance
++ags_lv2ui_manager_new
++ags_ladspa_conversion_get_type
++ags_ladspa_conversion_new
++ags_lv2_plugin_get_type
++ags_lv2_plugin_alloc_event_buffer
++ags_lv2_plugin_concat_event_buffer
++ags_lv2_plugin_event_buffer_append_midi
++ags_lv2_plugin_clear_event_buffer
++ags_lv2_plugin_alloc_atom_sequence
++ags_lv2_plugin_concat_atom_sequence
++ags_lv2_plugin_atom_sequence_append_midi
++ags_lv2_plugin_clear_atom_sequence
++ags_lv2_plugin_new
+ ags_plugin_factory_get_type
+ ags_plugin_factory_read_file
+ ags_plugin_factory_list_by_name
+@@ -48,6 +62,13 @@
+ ags_plugin_factory_get_instance
+ ags_plugin_factory_new_from_file
+ ags_plugin_factory_new
++ags_lv2_conversion_get_type
++ags_lv2_conversion_new
++ags_lv2_event_manager_get_type
++ags_lv2_event_manager_lv2_event_ref
++ags_lv2_event_manager_lv2_event_unref
++ags_lv2_event_manager_get_instance
++ags_lv2_event_manager_new
+ ags_dssi_manager_get_type
+ ags_dssi_manager_get_filenames
+ ags_dssi_manager_find_dssi_plugin
+@@ -56,39 +77,28 @@
+ ags_dssi_manager_load_default_directory
+ ags_dssi_manager_get_instance
+ ags_dssi_manager_new
+-ags_lv2_worker_manager_get_type
+-ags_lv2_worker_manager_pull_worker
+-ags_lv2_worker_manager_get_instance
+-ags_lv2_worker_manager_new
+-ags_lv2ui_manager_get_type
+-ags_lv2ui_manager_get_filenames
+-ags_lv2ui_manager_find_lv2ui_plugin
+-ags_lv2ui_manager_load_blacklist
+-ags_lv2ui_manager_load_file
+-ags_lv2ui_manager_load_default_directory
+-ags_lv2ui_manager_get_instance
+-ags_lv2ui_manager_new
+-ags_lv2_uri_map_manager_get_type
+-ags_lv2_uri_map_manager_insert
+-ags_lv2_uri_map_manager_remove
+-ags_lv2_uri_map_manager_lookup
+-ags_lv2_uri_map_manager_load_default
+-ags_lv2_uri_map_manager_uri_to_id
+-ags_lv2_uri_map_manager_get_instance
+-ags_lv2_uri_map_manager_new
+-ags_lv2_worker_get_type
+-ags_lv2_worker_alloc_response_data
+-ags_lv2_worker_free_response_data
+-ags_lv2_worker_respond
+-ags_lv2_worker_schedule_work
+-ags_lv2_worker_safe_run
+-ags_lv2_worker_interrupted_callback
+-ags_lv2_worker_new
+-ags_dssi_plugin_get_type
+-ags_dssi_plugin_change_program
+-ags_dssi_plugin_new
+-ags_lv2ui_plugin_get_type
+-ags_lv2ui_plugin_new
++ags_ladspa_manager_get_type
++ags_ladspa_manager_get_filenames
++ags_ladspa_manager_find_ladspa_plugin
++ags_ladspa_manager_load_blacklist
++ags_ladspa_manager_load_file
++ags_ladspa_manager_load_default_directory
++ags_ladspa_manager_get_instance
++ags_ladspa_manager_new
++ags_base_plugin_get_type
++ags_port_descriptor_alloc
++ags_port_descriptor_free
++ags_base_plugin_find_filename
++ags_base_plugin_find_effect
++ags_base_plugin_sort
++ags_base_plugin_apply_port_group_by_prefix
++ags_base_plugin_instantiate
++ags_base_plugin_connect_port
++ags_base_plugin_activate
++ags_base_plugin_deactivate
++ags_base_plugin_run
++ags_base_plugin_load_plugin
++ags_base_plugin_new
+ ags_lv2_manager_get_type
+ ags_lv2_manager_get_filenames
+ ags_lv2_manager_find_lv2_plugin
+@@ -97,23 +107,417 @@
+ ags_lv2_manager_load_default_directory
+ ags_lv2_manager_get_instance
+ ags_lv2_manager_new
+-ags_lv2_event_manager_get_type
+-ags_lv2_event_manager_lv2_event_ref
+-ags_lv2_event_manager_lv2_event_unref
+-ags_lv2_event_manager_get_instance
+-ags_lv2_event_manager_new
+-ags_lv2_plugin_get_type
+-ags_lv2_plugin_alloc_event_buffer
+-ags_lv2_plugin_concat_event_buffer
+-ags_lv2_plugin_event_buffer_append_midi
+-ags_lv2_plugin_clear_event_buffer
+-ags_lv2_plugin_alloc_atom_sequence
+-ags_lv2_plugin_concat_atom_sequence
+-ags_lv2_plugin_atom_sequence_append_midi
+-ags_lv2_plugin_clear_atom_sequence
+-ags_lv2_plugin_new
+-ags_audio_application_context_get_type
+-ags_audio_application_context_new
++ags_lv2_log_manager_get_type
++ags_lv2_log_manager_printf
++ags_lv2_log_manager_vprintf
++ags_lv2_log_manager_get_instance
++ags_lv2_log_manager_new
++ags_playback_get_type
++ags_playback_find_source
++ags_playback_new
++ags_notation_get_type
++ags_notation_find_near_timestamp
++ags_notation_add_note
++ags_notation_remove_note_at_position
++ags_notation_get_selection
++ags_notation_is_note_selected
++ags_notation_find_point
++ags_notation_find_region
++ags_notation_free_selection
++ags_notation_add_all_to_selection
++ags_notation_add_point_to_selection
++ags_notation_remove_point_from_selection
++ags_notation_add_region_to_selection
++ags_notation_remove_region_from_selection
++ags_notation_copy_selection
++ags_notation_cut_selection
++ags_notation_insert_from_clipboard
++ags_notation_get_current
++ags_notation_new
++ags_recall_recycling_dummy_get_type
++ags_recall_recycling_dummy_new
++ags_acceleration_get_type
++ags_acceleration_duplicate
++ags_acceleration_new
++ags_midiin_get_type
++ags_midiin_error_quark
++ags_midiin_new
++ags_buffer_audio_signal_get_type
++ags_buffer_audio_signal_new
++ags_play_channel_run_get_type
++ags_play_channel_run_new
++ags_play_channel_run_master_get_type
++ags_play_channel_run_master_streamer_free
++ags_play_channel_run_master_streamer_alloc
++ags_play_channel_run_master_find_streamer
++ags_play_channel_run_master_new
++ags_feed_channel_run_get_type
++ags_feed_channel_run_new
++ags_copy_audio_signal_get_type
++ags_copy_audio_signal_new
++ags_play_channel_get_type
++ags_play_channel_new
++ags_envelope_recycling_get_type
++ags_envelope_recycling_new
++ags_copy_recycling_get_type
++ags_copy_recycling_new
++ags_mute_channel_run_get_type
++ags_mute_channel_run_new
++ags_delay_audio_run_get_type
++ags_delay_audio_run_notation_alloc_output
++ags_delay_audio_run_notation_alloc_input
++ags_delay_audio_run_notation_count
++ags_delay_audio_run_sequencer_alloc_output
++ags_delay_audio_run_sequencer_alloc_input
++ags_delay_audio_run_sequencer_count
++ags_delay_audio_run_new
++ags_envelope_channel_run_get_type
++ags_envelope_channel_run_new
++ags_route_lv2_audio_get_type
++ags_route_lv2_audio_new
++ags_buffer_channel_run_get_type
++ags_buffer_channel_run_new
++ags_play_notation_audio_get_type
++ags_play_notation_audio_new
++ags_count_beats_audio_run_get_type
++ags_count_beats_audio_run_notation_start
++ags_count_beats_audio_run_notation_loop
++ags_count_beats_audio_run_notation_stop
++ags_count_beats_audio_run_sequencer_start
++ags_count_beats_audio_run_sequencer_loop
++ags_count_beats_audio_run_sequencer_stop
++ags_count_beats_audio_run_new
++ags_envelope_channel_get_type
++ags_envelope_channel_new
++ags_volume_audio_signal_get_type
++ags_volume_audio_signal_new
++ags_peak_audio_signal_get_type
++ags_peak_audio_signal_new
++ags_copy_pattern_channel_run_get_type
++ags_copy_pattern_channel_run_new
++ags_volume_channel_get_type
++ags_volume_channel_new
++ags_volume_channel_run_get_type
++ags_volume_channel_run_new
++ags_mute_recycling_get_type
++ags_mute_recycling_new
++ags_envelope_audio_signal_get_type
++ags_envelope_audio_signal_new
++ags_feed_recycling_get_type
++ags_feed_recycling_new
++ags_mute_audio_signal_get_type
++ags_mute_audio_signal_new
++ags_buffer_recycling_get_type
++ags_buffer_recycling_new
++ags_play_audio_signal_get_type
++ags_play_audio_signal_new
++ags_record_midi_audio_get_type
++ags_record_midi_audio_new
++ags_play_note_get_type
++ags_play_note_new
++ags_route_dssi_audio_get_type
++ags_route_dssi_audio_new
++ags_feed_channel_get_type
++ags_feed_channel_new
++ags_peak_recycling_get_type
++ags_peak_recycling_new
++ags_copy_pattern_audio_get_type
++ags_copy_pattern_audio_new
++ags_route_dssi_audio_run_get_type
++ags_route_dssi_audio_run_new
++ags_stream_channel_get_type
++ags_stream_channel_new
++ags_peak_channel_run_get_type
++ags_peak_channel_run_new
++ags_delay_audio_get_type
++ags_delay_audio_notation_duration_changed
++ags_delay_audio_sequencer_duration_changed
++ags_delay_audio_new
++ags_loop_channel_run_get_type
++ags_loop_channel_run_new
++ags_stream_channel_run_get_type
++ags_stream_channel_run_new
++ags_copy_channel_get_type
++ags_copy_channel_new
++ags_copy_channel_run_get_type
++ags_copy_channel_run_new
++ags_mute_audio_run_get_type
++ags_mute_audio_run_new
++ags_buffer_channel_get_type
++ags_buffer_channel_new
++ags_stream_recycling_get_type
++ags_stream_recycling_new
++ags_route_lv2_audio_run_get_type
++ags_route_lv2_audio_run_new
++ags_stream_get_type
++ags_stream
++ags_stream_new
++ags_record_midi_audio_run_get_type
++ags_record_midi_audio_run_new
++ags_play_audio_get_type
++ags_play_audio_new
++ags_feed_audio_signal_get_type
++ags_feed_audio_signal_new
++ags_stream_audio_signal_get_type
++ags_stream_audio_signal_new
++ags_copy_notation_audio_run_get_type
++ags_copy_notation_audio_run_new
++ags_play_notation_audio_run_get_type
++ags_play_notation_audio_run_new
++ags_loop_channel_get_type
++ags_loop_channel_new
++ags_copy_notation_audio_get_type
++ags_copy_notation_audio_new
++ags_mute_channel_get_type
++ags_mute_channel_new
++ags_copy_pattern_channel_get_type
++ags_copy_pattern_channel_template_find_source_and_destination
++ags_copy_pattern_channel_new
++ags_volume_recycling_get_type
++ags_volume_recycling_new
++ags_mute_audio_get_type
++ags_mute_audio_new
++ags_count_beats_audio_get_type
++ags_count_beats_audio_new
++ags_copy_pattern_audio_run_get_type
++ags_copy_pattern_audio_run_new
++ags_peak_channel_get_type
++ags_peak_channel_retrieve_peak
++ags_peak_channel_new
++ags_play_audio_file_get_type
++ags_play_audio_file_new
++ags_play_recycling_get_type
++ags_play_recycling_new
++ags_synth_generator_get_type
++ags_synth_generator_new
++ags_recall_ladspa_get_type
++ags_recall_ladspa_load
++ags_recall_ladspa_load_ports
++ags_recall_ladspa_load_conversion
++ags_recall_ladspa_find
++ags_recall_ladspa_new
++ags_recycling_context_get_type
++ags_recycling_context_replace
++ags_recycling_context_add
++ags_recycling_context_remove
++ags_recycling_context_insert
++ags_recycling_context_get_toplevel
++ags_recycling_context_find
++ags_recycling_context_find_child
++ags_recycling_context_find_parent
++ags_recycling_context_add_child
++ags_recycling_context_remove_child
++ags_recycling_context_get_child_recall_id
++ags_recycling_context_reset_recycling
++ags_recycling_context_new
++ags_recall_audio_signal_get_type
++ags_recall_audio_signal_new
++ags_recall_channel_run_get_type
++ags_recall_channel_run_run_order_changed
++ags_recall_channel_run_get_run_order
++ags_recall_channel_run_new
++ags_ipatch_get_type
++ags_ipatch_check_suffix
++ags_ipatch_new
++ags_audio_file_get_type
++ags_audio_file_check_suffix
++ags_audio_file_open
++ags_audio_file_open_from_data
++ags_audio_file_rw_open
++ags_audio_file_close
++ags_audio_file_read_audio_signal
++ags_audio_file_seek
++ags_audio_file_write
++ags_audio_file_flush
++ags_audio_file_new
++ags_sndfile_get_type
++ags_sndfile_new
++ags_ipatch_sf2_reader_get_type
++ags_ipatch_sf2_reader_new
++ags_file_read_soundcard
++ags_file_write_soundcard
++ags_file_read_soundcard_list
++ags_file_write_soundcard_list
++ags_file_read_playback
++ags_file_write_playback
++ags_file_read_playback_list
++ags_file_write_playback_list
++ags_file_read_audio
++ags_file_write_audio
++ags_file_read_audio_list
++ags_file_write_audio_list
++ags_file_read_channel
++ags_file_write_channel
++ags_file_read_channel_list
++ags_file_write_channel_list
++ags_file_read_input
++ags_file_write_input
++ags_file_read_output
++ags_file_write_output
++ags_file_read_recall
++ags_file_write_recall
++ags_file_read_recall_list
++ags_file_write_recall_list
++ags_file_read_recall_container
++ags_file_write_recall_container
++ags_file_read_recall_container_list
++ags_file_write_recall_container_list
++ags_file_read_recall_audio
++ags_file_write_recall_audio
++ags_file_read_recall_audio_run
++ags_file_write_recall_audio_run
++ags_file_read_recall_channel
++ags_file_write_recall_channel
++ags_file_read_recall_channel_run
++ags_file_write_recall_channel_run
++ags_file_read_recall_recycling
++ags_file_write_recall_recycling
++ags_file_read_recall_audio_signal
++ags_file_write_recall_audio_signal
++ags_file_read_port
++ags_file_write_port
++ags_file_read_port_list
++ags_file_write_port_list
++ags_file_read_recycling
++ags_file_write_recycling
++ags_file_read_recycling_list
++ags_file_write_recycling_list
++ags_file_read_audio_signal
++ags_file_write_audio_signal
++ags_file_read_audio_signal_list
++ags_file_write_audio_signal_list
++ags_file_read_stream
++ags_file_write_stream
++ags_file_read_stream_list
++ags_file_write_stream_list
++ags_file_read_pattern
++ags_file_write_pattern
++ags_file_read_pattern_list
++ags_file_write_pattern_list
++ags_file_read_pattern_data
++ags_file_write_pattern_data
++ags_file_read_pattern_data_list
++ags_file_write_pattern_data_list
++ags_file_read_notation
++ags_file_write_notation
++ags_file_read_notation_list
++ags_file_write_notation_list
++ags_file_read_note
++ags_file_write_note
++ags_file_read_note_list
++ags_file_write_note_list
++ags_file_read_automation
++ags_file_write_automation
++ags_file_read_automation_list
++ags_file_write_automation_list
++ags_file_read_acceleration
++ags_file_write_acceleration
++ags_file_read_acceleration_list
++ags_file_write_acceleration_list
++ags_file_read_task
++ags_file_write_task
++ags_file_read_task_list
++ags_file_write_task_list
++ags_file_read_embedded_audio
++ags_file_write_embedded_audio
++ags_file_read_embedded_audio_list
++ags_file_write_embedded_audio_list
++ags_ipatch_dls2_reader_get_type
++ags_ipatch_dls2_reader_new
++ags_audio_file_link_get_type
++ags_audio_file_link_new
++ags_remote_input_get_type
++ags_remote_input_new
++ags_remote_output_get_type
++ags_remote_output_new
++ags_remote_channel_get_type
++ags_remote_channel_error_quark
++ags_remote_channel_new
++ags_recall_factory_get_type
++ags_recall_factory_create
++ags_recall_factory_remove
++ags_recall_factory_get_instance
++ags_recall_factory_new
++ags_playable_get_type
++ags_playable_error_quark
++ags_playable_open
++ags_playable_rw_open
++ags_playable_level_count
++ags_playable_nth_level
++ags_playable_selected_level
++ags_playable_sublevel_names
++ags_playable_level_select
++ags_playable_level_up
++ags_playable_iter_start
++ags_playable_iter_next
++ags_playable_info
++ags_playable_get_samplerate
++ags_playable_get_format
++ags_playable_read
++ags_playable_write
++ags_playable_flush
++ags_playable_seek
++ags_playable_close
++ags_playable_read_audio_signal
++ags_input_get_type
++ags_input_open_file
++ags_input_apply_synth
++ags_input_new
++ags_recall_channel_run_dummy_get_type
++ags_recall_channel_run_dummy_new
++ags_output_get_type
++ags_output_find_first_input_recycling
++ags_output_find_last_input_recycling
++ags_output_new
++ags_devout_get_type
++ags_devout_error_quark
++ags_devout_switch_buffer_flag
++ags_devout_adjust_delay_and_attack
++ags_devout_realloc_buffer
++ags_devout_new
++ags_recall_ladspa_run_get_type
++ags_recall_ladspa_run_new
++ags_audio_get_type
++ags_audio_set_soundcard
++ags_audio_set_flags
++ags_audio_unset_flags
++ags_audio_check_connection
++ags_audio_set_audio_channels
++ags_audio_set_pads
++ags_audio_set_samplerate
++ags_audio_set_buffer_size
++ags_audio_set_format
++ags_audio_set_sequence_length
++ags_audio_add_audio_connection
++ags_audio_remove_audio_connection
++ags_audio_add_notation
++ags_audio_remove_notation
++ags_audio_add_automation
++ags_audio_remove_automation
++ags_audio_add_recall_id
++ags_audio_remove_recall_id
++ags_audio_add_recycling_context
++ags_audio_remove_recycling_context
++ags_audio_add_recall_container
++ags_audio_remove_recall_container
++ags_audio_add_recall
++ags_audio_remove_recall
++ags_audio_recall_change_state
++ags_audio_init_run
++ags_audio_duplicate_recall
++ags_audio_init_recall
++ags_audio_resolve_recall
++ags_audio_is_playing
++ags_audio_play
++ags_audio_tact
++ags_audio_done
++ags_audio_cancel
++ags_audio_remove
++ags_audio_find_port
++ags_audio_open_files
++ags_audio_recursive_set_property
++ags_audio_recursive_play_init
++ags_audio_new
+ ags_automation_get_type
+ ags_automation_find_port
+ ags_automation_find_near_timestamp
+@@ -139,27 +543,95 @@
+ ags_automation_find_specifier_with_type_and_line
+ ags_automation_get_value
+ ags_automation_new
+-ags_audio_signal_get_type
+-ags_stream_alloc
+-ags_stream_free
+-ags_audio_signal_set_samplerate
+-ags_audio_signal_set_buffer_size
+-ags_audio_signal_set_format
+-ags_audio_signal_get_length_till_current
+-ags_audio_signal_add_stream
+-ags_audio_signal_stream_resize
+-ags_audio_signal_stream_safe_resize
+-ags_audio_signal_realloc_buffer_size
+-ags_audio_signal_duplicate_stream
+-ags_audio_signal_get_template
+-ags_audio_signal_get_stream_current
+-ags_audio_signal_get_by_recall_id
+-ags_audio_signal_tile
+-ags_audio_signal_scale
+-ags_audio_signal_feed
+-ags_audio_signal_envelope
+-ags_audio_signal_new
+-ags_audio_signal_new_with_length
++ags_audio_buffer_util_format_from_soundcard
++ags_audio_buffer_util_get_copy_mode
++ags_audio_buffer_util_clear_float
++ags_audio_buffer_util_clear_double
++ags_audio_buffer_util_clear_buffer
++ags_audio_buffer_util_envelope_s8
++ags_audio_buffer_util_envelope_s16
++ags_audio_buffer_util_envelope_s24
++ags_audio_buffer_util_envelope_s32
++ags_audio_buffer_util_envelope_s64
++ags_audio_buffer_util_envelope_float
++ags_audio_buffer_util_envelope_double
++ags_audio_buffer_util_envelope
++ags_audio_buffer_util_volume_s8
++ags_audio_buffer_util_volume_s16
++ags_audio_buffer_util_volume_s24
++ags_audio_buffer_util_volume_s32
++ags_audio_buffer_util_volume_s64
++ags_audio_buffer_util_volume_float
++ags_audio_buffer_util_volume_double
++ags_audio_buffer_util_volume
++ags_audio_buffer_util_resample_s8
++ags_audio_buffer_util_resample_s16
++ags_audio_buffer_util_resample_s24
++ags_audio_buffer_util_resample_s32
++ags_audio_buffer_util_resample_s64
++ags_audio_buffer_util_resample_float
++ags_audio_buffer_util_resample_double
++ags_audio_buffer_util_resample
++ags_audio_buffer_util_copy_s8_to_s8
++ags_audio_buffer_util_copy_s8_to_s16
++ags_audio_buffer_util_copy_s8_to_s24
++ags_audio_buffer_util_copy_s8_to_s32
++ags_audio_buffer_util_copy_s8_to_s64
++ags_audio_buffer_util_copy_s8_to_float
++ags_audio_buffer_util_copy_s8_to_double
++ags_audio_buffer_util_copy_s16_to_s8
++ags_audio_buffer_util_copy_s16_to_s16
++ags_audio_buffer_util_copy_s16_to_s24
++ags_audio_buffer_util_copy_s16_to_s32
++ags_audio_buffer_util_copy_s16_to_s64
++ags_audio_buffer_util_copy_s16_to_float
++ags_audio_buffer_util_copy_s16_to_double
++ags_audio_buffer_util_copy_s24_to_s8
++ags_audio_buffer_util_copy_s24_to_s16
++ags_audio_buffer_util_copy_s24_to_s24
++ags_audio_buffer_util_copy_s24_to_s32
++ags_audio_buffer_util_copy_s24_to_s64
++ags_audio_buffer_util_copy_s24_to_float
++ags_audio_buffer_util_copy_s24_to_double
++ags_audio_buffer_util_copy_s32_to_s8
++ags_audio_buffer_util_copy_s32_to_s16
++ags_audio_buffer_util_copy_s32_to_s24
++ags_audio_buffer_util_copy_s32_to_s32
++ags_audio_buffer_util_copy_s32_to_s64
++ags_audio_buffer_util_copy_s32_to_float
++ags_audio_buffer_util_copy_s32_to_double
++ags_audio_buffer_util_copy_s64_to_s8
++ags_audio_buffer_util_copy_s64_to_s16
++ags_audio_buffer_util_copy_s64_to_s24
++ags_audio_buffer_util_copy_s64_to_s32
++ags_audio_buffer_util_copy_s64_to_s64
++ags_audio_buffer_util_copy_s64_to_float
++ags_audio_buffer_util_copy_s64_to_double
++ags_audio_buffer_util_copy_float_to_s8
++ags_audio_buffer_util_copy_float_to_s16
++ags_audio_buffer_util_copy_float_to_s24
++ags_audio_buffer_util_copy_float_to_s32
++ags_audio_buffer_util_copy_float_to_s64
++ags_audio_buffer_util_copy_float_to_float
++ags_audio_buffer_util_copy_float_to_double
++ags_audio_buffer_util_copy_double_to_s8
++ags_audio_buffer_util_copy_double_to_s16
++ags_audio_buffer_util_copy_double_to_s24
++ags_audio_buffer_util_copy_double_to_s32
++ags_audio_buffer_util_copy_double_to_s64
++ags_audio_buffer_util_copy_double_to_float
++ags_audio_buffer_util_copy_double_to_double
++ags_audio_buffer_util_copy_buffer_to_buffer
++ags_recall_channel_get_type
++ags_recall_channel_find_channel
++ags_recall_channel_new
++ags_pattern_get_type
++ags_pattern_find_near_timestamp
++ags_pattern_set_dim
++ags_pattern_is_empty
++ags_pattern_get_bit
++ags_pattern_toggle_bit
++ags_pattern_new
+ ags_note_get_type
+ ags_note_find_prev
+ ags_note_find_next
+@@ -170,11 +642,10 @@
+ ags_note_duplicate
+ ags_note_new
+ ags_note_new_with_offset
+-ags_audio_connection_get_type
+-ags_audio_connection_find
+-ags_audio_connection_new
+-ags_recall_lv2_run_get_type
+-ags_recall_lv2_run_new
++ags_channel_iter_alloc
++ags_channel_iter_free
++ags_channel_iter_prev
++ags_channel_iter_next
+ ags_synth_util_sin_s8
+ ags_synth_util_sin_s16
+ ags_synth_util_sin_s24
+@@ -207,10 +678,196 @@
+ ags_synth_util_sawtooth
+ ags_synth_util_triangle
+ ags_synth_util_square
+-ags_midiin_get_type
+-ags_midiin_error_quark
+-ags_midiin_new
+-ags_recycling_thread_iterate_callback
++ags_recall_dssi_run_get_type
++ags_recall_dssi_run_new
++ags_recycling_get_type
++ags_recycling_set_soundcard
++ags_recycling_add_audio_signal
++ags_recycling_remove_audio_signal
++ags_recycling_create_audio_signal_with_defaults
++ags_recycling_create_audio_signal_with_frame_count
++ags_recycling_position
++ags_recycling_find_next_channel
++ags_recycling_new
++ags_jack_midiin_get_type
++ags_jack_midiin_error_quark
++ags_jack_midiin_new
++ags_jack_server_get_type
++ags_jack_server_find_url
++ags_jack_server_find_client
++ags_jack_server_find_port
++ags_jack_server_add_client
++ags_jack_server_remove_client
++ags_jack_server_connect_client
++ags_jack_server_new
++ags_jack_port_get_type
++ags_jack_port_find
++ags_jack_port_register
++ags_jack_port_unregister
++ags_jack_port_new
++ags_jack_devout_get_type
++ags_jack_devout_error_quark
++ags_jack_devout_switch_buffer_flag
++ags_jack_devout_adjust_delay_and_attack
++ags_jack_devout_realloc_buffer
++ags_jack_devout_new
++ags_jack_client_get_type
++ags_jack_client_find_uuid
++ags_jack_client_find
++ags_jack_client_open
++ags_jack_client_add_device
++ags_jack_client_remove_device
++ags_jack_client_add_port
++ags_jack_client_remove_port
++ags_jack_client_activate
++ags_jack_client_deactivate
++ags_jack_client_new
++ags_port_get_type
++ags_port_safe_read
++ags_port_safe_write
++ags_port_safe_write_raw
++ags_port_safe_get_property
++ags_port_safe_set_property
++ags_port_find_specifier
++ags_port_new
++ags_recall_dssi_get_type
++ags_recall_dssi_load
++ags_recall_dssi_load_ports
++ags_recall_dssi_load_conversion
++ags_recall_dssi_find
++ags_recall_dssi_new
++ags_recall_recycling_get_type
++ags_recall_recycling_get_child_source
++ags_recall_recycling_new
++ags_append_audio_get_type
++ags_append_audio_new
++ags_apply_synth_get_type
++ags_apply_synth_new
++ags_tic_device_get_type
++ags_tic_device_new
++ags_resize_audio_get_type
++ags_resize_audio_new
++ags_set_muted_get_type
++ags_set_muted_new
++ags_apply_sequencer_length_get_type
++ags_apply_sequencer_length_new
++ags_apply_tact_get_type
++ags_apply_tact_new
++ags_apply_bpm_get_type
++ags_apply_bpm_new
++ags_init_audio_get_type
++ags_init_audio_new
++ags_cancel_channel_get_type
++ags_cancel_channel_new
++ags_free_selection_get_type
++ags_free_selection_new
++ags_open_single_file_get_type
++ags_open_single_file_new
++ags_append_audio_threaded_get_type
++ags_append_audio_threaded_new
++ags_apply_presets_get_type
++ags_apply_presets_soundcard
++ags_apply_presets_new
++ags_clear_buffer_get_type
++ags_clear_buffer_new
++ags_remove_region_from_selection_get_type
++ags_remove_region_from_selection_new
++ags_remove_recall_container_get_type
++ags_remove_recall_container_new
++ags_init_channel_get_type
++ags_init_channel_new
++ags_add_effect_get_type
++ags_add_effect_new
++ags_open_file_get_type
++ags_open_file_new
++ags_add_soundcard_get_type
++ags_add_soundcard_new
++ags_cancel_recall_get_type
++ags_cancel_recall_new
++ags_append_channel_get_type
++ags_append_channel_new
++ags_change_soundcard_get_type
++ags_change_soundcard_new
++ags_set_output_device_get_type
++ags_set_output_device_new
++ags_add_region_to_selection_get_type
++ags_add_region_to_selection_new
++ags_remove_recall_get_type
++ags_remove_recall_new
++ags_add_point_to_selection_get_type
++ags_add_point_to_selection_new
++ags_remove_audio_signal_get_type
++ags_remove_audio_signal_new
++ags_set_samplerate_get_type
++ags_set_samplerate_new
++ags_switch_buffer_flag_get_type
++ags_switch_buffer_flag_new
++ags_reset_audio_connection_get_type
++ags_reset_audio_connection_new
++ags_remove_audio_get_type
++ags_remove_audio_new
++ags_remove_note_get_type
++ags_remove_note_new
++ags_save_file_get_type
++ags_save_file_new
++ags_add_note_get_type
++ags_add_note_new
++ags_remove_point_from_selection_get_type
++ags_remove_point_from_selection_new
++ags_set_audio_channels_get_type
++ags_set_audio_channels_new
++ags_export_output_get_type
++ags_export_output_new
++ags_append_recall_get_type
++ags_append_recall_new
++ags_set_input_device_get_type
++ags_set_input_device_new
++ags_unref_audio_signal_get_type
++ags_unref_audio_signal_new
++ags_add_recall_get_type
++ags_add_recall_new
++ags_seek_soundcard_get_type
++ags_seek_soundcard_new
++ags_set_format_get_type
++ags_set_format_new
++ags_cancel_audio_get_type
++ags_cancel_audio_new
++ags_add_audio_get_type
++ags_add_audio_new
++ags_set_buffer_size_get_type
++ags_set_buffer_size_new
++ags_add_recall_container_get_type
++ags_add_recall_container_new
++ags_open_sf2_sample_get_type
++ags_open_sf2_sample_new
++ags_remove_soundcard_get_type
++ags_remove_soundcard_new
++ags_link_channel_get_type
++ags_link_channel_new
++ags_add_audio_signal_get_type
++ags_add_audio_signal_new
++ags_toggle_pattern_bit_get_type
++ags_toggle_pattern_bit_refresh_gui
++ags_toggle_pattern_bit_new
++ags_start_sequencer_get_type
++ags_start_sequencer_new
++ags_notify_soundcard_get_type
++ags_notify_soundcard_new
++ags_start_soundcard_get_type
++ags_start_soundcard_new
++ags_recall_audio_run_get_type
++ags_recall_audio_run_new
++ags_recall_container_get_type
++ags_recall_container_get_recall_audio
++ags_recall_container_get_recall_audio_run
++ags_recall_container_get_recall_channel
++ags_recall_container_get_recall_channel_run
++ags_recall_container_find
++ags_recall_container_new
++ags_record_thread_get_type
++ags_record_thread_new
++ags_audio_thread_get_type
++ags_audio_thread_new
+ ags_audio_loop_get_type
+ ags_audio_loop_add_audio
+ ags_audio_loop_remove_audio
+@@ -222,12 +879,13 @@
+ ags_soundcard_thread_get_type
+ ags_soundcard_thread_find_soundcard
+ ags_soundcard_thread_new
++ags_sequencer_thread_get_type
++ags_sequencer_thread_interval_timeout
++ags_sequencer_thread_find_sequencer
++ags_sequencer_thread_new
+ ags_export_thread_get_type
+ ags_export_thread_find_soundcard
+ ags_export_thread_new
+-ags_iterator_thread_get_type
+-ags_iterator_thread_children_ready
+-ags_iterator_thread_new
+ ags_recycling_thread_get_type
+ ags_recycling_thread_worker_alloc
+ ags_recycling_thread_add_worker
+@@ -239,46 +897,21 @@
+ ags_recycling_thread_new
+ ags_channel_thread_get_type
+ ags_channel_thread_new
+-ags_record_thread_get_type
+-ags_record_thread_new
+-ags_sequencer_thread_get_type
+-ags_sequencer_thread_interval_timeout
+-ags_sequencer_thread_find_sequencer
+-ags_sequencer_thread_new
+-ags_audio_thread_get_type
+-ags_audio_thread_new
+-ags_recall_dssi_run_get_type
+-ags_recall_dssi_run_new
+-ags_recall_channel_run_dummy_get_type
+-ags_recall_channel_run_dummy_new
++ags_iterator_thread_get_type
++ags_iterator_thread_children_ready
++ags_iterator_thread_new
++ags_recycling_thread_iterate_callback
++ags_recall_lv2_get_type
++ags_recall_lv2_load
++ags_recall_lv2_load_ports
++ags_recall_lv2_load_conversion
++ags_recall_lv2_find
++ags_recall_lv2_new
+ ags_fifoout_get_type
+ ags_fifoout_error_quark
+ ags_fifoout_adjust_delay_and_attack
+ ags_fifoout_realloc_buffer
+ ags_fifoout_new
+-ags_recall_id_get_type
+-ags_recall_id_get_run_stage
+-ags_recall_id_set_run_stage
+-ags_recall_id_unset_run_stage
+-ags_recall_id_find_recycling_context
+-ags_recall_id_find_parent_recycling_context
+-ags_recall_id_new
+-ags_output_get_type
+-ags_output_find_first_input_recycling
+-ags_output_find_last_input_recycling
+-ags_output_new
+-ags_recall_channel_run_get_type
+-ags_recall_channel_run_run_order_changed
+-ags_recall_channel_run_get_run_order
+-ags_recall_channel_run_new
+-ags_playback_get_type
+-ags_playback_find_source
+-ags_playback_new
+-ags_recall_dependency_get_type
+-ags_recall_dependency_find_dependency
+-ags_recall_dependency_find_dependency_by_provider
+-ags_recall_dependency_resolve
+-ags_recall_dependency_new
+ ags_recall_get_type
+ ags_recall_set_flags
+ ags_recall_load_automation
+@@ -325,120 +958,10 @@
+ ags_recall_lock_port
+ ags_recall_unlock_port
+ ags_recall_new
+-ags_init_channel_get_type
+-ags_init_channel_new
+-ags_remove_soundcard_get_type
+-ags_remove_soundcard_new
+-ags_remove_audio_signal_get_type
+-ags_remove_audio_signal_new
+-ags_add_audio_get_type
+-ags_add_audio_new
+-ags_remove_audio_get_type
+-ags_remove_audio_new
+-ags_remove_recall_container_get_type
+-ags_remove_recall_container_new
+-ags_cancel_audio_get_type
+-ags_cancel_audio_new
+-ags_remove_recall_get_type
+-ags_remove_recall_new
+-ags_add_note_get_type
+-ags_add_note_new
+-ags_resize_audio_get_type
+-ags_resize_audio_new
+-ags_link_channel_get_type
+-ags_link_channel_new
+-ags_append_audio_get_type
+-ags_append_audio_new
+-ags_set_audio_channels_get_type
+-ags_set_audio_channels_new
+-ags_remove_note_get_type
+-ags_remove_note_new
+-ags_start_sequencer_get_type
+-ags_start_sequencer_new
+-ags_apply_synth_get_type
+-ags_apply_synth_new
+-ags_append_audio_threaded_get_type
+-ags_append_audio_threaded_new
+-ags_export_output_get_type
+-ags_export_output_new
+-ags_unref_audio_signal_get_type
+-ags_unref_audio_signal_new
+-ags_free_selection_get_type
+-ags_free_selection_new
+-ags_add_recall_container_get_type
+-ags_add_recall_container_new
+-ags_set_muted_get_type
+-ags_set_muted_new
+-ags_apply_bpm_get_type
+-ags_apply_bpm_new
+-ags_apply_tact_get_type
+-ags_apply_tact_new
+-ags_apply_sequencer_length_get_type
+-ags_apply_sequencer_length_new
+-ags_notify_soundcard_get_type
+-ags_notify_soundcard_new
+-ags_cancel_channel_get_type
+-ags_cancel_channel_new
+-ags_init_audio_get_type
+-ags_init_audio_new
+-ags_seek_soundcard_get_type
+-ags_seek_soundcard_new
+-ags_append_recall_get_type
+-ags_append_recall_new
+-ags_add_soundcard_get_type
+-ags_add_soundcard_new
+-ags_apply_presets_get_type
+-ags_apply_presets_soundcard
+-ags_apply_presets_new
+-ags_add_recall_get_type
+-ags_add_recall_new
+-ags_add_effect_get_type
+-ags_add_effect_new
+-ags_save_file_get_type
+-ags_save_file_new
+-ags_tic_device_get_type
+-ags_tic_device_new
+-ags_change_soundcard_get_type
+-ags_change_soundcard_new
+-ags_append_channel_get_type
+-ags_append_channel_new
+-ags_remove_point_from_selection_get_type
+-ags_remove_point_from_selection_new
+-ags_add_point_to_selection_get_type
+-ags_add_point_to_selection_new
+-ags_set_samplerate_get_type
+-ags_set_samplerate_new
+-ags_set_buffer_size_get_type
+-ags_set_buffer_size_new
+-ags_set_format_get_type
+-ags_set_format_new
+-ags_switch_buffer_flag_get_type
+-ags_switch_buffer_flag_new
+-ags_cancel_recall_get_type
+-ags_cancel_recall_new
+-ags_add_region_to_selection_get_type
+-ags_add_region_to_selection_new
+-ags_open_sf2_sample_get_type
+-ags_open_sf2_sample_new
+-ags_add_audio_signal_get_type
+-ags_add_audio_signal_new
+-ags_toggle_pattern_bit_get_type
+-ags_toggle_pattern_bit_refresh_gui
+-ags_toggle_pattern_bit_new
+-ags_reset_audio_connection_get_type
+-ags_reset_audio_connection_new
+-ags_start_soundcard_get_type
+-ags_start_soundcard_new
+-ags_open_single_file_get_type
+-ags_open_single_file_new
+-ags_open_file_get_type
+-ags_open_file_new
+-ags_set_input_device_get_type
+-ags_set_input_device_new
+-ags_remove_region_from_selection_get_type
+-ags_remove_region_from_selection_new
+-ags_set_output_device_get_type
+-ags_set_output_device_new
++ags_recall_lv2_run_get_type
++ags_recall_lv2_run_new
++ags_playback_domain_get_type
++ags_playback_domain_new
+ ags_sound_provider_get_type
+ ags_sound_provider_set_soundcard
+ ags_sound_provider_get_soundcard
+@@ -448,213 +971,8 @@
+ ags_sound_provider_get_sequencer
+ ags_sound_provider_set_distributed_manager
+ ags_sound_provider_get_distributed_manager
+-ags_loop_channel_get_type
+-ags_loop_channel_new
+-ags_envelope_recycling_get_type
+-ags_envelope_recycling_new
+-ags_play_notation_audio_get_type
+-ags_play_notation_audio_new
+-ags_volume_channel_run_get_type
+-ags_volume_channel_run_new
+-ags_mute_recycling_get_type
+-ags_mute_recycling_new
+-ags_envelope_channel_run_get_type
+-ags_envelope_channel_run_new
+-ags_count_beats_audio_get_type
+-ags_count_beats_audio_new
+-ags_play_channel_run_get_type
+-ags_play_channel_run_new
+-ags_route_dssi_audio_get_type
+-ags_route_dssi_audio_new
+-ags_mute_audio_get_type
+-ags_mute_audio_new
+-ags_peak_recycling_get_type
+-ags_peak_recycling_new
+-ags_buffer_channel_run_get_type
+-ags_buffer_channel_run_new
+-ags_play_channel_get_type
+-ags_play_channel_new
+-ags_stream_channel_run_get_type
+-ags_stream_channel_run_new
+-ags_mute_channel_run_get_type
+-ags_mute_channel_run_new
+-ags_play_audio_get_type
+-ags_play_audio_new
+-ags_count_beats_audio_run_get_type
+-ags_count_beats_audio_run_notation_start
+-ags_count_beats_audio_run_notation_loop
+-ags_count_beats_audio_run_notation_stop
+-ags_count_beats_audio_run_sequencer_start
+-ags_count_beats_audio_run_sequencer_loop
+-ags_count_beats_audio_run_sequencer_stop
+-ags_count_beats_audio_run_new
+-ags_mute_channel_get_type
+-ags_mute_channel_new
+-ags_buffer_audio_signal_get_type
+-ags_buffer_audio_signal_new
+-ags_mute_audio_signal_get_type
+-ags_mute_audio_signal_new
+-ags_peak_audio_signal_get_type
+-ags_peak_audio_signal_new
+-ags_feed_channel_run_get_type
+-ags_feed_channel_run_new
+-ags_volume_recycling_get_type
+-ags_volume_recycling_new
+-ags_copy_pattern_channel_get_type
+-ags_copy_pattern_channel_template_find_source_and_destination
+-ags_copy_pattern_channel_new
+-ags_delay_audio_get_type
+-ags_delay_audio_notation_duration_changed
+-ags_delay_audio_sequencer_duration_changed
+-ags_delay_audio_new
+-ags_play_notation_audio_run_get_type
+-ags_play_notation_audio_run_new
+-ags_envelope_channel_get_type
+-ags_envelope_channel_new
+-ags_play_recycling_get_type
+-ags_play_recycling_new
+-ags_envelope_audio_signal_get_type
+-ags_envelope_audio_signal_new
+-ags_loop_channel_run_get_type
+-ags_loop_channel_run_new
+-ags_copy_notation_audio_run_get_type
+-ags_copy_notation_audio_run_new
+-ags_play_note_get_type
+-ags_play_note_new
+-ags_record_midi_audio_run_get_type
+-ags_record_midi_audio_run_new
+-ags_buffer_recycling_get_type
+-ags_buffer_recycling_new
+-ags_copy_audio_signal_get_type
+-ags_copy_audio_signal_new
+-ags_copy_pattern_channel_run_get_type
+-ags_copy_pattern_channel_run_new
+-ags_buffer_channel_get_type
+-ags_buffer_channel_new
+-ags_peak_channel_get_type
+-ags_peak_channel_retrieve_peak
+-ags_peak_channel_new
+-ags_peak_channel_run_get_type
+-ags_peak_channel_run_new
+-ags_copy_channel_get_type
+-ags_copy_channel_new
+-ags_stream_recycling_get_type
+-ags_stream_recycling_new
+-ags_route_lv2_audio_get_type
+-ags_route_lv2_audio_new
+-ags_feed_channel_get_type
+-ags_feed_channel_new
+-ags_copy_pattern_audio_get_type
+-ags_copy_pattern_audio_new
+-ags_play_audio_signal_get_type
+-ags_play_audio_signal_new
+-ags_route_dssi_audio_run_get_type
+-ags_route_dssi_audio_run_new
+-ags_stream_get_type
+-ags_stream
+-ags_stream_new
+-ags_volume_audio_signal_get_type
+-ags_volume_audio_signal_new
+-ags_route_lv2_audio_run_get_type
+-ags_route_lv2_audio_run_new
+-ags_record_midi_audio_get_type
+-ags_record_midi_audio_new
+-ags_stream_channel_get_type
+-ags_stream_channel_new
+-ags_play_audio_file_get_type
+-ags_play_audio_file_new
+-ags_mute_audio_run_get_type
+-ags_mute_audio_run_new
+-ags_copy_recycling_get_type
+-ags_copy_recycling_new
+-ags_delay_audio_run_get_type
+-ags_delay_audio_run_notation_alloc_output
+-ags_delay_audio_run_notation_alloc_input
+-ags_delay_audio_run_notation_count
+-ags_delay_audio_run_sequencer_alloc_output
+-ags_delay_audio_run_sequencer_alloc_input
+-ags_delay_audio_run_sequencer_count
+-ags_delay_audio_run_new
+-ags_copy_channel_run_get_type
+-ags_copy_channel_run_new
+-ags_play_channel_run_master_get_type
+-ags_play_channel_run_master_streamer_free
+-ags_play_channel_run_master_streamer_alloc
+-ags_play_channel_run_master_find_streamer
+-ags_play_channel_run_master_new
+-ags_feed_recycling_get_type
+-ags_feed_recycling_new
+-ags_feed_audio_signal_get_type
+-ags_feed_audio_signal_new
+-ags_stream_audio_signal_get_type
+-ags_stream_audio_signal_new
+-ags_copy_notation_audio_get_type
+-ags_copy_notation_audio_new
+-ags_copy_pattern_audio_run_get_type
+-ags_copy_pattern_audio_run_new
+-ags_volume_channel_get_type
+-ags_volume_channel_new
+-ags_playback_domain_get_type
+-ags_playback_domain_new
+-ags_jack_devout_get_type
+-ags_jack_devout_error_quark
+-ags_jack_devout_switch_buffer_flag
+-ags_jack_devout_adjust_delay_and_attack
+-ags_jack_devout_realloc_buffer
+-ags_jack_devout_new
+-ags_jack_client_get_type
+-ags_jack_client_find_uuid
+-ags_jack_client_find
+-ags_jack_client_open
+-ags_jack_client_add_device
+-ags_jack_client_remove_device
+-ags_jack_client_add_port
+-ags_jack_client_remove_port
+-ags_jack_client_activate
+-ags_jack_client_deactivate
+-ags_jack_client_new
+-ags_jack_server_get_type
+-ags_jack_server_find_url
+-ags_jack_server_find_client
+-ags_jack_server_find_port
+-ags_jack_server_add_client
+-ags_jack_server_remove_client
+-ags_jack_server_connect_client
+-ags_jack_server_new
+-ags_jack_port_get_type
+-ags_jack_port_find
+-ags_jack_port_register
+-ags_jack_port_unregister
+-ags_jack_port_new
+-ags_jack_midiin_get_type
+-ags_jack_midiin_error_quark
+-ags_jack_midiin_new
+-ags_message_key_on
+-ags_message_key_off
+-ags_message_key_pressure
+-ags_message_change_parameter
+-ags_message_change_mode
+-ags_message_pitch_bend
+-ags_message_set_bpm
+-ags_message_set_delay_factor
+-ags_recycling_get_type
+-ags_recycling_set_soundcard
+-ags_recycling_add_audio_signal
+-ags_recycling_remove_audio_signal
+-ags_recycling_create_audio_signal_with_defaults
+-ags_recycling_create_audio_signal_with_frame_count
+-ags_recycling_position
+-ags_recycling_find_next_channel
+-ags_recycling_new
+-ags_recall_recycling_dummy_get_type
+-ags_recall_recycling_dummy_new
+-ags_pattern_get_type
+-ags_pattern_find_near_timestamp
+-ags_pattern_set_dim
+-ags_pattern_is_empty
+-ags_pattern_get_bit
+-ags_pattern_toggle_bit
+-ags_pattern_new
++ags_recall_audio_get_type
++ags_recall_audio_new
+ ags_channel_get_type
+ ags_channel_error_quark
+ ags_channel_find_recall
+@@ -705,295 +1023,107 @@
+ ags_channel_tillrecycling_cancel
+ ags_channel_recursive_reset_recall_ids
+ ags_channel_new
+-ags_recall_audio_run_get_type
+-ags_recall_audio_run_new
+-ags_recall_channel_get_type
+-ags_recall_channel_find_channel
+-ags_recall_channel_new
+-ags_recycling_context_get_type
+-ags_recycling_context_replace
+-ags_recycling_context_add
+-ags_recycling_context_remove
+-ags_recycling_context_insert
+-ags_recycling_context_get_toplevel
+-ags_recycling_context_find
+-ags_recycling_context_find_child
+-ags_recycling_context_find_parent
+-ags_recycling_context_add_child
+-ags_recycling_context_remove_child
+-ags_recycling_context_get_child_recall_id
+-ags_recycling_context_reset_recycling
+-ags_recycling_context_new
+-ags_playable_get_type
+-ags_playable_error_quark
+-ags_playable_open
+-ags_playable_rw_open
+-ags_playable_level_count
+-ags_playable_nth_level
+-ags_playable_selected_level
+-ags_playable_sublevel_names
+-ags_playable_level_select
+-ags_playable_level_up
+-ags_playable_iter_start
+-ags_playable_iter_next
+-ags_playable_info
+-ags_playable_get_samplerate
+-ags_playable_get_format
+-ags_playable_read
+-ags_playable_write
+-ags_playable_flush
+-ags_playable_seek
+-ags_playable_close
+-ags_playable_read_audio_signal
+-ags_audio_buffer_util_format_from_soundcard
+-ags_audio_buffer_util_get_copy_mode
+-ags_audio_buffer_util_clear_float
+-ags_audio_buffer_util_clear_double
+-ags_audio_buffer_util_clear_buffer
+-ags_audio_buffer_util_envelope_s8
+-ags_audio_buffer_util_envelope_s16
+-ags_audio_buffer_util_envelope_s24
+-ags_audio_buffer_util_envelope_s32
+-ags_audio_buffer_util_envelope_s64
+-ags_audio_buffer_util_envelope_float
+-ags_audio_buffer_util_envelope_double
+-ags_audio_buffer_util_envelope
+-ags_audio_buffer_util_volume_s8
+-ags_audio_buffer_util_volume_s16
+-ags_audio_buffer_util_volume_s24
+-ags_audio_buffer_util_volume_s32
+-ags_audio_buffer_util_volume_s64
+-ags_audio_buffer_util_volume_float
+-ags_audio_buffer_util_volume_double
+-ags_audio_buffer_util_volume
+-ags_audio_buffer_util_resample_s8
+-ags_audio_buffer_util_resample_s16
+-ags_audio_buffer_util_resample_s24
+-ags_audio_buffer_util_resample_s32
+-ags_audio_buffer_util_resample_s64
+-ags_audio_buffer_util_resample_float
+-ags_audio_buffer_util_resample_double
+-ags_audio_buffer_util_resample
+-ags_audio_buffer_util_copy_s8_to_s8
+-ags_audio_buffer_util_copy_s8_to_s16
+-ags_audio_buffer_util_copy_s8_to_s24
+-ags_audio_buffer_util_copy_s8_to_s32
+-ags_audio_buffer_util_copy_s8_to_s64
+-ags_audio_buffer_util_copy_s8_to_float
+-ags_audio_buffer_util_copy_s8_to_double
+-ags_audio_buffer_util_copy_s16_to_s8
+-ags_audio_buffer_util_copy_s16_to_s16
+-ags_audio_buffer_util_copy_s16_to_s24
+-ags_audio_buffer_util_copy_s16_to_s32
+-ags_audio_buffer_util_copy_s16_to_s64
+-ags_audio_buffer_util_copy_s16_to_float
+-ags_audio_buffer_util_copy_s16_to_double
+-ags_audio_buffer_util_copy_s24_to_s8
+-ags_audio_buffer_util_copy_s24_to_s16
+-ags_audio_buffer_util_copy_s24_to_s24
+-ags_audio_buffer_util_copy_s24_to_s32
+-ags_audio_buffer_util_copy_s24_to_s64
+-ags_audio_buffer_util_copy_s24_to_float
+-ags_audio_buffer_util_copy_s24_to_double
+-ags_audio_buffer_util_copy_s32_to_s8
+-ags_audio_buffer_util_copy_s32_to_s16
+-ags_audio_buffer_util_copy_s32_to_s24
+-ags_audio_buffer_util_copy_s32_to_s32
+-ags_audio_buffer_util_copy_s32_to_s64
+-ags_audio_buffer_util_copy_s32_to_float
+-ags_audio_buffer_util_copy_s32_to_double
+-ags_audio_buffer_util_copy_s64_to_s8
+-ags_audio_buffer_util_copy_s64_to_s16
+-ags_audio_buffer_util_copy_s64_to_s24
+-ags_audio_buffer_util_copy_s64_to_s32
+-ags_audio_buffer_util_copy_s64_to_s64
+-ags_audio_buffer_util_copy_s64_to_float
+-ags_audio_buffer_util_copy_s64_to_double
+-ags_audio_buffer_util_copy_float_to_s8
+-ags_audio_buffer_util_copy_float_to_s16
+-ags_audio_buffer_util_copy_float_to_s24
+-ags_audio_buffer_util_copy_float_to_s32
+-ags_audio_buffer_util_copy_float_to_s64
+-ags_audio_buffer_util_copy_float_to_float
+-ags_audio_buffer_util_copy_float_to_double
+-ags_audio_buffer_util_copy_double_to_s8
+-ags_audio_buffer_util_copy_double_to_s16
+-ags_audio_buffer_util_copy_double_to_s24
+-ags_audio_buffer_util_copy_double_to_s32
+-ags_audio_buffer_util_copy_double_to_s64
+-ags_audio_buffer_util_copy_double_to_float
+-ags_audio_buffer_util_copy_double_to_double
+-ags_audio_buffer_util_copy_buffer_to_buffer
+-ags_recall_audio_signal_get_type
+-ags_recall_audio_signal_new
+-ags_notation_get_type
+-ags_notation_find_near_timestamp
+-ags_notation_add_note
+-ags_notation_remove_note_at_position
+-ags_notation_get_selection
+-ags_notation_is_note_selected
+-ags_notation_find_point
+-ags_notation_find_region
+-ags_notation_free_selection
+-ags_notation_add_all_to_selection
+-ags_notation_add_point_to_selection
+-ags_notation_remove_point_from_selection
+-ags_notation_add_region_to_selection
+-ags_notation_remove_region_from_selection
+-ags_notation_copy_selection
+-ags_notation_cut_selection
+-ags_notation_insert_from_clipboard
+-ags_notation_get_current
+-ags_notation_new
+-ags_port_get_type
+-ags_port_safe_read
+-ags_port_safe_write
+-ags_port_safe_write_raw
+-ags_port_safe_get_property
+-ags_port_safe_set_property
+-ags_port_find_specifier
+-ags_port_new
+-ags_recall_ladspa_get_type
+-ags_recall_ladspa_load
+-ags_recall_ladspa_load_ports
+-ags_recall_ladspa_load_conversion
+-ags_recall_ladspa_find
+-ags_recall_ladspa_new
+-ags_channel_iter_alloc
+-ags_channel_iter_free
+-ags_channel_iter_prev
+-ags_channel_iter_next
+-ags_recall_dssi_get_type
+-ags_recall_dssi_load
+-ags_recall_dssi_load_ports
+-ags_recall_dssi_load_conversion
+-ags_recall_dssi_find
+-ags_recall_dssi_new
+-ags_recall_ladspa_run_get_type
+-ags_recall_ladspa_run_new
+-ags_input_get_type
+-ags_input_open_file
+-ags_input_apply_synth
+-ags_input_new
+-ags_synth_generator_get_type
+-ags_synth_generator_new
+-ags_audio_file_link_get_type
+-ags_audio_file_link_new
+-ags_audio_file_get_type
+-ags_audio_file_check_suffix
+-ags_audio_file_open
+-ags_audio_file_open_from_data
+-ags_audio_file_rw_open
+-ags_audio_file_close
+-ags_audio_file_read_audio_signal
+-ags_audio_file_seek
+-ags_audio_file_write
+-ags_audio_file_flush
+-ags_audio_file_new
+-ags_sndfile_get_type
+-ags_sndfile_new
+-ags_ipatch_dls2_reader_get_type
+-ags_ipatch_dls2_reader_new
+-ags_ipatch_get_type
+-ags_ipatch_check_suffix
+-ags_ipatch_new
+-ags_file_read_soundcard
+-ags_file_write_soundcard
+-ags_file_read_soundcard_list
+-ags_file_write_soundcard_list
+-ags_file_read_playback
+-ags_file_write_playback
+-ags_file_read_playback_list
+-ags_file_write_playback_list
+-ags_file_read_audio
+-ags_file_write_audio
+-ags_file_read_audio_list
+-ags_file_write_audio_list
+-ags_file_read_channel
+-ags_file_write_channel
+-ags_file_read_channel_list
+-ags_file_write_channel_list
+-ags_file_read_input
+-ags_file_write_input
+-ags_file_read_output
+-ags_file_write_output
+-ags_file_read_recall
+-ags_file_write_recall
+-ags_file_read_recall_list
+-ags_file_write_recall_list
+-ags_file_read_recall_container
+-ags_file_write_recall_container
+-ags_file_read_recall_container_list
+-ags_file_write_recall_container_list
+-ags_file_read_recall_audio
+-ags_file_write_recall_audio
+-ags_file_read_recall_audio_run
+-ags_file_write_recall_audio_run
+-ags_file_read_recall_channel
+-ags_file_write_recall_channel
+-ags_file_read_recall_channel_run
+-ags_file_write_recall_channel_run
+-ags_file_read_recall_recycling
+-ags_file_write_recall_recycling
+-ags_file_read_recall_audio_signal
+-ags_file_write_recall_audio_signal
+-ags_file_read_port
+-ags_file_write_port
+-ags_file_read_port_list
+-ags_file_write_port_list
+-ags_file_read_recycling
+-ags_file_write_recycling
+-ags_file_read_recycling_list
+-ags_file_write_recycling_list
+-ags_file_read_audio_signal
+-ags_file_write_audio_signal
+-ags_file_read_audio_signal_list
+-ags_file_write_audio_signal_list
+-ags_file_read_stream
+-ags_file_write_stream
+-ags_file_read_stream_list
+-ags_file_write_stream_list
+-ags_file_read_pattern
+-ags_file_write_pattern
+-ags_file_read_pattern_list
+-ags_file_write_pattern_list
+-ags_file_read_pattern_data
+-ags_file_write_pattern_data
+-ags_file_read_pattern_data_list
+-ags_file_write_pattern_data_list
+-ags_file_read_notation
+-ags_file_write_notation
+-ags_file_read_notation_list
+-ags_file_write_notation_list
+-ags_file_read_note
+-ags_file_write_note
+-ags_file_read_note_list
+-ags_file_write_note_list
+-ags_file_read_automation
+-ags_file_write_automation
+-ags_file_read_automation_list
+-ags_file_write_automation_list
+-ags_file_read_acceleration
+-ags_file_write_acceleration
+-ags_file_read_acceleration_list
+-ags_file_write_acceleration_list
+-ags_file_read_task
+-ags_file_write_task
+-ags_file_read_task_list
+-ags_file_write_task_list
+-ags_file_read_embedded_audio
+-ags_file_write_embedded_audio
+-ags_file_read_embedded_audio_list
+-ags_file_write_embedded_audio_list
+-ags_ipatch_sf2_reader_get_type
+-ags_ipatch_sf2_reader_new
+-ags_recall_container_get_type
+-ags_recall_container_get_recall_audio
+-ags_recall_container_get_recall_audio_run
+-ags_recall_container_get_recall_channel
+-ags_recall_container_get_recall_channel_run
+-ags_recall_container_find
+-ags_recall_container_new
++ags_audio_signal_get_type
++ags_stream_alloc
++ags_stream_free
++ags_audio_signal_set_samplerate
++ags_audio_signal_set_buffer_size
++ags_audio_signal_set_format
++ags_audio_signal_get_length_till_current
++ags_audio_signal_add_stream
++ags_audio_signal_stream_resize
++ags_audio_signal_stream_safe_resize
++ags_audio_signal_realloc_buffer_size
++ags_audio_signal_duplicate_stream
++ags_audio_signal_get_template
++ags_audio_signal_get_stream_current
++ags_audio_signal_get_by_recall_id
++ags_audio_signal_tile
++ags_audio_signal_scale
++ags_audio_signal_feed
++ags_audio_signal_envelope
++ags_audio_signal_new
++ags_audio_signal_new_with_length
++ags_audio_application_context_get_type
++ags_audio_application_context_new
++ags_audio_connection_get_type
++ags_audio_connection_find
++ags_audio_connection_new
++ags_message_key_on
++ags_message_key_off
++ags_message_key_pressure
++ags_message_change_parameter
++ags_message_change_mode
++ags_message_pitch_bend
++ags_message_set_bpm
++ags_message_set_delay_factor
++ags_recall_id_get_type
++ags_recall_id_get_run_stage
++ags_recall_id_set_run_stage
++ags_recall_id_unset_run_stage
++ags_recall_id_find_recycling_context
++ags_recall_id_find_parent_recycling_context
++ags_recall_id_new
++ags_recall_dependency_get_type
++ags_recall_dependency_find_dependency
++ags_recall_dependency_find_dependency_by_provider
++ags_recall_dependency_resolve
++ags_recall_dependency_new
++ags_midi_builder_get_type
++ags_midi_builder_header_alloc
++ags_midi_builder_header_free
++ags_midi_builder_track_alloc
++ags_midi_builder_track_free
++ags_midi_builder_track_find_delta_time_with_track_name
++ags_midi_builder_track_insert_midi_message
++ags_midi_builder_track_get_delta_time_offset
++ags_midi_builder_midi_putc
++ags_midi_builder_on_error
++ags_midi_builder_append_header
++ags_midi_builder_append_track
++ags_midi_builder_append_key_on
++ags_midi_builder_append_key_off
++ags_midi_builder_append_key_pressure
++ags_midi_builder_append_change_parameter
++ags_midi_builder_append_change_pitch_bend
++ags_midi_builder_append_change_program
++ags_midi_builder_append_change_pressure
++ags_midi_builder_append_sysex
++ags_midi_builder_append_quarter_frame
++ags_midi_builder_append_song_position
++ags_midi_builder_append_song_select
++ags_midi_builder_append_tune_request
++ags_midi_builder_append_sequence_number
++ags_midi_builder_append_smtpe
++ags_midi_builder_append_tempo
++ags_midi_builder_append_time_signature
++ags_midi_builder_append_key_signature
++ags_midi_builder_append_sequencer_meta_event
++ags_midi_builder_append_text_event
++ags_midi_builder_append_xml_node
++ags_midi_builder_from_xml_doc
++ags_midi_builder_build
++ags_midi_builder_new
++ags_midi_util_is_key_on
++ags_midi_util_is_key_off
++ags_midi_util_is_key_pressure
++ags_midi_util_is_change_parameter
++ags_midi_util_is_pitch_bend
++ags_midi_util_is_change_program
++ags_midi_util_is_change_pressure
++ags_midi_util_is_sysex
++ags_midi_util_is_quarter_frame
++ags_midi_util_is_song_position
++ags_midi_util_is_song_select
++ags_midi_util_is_tune_request
++ags_midi_util_is_meta_event
++ags_midi_util_to_smf
++ags_midi_util_envelope_to_velocity
++ags_midi_util_velocity_to_envelope
++ags_midi_util_envelope_to_pressure
++ags_midi_util_pressure_to_envelope
++ags_midi_util_delta_time_to_offset
++ags_midi_util_offset_to_delta_time
+ ags_midi_parser_get_type
+ ags_midi_parser_read_gint16
+ ags_midi_parser_read_gint24
+@@ -1029,26 +1159,39 @@
+ ags_midi_parser_meta_misc
+ ags_midi_parser_text_event
+ ags_midi_parser_new
+-ags_midi_util_is_key_on
+-ags_midi_util_is_key_off
+-ags_midi_util_is_key_pressure
+-ags_midi_util_is_change_parameter
+-ags_midi_util_is_pitch_bend
+-ags_midi_util_is_change_program
+-ags_midi_util_is_change_pressure
+-ags_midi_util_is_sysex
+-ags_midi_util_is_quarter_frame
+-ags_midi_util_is_song_position
+-ags_midi_util_is_song_select
+-ags_midi_util_is_tune_request
+-ags_midi_util_is_meta_event
+-ags_midi_util_to_smf
+-ags_midi_util_envelope_to_velocity
+-ags_midi_util_velocity_to_envelope
+-ags_midi_util_envelope_to_pressure
+-ags_midi_util_pressure_to_envelope
+-ags_midi_util_delta_time_to_offset
+-ags_midi_util_offset_to_delta_time
++ags_midi_file_writer_get_type
++ags_midi_file_writer_write_bytes
++ags_midi_file_writer_write_channel_message
++ags_midi_file_writer_write_status_message
++ags_midi_file_writer_new
++ags_midi_file_get_type
++ags_midi_file_open
++ags_midi_file_open_from_data
++ags_midi_file_rw_open
++ags_midi_file_close
++ags_midi_file_read
++ags_midi_file_write
++ags_midi_file_seek
++ags_midi_file_flush
++ags_midi_file_read_gint16
++ags_midi_file_read_gint24
++ags_midi_file_read_gint32
++ags_midi_file_read_varlength
++ags_midi_file_read_text
++ags_midi_file_write_gint16
++ags_midi_file_write_gint24
++ags_midi_file_write_gint32
++ags_midi_file_write_varlength
++ags_midi_file_write_text
++ags_midi_file_read_header
++ags_midi_file_write_header
++ags_midi_file_read_track_data
++ags_midi_file_write_track_data
++ags_midi_file_new
++ags_midi_file_reader_get_type
++ags_midi_file_reader_read_channel_message
++ags_midi_file_reader_read_status_message
++ags_midi_file_reader_new
+ ags_midi_buffer_util_get_varlength_size
+ ags_midi_buffer_util_put_varlength
+ ags_midi_buffer_util_get_varlength
+@@ -1104,144 +1247,3 @@
+ ags_midi_buffer_util_get_end_of_track
+ ags_midi_buffer_util_seek_message
+ ags_midi_buffer_util_decode
+-ags_midi_builder_get_type
+-ags_midi_builder_header_alloc
+-ags_midi_builder_header_free
+-ags_midi_builder_track_alloc
+-ags_midi_builder_track_free
+-ags_midi_builder_track_find_delta_time_with_track_name
+-ags_midi_builder_track_insert_midi_message
+-ags_midi_builder_track_get_delta_time_offset
+-ags_midi_builder_midi_putc
+-ags_midi_builder_on_error
+-ags_midi_builder_append_header
+-ags_midi_builder_append_track
+-ags_midi_builder_append_key_on
+-ags_midi_builder_append_key_off
+-ags_midi_builder_append_key_pressure
+-ags_midi_builder_append_change_parameter
+-ags_midi_builder_append_change_pitch_bend
+-ags_midi_builder_append_change_program
+-ags_midi_builder_append_change_pressure
+-ags_midi_builder_append_sysex
+-ags_midi_builder_append_quarter_frame
+-ags_midi_builder_append_song_position
+-ags_midi_builder_append_song_select
+-ags_midi_builder_append_tune_request
+-ags_midi_builder_append_sequence_number
+-ags_midi_builder_append_smtpe
+-ags_midi_builder_append_tempo
+-ags_midi_builder_append_time_signature
+-ags_midi_builder_append_key_signature
+-ags_midi_builder_append_sequencer_meta_event
+-ags_midi_builder_append_text_event
+-ags_midi_builder_append_xml_node
+-ags_midi_builder_from_xml_doc
+-ags_midi_builder_build
+-ags_midi_builder_new
+-ags_midi_file_get_type
+-ags_midi_file_open
+-ags_midi_file_open_from_data
+-ags_midi_file_rw_open
+-ags_midi_file_close
+-ags_midi_file_read
+-ags_midi_file_write
+-ags_midi_file_seek
+-ags_midi_file_flush
+-ags_midi_file_read_gint16
+-ags_midi_file_read_gint24
+-ags_midi_file_read_gint32
+-ags_midi_file_read_varlength
+-ags_midi_file_read_text
+-ags_midi_file_write_gint16
+-ags_midi_file_write_gint24
+-ags_midi_file_write_gint32
+-ags_midi_file_write_varlength
+-ags_midi_file_write_text
+-ags_midi_file_read_header
+-ags_midi_file_write_header
+-ags_midi_file_read_track_data
+-ags_midi_file_write_track_data
+-ags_midi_file_new
+-ags_midi_file_writer_get_type
+-ags_midi_file_writer_write_bytes
+-ags_midi_file_writer_write_channel_message
+-ags_midi_file_writer_write_status_message
+-ags_midi_file_writer_new
+-ags_midi_file_reader_get_type
+-ags_midi_file_reader_read_channel_message
+-ags_midi_file_reader_read_status_message
+-ags_midi_file_reader_new
+-ags_remote_channel_get_type
+-ags_remote_channel_error_quark
+-ags_remote_channel_new
+-ags_remote_output_get_type
+-ags_remote_output_new
+-ags_remote_input_get_type
+-ags_remote_input_new
+-ags_recall_audio_get_type
+-ags_recall_audio_new
+-ags_acceleration_get_type
+-ags_acceleration_duplicate
+-ags_acceleration_new
+-ags_recall_factory_get_type
+-ags_recall_factory_create
+-ags_recall_factory_remove
+-ags_recall_factory_get_instance
+-ags_recall_factory_new
+-ags_recall_recycling_get_type
+-ags_recall_recycling_get_child_source
+-ags_recall_recycling_new
+-ags_recall_lv2_get_type
+-ags_recall_lv2_load
+-ags_recall_lv2_load_ports
+-ags_recall_lv2_load_conversion
+-ags_recall_lv2_find
+-ags_recall_lv2_new
+-ags_devout_get_type
+-ags_devout_error_quark
+-ags_devout_switch_buffer_flag
+-ags_devout_adjust_delay_and_attack
+-ags_devout_realloc_buffer
+-ags_devout_new
+-ags_audio_get_type
+-ags_audio_set_soundcard
+-ags_audio_set_flags
+-ags_audio_unset_flags
+-ags_audio_check_connection
+-ags_audio_set_audio_channels
+-ags_audio_set_pads
+-ags_audio_set_samplerate
+-ags_audio_set_buffer_size
+-ags_audio_set_format
+-ags_audio_set_sequence_length
+-ags_audio_add_audio_connection
+-ags_audio_remove_audio_connection
+-ags_audio_add_notation
+-ags_audio_remove_notation
+-ags_audio_add_automation
+-ags_audio_remove_automation
+-ags_audio_add_recall_id
+-ags_audio_remove_recall_id
+-ags_audio_add_recycling_context
+-ags_audio_remove_recycling_context
+-ags_audio_add_recall_container
+-ags_audio_remove_recall_container
+-ags_audio_add_recall
+-ags_audio_remove_recall
+-ags_audio_recall_change_state
+-ags_audio_init_run
+-ags_audio_duplicate_recall
+-ags_audio_init_recall
+-ags_audio_resolve_recall
+-ags_audio_is_playing
+-ags_audio_play
+-ags_audio_tact
+-ags_audio_done
+-ags_audio_cancel
+-ags_audio_remove
+-ags_audio_find_port
+-ags_audio_open_files
+-ags_audio_recursive_set_property
+-ags_audio_recursive_play_init
+-ags_audio_new
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..8116fa1
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,2 @@
+fix-generated-symbols.patch
+fix-critical-bugs.patch
--
gsequencer packaging
More information about the pkg-multimedia-commits
mailing list