예제 #1
0
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;
}
예제 #2
0
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);
}
예제 #3
0
파일: wavpack.c 프로젝트: dsheeler/xmms2
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;
}