void xmms_sample_converter_to_medialib (xmms_sample_converter_t *conv, xmms_medialib_entry_t entry) { #if 0 xmms_medialib_session_t *session; session = xmms_medialib_begin_write (); xmms_medialib_entry_property_set_str (session, entry, XMMS_MEDIALIB_ENTRY_PROPERTY_FMT_SAMPLEFMT_IN, xmms_sample_name_get (conv->from->format)); xmms_medialib_entry_property_set_int (session, entry, XMMS_MEDIALIB_ENTRY_PROPERTY_FMT_SAMPLERATE_IN, conv->from->samplerate); xmms_medialib_entry_property_set_int (session, entry, XMMS_MEDIALIB_ENTRY_PROPERTY_FMT_CHANNELS_IN, conv->from->channels); xmms_medialib_entry_property_set_str (session, entry, XMMS_MEDIALIB_ENTRY_PROPERTY_FMT_SAMPLEFMT_OUT, xmms_sample_name_get (conv->to->format)); xmms_medialib_entry_property_set_int (session, entry, XMMS_MEDIALIB_ENTRY_PROPERTY_FMT_SAMPLERATE_OUT, conv->to->samplerate); xmms_medialib_entry_property_set_int (session, entry, XMMS_MEDIALIB_ENTRY_PROPERTY_FMT_CHANNELS_OUT, conv->to->channels); xmms_medialib_end (session); #endif }
static void outdata_type_metadata_collect (xmms_xform_t *xform) { gint val; const char *mime; xmms_stream_type_t *type; type = xform->out_type; mime = xmms_stream_type_get_str (type, XMMS_STREAM_TYPE_MIMETYPE); if (strcmp (mime, "audio/pcm") != 0) { return; } val = xmms_stream_type_get_int (type, XMMS_STREAM_TYPE_FMT_FORMAT); if (val != -1) { const gchar *name = xmms_sample_name_get ((xmms_sample_format_t) val); xmms_xform_metadata_set_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_SAMPLE_FMT, name); } val = xmms_stream_type_get_int (type, XMMS_STREAM_TYPE_FMT_SAMPLERATE); if (val != -1) { xmms_xform_metadata_set_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_SAMPLERATE, val); } val = xmms_stream_type_get_int (type, XMMS_STREAM_TYPE_FMT_CHANNELS); if (val != -1) { xmms_xform_metadata_set_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_CHANNELS, val); } }
xmms_sample_converter_t * xmms_sample_converter_init (xmms_stream_type_t *from, xmms_stream_type_t *to) { xmms_sample_converter_t *conv = xmms_object_new (xmms_sample_converter_t, xmms_sample_converter_destroy); gint fformat, fsamplerate, fchannels; gint tformat, tsamplerate, tchannels; fformat = xmms_stream_type_get_int (from, XMMS_STREAM_TYPE_FMT_FORMAT); fsamplerate = xmms_stream_type_get_int (from, XMMS_STREAM_TYPE_FMT_SAMPLERATE); fchannels = xmms_stream_type_get_int (from, XMMS_STREAM_TYPE_FMT_CHANNELS); tformat = xmms_stream_type_get_int (to, XMMS_STREAM_TYPE_FMT_FORMAT); tsamplerate = xmms_stream_type_get_int (to, XMMS_STREAM_TYPE_FMT_SAMPLERATE); tchannels = xmms_stream_type_get_int (to, XMMS_STREAM_TYPE_FMT_CHANNELS); g_return_val_if_fail (tformat != -1, NULL); g_return_val_if_fail (tchannels != -1, NULL); g_return_val_if_fail (tsamplerate != -1, NULL); conv->from = from; conv->to = to; conv->resample = fsamplerate != tsamplerate; conv->func = xmms_sample_conv_get (fchannels, fformat, tchannels, tformat, conv->resample); if (!conv->func) { xmms_object_unref (conv); xmms_log_error ("Unable to convert from %s/%d/%d to %s/%d/%d.", xmms_sample_name_get (fformat), fsamplerate, fchannels, xmms_sample_name_get (tformat), tsamplerate, tchannels); return NULL; } if (conv->resample) recalculate_resampler (conv, fsamplerate, tsamplerate); return conv; }
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; xmms_stream_type_t *type; entry = xmms_xform_entry_get (arg->chain); XMMS_DBG ("Running hotspot! Song changed!! %d", entry); arg->output->played = 0; arg->output->current_entry = entry; type = xmms_xform_outtype_get (arg->chain); if (!xmms_output_format_set (arg->output, type)) { gint fmt, rate, chn; fmt = xmms_stream_type_get_int (type, XMMS_STREAM_TYPE_FMT_FORMAT); rate = xmms_stream_type_get_int (type, XMMS_STREAM_TYPE_FMT_SAMPLERATE); chn = xmms_stream_type_get_int (type, XMMS_STREAM_TYPE_FMT_CHANNELS); XMMS_DBG ("Couldn't set format %s/%d/%d, stopping filler..", xmms_sample_name_get (fmt), rate, chn); 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 (XMMS_OBJECT (arg->output), XMMS_IPC_SIGNAL_PLAYBACK_CURRENTID, xmmsv_new_int (entry)); return TRUE; }