Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/gc_sound/src/gc-sound-channel.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gc_sound/src/gc-sound-channel.c')
-rw-r--r--src/gc_sound/src/gc-sound-channel.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/gc_sound/src/gc-sound-channel.c b/src/gc_sound/src/gc-sound-channel.c
index 206ebed..1eba4f3 100644
--- a/src/gc_sound/src/gc-sound-channel.c
+++ b/src/gc_sound/src/gc-sound-channel.c
@@ -35,6 +35,7 @@ enum {
};
guint gc_sound_channel_signals[N_SIGNALS] = {0};
+static GcSoundObjectClass *parent_class;
gboolean gc_sound_channel_play_item (GcSoundChannel * self, GcSoundItem *item)
{
@@ -124,21 +125,25 @@ enum {
/* GType */
G_DEFINE_TYPE(GcSoundChannel, gc_sound_channel, GC_TYPE_SOUND_OBJECT);
+static void gc_sound_channel_destroy (GcSoundObject *self);
static void root_destroyed (GcSoundObject *root, gpointer data)
{
+ if (!(GC_SOUND_OBJECT_FLAGS (GC_SOUND_OBJECT(data)) & GC_SOUND_IN_DESTRUCTION))
+ gc_sound_channel_destroy (GC_SOUND_CHANNEL(data));
// direct call claas destroy because root is already destroyed.
-
- GC_SOUND_OBJECT_GET_CLASS(data)->destroy (GC_SOUND_OBJECT(data));
+ //GC_SOUND_OBJECT_GET_CLASS(data)->destroy (GC_SOUND_OBJECT(data));
}
static void
-gc_sound_channel_destroy (GcSoundChannel *self){
- g_signal_handlers_disconnect_by_func(self->root, root_destroyed, self);
- gc_sound_object_destroy(GC_SOUND_OBJECT(self->root));
- g_object_unref(self->root);
-
- GC_SOUND_OBJECT_GET_CLASS(self)->destroy (GC_SOUND_OBJECT(self));
+gc_sound_channel_destroy (GcSoundObject *self){
+ if (GC_SOUND_CHANNEL(self)->root) {
+ g_signal_handlers_disconnect_by_func(GC_SOUND_CHANNEL(self)->root, root_destroyed, self);
+ gc_sound_object_destroy(GC_SOUND_OBJECT(GC_SOUND_CHANNEL(self)->root));
+ g_object_unref(GC_SOUND_CHANNEL(self)->root);
+ GC_SOUND_CHANNEL(self)->root = NULL;
+ }
+ parent_class->destroy (GC_SOUND_OBJECT(self));
}
static void
@@ -228,7 +233,10 @@ gc_sound_channel_class_init(GcSoundChannelClass* self_class)
// g_warning("gc_sound_channel_class_init");
GObjectClass* go_class;
-
+ GcSoundObjectClass * gc_sound_object_class = GC_SOUND_OBJECT_CLASS(self_class);
+
+ parent_class = g_type_class_peek_parent (GC_SOUND_OBJECT_CLASS(self_class));
+
/* GObjectClass */
go_class = G_OBJECT_CLASS(self_class);
@@ -251,7 +259,7 @@ gc_sound_channel_class_init(GcSoundChannelClass* self_class)
self_class->run = gc_sound_channel_signal_run;
self_class->chunk_end = gc_sound_channel_signal_chunk_end;
- self_class->destroy = gc_sound_channel_destroy;
+ gc_sound_object_class->destroy = gc_sound_channel_destroy;
gc_sound_channel_signals[RUN] =
g_signal_new("run", /* name */