static void bt_edit_application_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { BtEditApplication *self = BT_EDIT_APPLICATION (object); return_if_disposed (); switch (property_id) { case EDIT_APPLICATION_SONG: #ifdef USE_DEBUG if (G_OBJECT_REF_COUNT (self->priv->song) != 1) { GST_DEBUG ("old song: %" G_OBJECT_REF_COUNT_FMT, G_OBJECT_LOG_REF_COUNT (self->priv->song)); } #endif g_object_try_unref (self->priv->song); self->priv->song = BT_SONG (g_value_dup_object (value)); GST_DEBUG ("new song: %" G_OBJECT_REF_COUNT_FMT, G_OBJECT_LOG_REF_COUNT (self->priv->song)); break; case EDIT_APPLICATION_UNSAVED: self->priv->unsaved = g_value_get_boolean (value); GST_INFO ("set the unsaved flag to %d for the song", self->priv->unsaved); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } }
static GstElement * get_sink_bin (void) { BtMachine *machine = bt_setup_get_machine_by_type (setup, BT_TYPE_SINK_MACHINE); GstElement *sink_bin = GST_ELEMENT (check_gobject_get_object_property (machine, "machine")); g_object_try_unref (machine); return sink_bin; }
static void bt_main_page_info_dispose (GObject * object) { BtMainPageInfo *self = BT_MAIN_PAGE_INFO (object); return_if_disposed (); self->priv->dispose_has_run = TRUE; GST_DEBUG ("!!!! self=%p", self); g_object_try_unref (self->priv->song_info); g_object_unref (self->priv->app); GST_DEBUG (" chaining up"); G_OBJECT_CLASS (bt_main_page_info_parent_class)->dispose (object); }
static void on_recover_clicked (GtkButton * button, gpointer user_data) { BtCrashRecoverDialog *self = BT_CRASH_RECOVER_DIALOG (user_data); gchar *log_name = get_selected (self); gboolean res = FALSE; BtMainWindow *main_window; if (log_name) { BtChangeLog *change_log = bt_change_log_new (); GST_INFO ("recovering: %s", log_name); if (bt_change_log_recover (change_log, log_name)) { remove_selected (self); res = TRUE; } g_free (log_name); g_object_try_unref (change_log); } g_object_get (self->priv->app, "main-window", &main_window, NULL); /* close the recovery dialog */ gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_CLOSE); if (res) { /* the song recovery has been finished */ bt_dialog_message (main_window, _("Recovery finished"), _("The selected song has been recovered successful."), _("Please check the song and save it if everything is alright.") ); } else { /* FIXME(ensonic): the log is still there * - this dialog should be a warning * - ev. we want to suggest to ask for support */ /* one or more steps in the recovery did not apply */ bt_dialog_message (main_window, _("Recovery failed"), _("Sorry, the selected song could not be fully recovered."), _("Please check the song and save it if still looks good.") ); } g_object_unref (main_window); }
/* test master volume, using appsink? */ static void test_bt_sink_bin_master_volume (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); gdouble volume = 1.0 / (gdouble) _i; g_object_set (settings, "audiosink", "fakesink", NULL); make_new_song ( /*square */ 1); BtMachine *machine = bt_setup_get_machine_by_type (setup, BT_TYPE_SINK_MACHINE); GstElement *sink_bin = GST_ELEMENT (check_gobject_get_object_property (machine, "machine")); BtParameterGroup *pg = bt_machine_get_global_param_group (machine); gst_element_set_state (sink_bin, GST_STATE_READY); GstElement *fakesink = get_sink_element ((GstBin *) sink_bin); g_object_set (fakesink, "signal-handoffs", TRUE, NULL); g_signal_connect (fakesink, "preroll-handoff", (GCallback) handoff_buffer_cb, NULL); g_signal_connect (fakesink, "handoff", (GCallback) handoff_buffer_cb, NULL); GST_INFO ("-- act --"); g_object_set (sink_bin, "master-volume", volume, NULL); bt_parameter_group_set_param_default (pg, bt_parameter_group_get_param_index (pg, "master-volume")); bt_song_play (song); run_main_loop_until_eos (); GST_INFO ("-- assert --"); GST_INFO ("minv=%7.4lf, maxv=%7.4lf", minv, maxv); ck_assert_float_eq (maxv, +volume); ck_assert_float_eq (minv, -volume); GST_INFO ("-- cleanup --"); bt_song_stop (song); gst_object_unref (sink_bin); g_object_try_unref (machine); BT_TEST_END; }
static void bt_wavetable_dispose (GObject * const object) { const BtWavetable *const self = BT_WAVETABLE (object); GList *node; return_if_disposed (); self->priv->dispose_has_run = TRUE; GST_DEBUG ("!!!! self=%p", self); g_object_try_weak_unref (self->priv->song); // unref list of waves if (self->priv->waves) { for (node = self->priv->waves; node; node = g_list_next (node)) { GST_DEBUG (" free wave : %" G_OBJECT_REF_COUNT_FMT, G_OBJECT_LOG_REF_COUNT (node->data)); g_object_try_unref (node->data); node->data = NULL; } } G_OBJECT_CLASS (bt_wavetable_parent_class)->dispose (object); }
static void bt_edit_application_dispose (GObject * object) { BtEditApplication *self = BT_EDIT_APPLICATION (object); return_if_disposed (); self->priv->dispose_has_run = TRUE; /* This should destroy the window as this is a child of the app. * Problem 1: On the other hand, this *NEVER* gets called as long as the window keeps its * strong reference to the app. * Solution 1: Only use weak refs when reffing upstream objects */ GST_DEBUG ("!!!! self=%p", self); if (self->priv->song) { GST_INFO ("song: %" G_OBJECT_REF_COUNT_FMT, G_OBJECT_LOG_REF_COUNT (self->priv->song)); bt_song_stop (self->priv->song); g_object_unref (self->priv->song); self->priv->song = NULL; } if (self->priv->main_window) { GST_INFO ("main_window: %" G_OBJECT_REF_COUNT_FMT, G_OBJECT_LOG_REF_COUNT (self->priv->main_window)); //main-menu.c::on_menu_quit_activate gtk_widget_destroy (GTK_WIDGET (self->priv->main_window)); } GST_DEBUG (" more unrefs"); g_object_try_unref (self->priv->ui_resources); g_object_try_unref (self->priv->pbc_socket); g_object_try_unref (self->priv->pbc_ic); g_object_try_unref (self->priv->ic_registry); g_object_try_unref (self->priv->change_log); g_object_try_unref (self->priv->audio_session); GST_DEBUG (" chaining up"); G_OBJECT_CLASS (bt_edit_application_parent_class)->dispose (object); GST_DEBUG (" done"); }
static void on_song_changed (const BtEditApplication * app, GParamSpec * arg, gpointer user_data) { BtMainPageInfo *self = BT_MAIN_PAGE_INFO (user_data); BtSong *song; GtkTextBuffer *buffer; gchar *name, *genre, *author, *create_dts, *change_dts; gulong bpm, tpb, bars; gchar *info; GST_INFO ("song has changed : app=%p, self=%p", app, self); g_object_try_unref (self->priv->song_info); // get song from app g_object_get (self->priv->app, "song", &song, NULL); if (!song) { self->priv->song_info = NULL; return; } GST_INFO ("song: %" G_OBJECT_REF_COUNT_FMT, G_OBJECT_LOG_REF_COUNT (song)); g_object_get (song, "song-info", &self->priv->song_info, NULL); // update info fields g_object_get (self->priv->song_info, "name", &name, "genre", &genre, "author", &author, "info", &info, "bpm", &bpm, "tpb", &tpb, "bars", &bars, "create-dts", &create_dts, "change-dts", &change_dts, NULL); g_signal_handlers_block_matched (self->priv->name, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, on_name_changed, (gpointer) self); gtk_entry_set_text (self->priv->name, safe_string (name)); g_free (name); g_signal_handlers_unblock_matched (self->priv->name, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, on_name_changed, (gpointer) self); g_signal_handlers_block_matched (self->priv->genre, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, on_genre_changed, (gpointer) self); gtk_entry_set_text (self->priv->genre, safe_string (genre)); g_free (genre); g_signal_handlers_unblock_matched (self->priv->genre, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, on_genre_changed, (gpointer) self); g_signal_handlers_block_matched (self->priv->author, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, on_author_changed, (gpointer) self); gtk_entry_set_text (self->priv->author, safe_string (author)); g_free (author); g_signal_handlers_unblock_matched (self->priv->author, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, on_author_changed, (gpointer) self); g_signal_handlers_block_matched (self->priv->bpm, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, on_bpm_changed, (gpointer) self); gtk_spin_button_set_value (self->priv->bpm, (gdouble) bpm); g_signal_handlers_unblock_matched (self->priv->bpm, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, on_bpm_changed, (gpointer) self); g_signal_handlers_block_matched (self->priv->tpb, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, on_tpb_changed, (gpointer) self); gtk_spin_button_set_value (self->priv->tpb, (gdouble) tpb); g_signal_handlers_unblock_matched (self->priv->tpb, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, on_tpb_changed, (gpointer) self); g_signal_handlers_block_matched (self->priv->beats, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, on_beats_changed, (gpointer) self); gtk_spin_button_set_value (self->priv->beats, (gdouble) (bars / tpb)); g_signal_handlers_unblock_matched (self->priv->beats, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, on_beats_changed, (gpointer) self); /* the iso date is not nice for the user * struct tm tm; * char dts[255]; * * strptime(create_dts, "%FT%TZ", &tm); * strftime(dts, sizeof(buf), "%F %T", &tm); * * but the code below is simpler and works too :) */ create_dts[10] = ' '; create_dts[19] = '\0'; gtk_entry_set_text (self->priv->date_created, create_dts); g_free (create_dts); change_dts[10] = ' '; change_dts[19] = '\0'; gtk_entry_set_text (self->priv->date_changed, change_dts); g_free (change_dts); buffer = gtk_text_view_get_buffer (self->priv->info); g_signal_handlers_block_matched (buffer, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, on_info_changed, (gpointer) self); gtk_text_buffer_set_text (buffer, safe_string (info), -1); g_free (info); g_signal_handlers_unblock_matched (buffer, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, on_info_changed, (gpointer) self); g_signal_connect (self->priv->song_info, "notify::name", G_CALLBACK (on_name_notify), (gpointer) self); // release the references g_object_unref (song); GST_INFO ("song has changed done"); }