Hello community,

here is the log from the commit of package gsequencer for openSUSE:Factory 
checked in at 2018-02-05 10:53:07
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gsequencer (Old)
 and      /work/SRC/openSUSE:Factory/.gsequencer.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gsequencer"

Mon Feb  5 10:53:07 2018 rev:8 rq:572414 version:1.4.18

Changes:
--------
--- /work/SRC/openSUSE:Factory/gsequencer/gsequencer.changes    2018-01-30 
15:44:52.485285410 +0100
+++ /work/SRC/openSUSE:Factory/.gsequencer.new/gsequencer.changes       
2018-02-05 10:53:54.137806004 +0100
@@ -1,0 +2,12 @@
+Sat Feb  3 01:06:58 UTC 2018 - [email protected]
+
+- New upstream v1.4.18 fixed step sequencer's clipboard.
+
+-------------------------------------------------------------------
+Fri Feb  2 13:01:23 UTC 2018 - [email protected]
+
+- New upstream v1.4.17 various fixes to initialization code of
+  recalls in ags_channel.c.
+- Fixed playback scope and related code in ags_play_channel_run.c.
+
+-------------------------------------------------------------------

Old:
----
  gsequencer-1.4.15.tar.gz

New:
----
  gsequencer-1.4.18.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gsequencer.spec ++++++
--- /var/tmp/diff_new_pack.dUcGzC/_old  2018-02-05 10:53:54.797775139 +0100
+++ /var/tmp/diff_new_pack.dUcGzC/_new  2018-02-05 10:53:54.801774952 +0100
@@ -18,7 +18,7 @@
 %define libagssonumber 1
 %define libgsequencersonumber 0
 Name:           gsequencer
-Version:        1.4.15
+Version:        1.4.18
 Release:        0
 Summary:        Audio processing engine
 License:        GPL-3.0+ AND AGPL-3.0+ AND GFDL-1.3

++++++ gsequencer-1.4.15.tar.gz -> gsequencer-1.4.18.tar.gz ++++++
++++ 1758 lines of diff (skipped)
++++    retrying with extended exclude list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ChangeLog new/gsequencer-1.4.18/ChangeLog
--- old/gsequencer-1.4.15/ChangeLog     2018-01-26 03:22:44.000000000 +0100
+++ new/gsequencer-1.4.18/ChangeLog     2018-02-02 22:37:51.000000000 +0100
@@ -1,3 +1,22 @@
+ags (1.4.18)
+
+       [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ]
+       * fixed copy to clipboard in AgsMatrix and AgsDrum
+
+ags (1.4.17)
+
+       [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ]
+       * fixed playback scope
+       * fixed wrong count of runs and init code in ags_channel.c
+       * minor-fixes
+
+ags (1.4.16)
+
+       [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ]
+       * fixed potential SIGSEGV during ags_recall_dssi_run_finalize()
+       * fixed potential SIGSEGV during ags_recall_lv2_run_finalize()
+       * removed redundant code in ags_simple_file.c
+
 ags (1.4.15)
 
        [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/X/ags_machine.c 
new/gsequencer-1.4.18/ags/X/ags_machine.c
--- old/gsequencer-1.4.15/ags/X/ags_machine.c   2018-01-19 16:12:03.000000000 
+0100
+++ new/gsequencer-1.4.18/ags/X/ags_machine.c   2018-02-02 22:38:03.000000000 
+0100
@@ -2115,7 +2115,7 @@
   AgsMutexManager *mutex_manager;
 
   xmlDoc *clipboard;
-  xmlNode *audio_node, *notation_node;
+  xmlNode *audio_node, *notation_list_node, *notation_node;
 
   xmlChar *buffer;
   int size;
@@ -2198,9 +2198,15 @@
   clipboard = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION);
 
   /* create root node */
-  audio_node = xmlNewNode(NULL, BAD_CAST "audio");
+  audio_node = xmlNewNode(NULL,
+                         BAD_CAST "audio");
   xmlDocSetRootElement(clipboard, audio_node);
 
+  notation_list_node = xmlNewNode(NULL,
+                                 BAD_CAST "notation-list");
+  xmlAddChild(audio_node,
+             notation_list_node);
+  
   audio = machine->audio;
 
   mutex_manager = ags_mutex_manager_get_instance();  
@@ -2234,7 +2240,8 @@
     pthread_mutex_lock(current_mutex);
     
     notation_node = ags_machine_copy_pattern_to_notation(channel);
-    xmlAddChild(audio_node, notation_node);
+    xmlAddChild(notation_list_node,
+               notation_node);
 
     channel = channel->next;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/X/ags_navigation_callbacks.c 
