--- a/src/libcuecue/flac.c +++ b/src/libcuecue/flac.c @@ -27,6 +27,12 @@ #include "cuecue.h" #include "cuecue_internal.h" +#if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7 +#define LEGACY_FLAC +#else +#undef LEGACY_FLAC +#endif + typedef struct Internal { FILE *dst; @@ -38,7 +44,11 @@ } Internal; +#ifdef LEGACY_FLAC void error(const FLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) +#else +void error(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) +#endif { Internal *internal = client_data; switch (status) { @@ -52,11 +62,21 @@ strcpy(cuecue_error,"CRC Mismatch: FLAC file corrupted"); internal->error=1; break; +#ifndef LEGACY_FLAC + case FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM: + strcpy(cuecue_error,"Unparseable stream"); + internal->error=1; + break; +#endif } } +#ifdef LEGACY_FLAC void metadata(const FLAC__FileDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) +#else +void metadata(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) +#endif { if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO) { /* get size of the file, for progress callback */ @@ -66,7 +86,11 @@ } +#ifdef LEGACY_FLAC FLAC__StreamDecoderWriteStatus write(const FLAC__FileDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) +#else +FLAC__StreamDecoderWriteStatus write(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) +#endif { Internal *internal = client_data; unsigned int samples = frame->header.blocksize; @@ -126,7 +150,11 @@ { FILE *dst; Internal internal; +#ifdef LEGACY_FLAC FLAC__FileDecoder *decoder; +#else + FLAC__StreamDecoder *decoder; +#endif dst = fopen(file_destination, "wb"); @@ -141,7 +169,11 @@ internal.error=0; internal.dst=dst; +#ifdef LEGACY_FLAC decoder = FLAC__file_decoder_new(); +#else + decoder = FLAC__stream_decoder_new(); +#endif if (decoder==NULL) { snprintf(cuecue_error,CUECUE_ERROR_LENGTH,"Cannot create FLAC decoder! memory error ?"); @@ -150,6 +182,7 @@ internal.buffer = malloc(BUFFER_SIZE); +#ifdef LEGACY_FLAC FLAC__file_decoder_set_md5_checking(decoder, true); FLAC__file_decoder_set_filename(decoder, file_source); @@ -162,8 +195,20 @@ snprintf(cuecue_error,1024,"Cannot open '%s'",file_source); internal.error=1; } +#else + FLAC__stream_decoder_set_md5_checking(decoder, true); + if(FLAC__stream_decoder_init_file(decoder, file_source, write, metadata, error, &internal) != FLAC__STREAM_DECODER_INIT_STATUS_OK) { + snprintf(cuecue_error,1024,"Cannot open '%s'",file_source); + internal.error=1; + } +#endif - if(!FLAC__file_decoder_process_until_end_of_file(decoder)) { +#ifdef LEGACY_FLAC + if(!FLAC__file_decoder_process_until_end_of_file(decoder)) +#else + if(!FLAC__stream_decoder_process_until_end_of_stream(decoder)) +#endif + { if (!internal.error) { /* early error, not even the time to decode metadata :) */ snprintf(cuecue_error,CUECUE_ERROR_LENGTH,"Cannot open '%s'",file_source); @@ -171,8 +216,13 @@ internal.error=1; } +#ifdef LEGACY_FLAC FLAC__file_decoder_finish(decoder); FLAC__file_decoder_delete(decoder); +#else + FLAC__stream_decoder_finish(decoder); + FLAC__stream_decoder_delete(decoder); +#endif fclose(dst); free(internal.buffer);