示例#1
0
void flac_metadata(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
{
    CFlacDec * flacdec = (CFlacDec *)client_data;
    (void)decoder;

    switch (metadata->type)
    {
    case FLAC__METADATA_TYPE_STREAMINFO:
    {
        printf("STREAMINFO block received\n");
        flacdec->mTotalSamples = metadata->data.stream_info.total_samples;
        flacdec->mBps = metadata->data.stream_info.bits_per_sample;
        flacdec->mChannels = metadata->data.stream_info.channels;
        flacdec->mSampleRate = metadata->data.stream_info.sample_rate;

        {
            /* with VC++ you have to spoon feed it the casting from uint64->int64->double */
            FLAC__uint64 l = (FLAC__uint64)((double)(FLAC__int64)flacdec->mTotalSamples / (double)flacdec->mSampleRate * 1000.0 + 0.5);
            if (l > INT_MAX)
                l = INT_MAX;
            flacdec->mLengthInMsec = (int)l;
        }
        break;
    }
    case FLAC__METADATA_TYPE_PADDING:
        printf("PADDING block received\n");
        break;
    case FLAC__METADATA_TYPE_APPLICATION:
        printf("APPLICATION block received\n");
        break;
    case FLAC__METADATA_TYPE_SEEKTABLE:
        printf("SEEKTABLE block received\n");
        break;
    case FLAC__METADATA_TYPE_VORBIS_COMMENT:
    {
        printf("VORBISCOMMENT block (a.k.a. FLAC tags) received\n");
        // if there is an old metadata -> clear it
        if (flacdec->mMetadata != NULL)
            FLAC__metadata_object_delete(flacdec->mMetadata);
        flacdec->mMetadata = FLAC__metadata_object_clone(metadata);
        break;
    }
    case FLAC__METADATA_TYPE_CUESHEET:
        printf("CUESHEET block received\n");
        break;
    case FLAC__METADATA_TYPE_PICTURE:
        printf("PICTURE block received\n");
        break;
    case FLAC__METADATA_TYPE_UNDEFINED:
    default:
        printf("Undefined block received\n");
        break;
    }
}
示例#2
0
void flac_metadata_handler(const FLAC__SeekableStreamDecoder *dec, 
                           const FLAC__StreamMetadata *meta, void *data)
{
    /* Ignore metadata for now... */
    (void)dec;
    (void)data;

    metadata_length += meta->length;

    if ( meta->type == FLAC__METADATA_TYPE_STREAMINFO ) {
        stream_info = FLAC__metadata_object_clone( meta );
        if ( stream_info == NULL ) {
            //return CODEC_ERROR;
        }
    } else if ( meta->type == FLAC__METADATA_TYPE_SEEKTABLE ) {
        seek_table = FLAC__metadata_object_clone( meta );
        if ( seek_table == NULL ) {
            //return CODEC_ERROR;
        }
    }
}
static void metadata_cb(const FLAC__StreamDecoder *, const FLAC__StreamMetadata *metadata, void *client_data)
{
	FLACClientData &client = *static_cast<FLACClientData *>(client_data);

	if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO && metadata->data.stream_info.total_samples != 0)
	{
		if(!sampleRate) sampleRate = metadata->data.stream_info.sample_rate;
		client.channels = metadata->data.stream_info.channels;

		if(!FLAC__format_sample_rate_is_subset(sampleRate))
		{
			// FLAC only supports 10 Hz granularity for frequencies above 65535 Hz if the streamable subset is chosen.
			FLAC__stream_encoder_set_streamable_subset(client.encoder, false);
		}
		FLAC__stream_encoder_set_channels(client.encoder, client.channels);
		FLAC__stream_encoder_set_bits_per_sample(client.encoder, metadata->data.stream_info.bits_per_sample);
		FLAC__stream_encoder_set_sample_rate(client.encoder, sampleRate <= FLAC__MAX_SAMPLE_RATE ? sampleRate : FLAC__MAX_SAMPLE_RATE);
		FLAC__stream_encoder_set_total_samples_estimate(client.encoder, metadata->data.stream_info.total_samples);
		FLAC__stream_encoder_set_compression_level(client.encoder, 8);
	} else if(metadata->type == FLAC__METADATA_TYPE_VORBIS_COMMENT)
	{
		for(FLAC__uint32 i = 0; i < metadata->data.vorbis_comment.num_comments; i++)
		{
			const char *tag = reinterpret_cast<const char *>(metadata->data.vorbis_comment.comments[i].entry);
			const FLAC__uint32 length = metadata->data.vorbis_comment.comments[i].length;
			if(length > 11 && !_strnicmp(tag, "SAMPLERATE=", 11))
			{
				sampleRate = atoi(tag + 11);
			}
		}
		client.metadata.push_back(FLAC__metadata_object_clone(metadata));
	} else
	{
		client.metadata.push_back(FLAC__metadata_object_clone(metadata));
	}
}
示例#4
0
文件: flac.c 项目: dreamerc/xmms2
static void
flac_callback_metadata (const FLAC__StreamDecoder *flacdecoder,
                        const FLAC__StreamMetadata *metadata,
                        void *client_data)
{
	xmms_flac_data_t *data;
	xmms_xform_t *xform = (xmms_xform_t *) client_data;
	gint32 filesize;
	const gchar *metakey;

	g_return_if_fail (xform);

	metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_SIZE;
	if (!xmms_xform_metadata_get_int (xform, metakey, &filesize)) {
		filesize = -1;
	}

	data = xmms_xform_private_data_get (xform);

	switch (metadata->type) {
		case FLAC__METADATA_TYPE_STREAMINFO:
			/* FLAC__metadata_object_clone ()? */
			data->bits_per_sample = metadata->data.stream_info.bits_per_sample;
			data->sample_rate = metadata->data.stream_info.sample_rate;
			data->channels = metadata->data.stream_info.channels;
			data->total_samples = metadata->data.stream_info.total_samples;

			if (filesize > 0 && data->total_samples) {
				data->bit_rate = (guint) ((guint64) filesize * 8 *
				                 (guint64) data->sample_rate /
				                 (guint64) data->total_samples);
			}

			XMMS_DBG ("STREAMINFO: BPS %d. Samplerate: %d. Channels: %d.",
			          data->bits_per_sample,
			          data->sample_rate,
			          data->channels);

			break;
		case FLAC__METADATA_TYPE_VORBIS_COMMENT:
			data->vorbiscomment = FLAC__metadata_object_clone (metadata);
			break;
#if defined(FLAC_API_VERSION_CURRENT) && FLAC_API_VERSION_CURRENT > 7
		case FLAC__METADATA_TYPE_PICTURE: {
			gchar hash[33];
			if (metadata->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER &&
			    xmms_bindata_plugin_add (metadata->data.picture.data,
			                             metadata->data.picture.data_length,
			                             hash)) {
				const gchar *metakey;
				
				metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_PICTURE_FRONT;
				xmms_xform_metadata_set_str (xform, metakey, hash);
				
				metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_PICTURE_FRONT_MIME;
				xmms_xform_metadata_set_str (xform, metakey, metadata->data.picture.mime_type);
			}
			break;
		}
#endif
		/* if we want to support more metadata types here,
		 * don't forget to add a call to
		 * FLAC__stream_decoder_set_metadata_respond() below.
		 */
		default:
			break;
	}
}