1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
$NetBSD: patch-ac,v 1.1 2007/01/13 23:36:28 wiz Exp $
--- decoders/flac.c.orig 2003-03-10 22:44:14.000000000 +0000
+++ decoders/flac.c
@@ -44,6 +44,16 @@
#define __SDL_SOUND_INTERNAL__
#include "SDL_sound_internal.h"
+#include <FLAC/export.h>
+
+/* FLAC 1.1.3 has FLAC_API_VERSION_CURRENT == 8 */
+#if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT < 8
+#define LEGACY_FLAC
+#else
+#undef LEGACY_FLAC
+#endif
+
+#ifdef LEGACY_FLAC
#include <FLAC/seekable_stream_decoder.h>
#define D_END_OF_STREAM FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM
@@ -80,6 +90,34 @@ typedef FLAC__SeekableStreamDecoderReadS
typedef FLAC__SeekableStreamDecoderSeekStatus d_seek_status_t;
typedef FLAC__SeekableStreamDecoderTellStatus d_tell_status_t;
typedef FLAC__SeekableStreamDecoderLengthStatus d_length_status_t;
+#else
+#include <FLAC/stream_decoder.h>
+
+#define D_END_OF_STREAM FLAC__STREAM_DECODER_END_OF_STREAM
+
+#define d_new() FLAC__stream_decoder_new()
+#define d_process_metadata(x) FLAC__stream_decoder_process_until_end_of_metadata(x)
+#define d_process_one_frame(x) FLAC__stream_decoder_process_single(x)
+#define d_get_state(x) FLAC__stream_decoder_get_state(x)
+#define d_finish(x) FLAC__stream_decoder_finish(x)
+#define d_delete(x) FLAC__stream_decoder_delete(x)
+
+typedef FLAC__StreamDecoder decoder_t;
+typedef FLAC__StreamDecoderReadStatus d_read_status_t;
+
+#define D_SEEK_STATUS_OK FLAC__STREAM_DECODER_SEEK_STATUS_OK
+#define D_SEEK_STATUS_ERROR FLAC__STREAM_DECODER_SEEK_STATUS_ERROR
+#define D_TELL_STATUS_OK FLAC__STREAM_DECODER_TELL_STATUS_OK
+#define D_TELL_STATUS_ERROR FLAC__STREAM_DECODER_TELL_STATUS_ERROR
+#define D_LENGTH_STATUS_OK FLAC__STREAM_DECODER_LENGTH_STATUS_OK
+#define D_LENGTH_STATUS_ERROR FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR
+
+#define d_seek_absolute(x, y) FLAC__stream_decoder_seek_absolute(x, y)
+
+typedef FLAC__StreamDecoderSeekStatus d_seek_status_t;
+typedef FLAC__StreamDecoderTellStatus d_tell_status_t;
+typedef FLAC__StreamDecoderLengthStatus d_length_status_t;
+#endif
#define D_WRITE_CONTINUE FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE
#define D_READ_END_OF_STREAM FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM
@@ -141,9 +179,15 @@ static void free_flac(flac_t *f)
} /* free_flac */
+#ifdef LEGACY_FLAC
static d_read_status_t read_callback(
const decoder_t *decoder, FLAC__byte buffer[],
unsigned int *bytes, void *client_data)
+#else
+static d_read_status_t read_callback(
+ const decoder_t *decoder, FLAC__byte buffer[],
+ size_t *bytes, void *client_data)
+#endif
{
flac_t *f = (flac_t *) client_data;
Uint32 retval;
@@ -400,6 +444,7 @@ static int FLAC_open(Sound_Sample *sampl
BAIL_MACRO(ERR_OUT_OF_MEMORY, 0);
} /* if */
+#ifdef LEGACY_FLAC
d_set_read_callback(decoder, read_callback);
d_set_write_callback(decoder, write_callback);
d_set_metadata_callback(decoder, metadata_callback);
@@ -410,6 +455,7 @@ static int FLAC_open(Sound_Sample *sampl
d_set_eof_callback(decoder, eof_callback);
d_set_client_data(decoder, f);
+#endif
f->rw = internal->rw;
f->sample = sample;
@@ -418,7 +464,12 @@ static int FLAC_open(Sound_Sample *sampl
f->is_flac = 0 /* !!! FIXME: should be "has_extension", not "0". */;
internal->decoder_private = f;
+ /* really should check the init return value here: */
+#ifdef LEGACY_FLAC
d_init(decoder);
+#else
+ FLAC__stream_decoder_init_stream(decoder, read_callback, seek_callback, tell_callback, length_callback, eof_callback, write_callback, metadata_callback, error_callback, f);
+#endif
sample->flags = SOUND_SAMPLEFLAG_NONE;
|