diff options
author | Yves Combe <ycombe@src.gnome.org> | 2006-12-10 00:29:18 (GMT) |
---|---|---|
committer | Yves Combe <ycombe@src.gnome.org> | 2006-12-10 00:29:18 (GMT) |
commit | 978534039ab03043d9aa11b40ab522d6aed666b3 (patch) | |
tree | 2e75f03e09d0beeeccb5a1408bd33ec42cf8f73c | |
parent | 40fd990e80c173d6a02d15fc182176fe5beca2c8 (diff) |
GC_SOUND - fix errors in destroy (destroy loop).
GC_SOUND
- fix errors in destroy (destroy loop).
-rw-r--r-- | ChangeLog | 17 | ||||
-rw-r--r-- | src/gc_sound/ChangeLog | 14 | ||||
-rw-r--r-- | src/gc_sound/src/gc-sound-channel.c | 28 | ||||
-rw-r--r-- | src/gc_sound/src/gc-sound-channel.h | 1 | ||||
-rw-r--r-- | src/gc_sound/src/gc-sound-mixer-SDL.c | 41 | ||||
-rw-r--r-- | src/gc_sound/src/gc-sound-mixer-SDL.h | 1 | ||||
-rw-r--r-- | src/gc_sound/src/gc-sound-object.c | 17 | ||||
-rw-r--r-- | src/gc_sound/src/test_gc_sound.c | 28 |
8 files changed, 104 insertions, 43 deletions
@@ -1,3 +1,20 @@ +2006-12-10 Yves Combe <yves@ycombe.net> + + GC_SOUND + - fix errors in destroy (destroy loop). + + * src/gc_sound/ChangeLog: + * src/gc_sound/src/gc-sound-channel.c: (root_destroyed), + (gc_sound_channel_destroy), (gc_sound_channel_class_init): + * src/gc_sound/src/gc-sound-channel.h: + * src/gc_sound/src/gc-sound-mixer-SDL.c: + (gc_sound_mixer_sdl_finalize), (gc_sound_mixer_sdl_destroy), + (gc_sound_mixer_sdl_class_init): + * src/gc_sound/src/gc-sound-mixer-SDL.h: + * src/gc_sound/src/gc-sound-object.c: (gc_sound_object_class_init), + (gc_sound_object_dispose), (parent_destroyed): + * src/gc_sound/src/test_gc_sound.c: (main): + 2006-12-09 Yves Combe <yves@ycombe.net> GC_SOUND diff --git a/src/gc_sound/ChangeLog b/src/gc_sound/ChangeLog index d9cffab..138ae0c 100644 --- a/src/gc_sound/ChangeLog +++ b/src/gc_sound/ChangeLog @@ -1,3 +1,17 @@ +2006-12-10 Yves Combe <yves@ycombe.net> + + fix errors in destroy (destroy loop). + + * src/gc-sound-channel.c: (root_destroyed), + (gc_sound_channel_destroy), (gc_sound_channel_class_init): + * src/gc-sound-channel.h: + * src/gc-sound-mixer-SDL.c: (gc_sound_mixer_sdl_finalize), + (gc_sound_mixer_sdl_destroy), (gc_sound_mixer_sdl_class_init): + * src/gc-sound-mixer-SDL.h: + * src/gc-sound-object.c: (gc_sound_object_class_init), + (gc_sound_object_dispose), (parent_destroyed): + * src/test_gc_sound.c: (main): + 2006-12-09 Yves Combe <yves@ycombe.net> Python bindings: 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 */ diff --git a/src/gc_sound/src/gc-sound-channel.h b/src/gc_sound/src/gc-sound-channel.h index 975744d..9f80033 100644 --- a/src/gc_sound/src/gc-sound-channel.h +++ b/src/gc_sound/src/gc-sound-channel.h @@ -79,7 +79,6 @@ struct _GcSoundChannelClass { /* signal handlers */ void (* run) (GcSoundChannel * self); void (* chunk_end) (GcSoundChannel * self); - void (* destroy) (GcSoundChannel *self); }; GcSoundItem * gc_sound_channel_get_root (GcSoundChannel * self); diff --git a/src/gc_sound/src/gc-sound-mixer-SDL.c b/src/gc_sound/src/gc-sound-mixer-SDL.c index a4ee924..1edb622 100644 --- a/src/gc_sound/src/gc-sound-mixer-SDL.c +++ b/src/gc_sound/src/gc-sound-mixer-SDL.c @@ -360,7 +360,7 @@ enum { PROP_0, PROP_DEVICE, }; -static GObjectClass *parent_class; +static GcSoundObjectClass *parent_class; static void @@ -370,7 +370,7 @@ gc_sound_mixer_sdl_finalize (GObject* object) running_mixer = NULL; - g_ptr_array_free (self->channels, TRUE); + g_ptr_array_free (self->channels, TRUE); g_hash_table_destroy (self->samples); @@ -379,29 +379,31 @@ gc_sound_mixer_sdl_finalize (GObject* object) SDL_Quit(); - parent_class->finalize (object); + g_warning("SDL audio closed"); + + G_OBJECT_CLASS(parent_class)->finalize (object); } static void -gc_sound_mixer_sdl_destroy (GcSoundMixerSdl *self) +gc_sound_mixer_sdl_destroy (GcSoundObject *object) { + GcSoundMixerSdl *self = GC_SOUND_MIXER_SDL (object); gint i; - if (self->has_user_ref_count) + for (i = 0; i < self->channels->len; i++) + { + g_signal_handlers_disconnect_by_func(GC_SOUND_OBJECT(g_ptr_array_index(self->channels,i)), channel_destroyed, self); + gc_sound_object_destroy (GC_SOUND_OBJECT(g_ptr_array_index(self->channels,i))); + g_object_unref(G_OBJECT(g_ptr_array_index(self->channels,i))); + } + + if (self->has_user_ref_count) { self->has_user_ref_count = FALSE; g_object_unref (self); } - - for (i = 0; i < self->channels->len; i++) - { - g_signal_handlers_disconnect_by_func(GC_SOUND_OBJECT(g_ptr_array_index(self->channels,i)), channel_destroyed, self); - gc_sound_object_destroy (GC_SOUND_OBJECT(g_ptr_array_index(self->channels,i))); - g_object_unref(G_OBJECT(g_ptr_array_index(self->channels,i))); - } - - GC_SOUND_OBJECT_GET_CLASS(self)->destroy (GC_SOUND_OBJECT(self)); - + + parent_class->destroy (GC_SOUND_OBJECT(self)); } static void @@ -414,8 +416,9 @@ static void gc_sound_mixer_sdl_class_init (GcSoundMixerSdlClass* self_class) { GObjectClass* go_class; - - parent_class = g_type_class_peek_parent (G_OBJECT_CLASS(self_class)); + GcSoundObjectClass *gc_sound_object_class; + + parent_class = g_type_class_peek_parent (GC_SOUND_OBJECT_CLASS(self_class)); /* GObjectClass */ go_class = G_OBJECT_CLASS(self_class); @@ -423,7 +426,9 @@ gc_sound_mixer_sdl_class_init (GcSoundMixerSdlClass* self_class) go_class->get_property = gc_sound_mixer_sdl_get_property; go_class->set_property = gc_sound_mixer_sdl_set_property; - self_class->destroy = gc_sound_mixer_sdl_destroy; + gc_sound_object_class = GC_SOUND_OBJECT_CLASS(self_class); + gc_sound_object_class->destroy = gc_sound_mixer_sdl_destroy; + _gc_sound_mixer_install_property( go_class, PROP_DEVICE); /* signals */ diff --git a/src/gc_sound/src/gc-sound-mixer-SDL.h b/src/gc_sound/src/gc-sound-mixer-SDL.h index 803cc1e..5b5450b 100644 --- a/src/gc_sound/src/gc-sound-mixer-SDL.h +++ b/src/gc_sound/src/gc-sound-mixer-SDL.h @@ -103,7 +103,6 @@ struct _GcSoundMixerSdlClass { void (* channel_finished) (GcSoundMixerSdl * self, GcSoundChannel * channel); - void (* destroy) (GcSoundMixerSdl *self); }; G_END_DECLS diff --git a/src/gc_sound/src/gc-sound-object.c b/src/gc_sound/src/gc-sound-object.c index 2ea347c..67fad8f 100644 --- a/src/gc_sound/src/gc-sound-object.c +++ b/src/gc_sound/src/gc-sound-object.c @@ -36,6 +36,8 @@ static void gc_sound_object_get_property (GObject *object, static void gc_sound_object_dispose (GObject *object); static void gc_sound_object_real_destroy (GcSoundObject *object); static void gc_sound_object_finalize (GObject *object); +static void parent_destroyed (GcSoundObject *object, + gpointer data); enum { DESTROY, @@ -98,7 +100,7 @@ gc_sound_object_class_init (GcSoundObjectClass *class) { GObjectClass *gobject_class = G_OBJECT_CLASS (class); - parent_class = g_type_class_ref (G_TYPE_OBJECT); + parent_class = g_type_class_peek_parent (GC_SOUND_OBJECT_CLASS(class)); gobject_class->get_property = gc_sound_object_get_property; gobject_class->set_property = gc_sound_object_set_property; @@ -166,10 +168,15 @@ gc_sound_object_dispose (GObject *gobject) if (!(GC_SOUND_OBJECT_FLAGS (object) & GC_SOUND_IN_DESTRUCTION)) { GC_SOUND_OBJECT_SET_FLAGS (object, GC_SOUND_IN_DESTRUCTION); - + if (GC_SOUND_OBJECT(object)->parent) { + g_signal_handlers_disconnect_by_func(GC_SOUND_OBJECT(object)->parent, parent_destroyed, object); + g_object_unref (GC_SOUND_OBJECT(object)->parent); + GC_SOUND_OBJECT(object)->parent = NULL; + } + g_signal_emit (object, gc_sound_object_signals[DESTROY], 0); - GC_SOUND_OBJECT_UNSET_FLAGS (object, GC_SOUND_IN_DESTRUCTION); + //GC_SOUND_OBJECT_UNSET_FLAGS (object, GC_SOUND_IN_DESTRUCTION); } G_OBJECT_CLASS (parent_class)->dispose (gobject); @@ -205,10 +212,6 @@ gc_sound_object_finalize (GObject *gobject) static void parent_destroyed (GcSoundObject *object, gpointer data) { - if (GC_SOUND_OBJECT(object)->parent) { - g_signal_handlers_disconnect_by_func(GC_SOUND_OBJECT(object)->parent, parent_destroyed, object); - g_object_unref (GC_SOUND_OBJECT(object)->parent); - } gc_sound_object_destroy(GC_SOUND_OBJECT(data)); } diff --git a/src/gc_sound/src/test_gc_sound.c b/src/gc_sound/src/test_gc_sound.c index 475888e..082caf0 100644 --- a/src/gc_sound/src/test_gc_sound.c +++ b/src/gc_sound/src/test_gc_sound.c @@ -23,19 +23,29 @@ main (int argc, char *argv) gcmix = gc_sound_mixer_sdl_new(); GC_SOUND_OBJECT(gcmix)->nick = "gcmix"; + g_warning("mix ref_count %d", G_OBJECT(gcmix)->ref_count); + /* We open two chans to play simultaneously */ gcchan1 = gc_sound_mixer_new_channel(gcmix); + g_warning("mix ref_count %d", G_OBJECT(gcmix)->ref_count); + gcchan2 = gc_sound_mixer_new_channel(gcmix); + g_warning("mix ref_count %d", G_OBJECT(gcmix)->ref_count); + GC_SOUND_OBJECT(gcchan1)->nick = "gcchan1"; GC_SOUND_OBJECT(gcchan2)->nick = "gcchan2"; - GcSoundMixer *gcmix2; + //GcSoundMixer *gcmix2; - g_object_get(G_OBJECT(gcchan2), "parent", &gcmix2, NULL); + //g_object_get(G_OBJECT(gcchan2), "parent", &gcmix2, NULL); /* Each chan has a root item, where we group the sounds to play in that channel*/ root1 = GC_SOUND_ITEM(gc_sound_channel_get_root(gcchan1)); + g_warning("mix ref_count %d", G_OBJECT(gcmix)->ref_count); + root2 = GC_SOUND_ITEM(gc_sound_channel_get_root(gcchan2)); + g_warning("mix ref_count %d", G_OBJECT(gcmix)->ref_count); + GC_SOUND_OBJECT(root1)->nick="root1"; GC_SOUND_OBJECT(root2)->nick="root2"; @@ -46,6 +56,8 @@ main (int argc, char *argv) item1_1 = gc_sound_item_append_child (item1); item1_2 = gc_sound_item_append_child (item1); + + g_warning("mix ref_count %d", G_OBJECT(gcmix)->ref_count); GC_SOUND_OBJECT(item1)->nick = "item1"; GC_SOUND_OBJECT(item2)->nick = "item2"; @@ -100,19 +112,23 @@ main (int argc, char *argv) //this will stop item2 because of policy gc_sound_item_play(item3); - gc_sound_object_destroy(GC_SOUND_OBJECT(gcchan2)); + //gc_sound_object_destroy(GC_SOUND_OBJECT(gcchan2)); gc_sound_object_destroy(GC_SOUND_OBJECT(item1)); + g_warning("mix ref_count %d", G_OBJECT(gcmix)->ref_count); g_usleep(3000000); - //gc_sound_object_destroy(GC_SOUND_OBJECT(root2)); + gc_sound_object_destroy(GC_SOUND_OBJECT(root2)); + g_warning("mix ref_count %d", G_OBJECT(gcmix)->ref_count); g_usleep(3000000); gc_sound_object_destroy(GC_SOUND_OBJECT(gcmix)); - gc_sound_object_destroy(GC_SOUND_OBJECT(gcmix2)); + g_warning("mix ref_count %d", G_OBJECT(gcmix)->ref_count); + //gc_sound_object_destroy(GC_SOUND_OBJECT(gcmix2)); g_usleep(3000000); /* infinite loop */ - //g_main_loop_run(g_main_loop_new (NULL, FALSE)); + g_warning("loop now"); + g_main_loop_run(g_main_loop_new (NULL, FALSE)); } |