$NetBSD: patch-af,v 1.1 2007/01/13 21:58:24 wiz Exp $ --- src/input/r_flac.cpp.orig 2005-10-12 16:41:09.000000000 +0000 +++ src/input/r_flac.cpp @@ -20,9 +20,6 @@ #include #include #include -#if defined(HAVE_FLAC_FORMAT_H) -#include -#endif #include "common.h" #include "flac_common.h" @@ -36,6 +33,7 @@ #if defined(HAVE_FLAC_FORMAT_H) #define FPFX "flac_reader: " +#ifdef LEGACY_FLAC static FLAC__SeekableStreamDecoderReadStatus flac_read_cb(const FLAC__SeekableStreamDecoder *, FLAC__byte buffer[], @@ -43,55 +41,123 @@ flac_read_cb(const FLAC__SeekableStreamD void *client_data) { return ((flac_reader_c *)client_data)->read_cb(buffer, bytes); } +#else +static FLAC__StreamDecoderReadStatus +flac_read_cb(const FLAC__StreamDecoder *, + FLAC__byte buffer[], + size_t *bytes, + void *client_data) { + return ((flac_reader_c *)client_data)->read_cb(buffer, bytes); +} +#endif static FLAC__StreamDecoderWriteStatus +#ifdef LEGACY_FLAC flac_write_cb(const FLAC__SeekableStreamDecoder *, const FLAC__Frame *frame, const FLAC__int32 * const data[], void *client_data) { return ((flac_reader_c *)client_data)->write_cb(frame, data); } +#else +flac_write_cb(const FLAC__StreamDecoder *, + const FLAC__Frame *frame, + const FLAC__int32 * const data[], + void *client_data) { + return ((flac_reader_c *)client_data)->write_cb(frame, data); +} +#endif static void +#ifdef LEGACY_FLAC flac_metadata_cb(const FLAC__SeekableStreamDecoder *, const FLAC__StreamMetadata *metadata, void *client_data) { ((flac_reader_c *)client_data)->metadata_cb(metadata); } +#else +flac_metadata_cb(const FLAC__StreamDecoder *, + const FLAC__StreamMetadata *metadata, + void *client_data) { + ((flac_reader_c *)client_data)->metadata_cb(metadata); +} +#endif static void +#ifdef LEGACY_FLAC flac_error_cb(const FLAC__SeekableStreamDecoder *, FLAC__StreamDecoderErrorStatus status, void *client_data) { ((flac_reader_c *)client_data)->error_cb(status); } +#else +flac_error_cb(const FLAC__StreamDecoder *, + FLAC__StreamDecoderErrorStatus status, + void *client_data) { + ((flac_reader_c *)client_data)->error_cb(status); +} +#endif +#ifdef LEGACY_FLAC static FLAC__SeekableStreamDecoderSeekStatus flac_seek_cb(const FLAC__SeekableStreamDecoder *, FLAC__uint64 absolute_byte_offset, void *client_data) { return ((flac_reader_c *)client_data)->seek_cb(absolute_byte_offset); } +#else +static FLAC__StreamDecoderSeekStatus +flac_seek_cb(const FLAC__StreamDecoder *, + FLAC__uint64 absolute_byte_offset, + void *client_data) { + return ((flac_reader_c *)client_data)->seek_cb(absolute_byte_offset); +} +#endif +#ifdef LEGACY_FLAC static FLAC__SeekableStreamDecoderTellStatus flac_tell_cb(const FLAC__SeekableStreamDecoder *, FLAC__uint64 *absolute_byte_offset, void *client_data) { return ((flac_reader_c *)client_data)->tell_cb(*absolute_byte_offset); } +#else +static FLAC__StreamDecoderTellStatus +flac_tell_cb(const FLAC__StreamDecoder *, + FLAC__uint64 *absolute_byte_offset, + void *client_data) { + return ((flac_reader_c *)client_data)->tell_cb(*absolute_byte_offset); +} +#endif +#ifdef LEGACY_FLAC static FLAC__SeekableStreamDecoderLengthStatus flac_length_cb(const FLAC__SeekableStreamDecoder *, FLAC__uint64 *stream_length, void *client_data) { return ((flac_reader_c *)client_data)->length_cb(*stream_length); } +#else +static FLAC__StreamDecoderLengthStatus +flac_length_cb(const FLAC__StreamDecoder *, + FLAC__uint64 *stream_length, + void *client_data) { + return ((flac_reader_c *)client_data)->length_cb(*stream_length); +} +#endif static FLAC__bool +#ifdef LEGACY_FLAC flac_eof_cb(const FLAC__SeekableStreamDecoder *, void *client_data) { return ((flac_reader_c *)client_data)->eof_cb(); } +#else +flac_eof_cb(const FLAC__StreamDecoder *, + void *client_data) { + return ((flac_reader_c *)client_data)->eof_cb(); +} +#endif int flac_reader_c::probe_file(mm_io_c *io, @@ -175,8 +241,13 @@ flac_reader_c::create_packetizer(int64_t bool flac_reader_c::parse_file() { +#ifdef LEGACY_FLAC FLAC__SeekableStreamDecoder *decoder; FLAC__SeekableStreamDecoderState state; +#else + FLAC__StreamDecoder *decoder; + FLAC__StreamDecoderState state; +#endif flac_block_t block; uint64_t u, old_pos; int result, progress, old_progress; @@ -186,9 +257,14 @@ flac_reader_c::parse_file() { metadata_parsed = false; mxinfo("+-> Parsing the FLAC file. This can take a LONG time.\n"); +#ifdef LEGACY_FLAC decoder = FLAC__seekable_stream_decoder_new(); +#else + decoder = FLAC__stream_decoder_new(); +#endif if (decoder == NULL) mxerror(FPFX "FLAC__stream_decoder_new() failed.\n"); +#ifdef LEGACY_FLAC FLAC__seekable_stream_decoder_set_client_data(decoder, this); if (!FLAC__seekable_stream_decoder_set_read_callback(decoder, flac_read_cb)) mxerror(FPFX "Could not set the read callback.\n"); @@ -218,9 +294,20 @@ flac_reader_c::parse_file() { if (FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK) mxerror(FPFX "Could not initialize the FLAC decoder.\n"); +#else + if (!FLAC__stream_decoder_set_metadata_respond_all(decoder)) + mxerror(FPFX "Could not set metadata_respond_all.\n"); + if (FLAC__stream_decoder_init_stream(decoder, flac_read_cb, flac_seek_cb, flac_tell_cb, flac_length_cb, flac_eof_cb, flac_write_cb, flac_metadata_cb, flac_error_cb, this) != + FLAC__STREAM_DECODER_INIT_STATUS_OK) + mxerror(FPFX "Could not initialize the FLAC decoder.\n"); +#endif result = +#ifdef LEGACY_FLAC (int)FLAC__seekable_stream_decoder_process_until_end_of_metadata(decoder); +#else + (int)FLAC__stream_decoder_process_until_end_of_metadata(decoder); +#endif mxverb(2, FPFX "extract->metadata, result: %d, mdp: %d, num blocks: %u\n", result, metadata_parsed, (unsigned int)blocks.size()); @@ -229,7 +316,11 @@ flac_reader_c::parse_file() { ti.fname.c_str()); block.type = FLAC_BLOCK_TYPE_HEADERS; +#ifdef LEGACY_FLAC FLAC__seekable_stream_decoder_get_decode_position(decoder, &u); +#else + FLAC__stream_decoder_get_decode_position(decoder, &u); +#endif block.filepos = 0; block.len = u; old_pos = u; @@ -239,12 +330,20 @@ flac_reader_c::parse_file() { old_progress = -5; #if defined(HAVE_FLAC_DECODER_SKIP) +#ifdef LEGACY_FLAC ok = FLAC__seekable_stream_decoder_skip_single_frame(decoder); #else + ok = FLAC__stream_decoder_skip_single_frame(decoder); +#endif +#else ok = FLAC__seekable_stream_decoder_process_single(decoder); #endif while (ok) { +#ifdef LEGACY_FLAC state = FLAC__seekable_stream_decoder_get_state(decoder); +#else + state = FLAC__stream_decoder_get_state(decoder); +#endif progress = (int)(file->getFilePointer() * 100 / file_size); if ((progress - old_progress) >= 5) { @@ -252,7 +351,12 @@ flac_reader_c::parse_file() { old_progress = progress; } - if (FLAC__seekable_stream_decoder_get_decode_position(decoder, &u) && + if ( +#ifdef LEGACY_FLAC + FLAC__seekable_stream_decoder_get_decode_position(decoder, &u) && +#else + FLAC__stream_decoder_get_decode_position(decoder, &u) && +#endif (u != old_pos)) { block.type = FLAC_BLOCK_TYPE_DATA; block.filepos = old_pos; @@ -264,16 +368,25 @@ flac_reader_c::parse_file() { block.filepos, block.len); } +#ifdef LEGACY_FLAC if ((state == FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) || (state == FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR) || (state == FLAC__SEEKABLE_STREAM_DECODER_MEMORY_ALLOCATION_ERROR) || (state == FLAC__SEEKABLE_STREAM_DECODER_READ_ERROR) || (state == FLAC__SEEKABLE_STREAM_DECODER_SEEK_ERROR)) break; +#else + if (state > FLAC__STREAM_DECODER_READ_FRAME) + break; +#endif #if defined(HAVE_FLAC_DECODER_SKIP) +#ifdef LEGACY_FLAC ok = FLAC__seekable_stream_decoder_skip_single_frame(decoder); #else + ok = FLAC__stream_decoder_skip_single_frame(decoder); +#endif +#else ok = FLAC__seekable_stream_decoder_process_single(decoder); #endif } @@ -283,8 +396,13 @@ flac_reader_c::parse_file() { if ((blocks.size() == 0) || (blocks[0].type != FLAC_BLOCK_TYPE_HEADERS)) mxerror(FPFX "Could not read all header packets.\n"); +#ifdef LEGACY_FLAC FLAC__seekable_stream_decoder_reset(decoder); FLAC__seekable_stream_decoder_delete(decoder); +#else + FLAC__stream_decoder_reset(decoder); + FLAC__stream_decoder_delete(decoder); +#endif file->setFilePointer(0); blocks[0].len -= 4; @@ -321,15 +439,26 @@ flac_reader_c::read(generic_packetizer_c return FILE_STATUS_MOREDATA; } +#ifdef LEGACY_FLAC FLAC__SeekableStreamDecoderReadStatus flac_reader_c::read_cb(FLAC__byte buffer[], - unsigned *bytes) { + unsigned *bytes) +#else +FLAC__StreamDecoderReadStatus +flac_reader_c::read_cb(FLAC__byte buffer[], + size_t *bytes) +#endif +{ unsigned bytes_read, wanted_bytes; wanted_bytes = *bytes; bytes_read = file->read((unsigned char *)buffer, wanted_bytes); *bytes = bytes_read; +#ifdef LEGACY_FLAC return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK; +#else + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; +#endif } FLAC__StreamDecoderWriteStatus @@ -372,24 +501,49 @@ flac_reader_c::error_cb(FLAC__StreamDeco mxerror(FPFX "Error parsing the file: %d\n", (int)status); } +#ifdef LEGACY_FLAC FLAC__SeekableStreamDecoderSeekStatus +#else +FLAC__StreamDecoderSeekStatus +#endif flac_reader_c::seek_cb(uint64_t new_pos) { file->setFilePointer(new_pos, seek_beginning); if (file->getFilePointer() == new_pos) +#ifdef LEGACY_FLAC return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK; return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR; +#else + return FLAC__STREAM_DECODER_SEEK_STATUS_OK; + return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; +#endif } +#ifdef LEGACY_FLAC FLAC__SeekableStreamDecoderTellStatus +#else +FLAC__StreamDecoderTellStatus +#endif flac_reader_c::tell_cb(uint64_t &absolute_byte_offset) { absolute_byte_offset = file->getFilePointer(); +#ifdef LEGACY_FLAC return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK; +#else + return FLAC__STREAM_DECODER_TELL_STATUS_OK; +#endif } +#ifdef LEGACY_FLAC FLAC__SeekableStreamDecoderLengthStatus +#else +FLAC__StreamDecoderLengthStatus +#endif flac_reader_c::length_cb(uint64_t &stream_length) { stream_length = file_size; +#ifdef LEGACY_FLAC return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK; +#else + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; +#endif } FLAC__bool