1
1
/* libFLAC++ - Free Lossless Audio Codec library
2
* Copyright (C) 2002,2003,2004,2005 Josh Coalson
2
* Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson
4
4
* Redistribution and use in source and binary forms, with or without
5
5
* modification, are permitted provided that the following conditions
57
63
return 0 != decoder_;
66
bool Stream::set_ogg_serial_number(long value)
68
FLAC__ASSERT(is_valid());
69
return (bool)::FLAC__stream_decoder_set_ogg_serial_number(decoder_, value);
72
bool Stream::set_md5_checking(bool value)
74
FLAC__ASSERT(is_valid());
75
return (bool)::FLAC__stream_decoder_set_md5_checking(decoder_, value);
60
78
bool Stream::set_metadata_respond(::FLAC__MetadataType type)
62
80
FLAC__ASSERT(is_valid());
99
117
return State(::FLAC__stream_decoder_get_state(decoder_));
120
bool Stream::get_md5_checking() const
122
FLAC__ASSERT(is_valid());
123
return (bool)::FLAC__stream_decoder_get_md5_checking(decoder_);
126
FLAC__uint64 Stream::get_total_samples() const
128
FLAC__ASSERT(is_valid());
129
return ::FLAC__stream_decoder_get_total_samples(decoder_);
102
132
unsigned Stream::get_channels() const
104
134
FLAC__ASSERT(is_valid());
129
159
return ::FLAC__stream_decoder_get_blocksize(decoder_);
132
Stream::State Stream::init()
134
FLAC__ASSERT(is_valid());
135
::FLAC__stream_decoder_set_read_callback(decoder_, read_callback_);
136
::FLAC__stream_decoder_set_write_callback(decoder_, write_callback_);
137
::FLAC__stream_decoder_set_metadata_callback(decoder_, metadata_callback_);
138
::FLAC__stream_decoder_set_error_callback(decoder_, error_callback_);
139
::FLAC__stream_decoder_set_client_data(decoder_, (void*)this);
140
return State(::FLAC__stream_decoder_init(decoder_));
143
void Stream::finish()
145
FLAC__ASSERT(is_valid());
146
::FLAC__stream_decoder_finish(decoder_);
162
bool Stream::get_decode_position(FLAC__uint64 *position) const
164
FLAC__ASSERT(is_valid());
165
return ::FLAC__stream_decoder_get_decode_position(decoder_, position);
168
::FLAC__StreamDecoderInitStatus Stream::init()
170
FLAC__ASSERT(is_valid());
171
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);
174
::FLAC__StreamDecoderInitStatus Stream::init_ogg()
176
FLAC__ASSERT(is_valid());
177
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);
180
bool Stream::finish()
182
FLAC__ASSERT(is_valid());
183
return (bool)::FLAC__stream_decoder_finish(decoder_);
149
186
bool Stream::flush()
182
219
return (bool)::FLAC__stream_decoder_skip_single_frame(decoder_);
185
::FLAC__StreamDecoderReadStatus Stream::read_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
222
bool Stream::seek_absolute(FLAC__uint64 sample)
224
FLAC__ASSERT(is_valid());
225
return (bool)::FLAC__stream_decoder_seek_absolute(decoder_, sample);
228
::FLAC__StreamDecoderSeekStatus Stream::seek_callback(FLAC__uint64 absolute_byte_offset)
230
(void)absolute_byte_offset;
231
return ::FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED;
234
::FLAC__StreamDecoderTellStatus Stream::tell_callback(FLAC__uint64 *absolute_byte_offset)
236
(void)absolute_byte_offset;
237
return ::FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED;
240
::FLAC__StreamDecoderLengthStatus Stream::length_callback(FLAC__uint64 *stream_length)
243
return ::FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED;
246
bool Stream::eof_callback()
251
void Stream::metadata_callback(const ::FLAC__StreamMetadata *metadata)
256
::FLAC__StreamDecoderReadStatus Stream::read_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
188
259
FLAC__ASSERT(0 != client_data);
191
262
return instance->read_callback(buffer, bytes);
265
::FLAC__StreamDecoderSeekStatus Stream::seek_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
268
FLAC__ASSERT(0 != client_data);
269
Stream *instance = reinterpret_cast<Stream *>(client_data);
270
FLAC__ASSERT(0 != instance);
271
return instance->seek_callback(absolute_byte_offset);
274
::FLAC__StreamDecoderTellStatus Stream::tell_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
277
FLAC__ASSERT(0 != client_data);
278
Stream *instance = reinterpret_cast<Stream *>(client_data);
279
FLAC__ASSERT(0 != instance);
280
return instance->tell_callback(absolute_byte_offset);
283
::FLAC__StreamDecoderLengthStatus Stream::length_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
286
FLAC__ASSERT(0 != client_data);
287
Stream *instance = reinterpret_cast<Stream *>(client_data);
288
FLAC__ASSERT(0 != instance);
289
return instance->length_callback(stream_length);
292
FLAC__bool Stream::eof_callback_(const ::FLAC__StreamDecoder *decoder, void *client_data)
295
FLAC__ASSERT(0 != client_data);
296
Stream *instance = reinterpret_cast<Stream *>(client_data);
297
FLAC__ASSERT(0 != instance);
298
return instance->eof_callback();
194
301
::FLAC__StreamDecoderWriteStatus Stream::write_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
218
325
instance->error_callback(status);
328
// ------------------------------------------------------------
332
// ------------------------------------------------------------
342
::FLAC__StreamDecoderInitStatus File::init(FILE *file)
344
FLAC__ASSERT(0 != decoder_);
345
return ::FLAC__stream_decoder_init_FILE(decoder_, file, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this);
348
::FLAC__StreamDecoderInitStatus File::init(const char *filename)
350
FLAC__ASSERT(0 != decoder_);
351
return ::FLAC__stream_decoder_init_file(decoder_, filename, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this);
354
::FLAC__StreamDecoderInitStatus File::init(const std::string &filename)
356
return init(filename.c_str());
359
::FLAC__StreamDecoderInitStatus File::init_ogg(FILE *file)
361
FLAC__ASSERT(0 != decoder_);
362
return ::FLAC__stream_decoder_init_ogg_FILE(decoder_, file, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this);
365
::FLAC__StreamDecoderInitStatus File::init_ogg(const char *filename)
367
FLAC__ASSERT(0 != decoder_);
368
return ::FLAC__stream_decoder_init_ogg_file(decoder_, filename, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this);
371
::FLAC__StreamDecoderInitStatus File::init_ogg(const std::string &filename)
373
return init_ogg(filename.c_str());
376
// This is a dummy to satisfy the pure virtual from Stream; the
377
// read callback will never be called since we are initializing
378
// with FLAC__stream_decoder_init_FILE() or
379
// FLAC__stream_decoder_init_file() and those supply the read
380
// callback internally.
381
::FLAC__StreamDecoderReadStatus File::read_callback(FLAC__byte buffer[], size_t *bytes)
383
(void)buffer, (void)bytes;
385
return ::FLAC__STREAM_DECODER_READ_STATUS_ABORT; // double protection