Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYves 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)
commit978534039ab03043d9aa11b40ab522d6aed666b3 (patch)
tree2e75f03e09d0beeeccb5a1408bd33ec42cf8f73c
parent40fd990e80c173d6a02d15fc182176fe5beca2c8 (diff)
GC_SOUND - fix errors in destroy (destroy loop).
GC_SOUND - fix errors in destroy (destroy loop).
-rw-r--r--ChangeLog17
-rw-r--r--src/gc_sound/ChangeLog14
-rw-r--r--src/gc_sound/src/gc-sound-channel.c28
-rw-r--r--src/gc_sound/src/gc-sound-channel.h1
-rw-r--r--src/gc_sound/src/gc-sound-mixer-SDL.c41
-rw-r--r--src/gc_sound/src/gc-sound-mixer-SDL.h1
-rw-r--r--src/gc_sound/src/gc-sound-object.c17
-rw-r--r--src/gc_sound/src/test_gc_sound.c28
8 files changed, 104 insertions, 43 deletions
diff --git a/ChangeLog b/ChangeLog
index a4bfc52..cd369f5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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));
}