[SCM] gsequencer/master: fixed reference count
jkraehemann-guest at users.alioth.debian.org
jkraehemann-guest at users.alioth.debian.org
Fri Mar 17 11:32:33 UTC 2017
The following commit has been merged in the master branch:
commit 01597b9c9a05a8308f5daa4153967a586ec19ec8
Author: Joël Krähemann <jkraehemann-guest at users.alioth.debian.org>
Date: Fri Mar 17 00:24:09 2017 +0100
fixed reference count
diff --git a/debian/patches/fix-missing-dispose.diff b/debian/patches/fix-missing-dispose.diff
index bb4c78e..53bec93 100644
--- a/debian/patches/fix-missing-dispose.diff
+++ b/debian/patches/fix-missing-dispose.diff
@@ -1624,7 +1624,196 @@
}
void
-@@ -146,17 +217,295 @@
+@@ -108,9 +179,120 @@
+ void
+ ags_playback_init(AgsPlayback *playback)
+ {
++ AgsConfig *config;
++
++ gchar *str, *str0, *str1;
++
++ gdouble freq;
++ guint samplerate, buffer_size;
++ gboolean super_threaded_channel, super_threaded_recycling;
++
++ /* config */
++ config = ags_config_get_instance();
++
++ /* thread model */
++ str0 = ags_config_get_value(config,
++ AGS_CONFIG_THREAD,
++ "model\0");
++ str1 = ags_config_get_value(config,
++ AGS_CONFIG_THREAD,
++ "super-threaded-scope\0");
++
++ if(str0 != NULL && str1 != NULL){
++ if(!g_ascii_strncasecmp(str0,
++ "super-threaded\0",
++ 15)){
++ if(!g_ascii_strncasecmp(str1,
++ "channel\0",
++ 8)){
++ super_threaded_channel = TRUE;
++ }else if(!g_ascii_strncasecmp(str1,
++ "recycling\0",
++ 10)){
++ super_threaded_recycling = TRUE;
++ }
++ }
++ }
++
++ if(str0 != NULL){
++ free(str0);
++ }
++
++ if(str1 != NULL){
++ free(str1);
++ }
++
+ /* default flags */
+- g_atomic_int_set(&(playback->flags),
+- AGS_PLAYBACK_SUPER_THREADED_CHANNEL);
++ if(super_threaded_channel ||
++ super_threaded_recycling){
++ g_atomic_int_set(&(playback->flags),
++ AGS_PLAYBACK_SUPER_THREADED_CHANNEL);
++
++ if(super_threaded_recycling){
++ g_atomic_int_or(&(playback->flags),
++ AGS_PLAYBACK_SUPER_THREADED_RECYCLING);
++ }
++ }else{
++ g_atomic_int_set(&(playback->flags),
++ 0);
++ }
++
++ /* source */
++ playback->source = NULL;
++ playback->audio_channel = 0;
++
++ /* samplerate and buffer size */
++ samplerate = AGS_SOUNDCARD_DEFAULT_SAMPLERATE;
++ buffer_size = AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE;
++
++ /* samplerate */
++ str = ags_config_get_value(config,
++ AGS_CONFIG_SOUNDCARD,
++ "samplerate\0");
++
++ if(str == NULL){
++ str = ags_config_get_value(config,
++ AGS_CONFIG_SOUNDCARD_0,
++ "samplerate\0");
++ }
++
++ if(str != NULL){
++ samplerate = g_ascii_strtoull(str,
++ NULL,
++ 10);
++
++ free(str);
++ }
++
++ /* buffer size */
++ str = ags_config_get_value(config,
++ AGS_CONFIG_SOUNDCARD,
++ "buffer-size\0");
++
++ if(str == NULL){
++ str = ags_config_get_value(config,
++ AGS_CONFIG_SOUNDCARD_0,
++ "buffer-size\0");
++ }
++
++ if(str != NULL){
++ buffer_size = g_ascii_strtoull(str,
++ NULL,
++ 10);
++
++ free(str);
++ }
++
++ /* playback domain */
++ playback->playback_domain = NULL;
++
++ /* source and audio channel */
++ playback->source = NULL;
++
++ playback->audio_channel = 0;
++
++ /* thread frequency */
++ freq = ceil((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK;
+
+ /* super threaded channel */
+ playback->channel_thread = (AgsThread **) malloc(3 * sizeof(AgsThread *));
+@@ -119,13 +301,34 @@
+ playback->channel_thread[1] = NULL;
+ playback->channel_thread[2] = NULL;
+
++ if(super_threaded_channel ||
++ super_threaded_recycling){
++ playback->channel_thread[0] = (AgsThread *) ags_channel_thread_new(NULL,
++ NULL);
++ playback->channel_thread[0]->freq = freq;
++
++ playback->channel_thread[1] = (AgsThread *) ags_channel_thread_new(NULL,
++ NULL);
++ playback->channel_thread[1]->freq = freq;
++
++ playback->channel_thread[2] = (AgsThread *) ags_channel_thread_new(NULL,
++ NULL);
++ playback->channel_thread[2]->freq = freq;
++ }
++
+ /* iterator thread */
+ playback->iterator_thread = (AgsIteratorThread **) malloc(3 * sizeof(AgsIteratorThread *));
+
+- playback->iterator_thread[0] = ags_iterator_thread_new();
+- playback->iterator_thread[1] = ags_iterator_thread_new();
+- playback->iterator_thread[2] = ags_iterator_thread_new();
+-
++ playback->iterator_thread[0] = NULL;
++ playback->iterator_thread[1] = NULL;
++ playback->iterator_thread[2] = NULL;
++
++ if(super_threaded_recycling){
++ playback->iterator_thread[0] = ags_iterator_thread_new();
++ playback->iterator_thread[1] = ags_iterator_thread_new();
++ playback->iterator_thread[2] = ags_iterator_thread_new();
++ }
++
+ /* super threaded recycling */
+ playback->recycling_thread = (AgsThread **) malloc(3 * sizeof(AgsThread *));
+
+@@ -133,11 +336,21 @@
+ playback->recycling_thread[1] = NULL;
+ playback->recycling_thread[2] = NULL;
+
+- /* */
+- playback->source = NULL;
+- playback->audio_channel = 0;
+-
+- /* */
++ if(super_threaded_recycling){
++ playback->recycling_thread[0] = (AgsThread *) ags_recycling_thread_new(NULL,
++ NULL);
++ playback->recycling_thread[0]->freq = freq;
++
++ playback->recycling_thread[1] = (AgsThread *) ags_recycling_thread_new(NULL,
++ NULL);
++ playback->recycling_thread[1]->freq = freq;
++
++ playback->recycling_thread[2] = (AgsThread *) ags_recycling_thread_new(NULL,
++ NULL);
++ playback->recycling_thread[2]->freq = freq;
++ }
++
++ /* recall id */
+ playback->recall_id = (AgsRecallID **) malloc(3 * sizeof(AgsRecallID *));
+
+ playback->recall_id[0] = NULL;
+@@ -146,17 +359,295 @@
}
void
@@ -1924,7 +2113,7 @@
/* call parent */
G_OBJECT_CLASS(ags_playback_parent_class)->finalize(gobject);
-@@ -165,13 +514,250 @@
+@@ -165,13 +656,250 @@
void
ags_playback_connect(AgsConnectable *connectable)
{
@@ -6835,15 +7024,20 @@
param_spec = g_param_spec_object("peak\0",
"peak of channel\0",
"The peak of channel\0",
-@@ -191,6 +200,7 @@
- peak_channel->peak->port_value.ags_port_double = FALSE;
+@@ -188,9 +197,11 @@
+ "port-value-size\0", sizeof(gdouble),
+ "port-value-length\0", 1,
+ NULL);
+- peak_channel->peak->port_value.ags_port_double = FALSE;
++ g_object_ref(peak_channel->peak);
++ peak_channel->peak->port_value.ags_port_double = 0.0;
port = g_list_prepend(port, peak_channel->peak);
+ g_object_ref(peak_channel->peak);
/* set port */
AGS_RECALL(peak_channel)->port = port;
-@@ -257,12 +267,31 @@
+@@ -257,12 +268,31 @@
}
void
@@ -6875,12 +7069,12 @@
if(peak_channel->peak != NULL){
g_object_unref(G_OBJECT(peak_channel->peak));
}
-@@ -329,7 +358,7 @@
+@@ -329,7 +359,7 @@
guint i;
guint copy_mode;
- GValue value = {0,};
-+ GValue *value;
++ GValue value= {0,};
if(peak_channel == NULL){
return;
@@ -9397,3 +9591,201 @@
}
void
+--- a/ags/audio/ags_audio.c
++++ b/ags/audio/ags_audio.c
+@@ -958,59 +958,13 @@
+
+ /* playback domain */
+ audio->playback_domain = (GObject *) ags_playback_domain_new();
++ g_object_ref(audio->playback_domain);
++
+ AGS_PLAYBACK_DOMAIN(audio->playback_domain)->domain = (GObject *) audio;
+-
+- /* thread model */
+- str0 = ags_config_get_value(config,
+- AGS_CONFIG_THREAD,
+- "model\0");
+- str1 = ags_config_get_value(config,
+- AGS_CONFIG_THREAD,
+- "super-threaded-scope\0");
+-
+- if(str0 != NULL && str1 != NULL){
+- if(!g_ascii_strncasecmp(str0,
+- "super-threaded\0",
+- 15)){
+- if(!g_ascii_strncasecmp(str1,
+- "audio\0",
+- 6) ||
+- !g_ascii_strncasecmp(str1,
+- "channel\0",
+- 8) ||
+- !g_ascii_strncasecmp(str1,
+- "recycling\0",
+- 10)){
+- gdouble freq;
+-
+- freq = ceil((gdouble) audio->samplerate / (gdouble) audio->buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK;
+-
+- g_atomic_int_or(&(AGS_PLAYBACK_DOMAIN(audio->playback_domain)->flags),
+- AGS_PLAYBACK_DOMAIN_SUPER_THREADED_AUDIO);
+-
+- AGS_PLAYBACK_DOMAIN(audio->playback_domain)->audio_thread[0] = (AgsThread *) ags_audio_thread_new(NULL,
+- (GObject *) audio);
+- AGS_PLAYBACK_DOMAIN(audio->playback_domain)->audio_thread[0]->freq = freq;
+-
+- AGS_PLAYBACK_DOMAIN(audio->playback_domain)->audio_thread[1] = (AgsThread *) ags_audio_thread_new(NULL,
+- (GObject *) audio);
+- AGS_PLAYBACK_DOMAIN(audio->playback_domain)->audio_thread[1]->freq = freq;
+-
+- AGS_PLAYBACK_DOMAIN(audio->playback_domain)->audio_thread[2] = (AgsThread *) ags_audio_thread_new(NULL,
+- (GObject *) audio);
+- AGS_PLAYBACK_DOMAIN(audio->playback_domain)->audio_thread[2]->freq = freq;
+- }
+- }
+- }
++ g_object_set(audio->playback_domain,
++ "domain\0", audio,
++ NULL);
+
+- if(str0 != NULL){
+- free(str0);
+- }
+-
+- if(str1 != NULL){
+- free(str1);
+- }
+-
+ /* notation and automation */
+ audio->notation = NULL;
+ audio->automation = NULL;
+--- a/ags/audio/ags_channel.c
++++ b/ags/audio/ags_channel.c
+@@ -753,66 +753,10 @@
+
+ /* playback */
+ channel->playback = (GObject *) ags_playback_new();
+- AGS_PLAYBACK(channel->playback)->source = (GObject *) channel;
+-
+- /* thread model */
+- str0 = ags_config_get_value(config,
+- AGS_CONFIG_THREAD,
+- "model\0");
+- str1 = ags_config_get_value(config,
+- AGS_CONFIG_THREAD,
+- "super-threaded-scope\0");
+-
+- if(str0 != NULL && str1 != NULL){
+- if(!g_ascii_strncasecmp(str0,
+- "super-threaded\0",
+- 15)){
+- if(!g_ascii_strncasecmp(str1,
+- "channel\0",
+- 8) ||
+- !g_ascii_strncasecmp(str1,
+- "recycling\0",
+- 10)){
+- gdouble freq;
+-
+- freq = ceil((gdouble) channel->samplerate / (gdouble) channel->buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK;
+-
+- g_atomic_int_or(&(AGS_PLAYBACK(channel->playback)->flags),
+- AGS_PLAYBACK_SUPER_THREADED_CHANNEL);
+-
+- AGS_PLAYBACK(channel->playback)->channel_thread[0] = (AgsThread *) ags_channel_thread_new(NULL,
+- (GObject *) channel);
+- AGS_PLAYBACK(channel->playback)->channel_thread[0]->freq = freq;
+-
+- AGS_PLAYBACK(channel->playback)->channel_thread[1] = (AgsThread *) ags_channel_thread_new(NULL,
+- (GObject *) channel);
+- AGS_PLAYBACK(channel->playback)->channel_thread[1]->freq = freq;
+-
+- AGS_PLAYBACK(channel->playback)->channel_thread[2] = (AgsThread *) ags_channel_thread_new(NULL,
+- (GObject *) channel);
+- AGS_PLAYBACK(channel->playback)->channel_thread[2]->freq = freq;
+-
+- if(!g_ascii_strncasecmp(str1,
+- "recycling\0",
+- 10)){
+- AGS_PLAYBACK(channel->playback)->recycling_thread[0] = (AgsThread *) ags_recycling_thread_new(NULL,
+- NULL);
+- AGS_PLAYBACK(channel->playback)->recycling_thread[1] = (AgsThread *) ags_recycling_thread_new(NULL,
+- NULL);
+- AGS_PLAYBACK(channel->playback)->recycling_thread[2] = (AgsThread *) ags_recycling_thread_new(NULL,
+- NULL);
+- }
+- }
+- }
+- }
+-
+- if(str0 != NULL){
+- free(str0);
+- }
+-
+- if(str1 != NULL){
+- free(str1);
+- }
++ g_object_ref(channel->playback);
++ g_object_set(channel->playback,
++ "source\0", channel,
++ NULL);
+
+ channel->recall_id = NULL;
+ channel->container = NULL;
+--- a/ags/audio/recall/ags_count_beats_audio_run.c
++++ b/ags/audio/recall/ags_count_beats_audio_run.c
+@@ -1031,10 +1031,13 @@
+ void
+ ags_count_beats_audio_run_done(AgsRecall *recall)
+ {
++ AgsAudio *audio;
++ AgsRecallID *recall_id;
+ GObject *soundcard;
+
+ AgsCountBeatsAudio *count_beats_audio;
+ AgsCountBeatsAudioRun *count_beats_audio_run;
++ AgsDelayAudioRun *delay_audio_run;
+
+ AgsCancelAudio *cancel_audio;
+
+@@ -1049,11 +1052,14 @@
+ pthread_mutex_t *application_mutex;
+ pthread_mutex_t *soundcard_mutex;
+
+- AGS_RECALL_CLASS(ags_count_beats_audio_run_parent_class)->done(recall);
+-
+ count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(recall);
+ count_beats_audio = AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(count_beats_audio_run)->recall_audio);
+
++ delay_audio_run = count_beats_audio_run->delay_audio_run;
++
++ audio = AGS_RECALL_AUDIO(count_beats_audio)->audio;
++ recall_id = AGS_RECALL(count_beats_audio_run)->recall_id;
++
+ soundcard = AGS_RECALL_AUDIO(count_beats_audio)->audio->soundcard;
+
+ mutex_manager = ags_mutex_manager_get_instance();
+@@ -1085,10 +1091,6 @@
+ async_queue = (AgsThread *) ags_thread_find_type(main_loop,
+ AGS_TYPE_TASK_THREAD);
+
+- ags_recall_done((AgsRecall *) count_beats_audio_run->delay_audio_run);
+- ags_audio_done(AGS_RECALL_AUDIO(count_beats_audio)->audio,
+- AGS_RECALL(count_beats_audio_run)->recall_id);
+-
+ if((AGS_RECALL_ID_SEQUENCER & (recall->recall_id->flags)) != 0){
+ sequencer = TRUE;
+ }else{
+@@ -1108,6 +1110,13 @@
+ /* append AgsCancelAudio */
+ ags_task_thread_append_task((AgsTaskThread *) async_queue,
+ (AgsTask *) cancel_audio);
++
++ /* call parent */
++ AGS_RECALL_CLASS(ags_count_beats_audio_run_parent_class)->done(recall);
++
++ ags_recall_done((AgsRecall *) delay_audio_run);
++ ags_audio_done(audio,
++ recall_id);
+ }
+
+ /**
--
gsequencer packaging
More information about the pkg-multimedia-commits
mailing list