new/gsequencer-1.4.18/ags/X/ags_navigation_callbacks.c
--- old/gsequencer-1.4.15/ags/X/ags_navigation_callbacks.c      2018-01-19 
16:12:03.000000000 +0100
+++ new/gsequencer-1.4.18/ags/X/ags_navigation_callbacks.c      2018-01-31 
18:13:52.000000000 +0100
@@ -167,7 +167,7 @@
     if(((AGS_MACHINE_IS_SEQUENCER & (machine->flags)) != 0) ||
        (AGS_MACHINE_IS_SYNTHESIZER & (machine->flags)) != 0){
 #ifdef AGS_DEBUG
-      printf("found machine to play!\n");
+      g_message("found machine to play!\n");
 #endif
       
       if(!initialized_time){
@@ -204,8 +204,10 @@
 
     if((AGS_MACHINE_IS_SEQUENCER & (machine->flags)) != 0 ||
        (AGS_MACHINE_IS_SYNTHESIZER & (machine->flags)) != 0){
-      printf("found machine to stop!\n");
-
+#ifdef AGS_DEBUG
+      g_message("found machine to stop!");
+#endif
+      
       ags_machine_set_run_extended(machine,
                                   FALSE,
                                   
!gtk_toggle_button_get_active((GtkToggleButton *) 
navigation->exclude_sequencer), TRUE);
@@ -310,8 +312,10 @@
 
     if((AGS_MACHINE_IS_SEQUENCER & (machine->flags)) !=0 ||
        (AGS_MACHINE_IS_SYNTHESIZER & (machine->flags)) != 0){
+#ifdef AGS_DEBUG
       g_message("found machine to loop!\n");
-
+#endif
+      
       audio = machine->audio;
 
       /* get mutex manager and application mutex */
@@ -409,8 +413,10 @@
 
     if((AGS_MACHINE_IS_SEQUENCER & (machine->flags)) != 0 ||
        (AGS_MACHINE_IS_SYNTHESIZER & (machine->flags)) != 0){
+#ifdef AGS_DEBUG
       g_message("found machine to loop!\n");
-
+#endif
+      
       audio = machine->audio;
       
       /* get mutex manager and application mutex */
@@ -490,8 +496,10 @@
 
     if((AGS_MACHINE_IS_SEQUENCER & (machine->flags)) != 0 ||
        (AGS_MACHINE_IS_SYNTHESIZER & (machine->flags)) != 0){
+#ifdef AGS_DEBUG
       g_message("found machine to loop!\n");
-
+#endif
+      
       audio = machine->audio;
       
       /* get mutex manager and application mutex */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/X/ags_notation_editor.c 
new/gsequencer-1.4.18/ags/X/ags_notation_editor.c
--- old/gsequencer-1.4.15/ags/X/ags_notation_editor.c   2018-01-25 
23:18:29.000000000 +0100
+++ new/gsequencer-1.4.18/ags/X/ags_notation_editor.c   2018-02-02 
22:36:41.000000000 +0100
@@ -1453,7 +1453,7 @@
       if(audio_node->type == XML_ELEMENT_NODE){
        if(!xmlStrncmp("audio", audio_node->name, 6)){
          notation_node = audio_node->children;
-       
+         
          first_x = ags_notation_editor_paste_notation(audio_node);
        
          break;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/X/ags_pad_callbacks.c 
new/gsequencer-1.4.18/ags/X/ags_pad_callbacks.c
--- old/gsequencer-1.4.15/ags/X/ags_pad_callbacks.c     2018-01-19 
16:12:03.000000000 +0100
+++ new/gsequencer-1.4.18/ags/X/ags_pad_callbacks.c     2018-02-02 
14:05:47.000000000 +0100
@@ -426,6 +426,7 @@
                         NULL);
          }
 
+         note->rt_attack = 0;
          note->rt_offset = 0;
 
          pthread_mutex_unlock(recycling_mutex);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/X/file/ags_simple_file.c 
new/gsequencer-1.4.18/ags/X/file/ags_simple_file.c
--- old/gsequencer-1.4.15/ags/X/file/ags_simple_file.c  2018-01-26 
03:21:40.000000000 +0100
+++ new/gsequencer-1.4.18/ags/X/file/ags_simple_file.c  2018-02-02 
22:24:33.000000000 +0100
@@ -1673,8 +1673,6 @@
   AgsWindow *window;
   AgsMachine *gobject;
 
-  AgsResizeAudio *resize_audio;
-
   AgsConfig *config;
   GObject *soundcard;
 
@@ -1954,16 +1952,7 @@
     wait_output = TRUE;
   }
 
-  /* create task */
-  resize_audio = ags_resize_audio_new(gobject->audio,
-                                     (guint) output_pads,
-                                     (guint) input_pads,
-                                     (guint) audio_channels);
-
-  /* append AgsResizeAudio */
-  
ags_gui_thread_schedule_task(ags_ui_provider_get_gui_thread(AGS_UI_PROVIDER(simple_file->application_context)),
-                              resize_audio);
-
+  /* dispatch */
   while((wait_output && !wait_data[0]) ||
        (wait_input && !wait_data[1])){
     usleep(1000000 / 30);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/X/machine/ags_drum_input_line.c 
new/gsequencer-1.4.18/ags/X/machine/ags_drum_input_line.c
--- old/gsequencer-1.4.15/ags/X/machine/ags_drum_input_line.c   2018-01-25 
23:18:29.000000000 +0100
+++ new/gsequencer-1.4.18/ags/X/machine/ags_drum_input_line.c   2018-02-02 
14:05:47.000000000 +0100
@@ -446,6 +446,19 @@
 
   source = line->channel;
   
+  rt_safe = TRUE;
+
+  str = ags_config_get_value(config,
+                            AGS_CONFIG_GENERIC,
+                            "rt-safe");
+
+  if(str != NULL &&
+     !g_ascii_strncasecmp(str,
+                         "FALSE",
+                         6)){
+    rt_safe = FALSE;
+  }
+
   /* lookup source mutex */
   pthread_mutex_lock(application_mutex);
 
@@ -506,16 +519,29 @@
 
   pthread_mutex_unlock(source_mutex);
 
+  if(rt_safe){
+    ags_recall_factory_create(audio,
+                             NULL, NULL,
+                             "ags-rt-stream",
+                             audio_channel, audio_channel + 1, 
+                             pad, pad + 1,
+                             (AGS_RECALL_FACTORY_INPUT |
+                              AGS_RECALL_FACTORY_PLAY |
+                              AGS_RECALL_FACTORY_RECALL | 
+                              AGS_RECALL_FACTORY_ADD),
+                             0);
+  }
+
   /* ags-play */
   ags_recall_factory_create(audio,
                            NULL, NULL,
-                           "ags-play",
-                           audio_channel, audio_channel + 1, 
-                           pad, pad + 1,
-                           (AGS_RECALL_FACTORY_INPUT |
+                           "ags-play",
+                           audio_channel, audio_channel + 1, 
+                           pad, pad + 1,
+                           (AGS_RECALL_FACTORY_INPUT |
                             AGS_RECALL_FACTORY_PLAY |
-                            AGS_RECALL_FACTORY_ADD),
-                           0);
+                            AGS_RECALL_FACTORY_ADD),
+                           0);
 
   pthread_mutex_lock(source_mutex);
 
@@ -536,7 +562,7 @@
   }
 
   pthread_mutex_unlock(source_mutex);
-
+  
   /* ags-volume */
   ags_recall_factory_create(audio,
                            NULL, NULL,
@@ -562,19 +588,6 @@
                            0);
 
   /* ags-stream */
-  rt_safe = TRUE;
-
-  str = ags_config_get_value(config,
-                            AGS_CONFIG_GENERIC,
-                            "rt-safe");
-
-  if(str != NULL &&
-     !g_ascii_strncasecmp(str,
-                         "FALSE",
-                         6)){
-    rt_safe = FALSE;
-  }
-
   if(!rt_safe){
     ags_recall_factory_create(audio,
                              NULL, NULL,
@@ -603,17 +616,6 @@
                 NULL);
 
     pthread_mutex_unlock(source_mutex);
-  }else{
-    ags_recall_factory_create(audio,
-                             NULL, NULL,
-                             "ags-rt-stream",
-                             audio_channel, audio_channel + 1, 
-                             pad, pad + 1,
-                             (AGS_RECALL_FACTORY_INPUT |
-                              AGS_RECALL_FACTORY_PLAY |
-                              AGS_RECALL_FACTORY_RECALL | 
-                              AGS_RECALL_FACTORY_ADD),
-                             0);
   }
   
   /* call parent */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/ags_audio.c 
new/gsequencer-1.4.18/ags/audio/ags_audio.c
--- old/gsequencer-1.4.15/ags/audio/ags_audio.c 2018-01-25 23:18:29.000000000 
+0100
+++ new/gsequencer-1.4.18/ags/audio/ags_audio.c 2018-02-02 22:24:33.000000000 
+0100
@@ -1812,6 +1812,24 @@
 
   /* playback domain */
   if(audio->playback_domain != NULL){
+    AgsPlaybackDomain *playback_domain;
+
+    playback_domain = audio->playback_domain;
+
+    if(playback_domain->audio_thread != NULL){
+      if(playback_domain->audio_thread[0] != NULL){
+       ags_thread_stop(playback_domain->audio_thread[0]);
+      }
+      
+      if(playback_domain->audio_thread[1] != NULL){
+       ags_thread_stop(playback_domain->audio_thread[1]);
+      }
+      
+      if(playback_domain->audio_thread[2] != NULL){
+       ags_thread_stop(playback_domain->audio_thread[2]);
+      }
+    }
+
     g_object_run_dispose(audio->playback_domain);
 
     audio->playback_domain = NULL;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/ags_channel.c 
new/gsequencer-1.4.18/ags/audio/ags_channel.c
--- old/gsequencer-1.4.15/ags/audio/ags_channel.c       2018-01-25 
23:18:29.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/ags_channel.c       2018-02-02 
22:24:33.000000000 +0100
@@ -1434,10 +1434,20 @@
     AgsPlayback *playback;
 
     playback = channel->playback;
-    
-    ags_thread_stop(playback->channel_thread[0]);
-    ags_thread_stop(playback->channel_thread[1]);
-    ags_thread_stop(playback->channel_thread[2]);
+
+    if(playback->channel_thread != NULL){
+      if(playback->channel_thread[0] != NULL){
+       ags_thread_stop(playback->channel_thread[0]);
+      }
+      
+      if(playback->channel_thread[1] != NULL){
+       ags_thread_stop(playback->channel_thread[1]);
+      }
+      
+      if(playback->channel_thread[2] != NULL){
+       ags_thread_stop(playback->channel_thread[2]);
+      }
+    }
     
     g_object_set(playback,
                 "source", NULL,
@@ -4812,7 +4822,7 @@
     if((AGS_RECALL_TEMPLATE & (recall_flags)) == 0 &&
        (AGS_RECALL_RUN_FIRST & (recall_flags)) != 0){
 #ifdef AGS_DEBUG
-      g_message("%s play channel %x:%d @%x -> %x", G_OBJECT_TYPE_NAME(recall), 
channel, channel->line, recall, recall->recall_id);
+      g_message("%s play first channel %x:%d @%x -> %x", 
G_OBJECT_TYPE_NAME(recall), channel, channel->line, recall, recall->recall_id);
 #endif
 
       if((AGS_RECALL_HIDE & (recall_flags)) == 0){
@@ -4925,7 +4935,7 @@
     if((AGS_RECALL_TEMPLATE & (recall_flags)) == 0 &&
        (AGS_RECALL_RUN_LAST & (recall_flags)) != 0){
 #ifdef AGS_DEBUG
-      g_message("%s play channel %x:%d @%x -> %x", G_OBJECT_TYPE_NAME(recall), 
channel, channel->line, recall, recall->recall_id);
+      g_message("%s play last channel %x:%d @%x -> %x", 
G_OBJECT_TYPE_NAME(recall), channel, channel->line, recall, recall->recall_id);
 #endif
 
       if((AGS_RECALL_HIDE & (recall_flags)) == 0){
@@ -8220,40 +8230,25 @@
                                          NULL, FALSE, FALSE);
   }
 
-  if(duplicate_templates &&
-     resolve_dependencies){
-    if(stage == -1){
-      ags_channel_recursive_init(channel,
-                                recall_id,
-                                -1, -1,
-                                TRUE, TRUE);
-    }else if(stage >= 0 && stage < 4){
-      ags_channel_recursive_init(channel,
-                                recall_id,
-                                ((stage == 0) ? -1: 4), stage,
-                                TRUE, TRUE);
-    }
-  }else{
-    if(duplicate_templates){
-      ags_channel_recursive_init(channel,
-                                recall_id,
-                                0, 4,
-                                TRUE, TRUE);
-    }
-
-    if(resolve_dependencies){
-      ags_channel_recursive_init(channel,
-                                recall_id,
-                                1, 4,
-                                TRUE, TRUE);
-    }
-
-    if(stage == -1 || (stage >= 0 && stage < 4)){
-      ags_channel_recursive_init(channel,
-                                recall_id,
-                                2, stage,
-                                TRUE, TRUE);
-    }
+  if(duplicate_templates){
+    ags_channel_recursive_init(channel,
+                              recall_id,
+                              0, 4,
+                              TRUE, TRUE);
+  }
+
+  if(resolve_dependencies){
+    ags_channel_recursive_init(channel,
+                              recall_id,
+                              1, 4,
+                              TRUE, TRUE);
+  }
+
+  if(stage == -1 || (stage >= 0 && stage < 4)){
+    ags_channel_recursive_init(channel,
+                              recall_id,
+                              2, stage,
+                              TRUE, TRUE);
   }
 
   if(stage == -1 ||
@@ -10560,27 +10555,30 @@
 
       pthread_mutex_unlock(current_mutex);
 
-      switch(stage){
-      case 0:
-       {
-         ags_channel_duplicate_recall(current,
+      if(current != channel ||
+        !init_down){
+       switch(stage){
+       case 0:
+         {
+           ags_channel_duplicate_recall(current,
+                                        recall_id);
+         }
+         break;
+       case 1:
+         {
+           ags_channel_resolve_recall(current,
                                       recall_id);
+         }
+         break;
+       case 2:
+         {
+           ags_channel_init_recall(current, init_stage,
+                                   recall_id);
+         }
+         break;
        }
-       break;
-      case 1:
-       {
-         ags_channel_resolve_recall(current,
-                                    recall_id);
-       }
-       break;
-      case 2:
-       {
-         ags_channel_init_recall(current, init_stage,
-                                 recall_id);
-       }
-       break;
       }
-         
+      
       /* get audio mutex */
       pthread_mutex_lock(application_mutex);
 
@@ -10597,27 +10595,30 @@
 
       pthread_mutex_unlock(audio_mutex);
 
-      switch(stage){
-      case 0:
-       {
-         ags_audio_duplicate_recall(audio,
+      if(current != channel ||
+        !init_down){
+       switch(stage){
+       case 0:
+         {
+           ags_audio_duplicate_recall(audio,
+                                      recall_id);
+         }
+         break;
+       case 1:
+         {
+           ags_audio_resolve_recall(audio,
                                     recall_id);
+         }
+         break;
+       case 2:
+         {
+           ags_audio_init_recall(audio, init_stage,
+                                 recall_id);
+         }
+         break;
        }
-       break;
-      case 1:
-       {
-         ags_audio_resolve_recall(audio,
-                                  recall_id);
-       }
-       break;
-      case 2:
-       {
-         ags_audio_init_recall(audio, init_stage,
-                               recall_id);
-       }
-       break;
       }
-         
+      
       /* get some fields */
       pthread_mutex_lock(audio_mutex);
          
@@ -11245,10 +11246,13 @@
 
       pthread_mutex_unlock(current_mutex);
 
-      ags_channel_play(current,
-                      recall_id,
-                      run_stage);
-
+      if(current != channel ||
+        !run_down){
+       ags_channel_play(current,
+                        recall_id,
+                        run_stage);
+      }
+      
       /* get audio mutex */
       pthread_mutex_lock(application_mutex);
 
@@ -11265,10 +11269,13 @@
 
       pthread_mutex_unlock(audio_mutex);
 
-      ags_audio_play(audio,
-                    recall_id,
-                    run_stage);
-         
+      if(current != channel ||
+        !run_down){
+       ags_audio_play(audio,
+                      recall_id,
+                      run_stage);
+      }
+      
       /* get some fields */
       pthread_mutex_lock(audio_mutex);
          
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/ags_notation.c 
new/gsequencer-1.4.18/ags/audio/ags_notation.c
--- old/gsequencer-1.4.15/ags/audio/ags_notation.c      2018-01-26 
03:21:40.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/ags_notation.c      2018-02-02 
22:39:30.000000000 +0100
@@ -1913,13 +1913,13 @@
   
   if(!xmlStrncmp("0.3.12", version, 7)){
     ags_notation_insert_native_piano_from_clipboard_version_0_3_12();
-  }else if(!xmlStrncmp("0.4.2", version, 7)){
+  }else if(!xmlStrncmp("0.4.2", version, 6)){
     /* changes contain only for UI relevant new informations */
     ags_notation_insert_native_piano_from_clipboard_version_0_3_12();
-  }else if(!xmlStrncmp("1.2.0", version, 7)){
+  }else if(!xmlStrncmp("1.2.0", version, 6)){
     /* changes contain only optional informations */
     match_timestamp = TRUE;
-    
+
     if(match_channel &&
        notation->audio_channel != g_ascii_strtoull(xmlGetProp(root_node,
                                                              "audio-channel"),
@@ -1927,7 +1927,7 @@
                                                   10)){
       return;
     }
-    
+        
     ags_notation_insert_native_piano_from_clipboard_version_0_3_12();
   }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/ags_recall.c 
new/gsequencer-1.4.18/ags/audio/ags_recall.c
--- old/gsequencer-1.4.15/ags/audio/ags_recall.c        2018-01-19 
16:12:03.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/ags_recall.c        2018-02-02 
22:24:33.000000000 +0100
@@ -2017,9 +2017,9 @@
   if((AGS_RECALL_DONE & (recall->flags)) != 0){
     return;
   }
-  
-  recall->flags |= AGS_RECALL_DONE;
 
+  recall->flags |= AGS_RECALL_DONE;
+  
   ags_recall_remove(recall);
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/ags_recall_dssi_run.c 
new/gsequencer-1.4.18/ags/audio/ags_recall_dssi_run.c
--- old/gsequencer-1.4.15/ags/audio/ags_recall_dssi_run.c       2018-01-19 
16:12:03.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/ags_recall_dssi_run.c       2018-01-31 
18:13:52.000000000 +0100
@@ -220,21 +220,6 @@
 
   free(recall_dssi_run->ladspa_handle);
 
-  if(recall_dssi_run->route_dssi_audio_run != NULL){
-    GList *note;
-
-    note = recall_dssi_run->note;
-
-    while(note != NULL){
-      //FIXME:JK: ref counting
-      
AGS_ROUTE_DSSI_AUDIO_RUN(recall_dssi_run->route_dssi_audio_run)->feed_midi = 
g_list_remove(AGS_ROUTE_DSSI_AUDIO_RUN(recall_dssi_run->route_dssi_audio_run)->feed_midi,
-                                                                               
                 note->data);
-      g_object_unref(note->data);
-
-      note = note->next;
-    }
-  }
-
   g_list_free_full(recall_dssi_run->note,
                   g_object_unref);
   
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/ags_recall_lv2_run.c 
new/gsequencer-1.4.18/ags/audio/ags_recall_lv2_run.c
--- old/gsequencer-1.4.15/ags/audio/ags_recall_lv2_run.c        2018-01-19 
16:12:03.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/ags_recall_lv2_run.c        2018-01-31 
18:13:52.000000000 +0100
@@ -203,21 +203,6 @@
     free(recall_lv2_run->input);
   }
 
-  if(recall_lv2_run->route_lv2_audio_run != NULL){
-    GList *note;
-
-    note = recall_lv2_run->note;
-    
-    while(note != NULL){
-      //FIXME:JK: ref counting
-      AGS_ROUTE_LV2_AUDIO_RUN(recall_lv2_run->route_lv2_audio_run)->feed_midi 
= 
g_list_remove(AGS_ROUTE_LV2_AUDIO_RUN(recall_lv2_run->route_lv2_audio_run)->feed_midi,
-                                                                               
              note->data);
-      g_object_unref(note->data);
-      
-      note = note->next;
-    }
-  }
-
   g_list_free_full(recall_lv2_run->note,
                   g_object_unref);
     
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/recall/ags_copy_audio_signal.c 
new/gsequencer-1.4.18/ags/audio/recall/ags_copy_audio_signal.c
--- old/gsequencer-1.4.15/ags/audio/recall/ags_copy_audio_signal.c      
2018-01-19 16:12:03.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/recall/ags_copy_audio_signal.c      
2018-02-02 14:05:47.000000000 +0100
@@ -384,7 +384,8 @@
   stream_destination = destination->stream_current;
   //  attack = AGS_RECALL_AUDIO_SIGNAL(copy_audio_signal)->attack;
 
-  if(stream_destination->next == NULL){
+  if(!recall->rt_safe &&
+     stream_destination->next == NULL){
     ags_audio_signal_add_stream(destination);
   }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/recall/ags_play_audio_signal.c 
new/gsequencer-1.4.18/ags/audio/recall/ags_play_audio_signal.c
--- old/gsequencer-1.4.15/ags/audio/recall/ags_play_audio_signal.c      
2017-11-06 00:08:57.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/recall/ags_play_audio_signal.c      
2018-02-02 14:05:47.000000000 +0100
@@ -19,11 +19,7 @@
 
 #include <ags/audio/recall/ags_play_audio_signal.h>
 
-#include <ags/object/ags_connectable.h>
-#include <ags/object/ags_dynamic_connectable.h>
-#include <ags/object/ags_soundcard.h>
-
-#include <ags/thread/ags_mutex_manager.h>
+#include <ags/libags.h>
 
 #include <ags/audio/ags_audio_signal.h>
 #include <ags/audio/ags_recycling.h>
@@ -215,15 +211,19 @@
 void
 ags_play_audio_signal_run_inter(AgsRecall *recall)
 {
-  GObject *soundcard;
-  AgsRecycling *recycling;
-  AgsAudioSignal *source;
   AgsRecallChannelRun *play_channel_run;
   AgsPlayChannel *play_channel;
   AgsPlayAudioSignal *play_audio_signal;
+
+  AgsRecycling *recycling;
+  AgsAudioSignal *source;
+  AgsAudioSignal *template;
   
   AgsMutexManager *mutex_manager;
 
+  GObject *soundcard;
+
+  GList *note;
   GList *stream;
 
   void *buffer_source;
@@ -247,17 +247,28 @@
   play_audio_signal = AGS_PLAY_AUDIO_SIGNAL(recall);
 
   soundcard = recall->soundcard;
-  source = 
AGS_AUDIO_SIGNAL(AGS_RECALL_AUDIO_SIGNAL(play_audio_signal)->source);
-  stream = source->stream_current;
 
   if(soundcard == NULL){
     g_warning("no soundcard");
     return;
   }
-  
+
+  source = 
AGS_AUDIO_SIGNAL(AGS_RECALL_AUDIO_SIGNAL(play_audio_signal)->source);
+
   mutex_manager = ags_mutex_manager_get_instance();
   application_mutex = ags_mutex_manager_get_application_mutex(mutex_manager);
 
+  /* lookup recycling mutex */
+  recycling = source->recycling;
+
+  pthread_mutex_lock(application_mutex);
+
+  recycling_mutex = ags_mutex_manager_lookup(mutex_manager,
+                                            (GObject *) recycling);
+       
+  pthread_mutex_unlock(application_mutex);
+
+  /* lookup soundcard mutex */
   pthread_mutex_lock(application_mutex);
 
   soundcard_mutex = ags_mutex_manager_lookup(mutex_manager,
@@ -267,24 +278,13 @@
 
   pthread_mutex_lock(soundcard_mutex);
 
+  /* get presets */
   ags_soundcard_get_presets(AGS_SOUNDCARD(soundcard),
                            &pcm_channels,
                            &samplerate,
                            &soundcard_buffer_size,
                            &soundcard_format);
   
-  if(stream == NULL){
-    pthread_mutex_unlock(soundcard_mutex);
-
-    ags_recall_done(recall);
-  
-    ags_recycling_remove_audio_signal(source->recycling,
-                                     source);
-    g_object_unref(source);
-
-    return;
-  }
-
   buffer0 = ags_soundcard_get_buffer(AGS_SOUNDCARD(soundcard)); // 
ags_soundcard_get_next_buffer(AGS_SOUNDCARD(soundcard));
   buffer1 = NULL;
   
@@ -329,54 +329,105 @@
   buffer_size = source->buffer_size;
   copy_mode = 
ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(soundcard_format),
                                                  
ags_audio_buffer_util_format_from_soundcard(source->format));
+  
+  if(source->rt_template != NULL){
+    /* get template */
+    template = source->rt_template;
+    
+    note = source->note;
+    
+    while(note != NULL){
+      AgsNote *current;
+      
+      guint rt_attack;
+      guint64 offset;
+      
+      current = note->data;
+      offset = current->rt_offset;
 
-  /* check if resample */
-  buffer_source = stream->data;
-  resample = FALSE;
-
-  if(source->samplerate != samplerate){
-    buffer_source = ags_audio_buffer_util_resample(buffer_source, 1,
-                                                  
ags_audio_buffer_util_format_from_soundcard(source->format), source->samplerate,
-                                                  buffer_size,
-                                                  samplerate);
+      pthread_mutex_lock(recycling_mutex);
       
-    resample = TRUE;
-  }
-  
-  if((AGS_RECALL_INITIAL_RUN & (AGS_RECALL_AUDIO_SIGNAL(recall)->flags)) != 0){
-    ags_audio_buffer_util_copy_buffer_to_buffer(buffer0, pcm_channels, 
audio_channel + source->attack * pcm_channels,
-                                               buffer_source, 1, 0,
-                                               soundcard_buffer_size - 
source->attack, copy_mode);
-  }else{
-    if(source->attack != 0 && stream->prev != NULL){
-      void *buffer_source_prev;
-       
-      buffer_source_prev = stream->prev->data;
+      rt_attack = current->rt_attack;
+      
+      pthread_mutex_unlock(recycling_mutex);
 
-      if(resample){
-       buffer_source_prev = ags_audio_buffer_util_resample(buffer_source_prev, 
1,
-                                                           
ags_audio_buffer_util_format_from_soundcard(source->format), source->samplerate,
-                                                           source->length,
-                                                           samplerate);
+      stream = source->stream_beginning;
+      
+      if(stream == NULL){
+       note = note->next;
 
+       continue;
       }
        
       ags_audio_buffer_util_copy_buffer_to_buffer(buffer0, pcm_channels, 
audio_channel,
-                                                 buffer_source_prev, 1, 
soundcard_buffer_size - source->attack,
-                                                 source->attack, copy_mode);
+                                                 stream->data, 1, 0,
+                                                 buffer_size, copy_mode);      
  
+      
+      note = note->next;
+    }
+  }else{
+    stream = source->stream_current;
 
-      if(resample){
-       free(buffer_source_prev);
-      }
+    if(stream == NULL){
+      pthread_mutex_unlock(soundcard_mutex);
+
+      ags_recall_done(recall);
+  
+      ags_recycling_remove_audio_signal(source->recycling,
+                                       source);
+      g_object_unref(source);
+      
+      return;
     }
+    
+    /* check if resample */
+    buffer_source = stream->data;
+    resample = FALSE;
+
+    if(source->samplerate != samplerate){
+      buffer_source = ags_audio_buffer_util_resample(buffer_source, 1,
+                                                    
ags_audio_buffer_util_format_from_soundcard(source->format), source->samplerate,
+                                                    buffer_size,
+                                                    samplerate);
+      
+      resample = TRUE;
+    }
+    
+    if((AGS_RECALL_INITIAL_RUN & (AGS_RECALL_AUDIO_SIGNAL(recall)->flags)) != 
0){
+      ags_audio_buffer_util_copy_buffer_to_buffer(buffer0, pcm_channels, 
audio_channel + source->attack * pcm_channels,
+                                                 buffer_source, 1, 0,
+                                                 soundcard_buffer_size - 
source->attack, copy_mode);
+    }else{
+      if(source->attack != 0 && stream->prev != NULL){
+       void *buffer_source_prev;
+       
+       buffer_source_prev = stream->prev->data;
 
-    ags_audio_buffer_util_copy_buffer_to_buffer(buffer0, pcm_channels, 
audio_channel + source->attack * pcm_channels,
-                                               buffer_source, 1, 0,
-                                               soundcard_buffer_size - 
source->attack, copy_mode);
-  }
+       if(resample){
+         buffer_source_prev = 
ags_audio_buffer_util_resample(buffer_source_prev, 1,
+                                                             
ags_audio_buffer_util_format_from_soundcard(source->format), source->samplerate,
+                                                             source->length,
+                                                             samplerate);
+
+       }
+       
+       ags_audio_buffer_util_copy_buffer_to_buffer(buffer0, pcm_channels, 
audio_channel,
+                                                   buffer_source_prev, 1, 
soundcard_buffer_size - source->attack,
+                                                   source->attack, copy_mode);
+
+       if(resample){
+         free(buffer_source_prev);
+       }
+      }
 
-  if(resample){
-    free(buffer_source);
+      ags_audio_buffer_util_copy_buffer_to_buffer(buffer0, pcm_channels, 
audio_channel + source->attack * pcm_channels,
+                                                 buffer_source, 1, 0,
+                                                 soundcard_buffer_size - 
source->attack, copy_mode);
+    }
+  
+    if(resample){
+      free(buffer_source);
+    }
   }
 
   pthread_mutex_unlock(soundcard_mutex);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/recall/ags_play_channel_run.c 
new/gsequencer-1.4.18/ags/audio/recall/ags_play_channel_run.c
--- old/gsequencer-1.4.15/ags/audio/recall/ags_play_channel_run.c       
2017-11-06 00:08:57.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/recall/ags_play_channel_run.c       
2018-02-02 14:05:47.000000000 +0100
@@ -19,14 +19,7 @@
 
 #include <ags/audio/recall/ags_play_channel_run.h>
 
-#include <ags/object/ags_application_context.h>
-#include <ags/object/ags_connectable.h>
-#include <ags/object/ags_dynamic_connectable.h>
-#include <ags/object/ags_plugin.h>
-#include <ags/object/ags_soundcard.h>
-
-#include <ags/thread/ags_mutex_manager.h>
-#include <ags/thread/ags_task_thread.h>
+#include <ags/libags.h>
 
 #include <ags/audio/ags_audio.h>
 #include <ags/audio/ags_recycling.h>
@@ -40,8 +33,13 @@
 #include <ags/audio/recall/ags_play_recycling.h>
 #include <ags/audio/recall/ags_play_audio_signal.h>
 #include <ags/audio/recall/ags_stream_channel.h>
+#include <ags/audio/recall/ags_stream_channel_run.h>
 #include <ags/audio/recall/ags_stream_recycling.h>
 #include <ags/audio/recall/ags_stream_audio_signal.h>
+#include <ags/audio/recall/ags_rt_stream_channel.h>
+#include <ags/audio/recall/ags_rt_stream_channel_run.h>
+#include <ags/audio/recall/ags_rt_stream_recycling.h>
+#include <ags/audio/recall/ags_rt_stream_audio_signal.h>
 
 #include <ags/audio/task/ags_cancel_channel.h>
 
@@ -422,48 +420,88 @@
 ags_play_channel_run_run_post(AgsRecall *recall)
 {
   AgsStreamChannelRun *stream_channel_run;
+  AgsRtStreamChannelRun *rt_stream_channel_run;
+
   AgsChannel *source;
+  
   GList *list;
   GList *recall_recycling_list, *recall_audio_signal_list;
+
   gboolean found;
   
   AGS_RECALL_CLASS(ags_play_channel_run_parent_class)->run_post(recall);
 
-  /* connect done */
   source = AGS_RECALL_CHANNEL_RUN(recall)->source;
   found = FALSE;
 
-  list = source->play;
+  if(recall->rt_safe){
+    /* connect done */
+    list = source->play;
+
+    while((list = ags_recall_find_type_with_recycling_context(list,
+                                                             
AGS_TYPE_RT_STREAM_CHANNEL_RUN,
+                                                             (GObject *) 
recall->recall_id->recycling_context)) != NULL){
+      rt_stream_channel_run = AGS_RT_STREAM_CHANNEL_RUN(list->data);
 
-  while((list = ags_recall_find_type_with_recycling_context(list,
-                                                           
AGS_TYPE_STREAM_CHANNEL_RUN,
-                                                           (GObject *) 
recall->recall_id->recycling_context)) != NULL){
-    stream_channel_run = AGS_STREAM_CHANNEL_RUN(list->data);
+      if((AGS_RECALL_TEMPLATE & (AGS_RECALL(rt_stream_channel_run)->flags)) != 
0){
+       list = list->next;
 
-    if((AGS_RECALL_TEMPLATE & (AGS_RECALL(stream_channel_run)->flags)) != 0){
-      list = list->next;
+       continue;
+      }
+    
+      recall_recycling_list = AGS_RECALL(rt_stream_channel_run)->children;
+
+      while(recall_recycling_list != NULL){
+       recall_audio_signal_list = 
AGS_RECALL(recall_recycling_list->data)->children;
+      
+       while(recall_audio_signal_list != NULL &&
+             (AGS_RECALL_DONE & 
(AGS_RECALL(recall_audio_signal_list->data)->flags)) == 0 &&
+             (AGS_RECALL_TEMPLATE & 
(AGS_RECALL(recall_audio_signal_list->data)->flags)) == 0){
+         found = TRUE;
+         break;
+       
+         recall_audio_signal_list = recall_audio_signal_list->next;
+       }
+
+       recall_recycling_list = recall_recycling_list->next;
+      }
 
-      continue;
+      list = list->next;
     }
+  }else{
+    /* connect done */
+    list = source->play;
+
+    while((list = ags_recall_find_type_with_recycling_context(list,
+                                                             
AGS_TYPE_STREAM_CHANNEL_RUN,
+                                                             (GObject *) 
recall->recall_id->recycling_context)) != NULL){
+      stream_channel_run = AGS_STREAM_CHANNEL_RUN(list->data);
+
+      if((AGS_RECALL_TEMPLATE & (AGS_RECALL(stream_channel_run)->flags)) != 0){
+       list = list->next;
+
+       continue;
+      }
     
-    recall_recycling_list = AGS_RECALL(stream_channel_run)->children;
+      recall_recycling_list = AGS_RECALL(stream_channel_run)->children;
 
-    while(recall_recycling_list != NULL){
-      recall_audio_signal_list = 
AGS_RECALL(recall_recycling_list->data)->children;
+      while(recall_recycling_list != NULL){
+       recall_audio_signal_list = 
AGS_RECALL(recall_recycling_list->data)->children;
       
-      while(recall_audio_signal_list != NULL &&
-           (AGS_RECALL_DONE & 
(AGS_RECALL(recall_audio_signal_list->data)->flags)) == 0 &&
-           (AGS_RECALL_TEMPLATE & 
(AGS_RECALL(recall_audio_signal_list->data)->flags)) == 0){
-       found = TRUE;
-       break;
+       while(recall_audio_signal_list != NULL &&
+             (AGS_RECALL_DONE & 
(AGS_RECALL(recall_audio_signal_list->data)->flags)) == 0 &&
+             (AGS_RECALL_TEMPLATE & 
(AGS_RECALL(recall_audio_signal_list->data)->flags)) == 0){
+         found = TRUE;
+         break;
        
-       recall_audio_signal_list = recall_audio_signal_list->next;
+         recall_audio_signal_list = recall_audio_signal_list->next;
+       }
+
+       recall_recycling_list = recall_recycling_list->next;
       }
 
-      recall_recycling_list = recall_recycling_list->next;
+      list = list->next;
     }
-
-    list = list->next;
   }
   
   if(!found){
@@ -567,7 +605,7 @@
   if(channel == NULL){
     return;
   }
-  
+
   soundcard = AGS_AUDIO(channel->audio)->soundcard;
 
   mutex_manager = ags_mutex_manager_get_instance();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/recall/ags_route_dssi_audio_run.c 
new/gsequencer-1.4.18/ags/audio/recall/ags_route_dssi_audio_run.c
--- old/gsequencer-1.4.15/ags/audio/recall/ags_route_dssi_audio_run.c   
2018-01-19 16:12:03.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/recall/ags_route_dssi_audio_run.c   
2018-01-31 18:13:52.000000000 +0100
@@ -422,6 +422,12 @@
     route_dssi_audio_run->count_beats_audio_run = NULL;
   }
 
+  /* feed midi */
+  g_list_free_full(route_dssi_audio_run->feed_midi,
+                  g_object_unref);
+
+  route_dssi_audio_run->feed_midi = NULL;
+
   /* call parent */
   G_OBJECT_CLASS(ags_route_dssi_audio_run_parent_class)->dispose(gobject);
 }
@@ -448,6 +454,9 @@
     g_object_unref(G_OBJECT(route_dssi_audio_run->timestamp));
   }
 
+  g_list_free_full(route_dssi_audio_run->feed_midi,
+                  g_object_unref);  
+
   /* call parent */
   G_OBJECT_CLASS(ags_route_dssi_audio_run_parent_class)->finalize(gobject);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/recall/ags_route_lv2_audio_run.c 
new/gsequencer-1.4.18/ags/audio/recall/ags_route_lv2_audio_run.c
--- old/gsequencer-1.4.15/ags/audio/recall/ags_route_lv2_audio_run.c    
2018-01-19 16:12:03.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/recall/ags_route_lv2_audio_run.c    
2018-01-31 18:13:52.000000000 +0100
@@ -418,6 +418,12 @@
     route_lv2_audio_run->count_beats_audio_run = NULL;
   }
 
+  /* feed midi */
+  g_list_free_full(route_lv2_audio_run->feed_midi,
+                  g_object_unref);
+
+  route_lv2_audio_run->feed_midi = NULL;
+  
   /* call parent */
   G_OBJECT_CLASS(ags_route_lv2_audio_run_parent_class)->dispose(gobject);
 }
@@ -427,6 +433,8 @@
 {
   AgsRouteLv2AudioRun *route_lv2_audio_run;
 
+  GList *note;
+
   route_lv2_audio_run = AGS_ROUTE_LV2_AUDIO_RUN(gobject);
 
   /* delay audio run */
@@ -444,6 +452,9 @@
     g_object_unref(G_OBJECT(route_lv2_audio_run->timestamp));
   }
 
+  g_list_free_full(route_lv2_audio_run->feed_midi,
+                  g_object_unref);
+  
   /* call parent */
   G_OBJECT_CLASS(ags_route_lv2_audio_run_parent_class)->finalize(gobject);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/recall/ags_rt_stream_audio_signal.c 
new/gsequencer-1.4.18/ags/audio/recall/ags_rt_stream_audio_signal.c
--- old/gsequencer-1.4.15/ags/audio/recall/ags_rt_stream_audio_signal.c 
2018-01-25 23:18:29.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/recall/ags_rt_stream_audio_signal.c 
2018-02-02 14:05:47.000000000 +0100
@@ -297,7 +297,11 @@
 
   /* get template */
   template = source->rt_template;
-    
+
+  if(template == NULL){
+    return;
+  }
+  
   note = source->note;
   
   ags_audio_buffer_util_clear_buffer(buffer, 1,
@@ -326,9 +330,9 @@
     rt_attack = current->rt_attack;
     
     pthread_mutex_unlock(recycling_mutex);
-    
-    if(offset < delay * x1 ||
-       offset < template->length){
+
+    if(offset < template->length ||
+       offset < delay * x1){
       if(template->loop_start < template->loop_end){
        guint frame_count;
        guint loop_length;
@@ -464,7 +468,7 @@
        
       }else{
        template_stream = g_list_nth(template->stream_beginning,
-                           offset);
+                                    offset);
 
        if(template_stream == NULL){
          note = note->next;
@@ -491,6 +495,11 @@
     }else{
       ags_audio_signal_remove_note(source,
                                   current);
+
+      if(source->note == NULL &&
+        recall->recall_id->recycling_context->parent == NULL){
+       ags_recall_done(recall);
+      }
     }
 
     pthread_mutex_lock(recycling_mutex);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/recall/ags_rt_stream_channel_run.c 
new/gsequencer-1.4.18/ags/audio/recall/ags_rt_stream_channel_run.c
--- old/gsequencer-1.4.15/ags/audio/recall/ags_rt_stream_channel_run.c  
2018-01-25 23:18:29.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/recall/ags_rt_stream_channel_run.c  
2018-02-02 14:05:47.000000000 +0100
@@ -258,7 +258,7 @@
   
   first_recycling = source->first_recycling;
   last_recycling = source->last_recycling;
-
+  
   pthread_mutex_unlock(source_mutex);
 
   /* lookup mutex */
@@ -313,7 +313,7 @@
                 "rt-template", rt_template,
                 NULL);
     ags_audio_signal_stream_resize(audio_signal,
-                                  1);
+                                  3);
     audio_signal->stream_current = audio_signal->stream_beginning;
     
     pthread_mutex_unlock(recycling_mutex);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/task/ags_append_channel.c 
new/gsequencer-1.4.18/ags/audio/task/ags_append_channel.c
--- old/gsequencer-1.4.15/ags/audio/task/ags_append_channel.c   2017-12-21 
01:30:44.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/task/ags_append_channel.c   2018-02-02 
14:05:47.000000000 +0100
@@ -332,7 +332,7 @@
   AgsAppendChannel *append_channel;
 
   AgsAudioLoop *audio_loop;
-  AgsAudioLoop *channel_thread;
+  AgsChannelThread *channel_thread;
 
   AgsServer *server;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/task/ags_init_channel.c 
new/gsequencer-1.4.18/ags/audio/task/ags_init_channel.c
--- old/gsequencer-1.4.15/ags/audio/task/ags_init_channel.c     2018-01-19 
16:12:03.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/task/ags_init_channel.c     2018-02-02 
14:05:47.000000000 +0100
@@ -516,7 +516,7 @@
            /* recursive play init */
            nth_domain = 0;
            init_playback = TRUE;
-           
+
            g_atomic_int_or(&(playback->flags),
                            AGS_PLAYBACK_PLAYBACK);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/task/ags_start_soundcard.c 
new/gsequencer-1.4.18/ags/audio/task/ags_start_soundcard.c
--- old/gsequencer-1.4.15/ags/audio/task/ags_start_soundcard.c  2017-12-21 
01:30:44.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/task/ags_start_soundcard.c  2018-02-02 
14:05:47.000000000 +0100
@@ -287,7 +287,8 @@
   AgsThread *main_loop;
 
   AgsApplicationContext *application_context;
-  AgsSoundcard *soundcard;
+
+  GObject *soundcard;
 
   GList *start_queue;
 
@@ -324,23 +325,31 @@
   while((soundcard_thread = ags_thread_find_type(soundcard_thread,
                                                 AGS_TYPE_SOUNDCARD_THREAD)) != 
NULL){
     if((AGS_THREAD_RUNNING & (g_atomic_int_get(&(soundcard_thread->flags)))) 
== 0){
-      /* append to AgsSoundcard */
-      AGS_SOUNDCARD_THREAD(soundcard_thread)->error = NULL;
+      soundcard = AGS_SOUNDCARD_THREAD(soundcard_thread)->soundcard;
 
-      g_message("start soundcard");
-
-      start_queue = NULL;    
-      start_queue = g_list_prepend(start_queue,
-                                  soundcard_thread);
-
-      if(start_queue != NULL){
-       if(g_atomic_pointer_get(&(AGS_THREAD(main_loop)->start_queue)) != NULL){
-         g_atomic_pointer_set(&(AGS_THREAD(main_loop)->start_queue),
-                              g_list_concat(start_queue,
-                                            
g_atomic_pointer_get(&(AGS_THREAD(main_loop)->start_queue))));
-       }else{
-         g_atomic_pointer_set(&(AGS_THREAD(main_loop)->start_queue),
-                              start_queue);
+      /* append to AgsSoundcard */
+      if(!ags_soundcard_is_playing(AGS_SOUNDCARD(soundcard)) &&
+        ags_soundcard_get_buffer(AGS_SOUNDCARD(soundcard)) == NULL){
+       AGS_SOUNDCARD_THREAD(soundcard_thread)->error = NULL;
+
+       g_message("start soundcard");
+
+       ags_soundcard_play_init(AGS_SOUNDCARD(soundcard),
+                               
&(AGS_SOUNDCARD_THREAD(soundcard_thread)->error));
+
+       start_queue = NULL;    
+       start_queue = g_list_prepend(start_queue,
+                                    soundcard_thread);
+
+       if(start_queue != NULL){
+         if(g_atomic_pointer_get(&(AGS_THREAD(main_loop)->start_queue)) != 
NULL){
+           g_atomic_pointer_set(&(AGS_THREAD(main_loop)->start_queue),
+                                g_list_concat(start_queue,
+                                              
g_atomic_pointer_get(&(AGS_THREAD(main_loop)->start_queue))));
+         }else{
+           g_atomic_pointer_set(&(AGS_THREAD(main_loop)->start_queue),
+                                start_queue);
+         }
        }
       }
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/thread/ags_audio_loop.c 
new/gsequencer-1.4.18/ags/audio/thread/ags_audio_loop.c
--- old/gsequencer-1.4.15/ags/audio/thread/ags_audio_loop.c     2018-01-19 
16:12:03.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/thread/ags_audio_loop.c     2018-02-02 
14:05:47.000000000 +0100
@@ -1184,8 +1184,6 @@
        remove_play = TRUE;
            
        for(stage = 0; stage < 3; stage++){
-
-
          if((AGS_PLAYBACK_PLAYBACK & (g_atomic_int_get(&(playback->flags)))) 
!= 0 &&
             playback->recall_id[0] != NULL){
            remove_play = FALSE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/audio/thread/ags_soundcard_thread.c 
new/gsequencer-1.4.18/ags/audio/thread/ags_soundcard_thread.c
--- old/gsequencer-1.4.15/ags/audio/thread/ags_soundcard_thread.c       
2017-11-06 00:08:58.000000000 +0100
+++ new/gsequencer-1.4.18/ags/audio/thread/ags_soundcard_thread.c       
2018-02-02 14:05:47.000000000 +0100
@@ -19,15 +19,7 @@
 
 #include <ags/audio/thread/ags_soundcard_thread.h>
 
-#include <ags/object/ags_application_context.h>
-#include <ags/object/ags_config.h>
-#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>
+#include <ags/libags.h>
 
 #include <ags/audio/ags_devout.h>
 
@@ -393,7 +385,7 @@
   AgsThread *main_loop;
   AgsPollingThread *polling_thread;
   
-  AgsSoundcard *soundcard;
+  GObject *soundcard;
 
   GList *poll_fd;
   
@@ -402,35 +394,18 @@
   soundcard_thread = AGS_SOUNDCARD_THREAD(thread);
   main_loop = ags_thread_get_toplevel(thread);
   
-  soundcard = AGS_SOUNDCARD(soundcard_thread->soundcard);
-
-  /* abort if already playing */
-  if(ags_soundcard_is_playing(soundcard)){
-    return;
-  }
+  soundcard = soundcard_thread->soundcard;
 
   /* disable timing */
   g_atomic_int_and(&(thread->flags),
                   (~AGS_THREAD_TIMING));
   
-  /* check if already initialized */
-  soundcard_thread->error = NULL;
-
-  if(ags_soundcard_get_buffer(soundcard) == NULL){
-    ags_soundcard_play_init(soundcard,
-                           &(soundcard_thread->error));
-
-#ifdef AGS_DEBUG
-    g_message("ags_devout_alsa_play");
-#endif
-  }
-
   /* find polling thread */
   polling_thread = (AgsPollingThread *) ags_thread_find_type(main_loop,
                                                             
AGS_TYPE_POLLING_THREAD);
     
   /* add poll fd and connect dispatch */
-  poll_fd = ags_soundcard_get_poll_fd(soundcard);
+  poll_fd = ags_soundcard_get_poll_fd(AGS_SOUNDCARD(soundcard));
     
   while(poll_fd != NULL){
     if(polling_thread != NULL){
@@ -463,7 +438,8 @@
   AgsSoundcardThread *soundcard_thread;
 
   AgsMutexManager *mutex_manager;
-  AgsSoundcard *soundcard;
+
+  GObject *soundcard;
 
   GList *poll_fd;
   
@@ -476,7 +452,7 @@
 
   soundcard_thread = AGS_SOUNDCARD_THREAD(thread);
 
-  soundcard = AGS_SOUNDCARD(soundcard_thread->soundcard);
+  soundcard = soundcard_thread->soundcard;
 
   /*  */
   mutex_manager = ags_mutex_manager_get_instance();
@@ -509,13 +485,13 @@
   /* playback */
   pthread_mutex_lock(mutex);
   
-  is_playing = ags_soundcard_is_playing(soundcard);
+  is_playing = ags_soundcard_is_playing(AGS_SOUNDCARD(soundcard));
 
   pthread_mutex_unlock(mutex);
   
   if(is_playing){
     error = NULL;
-    ags_soundcard_play(soundcard,
+    ags_soundcard_play(AGS_SOUNDCARD(soundcard),
                       &error);
 
     if(error != NULL){
@@ -535,20 +511,20 @@
   AgsThread *main_loop;
   AgsPollingThread *polling_thread;
   
-  AgsSoundcard *soundcard;
+  GObject *soundcard;
 
   GList *poll_fd;
     
   soundcard_thread = AGS_SOUNDCARD_THREAD(thread);
   main_loop = ags_thread_get_toplevel(thread);
 
-  soundcard = AGS_SOUNDCARD(soundcard_thread->soundcard);
+  soundcard = soundcard_thread->soundcard;
 
   /* stop thread and soundcard */
   AGS_THREAD_CLASS(ags_soundcard_thread_parent_class)->stop(thread);
 
   //FIXME:JK: is this safe?
-  ags_soundcard_stop(soundcard);
+  ags_soundcard_stop(AGS_SOUNDCARD(soundcard));
 
   g_atomic_int_or(&(thread->flags),
                  AGS_THREAD_TIMING);
@@ -558,7 +534,7 @@
                                                             
AGS_TYPE_POLLING_THREAD);
     
   /* remove poll fd */
-  poll_fd = ags_soundcard_get_poll_fd(soundcard);
+  poll_fd = ags_soundcard_get_poll_fd(AGS_SOUNDCARD(soundcard));
     
   while(poll_fd != NULL){
     if(polling_thread != NULL){
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/ags/plugin/ags_lv2_plugin.c 
new/gsequencer-1.4.18/ags/plugin/ags_lv2_plugin.c
--- old/gsequencer-1.4.15/ags/plugin/ags_lv2_plugin.c   2017-11-19 
21:14:37.000000000 +0100
+++ new/gsequencer-1.4.18/ags/plugin/ags_lv2_plugin.c   2018-02-02 
22:24:33.000000000 +0100
@@ -19,11 +19,7 @@
 
 #include <ags/plugin/ags_lv2_plugin.h>
 
-#include <ags/lib/ags_string_util.h>
-
-#include <ags/object/ags_soundcard.h>
-#include <ags/object/ags_config.h>
-#include <ags/object/ags_marshal.h>
+#include <ags/libags.h>
 
 #include <ags/plugin/ags_lv2_plugin.h>
 #include <ags/plugin/ags_lv2_manager.h>
@@ -772,14 +768,42 @@
                                                  LV2_ATOM__Int);
     options[2].value = ptr_buffer_size;
 
-    /* terminate */
+    /* bounded-block-length */
     options[3].context = LV2_OPTIONS_INSTANCE;
     options[3].subject = 0;
-    options[3].key = 0;
+    options[3].key = 
ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(),
+                                                
LV2_BUF_SIZE__boundedBlockLength);
+
+    ptr_buffer_size = (float *) malloc(sizeof(float));
+    ptr_buffer_size[0] = conf_buffer_size;
+
+    options[3].size = sizeof(float);
+    options[3].type = 
ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(),
+                                                 LV2_ATOM__Int);
+    options[3].value = ptr_buffer_size;
+
+    /* fixed-block-length */
+    options[4].context = LV2_OPTIONS_INSTANCE;
+    options[4].subject = 0;
+    options[4].key = 
ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(),
+                                                
LV2_BUF_SIZE__fixedBlockLength);
 
-    options[3].size = 0;
-    options[3].type = 0;
-    options[3].value = NULL;
+    ptr_buffer_size = (float *) malloc(sizeof(float));
+    ptr_buffer_size[0] = conf_buffer_size;
+
+    options[4].size = sizeof(float);
+    options[4].type = 
ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(),
+                                                 LV2_ATOM__Int);
+    options[4].value = ptr_buffer_size;
+    
+    /* terminate */
+    options[5].context = LV2_OPTIONS_INSTANCE;
+    options[5].subject = 0;
+    options[5].key = 0;
+    
+    options[5].size = 0;
+    options[5].type = 0;
+    options[5].value = NULL;
 
     /* set options */
     ags_lv2_option_manager_lv2_options_set(*lv2_handle,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/configure.ac new/gsequencer-1.4.18/configure.ac
--- old/gsequencer-1.4.15/configure.ac  2018-01-26 03:22:44.000000000 +0100
+++ new/gsequencer-1.4.18/configure.ac  2018-02-02 22:41:50.000000000 +0100
@@ -6,7 +6,7 @@
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ([2.69])
-AC_INIT([gsequencer],[1.4.15],[[email protected]])
+AC_INIT([gsequencer],[1.4.18],[[email protected]])
 AM_INIT_AUTOMAKE([subdir-objects])
 AC_CONFIG_SRCDIR([ags/config.h.in])
 AC_CONFIG_HEADERS([ags/config.h])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/gsequencer-1.4.15/po/POTFILES.in new/gsequencer-1.4.18/po/POTFILES.in
--- old/gsequencer-1.4.15/po/POTFILES.in        2018-01-19 16:12:04.000000000 
+0100
+++ new/gsequencer-1.4.18/po/POTFILES.in        2018-02-02 22:24:33.000000000 
+0100
@@ -117,7 +117,6 @@
 ./ags/X/editor/ags_file_selection_callbacks.c
 ./ags/X/editor/ags_inline_player.c
 ./ags/X/editor/ags_inline_player_callbacks.c
-./ags/X/editor/ags_level_callbacks.c
 ./ags/X/editor/ags_machine_radio_button.c
 ./ags/X/editor/ags_machine_radio_button_callbacks.c
 ./ags/X/editor/ags_machine_selection.c


Reply via email to