$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 <string.h>
 #include <ogg/ogg.h>
 #include <vorbis/codec.h>
-#if defined(HAVE_FLAC_FORMAT_H)
-#include <FLAC/seekable_stream_decoder.h>
-#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
