xref: /aosp_15_r20/external/flac/src/libFLAC++/stream_decoder.cpp (revision 600f14f40d737144c998e2ec7a483122d3776fbc)
1*600f14f4SXin Li /* libFLAC++ - Free Lossless Audio Codec library
2*600f14f4SXin Li  * Copyright (C) 2002-2009  Josh Coalson
3*600f14f4SXin Li  * Copyright (C) 2011-2023  Xiph.Org Foundation
4*600f14f4SXin Li  *
5*600f14f4SXin Li  * Redistribution and use in source and binary forms, with or without
6*600f14f4SXin Li  * modification, are permitted provided that the following conditions
7*600f14f4SXin Li  * are met:
8*600f14f4SXin Li  *
9*600f14f4SXin Li  * - Redistributions of source code must retain the above copyright
10*600f14f4SXin Li  * notice, this list of conditions and the following disclaimer.
11*600f14f4SXin Li  *
12*600f14f4SXin Li  * - Redistributions in binary form must reproduce the above copyright
13*600f14f4SXin Li  * notice, this list of conditions and the following disclaimer in the
14*600f14f4SXin Li  * documentation and/or other materials provided with the distribution.
15*600f14f4SXin Li  *
16*600f14f4SXin Li  * - Neither the name of the Xiph.org Foundation nor the names of its
17*600f14f4SXin Li  * contributors may be used to endorse or promote products derived from
18*600f14f4SXin Li  * this software without specific prior written permission.
19*600f14f4SXin Li  *
20*600f14f4SXin Li  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*600f14f4SXin Li  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*600f14f4SXin Li  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23*600f14f4SXin Li  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
24*600f14f4SXin Li  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*600f14f4SXin Li  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26*600f14f4SXin Li  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27*600f14f4SXin Li  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28*600f14f4SXin Li  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29*600f14f4SXin Li  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30*600f14f4SXin Li  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*600f14f4SXin Li  */
32*600f14f4SXin Li 
33*600f14f4SXin Li #ifdef HAVE_CONFIG_H
34*600f14f4SXin Li #include "config.h"
35*600f14f4SXin Li #endif
36*600f14f4SXin Li 
37*600f14f4SXin Li #include "FLAC++/decoder.h"
38*600f14f4SXin Li #include "FLAC/assert.h"
39*600f14f4SXin Li 
40*600f14f4SXin Li #ifdef _MSC_VER
41*600f14f4SXin Li // warning C4800: 'int' : forcing to bool 'true' or 'false' (performance warning)
42*600f14f4SXin Li #pragma warning ( disable : 4800 )
43*600f14f4SXin Li #endif
44*600f14f4SXin Li 
45*600f14f4SXin Li namespace FLAC {
46*600f14f4SXin Li 	namespace Decoder {
47*600f14f4SXin Li 
48*600f14f4SXin Li 		// ------------------------------------------------------------
49*600f14f4SXin Li 		//
50*600f14f4SXin Li 		// Stream
51*600f14f4SXin Li 		//
52*600f14f4SXin Li 		// ------------------------------------------------------------
53*600f14f4SXin Li 
Stream()54*600f14f4SXin Li 		Stream::Stream():
55*600f14f4SXin Li 		decoder_(::FLAC__stream_decoder_new())
56*600f14f4SXin Li 		{ }
57*600f14f4SXin Li 
~Stream()58*600f14f4SXin Li 		Stream::~Stream()
59*600f14f4SXin Li 		{
60*600f14f4SXin Li 			if(0 != decoder_) {
61*600f14f4SXin Li 				(void)::FLAC__stream_decoder_finish(decoder_);
62*600f14f4SXin Li 				::FLAC__stream_decoder_delete(decoder_);
63*600f14f4SXin Li 			}
64*600f14f4SXin Li 		}
65*600f14f4SXin Li 
is_valid() const66*600f14f4SXin Li 		bool Stream::is_valid() const
67*600f14f4SXin Li 		{
68*600f14f4SXin Li 			return 0 != decoder_;
69*600f14f4SXin Li 		}
70*600f14f4SXin Li 
set_ogg_serial_number(long value)71*600f14f4SXin Li 		bool Stream::set_ogg_serial_number(long value)
72*600f14f4SXin Li 		{
73*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
74*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_set_ogg_serial_number(decoder_, value));
75*600f14f4SXin Li 		}
76*600f14f4SXin Li 
set_md5_checking(bool value)77*600f14f4SXin Li 		bool Stream::set_md5_checking(bool value)
78*600f14f4SXin Li 		{
79*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
80*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_set_md5_checking(decoder_, value));
81*600f14f4SXin Li 		}
82*600f14f4SXin Li 
set_metadata_respond(::FLAC__MetadataType type)83*600f14f4SXin Li 		bool Stream::set_metadata_respond(::FLAC__MetadataType type)
84*600f14f4SXin Li 		{
85*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
86*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_set_metadata_respond(decoder_, type));
87*600f14f4SXin Li 		}
88*600f14f4SXin Li 
set_metadata_respond_application(const FLAC__byte id[4])89*600f14f4SXin Li 		bool Stream::set_metadata_respond_application(const FLAC__byte id[4])
90*600f14f4SXin Li 		{
91*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
92*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_set_metadata_respond_application(decoder_, id));
93*600f14f4SXin Li 		}
94*600f14f4SXin Li 
set_metadata_respond_all()95*600f14f4SXin Li 		bool Stream::set_metadata_respond_all()
96*600f14f4SXin Li 		{
97*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
98*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_set_metadata_respond_all(decoder_));
99*600f14f4SXin Li 		}
100*600f14f4SXin Li 
set_metadata_ignore(::FLAC__MetadataType type)101*600f14f4SXin Li 		bool Stream::set_metadata_ignore(::FLAC__MetadataType type)
102*600f14f4SXin Li 		{
103*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
104*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_set_metadata_ignore(decoder_, type));
105*600f14f4SXin Li 		}
106*600f14f4SXin Li 
set_metadata_ignore_application(const FLAC__byte id[4])107*600f14f4SXin Li 		bool Stream::set_metadata_ignore_application(const FLAC__byte id[4])
108*600f14f4SXin Li 		{
109*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
110*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_set_metadata_ignore_application(decoder_, id));
111*600f14f4SXin Li 		}
112*600f14f4SXin Li 
set_metadata_ignore_all()113*600f14f4SXin Li 		bool Stream::set_metadata_ignore_all()
114*600f14f4SXin Li 		{
115*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
116*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_set_metadata_ignore_all(decoder_));
117*600f14f4SXin Li 		}
118*600f14f4SXin Li 
get_state() const119*600f14f4SXin Li 		Stream::State Stream::get_state() const
120*600f14f4SXin Li 		{
121*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
122*600f14f4SXin Li 			return State(::FLAC__stream_decoder_get_state(decoder_));
123*600f14f4SXin Li 		}
124*600f14f4SXin Li 
get_md5_checking() const125*600f14f4SXin Li 		bool Stream::get_md5_checking() const
126*600f14f4SXin Li 		{
127*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
128*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_get_md5_checking(decoder_));
129*600f14f4SXin Li 		}
130*600f14f4SXin Li 
get_total_samples() const131*600f14f4SXin Li 		FLAC__uint64 Stream::get_total_samples() const
132*600f14f4SXin Li 		{
133*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
134*600f14f4SXin Li 			return ::FLAC__stream_decoder_get_total_samples(decoder_);
135*600f14f4SXin Li 		}
136*600f14f4SXin Li 
get_channels() const137*600f14f4SXin Li 		uint32_t Stream::get_channels() const
138*600f14f4SXin Li 		{
139*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
140*600f14f4SXin Li 			return ::FLAC__stream_decoder_get_channels(decoder_);
141*600f14f4SXin Li 		}
142*600f14f4SXin Li 
get_channel_assignment() const143*600f14f4SXin Li 		::FLAC__ChannelAssignment Stream::get_channel_assignment() const
144*600f14f4SXin Li 		{
145*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
146*600f14f4SXin Li 			return ::FLAC__stream_decoder_get_channel_assignment(decoder_);
147*600f14f4SXin Li 		}
148*600f14f4SXin Li 
get_bits_per_sample() const149*600f14f4SXin Li 		uint32_t Stream::get_bits_per_sample() const
150*600f14f4SXin Li 		{
151*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
152*600f14f4SXin Li 			return ::FLAC__stream_decoder_get_bits_per_sample(decoder_);
153*600f14f4SXin Li 		}
154*600f14f4SXin Li 
get_sample_rate() const155*600f14f4SXin Li 		uint32_t Stream::get_sample_rate() const
156*600f14f4SXin Li 		{
157*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
158*600f14f4SXin Li 			return ::FLAC__stream_decoder_get_sample_rate(decoder_);
159*600f14f4SXin Li 		}
160*600f14f4SXin Li 
get_blocksize() const161*600f14f4SXin Li 		uint32_t Stream::get_blocksize() const
162*600f14f4SXin Li 		{
163*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
164*600f14f4SXin Li 			return ::FLAC__stream_decoder_get_blocksize(decoder_);
165*600f14f4SXin Li 		}
166*600f14f4SXin Li 
get_decode_position(FLAC__uint64 * position) const167*600f14f4SXin Li 		bool Stream::get_decode_position(FLAC__uint64 *position) const
168*600f14f4SXin Li 		{
169*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
170*600f14f4SXin Li 			return ::FLAC__stream_decoder_get_decode_position(decoder_, position);
171*600f14f4SXin Li 		}
172*600f14f4SXin Li 
init()173*600f14f4SXin Li 		::FLAC__StreamDecoderInitStatus Stream::init()
174*600f14f4SXin Li 		{
175*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
176*600f14f4SXin Li 			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);
177*600f14f4SXin Li 		}
178*600f14f4SXin Li 
init_ogg()179*600f14f4SXin Li 		::FLAC__StreamDecoderInitStatus Stream::init_ogg()
180*600f14f4SXin Li 		{
181*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
182*600f14f4SXin Li 			return ::FLAC__stream_decoder_init_ogg_stream(decoder_, read_callback_, seek_callback_, tell_callback_, length_callback_, eof_callback_, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this);
183*600f14f4SXin Li 		}
184*600f14f4SXin Li 
finish()185*600f14f4SXin Li 		bool Stream::finish()
186*600f14f4SXin Li 		{
187*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
188*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_finish(decoder_));
189*600f14f4SXin Li 		}
190*600f14f4SXin Li 
flush()191*600f14f4SXin Li 		bool Stream::flush()
192*600f14f4SXin Li 		{
193*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
194*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_flush(decoder_));
195*600f14f4SXin Li 		}
196*600f14f4SXin Li 
reset()197*600f14f4SXin Li 		bool Stream::reset()
198*600f14f4SXin Li 		{
199*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
200*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_reset(decoder_));
201*600f14f4SXin Li 		}
202*600f14f4SXin Li 
process_single()203*600f14f4SXin Li 		bool Stream::process_single()
204*600f14f4SXin Li 		{
205*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
206*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_process_single(decoder_));
207*600f14f4SXin Li 		}
208*600f14f4SXin Li 
process_until_end_of_metadata()209*600f14f4SXin Li 		bool Stream::process_until_end_of_metadata()
210*600f14f4SXin Li 		{
211*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
212*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_process_until_end_of_metadata(decoder_));
213*600f14f4SXin Li 		}
214*600f14f4SXin Li 
process_until_end_of_stream()215*600f14f4SXin Li 		bool Stream::process_until_end_of_stream()
216*600f14f4SXin Li 		{
217*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
218*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_process_until_end_of_stream(decoder_));
219*600f14f4SXin Li 		}
220*600f14f4SXin Li 
skip_single_frame()221*600f14f4SXin Li 		bool Stream::skip_single_frame()
222*600f14f4SXin Li 		{
223*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
224*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_skip_single_frame(decoder_));
225*600f14f4SXin Li 		}
226*600f14f4SXin Li 
seek_absolute(FLAC__uint64 sample)227*600f14f4SXin Li 		bool Stream::seek_absolute(FLAC__uint64 sample)
228*600f14f4SXin Li 		{
229*600f14f4SXin Li 			FLAC__ASSERT(is_valid());
230*600f14f4SXin Li 			return static_cast<bool>(::FLAC__stream_decoder_seek_absolute(decoder_, sample));
231*600f14f4SXin Li 		}
232*600f14f4SXin Li 
seek_callback(FLAC__uint64 absolute_byte_offset)233*600f14f4SXin Li 		::FLAC__StreamDecoderSeekStatus Stream::seek_callback(FLAC__uint64 absolute_byte_offset)
234*600f14f4SXin Li 		{
235*600f14f4SXin Li 			(void)absolute_byte_offset;
236*600f14f4SXin Li 			return ::FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED;
237*600f14f4SXin Li 		}
238*600f14f4SXin Li 
tell_callback(FLAC__uint64 * absolute_byte_offset)239*600f14f4SXin Li 		::FLAC__StreamDecoderTellStatus Stream::tell_callback(FLAC__uint64 *absolute_byte_offset)
240*600f14f4SXin Li 		{
241*600f14f4SXin Li 			(void)absolute_byte_offset;
242*600f14f4SXin Li 			return ::FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED;
243*600f14f4SXin Li 		}
244*600f14f4SXin Li 
length_callback(FLAC__uint64 * stream_length)245*600f14f4SXin Li 		::FLAC__StreamDecoderLengthStatus Stream::length_callback(FLAC__uint64 *stream_length)
246*600f14f4SXin Li 		{
247*600f14f4SXin Li 			(void)stream_length;
248*600f14f4SXin Li 			return ::FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED;
249*600f14f4SXin Li 		}
250*600f14f4SXin Li 
eof_callback()251*600f14f4SXin Li 		bool Stream::eof_callback()
252*600f14f4SXin Li 		{
253*600f14f4SXin Li 			return false;
254*600f14f4SXin Li 		}
255*600f14f4SXin Li 
metadata_callback(const::FLAC__StreamMetadata * metadata)256*600f14f4SXin Li 		void Stream::metadata_callback(const ::FLAC__StreamMetadata *metadata)
257*600f14f4SXin Li 		{
258*600f14f4SXin Li 			(void)metadata;
259*600f14f4SXin Li 		}
260*600f14f4SXin Li 
read_callback_(const::FLAC__StreamDecoder * decoder,FLAC__byte buffer[],size_t * bytes,void * client_data)261*600f14f4SXin Li 		::FLAC__StreamDecoderReadStatus Stream::read_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
262*600f14f4SXin Li 		{
263*600f14f4SXin Li 			(void)decoder;
264*600f14f4SXin Li 			FLAC__ASSERT(0 != client_data);
265*600f14f4SXin Li 			Stream *instance = reinterpret_cast<Stream *>(client_data);
266*600f14f4SXin Li 			FLAC__ASSERT(0 != instance);
267*600f14f4SXin Li 			return instance->read_callback(buffer, bytes);
268*600f14f4SXin Li 		}
269*600f14f4SXin Li 
seek_callback_(const::FLAC__StreamDecoder * decoder,FLAC__uint64 absolute_byte_offset,void * client_data)270*600f14f4SXin Li 		::FLAC__StreamDecoderSeekStatus Stream::seek_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
271*600f14f4SXin Li 		{
272*600f14f4SXin Li 			(void) decoder;
273*600f14f4SXin Li 			FLAC__ASSERT(0 != client_data);
274*600f14f4SXin Li 			Stream *instance = reinterpret_cast<Stream *>(client_data);
275*600f14f4SXin Li 			FLAC__ASSERT(0 != instance);
276*600f14f4SXin Li 			return instance->seek_callback(absolute_byte_offset);
277*600f14f4SXin Li 		}
278*600f14f4SXin Li 
tell_callback_(const::FLAC__StreamDecoder * decoder,FLAC__uint64 * absolute_byte_offset,void * client_data)279*600f14f4SXin Li 		::FLAC__StreamDecoderTellStatus Stream::tell_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
280*600f14f4SXin Li 		{
281*600f14f4SXin Li 			(void) decoder;
282*600f14f4SXin Li 			FLAC__ASSERT(0 != client_data);
283*600f14f4SXin Li 			Stream *instance = reinterpret_cast<Stream *>(client_data);
284*600f14f4SXin Li 			FLAC__ASSERT(0 != instance);
285*600f14f4SXin Li 			return instance->tell_callback(absolute_byte_offset);
286*600f14f4SXin Li 		}
287*600f14f4SXin Li 
length_callback_(const::FLAC__StreamDecoder * decoder,FLAC__uint64 * stream_length,void * client_data)288*600f14f4SXin Li 		::FLAC__StreamDecoderLengthStatus Stream::length_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
289*600f14f4SXin Li 		{
290*600f14f4SXin Li 			(void) decoder;
291*600f14f4SXin Li 			FLAC__ASSERT(0 != client_data);
292*600f14f4SXin Li 			Stream *instance = reinterpret_cast<Stream *>(client_data);
293*600f14f4SXin Li 			FLAC__ASSERT(0 != instance);
294*600f14f4SXin Li 			return instance->length_callback(stream_length);
295*600f14f4SXin Li 		}
296*600f14f4SXin Li 
eof_callback_(const::FLAC__StreamDecoder * decoder,void * client_data)297*600f14f4SXin Li 		FLAC__bool Stream::eof_callback_(const ::FLAC__StreamDecoder *decoder, void *client_data)
298*600f14f4SXin Li 		{
299*600f14f4SXin Li 			(void) decoder;
300*600f14f4SXin Li 			FLAC__ASSERT(0 != client_data);
301*600f14f4SXin Li 			Stream *instance = reinterpret_cast<Stream *>(client_data);
302*600f14f4SXin Li 			FLAC__ASSERT(0 != instance);
303*600f14f4SXin Li 			return instance->eof_callback();
304*600f14f4SXin Li 		}
305*600f14f4SXin Li 
write_callback_(const::FLAC__StreamDecoder * decoder,const::FLAC__Frame * frame,const FLAC__int32 * const buffer[],void * client_data)306*600f14f4SXin Li 		::FLAC__StreamDecoderWriteStatus Stream::write_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
307*600f14f4SXin Li 		{
308*600f14f4SXin Li 			(void)decoder;
309*600f14f4SXin Li 			FLAC__ASSERT(0 != client_data);
310*600f14f4SXin Li 			Stream *instance = reinterpret_cast<Stream *>(client_data);
311*600f14f4SXin Li 			FLAC__ASSERT(0 != instance);
312*600f14f4SXin Li 			return instance->write_callback(frame, buffer);
313*600f14f4SXin Li 		}
314*600f14f4SXin Li 
metadata_callback_(const::FLAC__StreamDecoder * decoder,const::FLAC__StreamMetadata * metadata,void * client_data)315*600f14f4SXin Li 		void Stream::metadata_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__StreamMetadata *metadata, void *client_data)
316*600f14f4SXin Li 		{
317*600f14f4SXin Li 			(void)decoder;
318*600f14f4SXin Li 			FLAC__ASSERT(0 != client_data);
319*600f14f4SXin Li 			Stream *instance = reinterpret_cast<Stream *>(client_data);
320*600f14f4SXin Li 			FLAC__ASSERT(0 != instance);
321*600f14f4SXin Li 			instance->metadata_callback(metadata);
322*600f14f4SXin Li 		}
323*600f14f4SXin Li 
error_callback_(const::FLAC__StreamDecoder * decoder,::FLAC__StreamDecoderErrorStatus status,void * client_data)324*600f14f4SXin Li 		void Stream::error_callback_(const ::FLAC__StreamDecoder *decoder, ::FLAC__StreamDecoderErrorStatus status, void *client_data)
325*600f14f4SXin Li 		{
326*600f14f4SXin Li 			(void)decoder;
327*600f14f4SXin Li 			FLAC__ASSERT(0 != client_data);
328*600f14f4SXin Li 			Stream *instance = reinterpret_cast<Stream *>(client_data);
329*600f14f4SXin Li 			FLAC__ASSERT(0 != instance);
330*600f14f4SXin Li 			instance->error_callback(status);
331*600f14f4SXin Li 		}
332*600f14f4SXin Li 
333*600f14f4SXin Li 		// ------------------------------------------------------------
334*600f14f4SXin Li 		//
335*600f14f4SXin Li 		// File
336*600f14f4SXin Li 		//
337*600f14f4SXin Li 		// ------------------------------------------------------------
338*600f14f4SXin Li 
File()339*600f14f4SXin Li 		File::File():
340*600f14f4SXin Li 			Stream()
341*600f14f4SXin Li 		{ }
342*600f14f4SXin Li 
~File()343*600f14f4SXin Li 		File::~File()
344*600f14f4SXin Li 		{
345*600f14f4SXin Li 		}
346*600f14f4SXin Li 
init(FILE * file)347*600f14f4SXin Li 		::FLAC__StreamDecoderInitStatus File::init(FILE *file)
348*600f14f4SXin Li 		{
349*600f14f4SXin Li 			FLAC__ASSERT(0 != decoder_);
350*600f14f4SXin Li 			return ::FLAC__stream_decoder_init_FILE(decoder_, file, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this);
351*600f14f4SXin Li 		}
352*600f14f4SXin Li 
init(const char * filename)353*600f14f4SXin Li 		::FLAC__StreamDecoderInitStatus File::init(const char *filename)
354*600f14f4SXin Li 		{
355*600f14f4SXin Li 			FLAC__ASSERT(0 != decoder_);
356*600f14f4SXin Li 			return ::FLAC__stream_decoder_init_file(decoder_, filename, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this);
357*600f14f4SXin Li 		}
358*600f14f4SXin Li 
init(const std::string & filename)359*600f14f4SXin Li 		::FLAC__StreamDecoderInitStatus File::init(const std::string &filename)
360*600f14f4SXin Li 		{
361*600f14f4SXin Li 			return init(filename.c_str());
362*600f14f4SXin Li 		}
363*600f14f4SXin Li 
init_ogg(FILE * file)364*600f14f4SXin Li 		::FLAC__StreamDecoderInitStatus File::init_ogg(FILE *file)
365*600f14f4SXin Li 		{
366*600f14f4SXin Li 			FLAC__ASSERT(0 != decoder_);
367*600f14f4SXin Li 			return ::FLAC__stream_decoder_init_ogg_FILE(decoder_, file, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this);
368*600f14f4SXin Li 		}
369*600f14f4SXin Li 
init_ogg(const char * filename)370*600f14f4SXin Li 		::FLAC__StreamDecoderInitStatus File::init_ogg(const char *filename)
371*600f14f4SXin Li 		{
372*600f14f4SXin Li 			FLAC__ASSERT(0 != decoder_);
373*600f14f4SXin Li 			return ::FLAC__stream_decoder_init_ogg_file(decoder_, filename, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this);
374*600f14f4SXin Li 		}
375*600f14f4SXin Li 
init_ogg(const std::string & filename)376*600f14f4SXin Li 		::FLAC__StreamDecoderInitStatus File::init_ogg(const std::string &filename)
377*600f14f4SXin Li 		{
378*600f14f4SXin Li 			return init_ogg(filename.c_str());
379*600f14f4SXin Li 		}
380*600f14f4SXin Li 
381*600f14f4SXin Li 		// This is a dummy to satisfy the pure virtual from Stream; the
382*600f14f4SXin Li 		// read callback will never be called since we are initializing
383*600f14f4SXin Li 		// with FLAC__stream_decoder_init_FILE() or
384*600f14f4SXin Li 		// FLAC__stream_decoder_init_file() and those supply the read
385*600f14f4SXin Li 		// callback internally.
read_callback(FLAC__byte buffer[],size_t * bytes)386*600f14f4SXin Li 		::FLAC__StreamDecoderReadStatus File::read_callback(FLAC__byte buffer[], size_t *bytes)
387*600f14f4SXin Li 		{
388*600f14f4SXin Li 			(void)buffer, (void)bytes;
389*600f14f4SXin Li 			FLAC__ASSERT(false);
390*600f14f4SXin Li 			return ::FLAC__STREAM_DECODER_READ_STATUS_ABORT; // double protection
391*600f14f4SXin Li 		}
392*600f14f4SXin Li 
393*600f14f4SXin Li 	} // namespace Decoder
394*600f14f4SXin Li } // namespace FLAC
395