|
|
#include "metadata.h" | #include "metadata.h" |
#include "macros.h" | #include "macros.h" |
| |
|
#if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT < 8 |
|
#define LEGACY_FLAC |
|
#else |
|
#undef LEGACY_FLAC |
|
#endif |
|
|
struct _Metadata { | struct _Metadata { |
char *title; | char *title; |
| |
|
|
} CallbackData; | } CallbackData; |
| |
static FLAC__StreamDecoderReadStatus | static FLAC__StreamDecoderReadStatus |
FLAC_read_callback (const FLAC__StreamDecoder *UNUSED(decoder), FLAC__byte buffer[], unsigned *bytes, void *client_data) |
FLAC_read_callback (const FLAC__StreamDecoder *UNUSED(decoder), |
|
FLAC__byte buffer[], |
|
#if defined(LEGACY_FLAC) |
|
unsigned *bytes, |
|
#else |
|
size_t *bytes, |
|
#endif |
|
void *client_data) |
{ | { |
CallbackData *data = (CallbackData *) client_data; | CallbackData *data = (CallbackData *) client_data; |
GnomeVFSFileSize read; | GnomeVFSFileSize read; |
|
|
| |
flac_decoder = FLAC__stream_decoder_new (); | flac_decoder = FLAC__stream_decoder_new (); |
| |
|
#if defined(LEGACY_FLAC) |
FLAC__stream_decoder_set_read_callback (flac_decoder, FLAC_read_callback); | FLAC__stream_decoder_set_read_callback (flac_decoder, FLAC_read_callback); |
FLAC__stream_decoder_set_write_callback (flac_decoder, FLAC_write_callback); | FLAC__stream_decoder_set_write_callback (flac_decoder, FLAC_write_callback); |
FLAC__stream_decoder_set_metadata_callback (flac_decoder, FLAC_metadata_callback); | FLAC__stream_decoder_set_metadata_callback (flac_decoder, FLAC_metadata_callback); |
FLAC__stream_decoder_set_error_callback (flac_decoder, FLAC_error_callback); | FLAC__stream_decoder_set_error_callback (flac_decoder, FLAC_error_callback); |
|
#endif |
| |
callback_data = g_new0 (CallbackData, 1); | callback_data = g_new0 (CallbackData, 1); |
callback_data->handle = handle; | callback_data->handle = handle; |
callback_data->comment = comment; | callback_data->comment = comment; |
|
#if defined(LEGACY_FLAC) |
FLAC__stream_decoder_set_client_data (flac_decoder, callback_data); | FLAC__stream_decoder_set_client_data (flac_decoder, callback_data); |
|
#endif |
| |
/* by default, only the STREAMINFO block is parsed and passed to | /* by default, only the STREAMINFO block is parsed and passed to |
* the metadata callback. Here we instruct the decoder to also | * the metadata callback. Here we instruct the decoder to also |
* pass us the VORBISCOMMENT block if there is one. */ | * pass us the VORBISCOMMENT block if there is one. */ |
FLAC__stream_decoder_set_metadata_respond (flac_decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT); | FLAC__stream_decoder_set_metadata_respond (flac_decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT); |
| |
|
#if defined(LEGACY_FLAC) |
FLAC__stream_decoder_init (flac_decoder); | FLAC__stream_decoder_init (flac_decoder); |
|
#else |
|
FLAC__stream_decoder_init_stream (flac_decoder, |
|
FLAC_read_callback, |
|
NULL, |
|
NULL, |
|
NULL, |
|
NULL, |
|
FLAC_write_callback, |
|
FLAC_metadata_callback, |
|
FLAC_error_callback, |
|
callback_data |
|
); |
|
#endif |
| |
/* this runs the decoding process, calling the callbacks as appropriate */ | /* this runs the decoding process, calling the callbacks as appropriate */ |
if (FLAC__stream_decoder_process_until_end_of_metadata (flac_decoder) == 0) { | if (FLAC__stream_decoder_process_until_end_of_metadata (flac_decoder) == 0) { |