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
70
82
return (bool)::FLAC__stream_encoder_set_streamable_subset(encoder_, value);
73
bool Stream::set_do_mid_side_stereo(bool value)
75
FLAC__ASSERT(is_valid());
76
return (bool)::FLAC__stream_encoder_set_do_mid_side_stereo(encoder_, value);
79
bool Stream::set_loose_mid_side_stereo(bool value)
81
FLAC__ASSERT(is_valid());
82
return (bool)::FLAC__stream_encoder_set_loose_mid_side_stereo(encoder_, value);
85
85
bool Stream::set_channels(unsigned value)
87
87
FLAC__ASSERT(is_valid());
100
100
return (bool)::FLAC__stream_encoder_set_sample_rate(encoder_, value);
103
bool Stream::set_compression_level(unsigned value)
105
FLAC__ASSERT(is_valid());
106
return (bool)::FLAC__stream_encoder_set_compression_level(encoder_, value);
103
109
bool Stream::set_blocksize(unsigned value)
105
111
FLAC__ASSERT(is_valid());
106
112
return (bool)::FLAC__stream_encoder_set_blocksize(encoder_, value);
115
bool Stream::set_do_mid_side_stereo(bool value)
117
FLAC__ASSERT(is_valid());
118
return (bool)::FLAC__stream_encoder_set_do_mid_side_stereo(encoder_, value);
121
bool Stream::set_loose_mid_side_stereo(bool value)
123
FLAC__ASSERT(is_valid());
124
return (bool)::FLAC__stream_encoder_set_loose_mid_side_stereo(encoder_, value);
127
bool Stream::set_apodization(const char *specification)
129
FLAC__ASSERT(is_valid());
130
return (bool)::FLAC__stream_encoder_set_apodization(encoder_, specification);
109
133
bool Stream::set_max_lpc_order(unsigned value)
111
135
FLAC__ASSERT(is_valid());
178
202
::FLAC__StreamMetadata *m[num_blocks];
180
204
for(unsigned i = 0; i < num_blocks; i++) {
181
// we can get away with this since we know the encoder will only correct the is_last flags
182
m[i] = const_cast< ::FLAC__StreamMetadata*>((::FLAC__StreamMetadata*)metadata[i]);
205
// we can get away with the const_cast since we know the encoder will only correct the is_last flags
206
m[i] = const_cast< ::FLAC__StreamMetadata*>((const ::FLAC__StreamMetadata*)metadata[i]);
184
#if (defined _MSC_VER) || (defined __SUNPRO_CC)
208
#if (defined _MSC_VER) || (defined __BORLANDC__) || (defined __SUNPRO_CC)
185
209
// complete the hack
186
210
const bool ok = (bool)::FLAC__stream_encoder_set_metadata(encoder_, m, num_blocks);
311
335
return ::FLAC__stream_encoder_get_total_samples_estimate(encoder_);
314
Stream::State Stream::init()
316
FLAC__ASSERT(is_valid());
317
::FLAC__stream_encoder_set_write_callback(encoder_, write_callback_);
318
::FLAC__stream_encoder_set_metadata_callback(encoder_, metadata_callback_);
319
::FLAC__stream_encoder_set_client_data(encoder_, (void*)this);
320
return State(::FLAC__stream_encoder_init(encoder_));
323
void Stream::finish()
325
FLAC__ASSERT(is_valid());
326
::FLAC__stream_encoder_finish(encoder_);
338
::FLAC__StreamEncoderInitStatus Stream::init()
340
FLAC__ASSERT(is_valid());
341
return ::FLAC__stream_encoder_init_stream(encoder_, write_callback_, seek_callback_, tell_callback_, metadata_callback_, /*client_data=*/(void*)this);
344
::FLAC__StreamEncoderInitStatus Stream::init_ogg()
346
FLAC__ASSERT(is_valid());
347
return ::FLAC__stream_encoder_init_ogg_stream(encoder_, read_callback_, write_callback_, seek_callback_, tell_callback_, metadata_callback_, /*client_data=*/(void*)this);
350
bool Stream::finish()
352
FLAC__ASSERT(is_valid());
353
return (bool)::FLAC__stream_encoder_finish(encoder_);
329
356
bool Stream::process(const FLAC__int32 * const buffer[], unsigned samples)
338
365
return (bool)::FLAC__stream_encoder_process_interleaved(encoder_, buffer, samples);
341
::FLAC__StreamEncoderWriteStatus Stream::write_callback_(const ::FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data)
368
::FLAC__StreamEncoderReadStatus Stream::read_callback(FLAC__byte buffer[], size_t *bytes)
370
(void)buffer, (void)bytes;
371
return ::FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED;
374
::FLAC__StreamEncoderSeekStatus Stream::seek_callback(FLAC__uint64 absolute_byte_offset)
376
(void)absolute_byte_offset;
377
return ::FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED;
380
::FLAC__StreamEncoderTellStatus Stream::tell_callback(FLAC__uint64 *absolute_byte_offset)
382
(void)absolute_byte_offset;
383
return ::FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED;
386
void Stream::metadata_callback(const ::FLAC__StreamMetadata *metadata)
391
::FLAC__StreamEncoderReadStatus Stream::read_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
394
FLAC__ASSERT(0 != client_data);
395
Stream *instance = reinterpret_cast<Stream *>(client_data);
396
FLAC__ASSERT(0 != instance);
397
return instance->read_callback(buffer, bytes);
400
::FLAC__StreamEncoderWriteStatus Stream::write_callback_(const ::FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data)
344
403
FLAC__ASSERT(0 != client_data);
347
406
return instance->write_callback(buffer, bytes, samples, current_frame);
409
::FLAC__StreamEncoderSeekStatus Stream::seek_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data)
412
FLAC__ASSERT(0 != client_data);
413
Stream *instance = reinterpret_cast<Stream *>(client_data);
414
FLAC__ASSERT(0 != instance);
415
return instance->seek_callback(absolute_byte_offset);
418
::FLAC__StreamEncoderTellStatus Stream::tell_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
421
FLAC__ASSERT(0 != client_data);
422
Stream *instance = reinterpret_cast<Stream *>(client_data);
423
FLAC__ASSERT(0 != instance);
424
return instance->tell_callback(absolute_byte_offset);
350
427
void Stream::metadata_callback_(const ::FLAC__StreamEncoder *encoder, const ::FLAC__StreamMetadata *metadata, void *client_data)
356
433
instance->metadata_callback(metadata);
436
// ------------------------------------------------------------
440
// ------------------------------------------------------------
450
::FLAC__StreamEncoderInitStatus File::init(FILE *file)
452
FLAC__ASSERT(is_valid());
453
return ::FLAC__stream_encoder_init_FILE(encoder_, file, progress_callback_, /*client_data=*/(void*)this);
456
::FLAC__StreamEncoderInitStatus File::init(const char *filename)
458
FLAC__ASSERT(is_valid());
459
return ::FLAC__stream_encoder_init_file(encoder_, filename, progress_callback_, /*client_data=*/(void*)this);
462
::FLAC__StreamEncoderInitStatus File::init(const std::string &filename)
464
return init(filename.c_str());
467
::FLAC__StreamEncoderInitStatus File::init_ogg(FILE *file)
469
FLAC__ASSERT(is_valid());
470
return ::FLAC__stream_encoder_init_ogg_FILE(encoder_, file, progress_callback_, /*client_data=*/(void*)this);
473
::FLAC__StreamEncoderInitStatus File::init_ogg(const char *filename)
475
FLAC__ASSERT(is_valid());
476
return ::FLAC__stream_encoder_init_ogg_file(encoder_, filename, progress_callback_, /*client_data=*/(void*)this);
479
::FLAC__StreamEncoderInitStatus File::init_ogg(const std::string &filename)
481
return init_ogg(filename.c_str());
484
// This is a dummy to satisfy the pure virtual from Stream; the
485
// read callback will never be called since we are initializing
486
// with FLAC__stream_decoder_init_FILE() or
487
// FLAC__stream_decoder_init_file() and those supply the read
488
// callback internally.
489
::FLAC__StreamEncoderWriteStatus File::write_callback(const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame)
491
(void)buffer, (void)bytes, (void)samples, (void)current_frame;
493
return ::FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; // double protection
496
void File::progress_callback(FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate)
498
(void)bytes_written, (void)samples_written, (void)frames_written, (void)total_frames_estimate;
501
void File::progress_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data)
504
FLAC__ASSERT(0 != client_data);
505
File *instance = reinterpret_cast<File *>(client_data);
506
FLAC__ASSERT(0 != instance);
507
instance->progress_callback(bytes_written, samples_written, frames_written, total_frames_estimate);