static gboolean set_plugin (xmms_output_t *output, xmms_output_plugin_t *plugin) { gboolean ret; g_assert (output); g_assert (plugin); output->monitor_volume_running = FALSE; if (output->monitor_volume_thread) { g_thread_join (output->monitor_volume_thread); output->monitor_volume_thread = NULL; } if (output->plugin) { xmms_output_plugin_method_destroy (output->plugin, output); output->plugin = NULL; } /* output->plugin needs to be set before we can call the * NEW method */ output->plugin = plugin; ret = xmms_output_plugin_method_new (output->plugin, output); if (!ret) { output->plugin = NULL; } else if (!output->monitor_volume_thread) { output->monitor_volume_running = TRUE; output->monitor_volume_thread = g_thread_create (xmms_output_monitor_volume_thread, output, TRUE, NULL); } return ret; }
static void xmms_output_destroy (xmms_object_t *object) { xmms_output_t *output = (xmms_output_t *)object; output->monitor_volume_running = FALSE; if (output->monitor_volume_thread) { g_thread_join (output->monitor_volume_thread); output->monitor_volume_thread = NULL; } xmms_output_filler_state (output, FILLER_QUIT); g_thread_join (output->filler_thread); if (output->plugin) { xmms_output_plugin_method_destroy (output->plugin, output); xmms_object_unref (output->plugin); } xmms_object_unref (output->playlist); g_mutex_free (output->status_mutex); g_mutex_free (output->playtime_mutex); g_mutex_free (output->filler_mutex); g_cond_free (output->filler_state_cond); xmms_ringbuf_destroy (output->filler_buffer); xmms_ipc_broadcast_unregister ( XMMS_IPC_SIGNAL_OUTPUT_VOLUME_CHANGED); xmms_ipc_broadcast_unregister ( XMMS_IPC_SIGNAL_PLAYBACK_STATUS); xmms_ipc_broadcast_unregister ( XMMS_IPC_SIGNAL_OUTPUT_CURRENTID); xmms_ipc_signal_unregister (XMMS_IPC_SIGNAL_OUTPUT_PLAYTIME); xmms_ipc_object_unregister (XMMS_IPC_OBJECT_OUTPUT); }
static void xmms_output_destroy (xmms_object_t *object) { xmms_output_t *output = (xmms_output_t *)object; XMMS_DBG ("Deactivating output object."); output->monitor_volume_running = FALSE; if (output->monitor_volume_thread) { g_thread_join (output->monitor_volume_thread); output->monitor_volume_thread = NULL; } xmms_output_filler_state (output, FILLER_QUIT); g_thread_join (output->filler_thread); if (output->plugin) { xmms_output_plugin_method_destroy (output->plugin, output); xmms_object_unref (output->plugin); } xmms_output_format_list_clear (output); xmms_object_unref (output->playlist); xmms_object_unref (output->medialib); g_mutex_clear (&output->status_mutex); g_mutex_clear (&output->playtime_mutex); g_mutex_clear (&output->filler_mutex); g_cond_clear (&output->filler_state_cond); xmms_ringbuf_destroy (output->filler_buffer); xmms_playback_unregister_ipc_commands (); }