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