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; } }
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)); } }
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; } }