[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