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.
21 #include <stdlib.h> /* for malloc() */
22 #include <string.h> /* for memcpy() */
23 #include "FLAC/assert.h"
24 #include "protected/file_encoder.h"
25 #include "protected/seekable_stream_encoder.h"
27 /***********************************************************************
29 * Private class method prototypes
31 ***********************************************************************/
33 /* unpublished debug routines */
34 extern FLAC__bool FLAC__seekable_stream_encoder_disable_constant_subframes(FLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
35 extern FLAC__bool FLAC__seekable_stream_encoder_disable_fixed_subframes(FLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
36 extern FLAC__bool FLAC__seekable_stream_encoder_disable_verbatim_subframes(FLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
38 static void set_defaults_(FLAC__FileEncoder *encoder);
39 static FLAC__SeekableStreamEncoderSeekStatus seek_callback_(const FLAC__SeekableStreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data);
40 static FLAC__StreamEncoderWriteStatus write_callback_(const FLAC__SeekableStreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data);
42 /***********************************************************************
46 ***********************************************************************/
48 typedef struct FLAC__FileEncoderPrivate {
49 FLAC__FileEncoderProgressCallback progress_callback;
52 FLAC__uint64 bytes_written;
53 FLAC__uint64 samples_written;
54 unsigned total_frames_estimate;
55 FLAC__SeekableStreamEncoder *seekable_stream_encoder;
57 } FLAC__FileEncoderPrivate;
59 /***********************************************************************
61 * Public static class data
63 ***********************************************************************/
65 FLAC_API const char * const FLAC__FileEncoderStateString[] = {
66 "FLAC__FILE_ENCODER_OK",
67 "FLAC__FILE_ENCODER_NO_FILENAME",
68 "FLAC__FILE_ENCODER_SEEKABLE_STREAM_ENCODER_ERROR",
69 "FLAC__FILE_ENCODER_FATAL_ERROR_WHILE_WRITING",
70 "FLAC__FILE_ENCODER_ERROR_OPENING_FILE",
71 "FLAC__FILE_ENCODER_MEMORY_ALLOCATION_ERROR",
72 "FLAC__FILE_ENCODER_ALREADY_INITIALIZED",
73 "FLAC__FILE_ENCODER_UNINITIALIZED"
77 /***********************************************************************
79 * Class constructor/destructor
81 ***********************************************************************/
83 FLAC_API FLAC__FileEncoder *FLAC__file_encoder_new()
85 FLAC__FileEncoder *encoder;
87 FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */
89 encoder = (FLAC__FileEncoder*)malloc(sizeof(FLAC__FileEncoder));
93 memset(encoder, 0, sizeof(FLAC__FileEncoder));
95 encoder->protected_ = (FLAC__FileEncoderProtected*)malloc(sizeof(FLAC__FileEncoderProtected));
96 if(encoder->protected_ == 0) {
100 memset(encoder->protected_, 0, sizeof(FLAC__FileEncoderProtected));
102 encoder->private_ = (FLAC__FileEncoderPrivate*)malloc(sizeof(FLAC__FileEncoderPrivate));
103 if(encoder->private_ == 0) {
104 free(encoder->protected_);
108 memset(encoder->private_, 0, sizeof(FLAC__FileEncoderPrivate));
110 encoder->private_->seekable_stream_encoder = FLAC__seekable_stream_encoder_new();
111 if(0 == encoder->private_->seekable_stream_encoder) {
112 free(encoder->private_);
113 free(encoder->protected_);
118 encoder->private_->file = 0;
120 set_defaults_(encoder);
122 encoder->protected_->state = FLAC__FILE_ENCODER_UNINITIALIZED;
127 FLAC_API void FLAC__file_encoder_delete(FLAC__FileEncoder *encoder)
129 FLAC__ASSERT(0 != encoder);
130 FLAC__ASSERT(0 != encoder->protected_);
131 FLAC__ASSERT(0 != encoder->private_);
132 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
134 (void)FLAC__file_encoder_finish(encoder);
136 FLAC__seekable_stream_encoder_delete(encoder->private_->seekable_stream_encoder);
138 free(encoder->private_);
139 free(encoder->protected_);
143 /***********************************************************************
145 * Public class methods
147 ***********************************************************************/
149 FLAC_API FLAC__FileEncoderState FLAC__file_encoder_init(FLAC__FileEncoder *encoder)
151 FLAC__ASSERT(0 != encoder);
153 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
154 return encoder->protected_->state = FLAC__FILE_ENCODER_ALREADY_INITIALIZED;
156 if(0 == encoder->private_->filename)
157 return encoder->protected_->state = FLAC__FILE_ENCODER_NO_FILENAME;
159 encoder->private_->file = fopen(encoder->private_->filename, "w+b");
161 if(encoder->private_->file == 0)
162 return encoder->protected_->state = FLAC__FILE_ENCODER_ERROR_OPENING_FILE;
164 encoder->private_->bytes_written = 0;
165 encoder->private_->samples_written = 0;
167 FLAC__seekable_stream_encoder_set_seek_callback(encoder->private_->seekable_stream_encoder, seek_callback_);
168 FLAC__seekable_stream_encoder_set_write_callback(encoder->private_->seekable_stream_encoder, write_callback_);
169 FLAC__seekable_stream_encoder_set_client_data(encoder->private_->seekable_stream_encoder, encoder);
171 if(FLAC__seekable_stream_encoder_init(encoder->private_->seekable_stream_encoder) != FLAC__SEEKABLE_STREAM_ENCODER_OK)
172 return encoder->protected_->state = FLAC__FILE_ENCODER_SEEKABLE_STREAM_ENCODER_ERROR;
175 unsigned blocksize = FLAC__file_encoder_get_blocksize(encoder);
177 FLAC__ASSERT(blocksize != 0);
178 encoder->private_->total_frames_estimate = (unsigned)((FLAC__file_encoder_get_total_samples_estimate(encoder) + blocksize - 1) / blocksize);
181 return encoder->protected_->state = FLAC__FILE_ENCODER_OK;
184 FLAC_API void FLAC__file_encoder_finish(FLAC__FileEncoder *encoder)
186 FLAC__ASSERT(0 != encoder);
188 if(encoder->protected_->state == FLAC__FILE_ENCODER_UNINITIALIZED)
191 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
193 /* FLAC__seekable_stream_encoder_finish() might write data so we must close the file after it. */
195 FLAC__seekable_stream_encoder_finish(encoder->private_->seekable_stream_encoder);
197 if(0 != encoder->private_->file) {
198 fclose(encoder->private_->file);
199 encoder->private_->file = 0;
202 if(0 != encoder->private_->filename) {
203 free(encoder->private_->filename);
204 encoder->private_->filename = 0;
207 set_defaults_(encoder);
209 encoder->protected_->state = FLAC__FILE_ENCODER_UNINITIALIZED;
212 FLAC_API FLAC__bool FLAC__file_encoder_set_verify(FLAC__FileEncoder *encoder, FLAC__bool value)
214 FLAC__ASSERT(0 != encoder);
215 FLAC__ASSERT(0 != encoder->private_);
216 FLAC__ASSERT(0 != encoder->protected_);
217 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
218 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
220 return FLAC__seekable_stream_encoder_set_verify(encoder->private_->seekable_stream_encoder, value);
223 FLAC_API FLAC__bool FLAC__file_encoder_set_streamable_subset(FLAC__FileEncoder *encoder, FLAC__bool value)
225 FLAC__ASSERT(0 != encoder);
226 FLAC__ASSERT(0 != encoder->private_);
227 FLAC__ASSERT(0 != encoder->protected_);
228 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
229 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
231 return FLAC__seekable_stream_encoder_set_streamable_subset(encoder->private_->seekable_stream_encoder, value);
234 FLAC_API FLAC__bool FLAC__file_encoder_set_do_mid_side_stereo(FLAC__FileEncoder *encoder, FLAC__bool value)
236 FLAC__ASSERT(0 != encoder);
237 FLAC__ASSERT(0 != encoder->private_);
238 FLAC__ASSERT(0 != encoder->protected_);
239 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
240 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
242 return FLAC__seekable_stream_encoder_set_do_mid_side_stereo(encoder->private_->seekable_stream_encoder, value);
245 FLAC_API FLAC__bool FLAC__file_encoder_set_loose_mid_side_stereo(FLAC__FileEncoder *encoder, FLAC__bool value)
247 FLAC__ASSERT(0 != encoder);
248 FLAC__ASSERT(0 != encoder->private_);
249 FLAC__ASSERT(0 != encoder->protected_);
250 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
251 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
253 return FLAC__seekable_stream_encoder_set_loose_mid_side_stereo(encoder->private_->seekable_stream_encoder, value);
256 FLAC_API FLAC__bool FLAC__file_encoder_set_channels(FLAC__FileEncoder *encoder, unsigned value)
258 FLAC__ASSERT(0 != encoder);
259 FLAC__ASSERT(0 != encoder->private_);
260 FLAC__ASSERT(0 != encoder->protected_);
261 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
262 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
264 return FLAC__seekable_stream_encoder_set_channels(encoder->private_->seekable_stream_encoder, value);
267 FLAC_API FLAC__bool FLAC__file_encoder_set_bits_per_sample(FLAC__FileEncoder *encoder, unsigned value)
269 FLAC__ASSERT(0 != encoder);
270 FLAC__ASSERT(0 != encoder->private_);
271 FLAC__ASSERT(0 != encoder->protected_);
272 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
273 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
275 return FLAC__seekable_stream_encoder_set_bits_per_sample(encoder->private_->seekable_stream_encoder, value);
278 FLAC_API FLAC__bool FLAC__file_encoder_set_sample_rate(FLAC__FileEncoder *encoder, unsigned value)
280 FLAC__ASSERT(0 != encoder);
281 FLAC__ASSERT(0 != encoder->private_);
282 FLAC__ASSERT(0 != encoder->protected_);
283 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
284 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
286 return FLAC__seekable_stream_encoder_set_sample_rate(encoder->private_->seekable_stream_encoder, value);
289 FLAC_API FLAC__bool FLAC__file_encoder_set_blocksize(FLAC__FileEncoder *encoder, unsigned value)
291 FLAC__ASSERT(0 != encoder);
292 FLAC__ASSERT(0 != encoder->private_);
293 FLAC__ASSERT(0 != encoder->protected_);
294 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
295 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
297 return FLAC__seekable_stream_encoder_set_blocksize(encoder->private_->seekable_stream_encoder, value);
300 FLAC_API FLAC__bool FLAC__file_encoder_set_max_lpc_order(FLAC__FileEncoder *encoder, unsigned value)
302 FLAC__ASSERT(0 != encoder);
303 FLAC__ASSERT(0 != encoder->private_);
304 FLAC__ASSERT(0 != encoder->protected_);
305 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
306 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
308 return FLAC__seekable_stream_encoder_set_max_lpc_order(encoder->private_->seekable_stream_encoder, value);
311 FLAC_API FLAC__bool FLAC__file_encoder_set_qlp_coeff_precision(FLAC__FileEncoder *encoder, unsigned value)
313 FLAC__ASSERT(0 != encoder);
314 FLAC__ASSERT(0 != encoder->private_);
315 FLAC__ASSERT(0 != encoder->protected_);
316 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
317 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
319 return FLAC__seekable_stream_encoder_set_qlp_coeff_precision(encoder->private_->seekable_stream_encoder, value);
322 FLAC_API FLAC__bool FLAC__file_encoder_set_do_qlp_coeff_prec_search(FLAC__FileEncoder *encoder, FLAC__bool value)
324 FLAC__ASSERT(0 != encoder);
325 FLAC__ASSERT(0 != encoder->private_);
326 FLAC__ASSERT(0 != encoder->protected_);
327 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
328 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
330 return FLAC__seekable_stream_encoder_set_do_qlp_coeff_prec_search(encoder->private_->seekable_stream_encoder, value);
333 FLAC_API FLAC__bool FLAC__file_encoder_set_do_escape_coding(FLAC__FileEncoder *encoder, FLAC__bool value)
335 FLAC__ASSERT(0 != encoder);
336 FLAC__ASSERT(0 != encoder->private_);
337 FLAC__ASSERT(0 != encoder->protected_);
338 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
339 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
341 return FLAC__seekable_stream_encoder_set_do_escape_coding(encoder->private_->seekable_stream_encoder, value);
344 FLAC_API FLAC__bool FLAC__file_encoder_set_do_exhaustive_model_search(FLAC__FileEncoder *encoder, FLAC__bool value)
346 FLAC__ASSERT(0 != encoder);
347 FLAC__ASSERT(0 != encoder->private_);
348 FLAC__ASSERT(0 != encoder->protected_);
349 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
350 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
352 return FLAC__seekable_stream_encoder_set_do_exhaustive_model_search(encoder->private_->seekable_stream_encoder, value);
355 FLAC_API FLAC__bool FLAC__file_encoder_set_min_residual_partition_order(FLAC__FileEncoder *encoder, unsigned value)
357 FLAC__ASSERT(0 != encoder);
358 FLAC__ASSERT(0 != encoder->private_);
359 FLAC__ASSERT(0 != encoder->protected_);
360 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
361 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
363 return FLAC__seekable_stream_encoder_set_min_residual_partition_order(encoder->private_->seekable_stream_encoder, value);
366 FLAC_API FLAC__bool FLAC__file_encoder_set_max_residual_partition_order(FLAC__FileEncoder *encoder, unsigned value)
368 FLAC__ASSERT(0 != encoder);
369 FLAC__ASSERT(0 != encoder->private_);
370 FLAC__ASSERT(0 != encoder->protected_);
371 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
372 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
374 return FLAC__seekable_stream_encoder_set_max_residual_partition_order(encoder->private_->seekable_stream_encoder, value);
377 FLAC_API FLAC__bool FLAC__file_encoder_set_rice_parameter_search_dist(FLAC__FileEncoder *encoder, unsigned value)
379 FLAC__ASSERT(0 != encoder);
380 FLAC__ASSERT(0 != encoder->private_);
381 FLAC__ASSERT(0 != encoder->protected_);
382 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
383 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
385 return FLAC__seekable_stream_encoder_set_rice_parameter_search_dist(encoder->private_->seekable_stream_encoder, value);
388 FLAC_API FLAC__bool FLAC__file_encoder_set_total_samples_estimate(FLAC__FileEncoder *encoder, FLAC__uint64 value)
390 FLAC__ASSERT(0 != encoder);
391 FLAC__ASSERT(0 != encoder->private_);
392 FLAC__ASSERT(0 != encoder->protected_);
393 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
394 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
396 return FLAC__seekable_stream_encoder_set_total_samples_estimate(encoder->private_->seekable_stream_encoder, value);
399 FLAC_API FLAC__bool FLAC__file_encoder_set_metadata(FLAC__FileEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks)
401 FLAC__ASSERT(0 != encoder);
402 FLAC__ASSERT(0 != encoder->private_);
403 FLAC__ASSERT(0 != encoder->protected_);
404 FLAC__ASSERT(0 != encoder->private_->seekable_stream_encoder);
405 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
407 return FLAC__seekable_stream_encoder_set_metadata(encoder->private_->seekable_stream_encoder, metadata, num_blocks);
410 FLAC_API FLAC__bool FLAC__file_encoder_set_filename(FLAC__FileEncoder *encoder, const char *value)
412 FLAC__ASSERT(0 != encoder);
413 FLAC__ASSERT(0 != encoder->private_);
414 FLAC__ASSERT(0 != encoder->protected_);
415 FLAC__ASSERT(0 != value);
416 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
418 if(0 != encoder->private_->filename) {
419 free(encoder->private_->filename);
420 encoder->private_->filename = 0;
422 if(0 == (encoder->private_->filename = (char*)malloc(strlen(value)+1))) {
423 encoder->protected_->state = FLAC__FILE_ENCODER_MEMORY_ALLOCATION_ERROR;
426 strcpy(encoder->private_->filename, value);
430 FLAC_API FLAC__bool FLAC__file_encoder_set_progress_callback(FLAC__FileEncoder *encoder, FLAC__FileEncoderProgressCallback value)
432 FLAC__ASSERT(0 != encoder);
433 FLAC__ASSERT(0 != encoder->private_);
434 FLAC__ASSERT(0 != encoder->protected_);
435 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
437 encoder->private_->progress_callback = value;
441 FLAC_API FLAC__bool FLAC__file_encoder_set_client_data(FLAC__FileEncoder *encoder, void *value)
443 FLAC__ASSERT(0 != encoder);
444 FLAC__ASSERT(0 != encoder->private_);
445 FLAC__ASSERT(0 != encoder->protected_);
446 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
448 encoder->private_->client_data = value;
453 * These three functions are not static, but not publically exposed in
454 * include/FLAC/ either. They are used by the test suite.
456 FLAC_API FLAC__bool FLAC__file_encoder_disable_constant_subframes(FLAC__FileEncoder *encoder, FLAC__bool value)
458 FLAC__ASSERT(0 != encoder);
459 FLAC__ASSERT(0 != encoder->private_);
460 FLAC__ASSERT(0 != encoder->protected_);
461 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
463 return FLAC__seekable_stream_encoder_disable_constant_subframes(encoder->private_->seekable_stream_encoder, value);
466 FLAC_API FLAC__bool FLAC__file_encoder_disable_fixed_subframes(FLAC__FileEncoder *encoder, FLAC__bool value)
468 FLAC__ASSERT(0 != encoder);
469 FLAC__ASSERT(0 != encoder->private_);
470 FLAC__ASSERT(0 != encoder->protected_);
471 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
473 return FLAC__seekable_stream_encoder_disable_fixed_subframes(encoder->private_->seekable_stream_encoder, value);
476 FLAC_API FLAC__bool FLAC__file_encoder_disable_verbatim_subframes(FLAC__FileEncoder *encoder, FLAC__bool value)
478 FLAC__ASSERT(0 != encoder);
479 FLAC__ASSERT(0 != encoder->private_);
480 FLAC__ASSERT(0 != encoder->protected_);
481 if(encoder->protected_->state != FLAC__FILE_ENCODER_UNINITIALIZED)
483 return FLAC__seekable_stream_encoder_disable_verbatim_subframes(encoder->private_->seekable_stream_encoder, value);
486 FLAC_API FLAC__FileEncoderState FLAC__file_encoder_get_state(const FLAC__FileEncoder *encoder)
488 FLAC__ASSERT(0 != encoder);
489 FLAC__ASSERT(0 != encoder->protected_);
490 return encoder->protected_->state;
493 FLAC_API FLAC__SeekableStreamEncoderState FLAC__file_encoder_get_seekable_stream_encoder_state(const FLAC__FileEncoder *encoder)
495 FLAC__ASSERT(0 != encoder);
496 FLAC__ASSERT(0 != encoder->private_);
497 return FLAC__seekable_stream_encoder_get_state(encoder->private_->seekable_stream_encoder);
500 FLAC_API FLAC__StreamEncoderState FLAC__file_encoder_get_stream_encoder_state(const FLAC__FileEncoder *encoder)
502 FLAC__ASSERT(0 != encoder);
503 FLAC__ASSERT(0 != encoder->private_);
504 return FLAC__seekable_stream_encoder_get_stream_encoder_state(encoder->private_->seekable_stream_encoder);
507 FLAC_API FLAC__StreamDecoderState FLAC__file_encoder_get_verify_decoder_state(const FLAC__FileEncoder *encoder)
509 FLAC__ASSERT(0 != encoder);
510 FLAC__ASSERT(0 != encoder->private_);
511 return FLAC__seekable_stream_encoder_get_verify_decoder_state(encoder->private_->seekable_stream_encoder);
514 FLAC_API void FLAC__file_encoder_get_verify_decoder_error_stats(const FLAC__FileEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got)
516 FLAC__ASSERT(0 != encoder);
517 FLAC__ASSERT(0 != encoder->private_);
518 FLAC__seekable_stream_encoder_get_verify_decoder_error_stats(encoder->private_->seekable_stream_encoder, absolute_sample, frame_number, channel, sample, expected, got);
521 FLAC_API FLAC__bool FLAC__file_encoder_get_verify(const FLAC__FileEncoder *encoder)
523 FLAC__ASSERT(0 != encoder);
524 FLAC__ASSERT(0 != encoder->private_);
525 return FLAC__seekable_stream_encoder_get_verify(encoder->private_->seekable_stream_encoder);
528 FLAC_API FLAC__bool FLAC__file_encoder_get_streamable_subset(const FLAC__FileEncoder *encoder)
530 FLAC__ASSERT(0 != encoder);
531 FLAC__ASSERT(0 != encoder->private_);
532 return FLAC__seekable_stream_encoder_get_streamable_subset(encoder->private_->seekable_stream_encoder);
535 FLAC_API FLAC__bool FLAC__file_encoder_get_do_mid_side_stereo(const FLAC__FileEncoder *encoder)
537 FLAC__ASSERT(0 != encoder);
538 FLAC__ASSERT(0 != encoder->private_);
539 return FLAC__seekable_stream_encoder_get_do_mid_side_stereo(encoder->private_->seekable_stream_encoder);
542 FLAC_API FLAC__bool FLAC__file_encoder_get_loose_mid_side_stereo(const FLAC__FileEncoder *encoder)
544 FLAC__ASSERT(0 != encoder);
545 FLAC__ASSERT(0 != encoder->private_);
546 return FLAC__seekable_stream_encoder_get_loose_mid_side_stereo(encoder->private_->seekable_stream_encoder);
549 FLAC_API unsigned FLAC__file_encoder_get_channels(const FLAC__FileEncoder *encoder)
551 FLAC__ASSERT(0 != encoder);
552 FLAC__ASSERT(0 != encoder->private_);
553 return FLAC__seekable_stream_encoder_get_channels(encoder->private_->seekable_stream_encoder);
556 FLAC_API unsigned FLAC__file_encoder_get_bits_per_sample(const FLAC__FileEncoder *encoder)
558 FLAC__ASSERT(0 != encoder);
559 FLAC__ASSERT(0 != encoder->private_);
560 return FLAC__seekable_stream_encoder_get_bits_per_sample(encoder->private_->seekable_stream_encoder);
563 FLAC_API unsigned FLAC__file_encoder_get_sample_rate(const FLAC__FileEncoder *encoder)
565 FLAC__ASSERT(0 != encoder);
566 FLAC__ASSERT(0 != encoder->private_);
567 return FLAC__seekable_stream_encoder_get_sample_rate(encoder->private_->seekable_stream_encoder);
570 FLAC_API unsigned FLAC__file_encoder_get_blocksize(const FLAC__FileEncoder *encoder)
572 FLAC__ASSERT(0 != encoder);
573 FLAC__ASSERT(0 != encoder->private_);
574 return FLAC__seekable_stream_encoder_get_blocksize(encoder->private_->seekable_stream_encoder);
577 FLAC_API unsigned FLAC__file_encoder_get_max_lpc_order(const FLAC__FileEncoder *encoder)
579 FLAC__ASSERT(0 != encoder);
580 FLAC__ASSERT(0 != encoder->private_);
581 return FLAC__seekable_stream_encoder_get_max_lpc_order(encoder->private_->seekable_stream_encoder);
584 FLAC_API unsigned FLAC__file_encoder_get_qlp_coeff_precision(const FLAC__FileEncoder *encoder)
586 FLAC__ASSERT(0 != encoder);
587 FLAC__ASSERT(0 != encoder->private_);
588 return FLAC__seekable_stream_encoder_get_qlp_coeff_precision(encoder->private_->seekable_stream_encoder);
591 FLAC_API FLAC__bool FLAC__file_encoder_get_do_qlp_coeff_prec_search(const FLAC__FileEncoder *encoder)
593 FLAC__ASSERT(0 != encoder);
594 FLAC__ASSERT(0 != encoder->private_);
595 return FLAC__seekable_stream_encoder_get_do_qlp_coeff_prec_search(encoder->private_->seekable_stream_encoder);
598 FLAC_API FLAC__bool FLAC__file_encoder_get_do_escape_coding(const FLAC__FileEncoder *encoder)
600 FLAC__ASSERT(0 != encoder);
601 FLAC__ASSERT(0 != encoder->private_);
602 return FLAC__seekable_stream_encoder_get_do_escape_coding(encoder->private_->seekable_stream_encoder);
605 FLAC_API FLAC__bool FLAC__file_encoder_get_do_exhaustive_model_search(const FLAC__FileEncoder *encoder)
607 FLAC__ASSERT(0 != encoder);
608 FLAC__ASSERT(0 != encoder->private_);
609 return FLAC__seekable_stream_encoder_get_do_exhaustive_model_search(encoder->private_->seekable_stream_encoder);
612 FLAC_API unsigned FLAC__file_encoder_get_min_residual_partition_order(const FLAC__FileEncoder *encoder)
614 FLAC__ASSERT(0 != encoder);
615 FLAC__ASSERT(0 != encoder->private_);
616 return FLAC__seekable_stream_encoder_get_min_residual_partition_order(encoder->private_->seekable_stream_encoder);
619 FLAC_API unsigned FLAC__file_encoder_get_max_residual_partition_order(const FLAC__FileEncoder *encoder)
621 FLAC__ASSERT(0 != encoder);
622 FLAC__ASSERT(0 != encoder->private_);
623 return FLAC__seekable_stream_encoder_get_max_residual_partition_order(encoder->private_->seekable_stream_encoder);
626 FLAC_API unsigned FLAC__file_encoder_get_rice_parameter_search_dist(const FLAC__FileEncoder *encoder)
628 FLAC__ASSERT(0 != encoder);
629 FLAC__ASSERT(0 != encoder->private_);
630 return FLAC__seekable_stream_encoder_get_rice_parameter_search_dist(encoder->private_->seekable_stream_encoder);
633 FLAC_API FLAC__uint64 FLAC__file_encoder_get_total_samples_estimate(const FLAC__FileEncoder *encoder)
635 FLAC__ASSERT(0 != encoder);
636 FLAC__ASSERT(0 != encoder->private_);
637 return FLAC__seekable_stream_encoder_get_total_samples_estimate(encoder->private_->seekable_stream_encoder);
640 FLAC_API FLAC__bool FLAC__file_encoder_process(FLAC__FileEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples)
642 FLAC__ASSERT(0 != encoder);
643 FLAC__ASSERT(0 != encoder->private_);
644 if(!FLAC__seekable_stream_encoder_process(encoder->private_->seekable_stream_encoder, buffer, samples)) {
645 encoder->protected_->state = FLAC__FILE_ENCODER_SEEKABLE_STREAM_ENCODER_ERROR;
652 /* 'samples' is channel-wide samples, e.g. for 1 second at 44100Hz, 'samples' = 44100 regardless of the number of channels */
653 FLAC_API FLAC__bool FLAC__file_encoder_process_interleaved(FLAC__FileEncoder *encoder, const FLAC__int32 buffer[], unsigned samples)
655 FLAC__ASSERT(0 != encoder);
656 FLAC__ASSERT(0 != encoder->private_);
657 if(!FLAC__seekable_stream_encoder_process_interleaved(encoder->private_->seekable_stream_encoder, buffer, samples)) {
658 encoder->protected_->state = FLAC__FILE_ENCODER_SEEKABLE_STREAM_ENCODER_ERROR;
666 /***********************************************************************
668 * Private class methods
670 ***********************************************************************/
672 void set_defaults_(FLAC__FileEncoder *encoder)
674 FLAC__ASSERT(0 != encoder);
675 FLAC__ASSERT(0 != encoder->private_);
677 encoder->private_->progress_callback = 0;
678 encoder->private_->client_data = 0;
679 encoder->private_->total_frames_estimate = 0;
680 encoder->private_->filename = 0;
683 FLAC__SeekableStreamEncoderSeekStatus seek_callback_(const FLAC__SeekableStreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data)
685 FLAC__FileEncoder *file_encoder = (FLAC__FileEncoder*)client_data;
689 FLAC__ASSERT(0 != file_encoder);
691 if(fseek(file_encoder->private_->file, (long)absolute_byte_offset, SEEK_SET) < 0)
692 return FLAC__SEEKABLE_STREAM_ENCODER_SEEK_STATUS_ERROR;
694 return FLAC__SEEKABLE_STREAM_ENCODER_SEEK_STATUS_OK;
697 FLAC__StreamEncoderWriteStatus write_callback_(const FLAC__SeekableStreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data)
699 FLAC__FileEncoder *file_encoder = (FLAC__FileEncoder*)client_data;
701 (void)encoder, (void)samples, (void)current_frame;
703 FLAC__ASSERT(0 != file_encoder);
705 if(fwrite(buffer, sizeof(FLAC__byte), bytes, file_encoder->private_->file) == bytes) {
706 file_encoder->private_->bytes_written += bytes;
707 file_encoder->private_->samples_written += samples;
708 if(0 != file_encoder->private_->progress_callback && samples > 0)
709 file_encoder->private_->progress_callback(file_encoder, file_encoder->private_->bytes_written, file_encoder->private_->samples_written, current_frame+1, file_encoder->private_->total_frames_estimate, file_encoder->private_->client_data);
710 return FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
713 return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;