33#if defined _WIN32 && !defined __CYGWIN__
39#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__
40 #include <sys/types.h>
44 #define __STDC_FORMAT_MACROS
48#if defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ || defined __EMX__
55#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__
56 #if defined __BORLANDC__
59 #include <sys/utime.h>
62 #include <sys/types.h>
91namespace FlacNamespace
93#if JUCE_INCLUDE_FLAC_CODE || ! defined (JUCE_INCLUDE_FLAC_CODE)
96 #define VERSION "1.3.1"
98 #define FLAC__NO_DLL 1
102 #define HAVE_LROUND 1
106 #define FLAC__SYS_DARWIN 1
110 #define SIZE_MAX 0xffffffff
115 "-Wdeprecated-register",
118 "-Wimplicit-fallthrough",
119 "-Wzero-as-null-pointer-constant",
122 "-Wlanguage-extension-token")
126 #define FLAC__CPU_IA32 1
129 #define FLAC__CPU_X86_64 1
131 #define FLAC__HAS_X86INTRIN 1
134 #undef __STDC_LIMIT_MACROS
135 #define __STDC_LIMIT_MACROS 1
136 #define flac_max jmax
137 #define flac_min jmin
161 #include <FLAC/all.h>
169static const char*
const flacFormatName =
"FLAC file";
171template <
typename Item>
172auto emptyRange (Item item) {
return Range<Item>::emptyRange (item); }
175class FlacReader :
public AudioFormatReader
178 FlacReader (InputStream*
in) : AudioFormatReader (
in, flacFormatName)
181 decoder = FlacNamespace::FLAC__stream_decoder_new();
184 readCallback_, seekCallback_, tellCallback_, lengthCallback_,
185 eofCallback_, writeCallback_, metadataCallback_, errorCallback_,
186 this) == FlacNamespace::FLAC__STREAM_DECODER_INIT_STATUS_OK;
192 if (lengthInSamples == 0 && sampleRate > 0)
196 scanningForLength =
true;
198 scanningForLength =
false;
199 auto tempLength = lengthInSamples;
203 lengthInSamples = tempLength;
208 ~FlacReader()
override
210 FlacNamespace::FLAC__stream_decoder_delete (decoder);
213 void useMetadata (
const FlacNamespace::FLAC__StreamMetadata_StreamInfo&
info)
215 sampleRate =
info.sample_rate;
216 bitsPerSample =
info.bits_per_sample;
217 lengthInSamples = (
unsigned int)
info.total_samples;
218 numChannels =
info.channels;
220 reservoir.setSize ((
int) numChannels, 2 * (
int)
info.max_blocksize,
false,
false,
true);
223 bool readSamples (
int** destSamples,
int numDestChannels,
int startOffsetInDestBuffer,
224 int64 startSampleInFile,
int numSamples)
override
229 const auto getBufferedRange = [
this] {
return bufferedRange; };
231 const auto readFromReservoir = [
this, &destSamples, &numDestChannels, &startOffsetInDestBuffer, &startSampleInFile] (
const Range<int64> rangeToRead)
233 const auto bufferIndices = rangeToRead - bufferedRange.getStart();
234 const auto writePos = (
int64) startOffsetInDestBuffer + (rangeToRead.getStart() - startSampleInFile);
236 for (
int i =
jmin (numDestChannels, reservoir.getNumChannels()); --
i >= 0;)
238 if (destSamples[
i] !=
nullptr)
240 memcpy (destSamples[
i] + writePos,
241 reservoir.getReadPointer (
i) + bufferIndices.getStart(),
242 (
size_t) bufferIndices.getLength() * sizeof (
int));
247 const auto fillReservoir = [
this] (
const int64 requestedStart)
249 if (requestedStart >= lengthInSamples)
251 bufferedRange = emptyRange (requestedStart);
255 if (requestedStart < bufferedRange.getStart()
256 ||
jmax (bufferedRange.getEnd(), bufferedRange.getStart() + (
int64) 511) < requestedStart)
260 bufferedRange = emptyRange (requestedStart & ~511);
265 bufferedRange = emptyRange (bufferedRange.getEnd());
269 const auto remainingSamples = Reservoir::doBufferedRead (Range<int64> { startSampleInFile, startSampleInFile + numSamples },
274 if (! remainingSamples.isEmpty())
275 for (
int i = numDestChannels; --
i >= 0;)
276 if (destSamples[
i] !=
nullptr)
277 zeromem (destSamples[
i] + startOffsetInDestBuffer, (
size_t) remainingSamples.getLength() * sizeof (
int));
282 void useSamples (
const FlacNamespace::FLAC__int32*
const buffer[],
int numSamples)
284 if (scanningForLength)
286 lengthInSamples += numSamples;
290 if (numSamples > reservoir.getNumSamples())
291 reservoir.setSize ((
int) numChannels, numSamples,
false,
false,
true);
293 auto bitsToShift = 32 - bitsPerSample;
295 for (
int i = 0;
i < (
int) numChannels; ++
i)
300 while (src ==
nullptr &&
n > 0)
305 auto* dest =
reinterpret_cast<int*
> (reservoir.getWritePointer (
i));
307 for (
int j = 0;
j < numSamples; ++
j)
308 dest[
j] = src[
j] << bitsToShift;
312 bufferedRange.setLength (numSamples);
317 static FlacNamespace::FLAC__StreamDecoderReadStatus readCallback_ (
const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__byte buffer[],
size_t* bytes,
void* client_data)
319 *bytes = (size_t)
static_cast<const FlacReader*
> (client_data)->input->read (buffer, (
int) *bytes);
320 return FlacNamespace::FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
323 static FlacNamespace::FLAC__StreamDecoderSeekStatus seekCallback_ (
const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__uint64 absolute_byte_offset,
void* client_data)
325 static_cast<const FlacReader*
> (client_data)->input->setPosition ((
int) absolute_byte_offset);
326 return FlacNamespace::FLAC__STREAM_DECODER_SEEK_STATUS_OK;
329 static FlacNamespace::FLAC__StreamDecoderTellStatus tellCallback_ (
const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__uint64* absolute_byte_offset,
void* client_data)
331 *absolute_byte_offset = (
uint64)
static_cast<const FlacReader*
> (client_data)->input->getPosition();
332 return FlacNamespace::FLAC__STREAM_DECODER_TELL_STATUS_OK;
335 static FlacNamespace::FLAC__StreamDecoderLengthStatus lengthCallback_ (
const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__uint64* stream_length,
void* client_data)
337 *stream_length = (
uint64)
static_cast<const FlacReader*
> (client_data)->input->getTotalLength();
338 return FlacNamespace::FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
341 static FlacNamespace::FLAC__bool eofCallback_ (
const FlacNamespace::FLAC__StreamDecoder*,
void* client_data)
343 return static_cast<const FlacReader*
> (client_data)->input->isExhausted();
346 static FlacNamespace::FLAC__StreamDecoderWriteStatus writeCallback_ (
const FlacNamespace::FLAC__StreamDecoder*,
347 const FlacNamespace::FLAC__Frame* frame,
348 const FlacNamespace::FLAC__int32*
const buffer[],
351 static_cast<FlacReader*
> (client_data)->useSamples (buffer, (
int) frame->header.blocksize);
352 return FlacNamespace::FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
355 static void metadataCallback_ (
const FlacNamespace::FLAC__StreamDecoder*,
356 const FlacNamespace::FLAC__StreamMetadata* metadata,
359 static_cast<FlacReader*
> (client_data)->useMetadata (metadata->data.stream_info);
362 static void errorCallback_ (
const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__StreamDecoderErrorStatus,
void*)
367 FlacNamespace::FLAC__StreamDecoder* decoder;
368 AudioBuffer<float> reservoir;
369 Range<int64> bufferedRange;
370 bool ok =
false, scanningForLength =
false;
377class FlacWriter :
public AudioFormatWriter
380 FlacWriter (OutputStream*
out,
double rate,
uint32 numChans,
uint32 bits,
int qualityOptionIndex)
381 : AudioFormatWriter (
out, flacFormatName, rate, numChans, bits),
382 streamStartPos (output !=
nullptr ?
jmax (output->getPosition(), 0ll) : 0ll)
384 encoder = FlacNamespace::FLAC__stream_encoder_new();
386 if (qualityOptionIndex > 0)
398 encodeWriteCallback, encodeSeekCallback,
399 encodeTellCallback, encodeMetadataCallback,
400 this) == FlacNamespace::FLAC__STREAM_ENCODER_INIT_STATUS_OK;
403 ~FlacWriter()
override
407 FlacNamespace::FLAC__stream_encoder_finish (encoder);
416 FlacNamespace::FLAC__stream_encoder_delete (encoder);
420 bool write (
const int** samplesToWrite,
int numSamples)
override
425 HeapBlock<int*> channels;
427 auto bitsToShift = 32 - (
int) bitsPerSample;
431 temp.malloc (numChannels * (
size_t) numSamples);
432 channels.calloc (numChannels + 1);
434 for (
unsigned int i = 0;
i < numChannels; ++
i)
436 if (samplesToWrite[
i] ==
nullptr)
439 auto* destData = temp.get() +
i * (size_t) numSamples;
440 channels[
i] = destData;
442 for (
int j = 0;
j < numSamples; ++
j)
443 destData[
j] = (samplesToWrite[
i][
j] >> bitsToShift);
446 samplesToWrite =
const_cast<const int**
> (channels.get());
452 bool writeData (
const void*
const data,
const int size)
const
454 return output->write (
data, (
size_t)
size);
457 static void packUint32 (FlacNamespace::FLAC__uint32
val, FlacNamespace::FLAC__byte*
b,
const int bytes)
461 for (
int i = 0;
i < bytes; ++
i)
463 *(--
b) = (FlacNamespace::FLAC__byte) (
val & 0xff);
468 void writeMetaData (
const FlacNamespace::FLAC__StreamMetadata* metadata)
470 using namespace FlacNamespace;
471 auto&
info = metadata->data.stream_info;
474 const unsigned int channelsMinus1 =
info.channels - 1;
475 const unsigned int bitsMinus1 =
info.bits_per_sample - 1;
477 packUint32 (
info.min_blocksize, buffer, 2);
478 packUint32 (
info.max_blocksize, buffer + 2, 2);
479 packUint32 (
info.min_framesize, buffer + 4, 3);
480 packUint32 (
info.max_framesize, buffer + 7, 3);
483 buffer[12] = (
uint8) (((
info.sample_rate & 0x0f) << 4) | (channelsMinus1 << 1) | (bitsMinus1 >> 4));
484 buffer[13] = (
FLAC__byte) (((bitsMinus1 & 0x0f) << 4) | (
unsigned int) ((
info.total_samples >> 32) & 0x0f));
488 const bool seekOk = output->setPosition (streamStartPos + 4);
500 static FlacNamespace::FLAC__StreamEncoderWriteStatus encodeWriteCallback (
const FlacNamespace::FLAC__StreamEncoder*,
501 const FlacNamespace::FLAC__byte buffer[],
507 return static_cast<FlacWriter*
> (client_data)->writeData (buffer, (
int) bytes)
508 ? FlacNamespace::FLAC__STREAM_ENCODER_WRITE_STATUS_OK
509 : FlacNamespace::FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
512 static FlacNamespace::FLAC__StreamEncoderSeekStatus encodeSeekCallback (
const FlacNamespace::FLAC__StreamEncoder*, FlacNamespace::FLAC__uint64,
void*)
514 return FlacNamespace::FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED;
517 static FlacNamespace::FLAC__StreamEncoderTellStatus encodeTellCallback (
const FlacNamespace::FLAC__StreamEncoder*, FlacNamespace::FLAC__uint64* absolute_byte_offset,
void* client_data)
519 if (client_data ==
nullptr)
520 return FlacNamespace::FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED;
522 *absolute_byte_offset = (FlacNamespace::FLAC__uint64)
static_cast<FlacWriter*
> (client_data)->output->getPosition();
523 return FlacNamespace::FLAC__STREAM_ENCODER_TELL_STATUS_OK;
526 static void encodeMetadataCallback (
const FlacNamespace::FLAC__StreamEncoder*,
const FlacNamespace::FLAC__StreamMetadata* metadata,
void* client_data)
528 static_cast<FlacWriter*
> (client_data)->writeMetaData (metadata);
534 FlacNamespace::FLAC__StreamEncoder* encoder;
535 int64 streamStartPos;
542FlacAudioFormat::FlacAudioFormat() : AudioFormat (flacFormatName,
".flac") {}
543FlacAudioFormat::~FlacAudioFormat() {}
545Array<int> FlacAudioFormat::getPossibleSampleRates()
547 return { 8000, 11025, 12000, 16000, 22050, 32000, 44100, 48000,
548 88200, 96000, 176400, 192000, 352800, 384000 };
551Array<int> FlacAudioFormat::getPossibleBitDepths()
556bool FlacAudioFormat::canDoStereo() {
return true; }
557bool FlacAudioFormat::canDoMono() {
return true; }
558bool FlacAudioFormat::isCompressed() {
return true; }
560AudioFormatReader* FlacAudioFormat::createReaderFor (InputStream*
in,
const bool deleteStreamIfOpeningFails)
562 std::unique_ptr<FlacReader>
r (
new FlacReader (
in));
564 if (
r->sampleRate > 0)
567 if (! deleteStreamIfOpeningFails)
573AudioFormatWriter* FlacAudioFormat::createWriterFor (OutputStream*
out,
575 unsigned int numberOfChannels,
577 const StringPairArray& ,
578 int qualityOptionIndex)
580 if (
out !=
nullptr && getPossibleBitDepths().contains (bitsPerSample))
582 std::unique_ptr<FlacWriter>
w (
new FlacWriter (
out, sampleRate, numberOfChannels,
583 (
uint32) bitsPerSample, qualityOptionIndex));
593 return {
"0 (Fastest)",
"1",
"2",
"3",
"4",
"5 (Default)",
"6",
"7",
"8 (Highest quality)" };
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define nullptr
Definition DistrhoDefines.h:75
uint8_t uint8
Definition basics.h:86
int64_t int64
Definition basics.h:91
uint64_t uint64
Definition basics.h:92
uint32_t uint32
Definition basics.h:90
Definition StringArray.h:41
UINT_D64 w
Definition inflate.c:942
register unsigned j
Definition inflate.c:1576
register unsigned i
Definition inflate.c:1575
FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder)
Definition stream_decoder.c:957
FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream(FLAC__StreamDecoder *decoder, FLAC__StreamDecoderReadCallback read_callback, FLAC__StreamDecoderSeekCallback seek_callback, FLAC__StreamDecoderTellCallback tell_callback, FLAC__StreamDecoderLengthCallback length_callback, FLAC__StreamDecoderEofCallback eof_callback, FLAC__StreamDecoderWriteCallback write_callback, FLAC__StreamDecoderMetadataCallback metadata_callback, FLAC__StreamDecoderErrorCallback error_callback, void *client_data)
Definition stream_decoder.c:459
FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder)
Definition stream_decoder.c:1081
FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample)
Definition stream_decoder.c:1146
FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder)
Definition stream_decoder.c:1054
FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder)
Definition stream_decoder.c:1017
FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncoder *encoder, unsigned value)
Definition stream_encoder.c:1574
FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value)
Definition stream_encoder.c:1563
FLAC_API FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value)
Definition stream_encoder.c:1552
FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value)
Definition stream_encoder.c:1629
FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_stream(FLAC__StreamEncoder *encoder, FLAC__StreamEncoderWriteCallback write_callback, FLAC__StreamEncoderSeekCallback seek_callback, FLAC__StreamEncoderTellCallback tell_callback, FLAC__StreamEncoderMetadataCallback metadata_callback, void *client_data)
Definition stream_encoder.c:1237
FLAC_API FLAC__bool FLAC__stream_encoder_set_do_escape_coding(FLAC__StreamEncoder *encoder, FLAC__bool value)
Definition stream_encoder.c:1787
FLAC_API FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value)
Definition stream_encoder.c:1541
FLAC_API FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value)
Definition stream_encoder.c:1618
FLAC_API FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 *const buffer[], unsigned samples)
Definition stream_encoder.c:2125
FLAC_API FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value)
Definition stream_encoder.c:1607
struct backing_store_struct * info
Definition jmemsys.h:183
int val
Definition jpeglib.h:956
JSAMPIMAGE data
Definition jpeglib.h:945
#define JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE(...)
Definition juce_CompilerWarnings.h:181
#define JUCE_END_IGNORE_WARNINGS_GCC_LIKE
Definition juce_CompilerWarnings.h:182
#define JUCE_BEGIN_IGNORE_WARNINGS_MSVC(warnings)
Definition juce_CompilerWarnings.h:198
#define JUCE_END_IGNORE_WARNINGS_MSVC
Definition juce_CompilerWarnings.h:199
float in
Definition lilv_test.c:1460
float out
Definition lilv_test.c:1461
JOCTET * buffer
Definition juce_JPEGLoader.cpp:302
Definition carla_juce.cpp:31
void ignoreUnused(Types &&...) noexcept
Definition juce_MathsFunctions.h:333
void zeromem(void *memory, size_t numBytes) noexcept
Definition juce_Memory.h:28
FLAC__uint8 FLAC__byte
Definition ordinals.h:72
uint32_t FLAC__uint32
Definition ordinals.h:65
int n
Definition crypt.c:458
memcpy(hh, h, RAND_HEAD_LEN)
int r
Definition crypt.c:458
typedef int(UZ_EXP MsgFn)()