bump libtool .so number in prep for release
[platform/upstream/flac.git] / src / libFLAC++ / stream_decoder.cpp
1 /* libFLAC++ - Free Lossless Audio Codec library
2  * Copyright (C) 2002,2003,2004,2005,2006  Josh Coalson
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * - Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * - Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  *
15  * - Neither the name of the Xiph.org Foundation nor the names of its
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #include "FLAC++/decoder.h"
33 #include "FLAC/assert.h"
34
35 #ifdef _MSC_VER
36 // warning C4800: 'int' : forcing to bool 'true' or 'false' (performance warning)
37 #pragma warning ( disable : 4800 )
38 #endif
39
40 namespace FLAC {
41         namespace Decoder {
42
43                 Stream::Stream():
44                 decoder_(::FLAC__stream_decoder_new())
45                 { }
46
47                 Stream::Stream(::FLAC__StreamDecoder *decoder):
48                 decoder_(decoder)
49                 { }
50
51                 Stream::~Stream()
52                 {
53             // WATCHOUT: must check for NULL not only because
54             // ::FLAC__stream_encoder_new() might have failed in
55             // the constructor, but also because
56             // OggFLAC::Encoder::Stream deletes the encoder_ before
57             // we get to it here to make the C inheritance magic
58             // work.
59                         if(0 != decoder_) {
60                                 ::FLAC__stream_decoder_finish(decoder_);
61                                 ::FLAC__stream_decoder_delete(decoder_);
62                         }
63                 }
64
65                 bool Stream::is_valid() const
66                 {
67                         return 0 != decoder_;
68                 }
69
70                 bool Stream::set_md5_checking(bool value)
71                 {
72                         FLAC__ASSERT(is_valid());
73                         return (bool)::FLAC__stream_decoder_set_md5_checking(decoder_, value);
74                 }
75
76                 bool Stream::set_metadata_respond(::FLAC__MetadataType type)
77                 {
78                         FLAC__ASSERT(is_valid());
79                         return (bool)::FLAC__stream_decoder_set_metadata_respond(decoder_, type);
80                 }
81
82                 bool Stream::set_metadata_respond_application(const FLAC__byte id[4])
83                 {
84                         FLAC__ASSERT(is_valid());
85                         return (bool)::FLAC__stream_decoder_set_metadata_respond_application(decoder_, id);
86                 }
87
88                 bool Stream::set_metadata_respond_all()
89                 {
90                         FLAC__ASSERT(is_valid());
91                         return (bool)::FLAC__stream_decoder_set_metadata_respond_all(decoder_);
92                 }
93
94                 bool Stream::set_metadata_ignore(::FLAC__MetadataType type)
95                 {
96                         FLAC__ASSERT(is_valid());
97                         return (bool)::FLAC__stream_decoder_set_metadata_ignore(decoder_, type);
98                 }
99
100                 bool Stream::set_metadata_ignore_application(const FLAC__byte id[4])
101                 {
102                         FLAC__ASSERT(is_valid());
103                         return (bool)::FLAC__stream_decoder_set_metadata_ignore_application(decoder_, id);
104                 }
105
106                 bool Stream::set_metadata_ignore_all()
107                 {
108                         FLAC__ASSERT(is_valid());
109                         return (bool)::FLAC__stream_decoder_set_metadata_ignore_all(decoder_);
110                 }
111
112                 Stream::State Stream::get_state() const
113                 {
114                         FLAC__ASSERT(is_valid());
115                         return State(::FLAC__stream_decoder_get_state(decoder_));
116                 }
117
118                 bool Stream::get_md5_checking() const
119                 {
120                         FLAC__ASSERT(is_valid());
121                         return (bool)::FLAC__stream_decoder_get_md5_checking(decoder_);
122                 }
123
124                 FLAC__uint64 Stream::get_total_samples() const
125                 {
126                         FLAC__ASSERT(is_valid());
127                         return ::FLAC__stream_decoder_get_total_samples(decoder_);
128                 }
129
130                 unsigned Stream::get_channels() const
131                 {
132                         FLAC__ASSERT(is_valid());
133                         return ::FLAC__stream_decoder_get_channels(decoder_);
134                 }
135
136                 ::FLAC__ChannelAssignment Stream::get_channel_assignment() const
137                 {
138                         FLAC__ASSERT(is_valid());
139                         return ::FLAC__stream_decoder_get_channel_assignment(decoder_);
140                 }
141
142                 unsigned Stream::get_bits_per_sample() const
143                 {
144                         FLAC__ASSERT(is_valid());
145                         return ::FLAC__stream_decoder_get_bits_per_sample(decoder_);
146                 }
147
148                 unsigned Stream::get_sample_rate() const
149                 {
150                         FLAC__ASSERT(is_valid());
151                         return ::FLAC__stream_decoder_get_sample_rate(decoder_);
152                 }
153
154                 unsigned Stream::get_blocksize() const
155                 {
156                         FLAC__ASSERT(is_valid());
157                         return ::FLAC__stream_decoder_get_blocksize(decoder_);
158                 }
159
160                 ::FLAC__StreamDecoderInitStatus Stream::init()
161                 {
162                         FLAC__ASSERT(is_valid());
163                         return ::FLAC__stream_decoder_init_stream(decoder_, read_callback_, seek_callback_, tell_callback_, length_callback_, eof_callback_, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this);
164                 }
165
166                 void Stream::finish()
167                 {
168                         FLAC__ASSERT(is_valid());
169                         ::FLAC__stream_decoder_finish(decoder_);
170                 }
171
172                 bool Stream::flush()
173                 {
174                         FLAC__ASSERT(is_valid());
175                         return (bool)::FLAC__stream_decoder_flush(decoder_);
176                 }
177
178                 bool Stream::reset()
179                 {
180                         FLAC__ASSERT(is_valid());
181                         return (bool)::FLAC__stream_decoder_reset(decoder_);
182                 }
183
184                 bool Stream::process_single()
185                 {
186                         FLAC__ASSERT(is_valid());
187                         return (bool)::FLAC__stream_decoder_process_single(decoder_);
188                 }
189
190                 bool Stream::process_until_end_of_metadata()
191                 {
192                         FLAC__ASSERT(is_valid());
193                         return (bool)::FLAC__stream_decoder_process_until_end_of_metadata(decoder_);
194                 }
195
196                 bool Stream::process_until_end_of_stream()
197                 {
198                         FLAC__ASSERT(is_valid());
199                         return (bool)::FLAC__stream_decoder_process_until_end_of_stream(decoder_);
200                 }
201
202                 bool Stream::skip_single_frame()
203                 {
204                         FLAC__ASSERT(is_valid());
205                         return (bool)::FLAC__stream_decoder_skip_single_frame(decoder_);
206                 }
207
208                 bool Stream::seek_absolute(FLAC__uint64 sample)
209                 {
210                         FLAC__ASSERT(is_valid());
211                         return (bool)::FLAC__stream_decoder_seek_absolute(decoder_, sample);
212                 }
213
214                 ::FLAC__StreamDecoderSeekStatus Stream::seek_callback(FLAC__uint64 absolute_byte_offset)
215                 {
216                         (void)absolute_byte_offset;
217                         return ::FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED;
218                 }
219
220                 ::FLAC__StreamDecoderTellStatus Stream::tell_callback(FLAC__uint64 *absolute_byte_offset)
221                 {
222                         (void)absolute_byte_offset;
223                         return ::FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED;
224                 }
225
226                 ::FLAC__StreamDecoderLengthStatus Stream::length_callback(FLAC__uint64 *stream_length)
227                 {
228                         (void)stream_length;
229                         return ::FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED;
230                 }
231
232                 bool Stream::eof_callback()
233                 {
234                         return false;
235                 }
236
237                 void Stream::metadata_callback(const ::FLAC__StreamMetadata *metadata)
238                 {
239                         (void)metadata;
240                 }
241
242                 ::FLAC__StreamDecoderReadStatus Stream::read_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
243                 {
244                         (void)decoder;
245                         FLAC__ASSERT(0 != client_data);
246                         Stream *instance = reinterpret_cast<Stream *>(client_data);
247                         FLAC__ASSERT(0 != instance);
248                         return instance->read_callback(buffer, bytes);
249                 }
250
251                 ::FLAC__StreamDecoderSeekStatus Stream::seek_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
252                 {
253                         (void) decoder;
254                         FLAC__ASSERT(0 != client_data);
255                         Stream *instance = reinterpret_cast<Stream *>(client_data);
256                         FLAC__ASSERT(0 != instance);
257                         return instance->seek_callback(absolute_byte_offset);
258                 }
259
260                 ::FLAC__StreamDecoderTellStatus Stream::tell_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
261                 {
262                         (void) decoder;
263                         FLAC__ASSERT(0 != client_data);
264                         Stream *instance = reinterpret_cast<Stream *>(client_data);
265                         FLAC__ASSERT(0 != instance);
266                         return instance->tell_callback(absolute_byte_offset);
267                 }
268
269                 ::FLAC__StreamDecoderLengthStatus Stream::length_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
270                 {
271                         (void) decoder;
272                         FLAC__ASSERT(0 != client_data);
273                         Stream *instance = reinterpret_cast<Stream *>(client_data);
274                         FLAC__ASSERT(0 != instance);
275                         return instance->length_callback(stream_length);
276                 }
277
278                 FLAC__bool Stream::eof_callback_(const ::FLAC__StreamDecoder *decoder, void *client_data)
279                 {
280                         (void) decoder;
281                         FLAC__ASSERT(0 != client_data);
282                         Stream *instance = reinterpret_cast<Stream *>(client_data);
283                         FLAC__ASSERT(0 != instance);
284                         return instance->eof_callback();
285                 }
286
287                 ::FLAC__StreamDecoderWriteStatus Stream::write_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
288                 {
289                         (void)decoder;
290                         FLAC__ASSERT(0 != client_data);
291                         Stream *instance = reinterpret_cast<Stream *>(client_data);
292                         FLAC__ASSERT(0 != instance);
293                         return instance->write_callback(frame, buffer);
294                 }
295
296                 void Stream::metadata_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__StreamMetadata *metadata, void *client_data)
297                 {
298                         (void)decoder;
299                         FLAC__ASSERT(0 != client_data);
300                         Stream *instance = reinterpret_cast<Stream *>(client_data);
301                         FLAC__ASSERT(0 != instance);
302                         instance->metadata_callback(metadata);
303                 }
304
305                 void Stream::error_callback_(const ::FLAC__StreamDecoder *decoder, ::FLAC__StreamDecoderErrorStatus status, void *client_data)
306                 {
307                         (void)decoder;
308                         FLAC__ASSERT(0 != client_data);
309                         Stream *instance = reinterpret_cast<Stream *>(client_data);
310                         FLAC__ASSERT(0 != instance);
311                         instance->error_callback(status);
312                 }
313
314         }
315 }