annotate decoders/flac.c @ 562:7e08477b0fc1

MP3 decoder upgrade work. Ripped out SMPEG and mpglib support, replaced it with "mpg123.c" and libmpg123. libmpg123 is a much better version of mpglib, so it should solve all the problems about MP3's not seeking, or most modern MP3's not playing at all, etc. Since you no longer have to make a tradeoff with SMPEG for features, and SMPEG is basically rotting, I removed it from the project. There is still work to be done with libmpg123...there are MMX, 3DNow, SSE, Altivec, etc decoders which we don't have enabled at the moment, and the build system could use some work to make this compile more cleanly, etc. Still: huge win.
author Ryan C. Gordon <icculus@icculus.org>
date Fri, 30 Jan 2009 02:44:47 -0500
parents 2e8907ff98e9
children
rev   line source
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1 /*
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
2 * SDL_sound -- An abstract sound format decoding API.
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
3 * Copyright (C) 2001 Ryan C. Gordon.
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
4 *
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
8 * version 2.1 of the License, or (at your option) any later version.
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
9 *
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
13 * Lesser General Public License for more details.
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
14 *
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
18 */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
19
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
20 /*
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
21 * FLAC decoder for SDL_sound.
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
22 *
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
23 * This driver handles FLAC audio, that is to say the Free Lossless Audio
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
24 * Codec. It depends on libFLAC for decoding, which can be grabbed from:
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
25 * http://flac.sourceforge.net
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
26 *
552
2e8907ff98e9 Replaced references to COPYING with references to LICENSE.txt ...
Ryan C. Gordon <icculus@icculus.org>
parents: 536
diff changeset
27 * Please see the file LICENSE.txt in the source's root directory.
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
28 *
536
8a814bbbedfa Merged r544:545 from branches/stable-1.0: converted to UTF-8 encoding.
Ryan C. Gordon <icculus@icculus.org>
parents: 516
diff changeset
29 * This file written by Torbjörn Andersson. (d91tan@Update.UU.SE)
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
30 */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
31
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
32 #if HAVE_CONFIG_H
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
33 # include <config.h>
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
34 #endif
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
35
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
36 #ifdef SOUND_SUPPORTS_FLAC
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
37
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
38 #include <stdio.h>
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
39 #include <stdlib.h>
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
40 #include <string.h>
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
41
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
42 #include "SDL_sound.h"
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
43
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
44 #define __SDL_SOUND_INTERNAL__
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
45 #include "SDL_sound_internal.h"
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
46
516
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
47 #include <FLAC/export.h>
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
48
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
49 /* FLAC 1.1.3 has FLAC_API_VERSION_CURRENT == 8 */
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
50 #if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT < 8
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
51 #define LEGACY_FLAC
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
52 #else
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
53 #undef LEGACY_FLAC
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
54 #endif
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
55
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
56 #ifdef LEGACY_FLAC
443
30f96c853462 MacOS X build fixes.
Ryan C. Gordon <icculus@icculus.org>
parents: 422
diff changeset
57 #include <FLAC/seekable_stream_decoder.h>
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
58
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
59 #define D_END_OF_STREAM FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
60
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
61 #define d_new() FLAC__seekable_stream_decoder_new()
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
62 #define d_init(x) FLAC__seekable_stream_decoder_init(x)
422
5b06e23d934e Removed backwards compatible API nastiness from FLAC decoder.
Ryan C. Gordon <icculus@icculus.org>
parents: 400
diff changeset
63 #define d_process_metadata(x) FLAC__seekable_stream_decoder_process_until_end_of_metadata(x)
5b06e23d934e Removed backwards compatible API nastiness from FLAC decoder.
Ryan C. Gordon <icculus@icculus.org>
parents: 400
diff changeset
64 #define d_process_one_frame(x) FLAC__seekable_stream_decoder_process_single(x)
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
65 #define d_get_state(x) FLAC__seekable_stream_decoder_get_state(x)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
66 #define d_finish(x) FLAC__seekable_stream_decoder_finish(x)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
67 #define d_delete(x) FLAC__seekable_stream_decoder_delete(x)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
68 #define d_set_read_callback(x, y) FLAC__seekable_stream_decoder_set_read_callback(x, y)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
69 #define d_set_write_callback(x, y) FLAC__seekable_stream_decoder_set_write_callback(x, y)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
70 #define d_set_metadata_callback(x, y) FLAC__seekable_stream_decoder_set_metadata_callback(x, y)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
71 #define d_set_error_callback(x, y) FLAC__seekable_stream_decoder_set_error_callback(x, y)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
72 #define d_set_client_data(x, y) FLAC__seekable_stream_decoder_set_client_data(x, y)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
73
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
74 typedef FLAC__SeekableStreamDecoder decoder_t;
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
75 typedef FLAC__SeekableStreamDecoderReadStatus d_read_status_t;
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
76
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
77 #define D_SEEK_STATUS_OK FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
78 #define D_SEEK_STATUS_ERROR FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
79 #define D_TELL_STATUS_OK FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
80 #define D_TELL_STATUS_ERROR FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
81 #define D_LENGTH_STATUS_OK FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
82 #define D_LENGTH_STATUS_ERROR FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
83
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
84 #define d_set_seek_callback(x, y) FLAC__seekable_stream_decoder_set_seek_callback(x, y)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
85 #define d_set_tell_callback(x, y) FLAC__seekable_stream_decoder_set_tell_callback(x, y)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
86 #define d_set_length_callback(x, y) FLAC__seekable_stream_decoder_set_length_callback(x, y)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
87 #define d_set_eof_callback(x, y) FLAC__seekable_stream_decoder_set_eof_callback(x, y)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
88 #define d_seek_absolute(x, y) FLAC__seekable_stream_decoder_seek_absolute(x, y)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
89
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
90 typedef FLAC__SeekableStreamDecoderSeekStatus d_seek_status_t;
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
91 typedef FLAC__SeekableStreamDecoderTellStatus d_tell_status_t;
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
92 typedef FLAC__SeekableStreamDecoderLengthStatus d_length_status_t;
516
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
93 #else
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
94 #include <FLAC/stream_decoder.h>
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
95
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
96 #define D_END_OF_STREAM FLAC__STREAM_DECODER_END_OF_STREAM
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
97
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
98 #define d_new() FLAC__stream_decoder_new()
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
99 #define d_process_metadata(x) FLAC__stream_decoder_process_until_end_of_metadata(x)
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
100 #define d_process_one_frame(x) FLAC__stream_decoder_process_single(x)
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
101 #define d_get_state(x) FLAC__stream_decoder_get_state(x)
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
102 #define d_finish(x) FLAC__stream_decoder_finish(x)
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
103 #define d_delete(x) FLAC__stream_decoder_delete(x)
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
104
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
105 typedef FLAC__StreamDecoder decoder_t;
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
106 typedef FLAC__StreamDecoderReadStatus d_read_status_t;
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
107
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
108 #define D_SEEK_STATUS_OK FLAC__STREAM_DECODER_SEEK_STATUS_OK
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
109 #define D_SEEK_STATUS_ERROR FLAC__STREAM_DECODER_SEEK_STATUS_ERROR
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
110 #define D_TELL_STATUS_OK FLAC__STREAM_DECODER_TELL_STATUS_OK
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
111 #define D_TELL_STATUS_ERROR FLAC__STREAM_DECODER_TELL_STATUS_ERROR
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
112 #define D_LENGTH_STATUS_OK FLAC__STREAM_DECODER_LENGTH_STATUS_OK
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
113 #define D_LENGTH_STATUS_ERROR FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
114
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
115 #define d_seek_absolute(x, y) FLAC__stream_decoder_seek_absolute(x, y)
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
116
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
117 typedef FLAC__StreamDecoderSeekStatus d_seek_status_t;
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
118 typedef FLAC__StreamDecoderTellStatus d_tell_status_t;
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
119 typedef FLAC__StreamDecoderLengthStatus d_length_status_t;
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
120 #endif
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
121
393
b12c4483815e Handles all versions of libFLAC up to version 1.0.3, now.
Ryan C. Gordon <icculus@icculus.org>
parents: 387
diff changeset
122 #define D_WRITE_CONTINUE FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE
b12c4483815e Handles all versions of libFLAC up to version 1.0.3, now.
Ryan C. Gordon <icculus@icculus.org>
parents: 387
diff changeset
123 #define D_READ_END_OF_STREAM FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM
b12c4483815e Handles all versions of libFLAC up to version 1.0.3, now.
Ryan C. Gordon <icculus@icculus.org>
parents: 387
diff changeset
124 #define D_READ_ABORT FLAC__STREAM_DECODER_READ_STATUS_ABORT
b12c4483815e Handles all versions of libFLAC up to version 1.0.3, now.
Ryan C. Gordon <icculus@icculus.org>
parents: 387
diff changeset
125 #define D_READ_CONTINUE FLAC__STREAM_DECODER_READ_STATUS_CONTINUE
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
126
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
127 #define d_error_status_string FLAC__StreamDecoderErrorStatusString
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
128
393
b12c4483815e Handles all versions of libFLAC up to version 1.0.3, now.
Ryan C. Gordon <icculus@icculus.org>
parents: 387
diff changeset
129 typedef FLAC__StreamDecoderErrorStatus d_error_status_t;
b12c4483815e Handles all versions of libFLAC up to version 1.0.3, now.
Ryan C. Gordon <icculus@icculus.org>
parents: 387
diff changeset
130 typedef FLAC__StreamMetadata d_metadata_t;
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
131 typedef FLAC__StreamDecoderWriteStatus d_write_status_t;
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
132
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
133
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
134 static int FLAC_init(void);
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
135 static void FLAC_quit(void);
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
136 static int FLAC_open(Sound_Sample *sample, const char *ext);
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
137 static void FLAC_close(Sound_Sample *sample);
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
138 static Uint32 FLAC_read(Sound_Sample *sample);
221
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
139 static int FLAC_rewind(Sound_Sample *sample);
306
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 231
diff changeset
140 static int FLAC_seek(Sound_Sample *sample, Uint32 ms);
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
141
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
142 static const char *extensions_flac[] = { "FLAC", "FLA", NULL };
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
143
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
144 const Sound_DecoderFunctions __Sound_DecoderFunctions_FLAC =
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
145 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
146 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
147 extensions_flac,
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
148 "Free Lossless Audio Codec",
536
8a814bbbedfa Merged r544:545 from branches/stable-1.0: converted to UTF-8 encoding.
Ryan C. Gordon <icculus@icculus.org>
parents: 516
diff changeset
149 "Torbjörn Andersson <d91tan@Update.UU.SE>",
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
150 "http://flac.sourceforge.net/"
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
151 },
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
152
221
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
153 FLAC_init, /* init() method */
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
154 FLAC_quit, /* quit() method */
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
155 FLAC_open, /* open() method */
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
156 FLAC_close, /* close() method */
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
157 FLAC_read, /* read() method */
306
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 231
diff changeset
158 FLAC_rewind, /* rewind() method */
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 231
diff changeset
159 FLAC_seek /* seek() method */
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
160 };
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
161
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
162 /* This is what we store in our internal->decoder_private field. */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
163 typedef struct
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
164 {
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
165 decoder_t *decoder;
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
166 SDL_RWops *rw;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
167 Sound_Sample *sample;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
168 Uint32 frame_size;
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
169 Uint8 is_flac;
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
170 Uint32 stream_length;
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
171 } flac_t;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
172
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
173
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
174 static void free_flac(flac_t *f)
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
175 {
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
176 d_finish(f->decoder);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
177 d_delete(f->decoder);
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
178 free(f);
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
179 } /* free_flac */
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
180
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
181
516
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
182 #ifdef LEGACY_FLAC
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
183 static d_read_status_t read_callback(
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
184 const decoder_t *decoder, FLAC__byte buffer[],
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
185 unsigned int *bytes, void *client_data)
516
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
186 #else
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
187 static d_read_status_t read_callback(
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
188 const decoder_t *decoder, FLAC__byte buffer[],
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
189 size_t *bytes, void *client_data)
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
190 #endif
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
191 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
192 flac_t *f = (flac_t *) client_data;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
193 Uint32 retval;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
194
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
195 retval = SDL_RWread(f->rw, (Uint8 *) buffer, 1, *bytes);
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
196
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
197 if (retval == 0)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
198 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
199 *bytes = 0;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
200 f->sample->flags |= SOUND_SAMPLEFLAG_EOF;
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
201 return(D_READ_END_OF_STREAM);
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
202 } /* if */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
203
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
204 if (retval == -1)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
205 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
206 *bytes = 0;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
207 f->sample->flags |= SOUND_SAMPLEFLAG_ERROR;
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
208 return(D_READ_ABORT);
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
209 } /* if */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
210
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
211 if (retval < *bytes)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
212 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
213 *bytes = retval;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
214 f->sample->flags |= SOUND_SAMPLEFLAG_EAGAIN;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
215 } /* if */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
216
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
217 return(D_READ_CONTINUE);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
218 } /* read_callback */
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
219
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
220
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
221 static d_write_status_t write_callback(
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
222 const decoder_t *decoder, const FLAC__Frame *frame,
393
b12c4483815e Handles all versions of libFLAC up to version 1.0.3, now.
Ryan C. Gordon <icculus@icculus.org>
parents: 387
diff changeset
223 const FLAC__int32 * const buffer[],
b12c4483815e Handles all versions of libFLAC up to version 1.0.3, now.
Ryan C. Gordon <icculus@icculus.org>
parents: 387
diff changeset
224 void *client_data)
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
225 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
226 flac_t *f = (flac_t *) client_data;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
227 Uint32 i, j;
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
228 Uint32 sample;
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
229 Uint8 *dst;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
230
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
231 f->frame_size = frame->header.channels * frame->header.blocksize
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
232 * frame->header.bits_per_sample / 8;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
233
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
234 if (f->frame_size > f->sample->buffer_size)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
235 Sound_SetBufferSize(f->sample, f->frame_size);
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
236
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
237 dst = f->sample->buffer;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
238
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
239 /* If the sample is neither exactly 8-bit nor 16-bit, it will have to
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
240 * be converted. Unfortunately the buffer is read-only, so we either
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
241 * have to check for each sample, or make a copy of the buffer. I'm
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
242 * not sure which way is best, so I've arbitrarily picked the former.
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
243 */
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
244 if (f->sample->actual.format == AUDIO_S8)
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
245 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
246 for (i = 0; i < frame->header.blocksize; i++)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
247 for (j = 0; j < frame->header.channels; j++)
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
248 {
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
249 sample = buffer[j][i];
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
250 if (frame->header.bits_per_sample < 8)
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
251 sample <<= (8 - frame->header.bits_per_sample);
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
252 *dst++ = sample & 0x00ff;
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
253 } /* for */
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
254 } /* if */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
255 else
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
256 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
257 for (i = 0; i < frame->header.blocksize; i++)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
258 for (j = 0; j < frame->header.channels; j++)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
259 {
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
260 sample = buffer[j][i];
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
261 if (frame->header.bits_per_sample < 16)
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
262 sample <<= (16 - frame->header.bits_per_sample);
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
263 else if (frame->header.bits_per_sample > 16)
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
264 sample >>= (frame->header.bits_per_sample - 16);
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
265 *dst++ = (sample & 0xff00) >> 8;
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
266 *dst++ = sample & 0x00ff;
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
267 } /* for */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
268 } /* else */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
269
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
270 return(D_WRITE_CONTINUE);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
271 } /* write_callback */
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
272
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
273
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
274 static void metadata_callback(
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
275 const decoder_t *decoder,
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
276 const d_metadata_t *metadata,
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
277 void *client_data)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
278 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
279 flac_t *f = (flac_t *) client_data;
477
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
280 Sound_Sample *sample = f->sample;
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
281 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
282
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
283 SNDDBG(("FLAC: Metadata callback.\n"));
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
284
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
285 /* There are several kinds of metadata, but STREAMINFO is the only
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
286 * one that always has to be there.
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
287 */
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
288 if (metadata->type == FLAC__METADATA_TYPE_STREAMINFO)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
289 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
290 SNDDBG(("FLAC: Metadata is streaminfo.\n"));
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
291
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
292 f->is_flac = 1;
477
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
293 sample->actual.channels = metadata->data.stream_info.channels;
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
294 sample->actual.rate = metadata->data.stream_info.sample_rate;
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
295
477
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
296 if (metadata->data.stream_info.sample_rate == 0 ||
474
c66080364dff Most decoders now report total sample play time, now. Technically, this
Ryan C. Gordon <icculus@icculus.org>
parents: 443
diff changeset
297 metadata->data.stream_info.total_samples == 0)
477
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
298 {
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
299 internal->total_time = -1;
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
300 } /* if */
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
301 else
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
302 {
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
303 internal->total_time = (metadata->data.stream_info.total_samples)
474
c66080364dff Most decoders now report total sample play time, now. Technically, this
Ryan C. Gordon <icculus@icculus.org>
parents: 443
diff changeset
304 / metadata->data.stream_info.sample_rate * 1000;
477
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
305 internal->total_time += (metadata->data.stream_info.total_samples
474
c66080364dff Most decoders now report total sample play time, now. Technically, this
Ryan C. Gordon <icculus@icculus.org>
parents: 443
diff changeset
306 % metadata->data.stream_info.sample_rate) * 1000
c66080364dff Most decoders now report total sample play time, now. Technically, this
Ryan C. Gordon <icculus@icculus.org>
parents: 443
diff changeset
307 / metadata->data.stream_info.sample_rate;
477
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
308 } /* else */
474
c66080364dff Most decoders now report total sample play time, now. Technically, this
Ryan C. Gordon <icculus@icculus.org>
parents: 443
diff changeset
309
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
310 if (metadata->data.stream_info.bits_per_sample > 8)
477
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
311 sample->actual.format = AUDIO_S16MSB;
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
312 else
477
3e705c9180e5 Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents: 474
diff changeset
313 sample->actual.format = AUDIO_S8;
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
314 } /* if */
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
315 } /* metadata_callback */
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
316
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
317
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
318 static void error_callback(
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
319 const decoder_t *decoder,
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
320 d_error_status_t status,
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
321 void *client_data)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
322 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
323 flac_t *f = (flac_t *) client_data;
164
77482005beb6 Now includes FLAC/stream_decoder.h instead of FLAC/all.h. More robust
Ryan C. Gordon <icculus@icculus.org>
parents: 155
diff changeset
324
387
fb519e6028e3 Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents: 377
diff changeset
325 __Sound_SetError(d_error_status_string[status]);
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
326 f->sample->flags |= SOUND_SAMPLEFLAG_ERROR;
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
327 } /* error_callback */
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
328
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
329
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
330 static d_seek_status_t seek_callback(
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
331 const decoder_t *decoder,
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
332 FLAC__uint64 absolute_byte_offset,
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
333 void *client_data)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
334 {
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
335 flac_t *f = (flac_t *) client_data;
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
336
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
337 if (SDL_RWseek(f->rw, absolute_byte_offset, SEEK_SET) >= 0)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
338 {
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
339 return(D_SEEK_STATUS_OK);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
340 } /* if */
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
341
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
342 return(D_SEEK_STATUS_ERROR);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
343 } /* seek_callback*/
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
344
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
345
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
346 static d_tell_status_t tell_callback(
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
347 const decoder_t *decoder,
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
348 FLAC__uint64 *absolute_byte_offset,
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
349 void *client_data)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
350 {
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
351 flac_t *f = (flac_t *) client_data;
400
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
352 int pos;
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
353
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
354 pos = SDL_RWtell(f->rw);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
355
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
356 if (pos < 0)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
357 {
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
358 return(D_TELL_STATUS_ERROR);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
359 } /* if */
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
360
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
361 *absolute_byte_offset = pos;
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
362 return(D_TELL_STATUS_OK);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
363 } /* tell_callback */
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
364
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
365
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
366 static d_length_status_t length_callback(
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
367 const decoder_t *decoder,
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
368 FLAC__uint64 *stream_length,
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
369 void *client_data)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
370 {
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
371 flac_t *f = (flac_t *) client_data;
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
372
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
373 if (f->sample->flags & SOUND_SAMPLEFLAG_CANSEEK)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
374 {
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
375 *stream_length = f->stream_length;
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
376 return(D_LENGTH_STATUS_OK);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
377 } /* if */
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
378
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
379 return(D_LENGTH_STATUS_ERROR);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
380 } /* length_callback */
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
381
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
382
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
383 static FLAC__bool eof_callback(
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
384 const decoder_t *decoder,
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
385 void *client_data)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
386 {
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
387 flac_t *f = (flac_t *) client_data;
400
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
388 int pos;
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
389
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
390 /* Maybe we could check for SOUND_SAMPLEFLAG_EOF here instead? */
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
391 pos = SDL_RWtell(f->rw);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
392
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
393 if (pos >= 0 && pos >= f->stream_length)
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
394 {
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
395 return(true);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
396 } /* if */
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
397
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
398 return(false);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
399 } /* eof_callback */
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
400
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
401
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
402 static int FLAC_init(void)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
403 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
404 return(1); /* always succeeds. */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
405 } /* FLAC_init */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
406
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
407
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
408 static void FLAC_quit(void)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
409 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
410 /* it's a no-op. */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
411 } /* FLAC_quit */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
412
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
413
182
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
414 #define FLAC_MAGIC 0x43614C66 /* "fLaC" in ASCII. */
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
415
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
416 static int FLAC_open(Sound_Sample *sample, const char *ext)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
417 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
418 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
419 SDL_RWops *rw = internal->rw;
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
420 decoder_t *decoder;
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
421 flac_t *f;
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
422 int i;
182
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
423 int has_extension = 0;
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
424 Uint32 pos;
182
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
425
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
426 /*
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
427 * If the extension is "flac", we'll believe that this is really meant
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
428 * to be a FLAC stream, and will try to grok it from existing metadata.
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
429 * metadata searching can be a very expensive operation, however, so
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
430 * unless the user swears that it is a FLAC stream through the extension,
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
431 * we decide what to do based on the existance of a 32-bit magic number.
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
432 */
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
433 for (i = 0; extensions_flac[i] != NULL; i++)
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
434 {
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
435 if (__Sound_strcasecmp(ext, extensions_flac[i]) == 0)
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
436 {
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
437 has_extension = 1;
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
438 break;
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
439 } /* if */
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
440 } /* for */
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
441
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
442 if (!has_extension)
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
443 {
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
444 int rc;
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
445 Uint32 flac_magic = SDL_ReadLE32(rw);
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
446 BAIL_IF_MACRO(flac_magic != FLAC_MAGIC, "FLAC: Not a FLAC stream.", 0);
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
447
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
448 /* move back over magic number for metadata scan... */
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
449 rc = SDL_RWseek(internal->rw, -sizeof (flac_magic), SEEK_CUR);
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
450 BAIL_IF_MACRO(rc < 0, ERR_IO_ERROR, 0);
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
451 } /* if */
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
452
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
453 f = (flac_t *) malloc(sizeof (flac_t));
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
454 BAIL_IF_MACRO(f == NULL, ERR_OUT_OF_MEMORY, 0);
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
455
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
456 decoder = d_new();
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
457 if (decoder == NULL)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
458 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
459 free(f);
387
fb519e6028e3 Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents: 377
diff changeset
460 BAIL_MACRO(ERR_OUT_OF_MEMORY, 0);
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
461 } /* if */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
462
516
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
463 #ifdef LEGACY_FLAC
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
464 d_set_read_callback(decoder, read_callback);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
465 d_set_write_callback(decoder, write_callback);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
466 d_set_metadata_callback(decoder, metadata_callback);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
467 d_set_error_callback(decoder, error_callback);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
468 d_set_seek_callback(decoder, seek_callback);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
469 d_set_tell_callback(decoder, tell_callback);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
470 d_set_length_callback(decoder, length_callback);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
471 d_set_eof_callback(decoder, eof_callback);
422
5b06e23d934e Removed backwards compatible API nastiness from FLAC decoder.
Ryan C. Gordon <icculus@icculus.org>
parents: 400
diff changeset
472
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
473 d_set_client_data(decoder, f);
516
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
474 #endif
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
475
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
476 f->rw = internal->rw;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
477 f->sample = sample;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
478 f->decoder = decoder;
164
77482005beb6 Now includes FLAC/stream_decoder.h instead of FLAC/all.h. More robust
Ryan C. Gordon <icculus@icculus.org>
parents: 155
diff changeset
479 f->sample->actual.format = 0;
182
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
480 f->is_flac = 0 /* !!! FIXME: should be "has_extension", not "0". */;
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
481
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
482 internal->decoder_private = f;
516
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
483 /* really should check the init return value here: */
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
484 #ifdef LEGACY_FLAC
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
485 d_init(decoder);
516
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
486 #else
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
487 FLAC__stream_decoder_init_stream(decoder, read_callback, seek_callback,
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
488 tell_callback, length_callback,
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
489 eof_callback, write_callback,
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
490 metadata_callback, error_callback, f);
46d5f399cb35 Patch from stable-1.0 branch r528:529.
Ryan C. Gordon <icculus@icculus.org>
parents: 477
diff changeset
491 #endif
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
492
400
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
493 sample->flags = SOUND_SAMPLEFLAG_NONE;
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
494
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
495 pos = SDL_RWtell(f->rw);
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
496 if (SDL_RWseek(f->rw, 0, SEEK_END) > 0)
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
497 {
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
498 f->stream_length = SDL_RWtell(f->rw);
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
499 if (SDL_RWseek(f->rw, pos, SEEK_SET) == -1)
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
500 {
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
501 free_flac(f);
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
502 BAIL_MACRO(ERR_IO_ERROR, 0);
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
503 } /* if */
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
504 sample->flags = SOUND_SAMPLEFLAG_CANSEEK;
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
505 } /* if */
9d0b5ec9cc26 FIXME cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 393
diff changeset
506
231
d3dc34315ac7 Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
507 /*
182
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
508 * If we are not sure this is a FLAC stream, check for the STREAMINFO
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
509 * metadata block. If not, we'd have to peek at the first audio frame
182
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
510 * and get the sound format from there, but that is not yet
3849438b735e Checks magic number again, unless the file extension is recognized.
Ryan C. Gordon <icculus@icculus.org>
parents: 166
diff changeset
511 * implemented.
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
512 */
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
513 if (!f->is_flac)
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
514 {
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
515 d_process_metadata(decoder);
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
516
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
517 /* Still not FLAC? Give up. */
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
518 if (!f->is_flac)
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
519 {
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
520 free_flac(f);
387
fb519e6028e3 Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents: 377
diff changeset
521 BAIL_MACRO("FLAC: No metadata found. Not a FLAC stream?", 0);
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
522 } /* if */
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
523 } /* if */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
524
164
77482005beb6 Now includes FLAC/stream_decoder.h instead of FLAC/all.h. More robust
Ryan C. Gordon <icculus@icculus.org>
parents: 155
diff changeset
525 SNDDBG(("FLAC: Accepting data stream.\n"));
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
526 return(1);
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
527 } /* FLAC_open */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
528
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
529
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
530 static void FLAC_close(Sound_Sample *sample)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
531 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
532 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
533 flac_t *f = (flac_t *) internal->decoder_private;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
534
166
d8904267d23c Cleanups, fixes and enhancements by Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents: 164
diff changeset
535 free_flac(f);
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
536 } /* FLAC_close */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
537
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
538
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
539 static Uint32 FLAC_read(Sound_Sample *sample)
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
540 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
541 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
542 flac_t *f = (flac_t *) internal->decoder_private;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
543 Uint32 len;
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
544
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
545 if (!d_process_one_frame(f->decoder))
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
546 {
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
547 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
387
fb519e6028e3 Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents: 377
diff changeset
548 BAIL_MACRO("FLAC: Couldn't decode frame.", 0);
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
549 } /* if */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
550
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
551 if (d_get_state(f->decoder) == D_END_OF_STREAM)
231
d3dc34315ac7 Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
552 {
d3dc34315ac7 Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
553 sample->flags |= SOUND_SAMPLEFLAG_EOF;
d3dc34315ac7 Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
554 return(0);
d3dc34315ac7 Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
555 } /* if */
d3dc34315ac7 Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
556
164
77482005beb6 Now includes FLAC/stream_decoder.h instead of FLAC/all.h. More robust
Ryan C. Gordon <icculus@icculus.org>
parents: 155
diff changeset
557 /* An error may have been signalled through the error callback. */
77482005beb6 Now includes FLAC/stream_decoder.h instead of FLAC/all.h. More robust
Ryan C. Gordon <icculus@icculus.org>
parents: 155
diff changeset
558 if (sample->flags & SOUND_SAMPLEFLAG_ERROR)
77482005beb6 Now includes FLAC/stream_decoder.h instead of FLAC/all.h. More robust
Ryan C. Gordon <icculus@icculus.org>
parents: 155
diff changeset
559 return(0);
231
d3dc34315ac7 Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
560
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
561 return(f->frame_size);
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
562 } /* FLAC_read */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
563
221
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
564
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
565 static int FLAC_rewind(Sound_Sample *sample)
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
566 {
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
567 return FLAC_seek(sample, 0);
221
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
568 } /* FLAC_rewind */
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
569
306
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 231
diff changeset
570
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 231
diff changeset
571 static int FLAC_seek(Sound_Sample *sample, Uint32 ms)
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 231
diff changeset
572 {
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
573 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
574 flac_t *f = (flac_t *) internal->decoder_private;
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
575
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
576 d_seek_absolute(f->decoder, (ms * sample->actual.rate) / 1000);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
577 return(1);
306
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 231
diff changeset
578 } /* FLAC_seek */
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 231
diff changeset
579
155
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
580 #endif /* SOUND_SUPPORTS_FLAC */
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
581
72ff7d3a25b6 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
582 /* end of flac.c ... */