Coverage Report

Created: 2025-03-11 06:14

/src/flac/src/libFLAC++/stream_encoder.cpp
Line
Count
Source (jump to first uncovered line)
1
/* libFLAC++ - Free Lossless Audio Codec library
2
 * Copyright (C) 2002-2009  Josh Coalson
3
 * Copyright (C) 2011-2025  Xiph.Org Foundation
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 *
9
 * - Redistributions of source code must retain the above copyright
10
 * notice, this list of conditions and the following disclaimer.
11
 *
12
 * - Redistributions in binary form must reproduce the above copyright
13
 * notice, this list of conditions and the following disclaimer in the
14
 * documentation and/or other materials provided with the distribution.
15
 *
16
 * - Neither the name of the Xiph.org Foundation nor the names of its
17
 * contributors may be used to endorse or promote products derived from
18
 * this software without specific prior written permission.
19
 *
20
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
 * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
24
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
 */
32
33
#ifdef HAVE_CONFIG_H
34
#include "config.h"
35
#endif
36
37
#include "FLAC++/encoder.h"
38
#include "FLAC++/metadata.h"
39
#include "FLAC/assert.h"
40
41
#ifdef _MSC_VER
42
// warning C4800: 'int' : forcing to bool 'true' or 'false' (performance warning)
43
#pragma warning ( disable : 4800 )
44
#endif
45
46
namespace FLAC {
47
  namespace Encoder {
48
49
    // ------------------------------------------------------------
50
    //
51
    // Stream
52
    //
53
    // ------------------------------------------------------------
54
55
    Stream::Stream():
56
19.8k
    encoder_(::FLAC__stream_encoder_new())
57
19.8k
    { }
58
59
    Stream::~Stream()
60
19.8k
    {
61
19.8k
      if(0 != encoder_) {
62
19.8k
        (void)::FLAC__stream_encoder_finish(encoder_);
63
19.8k
        ::FLAC__stream_encoder_delete(encoder_);
64
19.8k
      }
65
19.8k
    }
66
67
    bool Stream::is_valid() const
68
1.32M
    {
69
1.32M
      return 0 != encoder_;
70
1.32M
    }
71
72
    bool Stream::set_ogg_serial_number(long value)
73
35.0k
    {
74
35.0k
      FLAC__ASSERT(is_valid());
75
35.0k
      return static_cast<bool>(::FLAC__stream_encoder_set_ogg_serial_number(encoder_, value));
76
35.0k
    }
77
78
    bool Stream::set_verify(bool value)
79
35.0k
    {
80
35.0k
      FLAC__ASSERT(is_valid());
81
35.0k
      return static_cast<bool>(::FLAC__stream_encoder_set_verify(encoder_, value));
82
35.0k
    }
83
84
    bool Stream::set_streamable_subset(bool value)
85
35.1k
    {
86
35.1k
      FLAC__ASSERT(is_valid());
87
35.1k
      return static_cast<bool>(::FLAC__stream_encoder_set_streamable_subset(encoder_, value));
88
35.1k
    }
89
90
    bool Stream::set_channels(uint32_t value)
91
35.1k
    {
92
35.1k
      FLAC__ASSERT(is_valid());
93
35.1k
      return static_cast<bool>(::FLAC__stream_encoder_set_channels(encoder_, value));
94
35.1k
    }
95
96
    bool Stream::set_bits_per_sample(uint32_t value)
97
35.1k
    {
98
35.1k
      FLAC__ASSERT(is_valid());
99
35.1k
      return static_cast<bool>(::FLAC__stream_encoder_set_bits_per_sample(encoder_, value));
100
35.1k
    }
101
102
    bool Stream::set_sample_rate(uint32_t value)
103
33.0k
    {
104
33.0k
      FLAC__ASSERT(is_valid());
105
33.0k
      return static_cast<bool>(::FLAC__stream_encoder_set_sample_rate(encoder_, value));
106
33.0k
    }
107
108
    bool Stream::set_compression_level(uint32_t value)
109
35.0k
    {
110
35.0k
      FLAC__ASSERT(is_valid());
111
35.0k
      return static_cast<bool>(::FLAC__stream_encoder_set_compression_level(encoder_, value));
112
35.0k
    }
113
114
    bool Stream::set_blocksize(uint32_t value)
115
33.0k
    {
116
33.0k
      FLAC__ASSERT(is_valid());
117
33.0k
      return static_cast<bool>(::FLAC__stream_encoder_set_blocksize(encoder_, value));
118
33.0k
    }
119
120
    bool Stream::set_do_mid_side_stereo(bool value)
121
35.0k
    {
122
35.0k
      FLAC__ASSERT(is_valid());
123
35.0k
      return static_cast<bool>(::FLAC__stream_encoder_set_do_mid_side_stereo(encoder_, value));
124
35.0k
    }
125
126
    bool Stream::set_loose_mid_side_stereo(bool value)
127
35.0k
    {
128
35.0k
      FLAC__ASSERT(is_valid());
129
35.0k
      return static_cast<bool>(::FLAC__stream_encoder_set_loose_mid_side_stereo(encoder_, value));
130
35.0k
    }
131
132
    bool Stream::set_apodization(const char *specification)
133
28.3k
    {
134
28.3k
      FLAC__ASSERT(is_valid());
135
28.3k
      return static_cast<bool>(::FLAC__stream_encoder_set_apodization(encoder_, specification));
136
28.3k
    }
137
138
    bool Stream::set_max_lpc_order(uint32_t value)
139
33.4k
    {
140
33.4k
      FLAC__ASSERT(is_valid());
141
33.4k
      return static_cast<bool>(::FLAC__stream_encoder_set_max_lpc_order(encoder_, value));
142
33.4k
    }
143
144
    bool Stream::set_qlp_coeff_precision(uint32_t value)
145
33.3k
    {
146
33.3k
      FLAC__ASSERT(is_valid());
147
33.3k
      return static_cast<bool>(::FLAC__stream_encoder_set_qlp_coeff_precision(encoder_, value));
148
33.3k
    }
149
150
    bool Stream::set_do_qlp_coeff_prec_search(bool value)
151
25.4k
    {
152
25.4k
      FLAC__ASSERT(is_valid());
153
25.4k
      return static_cast<bool>(::FLAC__stream_encoder_set_do_qlp_coeff_prec_search(encoder_, value));
154
25.4k
    }
155
156
    bool Stream::set_do_escape_coding(bool value)
157
33.2k
    {
158
33.2k
      FLAC__ASSERT(is_valid());
159
33.2k
      return static_cast<bool>(::FLAC__stream_encoder_set_do_escape_coding(encoder_, value));
160
33.2k
    }
161
162
    bool Stream::set_do_exhaustive_model_search(bool value)
163
27.2k
    {
164
27.2k
      FLAC__ASSERT(is_valid());
165
27.2k
      return static_cast<bool>(::FLAC__stream_encoder_set_do_exhaustive_model_search(encoder_, value));
166
27.2k
    }
167
168
    bool Stream::set_min_residual_partition_order(uint32_t value)
169
33.2k
    {
170
33.2k
      FLAC__ASSERT(is_valid());
171
33.2k
      return static_cast<bool>(::FLAC__stream_encoder_set_min_residual_partition_order(encoder_, value));
172
33.2k
    }
173
174
    bool Stream::set_max_residual_partition_order(uint32_t value)
175
33.2k
    {
176
33.2k
      FLAC__ASSERT(is_valid());
177
33.2k
      return static_cast<bool>(::FLAC__stream_encoder_set_max_residual_partition_order(encoder_, value));
178
33.2k
    }
179
180
    bool Stream::set_rice_parameter_search_dist(uint32_t value)
181
25.2k
    {
182
25.2k
      FLAC__ASSERT(is_valid());
183
25.2k
      return static_cast<bool>(::FLAC__stream_encoder_set_rice_parameter_search_dist(encoder_, value));
184
25.2k
    }
185
186
    bool Stream::set_total_samples_estimate(FLAC__uint64 value)
187
33.2k
    {
188
33.2k
      FLAC__ASSERT(is_valid());
189
33.2k
      return static_cast<bool>(::FLAC__stream_encoder_set_total_samples_estimate(encoder_, value));
190
33.2k
    }
191
192
    bool Stream::set_metadata(::FLAC__StreamMetadata **metadata, uint32_t num_blocks)
193
897
    {
194
897
      FLAC__ASSERT(is_valid());
195
897
      return static_cast<bool>(::FLAC__stream_encoder_set_metadata(encoder_, metadata, num_blocks));
196
897
    }
197
198
    bool Stream::set_metadata(FLAC::Metadata::Prototype **metadata, uint32_t num_blocks)
199
0
    {
200
0
      FLAC__ASSERT(is_valid());
201
      // because C++ doesn't have VLA's (variable length arrays)
202
      // this ugly workaround is needed
203
0
      ::FLAC__StreamMetadata **m = new ::FLAC__StreamMetadata*[num_blocks];
204
0
      for(uint32_t i = 0; i < num_blocks; i++) {
205
        // we can get away with the const_cast since we know the encoder will only correct the is_last flags
206
0
        m[i] = const_cast< ::FLAC__StreamMetadata*>(static_cast<const ::FLAC__StreamMetadata*>(*metadata[i]));
207
0
      }
208
      // complete the hack
209
0
      const bool ok = static_cast<bool>(::FLAC__stream_encoder_set_metadata(encoder_, m, num_blocks));
210
0
      delete [] m;
211
0
      return ok;
212
0
    }
213
214
    bool Stream::set_limit_min_bitrate(bool value)
215
33.0k
    {
216
33.0k
      FLAC__ASSERT(is_valid());
217
33.0k
      return static_cast<bool>(::FLAC__stream_encoder_set_limit_min_bitrate(encoder_, value));
218
33.0k
    }
219
220
    uint32_t Stream::set_num_threads(uint32_t value)
221
33.0k
    {
222
33.0k
      FLAC__ASSERT(is_valid());
223
33.0k
      return ::FLAC__stream_encoder_set_num_threads(encoder_, value);
224
33.0k
    }
225
226
    Stream::State Stream::get_state() const
227
41.1k
    {
228
41.1k
      FLAC__ASSERT(is_valid());
229
41.1k
      return State(::FLAC__stream_encoder_get_state(encoder_));
230
41.1k
    }
231
232
    Decoder::Stream::State Stream::get_verify_decoder_state() const
233
0
    {
234
0
      FLAC__ASSERT(is_valid());
235
0
      return Decoder::Stream::State(::FLAC__stream_encoder_get_verify_decoder_state(encoder_));
236
0
    }
237
238
    void Stream::get_verify_decoder_error_stats(FLAC__uint64 *absolute_sample, uint32_t *frame_number, uint32_t *channel, uint32_t *sample, FLAC__int32 *expected, FLAC__int32 *got)
239
0
    {
240
0
      FLAC__ASSERT(is_valid());
241
0
      ::FLAC__stream_encoder_get_verify_decoder_error_stats(encoder_, absolute_sample, frame_number, channel, sample, expected, got);
242
0
    }
243
244
    bool Stream::get_verify() const
245
15.4k
    {
246
15.4k
      FLAC__ASSERT(is_valid());
247
15.4k
      return static_cast<bool>(::FLAC__stream_encoder_get_verify(encoder_));
248
15.4k
    }
249
250
    bool Stream::get_streamable_subset() const
251
15.4k
    {
252
15.4k
      FLAC__ASSERT(is_valid());
253
15.4k
      return static_cast<bool>(::FLAC__stream_encoder_get_streamable_subset(encoder_));
254
15.4k
    }
255
256
    bool Stream::get_do_mid_side_stereo() const
257
15.4k
    {
258
15.4k
      FLAC__ASSERT(is_valid());
259
15.4k
      return static_cast<bool>(::FLAC__stream_encoder_get_do_mid_side_stereo(encoder_));
260
15.4k
    }
261
262
    bool Stream::get_loose_mid_side_stereo() const
263
15.4k
    {
264
15.4k
      FLAC__ASSERT(is_valid());
265
15.4k
      return static_cast<bool>(::FLAC__stream_encoder_get_loose_mid_side_stereo(encoder_));
266
15.4k
    }
267
268
    uint32_t Stream::get_channels() const
269
56.5k
    {
270
56.5k
      FLAC__ASSERT(is_valid());
271
56.5k
      return ::FLAC__stream_encoder_get_channels(encoder_);
272
56.5k
    }
273
274
    uint32_t Stream::get_bits_per_sample() const
275
56.5k
    {
276
56.5k
      FLAC__ASSERT(is_valid());
277
56.5k
      return ::FLAC__stream_encoder_get_bits_per_sample(encoder_);
278
56.5k
    }
279
280
    uint32_t Stream::get_sample_rate() const
281
15.4k
    {
282
15.4k
      FLAC__ASSERT(is_valid());
283
15.4k
      return ::FLAC__stream_encoder_get_sample_rate(encoder_);
284
15.4k
    }
285
286
    uint32_t Stream::get_blocksize() const
287
15.4k
    {
288
15.4k
      FLAC__ASSERT(is_valid());
289
15.4k
      return ::FLAC__stream_encoder_get_blocksize(encoder_);
290
15.4k
    }
291
292
    uint32_t Stream::get_max_lpc_order() const
293
15.4k
    {
294
15.4k
      FLAC__ASSERT(is_valid());
295
15.4k
      return ::FLAC__stream_encoder_get_max_lpc_order(encoder_);
296
15.4k
    }
297
298
    uint32_t Stream::get_qlp_coeff_precision() const
299
15.4k
    {
300
15.4k
      FLAC__ASSERT(is_valid());
301
15.4k
      return ::FLAC__stream_encoder_get_qlp_coeff_precision(encoder_);
302
15.4k
    }
303
304
    bool Stream::get_do_qlp_coeff_prec_search() const
305
15.4k
    {
306
15.4k
      FLAC__ASSERT(is_valid());
307
15.4k
      return static_cast<bool>(::FLAC__stream_encoder_get_do_qlp_coeff_prec_search(encoder_));
308
15.4k
    }
309
310
    bool Stream::get_do_escape_coding() const
311
15.4k
    {
312
15.4k
      FLAC__ASSERT(is_valid());
313
15.4k
      return static_cast<bool>(::FLAC__stream_encoder_get_do_escape_coding(encoder_));
314
15.4k
    }
315
316
    bool Stream::get_do_exhaustive_model_search() const
317
15.4k
    {
318
15.4k
      FLAC__ASSERT(is_valid());
319
15.4k
      return static_cast<bool>(::FLAC__stream_encoder_get_do_exhaustive_model_search(encoder_));
320
15.4k
    }
321
322
    uint32_t Stream::get_min_residual_partition_order() const
323
15.4k
    {
324
15.4k
      FLAC__ASSERT(is_valid());
325
15.4k
      return ::FLAC__stream_encoder_get_min_residual_partition_order(encoder_);
326
15.4k
    }
327
328
    uint32_t Stream::get_max_residual_partition_order() const
329
15.4k
    {
330
15.4k
      FLAC__ASSERT(is_valid());
331
15.4k
      return ::FLAC__stream_encoder_get_max_residual_partition_order(encoder_);
332
15.4k
    }
333
334
    uint32_t Stream::get_rice_parameter_search_dist() const
335
15.4k
    {
336
15.4k
      FLAC__ASSERT(is_valid());
337
15.4k
      return ::FLAC__stream_encoder_get_rice_parameter_search_dist(encoder_);
338
15.4k
    }
339
340
    FLAC__uint64 Stream::get_total_samples_estimate() const
341
15.4k
    {
342
15.4k
      FLAC__ASSERT(is_valid());
343
15.4k
      return ::FLAC__stream_encoder_get_total_samples_estimate(encoder_);
344
15.4k
    }
345
346
    bool Stream::get_limit_min_bitrate() const
347
15.4k
    {
348
15.4k
      FLAC__ASSERT(is_valid());
349
15.4k
      return static_cast<bool>(::FLAC__stream_encoder_get_limit_min_bitrate(encoder_));
350
15.4k
    }
351
352
    uint32_t Stream::get_num_threads() const
353
15.4k
    {
354
15.4k
      FLAC__ASSERT(is_valid());
355
15.4k
      return ::FLAC__stream_encoder_get_num_threads(encoder_);
356
15.4k
    }
357
358
    ::FLAC__StreamEncoderInitStatus Stream::init()
359
9.99k
    {
360
9.99k
      FLAC__ASSERT(is_valid());
361
9.99k
      return ::FLAC__stream_encoder_init_stream(encoder_, write_callback_, seek_callback_, tell_callback_, metadata_callback_, /*client_data=*/(void*)this);
362
9.99k
    }
363
364
    ::FLAC__StreamEncoderInitStatus Stream::init_ogg()
365
6.54k
    {
366
6.54k
      FLAC__ASSERT(is_valid());
367
6.54k
      return ::FLAC__stream_encoder_init_ogg_stream(encoder_, read_callback_, write_callback_, seek_callback_, tell_callback_, metadata_callback_, /*client_data=*/(void*)this);
368
6.54k
    }
369
370
    bool Stream::finish()
371
19.8k
    {
372
19.8k
      FLAC__ASSERT(is_valid());
373
19.8k
      return static_cast<bool>(::FLAC__stream_encoder_finish(encoder_));
374
19.8k
    }
375
376
    bool Stream::process(const FLAC__int32 * const buffer[], uint32_t samples)
377
41.0k
    {
378
41.0k
      FLAC__ASSERT(is_valid());
379
41.0k
      return static_cast<bool>(::FLAC__stream_encoder_process(encoder_, buffer, samples));
380
41.0k
    }
381
382
    bool Stream::process_interleaved(const FLAC__int32 buffer[], uint32_t samples)
383
115k
    {
384
115k
      FLAC__ASSERT(is_valid());
385
115k
      return static_cast<bool>(::FLAC__stream_encoder_process_interleaved(encoder_, buffer, samples));
386
115k
    }
387
388
    ::FLAC__StreamEncoderReadStatus Stream::read_callback(FLAC__byte buffer[], size_t *bytes)
389
0
    {
390
0
      (void)buffer, (void)bytes;
391
0
      return ::FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED;
392
0
    }
393
394
    ::FLAC__StreamEncoderSeekStatus Stream::seek_callback(FLAC__uint64 absolute_byte_offset)
395
15.3k
    {
396
15.3k
      (void)absolute_byte_offset;
397
15.3k
      return ::FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED;
398
15.3k
    }
399
400
    ::FLAC__StreamEncoderTellStatus Stream::tell_callback(FLAC__uint64 *absolute_byte_offset)
401
98.8k
    {
402
98.8k
      (void)absolute_byte_offset;
403
98.8k
      return ::FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED;
404
98.8k
    }
405
406
    void Stream::metadata_callback(const ::FLAC__StreamMetadata *metadata)
407
15.3k
    {
408
15.3k
      (void)metadata;
409
15.3k
    }
410
411
    ::FLAC__StreamEncoderReadStatus Stream::read_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
412
0
    {
413
0
      (void)encoder;
414
0
      FLAC__ASSERT(0 != client_data);
415
0
      Stream *instance = reinterpret_cast<Stream *>(client_data);
416
0
      FLAC__ASSERT(0 != instance);
417
0
      return instance->read_callback(buffer, bytes);
418
0
    }
419
420
    ::FLAC__StreamEncoderWriteStatus Stream::write_callback_(const ::FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, uint32_t samples, uint32_t current_frame, void *client_data)
421
3.21M
    {
422
3.21M
      (void)encoder;
423
3.21M
      FLAC__ASSERT(0 != client_data);
424
3.21M
      Stream *instance = reinterpret_cast<Stream *>(client_data);
425
3.21M
      FLAC__ASSERT(0 != instance);
426
3.21M
      return instance->write_callback(buffer, bytes, samples, current_frame);
427
3.21M
    }
428
429
    ::FLAC__StreamEncoderSeekStatus Stream::seek_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data)
430
15.3k
    {
431
15.3k
      (void)encoder;
432
15.3k
      FLAC__ASSERT(0 != client_data);
433
15.3k
      Stream *instance = reinterpret_cast<Stream *>(client_data);
434
15.3k
      FLAC__ASSERT(0 != instance);
435
15.3k
      return instance->seek_callback(absolute_byte_offset);
436
15.3k
    }
437
438
    ::FLAC__StreamEncoderTellStatus Stream::tell_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
439
98.8k
    {
440
98.8k
      (void)encoder;
441
98.8k
      FLAC__ASSERT(0 != client_data);
442
98.8k
      Stream *instance = reinterpret_cast<Stream *>(client_data);
443
98.8k
      FLAC__ASSERT(0 != instance);
444
98.8k
      return instance->tell_callback(absolute_byte_offset);
445
98.8k
    }
446
447
    void Stream::metadata_callback_(const ::FLAC__StreamEncoder *encoder, const ::FLAC__StreamMetadata *metadata, void *client_data)
448
15.3k
    {
449
15.3k
      (void)encoder;
450
15.3k
      FLAC__ASSERT(0 != client_data);
451
15.3k
      Stream *instance = reinterpret_cast<Stream *>(client_data);
452
15.3k
      FLAC__ASSERT(0 != instance);
453
15.3k
      instance->metadata_callback(metadata);
454
15.3k
    }
455
456
    // ------------------------------------------------------------
457
    //
458
    // File
459
    //
460
    // ------------------------------------------------------------
461
462
    File::File():
463
0
      Stream()
464
0
    { }
465
466
    File::~File()
467
    {
468
    }
469
470
    ::FLAC__StreamEncoderInitStatus File::init(FILE *file)
471
0
    {
472
0
      FLAC__ASSERT(is_valid());
473
0
      return ::FLAC__stream_encoder_init_FILE(encoder_, file, progress_callback_, /*client_data=*/(void*)this);
474
0
    }
475
476
    ::FLAC__StreamEncoderInitStatus File::init(const char *filename)
477
0
    {
478
0
      FLAC__ASSERT(is_valid());
479
0
      return ::FLAC__stream_encoder_init_file(encoder_, filename, progress_callback_, /*client_data=*/(void*)this);
480
0
    }
481
482
    ::FLAC__StreamEncoderInitStatus File::init(const std::string &filename)
483
0
    {
484
0
      return init(filename.c_str());
485
0
    }
486
487
    ::FLAC__StreamEncoderInitStatus File::init_ogg(FILE *file)
488
0
    {
489
0
      FLAC__ASSERT(is_valid());
490
0
      return ::FLAC__stream_encoder_init_ogg_FILE(encoder_, file, progress_callback_, /*client_data=*/(void*)this);
491
0
    }
492
493
    ::FLAC__StreamEncoderInitStatus File::init_ogg(const char *filename)
494
0
    {
495
0
      FLAC__ASSERT(is_valid());
496
0
      return ::FLAC__stream_encoder_init_ogg_file(encoder_, filename, progress_callback_, /*client_data=*/(void*)this);
497
0
    }
498
499
    ::FLAC__StreamEncoderInitStatus File::init_ogg(const std::string &filename)
500
0
    {
501
0
      return init_ogg(filename.c_str());
502
0
    }
503
504
    // This is a dummy to satisfy the pure virtual from Stream; the
505
    // read callback will never be called since we are initializing
506
    // with FLAC__stream_decoder_init_FILE() or
507
    // FLAC__stream_decoder_init_file() and those supply the read
508
    // callback internally.
509
    ::FLAC__StreamEncoderWriteStatus File::write_callback(const FLAC__byte buffer[], size_t bytes, uint32_t samples, uint32_t current_frame)
510
0
    {
511
0
      (void)buffer, (void)bytes, (void)samples, (void)current_frame;
512
0
      FLAC__ASSERT(false);
513
0
      return ::FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; // double protection
514
0
    }
515
516
    void File::progress_callback(FLAC__uint64 bytes_written, FLAC__uint64 samples_written, uint32_t frames_written, uint32_t total_frames_estimate)
517
0
    {
518
0
      (void)bytes_written, (void)samples_written, (void)frames_written, (void)total_frames_estimate;
519
0
    }
520
521
    void File::progress_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, uint32_t frames_written, uint32_t total_frames_estimate, void *client_data)
522
0
    {
523
0
      (void)encoder;
524
0
      FLAC__ASSERT(0 != client_data);
525
0
      File *instance = reinterpret_cast<File *>(client_data);
526
0
      FLAC__ASSERT(0 != instance);
527
0
      instance->progress_callback(bytes_written, samples_written, frames_written, total_frames_estimate);
528
0
    }
529
530
  } // namespace Encoder
531
} // namespace FLAC