From f8ef25046ecf303bac005ce03ac9a1fbda3dc299 Mon Sep 17 00:00:00 2001 From: Szymon Siwek Date: Wed, 3 Jan 2007 22:04:21 +0000 Subject: [PATCH] - replaced by changeset (modified) from svn.xiph.org; with older version ogg123 crashes when playing flac files Changed files: vorbis-tools-flac.patch -> 1.2 --- vorbis-tools-flac.patch | 614 ++++++++++++++++++++++++++-------------- 1 file changed, 395 insertions(+), 219 deletions(-) diff --git a/vorbis-tools-flac.patch b/vorbis-tools-flac.patch index c574851..0b53cdd 100644 --- a/vorbis-tools-flac.patch +++ b/vorbis-tools-flac.patch @@ -1,59 +1,109 @@ ---- vorbis-tools-1.1.1/configure.ac.orig 2006-12-31 15:14:32.873133000 +0100 -+++ vorbis-tools-1.1.1/configure.ac 2006-12-31 15:29:42.540972076 +0100 -@@ -122,9 +122,9 @@ - AC_MSG_WARN([libFLAC missing]) - have_libFLAC=no, [$FLAC_LIBS] - ) +Index: trunk/vorbis-tools/configure.ac +=================================================================== +--- trunk/vorbis-tools/configure.ac (revision 12197) ++++ trunk/vorbis-tools/configure.ac (revision 12199) +@@ -173,17 +173,33 @@ + + FLAC_LIBS="" + if test "x$build_flac" = xyes; then ++ + AC_CHECK_LIB(m,log,FLAC_LIBS="-lm") +- AC_CHECK_LIB(FLAC, [FLAC__stream_decoder_process_single], +- [have_libFLAC=yes; FLAC_LIBS="-lFLAC $FLAC_LIBS"], +- AC_MSG_WARN([libFLAC missing]) +- have_libFLAC=no, [$FLAC_LIBS] +- ) - AC_CHECK_LIB(OggFLAC, [OggFLAC__stream_decoder_new], - [FLAC_LIBS="-lOggFLAC $FLAC_LIBS $OGG_LIBS"], - AC_MSG_WARN([libOggFLAC missing]) +- have_libFLAC=no, [$FLAC_LIBS $OGG_LIBS] +- ) ++ ++ dnl First check for libFLAC-1.1.3 or later. As of libFLAC 1.1.3, ++ dnl OggFLAC functionality has been rolled into libFLAC rather ++ dnl than being in a separate libOggFLAC library. ++ + AC_CHECK_LIB(FLAC, [FLAC__stream_decoder_init_ogg_stream], -+ [true], -+ AC_MSG_WARN([Ogg support in libFLAC missing]) - have_libFLAC=no, [$FLAC_LIBS $OGG_LIBS] - ) ++ have_libFLAC=yes, have_libFLAC=no, [$FLAC_LIBS $OGG_LIBS]) ++ ++ if test "x$have_libFLAC" = xyes; then ++ FLAC_LIBS="-lFLAC $FLAC_LIBS $OGG_LIBS" ++ else ++ dnl Check for libFLAC prior to 1.1.3 ++ AC_CHECK_LIB(FLAC, [FLAC__stream_decoder_process_single], ++ [have_libFLAC=yes; FLAC_LIBS="-lFLAC $FLAC_LIBS"], ++ AC_MSG_WARN([libFLAC missing]) ++ have_libFLAC=no, [$FLAC_LIBS] ++ ) ++ ++ AC_CHECK_LIB(OggFLAC, [OggFLAC__stream_decoder_new], ++ [FLAC_LIBS="-lOggFLAC $FLAC_LIBS $OGG_LIBS"], ++ AC_MSG_WARN([libOggFLAC missing]) ++ have_libFLAC=no, [$FLAC_LIBS $OGG_LIBS] ++ ) ++ fi ++ AC_CHECK_HEADER(FLAC/stream_decoder.h,, ---- vorbis-tools-1.1.1/ogg123/Makefile.am.orig 2005-06-13 15:11:44.000000000 +0200 -+++ vorbis-tools-1.1.1/ogg123/Makefile.am 2006-12-31 20:59:20.128032533 +0100 -@@ -1,6 +1,6 @@ - ## Process this file with automake to produce Makefile.in - if HAVE_LIBFLAC --flac_sources = flac_format.c easyflac.c easyflac.h -+flac_sources = flac_format.c - else - flac_sources = - endif ---- vorbis-tools-1.1.1/ogg123/flac_format.c.orig 2005-06-03 12:15:09.000000000 +0200 -+++ vorbis-tools-1.1.1/ogg123/flac_format.c 2006-12-31 21:13:50.193614744 +0100 -@@ -21,17 +21,17 @@ + AC_MSG_WARN(libFLAC headers missing) + have_libFLAC=no,[ ]) +Index: trunk/vorbis-tools/ogg123/easyflac.c +=================================================================== +--- trunk/vorbis-tools/ogg123/easyflac.c (revision 12185) ++++ trunk/vorbis-tools/ogg123/easyflac.c (revision 12199) +@@ -37,9 +37,11 @@ + #include + #endif + ++#include ++#if !defined(FLAC_API_VERSION_CURRENT) || (FLAC_API_VERSION_CURRENT < 8) ++ + #include + #include "easyflac.h" +- + + FLAC__bool EasyFLAC__is_oggflac(EasyFLAC__StreamDecoder *decoder) + { +@@ -377,3 +379,5 @@ + else + return FLAC__stream_decoder_process_until_end_of_stream(decoder->flac); + } ++ ++#endif +Index: trunk/vorbis-tools/ogg123/flac_format.c +=================================================================== +--- trunk/vorbis-tools/ogg123/flac_format.c (revision 12185) ++++ trunk/vorbis-tools/ogg123/flac_format.c (revision 12199) +@@ -24,18 +24,26 @@ + #include #include #include - #include -+#include +-#include ++#include #include #include "audio.h" #include "format.h" #include "i18n.h" --#include "easyflac.h" ++#if !defined(FLAC_API_VERSION_CURRENT) || (FLAC_API_VERSION_CURRENT < 8) ++#define NEED_EASYFLAC 1 ++#endif ++#if NEED_EASYFLAC + #include "easyflac.h" ++#endif #include "vorbis_comments.h" - #define DEFAULT_FLAC_FRAME_SIZE 4608 - +-#define DEFAULT_FLAC_FRAME_SIZE 4608 +- typedef struct { -- EasyFLAC__StreamDecoder *decoder; ++#if NEED_EASYFLAC + EasyFLAC__StreamDecoder *decoder; ++#else + FLAC__StreamDecoder *decoder; ++ int is_oggflac; ++#endif short channels; int rate; int bits_per_sample; -@@ -58,6 +58,7 @@ - int buf_fill; /* Number of bytes of audio data in buffer */ - - decoder_stats_t stats; -+ format_t *format; - - } flac_private_t; - -@@ -67,10 +68,10 @@ +@@ -71,10 +79,18 @@ /* Private functions declarations */ @@ -61,293 +111,419 @@ -FLAC__StreamDecoderWriteStatus easyflac_write_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); -void easyflac_metadata_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); -void easyflac_error_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); -+FLAC__StreamDecoderReadStatus flac_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data); -+FLAC__StreamDecoderWriteStatus flac_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); -+void flac_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); -+void flac_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); ++#if NEED_EASYFLAC ++static FLAC__StreamDecoderReadStatus easyflac_read_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data); ++static FLAC__StreamDecoderWriteStatus easyflac_write_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); ++static void easyflac_metadata_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); ++static void easyflac_error_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); ++#else ++static FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); ++static FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); ++static void metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); ++static void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); ++static FLAC__bool eof_callback(const FLAC__StreamDecoder *decoder, void *client_data); ++#endif void resize_buffer(flac_private_t *flac, int newchannels, int newsamples); /*void copy_comments (vorbis_comment *v_comments, FLAC__StreamMetadata_VorbisComment *f_comments);*/ -@@ -154,31 +155,42 @@ - private->buf_fill = 0; +@@ -170,6 +186,7 @@ private->buf_start = 0; + /* Setup FLAC decoder */ ++#if NEED_EASYFLAC + if (oggflac_can_decode(source)) { + decoder->format = &oggflac_format; + private->decoder = EasyFLAC__stream_decoder_new(1); +@@ -187,13 +204,40 @@ + EasyFLAC__set_metadata_respond(private->decoder, FLAC__METADATA_TYPE_STREAMINFO); + EasyFLAC__set_metadata_respond(private->decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT); + EasyFLAC__init(private->decoder); ++#else ++ if (oggflac_can_decode(source)) { ++ private->is_oggflac = 1; ++ decoder->format = &oggflac_format; ++ } else { ++ private->is_oggflac = 0; ++ decoder->format = &flac_format; ++ } + private->decoder = FLAC__stream_decoder_new(); ++ ++ FLAC__stream_decoder_set_md5_checking(private->decoder, false); + FLAC__stream_decoder_set_metadata_respond(private->decoder, FLAC__METADATA_TYPE_STREAMINFO); + FLAC__stream_decoder_set_metadata_respond(private->decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT); - /* Setup FLAC decoder */ - if (oggflac_can_decode(source)) { -- decoder->format = &oggflac_format; -- private->decoder = EasyFLAC__stream_decoder_new(1); -+ private->format = &oggflac_format; -+ FLAC__stream_decoder_init_ogg_stream(private->decoder, -+ flac_read_callback, -+ NULL, -+ NULL, -+ NULL, -+ NULL, -+ flac_write_callback, -+ flac_metadata_callback, -+ flac_error_callback, -+ private); - } else { -- decoder->format = &flac_format; -- private->decoder = EasyFLAC__stream_decoder_new(0); -+ private->format = &flac_format; -+ FLAC__stream_decoder_init_stream(private->decoder, -+ flac_read_callback, -+ NULL, -+ NULL, -+ NULL, -+ NULL, -+ flac_write_callback, -+ flac_metadata_callback, -+ flac_error_callback, -+ private); - } - -- -- EasyFLAC__set_client_data(private->decoder, decoder); -- EasyFLAC__set_read_callback(private->decoder, &easyflac_read_callback); -- EasyFLAC__set_write_callback(private->decoder, &easyflac_write_callback); -- EasyFLAC__set_metadata_callback(private->decoder, &easyflac_metadata_callback); -- EasyFLAC__set_error_callback(private->decoder, &easyflac_error_callback); -- EasyFLAC__set_metadata_respond(private->decoder, FLAC__METADATA_TYPE_STREAMINFO); -- EasyFLAC__set_metadata_respond(private->decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT); -- EasyFLAC__init(private->decoder); -- ++ /*FLAC__stream_decoder_init(private->decoder);*/ ++ if(private->is_oggflac) ++ FLAC__stream_decoder_init_ogg_stream(private->decoder, read_callback, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, eof_callback, write_callback, metadata_callback, error_callback, decoder); ++ else ++ FLAC__stream_decoder_init_stream(private->decoder, read_callback, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, eof_callback, write_callback, metadata_callback, error_callback, decoder); ++#endif + /* Callback will set the total samples and sample rate */ -- EasyFLAC__process_until_end_of_metadata(private->decoder); ++#if NEED_EASYFLAC + EasyFLAC__process_until_end_of_metadata(private->decoder); ++#else + FLAC__stream_decoder_process_until_end_of_metadata(private->decoder); ++#endif /* Callback will set the number of channels and resize the audio buffer */ -- EasyFLAC__process_single(private->decoder); ++#if NEED_EASYFLAC + EasyFLAC__process_single(private->decoder); ++#else + FLAC__stream_decoder_process_single(private->decoder); ++#endif /* FLAC API returns signed samples on all streams */ decoder->actual_fmt.signed_sample = 1; -@@ -241,9 +253,9 @@ +@@ -288,11 +288,11 @@ + if (audio_fmt->word_size == 1) { + for (i = 0; i < priv->channels; i++) + for (j = 0; j < copy; j++) +- buf8[(j+realsamples)*2+i] = (FLAC__int8) (0xFF & priv->buf[i][j+priv->buf_start]); ++ buf8[(j+realsamples)*audio_fmt->channels+i] = (FLAC__int8) (0xFF & priv->buf[i][j+priv->buf_start]); + } else if (audio_fmt->word_size == 2) { + for (i = 0; i < priv->channels; i++) + for (j = 0; j < copy; j++) +- buf16[(j+realsamples)*2+i] = (FLAC__int16) (0xFFFF & priv->buf[i][j+priv->buf_start]); ++ buf16[(j+realsamples)*audio_fmt->channels+i] = (FLAC__int16) (0xFFFF & priv->buf[i][j+priv->buf_start]); + } + + priv->buf_start += copy; +@@ -256,11 +300,19 @@ realsamples += copy; } else if (!priv->eos) { -- ret = EasyFLAC__process_single(priv->decoder); -+ ret = FLAC__stream_decoder_process_single(priv->decoder); ++#if NEED_EASYFLAC + ret = EasyFLAC__process_single(priv->decoder); if (!ret || -- EasyFLAC__get_state(priv->decoder) -+ FLAC__stream_decoder_get_state(priv->decoder) + EasyFLAC__get_state(priv->decoder) == FLAC__STREAM_DECODER_END_OF_STREAM) priv->eos = 1; /* Bail out! */ ++#else ++ ret = FLAC__stream_decoder_process_single(priv->decoder); ++ if (!ret || ++ FLAC__stream_decoder_get_state(priv->decoder) ++ == FLAC__STREAM_DECODER_END_OF_STREAM) ++ priv->eos = 1; /* Bail out! */ ++#endif } else -@@ -311,8 +323,8 @@ + break; + } +@@ -326,8 +378,13 @@ free(priv->buf[i]); free(priv->buf); -- EasyFLAC__finish(priv->decoder); -- EasyFLAC__stream_decoder_delete(priv->decoder); ++#if NEED_EASYFLAC + EasyFLAC__finish(priv->decoder); + EasyFLAC__stream_decoder_delete(priv->decoder); ++#else + FLAC__stream_decoder_finish(priv->decoder); + FLAC__stream_decoder_delete(priv->decoder); ++#endif free(decoder->private); free(decoder); -@@ -342,7 +354,7 @@ +@@ -357,7 +414,11 @@ --FLAC__StreamDecoderReadStatus easyflac_read_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data) -+FLAC__StreamDecoderReadStatus flac_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data) ++#if NEED_EASYFLAC + FLAC__StreamDecoderReadStatus easyflac_read_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data) ++#else ++FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) ++#endif { decoder_t *e_decoder = client_data; flac_private_t *priv = e_decoder->private; -@@ -363,7 +375,7 @@ +@@ -378,7 +439,11 @@ } --FLAC__StreamDecoderWriteStatus easyflac_write_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) -+FLAC__StreamDecoderWriteStatus flac_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) ++#if NEED_EASYFLAC + FLAC__StreamDecoderWriteStatus easyflac_write_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) ++#else ++FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) ++#endif { decoder_t *e_decoder = client_data; flac_private_t *priv = e_decoder->private; -@@ -389,7 +401,7 @@ +@@ -404,7 +469,11 @@ } --void easyflac_metadata_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) -+void flac_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) ++#if NEED_EASYFLAC + void easyflac_metadata_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) ++#else ++void metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) ++#endif { decoder_t *e_decoder = client_data; flac_private_t *priv = e_decoder->private; -@@ -409,7 +421,7 @@ +@@ -424,11 +493,25 @@ } --void easyflac_error_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) -+void flac_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) - { - - -@@ -457,7 +469,7 @@ ++#if NEED_EASYFLAC + void easyflac_error_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) +-{ +- +- +-} ++#else ++void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) ++#endif ++{ ++ ++ ++} ++ ++#if !NEED_EASYFLAC ++FLAC__bool eof_callback(const FLAC__StreamDecoder *decoder, void *client_data) ++{ ++ decoder_t *e_decoder = client_data; ++ flac_private_t *priv = e_decoder->private; ++ ++ return priv->eos; ++} ++#endif + + + void resize_buffer(flac_private_t *flac, int newchannels, int newsamples) +@@ -472,7 +555,11 @@ -- if (EasyFLAC__is_oggflac(priv->decoder)) -+ if (priv->format == &oggflac_format) ++#if NEED_EASYFLAC + if (EasyFLAC__is_oggflac(priv->decoder)) ++#else ++ if (priv->is_oggflac) ++#endif cb->printf_metadata(decoder->callback_arg, 2, _("Ogg FLAC stream: %d bits, %d channel, %ld Hz"), priv->bits_per_sample, ---- vorbis-tools-1.1.1/oggenc/Makefile.am.orig 2005-06-13 15:11:44.000000000 +0200 -+++ vorbis-tools-1.1.1/oggenc/Makefile.am 2006-12-31 21:11:27.609489338 +0100 -@@ -1,6 +1,6 @@ - ## Process this file with automake to produce Makefile.in - if HAVE_LIBFLAC --flac_sources = flac.c flac.h easyflac.c easyflac.h -+flac_sources = flac.c flac.h - else - flac_sources = - endif ---- vorbis-tools-1.1.1/oggenc/flac.h.orig 2005-06-03 12:15:10.000000000 +0200 -+++ vorbis-tools-1.1.1/oggenc/flac.h 2006-12-31 21:12:11.824008980 +0100 -@@ -5,10 +5,10 @@ - #include "encode.h" - #include "audio.h" - #include --#include "easyflac.h" -+#include - - typedef struct { -- EasyFLAC__StreamDecoder *decoder; -+ FLAC__StreamDecoder *decoder; - short channels; - int rate; - long totalsamples; /* per channel, of course */ ---- vorbis-tools-1.1.1/oggenc/flac.c.orig 2005-06-03 12:15:10.000000000 +0200 -+++ vorbis-tools-1.1.1/oggenc/flac.c 2006-12-31 21:11:12.388621950 +0100 -@@ -14,6 +14,7 @@ - #include - #include - #include -+#include - #include "audio.h" - #include "flac.h" - #include "i18n.h" -@@ -22,10 +23,10 @@ - - #define DEFAULT_FLAC_FRAME_SIZE 4608 +Index: trunk/vorbis-tools/oggenc/easyflac.c +=================================================================== +--- trunk/vorbis-tools/oggenc/easyflac.c (revision 12185) ++++ trunk/vorbis-tools/oggenc/easyflac.c (revision 12199) +@@ -37,6 +37,9 @@ + #include + #endif + ++#include ++#if !defined(FLAC_API_VERSION_CURRENT) || (FLAC_API_VERSION_CURRENT < 8) ++ + #include + #include "easyflac.h" + +@@ -377,3 +380,5 @@ + else + return FLAC__stream_decoder_process_until_end_of_stream(decoder->flac); + } ++ ++#endif +Index: trunk/vorbis-tools/oggenc/flac.c +=================================================================== +--- trunk/vorbis-tools/oggenc/flac.c (revision 12198) ++++ trunk/vorbis-tools/oggenc/flac.c (revision 12199) +@@ -20,15 +20,25 @@ + #include "platform.h" + #include "resample.h" + +-#define DEFAULT_FLAC_FRAME_SIZE 4608 ++#if !defined(FLAC_API_VERSION_CURRENT) || (FLAC_API_VERSION_CURRENT < 8) ++#define NEED_EASYFLAC 1 ++#endif ++ ++#if NEED_EASYFLAC ++static FLAC__StreamDecoderReadStatus easyflac_read_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data); ++static FLAC__StreamDecoderWriteStatus easyflac_write_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); ++static void easyflac_metadata_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); ++static void easyflac_error_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); ++#else ++static FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); ++static FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); ++static void metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); ++static void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); ++static FLAC__bool eof_callback(const FLAC__StreamDecoder *decoder, void *client_data); ++#endif -FLAC__StreamDecoderReadStatus easyflac_read_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data); -FLAC__StreamDecoderWriteStatus easyflac_write_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); -void easyflac_metadata_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); -void easyflac_error_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); -+FLAC__StreamDecoderReadStatus flac_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data); -+FLAC__StreamDecoderWriteStatus flac_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); -+void flac_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); -+void flac_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); - - void resize_buffer(flacfile *flac, int newchannels, int newsamples); - void copy_comments (vorbis_comment *v_comments, FLAC__StreamMetadata_VorbisComment *f_comments); -@@ -76,22 +77,38 @@ +- +-void resize_buffer(flacfile *flac, int newchannels, int newsamples); +-void copy_comments (vorbis_comment *v_comments, FLAC__StreamMetadata_VorbisComment *f_comments); ++static void resize_buffer(flacfile *flac, int newchannels, int newsamples); ++static void copy_comments (vorbis_comment *v_comments, FLAC__StreamMetadata_VorbisComment *f_comments); + + + int flac_id(unsigned char *buf, int len) +@@ -43,7 +53,8 @@ + { + if (len < 32) return 0; + +- return memcmp(buf, "OggS", 4) == 0 && flac_id(buf+28, len - 28); ++ return memcmp(buf, "OggS", 4) == 0 && ++ (memcmp (buf+28, "\177FLAC", 5) || flac_id(buf+28, len - 28)); + } + + +@@ -76,6 +87,7 @@ flac->in = in; /* Setup FLAC decoder */ -- flac->decoder = EasyFLAC__stream_decoder_new(oggflac_id(oldbuf, buflen)); -- EasyFLAC__set_client_data(flac->decoder, flac); -- EasyFLAC__set_read_callback(flac->decoder, &easyflac_read_callback); -- EasyFLAC__set_write_callback(flac->decoder, &easyflac_write_callback); -- EasyFLAC__set_metadata_callback(flac->decoder, &easyflac_metadata_callback); -- EasyFLAC__set_error_callback(flac->decoder, &easyflac_error_callback); -- EasyFLAC__set_metadata_respond(flac->decoder, FLAC__METADATA_TYPE_STREAMINFO); -- EasyFLAC__set_metadata_respond(flac->decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT); -- EasyFLAC__init(flac->decoder); -+ flac->decoder = FLAC__stream_decoder_new(); -+ FLAC__stream_decoder_set_metadata_respond(flac->decoder, FLAC__METADATA_TYPE_STREAMINFO); -+ FLAC__stream_decoder_set_metadata_respond(flac->decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT); -+ if(oggflac_id(oldbuf, buflen)) -+ FLAC__stream_decoder_init_ogg_stream(flac->decoder, -+ flac_read_callback, -+ NULL, -+ NULL, -+ NULL, -+ NULL, -+ flac_write_callback, -+ flac_metadata_callback, -+ flac_error_callback, -+ flac); -+ else -+ FLAC__stream_decoder_init_stream(flac->decoder, -+ flac_read_callback, -+ NULL, -+ NULL, -+ NULL, -+ NULL, -+ flac_write_callback, -+ flac_metadata_callback, -+ flac_error_callback, -+ flac); ++#if NEED_EASYFLAC + flac->decoder = EasyFLAC__stream_decoder_new(oggflac_id(oldbuf, buflen)); + EasyFLAC__set_client_data(flac->decoder, flac); + EasyFLAC__set_read_callback(flac->decoder, &easyflac_read_callback); +@@ -85,13 +97,31 @@ + EasyFLAC__set_metadata_respond(flac->decoder, FLAC__METADATA_TYPE_STREAMINFO); + EasyFLAC__set_metadata_respond(flac->decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT); + EasyFLAC__init(flac->decoder); ++#else ++ flac->decoder = FLAC__stream_decoder_new(); ++ FLAC__stream_decoder_set_md5_checking(flac->decoder, false); ++ FLAC__stream_decoder_set_metadata_respond(flac->decoder, FLAC__METADATA_TYPE_STREAMINFO); ++ FLAC__stream_decoder_set_metadata_respond(flac->decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT); ++ if(oggflac_id(oldbuf, buflen)) ++ FLAC__stream_decoder_init_ogg_stream(flac->decoder, read_callback, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, eof_callback, write_callback, metadata_callback, error_callback, flac); ++ else ++ FLAC__stream_decoder_init_stream(flac->decoder, read_callback, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, eof_callback, write_callback, metadata_callback, error_callback, flac); ++#endif /* Callback will set the total samples and sample rate */ -- EasyFLAC__process_until_end_of_metadata(flac->decoder); -+ FLAC__stream_decoder_process_until_end_of_metadata(flac->decoder); ++#if NEED_EASYFLAC + EasyFLAC__process_until_end_of_metadata(flac->decoder); ++#else ++ FLAC__stream_decoder_process_until_end_of_metadata(flac->decoder); ++#endif /* Callback will set the number of channels and resize the audio buffer */ -- EasyFLAC__process_single(flac->decoder); -+ FLAC__stream_decoder_process_single(flac->decoder); ++#if NEED_EASYFLAC + EasyFLAC__process_single(flac->decoder); ++#else ++ FLAC__stream_decoder_process_single(flac->decoder); ++#endif /* Copy format info for caller */ opt->rate = flac->rate; -@@ -133,9 +150,9 @@ +@@ -133,11 +163,19 @@ } else if (!flac->eos) { -- ret = EasyFLAC__process_single(flac->decoder); -+ ret = FLAC__stream_decoder_process_single(flac->decoder); ++#if NEED_EASYFLAC + ret = EasyFLAC__process_single(flac->decoder); if (!ret || -- EasyFLAC__get_state(flac->decoder) -+ FLAC__stream_decoder_get_state(flac->decoder) + EasyFLAC__get_state(flac->decoder) == FLAC__STREAM_DECODER_END_OF_STREAM) flac->eos = 1; /* Bail out! */ ++#else ++ ret = FLAC__stream_decoder_process_single(flac->decoder); ++ if (!ret || ++ FLAC__stream_decoder_get_state(flac->decoder) ++ == FLAC__STREAM_DECODER_END_OF_STREAM) ++ flac->eos = 1; /* Bail out! */ ++#endif } else -@@ -157,13 +174,13 @@ + break; + } +@@ -157,13 +194,21 @@ free(flac->buf); free(flac->oldbuf); free(flac->comments); -- EasyFLAC__finish(flac->decoder); -- EasyFLAC__stream_decoder_delete(flac->decoder); -+ FLAC__stream_decoder_finish(flac->decoder); -+ FLAC__stream_decoder_delete(flac->decoder); ++#if NEED_EASYFLAC + EasyFLAC__finish(flac->decoder); + EasyFLAC__stream_decoder_delete(flac->decoder); ++#else ++ FLAC__stream_decoder_finish(flac->decoder); ++ FLAC__stream_decoder_delete(flac->decoder); ++#endif free(flac); } - --FLAC__StreamDecoderReadStatus easyflac_read_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data) -+FLAC__StreamDecoderReadStatus flac_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data) +- ++#if NEED_EASYFLAC + FLAC__StreamDecoderReadStatus easyflac_read_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data) ++#else ++FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) ++#endif { flacfile *flac = (flacfile *) client_data; int i = 0; -@@ -200,7 +217,7 @@ +@@ -200,7 +245,11 @@ return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; } --FLAC__StreamDecoderWriteStatus easyflac_write_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) -+FLAC__StreamDecoderWriteStatus flac_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) ++#if NEED_EASYFLAC + FLAC__StreamDecoderWriteStatus easyflac_write_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) ++#else ++FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) ++#endif { flacfile *flac = (flacfile *) client_data; int samples = frame->header.blocksize; -@@ -221,7 +238,7 @@ +@@ -221,7 +270,11 @@ return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; } --void easyflac_metadata_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) -+void flac_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) ++#if NEED_EASYFLAC + void easyflac_metadata_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) ++#else ++void metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) ++#endif { flacfile *flac = (flacfile *) client_data; -@@ -240,7 +257,7 @@ +@@ -240,12 +293,24 @@ } } --void easyflac_error_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) -+void flac_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) ++#if NEED_EASYFLAC + void easyflac_error_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) ++#else ++void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) ++#endif { flacfile *flac = (flacfile *) client_data; + } + ++#if !NEED_EASYFLAC ++FLAC__bool eof_callback(const FLAC__StreamDecoder *decoder, void *client_data) ++{ ++ flacfile *flac = (flacfile *) client_data; ++ ++ return feof(flac->in)? true : false; ++} ++#endif + + void resize_buffer(flacfile *flac, int newchannels, int newsamples) + { +Index: trunk/vorbis-tools/oggenc/flac.h +=================================================================== +--- trunk/vorbis-tools/oggenc/flac.h (revision 11665) ++++ trunk/vorbis-tools/oggenc/flac.h (revision 12199) +@@ -5,10 +5,21 @@ + #include "encode.h" + #include "audio.h" + #include ++#include ++#if !defined(FLAC_API_VERSION_CURRENT) || (FLAC_API_VERSION_CURRENT < 8) ++#define NEED_EASYFLAC 1 ++#endif ++#if NEED_EASYFLAC ++#include + #include "easyflac.h" ++#endif + + typedef struct { ++#if NEED_EASYFLAC + EasyFLAC__StreamDecoder *decoder; ++#else ++ FLAC__StreamDecoder *decoder; ++#endif + short channels; + int rate; + long totalsamples; /* per channel, of course */ -- 2.44.0