static gboolean song_changed (void *data) { /* executes in the output thread; NOT the filler thread */ xmms_output_song_changed_arg_t *arg = (xmms_output_song_changed_arg_t *)data; xmms_medialib_entry_t entry; entry = xmms_xform_entry_get (arg->chain); XMMS_DBG ("Running hotspot! Song changed!! %d", entry); arg->output->played = 0; arg->output->current_entry = entry; if (!xmms_output_format_set (arg->output, xmms_xform_outtype_get (arg->chain))) { XMMS_DBG ("Couldn't set format, stopping filler.."); xmms_output_filler_state_nolock (arg->output, FILLER_STOP); xmms_ringbuf_set_eos (arg->output->filler_buffer, TRUE); return FALSE; } if (arg->flush) xmms_output_flush (arg->output); xmms_object_emit_f (XMMS_OBJECT (arg->output), XMMS_IPC_SIGNAL_OUTPUT_CURRENTID, XMMSV_TYPE_UINT32, entry); return TRUE; }
void update_playtime (xmms_output_t *output, int advance) { guint buffersize = 0; g_mutex_lock (output->playtime_mutex); output->played += advance; g_mutex_unlock (output->playtime_mutex); buffersize = xmms_output_plugin_method_latency_get (output->plugin, output); if (output->played < buffersize) { buffersize = output->played; } g_mutex_lock (output->playtime_mutex); if (output->format) { guint ms = xmms_sample_bytes_to_ms (output->format, output->played - buffersize); if ((ms / 100) != (output->played_time / 100)) { xmms_object_emit_f (XMMS_OBJECT (output), XMMS_IPC_SIGNAL_OUTPUT_PLAYTIME, XMMSV_TYPE_UINT32, ms); } output->played_time = ms; } g_mutex_unlock (output->playtime_mutex); }
static gboolean kill_server (gpointer object) { xmms_object_emit_f (XMMS_OBJECT (object), XMMS_IPC_SIGNAL_QUIT, XMMSV_TYPE_INT32, time (NULL)-((xmms_main_t*)object)->starttime); xmms_object_unref (object); exit (EXIT_SUCCESS); }
static gboolean xmms_output_status_set (xmms_output_t *output, gint status) { gboolean ret = TRUE; if (!output->plugin) { XMMS_DBG ("No plugin to set status on.."); return FALSE; } g_mutex_lock (output->status_mutex); if (output->status != status) { if (status == XMMS_PLAYBACK_STATUS_PAUSE && output->status != XMMS_PLAYBACK_STATUS_PLAY) { XMMS_DBG ("Can only pause from play."); ret = FALSE; } else { output->status = status; if (status == XMMS_PLAYBACK_STATUS_STOP) { xmms_object_unref (output->format); output->format = NULL; } if (!xmms_output_plugin_method_status (output->plugin, output, status)) { xmms_log_error ("Status method returned an error!"); output->status = XMMS_PLAYBACK_STATUS_STOP; ret = FALSE; } xmms_object_emit_f (XMMS_OBJECT (output), XMMS_IPC_SIGNAL_PLAYBACK_STATUS, XMMSV_TYPE_UINT32, output->status); } } g_mutex_unlock (output->status_mutex); return ret; }
static gpointer xmms_output_monitor_volume_thread (gpointer data) { GTree *dict; xmms_output_t *output = data; xmms_volume_map_t old, cur; if (!xmms_output_plugin_method_volume_get_available (output->plugin)) { return NULL; } xmms_volume_map_init (&old); xmms_volume_map_init (&cur); while (output->monitor_volume_running) { cur.num_channels = 0; cur.status = xmms_output_plugin_method_volume_get (output->plugin, output, NULL, NULL, &cur.num_channels); if (cur.status) { /* check for sane values */ if (cur.num_channels < 1 || cur.num_channels > VOLUME_MAX_CHANNELS) { cur.status = FALSE; } else { cur.names = g_renew (const gchar *, cur.names, cur.num_channels); cur.values = g_renew (guint, cur.values, cur.num_channels); } } if (cur.status) { cur.status = xmms_output_plugin_method_volume_get (output->plugin, output, cur.names, cur.values, &cur.num_channels); } /* we failed at getting volume for one of the two maps or * we succeeded both times and they differ -> changed */ if ((cur.status ^ old.status) || (cur.status && old.status && !xmms_volume_map_equal (&old, &cur))) { /* emit the broadcast */ if (cur.status) { dict = xmms_volume_map_to_dict (&cur); xmms_object_emit_f (XMMS_OBJECT (output), XMMS_IPC_SIGNAL_OUTPUT_VOLUME_CHANGED, XMMSV_TYPE_DICT, dict); g_tree_destroy (dict); } else { /** @todo When bug 691 is solved, emit an error here */ xmms_object_emit_f (XMMS_OBJECT (output), XMMS_IPC_SIGNAL_OUTPUT_VOLUME_CHANGED, XMMSV_TYPE_NONE); } } xmms_volume_map_copy (&cur, &old); g_usleep (G_USEC_PER_SEC); } xmms_volume_map_free (&old); xmms_volume_map_free (&cur); return NULL; }
static gpointer xmms_mediainfo_reader_thread (gpointer data) { GList *goal_format; GTimeVal timeval; xmms_stream_type_t *f; guint num = 0; xmms_mediainfo_reader_t *mrt = (xmms_mediainfo_reader_t *) data; xmms_object_emit_f (XMMS_OBJECT (mrt), XMMS_IPC_SIGNAL_MEDIAINFO_READER_STATUS, XMMSV_TYPE_INT32, XMMS_MEDIAINFO_READER_STATUS_RUNNING); f = _xmms_stream_type_new (NULL, XMMS_STREAM_TYPE_MIMETYPE, "audio/pcm", XMMS_STREAM_TYPE_END); goal_format = g_list_prepend (NULL, f); while (mrt->running) { xmms_medialib_session_t *session; xmmsc_medialib_entry_status_t prev_status; guint lmod = 0; xmms_medialib_entry_t entry; xmms_xform_t *xform; session = xmms_medialib_begin_write (); entry = xmms_medialib_entry_not_resolved_get (session); XMMS_DBG ("got %d as not resolved", entry); if (!entry) { xmms_medialib_end (session); xmms_object_emit_f (XMMS_OBJECT (mrt), XMMS_IPC_SIGNAL_MEDIAINFO_READER_STATUS, XMMSV_TYPE_INT32, XMMS_MEDIAINFO_READER_STATUS_IDLE); g_mutex_lock (mrt->mutex); g_cond_wait (mrt->cond, mrt->mutex); g_mutex_unlock (mrt->mutex); num = 0; xmms_object_emit_f (XMMS_OBJECT (mrt), XMMS_IPC_SIGNAL_MEDIAINFO_READER_STATUS, XMMSV_TYPE_INT32, XMMS_MEDIAINFO_READER_STATUS_RUNNING); continue; } prev_status = xmms_medialib_entry_property_get_int (session, entry, XMMS_MEDIALIB_ENTRY_PROPERTY_STATUS); xmms_medialib_entry_status_set (session, entry, XMMS_MEDIALIB_ENTRY_STATUS_RESOLVING); lmod = xmms_medialib_entry_property_get_int (session, entry, XMMS_MEDIALIB_ENTRY_PROPERTY_LMOD); if (num == 0) { xmms_object_emit_f (XMMS_OBJECT (mrt), XMMS_IPC_SIGNAL_MEDIAINFO_READER_UNINDEXED, XMMSV_TYPE_INT32, xmms_medialib_num_not_resolved (session)); num = 10; } else { num--; } xmms_medialib_end (session); xform = xmms_xform_chain_setup (entry, goal_format, TRUE); if (!xform) { if (prev_status == XMMS_MEDIALIB_ENTRY_STATUS_NEW) { xmms_medialib_entry_remove (entry); } else { session = xmms_medialib_begin_write (); xmms_medialib_entry_status_set (session, entry, XMMS_MEDIALIB_ENTRY_STATUS_NOT_AVAILABLE); xmms_medialib_end (session); xmms_medialib_entry_send_update (entry); } continue; } xmms_object_unref (xform); g_get_current_time (&timeval); session = xmms_medialib_begin_write (); xmms_medialib_entry_status_set (session, entry, XMMS_MEDIALIB_ENTRY_STATUS_OK); xmms_medialib_entry_property_set_int (session, entry, XMMS_MEDIALIB_ENTRY_PROPERTY_ADDED, timeval.tv_sec); xmms_medialib_end (session); xmms_medialib_entry_send_update (entry); } g_list_free (goal_format); xmms_object_unref (f); return NULL; }