static gboolean xmms_mpc_init (xmms_xform_t *xform) { xmms_mpc_data_t *data; xmms_error_t error; data = g_new0 (xmms_mpc_data_t, 1); xmms_xform_private_data_set (xform, data); if (!xmms_apetag_read (xform)) { XMMS_DBG ("Failed to read APEv2 tag"); } /* Reset to start after reading the tags */ xmms_error_reset (&error); xmms_xform_seek (xform, 0, XMMS_XFORM_SEEK_SET, &error); data->buffer = g_string_new (NULL); data->reader.read = xmms_mpc_callback_read; data->reader.seek = xmms_mpc_callback_seek; data->reader.tell = xmms_mpc_callback_tell; data->reader.canseek = xmms_mpc_callback_canseek; data->reader.get_size = xmms_mpc_callback_get_size; data->reader.data = xform; #ifdef HAVE_MPCDEC_OLD mpc_streaminfo_init (&data->info); if (mpc_streaminfo_read (&data->info, &data->reader) != ERROR_CODE_OK) return FALSE; mpc_decoder_setup (&data->decoder, &data->reader); if (mpc_decoder_initialize (&data->decoder, &data->info) == FALSE) return FALSE; #else data->demux = mpc_demux_init (&data->reader); if (!data->demux) return FALSE; mpc_demux_get_info (data->demux, &data->info); #endif xmms_mpc_cache_streaminfo (xform); xmms_xform_outdata_type_add (xform, XMMS_STREAM_TYPE_MIMETYPE, "audio/pcm", XMMS_STREAM_TYPE_FMT_FORMAT, XMMS_SAMPLE_FORMAT_FLOAT, XMMS_STREAM_TYPE_FMT_CHANNELS, data->info.channels, XMMS_STREAM_TYPE_FMT_SAMPLERATE, data->info.sample_freq, XMMS_STREAM_TYPE_END); return TRUE; }
static void xmms_mpc_collect_metadata (xmms_xform_t *xform) { xmms_mpc_data_t *data; xmms_apetag_t *tag; gint i, intval; const gchar *strval; g_return_if_fail (xform); data = xmms_xform_private_data_get (xform); g_return_if_fail (data); tag = xmms_apetag_init (xform); if (xmms_apetag_read (tag)) { for (i = 0; i < G_N_ELEMENTS (properties); i++) { switch (properties[i].type) { case INTEGER: intval = xmms_apetag_lookup_int (tag, properties[i].vname); if (intval > 0) { xmms_xform_metadata_set_int (xform, properties[i].xname, intval); } break; case STRING: strval = xmms_apetag_lookup_str (tag, properties[i].vname); if (strval != NULL) { xmms_xform_metadata_set_str (xform, properties[i].xname, strval); } break; } } } xmms_apetag_destroy (tag); }
static gboolean xmms_wavpack_init (xmms_xform_t *xform) { xmms_wavpack_data_t *data; xmms_sample_format_t sample_format; gint samplerate; /* the maximum length of error really isn't defined... stupid */ gchar error[1024]; g_return_val_if_fail (xform, FALSE); if (!xmms_apetag_read (xform)) { XMMS_DBG ("Failed to read APEv2 tag"); } data = g_new0 (xmms_wavpack_data_t, 1); g_return_val_if_fail (data, FALSE); xmms_xform_private_data_set (xform, data); data->reader.read_bytes = wavpack_read_bytes; data->reader.get_pos = wavpack_get_pos; data->reader.set_pos_abs = wavpack_set_pos_abs; data->reader.set_pos_rel = wavpack_set_pos_rel; data->reader.push_back_byte = wavpack_push_back_byte; data->reader.get_length = wavpack_get_length; data->reader.can_seek = wavpack_can_seek; data->ctx = WavpackOpenFileInputEx (&data->reader, xform, xform, error, OPEN_TAGS, 0); if (!data->ctx) { xmms_log_error ("Unable to open wavpack file: %s", error); xmms_xform_private_data_set (xform, NULL); xmms_wavpack_free_data (data); return FALSE; } data->channels = WavpackGetNumChannels (data->ctx); data->bits_per_sample = WavpackGetBitsPerSample (data->ctx); data->num_samples = WavpackGetNumSamples (data->ctx); samplerate = WavpackGetSampleRate (data->ctx); xmms_xform_metadata_set_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_DURATION, (int) (1000.0 * data->num_samples / samplerate)); xmms_xform_metadata_set_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_SAMPLERATE, samplerate); xmms_xform_metadata_set_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_BITRATE, (int) WavpackGetAverageBitrate (data->ctx, FALSE)); switch (data->bits_per_sample) { case 8: sample_format = XMMS_SAMPLE_FORMAT_S8; break; case 12: case 16: sample_format = XMMS_SAMPLE_FORMAT_S16; break; case 24: case 32: sample_format = XMMS_SAMPLE_FORMAT_S32; break; default: xmms_log_error ("Unsupported bits-per-sample in wavpack file: %d", data->bits_per_sample); xmms_xform_private_data_set (xform, NULL); xmms_wavpack_free_data (data); return FALSE; } xmms_xform_outdata_type_add (xform, XMMS_STREAM_TYPE_MIMETYPE, "audio/pcm", XMMS_STREAM_TYPE_FMT_FORMAT, sample_format, XMMS_STREAM_TYPE_FMT_CHANNELS, data->channels, XMMS_STREAM_TYPE_FMT_SAMPLERATE, samplerate, XMMS_STREAM_TYPE_END); return TRUE; }