1 /* libFLAC++ - Free Lossless Audio Codec library
2 * Copyright (C) 2002 Josh Coalson
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
20 #include "FLAC++/encoder.h"
21 #include "FLAC/assert.h"
26 const char *Stream::State::resolved_as_cstring(const Stream &encoder) const
28 if(state_ == ::FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR)
29 return encoder.get_verify_decoder_state().as_cstring();
35 encoder_(::FLAC__stream_encoder_new())
41 ::FLAC__stream_encoder_finish(encoder_);
42 ::FLAC__stream_encoder_delete(encoder_);
46 bool Stream::is_valid() const
51 bool Stream::set_verify(bool value)
53 FLAC__ASSERT(is_valid());
54 return (bool)::FLAC__stream_encoder_set_verify(encoder_, value);
57 bool Stream::set_streamable_subset(bool value)
59 FLAC__ASSERT(is_valid());
60 return (bool)::FLAC__stream_encoder_set_streamable_subset(encoder_, value);
63 bool Stream::set_do_mid_side_stereo(bool value)
65 FLAC__ASSERT(is_valid());
66 return (bool)::FLAC__stream_encoder_set_do_mid_side_stereo(encoder_, value);
69 bool Stream::set_loose_mid_side_stereo(bool value)
71 FLAC__ASSERT(is_valid());
72 return (bool)::FLAC__stream_encoder_set_loose_mid_side_stereo(encoder_, value);
75 bool Stream::set_channels(unsigned value)
77 FLAC__ASSERT(is_valid());
78 return (bool)::FLAC__stream_encoder_set_channels(encoder_, value);
81 bool Stream::set_bits_per_sample(unsigned value)
83 FLAC__ASSERT(is_valid());
84 return (bool)::FLAC__stream_encoder_set_bits_per_sample(encoder_, value);
87 bool Stream::set_sample_rate(unsigned value)
89 FLAC__ASSERT(is_valid());
90 return (bool)::FLAC__stream_encoder_set_sample_rate(encoder_, value);
93 bool Stream::set_blocksize(unsigned value)
95 FLAC__ASSERT(is_valid());
96 return (bool)::FLAC__stream_encoder_set_blocksize(encoder_, value);
99 bool Stream::set_max_lpc_order(unsigned value)
101 FLAC__ASSERT(is_valid());
102 return (bool)::FLAC__stream_encoder_set_max_lpc_order(encoder_, value);
105 bool Stream::set_qlp_coeff_precision(unsigned value)
107 FLAC__ASSERT(is_valid());
108 return (bool)::FLAC__stream_encoder_set_qlp_coeff_precision(encoder_, value);
111 bool Stream::set_do_qlp_coeff_prec_search(bool value)
113 FLAC__ASSERT(is_valid());
114 return (bool)::FLAC__stream_encoder_set_do_qlp_coeff_prec_search(encoder_, value);
117 bool Stream::set_do_escape_coding(bool value)
119 FLAC__ASSERT(is_valid());
120 return (bool)::FLAC__stream_encoder_set_do_escape_coding(encoder_, value);
123 bool Stream::set_do_exhaustive_model_search(bool value)
125 FLAC__ASSERT(is_valid());
126 return (bool)::FLAC__stream_encoder_set_do_exhaustive_model_search(encoder_, value);
129 bool Stream::set_min_residual_partition_order(unsigned value)
131 FLAC__ASSERT(is_valid());
132 return (bool)::FLAC__stream_encoder_set_min_residual_partition_order(encoder_, value);
135 bool Stream::set_max_residual_partition_order(unsigned value)
137 FLAC__ASSERT(is_valid());
138 return (bool)::FLAC__stream_encoder_set_max_residual_partition_order(encoder_, value);
141 bool Stream::set_rice_parameter_search_dist(unsigned value)
143 FLAC__ASSERT(is_valid());
144 return (bool)::FLAC__stream_encoder_set_rice_parameter_search_dist(encoder_, value);
147 bool Stream::set_total_samples_estimate(FLAC__uint64 value)
149 FLAC__ASSERT(is_valid());
150 return (bool)::FLAC__stream_encoder_set_total_samples_estimate(encoder_, value);
153 bool Stream::set_metadata(::FLAC__StreamMetadata **metadata, unsigned num_blocks)
155 FLAC__ASSERT(is_valid());
156 return (bool)::FLAC__stream_encoder_set_metadata(encoder_, metadata, num_blocks);
159 Stream::State Stream::get_state() const
161 FLAC__ASSERT(is_valid());
162 return State(::FLAC__stream_encoder_get_state(encoder_));
165 Decoder::Stream::State Stream::get_verify_decoder_state() const
167 FLAC__ASSERT(is_valid());
168 return Decoder::Stream::State(::FLAC__stream_encoder_get_verify_decoder_state(encoder_));
171 void Stream::get_verify_decoder_error_stats(FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got)
173 FLAC__ASSERT(is_valid());
174 ::FLAC__stream_encoder_get_verify_decoder_error_stats(encoder_, absolute_sample, frame_number, channel, sample, expected, got);
177 bool Stream::get_verify() const
179 FLAC__ASSERT(is_valid());
180 return (bool)::FLAC__stream_encoder_get_verify(encoder_);
183 bool Stream::get_streamable_subset() const
185 FLAC__ASSERT(is_valid());
186 return (bool)::FLAC__stream_encoder_get_streamable_subset(encoder_);
189 bool Stream::get_do_mid_side_stereo() const
191 FLAC__ASSERT(is_valid());
192 return (bool)::FLAC__stream_encoder_get_do_mid_side_stereo(encoder_);
195 bool Stream::get_loose_mid_side_stereo() const
197 FLAC__ASSERT(is_valid());
198 return (bool)::FLAC__stream_encoder_get_loose_mid_side_stereo(encoder_);
201 unsigned Stream::get_channels() const
203 FLAC__ASSERT(is_valid());
204 return ::FLAC__stream_encoder_get_channels(encoder_);
207 unsigned Stream::get_bits_per_sample() const
209 FLAC__ASSERT(is_valid());
210 return ::FLAC__stream_encoder_get_bits_per_sample(encoder_);
213 unsigned Stream::get_sample_rate() const
215 FLAC__ASSERT(is_valid());
216 return ::FLAC__stream_encoder_get_sample_rate(encoder_);
219 unsigned Stream::get_blocksize() const
221 FLAC__ASSERT(is_valid());
222 return ::FLAC__stream_encoder_get_blocksize(encoder_);
225 unsigned Stream::get_max_lpc_order() const
227 FLAC__ASSERT(is_valid());
228 return ::FLAC__stream_encoder_get_max_lpc_order(encoder_);
231 unsigned Stream::get_qlp_coeff_precision() const
233 FLAC__ASSERT(is_valid());
234 return ::FLAC__stream_encoder_get_qlp_coeff_precision(encoder_);
237 bool Stream::get_do_qlp_coeff_prec_search() const
239 FLAC__ASSERT(is_valid());
240 return (bool)::FLAC__stream_encoder_get_do_qlp_coeff_prec_search(encoder_);
243 bool Stream::get_do_escape_coding() const
245 FLAC__ASSERT(is_valid());
246 return (bool)::FLAC__stream_encoder_get_do_escape_coding(encoder_);
249 bool Stream::get_do_exhaustive_model_search() const
251 FLAC__ASSERT(is_valid());
252 return (bool)::FLAC__stream_encoder_get_do_exhaustive_model_search(encoder_);
255 unsigned Stream::get_min_residual_partition_order() const
257 FLAC__ASSERT(is_valid());
258 return ::FLAC__stream_encoder_get_min_residual_partition_order(encoder_);
261 unsigned Stream::get_max_residual_partition_order() const
263 FLAC__ASSERT(is_valid());
264 return ::FLAC__stream_encoder_get_max_residual_partition_order(encoder_);
267 unsigned Stream::get_rice_parameter_search_dist() const
269 FLAC__ASSERT(is_valid());
270 return ::FLAC__stream_encoder_get_rice_parameter_search_dist(encoder_);
273 FLAC__uint64 Stream::get_total_samples_estimate() const
275 FLAC__ASSERT(is_valid());
276 return ::FLAC__stream_encoder_get_total_samples_estimate(encoder_);
279 Stream::State Stream::init()
281 FLAC__ASSERT(is_valid());
282 ::FLAC__stream_encoder_set_write_callback(encoder_, write_callback_);
283 ::FLAC__stream_encoder_set_metadata_callback(encoder_, metadata_callback_);
284 ::FLAC__stream_encoder_set_client_data(encoder_, (void*)this);
285 return State(::FLAC__stream_encoder_init(encoder_));
288 void Stream::finish()
290 FLAC__ASSERT(is_valid());
291 ::FLAC__stream_encoder_finish(encoder_);
294 bool Stream::process(const FLAC__int32 * const buffer[], unsigned samples)
296 FLAC__ASSERT(is_valid());
297 return (bool)::FLAC__stream_encoder_process(encoder_, buffer, samples);
300 bool Stream::process_interleaved(const FLAC__int32 buffer[], unsigned samples)
302 FLAC__ASSERT(is_valid());
303 return (bool)::FLAC__stream_encoder_process_interleaved(encoder_, buffer, samples);
306 ::FLAC__StreamEncoderWriteStatus Stream::write_callback_(const ::FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data)
309 FLAC__ASSERT(0 != client_data);
310 Stream *instance = reinterpret_cast<Stream *>(client_data);
311 FLAC__ASSERT(0 != instance);
312 return instance->write_callback(buffer, bytes, samples, current_frame);
315 void Stream::metadata_callback_(const ::FLAC__StreamEncoder *encoder, const ::FLAC__StreamMetadata *metadata, void *client_data)
318 FLAC__ASSERT(0 != client_data);
319 Stream *instance = reinterpret_cast<Stream *>(client_data);
320 FLAC__ASSERT(0 != instance);
321 instance->metadata_callback(metadata);