From 6e83b103a355c4d5f3b1422ebfc060d3eadbbe4e Mon Sep 17 00:00:00 2001 From: Casey Langen Date: Sat, 28 May 2016 13:51:54 -0700 Subject: [PATCH] FLAC Decoder is operational again. --- CMakeLists.txt | 1 + src/contrib/flacdecoder/CMakeLists.txt | 43 +- src/contrib/flacdecoder/FLACDecoder.cpp | 274 +-- src/contrib/flacdecoder/FLACDecoder.h | 92 +- ...rceSupplier.cpp => FlacDecoderFactory.cpp} | 73 +- ...CSourceSupplier.h => FlacDecoderFactory.h} | 54 +- .../flacdecoder/flacdecoder_plugin.cpp | 54 +- .../flacdecoder/include/FLAC/Makefile.am | 42 - .../flacdecoder/include/FLAC/Makefile.in | 467 ---- src/contrib/flacdecoder/include/FLAC/all.h | 370 --- src/contrib/flacdecoder/include/FLAC/assert.h | 45 - .../flacdecoder/include/FLAC/callback.h | 184 -- src/contrib/flacdecoder/include/FLAC/export.h | 91 - src/contrib/flacdecoder/include/FLAC/format.h | 1010 -------- .../flacdecoder/include/FLAC/metadata.h | 2181 ----------------- .../flacdecoder/include/FLAC/ordinals.h | 80 - .../flacdecoder/include/FLAC/stream_decoder.h | 1559 ------------ .../flacdecoder/include/FLAC/stream_encoder.h | 1768 ------------- .../flacdecoder/include/share/Makefile.am | 13 - .../flacdecoder/include/share/Makefile.in | 514 ---- src/contrib/flacdecoder/include/share/alloc.h | 212 -- .../flacdecoder/include/share/getopt.h | 184 -- .../flacdecoder/include/share/grabbag.h | 29 - .../include/share/grabbag/Makefile.am | 10 - .../include/share/grabbag/Makefile.in | 362 --- .../include/share/grabbag/cuesheet.h | 42 - .../flacdecoder/include/share/grabbag/file.h | 63 - .../include/share/grabbag/picture.h | 46 - .../include/share/grabbag/replaygain.h | 72 - .../include/share/grabbag/seektable.h | 38 - .../include/share/replaygain_analysis.h | 59 - .../include/share/replaygain_synthesis.h | 51 - src/contrib/flacdecoder/include/share/utf8.h | 25 - src/contrib/flacdecoder/lib/VS2008/FLAC++.dll | Bin 116736 -> 0 bytes src/contrib/flacdecoder/lib/VS2008/FLAC++.exp | Bin 120434 -> 0 bytes src/contrib/flacdecoder/lib/VS2008/FLAC++.lib | Bin 203712 -> 0 bytes src/contrib/flacdecoder/lib/VS2008/FLAC.dll | Bin 304640 -> 0 bytes src/contrib/flacdecoder/lib/VS2008/FLAC.exp | Bin 58040 -> 0 bytes src/contrib/flacdecoder/lib/VS2008/FLAC.lib | Bin 90736 -> 0 bytes 39 files changed, 281 insertions(+), 9827 deletions(-) rename src/contrib/flacdecoder/{FLACSourceSupplier.cpp => FlacDecoderFactory.cpp} (63%) rename src/contrib/flacdecoder/{FLACSourceSupplier.h => FlacDecoderFactory.h} (68%) delete mode 100644 src/contrib/flacdecoder/include/FLAC/Makefile.am delete mode 100644 src/contrib/flacdecoder/include/FLAC/Makefile.in delete mode 100644 src/contrib/flacdecoder/include/FLAC/all.h delete mode 100644 src/contrib/flacdecoder/include/FLAC/assert.h delete mode 100644 src/contrib/flacdecoder/include/FLAC/callback.h delete mode 100644 src/contrib/flacdecoder/include/FLAC/export.h delete mode 100644 src/contrib/flacdecoder/include/FLAC/format.h delete mode 100644 src/contrib/flacdecoder/include/FLAC/metadata.h delete mode 100644 src/contrib/flacdecoder/include/FLAC/ordinals.h delete mode 100644 src/contrib/flacdecoder/include/FLAC/stream_decoder.h delete mode 100644 src/contrib/flacdecoder/include/FLAC/stream_encoder.h delete mode 100644 src/contrib/flacdecoder/include/share/Makefile.am delete mode 100644 src/contrib/flacdecoder/include/share/Makefile.in delete mode 100644 src/contrib/flacdecoder/include/share/alloc.h delete mode 100644 src/contrib/flacdecoder/include/share/getopt.h delete mode 100644 src/contrib/flacdecoder/include/share/grabbag.h delete mode 100644 src/contrib/flacdecoder/include/share/grabbag/Makefile.am delete mode 100644 src/contrib/flacdecoder/include/share/grabbag/Makefile.in delete mode 100644 src/contrib/flacdecoder/include/share/grabbag/cuesheet.h delete mode 100644 src/contrib/flacdecoder/include/share/grabbag/file.h delete mode 100644 src/contrib/flacdecoder/include/share/grabbag/picture.h delete mode 100644 src/contrib/flacdecoder/include/share/grabbag/replaygain.h delete mode 100644 src/contrib/flacdecoder/include/share/grabbag/seektable.h delete mode 100644 src/contrib/flacdecoder/include/share/replaygain_analysis.h delete mode 100644 src/contrib/flacdecoder/include/share/replaygain_synthesis.h delete mode 100644 src/contrib/flacdecoder/include/share/utf8.h delete mode 100644 src/contrib/flacdecoder/lib/VS2008/FLAC++.dll delete mode 100644 src/contrib/flacdecoder/lib/VS2008/FLAC++.exp delete mode 100644 src/contrib/flacdecoder/lib/VS2008/FLAC++.lib delete mode 100644 src/contrib/flacdecoder/lib/VS2008/FLAC.dll delete mode 100644 src/contrib/flacdecoder/lib/VS2008/FLAC.exp delete mode 100644 src/contrib/flacdecoder/lib/VS2008/FLAC.lib diff --git a/CMakeLists.txt b/CMakeLists.txt index 58a21862b..afb2907eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,4 +56,5 @@ add_subdirectory(src/musikbox) add_subdirectory(src/contrib/taglib_plugin) add_subdirectory(src/contrib/oggdecoder) add_subdirectory(src/contrib/mpg123decoder) +add_subdirectory(src/contrib/flacdecoder) add_subdirectory(src/contrib/coreaudioout) diff --git a/src/contrib/flacdecoder/CMakeLists.txt b/src/contrib/flacdecoder/CMakeLists.txt index 2e57aea62..96145260e 100644 --- a/src/contrib/flacdecoder/CMakeLists.txt +++ b/src/contrib/flacdecoder/CMakeLists.txt @@ -1,38 +1,13 @@ -set ( flacdecoder_SOURCES - FLACDecoder.cpp - FLACSourceSupplier.cpp - flacdecoder_plugin.cpp - stdafx.cpp - ) +set (flacdecoder_SOURCES + stdafx.cpp + flacdecoder_plugin.cpp + FlacDecoderFactory.cpp + FLACDecoder.cpp +) -if(CMAKE_SYSTEM_NAME MATCHES "Windows") - add_definitions(-DWIN32) - if(NOT DEFINED MINGW) - - endif(NOT DEFINED MINGW) -else(CMAKE_SYSTEM_NAME MATCHES "Windows") - set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fpermissive) -endif(CMAKE_SYSTEM_NAME MATCHES "Windows") - -add_definitions( - -DXML_STATIC - -D_CRT_SECURE_NO_DEPRECATE +add_definitions( -D_DEBUG ) -include_directories( ${musikCube_SOURCE_DIR}/src/contrib/flacdecoder/include ) -find_package(flac) -if (flac_found) - message(STATUS "FLAC found. Using system lib") - link_directories ( flac_link_dirs ) -else (flac_found) - message(STATUS "FLAC not found") - if (${MSVC90}) - message(STATUS "Using MSVC2008 (MSVC9.0) Prebuilt dll") - link_directories ( ${musikCube_SOURCE_DIR}/src/contrib/flacdecoder/lib/VS2008/ ) - endif (${MSVC90}) -endif (flac_found) -add_library( flacdecoder SHARED ${flacdecoder_SOURCES} ) -target_link_libraries( flacdecoder ${musikCube_LINK_LIBS} FLAC FLAC++) - - +add_library(flacdecoder SHARED ${flacdecoder_SOURCES}) +target_link_libraries(flacdecoder ${musikbox_LINK_LIBS} flac) diff --git a/src/contrib/flacdecoder/FLACDecoder.cpp b/src/contrib/flacdecoder/FLACDecoder.cpp index 13f4bcd06..d1797582a 100644 --- a/src/contrib/flacdecoder/FLACDecoder.cpp +++ b/src/contrib/flacdecoder/FLACDecoder.cpp @@ -30,101 +30,128 @@ // POSSIBILITY OF SUCH DAMAGE. // ////////////////////////////////////////////////////////////////////////////// + #include "stdafx.h" -#include "FLACDecoder.h" +#include "FlacDecoder.h" #include + #ifndef WIN32 #include //needed for mempcpy #endif -FLACDecoder::FLACDecoder() - :decoder(NULL) - ,outputBufferSize(0) - ,outputBuffer(NULL) - ,channels(0) - ,sampleRate(0) - ,bps(0) - ,totalSamples(0) -{ - this->decoder = FLAC__stream_decoder_new(); +static inline void copy(float* dst, float* src, size_t count) { +#ifdef WIN32 + CopyMemory(dst, src, count * sizeof(float)); +#else + memcpy(dst, src, count * sizeof(float)); +#endif } +FlacDecoder::FlacDecoder() +: decoder(NULL) +, outputBufferSize(0) +, outputBuffer(NULL) +, channels(0) +, sampleRate(0) +, bitsPerSample(0) +, totalSamples(0) { + this->decoder = FLAC__stream_decoder_new(); +} -FLACDecoder::~FLACDecoder(){ - if(this->decoder){ +FlacDecoder::~FlacDecoder() { + if (this->decoder) { FLAC__stream_decoder_delete(this->decoder); - this->decoder = NULL; - } - if(this->outputBuffer){ - delete this->outputBuffer; - this->outputBuffer = NULL; + this->decoder = NULL; } + if(this->outputBuffer) { + delete this->outputBuffer; + this->outputBuffer = NULL; + } } -FLAC__StreamDecoderReadStatus FLACDecoder::FlacRead(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[],size_t *bytes,void *clientData){ - size_t readBytes = (size_t)((FLACDecoder*)clientData)->fileStream->Read(buffer,(long)(*bytes)); - *bytes = readBytes; - if(readBytes==0){ +FLAC__StreamDecoderReadStatus FlacDecoder::FlacRead( + const FLAC__StreamDecoder *decoder, + FLAC__byte buffer[], + size_t *bytes, + void *clientData) +{ + size_t readBytes = (size_t)((FlacDecoder*) clientData)->stream->Read(buffer,(long)(*bytes)); + *bytes = readBytes; + + if (readBytes == 0) { return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; } - if(readBytes<0){ + else if(readBytes == (size_t) -1) { return FLAC__STREAM_DECODER_READ_STATUS_ABORT; } return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; } -FLAC__bool FLACDecoder::FlacEof(const FLAC__StreamDecoder *decoder, void *clientData){ - if( ((FLACDecoder*)clientData)->fileStream->Eof() ){ - return 1; - } - return 0; +FLAC__bool FlacDecoder::FlacEof(const FLAC__StreamDecoder *decoder, void *clientData) { + return ((FlacDecoder*) clientData)->stream->Eof() ? 1 : 0; } -FLAC__StreamDecoderSeekStatus FLACDecoder::FlacSeek(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *clientData){ - if( ((FLACDecoder*)clientData)->fileStream->SetPosition((long)absolute_byte_offset)){ +FLAC__StreamDecoderSeekStatus FlacDecoder::FlacSeek( + const FLAC__StreamDecoder *decoder, + FLAC__uint64 absolute_byte_offset, + void *clientData) +{ + if(((FlacDecoder*) clientData)->stream->SetPosition((long) absolute_byte_offset)) { return FLAC__STREAM_DECODER_SEEK_STATUS_OK; } - // Unsuccessfull + return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; } +FLAC__StreamDecoderTellStatus FlacDecoder::FlacTell( + const FLAC__StreamDecoder *decoder, + FLAC__uint64 *absolute_byte_offset, + void *clientData) +{ + *absolute_byte_offset = (FLAC__uint64)((FlacDecoder*) clientData)->stream->Position(); -FLAC__StreamDecoderTellStatus FLACDecoder::FlacTell(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *clientData){ - *absolute_byte_offset = (FLAC__uint64)((FLACDecoder*)clientData)->fileStream->Position(); - if(*absolute_byte_offset>=0){ - return FLAC__STREAM_DECODER_TELL_STATUS_OK; + if(*absolute_byte_offset == (FLAC__uint64) -1) { + return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; } - return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; + + return FLAC__STREAM_DECODER_TELL_STATUS_OK; } -FLAC__StreamDecoderLengthStatus FLACDecoder::FlacFileSize(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *clientData){ - *stream_length = (FLAC__uint64)((FLACDecoder*)clientData)->fileStream->Filesize(); - if(*stream_length<=0){ +FLAC__StreamDecoderLengthStatus FlacDecoder::FlacFileSize( + const FLAC__StreamDecoder *decoder, + FLAC__uint64 *stream_length, + void *clientData) +{ + *stream_length = (FLAC__uint64)((FlacDecoder*) clientData)->stream->Length(); + + if(*stream_length <= 0) { return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; } + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; } -bool FLACDecoder::Open(musik::core::filestreams::IFileStream *fileStream){ - this->fileStream = fileStream; +bool FlacDecoder::Open(musik::core::io::IDataStream *stream){ + this->stream = stream; - FLAC__StreamDecoderInitStatus init_status = FLAC__stream_decoder_init_stream(this->decoder, - FLACDecoder::FlacRead, - FLACDecoder::FlacSeek, - FLACDecoder::FlacTell, - FLACDecoder::FlacFileSize, - FLACDecoder::FlacEof, - FLACDecoder::FlacWrite, - FLACDecoder::FlacMeta, - FLACDecoder::FlacError, - this); + FLAC__StreamDecoderInitStatus init_status = + FLAC__stream_decoder_init_stream( + this->decoder, + FlacDecoder::FlacRead, + FlacDecoder::FlacSeek, + FlacDecoder::FlacTell, + FlacDecoder::FlacFileSize, + FlacDecoder::FlacEof, + FlacDecoder::FlacWrite, + FlacDecoder::FlacMetadata, + FlacDecoder::FlacError, + this); - if(init_status == FLAC__STREAM_DECODER_INIT_STATUS_OK) { - // Process until we have metadata + if (init_status == FLAC__STREAM_DECODER_INIT_STATUS_OK) { FLAC__stream_decoder_process_until_end_of_metadata(this->decoder); return true; } @@ -132,53 +159,64 @@ bool FLACDecoder::Open(musik::core::filestreams::IFileStream *fileStream){ return false; } -void FLACDecoder::FlacError(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *clientData){ - +void FlacDecoder::FlacError( + const FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderErrorStatus status, + void *clientData) +{ + /* nothing for us to do here... */ } -void FLACDecoder::FlacMeta(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *clientData){ - FLACDecoder *thisPtr = (FLACDecoder*)clientData; +void FlacDecoder::FlacMetadata( + const FLAC__StreamDecoder *decoder, + const FLAC__StreamMetadata *metadata, + void *clientData) +{ + FlacDecoder *fdec = (FlacDecoder*)clientData; - if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO) { - thisPtr->totalSamples = metadata->data.stream_info.total_samples; - thisPtr->sampleRate = metadata->data.stream_info.sample_rate; - thisPtr->channels = metadata->data.stream_info.channels; - thisPtr->bps = metadata->data.stream_info.bits_per_sample; + if (metadata->type == FLAC__METADATA_TYPE_STREAMINFO) { + fdec->totalSamples = metadata->data.stream_info.total_samples; + fdec->sampleRate = metadata->data.stream_info.sample_rate; + fdec->channels = metadata->data.stream_info.channels; + fdec->bitsPerSample = metadata->data.stream_info.bits_per_sample; } } +FLAC__StreamDecoderWriteStatus FlacDecoder::FlacWrite( + const FLAC__StreamDecoder *decoder, + const FLAC__Frame *frame, + const FLAC__int32 *const buffer[], + void *clientData) +{ + FlacDecoder *fdec = (FlacDecoder*) clientData; + int sampleCount = fdec->channels * frame->header.blocksize; -FLAC__StreamDecoderWriteStatus FLACDecoder::FlacWrite(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame,const FLAC__int32 *const buffer[], void *clientData){ - - FLACDecoder *thisPtr = (FLACDecoder*)clientData; - int nofSamples = thisPtr->channels*frame->header.blocksize; - - // First, lets create a buffer - // If there is already a buffer, delete it - if(thisPtr->outputBufferSize==0){ - delete thisPtr->outputBuffer; - thisPtr->outputBuffer = NULL; - thisPtr->outputBufferSize = 0; - thisPtr->outputBuffer = new float[nofSamples]; + /* initialize the output buffer if it doesn't exist */ + if (fdec->outputBufferSize == 0) { + delete fdec->outputBuffer; + fdec->outputBuffer = NULL; + fdec->outputBufferSize = 0; + fdec->outputBuffer = new float[sampleCount]; } - if(thisPtr->outputBuffer && thisPtr->outputBufferSize>0){ - float *oldBuffer = thisPtr->outputBuffer; - thisPtr->outputBuffer = new float[nofSamples+thisPtr->outputBufferSize]; -#ifdef WIN32 CopyMemory(thisPtr->outputBuffer, oldBuffer, thisPtr->outputBufferSize * sizeof(float)); -#else /*GNU*/ mempcpy(thisPtr->outputBuffer, oldBuffer, thisPtr->outputBufferSize * sizeof(float)); -#endif //WIN32 + + /* if we already have a buffer with an offset, let's append to it. realloc + the buffer so there's enough room */ + if (fdec->outputBuffer && fdec->outputBufferSize > 0) { + float *oldBuffer = fdec->outputBuffer; + fdec->outputBuffer = new float[sampleCount + fdec->outputBufferSize]; + copy(fdec->outputBuffer, oldBuffer, fdec->outputBufferSize); delete oldBuffer; } + /* we need to convert the fixed point samples to floating point samples. figure + out the maximum amplitude of the fixed point samples based on the resolution */ + float maxAmplitude = pow(2.0f, (fdec->bitsPerSample - 1)); - // What is the max amplitude - float maxAmplitude = pow(2.0f,(thisPtr->bps-1)); - - // Convert the buffer (16bit int) to the outputBuffer (float) - for(unsigned int i(0); iheader.blocksize; ++i){ - for(int j(0); jchannels; ++j){ - thisPtr->outputBuffer[thisPtr->outputBufferSize] = (((float)buffer[j][i])/maxAmplitude); - thisPtr->outputBufferSize++; + /* run the conversion */ + for (unsigned int i = 0; i < frame->header.blocksize; ++i) { + for (int j = 0; j < fdec->channels; ++j) { + fdec->outputBuffer[fdec->outputBufferSize] = (((float) buffer[j][i]) / maxAmplitude); + fdec->outputBufferSize++; } } @@ -186,67 +224,29 @@ FLAC__StreamDecoderWriteStatus FLACDecoder::FlacWrite(const FLAC__StreamDecoder } -void FLACDecoder::Destroy(void){ +void FlacDecoder::Destroy() { delete this; } -/*bool FLACDecoder::GetFormat(unsigned long * SampleRate, unsigned long * Channels){ - *SampleRate = this->sampleRate; - *Channels = this->channels; +double FlacDecoder::SetPosition(double seconds) { + FLAC__uint64 seekToSample = (FLAC__uint64)(this->sampleRate * seconds); - if(*SampleRate && *Channels){ - return true; - } - - return false; -} - -bool FLACDecoder::GetLength(unsigned long * MS){ - if(this->totalSamples && this->sampleRate){ - *MS = (this->totalSamples*1000)/this->sampleRate; - return true; - } - - return false; -} -*/ -double FLACDecoder::SetPosition(double seconds,double totalLength){ - FLAC__uint64 seekToSample = (FLAC__uint64)(this->sampleRate * seconds) ; - if(FLAC__stream_decoder_seek_absolute(this->decoder,seekToSample)){ + if (FLAC__stream_decoder_seek_absolute(this->decoder, seekToSample)) { return seconds; } + return -1; } - -//bool FLACDecoder::GetBuffer(float ** ppBuffer, unsigned long * NumSamples){ -bool FLACDecoder::GetBuffer(IBuffer *buffer){ - +bool FlacDecoder::GetBuffer(IBuffer *buffer) { buffer->SetSampleRate(this->sampleRate); buffer->SetChannels(this->channels); - if(this->outputBuffer && this->outputBufferSize>0){ - buffer->SetSamples(this->outputBufferSize/this->channels); - - // Copy buffer - float *buf = buffer->BufferPointer(); - for(long i(0);ioutputBufferSize;++i){ - buf[i] = this->outputBuffer[i]; - } - - this->outputBufferSize = 0; - return true; - } - - if( FLAC__stream_decoder_process_single(this->decoder) ){ - if(this->outputBuffer && this->outputBufferSize>0){ - buffer->SetSamples(this->outputBufferSize/this->channels); - - // Copy buffer - float *buf = buffer->BufferPointer(); - for(long i(0);ioutputBufferSize;++i){ - buf[i] = this->outputBuffer[i]; - } + /* read the next chunk */ + if (FLAC__stream_decoder_process_single(this->decoder)) { + if(this->outputBuffer && this->outputBufferSize > 0) { + buffer->SetSamples(this->outputBufferSize / this->channels); + copy(buffer->BufferPointer(), this->outputBuffer, this->outputBufferSize); this->outputBufferSize = 0; return true; } diff --git a/src/contrib/flacdecoder/FLACDecoder.h b/src/contrib/flacdecoder/FLACDecoder.h index 85aed2b7e..670234469 100644 --- a/src/contrib/flacdecoder/FLACDecoder.h +++ b/src/contrib/flacdecoder/FLACDecoder.h @@ -32,57 +32,75 @@ ////////////////////////////////////////////////////////////////////////////// #pragma once -#include +#include +#include #include #include - using namespace musik::core::audio; -class FLACDecoder : public IDecoder -{ +class FlacDecoder : public musik::core::audio::IDecoder { + public: + FlacDecoder(); + virtual ~FlacDecoder(); -public: - FLACDecoder(); - ~FLACDecoder(); + public: + virtual void Destroy(); + virtual double SetPosition(double seconds); + virtual bool GetBuffer(IBuffer *buffer); + virtual bool Open(musik::core::io::IDataStream *stream); -public: - virtual void Destroy(); - virtual double SetPosition(double seconds,double totalLength); - virtual bool GetBuffer(IBuffer *buffer); - virtual bool Open(musik::core::filestreams::IFileStream *fileStream); + private: + static FLAC__StreamDecoderReadStatus FlacRead( + const FLAC__StreamDecoder *decoder, + FLAC__byte buffer[], + size_t *bytes, + void *clientData); -public: - // FLAC callbacks - //static size_t FlacRead(void *buffer, size_t nofParts, size_t partSize, void *datasource); - static FLAC__StreamDecoderReadStatus FlacRead(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[],size_t *bytes,void *clientData); - //static int FlacSeek(void *datasource, FLAC__int64 offset, int whence); - static FLAC__StreamDecoderSeekStatus FlacSeek(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *clientData); - //static FLAC__int64 FlacTell(void *datasource); - static FLAC__StreamDecoderTellStatus FlacTell(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *clientData); - //static int FlacEof(void *datasource); - static FLAC__bool FlacEof(const FLAC__StreamDecoder *decoder, void *clientData); - //static int FlacFileSize(void *datasource); - static FLAC__StreamDecoderLengthStatus FlacFileSize(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *clientData); + static FLAC__StreamDecoderSeekStatus FlacSeek( + const FLAC__StreamDecoder *decoder, + FLAC__uint64 absolute_byte_offset, + void *clientData); + static FLAC__StreamDecoderTellStatus FlacTell( + const FLAC__StreamDecoder *decoder, + FLAC__uint64 *absolute_byte_offset, + void *clientData); - static FLAC__StreamDecoderWriteStatus FlacWrite(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame,const FLAC__int32 *const buffer[], void *clientData); - static void FlacMeta(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *clientData); - static void FlacError(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *clientData); + static FLAC__bool FlacEof( + const FLAC__StreamDecoder *decoder, + void *clientData); + static FLAC__StreamDecoderLengthStatus FlacFileSize( + const FLAC__StreamDecoder *decoder, + FLAC__uint64 *stream_length, + void *clientData); -protected: - musik::core::filestreams::IFileStream *fileStream; - FLAC__StreamDecoder *decoder; + static FLAC__StreamDecoderWriteStatus FlacWrite( + const FLAC__StreamDecoder *decoder, + const FLAC__Frame *frame, + const FLAC__int32 *const buffer[], + void *clientData); - long channels; - long sampleRate; - UINT64 totalSamples; - int bps; + static void FlacMetadata( + const FLAC__StreamDecoder *decoder, + const FLAC__StreamMetadata *metadata, + void *clientData); - float *outputBuffer; - unsigned long outputBufferSize; + static void FlacError( + const FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderErrorStatus status, + void *clientData); -// FLAC__IOCallbacks flacCallbacks; + protected: + musik::core::io::IDataStream *stream; + FLAC__StreamDecoder *decoder; + long channels; + long sampleRate; + UINT64 totalSamples; + int bitsPerSample; + + float *outputBuffer; + unsigned long outputBufferSize; }; diff --git a/src/contrib/flacdecoder/FLACSourceSupplier.cpp b/src/contrib/flacdecoder/FlacDecoderFactory.cpp similarity index 63% rename from src/contrib/flacdecoder/FLACSourceSupplier.cpp rename to src/contrib/flacdecoder/FlacDecoderFactory.cpp index 28feda901..29d811c11 100644 --- a/src/contrib/flacdecoder/FLACSourceSupplier.cpp +++ b/src/contrib/flacdecoder/FlacDecoderFactory.cpp @@ -1,69 +1,64 @@ ////////////////////////////////////////////////////////////////////////////// -// Copyright © 2007, Daniel Önnerby +// Copyright � 2007, Daniel �nnerby // // All rights reserved. // -// Redistribution and use in source and binary forms, with or without +// Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // -// * Neither the name of the author nor the names of other contributors may -// be used to endorse or promote products derived from this software -// without specific prior written permission. +// * Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. // ////////////////////////////////////////////////////////////////////////////// #include "stdafx.h" - #include +#include -#include "FLACSourceSupplier.h" - +#include "FlacDecoderFactory.h" #include "FLACDecoder.h" -FLACSourceSupplier::FLACSourceSupplier() -{ +using namespace musik::core::audio; + +FlacDecoderFactory::FlacDecoderFactory() { } -FLACSourceSupplier::~FLACSourceSupplier() -{ +FlacDecoderFactory::~FlacDecoderFactory() { } -void FLACSourceSupplier::Destroy() -{ +void FlacDecoderFactory::Destroy() { delete this; } -IDecoder* FLACSourceSupplier::CreateDecoder() -{ - return new FLACDecoder(); +IDecoder* FlacDecoderFactory::CreateDecoder() { + return new FlacDecoder(); } -bool FLACSourceSupplier::CanHandle(const utfchar* type) const -{ - if(type){ - utfstring typeString(type); - if(typeString.find(UTF("flac"))!=utfstring::npos){ - return true; - } - } - return false; +bool FlacDecoderFactory::CanHandle(const char* type) const { + std::string str(type); + std::transform(str.begin(), str.end(), str.begin(), tolower); + + return + str.find(".flac") != std::string::npos || + str.find("audio/flag") != std::string::npos; } diff --git a/src/contrib/flacdecoder/FLACSourceSupplier.h b/src/contrib/flacdecoder/FlacDecoderFactory.h similarity index 68% rename from src/contrib/flacdecoder/FLACSourceSupplier.h rename to src/contrib/flacdecoder/FlacDecoderFactory.h index c16442db6..ef51d780f 100644 --- a/src/contrib/flacdecoder/FLACSourceSupplier.h +++ b/src/contrib/flacdecoder/FlacDecoderFactory.h @@ -1,48 +1,46 @@ ////////////////////////////////////////////////////////////////////////////// -// Copyright © 2007, Daniel Önnerby +// Copyright � 2007, Daniel �nnerby // // All rights reserved. // -// Redistribution and use in source and binary forms, with or without +// Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // -// * Neither the name of the author nor the names of other contributors may -// be used to endorse or promote products derived from this software -// without specific prior written permission. +// * Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. // ////////////////////////////////////////////////////////////////////////////// #pragma once -#include +#include -using namespace musik::core::audio; +class FlacDecoderFactory : public musik::core::audio::IDecoderFactory { + public: + FlacDecoderFactory(); + virtual ~FlacDecoderFactory(); -class FLACSourceSupplier : public IDecoderFactory -{ -public: FLACSourceSupplier(); -public: ~FLACSourceSupplier(); - -public: IDecoder* CreateDecoder(); -public: void Destroy(); -public: bool CanHandle(const utfchar* type) const; + musik::core::audio::IDecoder* CreateDecoder(); + void Destroy(); + bool CanHandle(const char* type) const; }; diff --git a/src/contrib/flacdecoder/flacdecoder_plugin.cpp b/src/contrib/flacdecoder/flacdecoder_plugin.cpp index cf85a9c75..e4451c22b 100644 --- a/src/contrib/flacdecoder/flacdecoder_plugin.cpp +++ b/src/contrib/flacdecoder/flacdecoder_plugin.cpp @@ -2,7 +2,7 @@ // // License Agreement: // -// The following are Copyright � 2008, Daniel �nnerby +// The following are Copyright � 2008, Daniel Önnerby // // All rights reserved. // @@ -36,48 +36,32 @@ #include "stdafx.h" -#include - -#include "FLACSourceSupplier.h" +#include +#include "FlacDecoderFactory.h" #ifdef WIN32 -BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) -{ +#define DLLEXPORT __declspec(dllexport) +#else +#define DLLEXPORT +#endif + +#ifdef WIN32 +BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return true; } -#endif //WIN32 +#endif -class FLACDecoderPlugin : public musik::core::IPlugin -{ +class FlacPlugin : public musik::core::IPlugin { void Destroy() { delete this; }; - - const utfchar* Name() { return UTF("FLAC decoder"); }; - const utfchar* Version() { return UTF("1"); }; - const utfchar* Author() { return UTF("Daniel �nnerby"); }; + const char* Name() { return "FLAC IDecoder"; } + const char* Version() { return "0.2"; } + const char* Author() { return "Daniel Önnerby, clangen"; } }; -#ifdef WIN32 -extern "C" __declspec(dllexport) -#else //WIN32 -extern "C" { -#endif //WIN32 -musik::core::IPlugin* GetPlugin() -{ - return new FLACDecoderPlugin(); +extern "C" DLLEXPORT musik::core::IPlugin* GetPlugin() { + return new FlacPlugin(); } -#ifndef WIN32 -} -#endif -#ifdef WIN32 -extern "C" __declspec(dllexport) -#else //WIN32 -extern "C" { -#endif //WIN32 -IDecoderFactory* GetDecoderFactory() -{ - return new FLACSourceSupplier(); +extern "C" DLLEXPORT musik::core::audio::IDecoderFactory* GetDecoderFactory() { + return new FlacDecoderFactory(); } -#ifndef WIN32 -} -#endif diff --git a/src/contrib/flacdecoder/include/FLAC/Makefile.am b/src/contrib/flacdecoder/include/FLAC/Makefile.am deleted file mode 100644 index 19f49b1fd..000000000 --- a/src/contrib/flacdecoder/include/FLAC/Makefile.am +++ /dev/null @@ -1,42 +0,0 @@ -# libFLAC - Free Lossless Audio Codec library -# Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# - Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# - Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# - Neither the name of the Xiph.org Foundation nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -flaccincludedir = $(includedir)/FLAC - -flaccinclude_HEADERS = \ - all.h \ - assert.h \ - callback.h \ - export.h \ - format.h \ - metadata.h \ - ordinals.h \ - stream_decoder.h \ - stream_encoder.h diff --git a/src/contrib/flacdecoder/include/FLAC/Makefile.in b/src/contrib/flacdecoder/include/FLAC/Makefile.in deleted file mode 100644 index 2bd4de85c..000000000 --- a/src/contrib/flacdecoder/include/FLAC/Makefile.in +++ /dev/null @@ -1,467 +0,0 @@ -# Makefile.in generated by automake 1.7.9 from Makefile.am. -# @configure_input@ - -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 -# Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -# libFLAC - Free Lossless Audio Codec library -# Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# - Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# - Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# - Neither the name of the Xiph.org Foundation nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. - -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -host_triplet = @host@ -ACLOCAL = @ACLOCAL@ -ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -AS = @AS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCAS = @CCAS@ -CCASFLAGS = @CCASFLAGS@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEBUG_FALSE = @DEBUG_FALSE@ -DEBUG_TRUE = @DEBUG_TRUE@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@ -DOXYGEN = @DOXYGEN@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FLAC__TEST_LEVEL = @FLAC__TEST_LEVEL@ -FLAC__TEST_WITH_VALGRIND = @FLAC__TEST_WITH_VALGRIND@ -FLaC__CPU_IA32_FALSE = @FLaC__CPU_IA32_FALSE@ -FLaC__CPU_IA32_TRUE = @FLaC__CPU_IA32_TRUE@ -FLaC__CPU_PPC_FALSE = @FLaC__CPU_PPC_FALSE@ -FLaC__CPU_PPC_TRUE = @FLaC__CPU_PPC_TRUE@ -FLaC__CPU_SPARC_FALSE = @FLaC__CPU_SPARC_FALSE@ -FLaC__CPU_SPARC_TRUE = @FLaC__CPU_SPARC_TRUE@ -FLaC__HAS_AS_FALSE = @FLaC__HAS_AS_FALSE@ -FLaC__HAS_AS_TRUE = @FLaC__HAS_AS_TRUE@ -FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@ -FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@ -FLaC__HAS_DOCBOOK_TO_MAN_FALSE = @FLaC__HAS_DOCBOOK_TO_MAN_FALSE@ -FLaC__HAS_DOCBOOK_TO_MAN_TRUE = @FLaC__HAS_DOCBOOK_TO_MAN_TRUE@ -FLaC__HAS_DOXYGEN_FALSE = @FLaC__HAS_DOXYGEN_FALSE@ -FLaC__HAS_DOXYGEN_TRUE = @FLaC__HAS_DOXYGEN_TRUE@ -FLaC__HAS_GAS_FALSE = @FLaC__HAS_GAS_FALSE@ -FLaC__HAS_GAS_TRUE = @FLaC__HAS_GAS_TRUE@ -FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@ -FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@ -FLaC__HAS_NASM_FALSE = @FLaC__HAS_NASM_FALSE@ -FLaC__HAS_NASM_TRUE = @FLaC__HAS_NASM_TRUE@ -FLaC__HAS_OGG_FALSE = @FLaC__HAS_OGG_FALSE@ -FLaC__HAS_OGG_TRUE = @FLaC__HAS_OGG_TRUE@ -FLaC__HAS_XMMS_FALSE = @FLaC__HAS_XMMS_FALSE@ -FLaC__HAS_XMMS_TRUE = @FLaC__HAS_XMMS_TRUE@ -FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE@ -FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE@ -FLaC__NO_ASM_FALSE = @FLaC__NO_ASM_FALSE@ -FLaC__NO_ASM_TRUE = @FLaC__NO_ASM_TRUE@ -FLaC__SSE_OS_FALSE = @FLaC__SSE_OS_FALSE@ -FLaC__SSE_OS_TRUE = @FLaC__SSE_OS_TRUE@ -FLaC__SYS_DARWIN_FALSE = @FLaC__SYS_DARWIN_FALSE@ -FLaC__SYS_DARWIN_TRUE = @FLaC__SYS_DARWIN_TRUE@ -FLaC__SYS_LINUX_FALSE = @FLaC__SYS_LINUX_FALSE@ -FLaC__SYS_LINUX_TRUE = @FLaC__SYS_LINUX_TRUE@ -FLaC__USE_3DNOW_FALSE = @FLaC__USE_3DNOW_FALSE@ -FLaC__USE_3DNOW_TRUE = @FLaC__USE_3DNOW_TRUE@ -FLaC__USE_ALTIVEC_FALSE = @FLaC__USE_ALTIVEC_FALSE@ -FLaC__USE_ALTIVEC_TRUE = @FLaC__USE_ALTIVEC_TRUE@ -FLaC__WITH_CPPLIBS_FALSE = @FLaC__WITH_CPPLIBS_FALSE@ -FLaC__WITH_CPPLIBS_TRUE = @FLaC__WITH_CPPLIBS_TRUE@ -GAS = @GAS@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBICONV = @LIBICONV@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -LTLIBICONV = @LTLIBICONV@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ -MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ -MAKEINFO = @MAKEINFO@ -MINGW_WINSOCK_LIBS = @MINGW_WINSOCK_LIBS@ -NASM = @NASM@ -OBJEXT = @OBJEXT@ -OBJ_FORMAT = @OBJ_FORMAT@ -OGG_CFLAGS = @OGG_CFLAGS@ -OGG_LIBS = @OGG_LIBS@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -XMMS_CFLAGS = @XMMS_CFLAGS@ -XMMS_CONFIG = @XMMS_CONFIG@ -XMMS_DATA_DIR = @XMMS_DATA_DIR@ -XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@ -XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@ -XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@ -XMMS_LIBS = @XMMS_LIBS@ -XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@ -XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@ -XMMS_VERSION = @XMMS_VERSION@ -XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ - -flaccincludedir = $(includedir)/FLAC - -flaccinclude_HEADERS = \ - all.h \ - assert.h \ - callback.h \ - export.h \ - format.h \ - metadata.h \ - ordinals.h \ - stream_decoder.h \ - stream_encoder.h - -subdir = include/FLAC -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -DIST_SOURCES = -HEADERS = $(flaccinclude_HEADERS) - -DIST_COMMON = $(flaccinclude_HEADERS) $(srcdir)/Makefile.in Makefile.am -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu include/FLAC/Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -flaccincludeHEADERS_INSTALL = $(INSTALL_HEADER) -install-flaccincludeHEADERS: $(flaccinclude_HEADERS) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(flaccincludedir) - @list='$(flaccinclude_HEADERS)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(flaccincludeHEADERS_INSTALL) $$d$$p $(DESTDIR)$(flaccincludedir)/$$f"; \ - $(flaccincludeHEADERS_INSTALL) $$d$$p $(DESTDIR)$(flaccincludedir)/$$f; \ - done - -uninstall-flaccincludeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(flaccinclude_HEADERS)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f $(DESTDIR)$(flaccincludedir)/$$f"; \ - rm -f $(DESTDIR)$(flaccincludedir)/$$f; \ - done - -ETAGS = etags -ETAGSFLAGS = - -CTAGS = ctags -CTAGSFLAGS = - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$tags$$unique" \ - || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique - -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = ../.. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkinstalldirs) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(HEADERS) - -installdirs: - $(mkinstalldirs) $(DESTDIR)$(flaccincludedir) -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -info: info-am - -info-am: - -install-data-am: install-flaccincludeHEADERS - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-flaccincludeHEADERS uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool ctags distclean distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am info \ - info-am install install-am install-data install-data-am \ - install-exec install-exec-am install-flaccincludeHEADERS \ - install-info install-info-am install-man install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-flaccincludeHEADERS uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/src/contrib/flacdecoder/include/FLAC/all.h b/src/contrib/flacdecoder/include/FLAC/all.h deleted file mode 100644 index c542c0d5d..000000000 --- a/src/contrib/flacdecoder/include/FLAC/all.h +++ /dev/null @@ -1,370 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__ALL_H -#define FLAC__ALL_H - -#include "export.h" - -#include "assert.h" -#include "callback.h" -#include "format.h" -#include "metadata.h" -#include "ordinals.h" -#include "stream_decoder.h" -#include "stream_encoder.h" - -/** \mainpage - * - * \section intro Introduction - * - * This is the documentation for the FLAC C and C++ APIs. It is - * highly interconnected; this introduction should give you a top - * level idea of the structure and how to find the information you - * need. As a prerequisite you should have at least a basic - * knowledge of the FLAC format, documented - * here. - * - * \section c_api FLAC C API - * - * The FLAC C API is the interface to libFLAC, a set of structures - * describing the components of FLAC streams, and functions for - * encoding and decoding streams, as well as manipulating FLAC - * metadata in files. The public include files will be installed - * in your include area (for example /usr/include/FLAC/...). - * - * By writing a little code and linking against libFLAC, it is - * relatively easy to add FLAC support to another program. The - * library is licensed under Xiph's BSD license. - * Complete source code of libFLAC as well as the command-line - * encoder and plugins is available and is a useful source of - * examples. - * - * Aside from encoders and decoders, libFLAC provides a powerful - * metadata interface for manipulating metadata in FLAC files. It - * allows the user to add, delete, and modify FLAC metadata blocks - * and it can automatically take advantage of PADDING blocks to avoid - * rewriting the entire FLAC file when changing the size of the - * metadata. - * - * libFLAC usually only requires the standard C library and C math - * library. In particular, threading is not used so there is no - * dependency on a thread library. However, libFLAC does not use - * global variables and should be thread-safe. - * - * libFLAC also supports encoding to and decoding from Ogg FLAC. - * However the metadata editing interfaces currently have limited - * read-only support for Ogg FLAC files. - * - * \section cpp_api FLAC C++ API - * - * The FLAC C++ API is a set of classes that encapsulate the - * structures and functions in libFLAC. They provide slightly more - * functionality with respect to metadata but are otherwise - * equivalent. For the most part, they share the same usage as - * their counterparts in libFLAC, and the FLAC C API documentation - * can be used as a supplement. The public include files - * for the C++ API will be installed in your include area (for - * example /usr/include/FLAC++/...). - * - * libFLAC++ is also licensed under - * Xiph's BSD license. - * - * \section getting_started Getting Started - * - * A good starting point for learning the API is to browse through - * the modules. Modules are logical - * groupings of related functions or classes, which correspond roughly - * to header files or sections of header files. Each module includes a - * detailed description of the general usage of its functions or - * classes. - * - * From there you can go on to look at the documentation of - * individual functions. You can see different views of the individual - * functions through the links in top bar across this page. - * - * If you prefer a more hands-on approach, you can jump right to some - * example code. - * - * \section porting_guide Porting Guide - * - * Starting with FLAC 1.1.3 a \link porting Porting Guide \endlink - * has been introduced which gives detailed instructions on how to - * port your code to newer versions of FLAC. - * - * \section embedded_developers Embedded Developers - * - * libFLAC has grown larger over time as more functionality has been - * included, but much of it may be unnecessary for a particular embedded - * implementation. Unused parts may be pruned by some simple editing of - * src/libFLAC/Makefile.am. In general, the decoders, encoders, and - * metadata interface are all independent from each other. - * - * It is easiest to just describe the dependencies: - * - * - All modules depend on the \link flac_format Format \endlink module. - * - The decoders and encoders depend on the bitbuffer. - * - The decoder is independent of the encoder. The encoder uses the - * decoder because of the verify feature, but this can be removed if - * not needed. - * - Parts of the metadata interface require the stream decoder (but not - * the encoder). - * - Ogg support is selectable through the compile time macro - * \c FLAC__HAS_OGG. - * - * For example, if your application only requires the stream decoder, no - * encoder, and no metadata interface, you can remove the stream encoder - * and the metadata interface, which will greatly reduce the size of the - * library. - * - * Also, there are several places in the libFLAC code with comments marked - * with "OPT:" where a #define can be changed to enable code that might be - * faster on a specific platform. Experimenting with these can yield faster - * binaries. - */ - -/** \defgroup porting Porting Guide for New Versions - * - * This module describes differences in the library interfaces from - * version to version. It assists in the porting of code that uses - * the libraries to newer versions of FLAC. - * - * One simple facility for making porting easier that has been added - * in FLAC 1.1.3 is a set of \c #defines in \c export.h of each - * library's includes (e.g. \c include/FLAC/export.h). The - * \c #defines mirror the libraries' - * libtool version numbers, - * e.g. in libFLAC there are \c FLAC_API_VERSION_CURRENT, - * \c FLAC_API_VERSION_REVISION, and \c FLAC_API_VERSION_AGE. - * These can be used to support multiple versions of an API during the - * transition phase, e.g. - * - * \code - * #if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7 - * legacy code - * #else - * new code - * #endif - * \endcode - * - * The the source will work for multiple versions and the legacy code can - * easily be removed when the transition is complete. - * - * Another available symbol is FLAC_API_SUPPORTS_OGG_FLAC (defined in - * include/FLAC/export.h), which can be used to determine whether or not - * the library has been compiled with support for Ogg FLAC. This is - * simpler than trying to call an Ogg init function and catching the - * error. - */ - -/** \defgroup porting_1_1_2_to_1_1_3 Porting from FLAC 1.1.2 to 1.1.3 - * \ingroup porting - * - * \brief - * This module describes porting from FLAC 1.1.2 to FLAC 1.1.3. - * - * The main change between the APIs in 1.1.2 and 1.1.3 is that they have - * been simplified. First, libOggFLAC has been merged into libFLAC and - * libOggFLAC++ has been merged into libFLAC++. Second, both the three - * decoding layers and three encoding layers have been merged into a - * single stream decoder and stream encoder. That is, the functionality - * of FLAC__SeekableStreamDecoder and FLAC__FileDecoder has been merged - * into FLAC__StreamDecoder, and FLAC__SeekableStreamEncoder and - * FLAC__FileEncoder into FLAC__StreamEncoder. Only the - * FLAC__StreamDecoder and FLAC__StreamEncoder remain. What this means - * is there is now a single API that can be used to encode or decode - * streams to/from native FLAC or Ogg FLAC and the single API can work - * on both seekable and non-seekable streams. - * - * Instead of creating an encoder or decoder of a certain layer, now the - * client will always create a FLAC__StreamEncoder or - * FLAC__StreamDecoder. The old layers are now differentiated by the - * initialization function. For example, for the decoder, - * FLAC__stream_decoder_init() has been replaced by - * FLAC__stream_decoder_init_stream(). This init function takes - * callbacks for the I/O, and the seeking callbacks are optional. This - * allows the client to use the same object for seekable and - * non-seekable streams. For decoding a FLAC file directly, the client - * can use FLAC__stream_decoder_init_file() and pass just a filename - * and fewer callbacks; most of the other callbacks are supplied - * internally. For situations where fopen()ing by filename is not - * possible (e.g. Unicode filenames on Windows) the client can instead - * open the file itself and supply the FILE* to - * FLAC__stream_decoder_init_FILE(). The init functions now returns a - * FLAC__StreamDecoderInitStatus instead of FLAC__StreamDecoderState. - * Since the callbacks and client data are now passed to the init - * function, the FLAC__stream_decoder_set_*_callback() functions and - * FLAC__stream_decoder_set_client_data() are no longer needed. The - * rest of the calls to the decoder are the same as before. - * - * There are counterpart init functions for Ogg FLAC, e.g. - * FLAC__stream_decoder_init_ogg_stream(). All the rest of the calls - * and callbacks are the same as for native FLAC. - * - * As an example, in FLAC 1.1.2 a seekable stream decoder would have - * been set up like so: - * - * \code - * FLAC__SeekableStreamDecoder *decoder = FLAC__seekable_stream_decoder_new(); - * if(decoder == NULL) do_something; - * FLAC__seekable_stream_decoder_set_md5_checking(decoder, true); - * [... other settings ...] - * FLAC__seekable_stream_decoder_set_read_callback(decoder, my_read_callback); - * FLAC__seekable_stream_decoder_set_seek_callback(decoder, my_seek_callback); - * FLAC__seekable_stream_decoder_set_tell_callback(decoder, my_tell_callback); - * FLAC__seekable_stream_decoder_set_length_callback(decoder, my_length_callback); - * FLAC__seekable_stream_decoder_set_eof_callback(decoder, my_eof_callback); - * FLAC__seekable_stream_decoder_set_write_callback(decoder, my_write_callback); - * FLAC__seekable_stream_decoder_set_metadata_callback(decoder, my_metadata_callback); - * FLAC__seekable_stream_decoder_set_error_callback(decoder, my_error_callback); - * FLAC__seekable_stream_decoder_set_client_data(decoder, my_client_data); - * if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK) do_something; - * \endcode - * - * In FLAC 1.1.3 it is like this: - * - * \code - * FLAC__StreamDecoder *decoder = FLAC__stream_decoder_new(); - * if(decoder == NULL) do_something; - * FLAC__stream_decoder_set_md5_checking(decoder, true); - * [... other settings ...] - * if(FLAC__stream_decoder_init_stream( - * decoder, - * my_read_callback, - * my_seek_callback, // or NULL - * my_tell_callback, // or NULL - * my_length_callback, // or NULL - * my_eof_callback, // or NULL - * my_write_callback, - * my_metadata_callback, // or NULL - * my_error_callback, - * my_client_data - * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; - * \endcode - * - * or you could do; - * - * \code - * [...] - * FILE *file = fopen("somefile.flac","rb"); - * if(file == NULL) do_somthing; - * if(FLAC__stream_decoder_init_FILE( - * decoder, - * file, - * my_write_callback, - * my_metadata_callback, // or NULL - * my_error_callback, - * my_client_data - * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; - * \endcode - * - * or just: - * - * \code - * [...] - * if(FLAC__stream_decoder_init_file( - * decoder, - * "somefile.flac", - * my_write_callback, - * my_metadata_callback, // or NULL - * my_error_callback, - * my_client_data - * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; - * \endcode - * - * Another small change to the decoder is in how it handles unparseable - * streams. Before, when the decoder found an unparseable stream - * (reserved for when the decoder encounters a stream from a future - * encoder that it can't parse), it changed the state to - * \c FLAC__STREAM_DECODER_UNPARSEABLE_STREAM. Now the decoder instead - * drops sync and calls the error callback with a new error code - * \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM. This is - * more robust. If your error callback does not discriminate on the the - * error state, your code does not need to be changed. - * - * The encoder now has a new setting: - * FLAC__stream_encoder_set_apodization(). This is for setting the - * method used to window the data before LPC analysis. You only need to - * add a call to this function if the default is not suitable. There - * are also two new convenience functions that may be useful: - * FLAC__metadata_object_cuesheet_calculate_cddb_id() and - * FLAC__metadata_get_cuesheet(). - * - * The \a bytes parameter to FLAC__StreamDecoderReadCallback, - * FLAC__StreamEncoderReadCallback, and FLAC__StreamEncoderWriteCallback - * is now \c size_t instead of \c unsigned. - */ - -/** \defgroup porting_1_1_3_to_1_1_4 Porting from FLAC 1.1.3 to 1.1.4 - * \ingroup porting - * - * \brief - * This module describes porting from FLAC 1.1.3 to FLAC 1.1.4. - * - * There were no changes to any of the interfaces from 1.1.3 to 1.1.4. - * There was a slight change in the implementation of - * FLAC__stream_encoder_set_metadata(); the function now makes a copy - * of the \a metadata array of pointers so the client no longer needs - * to maintain it after the call. The objects themselves that are - * pointed to by the array are still not copied though and must be - * maintained until the call to FLAC__stream_encoder_finish(). - */ - -/** \defgroup porting_1_1_4_to_1_2_0 Porting from FLAC 1.1.4 to 1.2.0 - * \ingroup porting - * - * \brief - * This module describes porting from FLAC 1.1.4 to FLAC 1.2.0. - * - * There were only very minor changes to the interfaces from 1.1.4 to 1.2.0. - * In libFLAC, \c FLAC__format_sample_rate_is_subset() was added. - * In libFLAC++, \c FLAC::Decoder::Stream::get_decode_position() was added. - * - * Finally, value of the constant \c FLAC__FRAME_HEADER_RESERVED_LEN - * has changed to reflect the conversion of one of the reserved bits - * into active use. It used to be \c 2 and now is \c 1. However the - * FLAC frame header length has not changed, so to skip the proper - * number of bits, use \c FLAC__FRAME_HEADER_RESERVED_LEN + - * \c FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN - */ - -/** \defgroup flac FLAC C API - * - * The FLAC C API is the interface to libFLAC, a set of structures - * describing the components of FLAC streams, and functions for - * encoding and decoding streams, as well as manipulating FLAC - * metadata in files. - * - * You should start with the format components as all other modules - * are dependent on it. - */ - -#endif diff --git a/src/contrib/flacdecoder/include/FLAC/assert.h b/src/contrib/flacdecoder/include/FLAC/assert.h deleted file mode 100644 index 3fc03f316..000000000 --- a/src/contrib/flacdecoder/include/FLAC/assert.h +++ /dev/null @@ -1,45 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__ASSERT_H -#define FLAC__ASSERT_H - -/* we need this since some compilers (like MSVC) leave assert()s on release code (and we don't want to use their ASSERT) */ -#ifdef DEBUG -#include -#define FLAC__ASSERT(x) assert(x) -#define FLAC__ASSERT_DECLARATION(x) x -#else -#define FLAC__ASSERT(x) -#define FLAC__ASSERT_DECLARATION(x) -#endif - -#endif diff --git a/src/contrib/flacdecoder/include/FLAC/callback.h b/src/contrib/flacdecoder/include/FLAC/callback.h deleted file mode 100644 index c9541210b..000000000 --- a/src/contrib/flacdecoder/include/FLAC/callback.h +++ /dev/null @@ -1,184 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2004,2005,2006,2007 Josh Coalson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__CALLBACK_H -#define FLAC__CALLBACK_H - -#include "ordinals.h" -#include /* for size_t */ - -/** \file include/FLAC/callback.h - * - * \brief - * This module defines the structures for describing I/O callbacks - * to the other FLAC interfaces. - * - * See the detailed documentation for callbacks in the - * \link flac_callbacks callbacks \endlink module. - */ - -/** \defgroup flac_callbacks FLAC/callback.h: I/O callback structures - * \ingroup flac - * - * \brief - * This module defines the structures for describing I/O callbacks - * to the other FLAC interfaces. - * - * The purpose of the I/O callback functions is to create a common way - * for the metadata interfaces to handle I/O. - * - * Originally the metadata interfaces required filenames as the way of - * specifying FLAC files to operate on. This is problematic in some - * environments so there is an additional option to specify a set of - * callbacks for doing I/O on the FLAC file, instead of the filename. - * - * In addition to the callbacks, a FLAC__IOHandle type is defined as an - * opaque structure for a data source. - * - * The callback function prototypes are similar (but not identical) to the - * stdio functions fread, fwrite, fseek, ftell, feof, and fclose. If you use - * stdio streams to implement the callbacks, you can pass fread, fwrite, and - * fclose anywhere a FLAC__IOCallback_Read, FLAC__IOCallback_Write, or - * FLAC__IOCallback_Close is required, and a FILE* anywhere a FLAC__IOHandle - * is required. \warning You generally CANNOT directly use fseek or ftell - * for FLAC__IOCallback_Seek or FLAC__IOCallback_Tell since on most systems - * these use 32-bit offsets and FLAC requires 64-bit offsets to deal with - * large files. You will have to find an equivalent function (e.g. ftello), - * or write a wrapper. The same is true for feof() since this is usually - * implemented as a macro, not as a function whose address can be taken. - * - * \{ - */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** This is the opaque handle type used by the callbacks. Typically - * this is a \c FILE* or address of a file descriptor. - */ -typedef void* FLAC__IOHandle; - -/** Signature for the read callback. - * The signature and semantics match POSIX fread() implementations - * and can generally be used interchangeably. - * - * \param ptr The address of the read buffer. - * \param size The size of the records to be read. - * \param nmemb The number of records to be read. - * \param handle The handle to the data source. - * \retval size_t - * The number of records read. - */ -typedef size_t (*FLAC__IOCallback_Read) (void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); - -/** Signature for the write callback. - * The signature and semantics match POSIX fwrite() implementations - * and can generally be used interchangeably. - * - * \param ptr The address of the write buffer. - * \param size The size of the records to be written. - * \param nmemb The number of records to be written. - * \param handle The handle to the data source. - * \retval size_t - * The number of records written. - */ -typedef size_t (*FLAC__IOCallback_Write) (const void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); - -/** Signature for the seek callback. - * The signature and semantics mostly match POSIX fseek() WITH ONE IMPORTANT - * EXCEPTION: the offset is a 64-bit type whereas fseek() is generally 'long' - * and 32-bits wide. - * - * \param handle The handle to the data source. - * \param offset The new position, relative to \a whence - * \param whence \c SEEK_SET, \c SEEK_CUR, or \c SEEK_END - * \retval int - * \c 0 on success, \c -1 on error. - */ -typedef int (*FLAC__IOCallback_Seek) (FLAC__IOHandle handle, FLAC__int64 offset, int whence); - -/** Signature for the tell callback. - * The signature and semantics mostly match POSIX ftell() WITH ONE IMPORTANT - * EXCEPTION: the offset is a 64-bit type whereas ftell() is generally 'long' - * and 32-bits wide. - * - * \param handle The handle to the data source. - * \retval FLAC__int64 - * The current position on success, \c -1 on error. - */ -typedef FLAC__int64 (*FLAC__IOCallback_Tell) (FLAC__IOHandle handle); - -/** Signature for the EOF callback. - * The signature and semantics mostly match POSIX feof() but WATCHOUT: - * on many systems, feof() is a macro, so in this case a wrapper function - * must be provided instead. - * - * \param handle The handle to the data source. - * \retval int - * \c 0 if not at end of file, nonzero if at end of file. - */ -typedef int (*FLAC__IOCallback_Eof) (FLAC__IOHandle handle); - -/** Signature for the close callback. - * The signature and semantics match POSIX fclose() implementations - * and can generally be used interchangeably. - * - * \param handle The handle to the data source. - * \retval int - * \c 0 on success, \c EOF on error. - */ -typedef int (*FLAC__IOCallback_Close) (FLAC__IOHandle handle); - -/** A structure for holding a set of callbacks. - * Each FLAC interface that requires a FLAC__IOCallbacks structure will - * describe which of the callbacks are required. The ones that are not - * required may be set to NULL. - * - * If the seek requirement for an interface is optional, you can signify that - * a data sorce is not seekable by setting the \a seek field to \c NULL. - */ -typedef struct { - FLAC__IOCallback_Read read; - FLAC__IOCallback_Write write; - FLAC__IOCallback_Seek seek; - FLAC__IOCallback_Tell tell; - FLAC__IOCallback_Eof eof; - FLAC__IOCallback_Close close; -} FLAC__IOCallbacks; - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/contrib/flacdecoder/include/FLAC/export.h b/src/contrib/flacdecoder/include/FLAC/export.h deleted file mode 100644 index a525f29c1..000000000 --- a/src/contrib/flacdecoder/include/FLAC/export.h +++ /dev/null @@ -1,91 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__EXPORT_H -#define FLAC__EXPORT_H - -/** \file include/FLAC/export.h - * - * \brief - * This module contains #defines and symbols for exporting function - * calls, and providing version information and compiled-in features. - * - * See the \link flac_export export \endlink module. - */ - -/** \defgroup flac_export FLAC/export.h: export symbols - * \ingroup flac - * - * \brief - * This module contains #defines and symbols for exporting function - * calls, and providing version information and compiled-in features. - * - * If you are compiling with MSVC and will link to the static library - * (libFLAC.lib) you should define FLAC__NO_DLL in your project to - * make sure the symbols are exported properly. - * - * \{ - */ - -#if defined(FLAC__NO_DLL) || !defined(_MSC_VER) -#define FLAC_API - -#else - -#ifdef FLAC_API_EXPORTS -#define FLAC_API _declspec(dllexport) -#else -#define FLAC_API _declspec(dllimport) - -#endif -#endif - -/** These #defines will mirror the libtool-based library version number, see - * http://www.gnu.org/software/libtool/manual.html#Libtool-versioning - */ -#define FLAC_API_VERSION_CURRENT 10 -#define FLAC_API_VERSION_REVISION 0 /**< see above */ -#define FLAC_API_VERSION_AGE 2 /**< see above */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** \c 1 if the library has been compiled with support for Ogg FLAC, else \c 0. */ -extern FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC; - -#ifdef __cplusplus -} -#endif - -/* \} */ - -#endif diff --git a/src/contrib/flacdecoder/include/FLAC/format.h b/src/contrib/flacdecoder/include/FLAC/format.h deleted file mode 100644 index 77e2d0130..000000000 --- a/src/contrib/flacdecoder/include/FLAC/format.h +++ /dev/null @@ -1,1010 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__FORMAT_H -#define FLAC__FORMAT_H - -#include "export.h" -#include "ordinals.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** \file include/FLAC/format.h - * - * \brief - * This module contains structure definitions for the representation - * of FLAC format components in memory. These are the basic - * structures used by the rest of the interfaces. - * - * See the detailed documentation in the - * \link flac_format format \endlink module. - */ - -/** \defgroup flac_format FLAC/format.h: format components - * \ingroup flac - * - * \brief - * This module contains structure definitions for the representation - * of FLAC format components in memory. These are the basic - * structures used by the rest of the interfaces. - * - * First, you should be familiar with the - * FLAC format. Many of the values here - * follow directly from the specification. As a user of libFLAC, the - * interesting parts really are the structures that describe the frame - * header and metadata blocks. - * - * The format structures here are very primitive, designed to store - * information in an efficient way. Reading information from the - * structures is easy but creating or modifying them directly is - * more complex. For the most part, as a user of a library, editing - * is not necessary; however, for metadata blocks it is, so there are - * convenience functions provided in the \link flac_metadata metadata - * module \endlink to simplify the manipulation of metadata blocks. - * - * \note - * It's not the best convention, but symbols ending in _LEN are in bits - * and _LENGTH are in bytes. _LENGTH symbols are \#defines instead of - * global variables because they are usually used when declaring byte - * arrays and some compilers require compile-time knowledge of array - * sizes when declared on the stack. - * - * \{ - */ - - -/* - Most of the values described in this file are defined by the FLAC - format specification. There is nothing to tune here. -*/ - -/** The largest legal metadata type code. */ -#define FLAC__MAX_METADATA_TYPE_CODE (126u) - -/** The minimum block size, in samples, permitted by the format. */ -#define FLAC__MIN_BLOCK_SIZE (16u) - -/** The maximum block size, in samples, permitted by the format. */ -#define FLAC__MAX_BLOCK_SIZE (65535u) - -/** The maximum block size, in samples, permitted by the FLAC subset for - * sample rates up to 48kHz. */ -#define FLAC__SUBSET_MAX_BLOCK_SIZE_48000HZ (4608u) - -/** The maximum number of channels permitted by the format. */ -#define FLAC__MAX_CHANNELS (8u) - -/** The minimum sample resolution permitted by the format. */ -#define FLAC__MIN_BITS_PER_SAMPLE (4u) - -/** The maximum sample resolution permitted by the format. */ -#define FLAC__MAX_BITS_PER_SAMPLE (32u) - -/** The maximum sample resolution permitted by libFLAC. - * - * \warning - * FLAC__MAX_BITS_PER_SAMPLE is the limit of the FLAC format. However, - * the reference encoder/decoder is currently limited to 24 bits because - * of prevalent 32-bit math, so make sure and use this value when - * appropriate. - */ -#define FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE (24u) - -/** The maximum sample rate permitted by the format. The value is - * ((2 ^ 16) - 1) * 10; see FLAC format - * as to why. - */ -#define FLAC__MAX_SAMPLE_RATE (655350u) - -/** The maximum LPC order permitted by the format. */ -#define FLAC__MAX_LPC_ORDER (32u) - -/** The maximum LPC order permitted by the FLAC subset for sample rates - * up to 48kHz. */ -#define FLAC__SUBSET_MAX_LPC_ORDER_48000HZ (12u) - -/** The minimum quantized linear predictor coefficient precision - * permitted by the format. - */ -#define FLAC__MIN_QLP_COEFF_PRECISION (5u) - -/** The maximum quantized linear predictor coefficient precision - * permitted by the format. - */ -#define FLAC__MAX_QLP_COEFF_PRECISION (15u) - -/** The maximum order of the fixed predictors permitted by the format. */ -#define FLAC__MAX_FIXED_ORDER (4u) - -/** The maximum Rice partition order permitted by the format. */ -#define FLAC__MAX_RICE_PARTITION_ORDER (15u) - -/** The maximum Rice partition order permitted by the FLAC Subset. */ -#define FLAC__SUBSET_MAX_RICE_PARTITION_ORDER (8u) - -/** The version string of the release, stamped onto the libraries and binaries. - * - * \note - * This does not correspond to the shared library version number, which - * is used to determine binary compatibility. - */ -extern FLAC_API const char *FLAC__VERSION_STRING; - -/** The vendor string inserted by the encoder into the VORBIS_COMMENT block. - * This is a NUL-terminated ASCII string; when inserted into the - * VORBIS_COMMENT the trailing null is stripped. - */ -extern FLAC_API const char *FLAC__VENDOR_STRING; - -/** The byte string representation of the beginning of a FLAC stream. */ -extern FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4]; /* = "fLaC" */ - -/** The 32-bit integer big-endian representation of the beginning of - * a FLAC stream. - */ -extern FLAC_API const unsigned FLAC__STREAM_SYNC; /* = 0x664C6143 */ - -/** The length of the FLAC signature in bits. */ -extern FLAC_API const unsigned FLAC__STREAM_SYNC_LEN; /* = 32 bits */ - -/** The length of the FLAC signature in bytes. */ -#define FLAC__STREAM_SYNC_LENGTH (4u) - - -/***************************************************************************** - * - * Subframe structures - * - *****************************************************************************/ - -/*****************************************************************************/ - -/** An enumeration of the available entropy coding methods. */ -typedef enum { - FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE = 0, - /**< Residual is coded by partitioning into contexts, each with it's own - * 4-bit Rice parameter. */ - - FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 = 1 - /**< Residual is coded by partitioning into contexts, each with it's own - * 5-bit Rice parameter. */ -} FLAC__EntropyCodingMethodType; - -/** Maps a FLAC__EntropyCodingMethodType to a C string. - * - * Using a FLAC__EntropyCodingMethodType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__EntropyCodingMethodTypeString[]; - - -/** Contents of a Rice partitioned residual - */ -typedef struct { - - unsigned *parameters; - /**< The Rice parameters for each context. */ - - unsigned *raw_bits; - /**< Widths for escape-coded partitions. Will be non-zero for escaped - * partitions and zero for unescaped partitions. - */ - - unsigned capacity_by_order; - /**< The capacity of the \a parameters and \a raw_bits arrays - * specified as an order, i.e. the number of array elements - * allocated is 2 ^ \a capacity_by_order. - */ -} FLAC__EntropyCodingMethod_PartitionedRiceContents; - -/** Header for a Rice partitioned residual. (c.f. format specification) - */ -typedef struct { - - unsigned order; - /**< The partition order, i.e. # of contexts = 2 ^ \a order. */ - - const FLAC__EntropyCodingMethod_PartitionedRiceContents *contents; - /**< The context's Rice parameters and/or raw bits. */ - -} FLAC__EntropyCodingMethod_PartitionedRice; - -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN; /**< == 5 (bits) */ -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN; /**< == 5 (bits) */ - -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; -/**< == (1<format specification) - */ -typedef struct { - FLAC__EntropyCodingMethodType type; - union { - FLAC__EntropyCodingMethod_PartitionedRice partitioned_rice; - } data; -} FLAC__EntropyCodingMethod; - -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_TYPE_LEN; /**< == 2 (bits) */ - -/*****************************************************************************/ - -/** An enumeration of the available subframe types. */ -typedef enum { - FLAC__SUBFRAME_TYPE_CONSTANT = 0, /**< constant signal */ - FLAC__SUBFRAME_TYPE_VERBATIM = 1, /**< uncompressed signal */ - FLAC__SUBFRAME_TYPE_FIXED = 2, /**< fixed polynomial prediction */ - FLAC__SUBFRAME_TYPE_LPC = 3 /**< linear prediction */ -} FLAC__SubframeType; - -/** Maps a FLAC__SubframeType to a C string. - * - * Using a FLAC__SubframeType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__SubframeTypeString[]; - - -/** CONSTANT subframe. (c.f. format specification) - */ -typedef struct { - FLAC__int32 value; /**< The constant signal value. */ -} FLAC__Subframe_Constant; - - -/** VERBATIM subframe. (c.f. format specification) - */ -typedef struct { - const FLAC__int32 *data; /**< A pointer to verbatim signal. */ -} FLAC__Subframe_Verbatim; - - -/** FIXED subframe. (c.f. format specification) - */ -typedef struct { - FLAC__EntropyCodingMethod entropy_coding_method; - /**< The residual coding method. */ - - unsigned order; - /**< The polynomial order. */ - - FLAC__int32 warmup[FLAC__MAX_FIXED_ORDER]; - /**< Warmup samples to prime the predictor, length == order. */ - - const FLAC__int32 *residual; - /**< The residual signal, length == (blocksize minus order) samples. */ -} FLAC__Subframe_Fixed; - - -/** LPC subframe. (c.f. format specification) - */ -typedef struct { - FLAC__EntropyCodingMethod entropy_coding_method; - /**< The residual coding method. */ - - unsigned order; - /**< The FIR order. */ - - unsigned qlp_coeff_precision; - /**< Quantized FIR filter coefficient precision in bits. */ - - int quantization_level; - /**< The qlp coeff shift needed. */ - - FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; - /**< FIR filter coefficients. */ - - FLAC__int32 warmup[FLAC__MAX_LPC_ORDER]; - /**< Warmup samples to prime the predictor, length == order. */ - - const FLAC__int32 *residual; - /**< The residual signal, length == (blocksize minus order) samples. */ -} FLAC__Subframe_LPC; - -extern FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN; /**< == 5 (bits) */ - - -/** FLAC subframe structure. (c.f. format specification) - */ -typedef struct { - FLAC__SubframeType type; - union { - FLAC__Subframe_Constant constant; - FLAC__Subframe_Fixed fixed; - FLAC__Subframe_LPC lpc; - FLAC__Subframe_Verbatim verbatim; - } data; - unsigned wasted_bits; -} FLAC__Subframe; - -/** == 1 (bit) - * - * This used to be a zero-padding bit (hence the name - * FLAC__SUBFRAME_ZERO_PAD_LEN) but is now a reserved bit. It still has a - * mandatory value of \c 0 but in the future may take on the value \c 0 or \c 1 - * to mean something else. - */ -extern FLAC_API const unsigned FLAC__SUBFRAME_ZERO_PAD_LEN; -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LEN; /**< == 6 (bits) */ -extern FLAC_API const unsigned FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN; /**< == 1 (bit) */ - -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_CONSTANT_BYTE_ALIGNED_MASK; /**< = 0x00 */ -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_VERBATIM_BYTE_ALIGNED_MASK; /**< = 0x02 */ -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_FIXED_BYTE_ALIGNED_MASK; /**< = 0x10 */ -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK; /**< = 0x40 */ - -/*****************************************************************************/ - - -/***************************************************************************** - * - * Frame structures - * - *****************************************************************************/ - -/** An enumeration of the available channel assignments. */ -typedef enum { - FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT = 0, /**< independent channels */ - FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE = 1, /**< left+side stereo */ - FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE = 2, /**< right+side stereo */ - FLAC__CHANNEL_ASSIGNMENT_MID_SIDE = 3 /**< mid+side stereo */ -} FLAC__ChannelAssignment; - -/** Maps a FLAC__ChannelAssignment to a C string. - * - * Using a FLAC__ChannelAssignment as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__ChannelAssignmentString[]; - -/** An enumeration of the possible frame numbering methods. */ -typedef enum { - FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER, /**< number contains the frame number */ - FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER /**< number contains the sample number of first sample in frame */ -} FLAC__FrameNumberType; - -/** Maps a FLAC__FrameNumberType to a C string. - * - * Using a FLAC__FrameNumberType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__FrameNumberTypeString[]; - - -/** FLAC frame header structure. (c.f. format specification) - */ -typedef struct { - unsigned blocksize; - /**< The number of samples per subframe. */ - - unsigned sample_rate; - /**< The sample rate in Hz. */ - - unsigned channels; - /**< The number of channels (== number of subframes). */ - - FLAC__ChannelAssignment channel_assignment; - /**< The channel assignment for the frame. */ - - unsigned bits_per_sample; - /**< The sample resolution. */ - - FLAC__FrameNumberType number_type; - /**< The numbering scheme used for the frame. As a convenience, the - * decoder will always convert a frame number to a sample number because - * the rules are complex. */ - - union { - FLAC__uint32 frame_number; - FLAC__uint64 sample_number; - } number; - /**< The frame number or sample number of first sample in frame; - * use the \a number_type value to determine which to use. */ - - FLAC__uint8 crc; - /**< CRC-8 (polynomial = x^8 + x^2 + x^1 + x^0, initialized with 0) - * of the raw frame header bytes, meaning everything before the CRC byte - * including the sync code. - */ -} FLAC__FrameHeader; - -extern FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC; /**< == 0x3ffe; the frame header sync code */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC_LEN; /**< == 14 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_RESERVED_LEN; /**< == 1 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN; /**< == 1 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCK_SIZE_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_SAMPLE_RATE_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN; /**< == 3 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_ZERO_PAD_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_CRC_LEN; /**< == 8 (bits) */ - - -/** FLAC frame footer structure. (c.f. format specification) - */ -typedef struct { - FLAC__uint16 crc; - /**< CRC-16 (polynomial = x^16 + x^15 + x^2 + x^0, initialized with - * 0) of the bytes before the crc, back to and including the frame header - * sync code. - */ -} FLAC__FrameFooter; - -extern FLAC_API const unsigned FLAC__FRAME_FOOTER_CRC_LEN; /**< == 16 (bits) */ - - -/** FLAC frame structure. (c.f. format specification) - */ -typedef struct { - FLAC__FrameHeader header; - FLAC__Subframe subframes[FLAC__MAX_CHANNELS]; - FLAC__FrameFooter footer; -} FLAC__Frame; - -/*****************************************************************************/ - - -/***************************************************************************** - * - * Meta-data structures - * - *****************************************************************************/ - -/** An enumeration of the available metadata block types. */ -typedef enum { - - FLAC__METADATA_TYPE_STREAMINFO = 0, - /**< STREAMINFO block */ - - FLAC__METADATA_TYPE_PADDING = 1, - /**< PADDING block */ - - FLAC__METADATA_TYPE_APPLICATION = 2, - /**< APPLICATION block */ - - FLAC__METADATA_TYPE_SEEKTABLE = 3, - /**< SEEKTABLE block */ - - FLAC__METADATA_TYPE_VORBIS_COMMENT = 4, - /**< VORBISCOMMENT block (a.k.a. FLAC tags) */ - - FLAC__METADATA_TYPE_CUESHEET = 5, - /**< CUESHEET block */ - - FLAC__METADATA_TYPE_PICTURE = 6, - /**< PICTURE block */ - - FLAC__METADATA_TYPE_UNDEFINED = 7 - /**< marker to denote beginning of undefined type range; this number will increase as new metadata types are added */ - -} FLAC__MetadataType; - -/** Maps a FLAC__MetadataType to a C string. - * - * Using a FLAC__MetadataType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__MetadataTypeString[]; - - -/** FLAC STREAMINFO structure. (c.f. format specification) - */ -typedef struct { - unsigned min_blocksize, max_blocksize; - unsigned min_framesize, max_framesize; - unsigned sample_rate; - unsigned channels; - unsigned bits_per_sample; - FLAC__uint64 total_samples; - FLAC__byte md5sum[16]; -} FLAC__StreamMetadata_StreamInfo; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; /**< == 16 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN; /**< == 16 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN; /**< == 24 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN; /**< == 24 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN; /**< == 20 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN; /**< == 3 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN; /**< == 5 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN; /**< == 36 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MD5SUM_LEN; /**< == 128 (bits) */ - -/** The total stream length of the STREAMINFO block in bytes. */ -#define FLAC__STREAM_METADATA_STREAMINFO_LENGTH (34u) - -/** FLAC PADDING structure. (c.f. format specification) - */ -typedef struct { - int dummy; - /**< Conceptually this is an empty struct since we don't store the - * padding bytes. Empty structs are not allowed by some C compilers, - * hence the dummy. - */ -} FLAC__StreamMetadata_Padding; - - -/** FLAC APPLICATION structure. (c.f. format specification) - */ -typedef struct { - FLAC__byte id[4]; - FLAC__byte *data; -} FLAC__StreamMetadata_Application; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_APPLICATION_ID_LEN; /**< == 32 (bits) */ - -/** SeekPoint structure used in SEEKTABLE blocks. (c.f. format specification) - */ -typedef struct { - FLAC__uint64 sample_number; - /**< The sample number of the target frame. */ - - FLAC__uint64 stream_offset; - /**< The offset, in bytes, of the target frame with respect to - * beginning of the first frame. */ - - unsigned frame_samples; - /**< The number of samples in the target frame. */ -} FLAC__StreamMetadata_SeekPoint; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN; /**< == 16 (bits) */ - -/** The total stream length of a seek point in bytes. */ -#define FLAC__STREAM_METADATA_SEEKPOINT_LENGTH (18u) - -/** The value used in the \a sample_number field of - * FLAC__StreamMetadataSeekPoint used to indicate a placeholder - * point (== 0xffffffffffffffff). - */ -extern FLAC_API const FLAC__uint64 FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; - - -/** FLAC SEEKTABLE structure. (c.f. format specification) - * - * \note From the format specification: - * - The seek points must be sorted by ascending sample number. - * - Each seek point's sample number must be the first sample of the - * target frame. - * - Each seek point's sample number must be unique within the table. - * - Existence of a SEEKTABLE block implies a correct setting of - * total_samples in the stream_info block. - * - Behavior is undefined when more than one SEEKTABLE block is - * present in a stream. - */ -typedef struct { - unsigned num_points; - FLAC__StreamMetadata_SeekPoint *points; -} FLAC__StreamMetadata_SeekTable; - - -/** Vorbis comment entry structure used in VORBIS_COMMENT blocks. (c.f. format specification) - * - * For convenience, the APIs maintain a trailing NUL character at the end of - * \a entry which is not counted toward \a length, i.e. - * \code strlen(entry) == length \endcode - */ -typedef struct { - FLAC__uint32 length; - FLAC__byte *entry; -} FLAC__StreamMetadata_VorbisComment_Entry; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN; /**< == 32 (bits) */ - - -/** FLAC VORBIS_COMMENT structure. (c.f. format specification) - */ -typedef struct { - FLAC__StreamMetadata_VorbisComment_Entry vendor_string; - FLAC__uint32 num_comments; - FLAC__StreamMetadata_VorbisComment_Entry *comments; -} FLAC__StreamMetadata_VorbisComment; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN; /**< == 32 (bits) */ - - -/** FLAC CUESHEET track index structure. (See the - * format specification for - * the full description of each field.) - */ -typedef struct { - FLAC__uint64 offset; - /**< Offset in samples, relative to the track offset, of the index - * point. - */ - - FLAC__byte number; - /**< The index point number. */ -} FLAC__StreamMetadata_CueSheet_Index; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN; /**< == 8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN; /**< == 3*8 (bits) */ - - -/** FLAC CUESHEET track structure. (See the - * format specification for - * the full description of each field.) - */ -typedef struct { - FLAC__uint64 offset; - /**< Track offset in samples, relative to the beginning of the FLAC audio stream. */ - - FLAC__byte number; - /**< The track number. */ - - char isrc[13]; - /**< Track ISRC. This is a 12-digit alphanumeric code plus a trailing \c NUL byte */ - - unsigned type:1; - /**< The track type: 0 for audio, 1 for non-audio. */ - - unsigned pre_emphasis:1; - /**< The pre-emphasis flag: 0 for no pre-emphasis, 1 for pre-emphasis. */ - - FLAC__byte num_indices; - /**< The number of track index points. */ - - FLAC__StreamMetadata_CueSheet_Index *indices; - /**< NULL if num_indices == 0, else pointer to array of index points. */ - -} FLAC__StreamMetadata_CueSheet_Track; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN; /**< == 8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN; /**< == 12*8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN; /**< == 6+13*8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN; /**< == 8 (bits) */ - - -/** FLAC CUESHEET structure. (See the - * format specification - * for the full description of each field.) - */ -typedef struct { - char media_catalog_number[129]; - /**< Media catalog number, in ASCII printable characters 0x20-0x7e. In - * general, the media catalog number may be 0 to 128 bytes long; any - * unused characters should be right-padded with NUL characters. - */ - - FLAC__uint64 lead_in; - /**< The number of lead-in samples. */ - - FLAC__bool is_cd; - /**< \c true if CUESHEET corresponds to a Compact Disc, else \c false. */ - - unsigned num_tracks; - /**< The number of tracks. */ - - FLAC__StreamMetadata_CueSheet_Track *tracks; - /**< NULL if num_tracks == 0, else pointer to array of tracks. */ - -} FLAC__StreamMetadata_CueSheet; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN; /**< == 128*8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN; /**< == 7+258*8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN; /**< == 8 (bits) */ - - -/** An enumeration of the PICTURE types (see FLAC__StreamMetadataPicture and id3 v2.4 APIC tag). */ -typedef enum { - FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER = 0, /**< Other */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD = 1, /**< 32x32 pixels 'file icon' (PNG only) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON = 2, /**< Other file icon */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER = 3, /**< Cover (front) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_BACK_COVER = 4, /**< Cover (back) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_LEAFLET_PAGE = 5, /**< Leaflet page */ - FLAC__STREAM_METADATA_PICTURE_TYPE_MEDIA = 6, /**< Media (e.g. label side of CD) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_LEAD_ARTIST = 7, /**< Lead artist/lead performer/soloist */ - FLAC__STREAM_METADATA_PICTURE_TYPE_ARTIST = 8, /**< Artist/performer */ - FLAC__STREAM_METADATA_PICTURE_TYPE_CONDUCTOR = 9, /**< Conductor */ - FLAC__STREAM_METADATA_PICTURE_TYPE_BAND = 10, /**< Band/Orchestra */ - FLAC__STREAM_METADATA_PICTURE_TYPE_COMPOSER = 11, /**< Composer */ - FLAC__STREAM_METADATA_PICTURE_TYPE_LYRICIST = 12, /**< Lyricist/text writer */ - FLAC__STREAM_METADATA_PICTURE_TYPE_RECORDING_LOCATION = 13, /**< Recording Location */ - FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_RECORDING = 14, /**< During recording */ - FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_PERFORMANCE = 15, /**< During performance */ - FLAC__STREAM_METADATA_PICTURE_TYPE_VIDEO_SCREEN_CAPTURE = 16, /**< Movie/video screen capture */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FISH = 17, /**< A bright coloured fish */ - FLAC__STREAM_METADATA_PICTURE_TYPE_ILLUSTRATION = 18, /**< Illustration */ - FLAC__STREAM_METADATA_PICTURE_TYPE_BAND_LOGOTYPE = 19, /**< Band/artist logotype */ - FLAC__STREAM_METADATA_PICTURE_TYPE_PUBLISHER_LOGOTYPE = 20, /**< Publisher/Studio logotype */ - FLAC__STREAM_METADATA_PICTURE_TYPE_UNDEFINED -} FLAC__StreamMetadata_Picture_Type; - -/** Maps a FLAC__StreamMetadata_Picture_Type to a C string. - * - * Using a FLAC__StreamMetadata_Picture_Type as the index to this array - * will give the string equivalent. The contents should not be - * modified. - */ -extern FLAC_API const char * const FLAC__StreamMetadata_Picture_TypeString[]; - -/** FLAC PICTURE structure. (See the - * format specification - * for the full description of each field.) - */ -typedef struct { - FLAC__StreamMetadata_Picture_Type type; - /**< The kind of picture stored. */ - - char *mime_type; - /**< Picture data's MIME type, in ASCII printable characters - * 0x20-0x7e, NUL terminated. For best compatibility with players, - * use picture data of MIME type \c image/jpeg or \c image/png. A - * MIME type of '-->' is also allowed, in which case the picture - * data should be a complete URL. In file storage, the MIME type is - * stored as a 32-bit length followed by the ASCII string with no NUL - * terminator, but is converted to a plain C string in this structure - * for convenience. - */ - - FLAC__byte *description; - /**< Picture's description in UTF-8, NUL terminated. In file storage, - * the description is stored as a 32-bit length followed by the UTF-8 - * string with no NUL terminator, but is converted to a plain C string - * in this structure for convenience. - */ - - FLAC__uint32 width; - /**< Picture's width in pixels. */ - - FLAC__uint32 height; - /**< Picture's height in pixels. */ - - FLAC__uint32 depth; - /**< Picture's color depth in bits-per-pixel. */ - - FLAC__uint32 colors; - /**< For indexed palettes (like GIF), picture's number of colors (the - * number of palette entries), or \c 0 for non-indexed (i.e. 2^depth). - */ - - FLAC__uint32 data_length; - /**< Length of binary picture data in bytes. */ - - FLAC__byte *data; - /**< Binary picture data. */ - -} FLAC__StreamMetadata_Picture; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_TYPE_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_COLORS_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN; /**< == 32 (bits) */ - - -/** Structure that is used when a metadata block of unknown type is loaded. - * The contents are opaque. The structure is used only internally to - * correctly handle unknown metadata. - */ -typedef struct { - FLAC__byte *data; -} FLAC__StreamMetadata_Unknown; - - -/** FLAC metadata block structure. (c.f. format specification) - */ -typedef struct { - FLAC__MetadataType type; - /**< The type of the metadata block; used determine which member of the - * \a data union to dereference. If type >= FLAC__METADATA_TYPE_UNDEFINED - * then \a data.unknown must be used. */ - - FLAC__bool is_last; - /**< \c true if this metadata block is the last, else \a false */ - - unsigned length; - /**< Length, in bytes, of the block data as it appears in the stream. */ - - union { - FLAC__StreamMetadata_StreamInfo stream_info; - FLAC__StreamMetadata_Padding padding; - FLAC__StreamMetadata_Application application; - FLAC__StreamMetadata_SeekTable seek_table; - FLAC__StreamMetadata_VorbisComment vorbis_comment; - FLAC__StreamMetadata_CueSheet cue_sheet; - FLAC__StreamMetadata_Picture picture; - FLAC__StreamMetadata_Unknown unknown; - } data; - /**< Polymorphic block data; use the \a type value to determine which - * to use. */ -} FLAC__StreamMetadata; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_IS_LAST_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_TYPE_LEN; /**< == 7 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_LENGTH_LEN; /**< == 24 (bits) */ - -/** The total stream length of a metadata block header in bytes. */ -#define FLAC__STREAM_METADATA_HEADER_LENGTH (4u) - -/*****************************************************************************/ - - -/***************************************************************************** - * - * Utility functions - * - *****************************************************************************/ - -/** Tests that a sample rate is valid for FLAC. - * - * \param sample_rate The sample rate to test for compliance. - * \retval FLAC__bool - * \c true if the given sample rate conforms to the specification, else - * \c false. - */ -FLAC_API FLAC__bool FLAC__format_sample_rate_is_valid(unsigned sample_rate); - -/** Tests that a sample rate is valid for the FLAC subset. The subset rules - * for valid sample rates are slightly more complex since the rate has to - * be expressible completely in the frame header. - * - * \param sample_rate The sample rate to test for compliance. - * \retval FLAC__bool - * \c true if the given sample rate conforms to the specification for the - * subset, else \c false. - */ -FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(unsigned sample_rate); - -/** Check a Vorbis comment entry name to see if it conforms to the Vorbis - * comment specification. - * - * Vorbis comment names must be composed only of characters from - * [0x20-0x3C,0x3E-0x7D]. - * - * \param name A NUL-terminated string to be checked. - * \assert - * \code name != NULL \endcode - * \retval FLAC__bool - * \c false if entry name is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name); - -/** Check a Vorbis comment entry value to see if it conforms to the Vorbis - * comment specification. - * - * Vorbis comment values must be valid UTF-8 sequences. - * - * \param value A string to be checked. - * \param length A the length of \a value in bytes. May be - * \c (unsigned)(-1) to indicate that \a value is a plain - * UTF-8 NUL-terminated string. - * \assert - * \code value != NULL \endcode - * \retval FLAC__bool - * \c false if entry name is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, unsigned length); - -/** Check a Vorbis comment entry to see if it conforms to the Vorbis - * comment specification. - * - * Vorbis comment entries must be of the form 'name=value', and 'name' and - * 'value' must be legal according to - * FLAC__format_vorbiscomment_entry_name_is_legal() and - * FLAC__format_vorbiscomment_entry_value_is_legal() respectively. - * - * \param entry An entry to be checked. - * \param length The length of \a entry in bytes. - * \assert - * \code value != NULL \endcode - * \retval FLAC__bool - * \c false if entry name is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, unsigned length); - -/** Check a seek table to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * seek table. - * - * \param seek_table A pointer to a seek table to be checked. - * \assert - * \code seek_table != NULL \endcode - * \retval FLAC__bool - * \c false if seek table is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table); - -/** Sort a seek table's seek points according to the format specification. - * This includes a "unique-ification" step to remove duplicates, i.e. - * seek points with identical \a sample_number values. Duplicate seek - * points are converted into placeholder points and sorted to the end of - * the table. - * - * \param seek_table A pointer to a seek table to be sorted. - * \assert - * \code seek_table != NULL \endcode - * \retval unsigned - * The number of duplicate seek points converted into placeholders. - */ -FLAC_API unsigned FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table); - -/** Check a cue sheet to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * cue sheet. - * - * \param cue_sheet A pointer to an existing cue sheet to be checked. - * \param check_cd_da_subset If \c true, check CUESHEET against more - * stringent requirements for a CD-DA (audio) disc. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code cue_sheet != NULL \endcode - * \retval FLAC__bool - * \c false if cue sheet is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation); - -/** Check picture data to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * PICTURE block. - * - * \param picture A pointer to existing picture data to be checked. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code picture != NULL \endcode - * \retval FLAC__bool - * \c false if picture data is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Picture *picture, const char **violation); - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/contrib/flacdecoder/include/FLAC/metadata.h b/src/contrib/flacdecoder/include/FLAC/metadata.h deleted file mode 100644 index fff90b0ba..000000000 --- a/src/contrib/flacdecoder/include/FLAC/metadata.h +++ /dev/null @@ -1,2181 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__METADATA_H -#define FLAC__METADATA_H - -#include /* for off_t */ -#include "export.h" -#include "callback.h" -#include "format.h" - -/* -------------------------------------------------------------------- - (For an example of how all these routines are used, see the source - code for the unit tests in src/test_libFLAC/metadata_*.c, or - metaflac in src/metaflac/) - ------------------------------------------------------------------*/ - -/** \file include/FLAC/metadata.h - * - * \brief - * This module provides functions for creating and manipulating FLAC - * metadata blocks in memory, and three progressively more powerful - * interfaces for traversing and editing metadata in FLAC files. - * - * See the detailed documentation for each interface in the - * \link flac_metadata metadata \endlink module. - */ - -/** \defgroup flac_metadata FLAC/metadata.h: metadata interfaces - * \ingroup flac - * - * \brief - * This module provides functions for creating and manipulating FLAC - * metadata blocks in memory, and three progressively more powerful - * interfaces for traversing and editing metadata in native FLAC files. - * Note that currently only the Chain interface (level 2) supports Ogg - * FLAC files, and it is read-only i.e. no writing back changed - * metadata to file. - * - * There are three metadata interfaces of increasing complexity: - * - * Level 0: - * Read-only access to the STREAMINFO, VORBIS_COMMENT, CUESHEET, and - * PICTURE blocks. - * - * Level 1: - * Read-write access to all metadata blocks. This level is write- - * efficient in most cases (more on this below), and uses less memory - * than level 2. - * - * Level 2: - * Read-write access to all metadata blocks. This level is write- - * efficient in all cases, but uses more memory since all metadata for - * the whole file is read into memory and manipulated before writing - * out again. - * - * What do we mean by efficient? Since FLAC metadata appears at the - * beginning of the file, when writing metadata back to a FLAC file - * it is possible to grow or shrink the metadata such that the entire - * file must be rewritten. However, if the size remains the same during - * changes or PADDING blocks are utilized, only the metadata needs to be - * overwritten, which is much faster. - * - * Efficient means the whole file is rewritten at most one time, and only - * when necessary. Level 1 is not efficient only in the case that you - * cause more than one metadata block to grow or shrink beyond what can - * be accomodated by padding. In this case you should probably use level - * 2, which allows you to edit all the metadata for a file in memory and - * write it out all at once. - * - * All levels know how to skip over and not disturb an ID3v2 tag at the - * front of the file. - * - * All levels access files via their filenames. In addition, level 2 - * has additional alternative read and write functions that take an I/O - * handle and callbacks, for situations where access by filename is not - * possible. - * - * In addition to the three interfaces, this module defines functions for - * creating and manipulating various metadata objects in memory. As we see - * from the Format module, FLAC metadata blocks in memory are very primitive - * structures for storing information in an efficient way. Reading - * information from the structures is easy but creating or modifying them - * directly is more complex. The metadata object routines here facilitate - * this by taking care of the consistency and memory management drudgery. - * - * Unless you will be using the level 1 or 2 interfaces to modify existing - * metadata however, you will not probably not need these. - * - * From a dependency standpoint, none of the encoders or decoders require - * the metadata module. This is so that embedded users can strip out the - * metadata module from libFLAC to reduce the size and complexity. - */ - -#ifdef __cplusplus -extern "C" { -#endif - - -/** \defgroup flac_metadata_level0 FLAC/metadata.h: metadata level 0 interface - * \ingroup flac_metadata - * - * \brief - * The level 0 interface consists of individual routines to read the - * STREAMINFO, VORBIS_COMMENT, CUESHEET, and PICTURE blocks, requiring - * only a filename. - * - * They try to skip any ID3v2 tag at the head of the file. - * - * \{ - */ - -/** Read the STREAMINFO metadata block of the given FLAC file. This function - * will try to skip any ID3v2 tag at the head of the file. - * - * \param filename The path to the FLAC file to read. - * \param streaminfo A pointer to space for the STREAMINFO block. Since - * FLAC__StreamMetadata is a simple structure with no - * memory allocation involved, you pass the address of - * an existing structure. It need not be initialized. - * \assert - * \code filename != NULL \endcode - * \code streaminfo != NULL \endcode - * \retval FLAC__bool - * \c true if a valid STREAMINFO block was read from \a filename. Returns - * \c false if there was a memory allocation error, a file decoder error, - * or the file contained no STREAMINFO block. (A memory allocation error - * is possible because this function must set up a file decoder.) - */ -FLAC_API FLAC__bool FLAC__metadata_get_streaminfo(const char *filename, FLAC__StreamMetadata *streaminfo); - -/** Read the VORBIS_COMMENT metadata block of the given FLAC file. This - * function will try to skip any ID3v2 tag at the head of the file. - * - * \param filename The path to the FLAC file to read. - * \param tags The address where the returned pointer will be - * stored. The \a tags object must be deleted by - * the caller using FLAC__metadata_object_delete(). - * \assert - * \code filename != NULL \endcode - * \code tags != NULL \endcode - * \retval FLAC__bool - * \c true if a valid VORBIS_COMMENT block was read from \a filename, - * and \a *tags will be set to the address of the metadata structure. - * Returns \c false if there was a memory allocation error, a file - * decoder error, or the file contained no VORBIS_COMMENT block, and - * \a *tags will be set to \c NULL. - */ -FLAC_API FLAC__bool FLAC__metadata_get_tags(const char *filename, FLAC__StreamMetadata **tags); - -/** Read the CUESHEET metadata block of the given FLAC file. This - * function will try to skip any ID3v2 tag at the head of the file. - * - * \param filename The path to the FLAC file to read. - * \param cuesheet The address where the returned pointer will be - * stored. The \a cuesheet object must be deleted by - * the caller using FLAC__metadata_object_delete(). - * \assert - * \code filename != NULL \endcode - * \code cuesheet != NULL \endcode - * \retval FLAC__bool - * \c true if a valid CUESHEET block was read from \a filename, - * and \a *cuesheet will be set to the address of the metadata - * structure. Returns \c false if there was a memory allocation - * error, a file decoder error, or the file contained no CUESHEET - * block, and \a *cuesheet will be set to \c NULL. - */ -FLAC_API FLAC__bool FLAC__metadata_get_cuesheet(const char *filename, FLAC__StreamMetadata **cuesheet); - -/** Read a PICTURE metadata block of the given FLAC file. This - * function will try to skip any ID3v2 tag at the head of the file. - * Since there can be more than one PICTURE block in a file, this - * function takes a number of parameters that act as constraints to - * the search. The PICTURE block with the largest area matching all - * the constraints will be returned, or \a *picture will be set to - * \c NULL if there was no such block. - * - * \param filename The path to the FLAC file to read. - * \param picture The address where the returned pointer will be - * stored. The \a picture object must be deleted by - * the caller using FLAC__metadata_object_delete(). - * \param type The desired picture type. Use \c -1 to mean - * "any type". - * \param mime_type The desired MIME type, e.g. "image/jpeg". The - * string will be matched exactly. Use \c NULL to - * mean "any MIME type". - * \param description The desired description. The string will be - * matched exactly. Use \c NULL to mean "any - * description". - * \param max_width The maximum width in pixels desired. Use - * \c (unsigned)(-1) to mean "any width". - * \param max_height The maximum height in pixels desired. Use - * \c (unsigned)(-1) to mean "any height". - * \param max_depth The maximum color depth in bits-per-pixel desired. - * Use \c (unsigned)(-1) to mean "any depth". - * \param max_colors The maximum number of colors desired. Use - * \c (unsigned)(-1) to mean "any number of colors". - * \assert - * \code filename != NULL \endcode - * \code picture != NULL \endcode - * \retval FLAC__bool - * \c true if a valid PICTURE block was read from \a filename, - * and \a *picture will be set to the address of the metadata - * structure. Returns \c false if there was a memory allocation - * error, a file decoder error, or the file contained no PICTURE - * block, and \a *picture will be set to \c NULL. - */ -FLAC_API FLAC__bool FLAC__metadata_get_picture(const char *filename, FLAC__StreamMetadata **picture, FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors); - -/* \} */ - - -/** \defgroup flac_metadata_level1 FLAC/metadata.h: metadata level 1 interface - * \ingroup flac_metadata - * - * \brief - * The level 1 interface provides read-write access to FLAC file metadata and - * operates directly on the FLAC file. - * - * The general usage of this interface is: - * - * - Create an iterator using FLAC__metadata_simple_iterator_new() - * - Attach it to a file using FLAC__metadata_simple_iterator_init() and check - * the exit code. Call FLAC__metadata_simple_iterator_is_writable() to - * see if the file is writable, or only read access is allowed. - * - Use FLAC__metadata_simple_iterator_next() and - * FLAC__metadata_simple_iterator_prev() to traverse the blocks. - * This is does not read the actual blocks themselves. - * FLAC__metadata_simple_iterator_next() is relatively fast. - * FLAC__metadata_simple_iterator_prev() is slower since it needs to search - * forward from the front of the file. - * - Use FLAC__metadata_simple_iterator_get_block_type() or - * FLAC__metadata_simple_iterator_get_block() to access the actual data at - * the current iterator position. The returned object is yours to modify - * and free. - * - Use FLAC__metadata_simple_iterator_set_block() to write a modified block - * back. You must have write permission to the original file. Make sure to - * read the whole comment to FLAC__metadata_simple_iterator_set_block() - * below. - * - Use FLAC__metadata_simple_iterator_insert_block_after() to add new blocks. - * Use the object creation functions from - * \link flac_metadata_object here \endlink to generate new objects. - * - Use FLAC__metadata_simple_iterator_delete_block() to remove the block - * currently referred to by the iterator, or replace it with padding. - * - Destroy the iterator with FLAC__metadata_simple_iterator_delete() when - * finished. - * - * \note - * The FLAC file remains open the whole time between - * FLAC__metadata_simple_iterator_init() and - * FLAC__metadata_simple_iterator_delete(), so make sure you are not altering - * the file during this time. - * - * \note - * Do not modify the \a is_last, \a length, or \a type fields of returned - * FLAC__StreamMetadata objects. These are managed automatically. - * - * \note - * If any of the modification functions - * (FLAC__metadata_simple_iterator_set_block(), - * FLAC__metadata_simple_iterator_delete_block(), - * FLAC__metadata_simple_iterator_insert_block_after(), etc.) return \c false, - * you should delete the iterator as it may no longer be valid. - * - * \{ - */ - -struct FLAC__Metadata_SimpleIterator; -/** The opaque structure definition for the level 1 iterator type. - * See the - * \link flac_metadata_level1 metadata level 1 module \endlink - * for a detailed description. - */ -typedef struct FLAC__Metadata_SimpleIterator FLAC__Metadata_SimpleIterator; - -/** Status type for FLAC__Metadata_SimpleIterator. - * - * The iterator's current status can be obtained by calling FLAC__metadata_simple_iterator_status(). - */ -typedef enum { - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK = 0, - /**< The iterator is in the normal OK state */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, - /**< The data passed into a function violated the function's usage criteria */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE, - /**< The iterator could not open the target file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE, - /**< The iterator could not find the FLAC signature at the start of the file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE, - /**< The iterator tried to write to a file that was not writable */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA, - /**< The iterator encountered input that does not conform to the FLAC metadata specification */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR, - /**< The iterator encountered an error while reading the FLAC file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, - /**< The iterator encountered an error while seeking in the FLAC file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR, - /**< The iterator encountered an error while writing the FLAC file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR, - /**< The iterator encountered an error renaming the FLAC file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR, - /**< The iterator encountered an error removing the temporary file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR, - /**< Memory allocation failed */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR - /**< The caller violated an assertion or an unexpected error occurred */ - -} FLAC__Metadata_SimpleIteratorStatus; - -/** Maps a FLAC__Metadata_SimpleIteratorStatus to a C string. - * - * Using a FLAC__Metadata_SimpleIteratorStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__Metadata_SimpleIteratorStatusString[]; - - -/** Create a new iterator instance. - * - * \retval FLAC__Metadata_SimpleIterator* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__Metadata_SimpleIterator *FLAC__metadata_simple_iterator_new(void); - -/** Free an iterator instance. Deletes the object pointed to by \a iterator. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - */ -FLAC_API void FLAC__metadata_simple_iterator_delete(FLAC__Metadata_SimpleIterator *iterator); - -/** Get the current status of the iterator. Call this after a function - * returns \c false to get the reason for the error. Also resets the status - * to FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - * \retval FLAC__Metadata_SimpleIteratorStatus - * The current status of the iterator. - */ -FLAC_API FLAC__Metadata_SimpleIteratorStatus FLAC__metadata_simple_iterator_status(FLAC__Metadata_SimpleIterator *iterator); - -/** Initialize the iterator to point to the first metadata block in the - * given FLAC file. - * - * \param iterator A pointer to an existing iterator. - * \param filename The path to the FLAC file. - * \param read_only If \c true, the FLAC file will be opened - * in read-only mode; if \c false, the FLAC - * file will be opened for edit even if no - * edits are performed. - * \param preserve_file_stats If \c true, the owner and modification - * time will be preserved even if the FLAC - * file is written to. - * \assert - * \code iterator != NULL \endcode - * \code filename != NULL \endcode - * \retval FLAC__bool - * \c false if a memory allocation error occurs, the file can't be - * opened, or another error occurs, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool read_only, FLAC__bool preserve_file_stats); - -/** Returns \c true if the FLAC file is writable. If \c false, calls to - * FLAC__metadata_simple_iterator_set_block() and - * FLAC__metadata_simple_iterator_insert_block_after() will fail. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - * \retval FLAC__bool - * See above. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_writable(const FLAC__Metadata_SimpleIterator *iterator); - -/** Moves the iterator forward one metadata block, returning \c false if - * already at the end. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c false if already at the last metadata block of the chain, else - * \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_next(FLAC__Metadata_SimpleIterator *iterator); - -/** Moves the iterator backward one metadata block, returning \c false if - * already at the beginning. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c false if already at the first metadata block of the chain, else - * \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_prev(FLAC__Metadata_SimpleIterator *iterator); - -/** Returns a flag telling if the current metadata block is the last. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c true if the current metadata block is the last in the file, - * else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_last(const FLAC__Metadata_SimpleIterator *iterator); - -/** Get the offset of the metadata block at the current position. This - * avoids reading the actual block data which can save time for large - * blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval off_t - * The offset of the metadata block at the current iterator position. - * This is the byte offset relative to the beginning of the file of - * the current metadata block's header. - */ -FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metadata_SimpleIterator *iterator); - -/** Get the type of the metadata block at the current position. This - * avoids reading the actual block data which can save time for large - * blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__MetadataType - * The type of the metadata block at the current iterator position. - */ -FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const FLAC__Metadata_SimpleIterator *iterator); - -/** Get the length of the metadata block at the current position. This - * avoids reading the actual block data which can save time for large - * blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval unsigned - * The length of the metadata block at the current iterator position. - * The is same length as that in the - * metadata block header, - * i.e. the length of the metadata body that follows the header. - */ -FLAC_API unsigned FLAC__metadata_simple_iterator_get_block_length(const FLAC__Metadata_SimpleIterator *iterator); - -/** Get the application ID of the \c APPLICATION block at the current - * position. This avoids reading the actual block data which can save - * time for large blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \param id A pointer to a buffer of at least \c 4 bytes where - * the ID will be stored. - * \assert - * \code iterator != NULL \endcode - * \code id != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c true if the ID was successfully read, else \c false, in which - * case you should check FLAC__metadata_simple_iterator_status() to - * find out why. If the status is - * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, then the - * current metadata block is not an \c APPLICATION block. Otherwise - * if the status is - * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR or - * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, an I/O error - * occurred and the iterator can no longer be used. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_get_application_id(FLAC__Metadata_SimpleIterator *iterator, FLAC__byte *id); - -/** Get the metadata block at the current position. You can modify the - * block but must use FLAC__metadata_simple_iterator_set_block() to - * write it back to the FLAC file. - * - * You must call FLAC__metadata_object_delete() on the returned object - * when you are finished with it. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__StreamMetadata* - * The current metadata block, or \c NULL if there was a memory - * allocation error. - */ -FLAC_API FLAC__StreamMetadata *FLAC__metadata_simple_iterator_get_block(FLAC__Metadata_SimpleIterator *iterator); - -/** Write a block back to the FLAC file. This function tries to be - * as efficient as possible; how the block is actually written is - * shown by the following: - * - * Existing block is a STREAMINFO block and the new block is a - * STREAMINFO block: the new block is written in place. Make sure - * you know what you're doing when changing the values of a - * STREAMINFO block. - * - * Existing block is a STREAMINFO block and the new block is a - * not a STREAMINFO block: this is an error since the first block - * must be a STREAMINFO block. Returns \c false without altering the - * file. - * - * Existing block is not a STREAMINFO block and the new block is a - * STREAMINFO block: this is an error since there may be only one - * STREAMINFO block. Returns \c false without altering the file. - * - * Existing block and new block are the same length: the existing - * block will be replaced by the new block, written in place. - * - * Existing block is longer than new block: if use_padding is \c true, - * the existing block will be overwritten in place with the new - * block followed by a PADDING block, if possible, to make the total - * size the same as the existing block. Remember that a padding - * block requires at least four bytes so if the difference in size - * between the new block and existing block is less than that, the - * entire file will have to be rewritten, using the new block's - * exact size. If use_padding is \c false, the entire file will be - * rewritten, replacing the existing block by the new block. - * - * Existing block is shorter than new block: if use_padding is \c true, - * the function will try and expand the new block into the following - * PADDING block, if it exists and doing so won't shrink the PADDING - * block to less than 4 bytes. If there is no following PADDING - * block, or it will shrink to less than 4 bytes, or use_padding is - * \c false, the entire file is rewritten, replacing the existing block - * with the new block. Note that in this case any following PADDING - * block is preserved as is. - * - * After writing the block, the iterator will remain in the same - * place, i.e. pointing to the new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block The block to set. - * \param use_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \code block != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding); - -/** This is similar to FLAC__metadata_simple_iterator_set_block() - * except that instead of writing over an existing block, it appends - * a block after the existing block. \a use_padding is again used to - * tell the function to try an expand into following padding in an - * attempt to avoid rewriting the entire file. - * - * This function will fail and return \c false if given a STREAMINFO - * block. - * - * After writing the block, the iterator will be pointing to the - * new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block The block to set. - * \param use_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \code block != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding); - -/** Deletes the block at the current position. This will cause the - * entire FLAC file to be rewritten, unless \a use_padding is \c true, - * in which case the block will be replaced by an equal-sized PADDING - * block. The iterator will be left pointing to the block before the - * one just deleted. - * - * You may not delete the STREAMINFO block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param use_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c true if successful, else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool use_padding); - -/* \} */ - - -/** \defgroup flac_metadata_level2 FLAC/metadata.h: metadata level 2 interface - * \ingroup flac_metadata - * - * \brief - * The level 2 interface provides read-write access to FLAC file metadata; - * all metadata is read into memory, operated on in memory, and then written - * to file, which is more efficient than level 1 when editing multiple blocks. - * - * Currently Ogg FLAC is supported for read only, via - * FLAC__metadata_chain_read_ogg() but a subsequent - * FLAC__metadata_chain_write() will fail. - * - * The general usage of this interface is: - * - * - Create a new chain using FLAC__metadata_chain_new(). A chain is a - * linked list of FLAC metadata blocks. - * - Read all metadata into the the chain from a FLAC file using - * FLAC__metadata_chain_read() or FLAC__metadata_chain_read_ogg() and - * check the status. - * - Optionally, consolidate the padding using - * FLAC__metadata_chain_merge_padding() or - * FLAC__metadata_chain_sort_padding(). - * - Create a new iterator using FLAC__metadata_iterator_new() - * - Initialize the iterator to point to the first element in the chain - * using FLAC__metadata_iterator_init() - * - Traverse the chain using FLAC__metadata_iterator_next and - * FLAC__metadata_iterator_prev(). - * - Get a block for reading or modification using - * FLAC__metadata_iterator_get_block(). The pointer to the object - * inside the chain is returned, so the block is yours to modify. - * Changes will be reflected in the FLAC file when you write the - * chain. You can also add and delete blocks (see functions below). - * - When done, write out the chain using FLAC__metadata_chain_write(). - * Make sure to read the whole comment to the function below. - * - Delete the chain using FLAC__metadata_chain_delete(). - * - * \note - * Even though the FLAC file is not open while the chain is being - * manipulated, you must not alter the file externally during - * this time. The chain assumes the FLAC file will not change - * between the time of FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg() - * and FLAC__metadata_chain_write(). - * - * \note - * Do not modify the is_last, length, or type fields of returned - * FLAC__StreamMetadata objects. These are managed automatically. - * - * \note - * The metadata objects returned by FLAC__metadata_iterator_get_block() - * are owned by the chain; do not FLAC__metadata_object_delete() them. - * In the same way, blocks passed to FLAC__metadata_iterator_set_block() - * become owned by the chain and they will be deleted when the chain is - * deleted. - * - * \{ - */ - -struct FLAC__Metadata_Chain; -/** The opaque structure definition for the level 2 chain type. - */ -typedef struct FLAC__Metadata_Chain FLAC__Metadata_Chain; - -struct FLAC__Metadata_Iterator; -/** The opaque structure definition for the level 2 iterator type. - */ -typedef struct FLAC__Metadata_Iterator FLAC__Metadata_Iterator; - -typedef enum { - FLAC__METADATA_CHAIN_STATUS_OK = 0, - /**< The chain is in the normal OK state */ - - FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT, - /**< The data passed into a function violated the function's usage criteria */ - - FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE, - /**< The chain could not open the target file */ - - FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE, - /**< The chain could not find the FLAC signature at the start of the file */ - - FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE, - /**< The chain tried to write to a file that was not writable */ - - FLAC__METADATA_CHAIN_STATUS_BAD_METADATA, - /**< The chain encountered input that does not conform to the FLAC metadata specification */ - - FLAC__METADATA_CHAIN_STATUS_READ_ERROR, - /**< The chain encountered an error while reading the FLAC file */ - - FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR, - /**< The chain encountered an error while seeking in the FLAC file */ - - FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR, - /**< The chain encountered an error while writing the FLAC file */ - - FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR, - /**< The chain encountered an error renaming the FLAC file */ - - FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR, - /**< The chain encountered an error removing the temporary file */ - - FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR, - /**< Memory allocation failed */ - - FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR, - /**< The caller violated an assertion or an unexpected error occurred */ - - FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS, - /**< One or more of the required callbacks was NULL */ - - FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH, - /**< FLAC__metadata_chain_write() was called on a chain read by - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), - * or - * FLAC__metadata_chain_write_with_callbacks()/FLAC__metadata_chain_write_with_callbacks_and_tempfile() - * was called on a chain read by - * FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). - * Matching read/write methods must always be used. */ - - FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL - /**< FLAC__metadata_chain_write_with_callbacks() was called when the - * chain write requires a tempfile; use - * FLAC__metadata_chain_write_with_callbacks_and_tempfile() instead. - * Or, FLAC__metadata_chain_write_with_callbacks_and_tempfile() was - * called when the chain write does not require a tempfile; use - * FLAC__metadata_chain_write_with_callbacks() instead. - * Always check FLAC__metadata_chain_check_if_tempfile_needed() - * before writing via callbacks. */ - -} FLAC__Metadata_ChainStatus; - -/** Maps a FLAC__Metadata_ChainStatus to a C string. - * - * Using a FLAC__Metadata_ChainStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__Metadata_ChainStatusString[]; - -/*********** FLAC__Metadata_Chain ***********/ - -/** Create a new chain instance. - * - * \retval FLAC__Metadata_Chain* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__Metadata_Chain *FLAC__metadata_chain_new(void); - -/** Free a chain instance. Deletes the object pointed to by \a chain. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - */ -FLAC_API void FLAC__metadata_chain_delete(FLAC__Metadata_Chain *chain); - -/** Get the current status of the chain. Call this after a function - * returns \c false to get the reason for the error. Also resets the - * status to FLAC__METADATA_CHAIN_STATUS_OK. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__Metadata_ChainStatus - * The current status of the chain. - */ -FLAC_API FLAC__Metadata_ChainStatus FLAC__metadata_chain_status(FLAC__Metadata_Chain *chain); - -/** Read all metadata from a FLAC file into the chain. - * - * \param chain A pointer to an existing chain. - * \param filename The path to the FLAC file to read. - * \assert - * \code chain != NULL \endcode - * \code filename != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a filename, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_read(FLAC__Metadata_Chain *chain, const char *filename); - -/** Read all metadata from an Ogg FLAC file into the chain. - * - * \note Ogg FLAC metadata data writing is not supported yet and - * FLAC__metadata_chain_write() will fail. - * - * \param chain A pointer to an existing chain. - * \param filename The path to the Ogg FLAC file to read. - * \assert - * \code chain != NULL \endcode - * \code filename != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a filename, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg(FLAC__Metadata_Chain *chain, const char *filename); - -/** Read all metadata from a FLAC stream into the chain via I/O callbacks. - * - * The \a handle need only be open for reading, but must be seekable. - * The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" - * for Windows). - * - * \param chain A pointer to an existing chain. - * \param handle The I/O handle of the FLAC stream to read. The - * handle will NOT be closed after the metadata is read; - * that is the duty of the caller. - * \param callbacks - * A set of callbacks to use for I/O. The mandatory - * callbacks are \a read, \a seek, and \a tell. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a handle, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_read_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); - -/** Read all metadata from an Ogg FLAC stream into the chain via I/O callbacks. - * - * The \a handle need only be open for reading, but must be seekable. - * The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" - * for Windows). - * - * \note Ogg FLAC metadata data writing is not supported yet and - * FLAC__metadata_chain_write() will fail. - * - * \param chain A pointer to an existing chain. - * \param handle The I/O handle of the Ogg FLAC stream to read. The - * handle will NOT be closed after the metadata is read; - * that is the duty of the caller. - * \param callbacks - * A set of callbacks to use for I/O. The mandatory - * callbacks are \a read, \a seek, and \a tell. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a handle, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); - -/** Checks if writing the given chain would require the use of a - * temporary file, or if it could be written in place. - * - * Under certain conditions, padding can be utilized so that writing - * edited metadata back to the FLAC file does not require rewriting the - * entire file. If rewriting is required, then a temporary workfile is - * required. When writing metadata using callbacks, you must check - * this function to know whether to call - * FLAC__metadata_chain_write_with_callbacks() or - * FLAC__metadata_chain_write_with_callbacks_and_tempfile(). When - * writing with FLAC__metadata_chain_write(), the temporary file is - * handled internally. - * - * \param chain A pointer to an existing chain. - * \param use_padding - * Whether or not padding will be allowed to be used - * during the write. The value of \a use_padding given - * here must match the value later passed to - * FLAC__metadata_chain_write_with_callbacks() or - * FLAC__metadata_chain_write_with_callbacks_with_tempfile(). - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if writing the current chain would require a tempfile, or - * \c false if metadata can be written in place. - */ -FLAC_API FLAC__bool FLAC__metadata_chain_check_if_tempfile_needed(FLAC__Metadata_Chain *chain, FLAC__bool use_padding); - -/** Write all metadata out to the FLAC file. This function tries to be as - * efficient as possible; how the metadata is actually written is shown by - * the following: - * - * If the current chain is the same size as the existing metadata, the new - * data is written in place. - * - * If the current chain is longer than the existing metadata, and - * \a use_padding is \c true, and the last block is a PADDING block of - * sufficient length, the function will truncate the final padding block - * so that the overall size of the metadata is the same as the existing - * metadata, and then just rewrite the metadata. Otherwise, if not all of - * the above conditions are met, the entire FLAC file must be rewritten. - * If you want to use padding this way it is a good idea to call - * FLAC__metadata_chain_sort_padding() first so that you have the maximum - * amount of padding to work with, unless you need to preserve ordering - * of the PADDING blocks for some reason. - * - * If the current chain is shorter than the existing metadata, and - * \a use_padding is \c true, and the final block is a PADDING block, the padding - * is extended to make the overall size the same as the existing data. If - * \a use_padding is \c true and the last block is not a PADDING block, a new - * PADDING block is added to the end of the new data to make it the same - * size as the existing data (if possible, see the note to - * FLAC__metadata_simple_iterator_set_block() about the four byte limit) - * and the new data is written in place. If none of the above apply or - * \a use_padding is \c false, the entire FLAC file is rewritten. - * - * If \a preserve_file_stats is \c true, the owner and modification time will - * be preserved even if the FLAC file is written. - * - * For this write function to be used, the chain must have been read with - * FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(), not - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(). - * - * \param chain A pointer to an existing chain. - * \param use_padding See above. - * \param preserve_file_stats See above. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if the write succeeded, else \c false. On failure, - * check the status with FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_write(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__bool preserve_file_stats); - -/** Write all metadata out to a FLAC stream via callbacks. - * - * (See FLAC__metadata_chain_write() for the details on how padding is - * used to write metadata in place if possible.) - * - * The \a handle must be open for updating and be seekable. The - * equivalent minimum stdio fopen() file mode is \c "r+" (or \c "r+b" - * for Windows). - * - * For this write function to be used, the chain must have been read with - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), - * not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). - * Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned - * \c false. - * - * \param chain A pointer to an existing chain. - * \param use_padding See FLAC__metadata_chain_write() - * \param handle The I/O handle of the FLAC stream to write. The - * handle will NOT be closed after the metadata is - * written; that is the duty of the caller. - * \param callbacks A set of callbacks to use for I/O. The mandatory - * callbacks are \a write and \a seek. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if the write succeeded, else \c false. On failure, - * check the status with FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); - -/** Write all metadata out to a FLAC stream via callbacks. - * - * (See FLAC__metadata_chain_write() for the details on how padding is - * used to write metadata in place if possible.) - * - * This version of the write-with-callbacks function must be used when - * FLAC__metadata_chain_check_if_tempfile_needed() returns true. In - * this function, you must supply an I/O handle corresponding to the - * FLAC file to edit, and a temporary handle to which the new FLAC - * file will be written. It is the caller's job to move this temporary - * FLAC file on top of the original FLAC file to complete the metadata - * edit. - * - * The \a handle must be open for reading and be seekable. The - * equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" - * for Windows). - * - * The \a temp_handle must be open for writing. The - * equivalent minimum stdio fopen() file mode is \c "w" (or \c "wb" - * for Windows). It should be an empty stream, or at least positioned - * at the start-of-file (in which case it is the caller's duty to - * truncate it on return). - * - * For this write function to be used, the chain must have been read with - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), - * not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). - * Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned - * \c true. - * - * \param chain A pointer to an existing chain. - * \param use_padding See FLAC__metadata_chain_write() - * \param handle The I/O handle of the original FLAC stream to read. - * The handle will NOT be closed after the metadata is - * written; that is the duty of the caller. - * \param callbacks A set of callbacks to use for I/O on \a handle. - * The mandatory callbacks are \a read, \a seek, and - * \a eof. - * \param temp_handle The I/O handle of the FLAC stream to write. The - * handle will NOT be closed after the metadata is - * written; that is the duty of the caller. - * \param temp_callbacks - * A set of callbacks to use for I/O on temp_handle. - * The only mandatory callback is \a write. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if the write succeeded, else \c false. On failure, - * check the status with FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks_and_tempfile(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__IOHandle temp_handle, FLAC__IOCallbacks temp_callbacks); - -/** Merge adjacent PADDING blocks into a single block. - * - * \note This function does not write to the FLAC file, it only - * modifies the chain. - * - * \warning Any iterator on the current chain will become invalid after this - * call. You should delete the iterator and get a new one. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - */ -FLAC_API void FLAC__metadata_chain_merge_padding(FLAC__Metadata_Chain *chain); - -/** This function will move all PADDING blocks to the end on the metadata, - * then merge them into a single block. - * - * \note This function does not write to the FLAC file, it only - * modifies the chain. - * - * \warning Any iterator on the current chain will become invalid after this - * call. You should delete the iterator and get a new one. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - */ -FLAC_API void FLAC__metadata_chain_sort_padding(FLAC__Metadata_Chain *chain); - - -/*********** FLAC__Metadata_Iterator ***********/ - -/** Create a new iterator instance. - * - * \retval FLAC__Metadata_Iterator* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__Metadata_Iterator *FLAC__metadata_iterator_new(void); - -/** Free an iterator instance. Deletes the object pointed to by \a iterator. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - */ -FLAC_API void FLAC__metadata_iterator_delete(FLAC__Metadata_Iterator *iterator); - -/** Initialize the iterator to point to the first metadata block in the - * given chain. - * - * \param iterator A pointer to an existing iterator. - * \param chain A pointer to an existing and initialized (read) chain. - * \assert - * \code iterator != NULL \endcode - * \code chain != NULL \endcode - */ -FLAC_API void FLAC__metadata_iterator_init(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Chain *chain); - -/** Moves the iterator forward one metadata block, returning \c false if - * already at the end. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if already at the last metadata block of the chain, else - * \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_next(FLAC__Metadata_Iterator *iterator); - -/** Moves the iterator backward one metadata block, returning \c false if - * already at the beginning. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if already at the first metadata block of the chain, else - * \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_prev(FLAC__Metadata_Iterator *iterator); - -/** Get the type of the metadata block at the current position. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__MetadataType - * The type of the metadata block at the current iterator position. - */ -FLAC_API FLAC__MetadataType FLAC__metadata_iterator_get_block_type(const FLAC__Metadata_Iterator *iterator); - -/** Get the metadata block at the current position. You can modify - * the block in place but must write the chain before the changes - * are reflected to the FLAC file. You do not need to call - * FLAC__metadata_iterator_set_block() to reflect the changes; - * the pointer returned by FLAC__metadata_iterator_get_block() - * points directly into the chain. - * - * \warning - * Do not call FLAC__metadata_object_delete() on the returned object; - * to delete a block use FLAC__metadata_iterator_delete_block(). - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__StreamMetadata* - * The current metadata block. - */ -FLAC_API FLAC__StreamMetadata *FLAC__metadata_iterator_get_block(FLAC__Metadata_Iterator *iterator); - -/** Set the metadata block at the current position, replacing the existing - * block. The new block passed in becomes owned by the chain and it will be - * deleted when the chain is deleted. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block A pointer to a metadata block. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \code block != NULL \endcode - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, or - * a memory allocation error occurs, otherwise \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_set_block(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); - -/** Removes the current block from the chain. If \a replace_with_padding is - * \c true, the block will instead be replaced with a padding block of equal - * size. You can not delete the STREAMINFO block. The iterator will be - * left pointing to the block before the one just "deleted", even if - * \a replace_with_padding is \c true. - * - * \param iterator A pointer to an existing initialized iterator. - * \param replace_with_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, - * otherwise \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_delete_block(FLAC__Metadata_Iterator *iterator, FLAC__bool replace_with_padding); - -/** Insert a new block before the current block. You cannot insert a block - * before the first STREAMINFO block. You cannot insert a STREAMINFO block - * as there can be only one, the one that already exists at the head when you - * read in a chain. The chain takes ownership of the new block and it will be - * deleted when the chain is deleted. The iterator will be left pointing to - * the new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block A pointer to a metadata block to insert. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, or - * a memory allocation error occurs, otherwise \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_before(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); - -/** Insert a new block after the current block. You cannot insert a STREAMINFO - * block as there can be only one, the one that already exists at the head when - * you read in a chain. The chain takes ownership of the new block and it will - * be deleted when the chain is deleted. The iterator will be left pointing to - * the new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block A pointer to a metadata block to insert. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, or - * a memory allocation error occurs, otherwise \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_after(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); - -/* \} */ - - -/** \defgroup flac_metadata_object FLAC/metadata.h: metadata object methods - * \ingroup flac_metadata - * - * \brief - * This module contains methods for manipulating FLAC metadata objects. - * - * Since many are variable length we have to be careful about the memory - * management. We decree that all pointers to data in the object are - * owned by the object and memory-managed by the object. - * - * Use the FLAC__metadata_object_new() and FLAC__metadata_object_delete() - * functions to create all instances. When using the - * FLAC__metadata_object_set_*() functions to set pointers to data, set - * \a copy to \c true to have the function make it's own copy of the data, or - * to \c false to give the object ownership of your data. In the latter case - * your pointer must be freeable by free() and will be free()d when the object - * is FLAC__metadata_object_delete()d. It is legal to pass a null pointer as - * the data pointer to a FLAC__metadata_object_set_*() function as long as - * the length argument is 0 and the \a copy argument is \c false. - * - * The FLAC__metadata_object_new() and FLAC__metadata_object_clone() function - * will return \c NULL in the case of a memory allocation error, otherwise a new - * object. The FLAC__metadata_object_set_*() functions return \c false in the - * case of a memory allocation error. - * - * We don't have the convenience of C++ here, so note that the library relies - * on you to keep the types straight. In other words, if you pass, for - * example, a FLAC__StreamMetadata* that represents a STREAMINFO block to - * FLAC__metadata_object_application_set_data(), you will get an assertion - * failure. - * - * For convenience the FLAC__metadata_object_vorbiscomment_*() functions - * maintain a trailing NUL on each Vorbis comment entry. This is not counted - * toward the length or stored in the stream, but it can make working with plain - * comments (those that don't contain embedded-NULs in the value) easier. - * Entries passed into these functions have trailing NULs added if missing, and - * returned entries are guaranteed to have a trailing NUL. - * - * The FLAC__metadata_object_vorbiscomment_*() functions that take a Vorbis - * comment entry/name/value will first validate that it complies with the Vorbis - * comment specification and return false if it does not. - * - * There is no need to recalculate the length field on metadata blocks you - * have modified. They will be calculated automatically before they are - * written back to a file. - * - * \{ - */ - - -/** Create a new metadata object instance of the given type. - * - * The object will be "empty"; i.e. values and data pointers will be \c 0, - * with the exception of FLAC__METADATA_TYPE_VORBIS_COMMENT, which will have - * the vendor string set (but zero comments). - * - * Do not pass in a value greater than or equal to - * \a FLAC__METADATA_TYPE_UNDEFINED unless you really know what you're - * doing. - * - * \param type Type of object to create - * \retval FLAC__StreamMetadata* - * \c NULL if there was an error allocating memory or the type code is - * greater than FLAC__MAX_METADATA_TYPE_CODE, else the new instance. - */ -FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_new(FLAC__MetadataType type); - -/** Create a copy of an existing metadata object. - * - * The copy is a "deep" copy, i.e. dynamically allocated data within the - * object is also copied. The caller takes ownership of the new block and - * is responsible for freeing it with FLAC__metadata_object_delete(). - * - * \param object Pointer to object to copy. - * \assert - * \code object != NULL \endcode - * \retval FLAC__StreamMetadata* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_clone(const FLAC__StreamMetadata *object); - -/** Free a metadata object. Deletes the object pointed to by \a object. - * - * The delete is a "deep" delete, i.e. dynamically allocated data within the - * object is also deleted. - * - * \param object A pointer to an existing object. - * \assert - * \code object != NULL \endcode - */ -FLAC_API void FLAC__metadata_object_delete(FLAC__StreamMetadata *object); - -/** Compares two metadata objects. - * - * The compare is "deep", i.e. dynamically allocated data within the - * object is also compared. - * - * \param block1 A pointer to an existing object. - * \param block2 A pointer to an existing object. - * \assert - * \code block1 != NULL \endcode - * \code block2 != NULL \endcode - * \retval FLAC__bool - * \c true if objects are identical, else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_object_is_equal(const FLAC__StreamMetadata *block1, const FLAC__StreamMetadata *block2); - -/** Sets the application data of an APPLICATION block. - * - * If \a copy is \c true, a copy of the data is stored; otherwise, the object - * takes ownership of the pointer. The existing data will be freed if this - * function is successful, otherwise the original data will remain if \a copy - * is \c true and malloc() fails. - * - * \note It is safe to pass a const pointer to \a data if \a copy is \c true. - * - * \param object A pointer to an existing APPLICATION object. - * \param data A pointer to the data to set. - * \param length The length of \a data in bytes. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_APPLICATION \endcode - * \code (data != NULL && length > 0) || - * (data == NULL && length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_application_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, unsigned length, FLAC__bool copy); - -/** Resize the seekpoint array. - * - * If the size shrinks, elements will truncated; if it grows, new placeholder - * points will be added to the end. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param new_num_points The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code (object->data.seek_table.points == NULL && object->data.seek_table.num_points == 0) || - * (object->data.seek_table.points != NULL && object->data.seek_table.num_points > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_resize_points(FLAC__StreamMetadata *object, unsigned new_num_points); - -/** Set a seekpoint in a seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param point_num Index into seekpoint array to set. - * \param point The point to set. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code object->data.seek_table.num_points > point_num \endcode - */ -FLAC_API void FLAC__metadata_object_seektable_set_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point); - -/** Insert a seekpoint into a seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param point_num Index into seekpoint array to set. - * \param point The point to set. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code object->data.seek_table.num_points >= point_num \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_insert_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point); - -/** Delete a seekpoint from a seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param point_num Index into seekpoint array to set. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code object->data.seek_table.num_points > point_num \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_delete_point(FLAC__StreamMetadata *object, unsigned point_num); - -/** Check a seektable to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if seek table is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_is_legal(const FLAC__StreamMetadata *object); - -/** Append a number of placeholder points to the end of a seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param num The number of placeholder points to append. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_placeholders(FLAC__StreamMetadata *object, unsigned num); - -/** Append a specific seek point template to the end of a seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param sample_number The sample number of the seek point template. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_point(FLAC__StreamMetadata *object, FLAC__uint64 sample_number); - -/** Append specific seek point templates to the end of a seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param sample_numbers An array of sample numbers for the seek points. - * \param num The number of seek point templates to append. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_points(FLAC__StreamMetadata *object, FLAC__uint64 sample_numbers[], unsigned num); - -/** Append a set of evenly-spaced seek point templates to the end of a - * seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param num The number of placeholder points to append. - * \param total_samples The total number of samples to be encoded; - * the seekpoints will be spaced approximately - * \a total_samples / \a num samples apart. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code total_samples > 0 \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points(FLAC__StreamMetadata *object, unsigned num, FLAC__uint64 total_samples); - -/** Append a set of evenly-spaced seek point templates to the end of a - * seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param samples The number of samples apart to space the placeholder - * points. The first point will be at sample \c 0, the - * second at sample \a samples, then 2*\a samples, and - * so on. As long as \a samples and \a total_samples - * are greater than \c 0, there will always be at least - * one seekpoint at sample \c 0. - * \param total_samples The total number of samples to be encoded; - * the seekpoints will be spaced - * \a samples samples apart. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code samples > 0 \endcode - * \code total_samples > 0 \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points_by_samples(FLAC__StreamMetadata *object, unsigned samples, FLAC__uint64 total_samples); - -/** Sort a seek table's seek points according to the format specification, - * removing duplicates. - * - * \param object A pointer to a seek table to be sorted. - * \param compact If \c false, behaves like FLAC__format_seektable_sort(). - * If \c true, duplicates are deleted and the seek table is - * shrunk appropriately; the number of placeholder points - * present in the seek table will be the same after the call - * as before. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_sort(FLAC__StreamMetadata *object, FLAC__bool compact); - -/** Sets the vendor string in a VORBIS_COMMENT block. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param entry The entry to set the vendor string to. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_vendor_string(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); - -/** Resize the comment array. - * - * If the size shrinks, elements will truncated; if it grows, new empty - * fields will be added to the end. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param new_num_comments The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (object->data.vorbis_comment.comments == NULL && object->data.vorbis_comment.num_comments == 0) || - * (object->data.vorbis_comment.comments != NULL && object->data.vorbis_comment.num_comments > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_resize_comments(FLAC__StreamMetadata *object, unsigned new_num_comments); - -/** Sets a comment in a VORBIS_COMMENT block. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param comment_num Index into comment array to set. - * \param entry The entry to set the comment to. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code comment_num < object->data.vorbis_comment.num_comments \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); - -/** Insert a comment in a VORBIS_COMMENT block at the given index. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param comment_num The index at which to insert the comment. The comments - * at and after \a comment_num move right one position. - * To append a comment to the end, set \a comment_num to - * \c object->data.vorbis_comment.num_comments . - * \param entry The comment to insert. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code object->data.vorbis_comment.num_comments >= comment_num \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_insert_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); - -/** Appends a comment to a VORBIS_COMMENT block. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param entry The comment to insert. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_append_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); - -/** Replaces comments in a VORBIS_COMMENT block with a new one. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * Depending on the the value of \a all, either all or just the first comment - * whose field name(s) match the given entry's name will be replaced by the - * given entry. If no comments match, \a entry will simply be appended. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param entry The comment to insert. - * \param all If \c true, all comments whose field name matches - * \a entry's field name will be removed, and \a entry will - * be inserted at the position of the first matching - * comment. If \c false, only the first comment whose - * field name matches \a entry's field name will be - * replaced with \a entry. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_replace_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool all, FLAC__bool copy); - -/** Delete a comment in a VORBIS_COMMENT block at the given index. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param comment_num The index of the comment to delete. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code object->data.vorbis_comment.num_comments > comment_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_delete_comment(FLAC__StreamMetadata *object, unsigned comment_num); - -/** Creates a Vorbis comment entry from NUL-terminated name and value strings. - * - * On return, the filled-in \a entry->entry pointer will point to malloc()ed - * memory and shall be owned by the caller. For convenience the entry will - * have a terminating NUL. - * - * \param entry A pointer to a Vorbis comment entry. The entry's - * \c entry pointer should not point to allocated - * memory as it will be overwritten. - * \param field_name The field name in ASCII, \c NUL terminated. - * \param field_value The field value in UTF-8, \c NUL terminated. - * \assert - * \code entry != NULL \endcode - * \code field_name != NULL \endcode - * \code field_value != NULL \endcode - * \retval FLAC__bool - * \c false if malloc() fails, or if \a field_name or \a field_value does - * not comply with the Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(FLAC__StreamMetadata_VorbisComment_Entry *entry, const char *field_name, const char *field_value); - -/** Splits a Vorbis comment entry into NUL-terminated name and value strings. - * - * The returned pointers to name and value will be allocated by malloc() - * and shall be owned by the caller. - * - * \param entry An existing Vorbis comment entry. - * \param field_name The address of where the returned pointer to the - * field name will be stored. - * \param field_value The address of where the returned pointer to the - * field value will be stored. - * \assert - * \code (entry.entry != NULL && entry.length > 0) \endcode - * \code memchr(entry.entry, '=', entry.length) != NULL \endcode - * \code field_name != NULL \endcode - * \code field_value != NULL \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_to_name_value_pair(const FLAC__StreamMetadata_VorbisComment_Entry entry, char **field_name, char **field_value); - -/** Check if the given Vorbis comment entry's field name matches the given - * field name. - * - * \param entry An existing Vorbis comment entry. - * \param field_name The field name to check. - * \param field_name_length The length of \a field_name, not including the - * terminating \c NUL. - * \assert - * \code (entry.entry != NULL && entry.length > 0) \endcode - * \retval FLAC__bool - * \c true if the field names match, else \c false - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_matches(const FLAC__StreamMetadata_VorbisComment_Entry entry, const char *field_name, unsigned field_name_length); - -/** Find a Vorbis comment with the given field name. - * - * The search begins at entry number \a offset; use an offset of 0 to - * search from the beginning of the comment array. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param offset The offset into the comment array from where to start - * the search. - * \param field_name The field name of the comment to find. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code field_name != NULL \endcode - * \retval int - * The offset in the comment array of the first comment whose field - * name matches \a field_name, or \c -1 if no match was found. - */ -FLAC_API int FLAC__metadata_object_vorbiscomment_find_entry_from(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name); - -/** Remove first Vorbis comment matching the given field name. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param field_name The field name of comment to delete. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \retval int - * \c -1 for memory allocation error, \c 0 for no matching entries, - * \c 1 for one matching entry deleted. - */ -FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entry_matching(FLAC__StreamMetadata *object, const char *field_name); - -/** Remove all Vorbis comments matching the given field name. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param field_name The field name of comments to delete. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \retval int - * \c -1 for memory allocation error, \c 0 for no matching entries, - * else the number of matching entries deleted. - */ -FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entries_matching(FLAC__StreamMetadata *object, const char *field_name); - -/** Create a new CUESHEET track instance. - * - * The object will be "empty"; i.e. values and data pointers will be \c 0. - * - * \retval FLAC__StreamMetadata_CueSheet_Track* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_new(void); - -/** Create a copy of an existing CUESHEET track object. - * - * The copy is a "deep" copy, i.e. dynamically allocated data within the - * object is also copied. The caller takes ownership of the new object and - * is responsible for freeing it with - * FLAC__metadata_object_cuesheet_track_delete(). - * - * \param object Pointer to object to copy. - * \assert - * \code object != NULL \endcode - * \retval FLAC__StreamMetadata_CueSheet_Track* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_clone(const FLAC__StreamMetadata_CueSheet_Track *object); - -/** Delete a CUESHEET track object - * - * \param object A pointer to an existing CUESHEET track object. - * \assert - * \code object != NULL \endcode - */ -FLAC_API void FLAC__metadata_object_cuesheet_track_delete(FLAC__StreamMetadata_CueSheet_Track *object); - -/** Resize a track's index point array. - * - * If the size shrinks, elements will truncated; if it grows, new blank - * indices will be added to the end. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index of the track to modify. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param new_num_indices The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code (object->data.cue_sheet.tracks[track_num].indices == NULL && object->data.cue_sheet.tracks[track_num].num_indices == 0) || - * (object->data.cue_sheet.tracks[track_num].indices != NULL && object->data.cue_sheet.tracks[track_num].num_indices > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_resize_indices(FLAC__StreamMetadata *object, unsigned track_num, unsigned new_num_indices); - -/** Insert an index point in a CUESHEET track at the given index. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index of the track to modify. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param index_num The index into the track's index array at which to - * insert the index point. NOTE: this is not necessarily - * the same as the index point's \a number field. The - * indices at and after \a index_num move right one - * position. To append an index point to the end, set - * \a index_num to - * \c object->data.cue_sheet.tracks[track_num].num_indices . - * \param index The index point to insert. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num, FLAC__StreamMetadata_CueSheet_Index index); - -/** Insert a blank index point in a CUESHEET track at the given index. - * - * A blank index point is one in which all field values are zero. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index of the track to modify. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param index_num The index into the track's index array at which to - * insert the index point. NOTE: this is not necessarily - * the same as the index point's \a number field. The - * indices at and after \a index_num move right one - * position. To append an index point to the end, set - * \a index_num to - * \c object->data.cue_sheet.tracks[track_num].num_indices . - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_blank_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num); - -/** Delete an index point in a CUESHEET track at the given index. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index into the track array of the track to - * modify. NOTE: this is not necessarily the same - * as the track's \a number field. - * \param index_num The index into the track's index array of the index - * to delete. NOTE: this is not necessarily the same - * as the index's \a number field. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code object->data.cue_sheet.tracks[track_num].num_indices > index_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_delete_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num); - -/** Resize the track array. - * - * If the size shrinks, elements will truncated; if it grows, new blank - * tracks will be added to the end. - * - * \param object A pointer to an existing CUESHEET object. - * \param new_num_tracks The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code (object->data.cue_sheet.tracks == NULL && object->data.cue_sheet.num_tracks == 0) || - * (object->data.cue_sheet.tracks != NULL && object->data.cue_sheet.num_tracks > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_resize_tracks(FLAC__StreamMetadata *object, unsigned new_num_tracks); - -/** Sets a track in a CUESHEET block. - * - * If \a copy is \c true, a copy of the track is stored; otherwise, the object - * takes ownership of the \a track pointer. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num Index into track array to set. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param track The track to set the track to. You may safely pass in - * a const pointer if \a copy is \c true. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code track_num < object->data.cue_sheet.num_tracks \endcode - * \code (track->indices != NULL && track->num_indices > 0) || - * (track->indices == NULL && track->num_indices == 0) - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_set_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy); - -/** Insert a track in a CUESHEET block at the given index. - * - * If \a copy is \c true, a copy of the track is stored; otherwise, the object - * takes ownership of the \a track pointer. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index at which to insert the track. NOTE: this - * is not necessarily the same as the track's \a number - * field. The tracks at and after \a track_num move right - * one position. To append a track to the end, set - * \a track_num to \c object->data.cue_sheet.num_tracks . - * \param track The track to insert. You may safely pass in a const - * pointer if \a copy is \c true. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks >= track_num \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy); - -/** Insert a blank track in a CUESHEET block at the given index. - * - * A blank track is one in which all field values are zero. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index at which to insert the track. NOTE: this - * is not necessarily the same as the track's \a number - * field. The tracks at and after \a track_num move right - * one position. To append a track to the end, set - * \a track_num to \c object->data.cue_sheet.num_tracks . - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks >= track_num \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_blank_track(FLAC__StreamMetadata *object, unsigned track_num); - -/** Delete a track in a CUESHEET block at the given index. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index into the track array of the track to - * delete. NOTE: this is not necessarily the same - * as the track's \a number field. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_delete_track(FLAC__StreamMetadata *object, unsigned track_num); - -/** Check a cue sheet to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * cue sheet. - * - * \param object A pointer to an existing CUESHEET object. - * \param check_cd_da_subset If \c true, check CUESHEET against more - * stringent requirements for a CD-DA (audio) disc. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \retval FLAC__bool - * \c false if cue sheet is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_is_legal(const FLAC__StreamMetadata *object, FLAC__bool check_cd_da_subset, const char **violation); - -/** Calculate and return the CDDB/freedb ID for a cue sheet. The function - * assumes the cue sheet corresponds to a CD; the result is undefined - * if the cuesheet's is_cd bit is not set. - * - * \param object A pointer to an existing CUESHEET object. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \retval FLAC__uint32 - * The unsigned integer representation of the CDDB/freedb ID - */ -FLAC_API FLAC__uint32 FLAC__metadata_object_cuesheet_calculate_cddb_id(const FLAC__StreamMetadata *object); - -/** Sets the MIME type of a PICTURE block. - * - * If \a copy is \c true, a copy of the string is stored; otherwise, the object - * takes ownership of the pointer. The existing string will be freed if this - * function is successful, otherwise the original string will remain if \a copy - * is \c true and malloc() fails. - * - * \note It is safe to pass a const pointer to \a mime_type if \a copy is \c true. - * - * \param object A pointer to an existing PICTURE object. - * \param mime_type A pointer to the MIME type string. The string must be - * ASCII characters 0x20-0x7e, NUL-terminated. No validation - * is done. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \code (mime_type != NULL) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_mime_type(FLAC__StreamMetadata *object, char *mime_type, FLAC__bool copy); - -/** Sets the description of a PICTURE block. - * - * If \a copy is \c true, a copy of the string is stored; otherwise, the object - * takes ownership of the pointer. The existing string will be freed if this - * function is successful, otherwise the original string will remain if \a copy - * is \c true and malloc() fails. - * - * \note It is safe to pass a const pointer to \a description if \a copy is \c true. - * - * \param object A pointer to an existing PICTURE object. - * \param description A pointer to the description string. The string must be - * valid UTF-8, NUL-terminated. No validation is done. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \code (description != NULL) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_description(FLAC__StreamMetadata *object, FLAC__byte *description, FLAC__bool copy); - -/** Sets the picture data of a PICTURE block. - * - * If \a copy is \c true, a copy of the data is stored; otherwise, the object - * takes ownership of the pointer. Also sets the \a data_length field of the - * metadata object to what is passed in as the \a length parameter. The - * existing data will be freed if this function is successful, otherwise the - * original data and data_length will remain if \a copy is \c true and - * malloc() fails. - * - * \note It is safe to pass a const pointer to \a data if \a copy is \c true. - * - * \param object A pointer to an existing PICTURE object. - * \param data A pointer to the data to set. - * \param length The length of \a data in bytes. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \code (data != NULL && length > 0) || - * (data == NULL && length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, FLAC__uint32 length, FLAC__bool copy); - -/** Check a PICTURE block to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * PICTURE block. - * - * \param object A pointer to existing PICTURE block to be checked. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \retval FLAC__bool - * \c false if PICTURE block is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_picture_is_legal(const FLAC__StreamMetadata *object, const char **violation); - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/contrib/flacdecoder/include/FLAC/ordinals.h b/src/contrib/flacdecoder/include/FLAC/ordinals.h deleted file mode 100644 index a7a5cd961..000000000 --- a/src/contrib/flacdecoder/include/FLAC/ordinals.h +++ /dev/null @@ -1,80 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__ORDINALS_H -#define FLAC__ORDINALS_H - -#if !(defined(_MSC_VER) || defined(__BORLANDC__) || defined(__EMX__)) -#include -#endif - -typedef signed char FLAC__int8; -typedef unsigned char FLAC__uint8; - -#if defined(_MSC_VER) || defined(__BORLANDC__) -typedef __int16 FLAC__int16; -typedef __int32 FLAC__int32; -typedef __int64 FLAC__int64; -typedef unsigned __int16 FLAC__uint16; -typedef unsigned __int32 FLAC__uint32; -typedef unsigned __int64 FLAC__uint64; -#elif defined(__EMX__) -typedef short FLAC__int16; -typedef long FLAC__int32; -typedef long long FLAC__int64; -typedef unsigned short FLAC__uint16; -typedef unsigned long FLAC__uint32; -typedef unsigned long long FLAC__uint64; -#else -typedef int16_t FLAC__int16; -typedef int32_t FLAC__int32; -typedef int64_t FLAC__int64; -typedef uint16_t FLAC__uint16; -typedef uint32_t FLAC__uint32; -typedef uint64_t FLAC__uint64; -#endif - -typedef int FLAC__bool; - -typedef FLAC__uint8 FLAC__byte; - -#ifdef true -#undef true -#endif -#ifdef false -#undef false -#endif -#ifndef __cplusplus -#define true 1 -#define false 0 -#endif - -#endif diff --git a/src/contrib/flacdecoder/include/FLAC/stream_decoder.h b/src/contrib/flacdecoder/include/FLAC/stream_decoder.h deleted file mode 100644 index 9ac159474..000000000 --- a/src/contrib/flacdecoder/include/FLAC/stream_decoder.h +++ /dev/null @@ -1,1559 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__STREAM_DECODER_H -#define FLAC__STREAM_DECODER_H - -#include /* for FILE */ -#include "export.h" -#include "format.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/** \file include/FLAC/stream_decoder.h - * - * \brief - * This module contains the functions which implement the stream - * decoder. - * - * See the detailed documentation in the - * \link flac_stream_decoder stream decoder \endlink module. - */ - -/** \defgroup flac_decoder FLAC/ \*_decoder.h: decoder interfaces - * \ingroup flac - * - * \brief - * This module describes the decoder layers provided by libFLAC. - * - * The stream decoder can be used to decode complete streams either from - * the client via callbacks, or directly from a file, depending on how - * it is initialized. When decoding via callbacks, the client provides - * callbacks for reading FLAC data and writing decoded samples, and - * handling metadata and errors. If the client also supplies seek-related - * callback, the decoder function for sample-accurate seeking within the - * FLAC input is also available. When decoding from a file, the client - * needs only supply a filename or open \c FILE* and write/metadata/error - * callbacks; the rest of the callbacks are supplied internally. For more - * info see the \link flac_stream_decoder stream decoder \endlink module. - */ - -/** \defgroup flac_stream_decoder FLAC/stream_decoder.h: stream decoder interface - * \ingroup flac_decoder - * - * \brief - * This module contains the functions which implement the stream - * decoder. - * - * The stream decoder can decode native FLAC, and optionally Ogg FLAC - * (check FLAC_API_SUPPORTS_OGG_FLAC) streams and files. - * - * The basic usage of this decoder is as follows: - * - The program creates an instance of a decoder using - * FLAC__stream_decoder_new(). - * - The program overrides the default settings using - * FLAC__stream_decoder_set_*() functions. - * - The program initializes the instance to validate the settings and - * prepare for decoding using - * - FLAC__stream_decoder_init_stream() or FLAC__stream_decoder_init_FILE() - * or FLAC__stream_decoder_init_file() for native FLAC, - * - FLAC__stream_decoder_init_ogg_stream() or FLAC__stream_decoder_init_ogg_FILE() - * or FLAC__stream_decoder_init_ogg_file() for Ogg FLAC - * - The program calls the FLAC__stream_decoder_process_*() functions - * to decode data, which subsequently calls the callbacks. - * - The program finishes the decoding with FLAC__stream_decoder_finish(), - * which flushes the input and output and resets the decoder to the - * uninitialized state. - * - The instance may be used again or deleted with - * FLAC__stream_decoder_delete(). - * - * In more detail, the program will create a new instance by calling - * FLAC__stream_decoder_new(), then call FLAC__stream_decoder_set_*() - * functions to override the default decoder options, and call - * one of the FLAC__stream_decoder_init_*() functions. - * - * There are three initialization functions for native FLAC, one for - * setting up the decoder to decode FLAC data from the client via - * callbacks, and two for decoding directly from a FLAC file. - * - * For decoding via callbacks, use FLAC__stream_decoder_init_stream(). - * You must also supply several callbacks for handling I/O. Some (like - * seeking) are optional, depending on the capabilities of the input. - * - * For decoding directly from a file, use FLAC__stream_decoder_init_FILE() - * or FLAC__stream_decoder_init_file(). Then you must only supply an open - * \c FILE* or filename and fewer callbacks; the decoder will handle - * the other callbacks internally. - * - * There are three similarly-named init functions for decoding from Ogg - * FLAC streams. Check \c FLAC_API_SUPPORTS_OGG_FLAC to find out if the - * library has been built with Ogg support. - * - * Once the decoder is initialized, your program will call one of several - * functions to start the decoding process: - * - * - FLAC__stream_decoder_process_single() - Tells the decoder to process at - * most one metadata block or audio frame and return, calling either the - * metadata callback or write callback, respectively, once. If the decoder - * loses sync it will return with only the error callback being called. - * - FLAC__stream_decoder_process_until_end_of_metadata() - Tells the decoder - * to process the stream from the current location and stop upon reaching - * the first audio frame. The client will get one metadata, write, or error - * callback per metadata block, audio frame, or sync error, respectively. - * - FLAC__stream_decoder_process_until_end_of_stream() - Tells the decoder - * to process the stream from the current location until the read callback - * returns FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM or - * FLAC__STREAM_DECODER_READ_STATUS_ABORT. The client will get one metadata, - * write, or error callback per metadata block, audio frame, or sync error, - * respectively. - * - * When the decoder has finished decoding (normally or through an abort), - * the instance is finished by calling FLAC__stream_decoder_finish(), which - * ensures the decoder is in the correct state and frees memory. Then the - * instance may be deleted with FLAC__stream_decoder_delete() or initialized - * again to decode another stream. - * - * Seeking is exposed through the FLAC__stream_decoder_seek_absolute() method. - * At any point after the stream decoder has been initialized, the client can - * call this function to seek to an exact sample within the stream. - * Subsequently, the first time the write callback is called it will be - * passed a (possibly partial) block starting at that sample. - * - * If the client cannot seek via the callback interface provided, but still - * has another way of seeking, it can flush the decoder using - * FLAC__stream_decoder_flush() and start feeding data from the new position - * through the read callback. - * - * The stream decoder also provides MD5 signature checking. If this is - * turned on before initialization, FLAC__stream_decoder_finish() will - * report when the decoded MD5 signature does not match the one stored - * in the STREAMINFO block. MD5 checking is automatically turned off - * (until the next FLAC__stream_decoder_reset()) if there is no signature - * in the STREAMINFO block or when a seek is attempted. - * - * The FLAC__stream_decoder_set_metadata_*() functions deserve special - * attention. By default, the decoder only calls the metadata_callback for - * the STREAMINFO block. These functions allow you to tell the decoder - * explicitly which blocks to parse and return via the metadata_callback - * and/or which to skip. Use a FLAC__stream_decoder_set_metadata_respond_all(), - * FLAC__stream_decoder_set_metadata_ignore() ... or FLAC__stream_decoder_set_metadata_ignore_all(), - * FLAC__stream_decoder_set_metadata_respond() ... sequence to exactly specify - * which blocks to return. Remember that metadata blocks can potentially - * be big (for example, cover art) so filtering out the ones you don't - * use can reduce the memory requirements of the decoder. Also note the - * special forms FLAC__stream_decoder_set_metadata_respond_application(id) - * and FLAC__stream_decoder_set_metadata_ignore_application(id) for - * filtering APPLICATION blocks based on the application ID. - * - * STREAMINFO and SEEKTABLE blocks are always parsed and used internally, but - * they still can legally be filtered from the metadata_callback. - * - * \note - * The "set" functions may only be called when the decoder is in the - * state FLAC__STREAM_DECODER_UNINITIALIZED, i.e. after - * FLAC__stream_decoder_new() or FLAC__stream_decoder_finish(), but - * before FLAC__stream_decoder_init_*(). If this is the case they will - * return \c true, otherwise \c false. - * - * \note - * FLAC__stream_decoder_finish() resets all settings to the constructor - * defaults, including the callbacks. - * - * \{ - */ - - -/** State values for a FLAC__StreamDecoder - * - * The decoder's state can be obtained by calling FLAC__stream_decoder_get_state(). - */ -typedef enum { - - FLAC__STREAM_DECODER_SEARCH_FOR_METADATA = 0, - /**< The decoder is ready to search for metadata. */ - - FLAC__STREAM_DECODER_READ_METADATA, - /**< The decoder is ready to or is in the process of reading metadata. */ - - FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC, - /**< The decoder is ready to or is in the process of searching for the - * frame sync code. - */ - - FLAC__STREAM_DECODER_READ_FRAME, - /**< The decoder is ready to or is in the process of reading a frame. */ - - FLAC__STREAM_DECODER_END_OF_STREAM, - /**< The decoder has reached the end of the stream. */ - - FLAC__STREAM_DECODER_OGG_ERROR, - /**< An error occurred in the underlying Ogg layer. */ - - FLAC__STREAM_DECODER_SEEK_ERROR, - /**< An error occurred while seeking. The decoder must be flushed - * with FLAC__stream_decoder_flush() or reset with - * FLAC__stream_decoder_reset() before decoding can continue. - */ - - FLAC__STREAM_DECODER_ABORTED, - /**< The decoder was aborted by the read callback. */ - - FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR, - /**< An error occurred allocating memory. The decoder is in an invalid - * state and can no longer be used. - */ - - FLAC__STREAM_DECODER_UNINITIALIZED - /**< The decoder is in the uninitialized state; one of the - * FLAC__stream_decoder_init_*() functions must be called before samples - * can be processed. - */ - -} FLAC__StreamDecoderState; - -/** Maps a FLAC__StreamDecoderState to a C string. - * - * Using a FLAC__StreamDecoderState as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderStateString[]; - - -/** Possible return values for the FLAC__stream_decoder_init_*() functions. - */ -typedef enum { - - FLAC__STREAM_DECODER_INIT_STATUS_OK = 0, - /**< Initialization was successful. */ - - FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER, - /**< The library was not compiled with support for the given container - * format. - */ - - FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS, - /**< A required callback was not supplied. */ - - FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR, - /**< An error occurred allocating memory. */ - - FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE, - /**< fopen() failed in FLAC__stream_decoder_init_file() or - * FLAC__stream_decoder_init_ogg_file(). */ - - FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED - /**< FLAC__stream_decoder_init_*() was called when the decoder was - * already initialized, usually because - * FLAC__stream_decoder_finish() was not called. - */ - -} FLAC__StreamDecoderInitStatus; - -/** Maps a FLAC__StreamDecoderInitStatus to a C string. - * - * Using a FLAC__StreamDecoderInitStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderInitStatusString[]; - - -/** Return values for the FLAC__StreamDecoder read callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, - /**< The read was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM, - /**< The read was attempted while at the end of the stream. Note that - * the client must only return this value when the read callback was - * called when already at the end of the stream. Otherwise, if the read - * itself moves to the end of the stream, the client should still return - * the data and \c FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, and then on - * the next read callback it should return - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM with a byte count - * of \c 0. - */ - - FLAC__STREAM_DECODER_READ_STATUS_ABORT - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - -} FLAC__StreamDecoderReadStatus; - -/** Maps a FLAC__StreamDecoderReadStatus to a C string. - * - * Using a FLAC__StreamDecoderReadStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderReadStatusString[]; - - -/** Return values for the FLAC__StreamDecoder seek callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_SEEK_STATUS_OK, - /**< The seek was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_SEEK_STATUS_ERROR, - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - - FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED - /**< Client does not support seeking. */ - -} FLAC__StreamDecoderSeekStatus; - -/** Maps a FLAC__StreamDecoderSeekStatus to a C string. - * - * Using a FLAC__StreamDecoderSeekStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[]; - - -/** Return values for the FLAC__StreamDecoder tell callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_TELL_STATUS_OK, - /**< The tell was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_TELL_STATUS_ERROR, - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - - FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED - /**< Client does not support telling the position. */ - -} FLAC__StreamDecoderTellStatus; - -/** Maps a FLAC__StreamDecoderTellStatus to a C string. - * - * Using a FLAC__StreamDecoderTellStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderTellStatusString[]; - - -/** Return values for the FLAC__StreamDecoder length callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_LENGTH_STATUS_OK, - /**< The length call was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR, - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - - FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED - /**< Client does not support reporting the length. */ - -} FLAC__StreamDecoderLengthStatus; - -/** Maps a FLAC__StreamDecoderLengthStatus to a C string. - * - * Using a FLAC__StreamDecoderLengthStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[]; - - -/** Return values for the FLAC__StreamDecoder write callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE, - /**< The write was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_WRITE_STATUS_ABORT - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - -} FLAC__StreamDecoderWriteStatus; - -/** Maps a FLAC__StreamDecoderWriteStatus to a C string. - * - * Using a FLAC__StreamDecoderWriteStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[]; - - -/** Possible values passed back to the FLAC__StreamDecoder error callback. - * \c FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC is the generic catch- - * all. The rest could be caused by bad sync (false synchronization on - * data that is not the start of a frame) or corrupted data. The error - * itself is the decoder's best guess at what happened assuming a correct - * sync. For example \c FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER - * could be caused by a correct sync on the start of a frame, but some - * data in the frame header was corrupted. Or it could be the result of - * syncing on a point the stream that looked like the starting of a frame - * but was not. \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM - * could be because the decoder encountered a valid frame made by a future - * version of the encoder which it cannot parse, or because of a false - * sync making it appear as though an encountered frame was generated by - * a future encoder. - */ -typedef enum { - - FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC, - /**< An error in the stream caused the decoder to lose synchronization. */ - - FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER, - /**< The decoder encountered a corrupted frame header. */ - - FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH, - /**< The frame's data did not match the CRC in the footer. */ - - FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM - /**< The decoder encountered reserved fields in use in the stream. */ - -} FLAC__StreamDecoderErrorStatus; - -/** Maps a FLAC__StreamDecoderErrorStatus to a C string. - * - * Using a FLAC__StreamDecoderErrorStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[]; - - -/*********************************************************************** - * - * class FLAC__StreamDecoder - * - ***********************************************************************/ - -struct FLAC__StreamDecoderProtected; -struct FLAC__StreamDecoderPrivate; -/** The opaque structure definition for the stream decoder type. - * See the \link flac_stream_decoder stream decoder module \endlink - * for a detailed description. - */ -typedef struct { - struct FLAC__StreamDecoderProtected *protected_; /* avoid the C++ keyword 'protected' */ - struct FLAC__StreamDecoderPrivate *private_; /* avoid the C++ keyword 'private' */ -} FLAC__StreamDecoder; - -/** Signature for the read callback. - * - * A function pointer matching this signature must be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder needs more input data. The address of the - * buffer to be filled is supplied, along with the number of bytes the - * buffer can hold. The callback may choose to supply less data and - * modify the byte count but must be careful not to overflow the buffer. - * The callback then returns a status code chosen from - * FLAC__StreamDecoderReadStatus. - * - * Here is an example of a read callback for stdio streams: - * \code - * FLAC__StreamDecoderReadStatus read_cb(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * if(*bytes > 0) { - * *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, file); - * if(ferror(file)) - * return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - * else if(*bytes == 0) - * return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - * else - * return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - * } - * else - * return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param buffer A pointer to a location for the callee to store - * data to be decoded. - * \param bytes A pointer to the size of the buffer. On entry - * to the callback, it contains the maximum number - * of bytes that may be stored in \a buffer. The - * callee must set it to the actual number of bytes - * stored (0 in case of error or end-of-stream) before - * returning. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderReadStatus - * The callee's return status. Note that the callback should return - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM if and only if - * zero bytes were read and there is no more data to be read. - */ -typedef FLAC__StreamDecoderReadStatus (*FLAC__StreamDecoderReadCallback)(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); - -/** Signature for the seek callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder needs to seek the input stream. The decoder - * will pass the absolute byte offset to seek to, 0 meaning the - * beginning of the stream. - * - * Here is an example of a seek callback for stdio streams: - * \code - * FLAC__StreamDecoderSeekStatus seek_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * if(file == stdin) - * return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; - * else if(fseeko(file, (off_t)absolute_byte_offset, SEEK_SET) < 0) - * return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; - * else - * return FLAC__STREAM_DECODER_SEEK_STATUS_OK; - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param absolute_byte_offset The offset from the beginning of the stream - * to seek to. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderSeekStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderSeekStatus (*FLAC__StreamDecoderSeekCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); - -/** Signature for the tell callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder wants to know the current position of the - * stream. The callback should return the byte offset from the - * beginning of the stream. - * - * Here is an example of a tell callback for stdio streams: - * \code - * FLAC__StreamDecoderTellStatus tell_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * off_t pos; - * if(file == stdin) - * return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; - * else if((pos = ftello(file)) < 0) - * return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; - * else { - * *absolute_byte_offset = (FLAC__uint64)pos; - * return FLAC__STREAM_DECODER_TELL_STATUS_OK; - * } - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param absolute_byte_offset A pointer to storage for the current offset - * from the beginning of the stream. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderTellStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderTellStatus (*FLAC__StreamDecoderTellCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); - -/** Signature for the length callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder wants to know the total length of the stream - * in bytes. - * - * Here is an example of a length callback for stdio streams: - * \code - * FLAC__StreamDecoderLengthStatus length_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * struct stat filestats; - * - * if(file == stdin) - * return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; - * else if(fstat(fileno(file), &filestats) != 0) - * return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; - * else { - * *stream_length = (FLAC__uint64)filestats.st_size; - * return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; - * } - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param stream_length A pointer to storage for the length of the stream - * in bytes. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderLengthStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderLengthStatus (*FLAC__StreamDecoderLengthCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); - -/** Signature for the EOF callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder needs to know if the end of the stream has - * been reached. - * - * Here is an example of a EOF callback for stdio streams: - * FLAC__bool eof_cb(const FLAC__StreamDecoder *decoder, void *client_data) - * \code - * { - * FILE *file = ((MyClientData*)client_data)->file; - * return feof(file)? true : false; - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__bool - * \c true if the currently at the end of the stream, else \c false. - */ -typedef FLAC__bool (*FLAC__StreamDecoderEofCallback)(const FLAC__StreamDecoder *decoder, void *client_data); - -/** Signature for the write callback. - * - * A function pointer matching this signature must be passed to one of - * the FLAC__stream_decoder_init_*() functions. - * The supplied function will be called when the decoder has decoded a - * single audio frame. The decoder will pass the frame metadata as well - * as an array of pointers (one for each channel) pointing to the - * decoded audio. - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param frame The description of the decoded frame. See - * FLAC__Frame. - * \param buffer An array of pointers to decoded channels of data. - * Each pointer will point to an array of signed - * samples of length \a frame->header.blocksize. - * Channels will be ordered according to the FLAC - * specification; see the documentation for the - * frame header. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderWriteStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderWriteStatus (*FLAC__StreamDecoderWriteCallback)(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); - -/** Signature for the metadata callback. - * - * A function pointer matching this signature must be passed to one of - * the FLAC__stream_decoder_init_*() functions. - * The supplied function will be called when the decoder has decoded a - * metadata block. In a valid FLAC file there will always be one - * \c STREAMINFO block, followed by zero or more other metadata blocks. - * These will be supplied by the decoder in the same order as they - * appear in the stream and always before the first audio frame (i.e. - * write callback). The metadata block that is passed in must not be - * modified, and it doesn't live beyond the callback, so you should make - * a copy of it with FLAC__metadata_object_clone() if you will need it - * elsewhere. Since metadata blocks can potentially be large, by - * default the decoder only calls the metadata callback for the - * \c STREAMINFO block; you can instruct the decoder to pass or filter - * other blocks with FLAC__stream_decoder_set_metadata_*() calls. - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param metadata The decoded metadata block. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - */ -typedef void (*FLAC__StreamDecoderMetadataCallback)(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); - -/** Signature for the error callback. - * - * A function pointer matching this signature must be passed to one of - * the FLAC__stream_decoder_init_*() functions. - * The supplied function will be called whenever an error occurs during - * decoding. - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param status The error encountered by the decoder. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - */ -typedef void (*FLAC__StreamDecoderErrorCallback)(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); - - -/*********************************************************************** - * - * Class constructor/destructor - * - ***********************************************************************/ - -/** Create a new stream decoder instance. The instance is created with - * default settings; see the individual FLAC__stream_decoder_set_*() - * functions for each setting's default. - * - * \retval FLAC__StreamDecoder* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void); - -/** Free a decoder instance. Deletes the object pointed to by \a decoder. - * - * \param decoder A pointer to an existing decoder. - * \assert - * \code decoder != NULL \endcode - */ -FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder); - - -/*********************************************************************** - * - * Public class method prototypes - * - ***********************************************************************/ - -/** Set the serial number for the FLAC stream within the Ogg container. - * The default behavior is to use the serial number of the first Ogg - * page. Setting a serial number here will explicitly specify which - * stream is to be decoded. - * - * \note - * This does not need to be set for native FLAC decoding. - * - * \default \c use serial number of first page - * \param decoder A decoder instance to set. - * \param serial_number See above. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long serial_number); - -/** Set the "MD5 signature checking" flag. If \c true, the decoder will - * compute the MD5 signature of the unencoded audio data while decoding - * and compare it to the signature from the STREAMINFO block, if it - * exists, during FLAC__stream_decoder_finish(). - * - * MD5 signature checking will be turned off (until the next - * FLAC__stream_decoder_reset()) if there is no signature in the - * STREAMINFO block or when a seek is attempted. - * - * Clients that do not use the MD5 check should leave this off to speed - * up decoding. - * - * \default \c false - * \param decoder A decoder instance to set. - * \param value Flag value (see above). - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value); - -/** Direct the decoder to pass on all metadata blocks of type \a type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param type See above. - * \assert - * \code decoder != NULL \endcode - * \a type is valid - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); - -/** Direct the decoder to pass on all APPLICATION metadata blocks of the - * given \a id. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param id See above. - * \assert - * \code decoder != NULL \endcode - * \code id != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); - -/** Direct the decoder to pass on all metadata blocks of any type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder); - -/** Direct the decoder to filter out all metadata blocks of type \a type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param type See above. - * \assert - * \code decoder != NULL \endcode - * \a type is valid - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); - -/** Direct the decoder to filter out all APPLICATION metadata blocks of - * the given \a id. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param id See above. - * \assert - * \code decoder != NULL \endcode - * \code id != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); - -/** Direct the decoder to filter out all metadata blocks of any type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder); - -/** Get the current decoder state. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderState - * The current decoder state. - */ -FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder); - -/** Get the current decoder state as a C string. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval const char * - * The decoder state as a C string. Do not modify the contents. - */ -FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder); - -/** Get the "MD5 signature checking" flag. - * This is the value of the setting, not whether or not the decoder is - * currently checking the MD5 (remember, it can be turned off automatically - * by a seek). When the decoder is reset the flag will be restored to the - * value returned by this function. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * See above. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder); - -/** Get the total number of samples in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the \c STREAMINFO block. A value of \c 0 means "unknown". - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder); - -/** Get the current number of channels in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API unsigned FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder); - -/** Get the current channel assignment in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__ChannelAssignment - * See above. - */ -FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder); - -/** Get the current sample resolution in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API unsigned FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder); - -/** Get the current sample rate in Hz of the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API unsigned FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder); - -/** Get the current blocksize of the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API unsigned FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder); - -/** Returns the decoder's current read position within the stream. - * The position is the byte offset from the start of the stream. - * Bytes before this position have been fully decoded. Note that - * there may still be undecoded bytes in the decoder's read FIFO. - * The returned position is correct even after a seek. - * - * \warning This function currently only works for native FLAC, - * not Ogg FLAC streams. - * - * \param decoder A decoder instance to query. - * \param position Address at which to return the desired position. - * \assert - * \code decoder != NULL \endcode - * \code position != NULL \endcode - * \retval FLAC__bool - * \c true if successful, \c false if the stream is not native FLAC, - * or there was an error from the 'tell' callback or it returned - * \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position); - -/** Initialize the decoder instance to decode native FLAC streams. - * - * This flavor of initialization sets up the decoder to decode from a - * native FLAC stream. I/O is performed via callbacks to the client. - * For decoding from a plain file via filename or open FILE*, - * FLAC__stream_decoder_init_file() and FLAC__stream_decoder_init_FILE() - * provide a simpler interface. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \param decoder An uninitialized decoder instance. - * \param read_callback See FLAC__StreamDecoderReadCallback. This - * pointer must not be \c NULL. - * \param seek_callback See FLAC__StreamDecoderSeekCallback. This - * pointer may be \c NULL if seeking is not - * supported. If \a seek_callback is not \c NULL then a - * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. - * Alternatively, a dummy seek callback that just - * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param tell_callback See FLAC__StreamDecoderTellCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a tell_callback must also be supplied. - * Alternatively, a dummy tell callback that just - * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param length_callback See FLAC__StreamDecoderLengthCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a length_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param eof_callback See FLAC__StreamDecoderEofCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a eof_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c false - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -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 -); - -/** Initialize the decoder instance to decode Ogg FLAC streams. - * - * This flavor of initialization sets up the decoder to decode from a - * FLAC stream in an Ogg container. I/O is performed via callbacks to the - * client. For decoding from a plain file via filename or open FILE*, - * FLAC__stream_decoder_init_ogg_file() and FLAC__stream_decoder_init_ogg_FILE() - * provide a simpler interface. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \note Support for Ogg FLAC in the library is optional. If this - * library has been built without support for Ogg FLAC, this function - * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. - * - * \param decoder An uninitialized decoder instance. - * \param read_callback See FLAC__StreamDecoderReadCallback. This - * pointer must not be \c NULL. - * \param seek_callback See FLAC__StreamDecoderSeekCallback. This - * pointer may be \c NULL if seeking is not - * supported. If \a seek_callback is not \c NULL then a - * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. - * Alternatively, a dummy seek callback that just - * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param tell_callback See FLAC__StreamDecoderTellCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a tell_callback must also be supplied. - * Alternatively, a dummy tell callback that just - * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param length_callback See FLAC__StreamDecoderLengthCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a length_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param eof_callback See FLAC__StreamDecoderEofCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a eof_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c false - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_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 -); - -/** Initialize the decoder instance to decode native FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a - * plain native FLAC file. For non-stdio streams, you must use - * FLAC__stream_decoder_init_stream() and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \param decoder An uninitialized decoder instance. - * \param file An open FLAC file. The file should have been - * opened with mode \c "rb" and rewound. The file - * becomes owned by the decoder and should not be - * manipulated by the client while decoding. - * Unless \a file is \c stdin, it will be closed - * when FLAC__stream_decoder_finish() is called. - * Note however that seeking will not work when - * decoding from \c stdout since it is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \code file != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Initialize the decoder instance to decode Ogg FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a - * plain Ogg FLAC file. For non-stdio streams, you must use - * FLAC__stream_decoder_init_ogg_stream() and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \note Support for Ogg FLAC in the library is optional. If this - * library has been built without support for Ogg FLAC, this function - * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. - * - * \param decoder An uninitialized decoder instance. - * \param file An open FLAC file. The file should have been - * opened with mode \c "rb" and rewound. The file - * becomes owned by the decoder and should not be - * manipulated by the client while decoding. - * Unless \a file is \c stdin, it will be closed - * when FLAC__stream_decoder_finish() is called. - * Note however that seeking will not work when - * decoding from \c stdout since it is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \code file != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Initialize the decoder instance to decode native FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a plain - * native FLAC file. If POSIX fopen() semantics are not sufficient, (for - * example, with Unicode filenames on Windows), you must use - * FLAC__stream_decoder_init_FILE(), or FLAC__stream_decoder_init_stream() - * and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \param decoder An uninitialized decoder instance. - * \param filename The name of the file to decode from. The file will - * be opened with fopen(). Use \c NULL to decode from - * \c stdin. Note that \c stdin is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Initialize the decoder instance to decode Ogg FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a plain - * Ogg FLAC file. If POSIX fopen() semantics are not sufficient, (for - * example, with Unicode filenames on Windows), you must use - * FLAC__stream_decoder_init_ogg_FILE(), or FLAC__stream_decoder_init_ogg_stream() - * and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \note Support for Ogg FLAC in the library is optional. If this - * library has been built without support for Ogg FLAC, this function - * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. - * - * \param decoder An uninitialized decoder instance. - * \param filename The name of the file to decode from. The file will - * be opened with fopen(). Use \c NULL to decode from - * \c stdin. Note that \c stdin is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Finish the decoding process. - * Flushes the decoding buffer, releases resources, resets the decoder - * settings to their defaults, and returns the decoder state to - * FLAC__STREAM_DECODER_UNINITIALIZED. - * - * In the event of a prematurely-terminated decode, it is not strictly - * necessary to call this immediately before FLAC__stream_decoder_delete() - * but it is good practice to match every FLAC__stream_decoder_init_*() - * with a FLAC__stream_decoder_finish(). - * - * \param decoder An uninitialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if MD5 checking is on AND a STREAMINFO block was available - * AND the MD5 signature in the STREAMINFO block was non-zero AND the - * signature does not match the one computed by the decoder; else - * \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder); - -/** Flush the stream input. - * The decoder's input buffer will be cleared and the state set to - * \c FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC. This will also turn - * off MD5 checking. - * - * \param decoder A decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false if a memory allocation - * error occurs (in which case the state will be set to - * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder); - -/** Reset the decoding process. - * The decoder's input buffer will be cleared and the state set to - * \c FLAC__STREAM_DECODER_SEARCH_FOR_METADATA. This is similar to - * FLAC__stream_decoder_finish() except that the settings are - * preserved; there is no need to call FLAC__stream_decoder_init_*() - * before decoding again. MD5 checking will be restored to its original - * setting. - * - * If the decoder is seekable, or was initialized with - * FLAC__stream_decoder_init*_FILE() or FLAC__stream_decoder_init*_file(), - * the decoder will also attempt to seek to the beginning of the file. - * If this rewind fails, this function will return \c false. It follows - * that FLAC__stream_decoder_reset() cannot be used when decoding from - * \c stdin. - * - * If the decoder was initialized with FLAC__stream_encoder_init*_stream() - * and is not seekable (i.e. no seek callback was provided or the seek - * callback returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED), it - * is the duty of the client to start feeding data from the beginning of - * the stream on the next FLAC__stream_decoder_process() or - * FLAC__stream_decoder_process_interleaved() call. - * - * \param decoder A decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false if a memory allocation occurs - * (in which case the state will be set to - * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR) or a seek error - * occurs (the state will be unchanged). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder); - -/** Decode one metadata block or audio frame. - * This version instructs the decoder to decode a either a single metadata - * block or a single frame and stop, unless the callbacks return a fatal - * error or the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. - * - * As the decoder needs more input it will call the read callback. - * Depending on what was decoded, the metadata or write callback will be - * called with the decoded metadata block or audio frame. - * - * Unless there is a fatal read error or end of stream, this function - * will return once one whole frame is decoded. In other words, if the - * stream is not synchronized or points to a corrupt frame header, the - * decoder will continue to try and resync until it gets to a valid - * frame, then decode one frame, then return. If the decoder points to - * a frame whose frame CRC in the frame footer does not match the - * computed frame CRC, this function will issue a - * FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH error to the - * error callback, and return, having decoded one complete, although - * corrupt, frame. (Such corrupted frames are sent as silence of the - * correct length to the write callback.) - * - * \param decoder An initialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder); - -/** Decode until the end of the metadata. - * This version instructs the decoder to decode from the current position - * and continue until all the metadata has been read, or until the - * callbacks return a fatal error or the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. - * - * As the decoder needs more input it will call the read callback. - * As each metadata block is decoded, the metadata callback will be called - * with the decoded metadata. - * - * \param decoder An initialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder); - -/** Decode until the end of the stream. - * This version instructs the decoder to decode from the current position - * and continue until the end of stream (the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM), or until the - * callbacks return a fatal error. - * - * As the decoder needs more input it will call the read callback. - * As each metadata block and frame is decoded, the metadata or write - * callback will be called with the decoded metadata or frame. - * - * \param decoder An initialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder); - -/** Skip one audio frame. - * This version instructs the decoder to 'skip' a single frame and stop, - * unless the callbacks return a fatal error or the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. - * - * The decoding flow is the same as what occurs when - * FLAC__stream_decoder_process_single() is called to process an audio - * frame, except that this function does not decode the parsed data into - * PCM or call the write callback. The integrity of the frame is still - * checked the same way as in the other process functions. - * - * This function will return once one whole frame is skipped, in the - * same way that FLAC__stream_decoder_process_single() will return once - * one whole frame is decoded. - * - * This function can be used in more quickly determining FLAC frame - * boundaries when decoding of the actual data is not needed, for - * example when an application is separating a FLAC stream into frames - * for editing or storing in a container. To do this, the application - * can use FLAC__stream_decoder_skip_single_frame() to quickly advance - * to the next frame, then use - * FLAC__stream_decoder_get_decode_position() to find the new frame - * boundary. - * - * This function should only be called when the stream has advanced - * past all the metadata, otherwise it will return \c false. - * - * \param decoder An initialized decoder instance not in a metadata - * state. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), or if the decoder - * is in the FLAC__STREAM_DECODER_SEARCH_FOR_METADATA or - * FLAC__STREAM_DECODER_READ_METADATA state, else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder); - -/** Flush the input and seek to an absolute sample. - * Decoding will resume at the given sample. Note that because of - * this, the next write callback may contain a partial block. The - * client must support seeking the input or this function will fail - * and return \c false. Furthermore, if the decoder state is - * \c FLAC__STREAM_DECODER_SEEK_ERROR, then the decoder must be flushed - * with FLAC__stream_decoder_flush() or reset with - * FLAC__stream_decoder_reset() before decoding can continue. - * - * \param decoder A decoder instance. - * \param sample The target sample number to seek to. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample); - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/contrib/flacdecoder/include/FLAC/stream_encoder.h b/src/contrib/flacdecoder/include/FLAC/stream_encoder.h deleted file mode 100644 index dbbbb23ee..000000000 --- a/src/contrib/flacdecoder/include/FLAC/stream_encoder.h +++ /dev/null @@ -1,1768 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__STREAM_ENCODER_H -#define FLAC__STREAM_ENCODER_H - -#include /* for FILE */ -#include "export.h" -#include "format.h" -#include "stream_decoder.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/** \file include/FLAC/stream_encoder.h - * - * \brief - * This module contains the functions which implement the stream - * encoder. - * - * See the detailed documentation in the - * \link flac_stream_encoder stream encoder \endlink module. - */ - -/** \defgroup flac_encoder FLAC/ \*_encoder.h: encoder interfaces - * \ingroup flac - * - * \brief - * This module describes the encoder layers provided by libFLAC. - * - * The stream encoder can be used to encode complete streams either to the - * client via callbacks, or directly to a file, depending on how it is - * initialized. When encoding via callbacks, the client provides a write - * callback which will be called whenever FLAC data is ready to be written. - * If the client also supplies a seek callback, the encoder will also - * automatically handle the writing back of metadata discovered while - * encoding, like stream info, seek points offsets, etc. When encoding to - * a file, the client needs only supply a filename or open \c FILE* and an - * optional progress callback for periodic notification of progress; the - * write and seek callbacks are supplied internally. For more info see the - * \link flac_stream_encoder stream encoder \endlink module. - */ - -/** \defgroup flac_stream_encoder FLAC/stream_encoder.h: stream encoder interface - * \ingroup flac_encoder - * - * \brief - * This module contains the functions which implement the stream - * encoder. - * - * The stream encoder can encode to native FLAC, and optionally Ogg FLAC - * (check FLAC_API_SUPPORTS_OGG_FLAC) streams and files. - * - * The basic usage of this encoder is as follows: - * - The program creates an instance of an encoder using - * FLAC__stream_encoder_new(). - * - The program overrides the default settings using - * FLAC__stream_encoder_set_*() functions. At a minimum, the following - * functions should be called: - * - FLAC__stream_encoder_set_channels() - * - FLAC__stream_encoder_set_bits_per_sample() - * - FLAC__stream_encoder_set_sample_rate() - * - FLAC__stream_encoder_set_ogg_serial_number() (if encoding to Ogg FLAC) - * - FLAC__stream_encoder_set_total_samples_estimate() (if known) - * - If the application wants to control the compression level or set its own - * metadata, then the following should also be called: - * - FLAC__stream_encoder_set_compression_level() - * - FLAC__stream_encoder_set_verify() - * - FLAC__stream_encoder_set_metadata() - * - The rest of the set functions should only be called if the client needs - * exact control over how the audio is compressed; thorough understanding - * of the FLAC format is necessary to achieve good results. - * - The program initializes the instance to validate the settings and - * prepare for encoding using - * - FLAC__stream_encoder_init_stream() or FLAC__stream_encoder_init_FILE() - * or FLAC__stream_encoder_init_file() for native FLAC - * - FLAC__stream_encoder_init_ogg_stream() or FLAC__stream_encoder_init_ogg_FILE() - * or FLAC__stream_encoder_init_ogg_file() for Ogg FLAC - * - The program calls FLAC__stream_encoder_process() or - * FLAC__stream_encoder_process_interleaved() to encode data, which - * subsequently calls the callbacks when there is encoder data ready - * to be written. - * - The program finishes the encoding with FLAC__stream_encoder_finish(), - * which causes the encoder to encode any data still in its input pipe, - * update the metadata with the final encoding statistics if output - * seeking is possible, and finally reset the encoder to the - * uninitialized state. - * - The instance may be used again or deleted with - * FLAC__stream_encoder_delete(). - * - * In more detail, the stream encoder functions similarly to the - * \link flac_stream_decoder stream decoder \endlink, but has fewer - * callbacks and more options. Typically the client will create a new - * instance by calling FLAC__stream_encoder_new(), then set the necessary - * parameters with FLAC__stream_encoder_set_*(), and initialize it by - * calling one of the FLAC__stream_encoder_init_*() functions. - * - * Unlike the decoders, the stream encoder has many options that can - * affect the speed and compression ratio. When setting these parameters - * you should have some basic knowledge of the format (see the - * user-level documentation - * or the formal description). The - * FLAC__stream_encoder_set_*() functions themselves do not validate the - * values as many are interdependent. The FLAC__stream_encoder_init_*() - * functions will do this, so make sure to pay attention to the state - * returned by FLAC__stream_encoder_init_*() to make sure that it is - * FLAC__STREAM_ENCODER_INIT_STATUS_OK. Any parameters that are not set - * before FLAC__stream_encoder_init_*() will take on the defaults from - * the constructor. - * - * There are three initialization functions for native FLAC, one for - * setting up the encoder to encode FLAC data to the client via - * callbacks, and two for encoding directly to a file. - * - * For encoding via callbacks, use FLAC__stream_encoder_init_stream(). - * You must also supply a write callback which will be called anytime - * there is raw encoded data to write. If the client can seek the output - * it is best to also supply seek and tell callbacks, as this allows the - * encoder to go back after encoding is finished to write back - * information that was collected while encoding, like seek point offsets, - * frame sizes, etc. - * - * For encoding directly to a file, use FLAC__stream_encoder_init_FILE() - * or FLAC__stream_encoder_init_file(). Then you must only supply a - * filename or open \c FILE*; the encoder will handle all the callbacks - * internally. You may also supply a progress callback for periodic - * notification of the encoding progress. - * - * There are three similarly-named init functions for encoding to Ogg - * FLAC streams. Check \c FLAC_API_SUPPORTS_OGG_FLAC to find out if the - * library has been built with Ogg support. - * - * The call to FLAC__stream_encoder_init_*() currently will also immediately - * call the write callback several times, once with the \c fLaC signature, - * and once for each encoded metadata block. Note that for Ogg FLAC - * encoding you will usually get at least twice the number of callbacks than - * with native FLAC, one for the Ogg page header and one for the page body. - * - * After initializing the instance, the client may feed audio data to the - * encoder in one of two ways: - * - * - Channel separate, through FLAC__stream_encoder_process() - The client - * will pass an array of pointers to buffers, one for each channel, to - * the encoder, each of the same length. The samples need not be - * block-aligned, but each channel should have the same number of samples. - * - Channel interleaved, through - * FLAC__stream_encoder_process_interleaved() - The client will pass a single - * pointer to data that is channel-interleaved (i.e. channel0_sample0, - * channel1_sample0, ... , channelN_sample0, channel0_sample1, ...). - * Again, the samples need not be block-aligned but they must be - * sample-aligned, i.e. the first value should be channel0_sample0 and - * the last value channelN_sampleM. - * - * Note that for either process call, each sample in the buffers should be a - * signed integer, right-justified to the resolution set by - * FLAC__stream_encoder_set_bits_per_sample(). For example, if the resolution - * is 16 bits per sample, the samples should all be in the range [-32768,32767]. - * - * When the client is finished encoding data, it calls - * FLAC__stream_encoder_finish(), which causes the encoder to encode any - * data still in its input pipe, and call the metadata callback with the - * final encoding statistics. Then the instance may be deleted with - * FLAC__stream_encoder_delete() or initialized again to encode another - * stream. - * - * For programs that write their own metadata, but that do not know the - * actual metadata until after encoding, it is advantageous to instruct - * the encoder to write a PADDING block of the correct size, so that - * instead of rewriting the whole stream after encoding, the program can - * just overwrite the PADDING block. If only the maximum size of the - * metadata is known, the program can write a slightly larger padding - * block, then split it after encoding. - * - * Make sure you understand how lengths are calculated. All FLAC metadata - * blocks have a 4 byte header which contains the type and length. This - * length does not include the 4 bytes of the header. See the format page - * for the specification of metadata blocks and their lengths. - * - * \note - * If you are writing the FLAC data to a file via callbacks, make sure it - * is open for update (e.g. mode "w+" for stdio streams). This is because - * after the first encoding pass, the encoder will try to seek back to the - * beginning of the stream, to the STREAMINFO block, to write some data - * there. (If using FLAC__stream_encoder_init*_file() or - * FLAC__stream_encoder_init*_FILE(), the file is managed internally.) - * - * \note - * The "set" functions may only be called when the encoder is in the - * state FLAC__STREAM_ENCODER_UNINITIALIZED, i.e. after - * FLAC__stream_encoder_new() or FLAC__stream_encoder_finish(), but - * before FLAC__stream_encoder_init_*(). If this is the case they will - * return \c true, otherwise \c false. - * - * \note - * FLAC__stream_encoder_finish() resets all settings to the constructor - * defaults. - * - * \{ - */ - - -/** State values for a FLAC__StreamEncoder. - * - * The encoder's state can be obtained by calling FLAC__stream_encoder_get_state(). - * - * If the encoder gets into any other state besides \c FLAC__STREAM_ENCODER_OK - * or \c FLAC__STREAM_ENCODER_UNINITIALIZED, it becomes invalid for encoding and - * must be deleted with FLAC__stream_encoder_delete(). - */ -typedef enum { - - FLAC__STREAM_ENCODER_OK = 0, - /**< The encoder is in the normal OK state and samples can be processed. */ - - FLAC__STREAM_ENCODER_UNINITIALIZED, - /**< The encoder is in the uninitialized state; one of the - * FLAC__stream_encoder_init_*() functions must be called before samples - * can be processed. - */ - - FLAC__STREAM_ENCODER_OGG_ERROR, - /**< An error occurred in the underlying Ogg layer. */ - - FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR, - /**< An error occurred in the underlying verify stream decoder; - * check FLAC__stream_encoder_get_verify_decoder_state(). - */ - - FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA, - /**< The verify decoder detected a mismatch between the original - * audio signal and the decoded audio signal. - */ - - FLAC__STREAM_ENCODER_CLIENT_ERROR, - /**< One of the callbacks returned a fatal error. */ - - FLAC__STREAM_ENCODER_IO_ERROR, - /**< An I/O error occurred while opening/reading/writing a file. - * Check \c errno. - */ - - FLAC__STREAM_ENCODER_FRAMING_ERROR, - /**< An error occurred while writing the stream; usually, the - * write_callback returned an error. - */ - - FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR - /**< Memory allocation failed. */ - -} FLAC__StreamEncoderState; - -/** Maps a FLAC__StreamEncoderState to a C string. - * - * Using a FLAC__StreamEncoderState as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderStateString[]; - - -/** Possible return values for the FLAC__stream_encoder_init_*() functions. - */ -typedef enum { - - FLAC__STREAM_ENCODER_INIT_STATUS_OK = 0, - /**< Initialization was successful. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR, - /**< General failure to set up encoder; call FLAC__stream_encoder_get_state() for cause. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER, - /**< The library was not compiled with support for the given container - * format. - */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS, - /**< A required callback was not supplied. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS, - /**< The encoder has an invalid setting for number of channels. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE, - /**< The encoder has an invalid setting for bits-per-sample. - * FLAC supports 4-32 bps but the reference encoder currently supports - * only up to 24 bps. - */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE, - /**< The encoder has an invalid setting for the input sample rate. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE, - /**< The encoder has an invalid setting for the block size. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER, - /**< The encoder has an invalid setting for the maximum LPC order. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION, - /**< The encoder has an invalid setting for the precision of the quantized linear predictor coefficients. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER, - /**< The specified block size is less than the maximum LPC order. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE, - /**< The encoder is bound to the Subset but other settings violate it. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA, - /**< The metadata input to the encoder is invalid, in one of the following ways: - * - FLAC__stream_encoder_set_metadata() was called with a null pointer but a block count > 0 - * - One of the metadata blocks contains an undefined type - * - It contains an illegal CUESHEET as checked by FLAC__format_cuesheet_is_legal() - * - It contains an illegal SEEKTABLE as checked by FLAC__format_seektable_is_legal() - * - It contains more than one SEEKTABLE block or more than one VORBIS_COMMENT block - */ - - FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED - /**< FLAC__stream_encoder_init_*() was called when the encoder was - * already initialized, usually because - * FLAC__stream_encoder_finish() was not called. - */ - -} FLAC__StreamEncoderInitStatus; - -/** Maps a FLAC__StreamEncoderInitStatus to a C string. - * - * Using a FLAC__StreamEncoderInitStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderInitStatusString[]; - - -/** Return values for the FLAC__StreamEncoder read callback. - */ -typedef enum { - - FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE, - /**< The read was OK and decoding can continue. */ - - FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM, - /**< The read was attempted at the end of the stream. */ - - FLAC__STREAM_ENCODER_READ_STATUS_ABORT, - /**< An unrecoverable error occurred. */ - - FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED - /**< Client does not support reading back from the output. */ - -} FLAC__StreamEncoderReadStatus; - -/** Maps a FLAC__StreamEncoderReadStatus to a C string. - * - * Using a FLAC__StreamEncoderReadStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderReadStatusString[]; - - -/** Return values for the FLAC__StreamEncoder write callback. - */ -typedef enum { - - FLAC__STREAM_ENCODER_WRITE_STATUS_OK = 0, - /**< The write was OK and encoding can continue. */ - - FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR - /**< An unrecoverable error occurred. The encoder will return from the process call. */ - -} FLAC__StreamEncoderWriteStatus; - -/** Maps a FLAC__StreamEncoderWriteStatus to a C string. - * - * Using a FLAC__StreamEncoderWriteStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderWriteStatusString[]; - - -/** Return values for the FLAC__StreamEncoder seek callback. - */ -typedef enum { - - FLAC__STREAM_ENCODER_SEEK_STATUS_OK, - /**< The seek was OK and encoding can continue. */ - - FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR, - /**< An unrecoverable error occurred. */ - - FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED - /**< Client does not support seeking. */ - -} FLAC__StreamEncoderSeekStatus; - -/** Maps a FLAC__StreamEncoderSeekStatus to a C string. - * - * Using a FLAC__StreamEncoderSeekStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderSeekStatusString[]; - - -/** Return values for the FLAC__StreamEncoder tell callback. - */ -typedef enum { - - FLAC__STREAM_ENCODER_TELL_STATUS_OK, - /**< The tell was OK and encoding can continue. */ - - FLAC__STREAM_ENCODER_TELL_STATUS_ERROR, - /**< An unrecoverable error occurred. */ - - FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED - /**< Client does not support seeking. */ - -} FLAC__StreamEncoderTellStatus; - -/** Maps a FLAC__StreamEncoderTellStatus to a C string. - * - * Using a FLAC__StreamEncoderTellStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderTellStatusString[]; - - -/*********************************************************************** - * - * class FLAC__StreamEncoder - * - ***********************************************************************/ - -struct FLAC__StreamEncoderProtected; -struct FLAC__StreamEncoderPrivate; -/** The opaque structure definition for the stream encoder type. - * See the \link flac_stream_encoder stream encoder module \endlink - * for a detailed description. - */ -typedef struct { - struct FLAC__StreamEncoderProtected *protected_; /* avoid the C++ keyword 'protected' */ - struct FLAC__StreamEncoderPrivate *private_; /* avoid the C++ keyword 'private' */ -} FLAC__StreamEncoder; - -/** Signature for the read callback. - * - * A function pointer matching this signature must be passed to - * FLAC__stream_encoder_init_ogg_stream() if seeking is supported. - * The supplied function will be called when the encoder needs to read back - * encoded data. This happens during the metadata callback, when the encoder - * has to read, modify, and rewrite the metadata (e.g. seekpoints) gathered - * while encoding. The address of the buffer to be filled is supplied, along - * with the number of bytes the buffer can hold. The callback may choose to - * supply less data and modify the byte count but must be careful not to - * overflow the buffer. The callback then returns a status code chosen from - * FLAC__StreamEncoderReadStatus. - * - * Here is an example of a read callback for stdio streams: - * \code - * FLAC__StreamEncoderReadStatus read_cb(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * if(*bytes > 0) { - * *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, file); - * if(ferror(file)) - * return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; - * else if(*bytes == 0) - * return FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM; - * else - * return FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE; - * } - * else - * return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; - * } - * \endcode - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param buffer A pointer to a location for the callee to store - * data to be encoded. - * \param bytes A pointer to the size of the buffer. On entry - * to the callback, it contains the maximum number - * of bytes that may be stored in \a buffer. The - * callee must set it to the actual number of bytes - * stored (0 in case of error or end-of-stream) before - * returning. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_set_client_data(). - * \retval FLAC__StreamEncoderReadStatus - * The callee's return status. - */ -typedef FLAC__StreamEncoderReadStatus (*FLAC__StreamEncoderReadCallback)(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data); - -/** Signature for the write callback. - * - * A function pointer matching this signature must be passed to - * FLAC__stream_encoder_init*_stream(). The supplied function will be called - * by the encoder anytime there is raw encoded data ready to write. It may - * include metadata mixed with encoded audio frames and the data is not - * guaranteed to be aligned on frame or metadata block boundaries. - * - * The only duty of the callback is to write out the \a bytes worth of data - * in \a buffer to the current position in the output stream. The arguments - * \a samples and \a current_frame are purely informational. If \a samples - * is greater than \c 0, then \a current_frame will hold the current frame - * number that is being written; otherwise it indicates that the write - * callback is being called to write metadata. - * - * \note - * Unlike when writing to native FLAC, when writing to Ogg FLAC the - * write callback will be called twice when writing each audio - * frame; once for the page header, and once for the page body. - * When writing the page header, the \a samples argument to the - * write callback will be \c 0. - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param buffer An array of encoded data of length \a bytes. - * \param bytes The byte length of \a buffer. - * \param samples The number of samples encoded by \a buffer. - * \c 0 has a special meaning; see above. - * \param current_frame The number of the current frame being encoded. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - * \retval FLAC__StreamEncoderWriteStatus - * The callee's return status. - */ -typedef FLAC__StreamEncoderWriteStatus (*FLAC__StreamEncoderWriteCallback)(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); - -/** Signature for the seek callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_encoder_init*_stream(). The supplied function will be called - * when the encoder needs to seek the output stream. The encoder will pass - * the absolute byte offset to seek to, 0 meaning the beginning of the stream. - * - * Here is an example of a seek callback for stdio streams: - * \code - * FLAC__StreamEncoderSeekStatus seek_cb(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * if(file == stdin) - * return FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED; - * else if(fseeko(file, (off_t)absolute_byte_offset, SEEK_SET) < 0) - * return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR; - * else - * return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; - * } - * \endcode - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param absolute_byte_offset The offset from the beginning of the stream - * to seek to. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - * \retval FLAC__StreamEncoderSeekStatus - * The callee's return status. - */ -typedef FLAC__StreamEncoderSeekStatus (*FLAC__StreamEncoderSeekCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); - -/** Signature for the tell callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_encoder_init*_stream(). The supplied function will be called - * when the encoder needs to know the current position of the output stream. - * - * \warning - * The callback must return the true current byte offset of the output to - * which the encoder is writing. If you are buffering the output, make - * sure and take this into account. If you are writing directly to a - * FILE* from your write callback, ftell() is sufficient. If you are - * writing directly to a file descriptor from your write callback, you - * can use lseek(fd, SEEK_CUR, 0). The encoder may later seek back to - * these points to rewrite metadata after encoding. - * - * Here is an example of a tell callback for stdio streams: - * \code - * FLAC__StreamEncoderTellStatus tell_cb(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * off_t pos; - * if(file == stdin) - * return FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED; - * else if((pos = ftello(file)) < 0) - * return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR; - * else { - * *absolute_byte_offset = (FLAC__uint64)pos; - * return FLAC__STREAM_ENCODER_TELL_STATUS_OK; - * } - * } - * \endcode - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param absolute_byte_offset The address at which to store the current - * position of the output. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - * \retval FLAC__StreamEncoderTellStatus - * The callee's return status. - */ -typedef FLAC__StreamEncoderTellStatus (*FLAC__StreamEncoderTellCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); - -/** Signature for the metadata callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_encoder_init*_stream(). The supplied function will be called - * once at the end of encoding with the populated STREAMINFO structure. This - * is so the client can seek back to the beginning of the file and write the - * STREAMINFO block with the correct statistics after encoding (like - * minimum/maximum frame size and total samples). - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param metadata The final populated STREAMINFO block. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - */ -typedef void (*FLAC__StreamEncoderMetadataCallback)(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data); - -/** Signature for the progress callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_encoder_init*_file() or FLAC__stream_encoder_init*_FILE(). - * The supplied function will be called when the encoder has finished - * writing a frame. The \c total_frames_estimate argument to the - * callback will be based on the value from - * FLAC__stream_encoder_set_total_samples_estimate(). - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param bytes_written Bytes written so far. - * \param samples_written Samples written so far. - * \param frames_written Frames written so far. - * \param total_frames_estimate The estimate of the total number of - * frames to be written. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - */ -typedef void (*FLAC__StreamEncoderProgressCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data); - - -/*********************************************************************** - * - * Class constructor/destructor - * - ***********************************************************************/ - -/** Create a new stream encoder instance. The instance is created with - * default settings; see the individual FLAC__stream_encoder_set_*() - * functions for each setting's default. - * - * \retval FLAC__StreamEncoder* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamEncoder *FLAC__stream_encoder_new(void); - -/** Free an encoder instance. Deletes the object pointed to by \a encoder. - * - * \param encoder A pointer to an existing encoder. - * \assert - * \code encoder != NULL \endcode - */ -FLAC_API void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder); - - -/*********************************************************************** - * - * Public class method prototypes - * - ***********************************************************************/ - -/** Set the serial number for the FLAC stream to use in the Ogg container. - * - * \note - * This does not need to be set for native FLAC encoding. - * - * \note - * It is recommended to set a serial number explicitly as the default of '0' - * may collide with other streams. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param serial_number See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_ogg_serial_number(FLAC__StreamEncoder *encoder, long serial_number); - -/** Set the "verify" flag. If \c true, the encoder will verify it's own - * encoded output by feeding it through an internal decoder and comparing - * the original signal against the decoded signal. If a mismatch occurs, - * the process call will return \c false. Note that this will slow the - * encoding process by the extra time required for decoding and comparison. - * - * \default \c false - * \param encoder An encoder instance to set. - * \param value Flag value (see above). - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_verify(FLAC__StreamEncoder *encoder, FLAC__bool value); - -/** Set the Subset flag. If \c true, - * the encoder will comply with the Subset and will check the - * settings during FLAC__stream_encoder_init_*() to see if all settings - * comply. If \c false, the settings may take advantage of the full - * range that the format allows. - * - * Make sure you know what it entails before setting this to \c false. - * - * \default \c true - * \param encoder An encoder instance to set. - * \param value Flag value (see above). - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_streamable_subset(FLAC__StreamEncoder *encoder, FLAC__bool value); - -/** Set the number of channels to be encoded. - * - * \default \c 2 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the sample resolution of the input to be encoded. - * - * \warning - * Do not feed the encoder data that is wider than the value you - * set here or you will generate an invalid stream. - * - * \default \c 16 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the sample rate (in Hz) of the input to be encoded. - * - * \default \c 44100 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the compression level - * - * The compression level is roughly proportional to the amount of effort - * the encoder expends to compress the file. A higher level usually - * means more computation but higher compression. The default level is - * suitable for most applications. - * - * Currently the levels range from \c 0 (fastest, least compression) to - * \c 8 (slowest, most compression). A value larger than \c 8 will be - * treated as \c 8. - * - * This function automatically calls the following other \c _set_ - * functions with appropriate values, so the client does not need to - * unless it specifically wants to override them: - * - FLAC__stream_encoder_set_do_mid_side_stereo() - * - FLAC__stream_encoder_set_loose_mid_side_stereo() - * - FLAC__stream_encoder_set_apodization() - * - FLAC__stream_encoder_set_max_lpc_order() - * - FLAC__stream_encoder_set_qlp_coeff_precision() - * - FLAC__stream_encoder_set_do_qlp_coeff_prec_search() - * - FLAC__stream_encoder_set_do_escape_coding() - * - FLAC__stream_encoder_set_do_exhaustive_model_search() - * - FLAC__stream_encoder_set_min_residual_partition_order() - * - FLAC__stream_encoder_set_max_residual_partition_order() - * - FLAC__stream_encoder_set_rice_parameter_search_dist() - * - * The actual values set for each level are: - * - * - * - * - * - * - * - * - * - * - * - * - *
level - * do mid-side stereo - * loose mid-side stereo - * apodization - * max lpc order - * qlp coeff precision - * qlp coeff prec search - * escape coding - * exhaustive model search - * min residual partition order - * max residual partition order - * rice parameter search dist - *
0 false false tukey(0.5) 0 0 false false false 0 3 0
1 true true tukey(0.5) 0 0 false false false 0 3 0
2 true false tukey(0.5) 0 0 false false false 0 3 0
3 false false tukey(0.5) 6 0 false false false 0 4 0
4 true true tukey(0.5) 8 0 false false false 0 4 0
5 true false tukey(0.5) 8 0 false false false 0 5 0
6 true false tukey(0.5) 8 0 false false false 0 6 0
7 true false tukey(0.5) 8 0 false false true 0 6 0
8 true false tukey(0.5) 12 0 false false true 0 6 0
- * - * \default \c 5 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the blocksize to use while encoding. - * - * The number of samples to use per frame. Use \c 0 to let the encoder - * estimate a blocksize; this is usually best. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set to \c true to enable mid-side encoding on stereo input. The - * number of channels must be 2 for this to have any effect. Set to - * \c false to use only independent channel coding. - * - * \default \c false - * \param encoder An encoder instance to set. - * \param value Flag value (see above). - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value); - -/** Set to \c true to enable adaptive switching between mid-side and - * left-right encoding on stereo input. Set to \c false to use - * exhaustive searching. Setting this to \c true requires - * FLAC__stream_encoder_set_do_mid_side_stereo() to also be set to - * \c true in order to have any effect. - * - * \default \c false - * \param encoder An encoder instance to set. - * \param value Flag value (see above). - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value); - -/** Sets the apodization function(s) the encoder will use when windowing - * audio data for LPC analysis. - * - * The \a specification is a plain ASCII string which specifies exactly - * which functions to use. There may be more than one (up to 32), - * separated by \c ';' characters. Some functions take one or more - * comma-separated arguments in parentheses. - * - * The available functions are \c bartlett, \c bartlett_hann, - * \c blackman, \c blackman_harris_4term_92db, \c connes, \c flattop, - * \c gauss(STDDEV), \c hamming, \c hann, \c kaiser_bessel, \c nuttall, - * \c rectangle, \c triangle, \c tukey(P), \c welch. - * - * For \c gauss(STDDEV), STDDEV specifies the standard deviation - * (0blocksize / (2 ^ order). - * - * Set both min and max values to \c 0 to force a single context, - * whose Rice parameter is based on the residual signal variance. - * Otherwise, set a min and max order, and the encoder will search - * all orders, using the mean of each context for its Rice parameter, - * and use the best. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the maximum partition order to search when coding the residual. - * This is used in tandem with - * FLAC__stream_encoder_set_min_residual_partition_order(). - * - * The partition order determines the context size in the residual. - * The context size will be approximately blocksize / (2 ^ order). - * - * Set both min and max values to \c 0 to force a single context, - * whose Rice parameter is based on the residual signal variance. - * Otherwise, set a min and max order, and the encoder will search - * all orders, using the mean of each context for its Rice parameter, - * and use the best. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value); - -/** Deprecated. Setting this value has no effect. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set an estimate of the total samples that will be encoded. - * This is merely an estimate and may be set to \c 0 if unknown. - * This value will be written to the STREAMINFO block before encoding, - * and can remove the need for the caller to rewrite the value later - * if the value is known before encoding. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_total_samples_estimate(FLAC__StreamEncoder *encoder, FLAC__uint64 value); - -/** Set the metadata blocks to be emitted to the stream before encoding. - * A value of \c NULL, \c 0 implies no metadata; otherwise, supply an - * array of pointers to metadata blocks. The array is non-const since - * the encoder may need to change the \a is_last flag inside them, and - * in some cases update seek point offsets. Otherwise, the encoder will - * not modify or free the blocks. It is up to the caller to free the - * metadata blocks after encoding finishes. - * - * \note - * The encoder stores only copies of the pointers in the \a metadata array; - * the metadata blocks themselves must survive at least until after - * FLAC__stream_encoder_finish() returns. Do not free the blocks until then. - * - * \note - * The STREAMINFO block is always written and no STREAMINFO block may - * occur in the supplied array. - * - * \note - * By default the encoder does not create a SEEKTABLE. If one is supplied - * in the \a metadata array, but the client has specified that it does not - * support seeking, then the SEEKTABLE will be written verbatim. However - * by itself this is not very useful as the client will not know the stream - * offsets for the seekpoints ahead of time. In order to get a proper - * seektable the client must support seeking. See next note. - * - * \note - * SEEKTABLE blocks are handled specially. Since you will not know - * the values for the seek point stream offsets, you should pass in - * a SEEKTABLE 'template', that is, a SEEKTABLE object with the - * required sample numbers (or placeholder points), with \c 0 for the - * \a frame_samples and \a stream_offset fields for each point. If the - * client has specified that it supports seeking by providing a seek - * callback to FLAC__stream_encoder_init_stream() or both seek AND read - * callback to FLAC__stream_encoder_init_ogg_stream() (or by using - * FLAC__stream_encoder_init*_file() or FLAC__stream_encoder_init*_FILE()), - * then while it is encoding the encoder will fill the stream offsets in - * for you and when encoding is finished, it will seek back and write the - * real values into the SEEKTABLE block in the stream. There are helper - * routines for manipulating seektable template blocks; see metadata.h: - * FLAC__metadata_object_seektable_template_*(). If the client does - * not support seeking, the SEEKTABLE will have inaccurate offsets which - * will slow down or remove the ability to seek in the FLAC stream. - * - * \note - * The encoder instance \b will modify the first \c SEEKTABLE block - * as it transforms the template to a valid seektable while encoding, - * but it is still up to the caller to free all metadata blocks after - * encoding. - * - * \note - * A VORBIS_COMMENT block may be supplied. The vendor string in it - * will be ignored. libFLAC will use it's own vendor string. libFLAC - * will not modify the passed-in VORBIS_COMMENT's vendor string, it - * will simply write it's own into the stream. If no VORBIS_COMMENT - * block is present in the \a metadata array, libFLAC will write an - * empty one, containing only the vendor string. - * - * \note The Ogg FLAC mapping requires that the VORBIS_COMMENT block be - * the second metadata block of the stream. The encoder already supplies - * the STREAMINFO block automatically. If \a metadata does not contain a - * VORBIS_COMMENT block, the encoder will supply that too. Otherwise, if - * \a metadata does contain a VORBIS_COMMENT block and it is not the - * first, the init function will reorder \a metadata by moving the - * VORBIS_COMMENT block to the front; the relative ordering of the other - * blocks will remain as they were. - * - * \note The Ogg FLAC mapping limits the number of metadata blocks per - * stream to \c 65535. If \a num_blocks exceeds this the function will - * return \c false. - * - * \default \c NULL, 0 - * \param encoder An encoder instance to set. - * \param metadata See above. - * \param num_blocks See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - * \c false if the encoder is already initialized, or if - * \a num_blocks > 65535 if encoding to Ogg FLAC, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_metadata(FLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks); - -/** Get the current encoder state. - * - * \param encoder An encoder instance to query. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__StreamEncoderState - * The current encoder state. - */ -FLAC_API FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder); - -/** Get the state of the verify stream decoder. - * Useful when the stream encoder state is - * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR. - * - * \param encoder An encoder instance to query. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__StreamDecoderState - * The verify stream decoder state. - */ -FLAC_API FLAC__StreamDecoderState FLAC__stream_encoder_get_verify_decoder_state(const FLAC__StreamEncoder *encoder); - -/** Get the current encoder state as a C string. - * This version automatically resolves - * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR by getting the - * verify decoder's state. - * - * \param encoder A encoder instance to query. - * \assert - * \code encoder != NULL \endcode - * \retval const char * - * The encoder state as a C string. Do not modify the contents. - */ -FLAC_API const char *FLAC__stream_encoder_get_resolved_state_string(const FLAC__StreamEncoder *encoder); - -/** Get relevant values about the nature of a verify decoder error. - * Useful when the stream encoder state is - * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR. The arguments should - * be addresses in which the stats will be returned, or NULL if value - * is not desired. - * - * \param encoder An encoder instance to query. - * \param absolute_sample The absolute sample number of the mismatch. - * \param frame_number The number of the frame in which the mismatch occurred. - * \param channel The channel in which the mismatch occurred. - * \param sample The number of the sample (relative to the frame) in - * which the mismatch occurred. - * \param expected The expected value for the sample in question. - * \param got The actual value returned by the decoder. - * \assert - * \code encoder != NULL \endcode - */ -FLAC_API void FLAC__stream_encoder_get_verify_decoder_error_stats(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got); - -/** Get the "verify" flag. - * - * \param encoder An encoder instance to query. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * See FLAC__stream_encoder_set_verify(). - */ -FLAC_API FLAC__bool FLAC__stream_encoder_get_verify(const FLAC__StreamEncoder *encoder); - -/** Get the frame header. - * - * \param encoder An initialized encoder instance in the OK state. - * \param buffer An array of pointers to each channel's signal. - * \param samples The number of samples in one channel. - * \assert - * \code encoder != NULL \endcode - * \code FLAC__stream_encoder_get_state(encoder) == FLAC__STREAM_ENCODER_OK \endcode - * \retval FLAC__bool - * \c true if successful, else \c false; in this case, check the - * encoder state with FLAC__stream_encoder_get_state() to see what - * went wrong. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples); - -/** Submit data for encoding. - * This version allows you to supply the input data where the channels - * are interleaved into a single array (i.e. channel0_sample0, - * channel1_sample0, ... , channelN_sample0, channel0_sample1, ...). - * The samples need not be block-aligned but they must be - * sample-aligned, i.e. the first value should be channel0_sample0 - * and the last value channelN_sampleM. Each sample should be a signed - * integer, right-justified to the resolution set by - * FLAC__stream_encoder_set_bits_per_sample(). For example, if the - * resolution is 16 bits per sample, the samples should all be in the - * range [-32768,32767]. - * - * For applications where channel order is important, channels must - * follow the order as described in the - * frame header. - * - * \param encoder An initialized encoder instance in the OK state. - * \param buffer An array of channel-interleaved data (see above). - * \param samples The number of samples in one channel, the same as for - * FLAC__stream_encoder_process(). For example, if - * encoding two channels, \c 1000 \a samples corresponds - * to a \a buffer of 2000 values. - * \assert - * \code encoder != NULL \endcode - * \code FLAC__stream_encoder_get_state(encoder) == FLAC__STREAM_ENCODER_OK \endcode - * \retval FLAC__bool - * \c true if successful, else \c false; in this case, check the - * encoder state with FLAC__stream_encoder_get_state() to see what - * went wrong. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_process_interleaved(FLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples); - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/contrib/flacdecoder/include/share/Makefile.am b/src/contrib/flacdecoder/include/share/Makefile.am deleted file mode 100644 index 513828b8c..000000000 --- a/src/contrib/flacdecoder/include/share/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -## Process this file with automake to produce Makefile.in - -AUTOMAKE_OPTIONS = foreign - -SUBDIRS = grabbag - -EXTRA_DIST = \ - alloc.h \ - getopt.h \ - grabbag.h \ - replaygain_analysis.h \ - replaygain_synthesis.h \ - utf8.h diff --git a/src/contrib/flacdecoder/include/share/Makefile.in b/src/contrib/flacdecoder/include/share/Makefile.in deleted file mode 100644 index 5745b9402..000000000 --- a/src/contrib/flacdecoder/include/share/Makefile.in +++ /dev/null @@ -1,514 +0,0 @@ -# Makefile.in generated by automake 1.7.9 from Makefile.am. -# @configure_input@ - -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 -# Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. - -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -host_triplet = @host@ -ACLOCAL = @ACLOCAL@ -ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -AS = @AS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCAS = @CCAS@ -CCASFLAGS = @CCASFLAGS@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEBUG_FALSE = @DEBUG_FALSE@ -DEBUG_TRUE = @DEBUG_TRUE@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@ -DOXYGEN = @DOXYGEN@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FLAC__TEST_LEVEL = @FLAC__TEST_LEVEL@ -FLAC__TEST_WITH_VALGRIND = @FLAC__TEST_WITH_VALGRIND@ -FLaC__CPU_IA32_FALSE = @FLaC__CPU_IA32_FALSE@ -FLaC__CPU_IA32_TRUE = @FLaC__CPU_IA32_TRUE@ -FLaC__CPU_PPC_FALSE = @FLaC__CPU_PPC_FALSE@ -FLaC__CPU_PPC_TRUE = @FLaC__CPU_PPC_TRUE@ -FLaC__CPU_SPARC_FALSE = @FLaC__CPU_SPARC_FALSE@ -FLaC__CPU_SPARC_TRUE = @FLaC__CPU_SPARC_TRUE@ -FLaC__HAS_AS_FALSE = @FLaC__HAS_AS_FALSE@ -FLaC__HAS_AS_TRUE = @FLaC__HAS_AS_TRUE@ -FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@ -FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@ -FLaC__HAS_DOCBOOK_TO_MAN_FALSE = @FLaC__HAS_DOCBOOK_TO_MAN_FALSE@ -FLaC__HAS_DOCBOOK_TO_MAN_TRUE = @FLaC__HAS_DOCBOOK_TO_MAN_TRUE@ -FLaC__HAS_DOXYGEN_FALSE = @FLaC__HAS_DOXYGEN_FALSE@ -FLaC__HAS_DOXYGEN_TRUE = @FLaC__HAS_DOXYGEN_TRUE@ -FLaC__HAS_GAS_FALSE = @FLaC__HAS_GAS_FALSE@ -FLaC__HAS_GAS_TRUE = @FLaC__HAS_GAS_TRUE@ -FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@ -FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@ -FLaC__HAS_NASM_FALSE = @FLaC__HAS_NASM_FALSE@ -FLaC__HAS_NASM_TRUE = @FLaC__HAS_NASM_TRUE@ -FLaC__HAS_OGG_FALSE = @FLaC__HAS_OGG_FALSE@ -FLaC__HAS_OGG_TRUE = @FLaC__HAS_OGG_TRUE@ -FLaC__HAS_XMMS_FALSE = @FLaC__HAS_XMMS_FALSE@ -FLaC__HAS_XMMS_TRUE = @FLaC__HAS_XMMS_TRUE@ -FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE@ -FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE@ -FLaC__NO_ASM_FALSE = @FLaC__NO_ASM_FALSE@ -FLaC__NO_ASM_TRUE = @FLaC__NO_ASM_TRUE@ -FLaC__SSE_OS_FALSE = @FLaC__SSE_OS_FALSE@ -FLaC__SSE_OS_TRUE = @FLaC__SSE_OS_TRUE@ -FLaC__SYS_DARWIN_FALSE = @FLaC__SYS_DARWIN_FALSE@ -FLaC__SYS_DARWIN_TRUE = @FLaC__SYS_DARWIN_TRUE@ -FLaC__SYS_LINUX_FALSE = @FLaC__SYS_LINUX_FALSE@ -FLaC__SYS_LINUX_TRUE = @FLaC__SYS_LINUX_TRUE@ -FLaC__USE_3DNOW_FALSE = @FLaC__USE_3DNOW_FALSE@ -FLaC__USE_3DNOW_TRUE = @FLaC__USE_3DNOW_TRUE@ -FLaC__USE_ALTIVEC_FALSE = @FLaC__USE_ALTIVEC_FALSE@ -FLaC__USE_ALTIVEC_TRUE = @FLaC__USE_ALTIVEC_TRUE@ -FLaC__WITH_CPPLIBS_FALSE = @FLaC__WITH_CPPLIBS_FALSE@ -FLaC__WITH_CPPLIBS_TRUE = @FLaC__WITH_CPPLIBS_TRUE@ -GAS = @GAS@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBICONV = @LIBICONV@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -LTLIBICONV = @LTLIBICONV@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ -MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ -MAKEINFO = @MAKEINFO@ -MINGW_WINSOCK_LIBS = @MINGW_WINSOCK_LIBS@ -NASM = @NASM@ -OBJEXT = @OBJEXT@ -OBJ_FORMAT = @OBJ_FORMAT@ -OGG_CFLAGS = @OGG_CFLAGS@ -OGG_LIBS = @OGG_LIBS@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -XMMS_CFLAGS = @XMMS_CFLAGS@ -XMMS_CONFIG = @XMMS_CONFIG@ -XMMS_DATA_DIR = @XMMS_DATA_DIR@ -XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@ -XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@ -XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@ -XMMS_LIBS = @XMMS_LIBS@ -XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@ -XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@ -XMMS_VERSION = @XMMS_VERSION@ -XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ - -AUTOMAKE_OPTIONS = foreign - -SUBDIRS = grabbag - -EXTRA_DIST = \ - alloc.h \ - getopt.h \ - grabbag.h \ - replaygain_analysis.h \ - replaygain_synthesis.h \ - utf8.h - -subdir = include/share -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -DIST_SOURCES = - -RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \ - ps-recursive install-info-recursive uninstall-info-recursive \ - all-recursive install-data-recursive install-exec-recursive \ - installdirs-recursive install-recursive uninstall-recursive \ - check-recursive installcheck-recursive -DIST_COMMON = $(srcdir)/Makefile.in Makefile.am -DIST_SUBDIRS = $(SUBDIRS) -all: all-recursive - -.SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign include/share/Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @set fnord $$MAKEFLAGS; amf=$$2; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: - @set fnord $$MAKEFLAGS; amf=$$2; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ETAGS = etags -ETAGSFLAGS = - -CTAGS = ctags -CTAGSFLAGS = - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - if (etags --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - else \ - include_option=--include; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -f $$subdir/TAGS && \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$tags$$unique" \ - || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique - -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = ../.. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkinstalldirs) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d $(distdir)/$$subdir \ - || mkdir $(distdir)/$$subdir \ - || exit 1; \ - (cd $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" \ - distdir=../$(distdir)/$$subdir \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile -installdirs: installdirs-recursive -installdirs-am: - -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool \ - distclean-tags - -dvi: dvi-recursive - -dvi-am: - -info: info-recursive - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-recursive - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-info-am - -uninstall-info: uninstall-info-recursive - -.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \ - clean-generic clean-libtool clean-recursive ctags \ - ctags-recursive distclean distclean-generic distclean-libtool \ - distclean-recursive distclean-tags distdir dvi dvi-am \ - dvi-recursive info info-am info-recursive install install-am \ - install-data install-data-am install-data-recursive \ - install-exec install-exec-am install-exec-recursive \ - install-info install-info-am install-info-recursive install-man \ - install-recursive install-strip installcheck installcheck-am \ - installdirs installdirs-am installdirs-recursive \ - maintainer-clean maintainer-clean-generic \ - maintainer-clean-recursive mostlyclean mostlyclean-generic \ - mostlyclean-libtool mostlyclean-recursive pdf pdf-am \ - pdf-recursive ps ps-am ps-recursive tags tags-recursive \ - uninstall uninstall-am uninstall-info-am \ - uninstall-info-recursive uninstall-recursive - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/src/contrib/flacdecoder/include/share/alloc.h b/src/contrib/flacdecoder/include/share/alloc.h deleted file mode 100644 index 812aa69d0..000000000 --- a/src/contrib/flacdecoder/include/share/alloc.h +++ /dev/null @@ -1,212 +0,0 @@ -/* alloc - Convenience routines for safely allocating memory - * Copyright (C) 2007 Josh Coalson - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef FLAC__SHARE__ALLOC_H -#define FLAC__SHARE__ALLOC_H - -#if HAVE_CONFIG_H -# include -#endif - -/* WATCHOUT: for c++ you may have to #define __STDC_LIMIT_MACROS 1 real early - * before #including this file, otherwise SIZE_MAX might not be defined - */ - -#include /* for SIZE_MAX */ -#if !defined _MSC_VER && !defined __MINGW32__ && !defined __EMX__ -#include /* for SIZE_MAX in case limits.h didn't get it */ -#endif -#include /* for size_t, malloc(), etc */ - -#ifndef SIZE_MAX -# ifndef SIZE_T_MAX -# ifdef _MSC_VER -# define SIZE_T_MAX UINT_MAX -# else -# error -# endif -# endif -# define SIZE_MAX SIZE_T_MAX -#endif - -#ifndef FLaC__INLINE -#define FLaC__INLINE -#endif - -/* avoid malloc()ing 0 bytes, see: - * https://www.securecoding.cert.org/confluence/display/seccode/MEM04-A.+Do+not+make+assumptions+about+the+result+of+allocating+0+bytes?focusedCommentId=5407003 -*/ -static FLaC__INLINE void *safe_malloc_(size_t size) -{ - /* malloc(0) is undefined; FLAC src convention is to always allocate */ - if(!size) - size++; - return malloc(size); -} - -static FLaC__INLINE void *safe_calloc_(size_t nmemb, size_t size) -{ - if(!nmemb || !size) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - return calloc(nmemb, size); -} - -/*@@@@ there's probably a better way to prevent overflows when allocating untrusted sums but this works for now */ - -static FLaC__INLINE void *safe_malloc_add_2op_(size_t size1, size_t size2) -{ - size2 += size1; - if(size2 < size1) - return 0; - return safe_malloc_(size2); -} - -static FLaC__INLINE void *safe_malloc_add_3op_(size_t size1, size_t size2, size_t size3) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - return safe_malloc_(size3); -} - -static FLaC__INLINE void *safe_malloc_add_4op_(size_t size1, size_t size2, size_t size3, size_t size4) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - size4 += size3; - if(size4 < size3) - return 0; - return safe_malloc_(size4); -} - -static FLaC__INLINE void *safe_malloc_mul_2op_(size_t size1, size_t size2) -#if 0 -needs support for cases where sizeof(size_t) != 4 -{ - /* could be faster #ifdef'ing off SIZEOF_SIZE_T */ - if(sizeof(size_t) == 4) { - if ((double)size1 * (double)size2 < 4294967296.0) - return malloc(size1*size2); - } - return 0; -} -#else -/* better? */ -{ - if(!size1 || !size2) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - if(size1 > SIZE_MAX / size2) - return 0; - return malloc(size1*size2); -} -#endif - -static FLaC__INLINE void *safe_malloc_mul_3op_(size_t size1, size_t size2, size_t size3) -{ - if(!size1 || !size2 || !size3) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - if(size1 > SIZE_MAX / size2) - return 0; - size1 *= size2; - if(size1 > SIZE_MAX / size3) - return 0; - return malloc(size1*size3); -} - -/* size1*size2 + size3 */ -static FLaC__INLINE void *safe_malloc_mul2add_(size_t size1, size_t size2, size_t size3) -{ - if(!size1 || !size2) - return safe_malloc_(size3); - if(size1 > SIZE_MAX / size2) - return 0; - return safe_malloc_add_2op_(size1*size2, size3); -} - -/* size1 * (size2 + size3) */ -static FLaC__INLINE void *safe_malloc_muladd2_(size_t size1, size_t size2, size_t size3) -{ - if(!size1 || (!size2 && !size3)) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - size2 += size3; - if(size2 < size3) - return 0; - return safe_malloc_mul_2op_(size1, size2); -} - -static FLaC__INLINE void *safe_realloc_add_2op_(void *ptr, size_t size1, size_t size2) -{ - size2 += size1; - if(size2 < size1) - return 0; - return realloc(ptr, size2); -} - -static FLaC__INLINE void *safe_realloc_add_3op_(void *ptr, size_t size1, size_t size2, size_t size3) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - return realloc(ptr, size3); -} - -static FLaC__INLINE void *safe_realloc_add_4op_(void *ptr, size_t size1, size_t size2, size_t size3, size_t size4) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - size4 += size3; - if(size4 < size3) - return 0; - return realloc(ptr, size4); -} - -static FLaC__INLINE void *safe_realloc_mul_2op_(void *ptr, size_t size1, size_t size2) -{ - if(!size1 || !size2) - return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ - if(size1 > SIZE_MAX / size2) - return 0; - return realloc(ptr, size1*size2); -} - -/* size1 * (size2 + size3) */ -static FLaC__INLINE void *safe_realloc_muladd2_(void *ptr, size_t size1, size_t size2, size_t size3) -{ - if(!size1 || (!size2 && !size3)) - return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ - size2 += size3; - if(size2 < size3) - return 0; - return safe_realloc_mul_2op_(ptr, size1, size2); -} - -#endif diff --git a/src/contrib/flacdecoder/include/share/getopt.h b/src/contrib/flacdecoder/include/share/getopt.h deleted file mode 100644 index 1b314b2e7..000000000 --- a/src/contrib/flacdecoder/include/share/getopt.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - NOTE: - I cannot get the vanilla getopt code to work (i.e. compile only what - is needed and not duplicate symbols found in the standard library) - on all the platforms that FLAC supports. In particular the gating - of code with the ELIDE_CODE #define is not accurate enough on systems - that are POSIX but not glibc. If someone has a patch that works on - GNU/Linux, Darwin, AND Solaris please submit it on the project page: - http://sourceforge.net/projects/flac - - In the meantime I have munged the global symbols and removed gates - around code, while at the same time trying to touch the original as - little as possible. -*/ -/* Declarations for getopt. - Copyright (C) 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef SHARE__GETOPT_H -#define SHARE__GETOPT_H - -/*[JEC] was:#ifndef __need_getopt*/ -/*[JEC] was:# define _GETOPT_H 1*/ -/*[JEC] was:#endif*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/* For communication from `share__getopt' to the caller. - When `share__getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -extern char *share__optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `share__getopt'. - - On entry to `share__getopt', zero means this is the first call; initialize. - - When `share__getopt' returns -1, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `share__optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -extern int share__optind; - -/* Callers store zero here to inhibit the error message `share__getopt' prints - for unrecognized options. */ - -extern int share__opterr; - -/* Set to an option character which was unrecognized. */ - -extern int share__optopt; - -/*[JEC] was:#ifndef __need_getopt */ -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to share__getopt_long or share__getopt_long_only is a vector - of `struct share__option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - share__no_argument (or 0) if the option does not take an argument, - share__required_argument (or 1) if the option requires an argument, - share__optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `share__optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `share__getopt' - returns the contents of the `val' field. */ - -struct share__option -{ -# if defined __STDC__ && __STDC__ - const char *name; -# else - char *name; -# endif - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* Names for the values of the `has_arg' field of `struct share__option'. */ - -# define share__no_argument 0 -# define share__required_argument 1 -# define share__optional_argument 2 -/*[JEC] was:#endif*/ /* need getopt */ - - -/* Get definitions and prototypes for functions to process the - arguments in ARGV (ARGC of them, minus the program name) for - options given in OPTS. - - Return the option character from OPTS just read. Return -1 when - there are no more options. For unrecognized options, or options - missing arguments, `share__optopt' is set to the option letter, and '?' is - returned. - - The OPTS string is a list of characters which are recognized option - letters, optionally followed by colons, specifying that that letter - takes an argument, to be placed in `share__optarg'. - - If a letter in OPTS is followed by two colons, its argument is - optional. This behavior is specific to the GNU `share__getopt'. - - The argument `--' causes premature termination of argument - scanning, explicitly telling `share__getopt' that there are no more - options. - - If OPTS begins with `--', then non-option arguments are treated as - arguments to the option '\0'. This behavior is specific to the GNU - `share__getopt'. */ - -/*[JEC] was:#if defined __STDC__ && __STDC__*/ -/*[JEC] was:# ifdef __GNU_LIBRARY__*/ -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int share__getopt (int argc, char *const *argv, const char *shortopts); -/*[JEC] was:# else*/ /* not __GNU_LIBRARY__ */ -/*[JEC] was:extern int getopt ();*/ -/*[JEC] was:# endif*/ /* __GNU_LIBRARY__ */ - -/*[JEC] was:# ifndef __need_getopt*/ -extern int share__getopt_long (int argc, char *const *argv, const char *shortopts, - const struct share__option *longopts, int *longind); -extern int share__getopt_long_only (int argc, char *const *argv, - const char *shortopts, - const struct share__option *longopts, int *longind); - -/* Internal only. Users should not call this directly. */ -extern int share___getopt_internal (int argc, char *const *argv, - const char *shortopts, - const struct share__option *longopts, int *longind, - int long_only); -/*[JEC] was:# endif*/ -/*[JEC] was:#else*/ /* not __STDC__ */ -/*[JEC] was:extern int getopt ();*/ -/*[JEC] was:# ifndef __need_getopt*/ -/*[JEC] was:extern int getopt_long ();*/ -/*[JEC] was:extern int getopt_long_only ();*/ - -/*[JEC] was:extern int _getopt_internal ();*/ -/*[JEC] was:# endif*/ -/*[JEC] was:#endif*/ /* __STDC__ */ - -#ifdef __cplusplus -} -#endif - -/* Make sure we later can get all the definitions and declarations. */ -/*[JEC] was:#undef __need_getopt*/ - -#endif /* getopt.h */ diff --git a/src/contrib/flacdecoder/include/share/grabbag.h b/src/contrib/flacdecoder/include/share/grabbag.h deleted file mode 100644 index 42c6998e1..000000000 --- a/src/contrib/flacdecoder/include/share/grabbag.h +++ /dev/null @@ -1,29 +0,0 @@ -/* grabbag - Convenience lib for various routines common to several tools - * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef SHARE__GRABBAG_H -#define SHARE__GRABBAG_H - -/* These can't be included by themselves, only from within grabbag.h */ -#include "grabbag/cuesheet.h" -#include "grabbag/file.h" -#include "grabbag/picture.h" -#include "grabbag/replaygain.h" -#include "grabbag/seektable.h" - -#endif diff --git a/src/contrib/flacdecoder/include/share/grabbag/Makefile.am b/src/contrib/flacdecoder/include/share/grabbag/Makefile.am deleted file mode 100644 index 0d520aa53..000000000 --- a/src/contrib/flacdecoder/include/share/grabbag/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -## Process this file with automake to produce Makefile.in - -AUTOMAKE_OPTIONS = foreign - -EXTRA_DIST = \ - cuesheet.h \ - file.h \ - picture.h \ - replaygain.h \ - seektable.h diff --git a/src/contrib/flacdecoder/include/share/grabbag/Makefile.in b/src/contrib/flacdecoder/include/share/grabbag/Makefile.in deleted file mode 100644 index a895c7c3f..000000000 --- a/src/contrib/flacdecoder/include/share/grabbag/Makefile.in +++ /dev/null @@ -1,362 +0,0 @@ -# Makefile.in generated by automake 1.7.9 from Makefile.am. -# @configure_input@ - -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 -# Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../../.. - -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -host_triplet = @host@ -ACLOCAL = @ACLOCAL@ -ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -AS = @AS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCAS = @CCAS@ -CCASFLAGS = @CCASFLAGS@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEBUG_FALSE = @DEBUG_FALSE@ -DEBUG_TRUE = @DEBUG_TRUE@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@ -DOXYGEN = @DOXYGEN@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FLAC__TEST_LEVEL = @FLAC__TEST_LEVEL@ -FLAC__TEST_WITH_VALGRIND = @FLAC__TEST_WITH_VALGRIND@ -FLaC__CPU_IA32_FALSE = @FLaC__CPU_IA32_FALSE@ -FLaC__CPU_IA32_TRUE = @FLaC__CPU_IA32_TRUE@ -FLaC__CPU_PPC_FALSE = @FLaC__CPU_PPC_FALSE@ -FLaC__CPU_PPC_TRUE = @FLaC__CPU_PPC_TRUE@ -FLaC__CPU_SPARC_FALSE = @FLaC__CPU_SPARC_FALSE@ -FLaC__CPU_SPARC_TRUE = @FLaC__CPU_SPARC_TRUE@ -FLaC__HAS_AS_FALSE = @FLaC__HAS_AS_FALSE@ -FLaC__HAS_AS_TRUE = @FLaC__HAS_AS_TRUE@ -FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@ -FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@ -FLaC__HAS_DOCBOOK_TO_MAN_FALSE = @FLaC__HAS_DOCBOOK_TO_MAN_FALSE@ -FLaC__HAS_DOCBOOK_TO_MAN_TRUE = @FLaC__HAS_DOCBOOK_TO_MAN_TRUE@ -FLaC__HAS_DOXYGEN_FALSE = @FLaC__HAS_DOXYGEN_FALSE@ -FLaC__HAS_DOXYGEN_TRUE = @FLaC__HAS_DOXYGEN_TRUE@ -FLaC__HAS_GAS_FALSE = @FLaC__HAS_GAS_FALSE@ -FLaC__HAS_GAS_TRUE = @FLaC__HAS_GAS_TRUE@ -FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@ -FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@ -FLaC__HAS_NASM_FALSE = @FLaC__HAS_NASM_FALSE@ -FLaC__HAS_NASM_TRUE = @FLaC__HAS_NASM_TRUE@ -FLaC__HAS_OGG_FALSE = @FLaC__HAS_OGG_FALSE@ -FLaC__HAS_OGG_TRUE = @FLaC__HAS_OGG_TRUE@ -FLaC__HAS_XMMS_FALSE = @FLaC__HAS_XMMS_FALSE@ -FLaC__HAS_XMMS_TRUE = @FLaC__HAS_XMMS_TRUE@ -FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE@ -FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE@ -FLaC__NO_ASM_FALSE = @FLaC__NO_ASM_FALSE@ -FLaC__NO_ASM_TRUE = @FLaC__NO_ASM_TRUE@ -FLaC__SSE_OS_FALSE = @FLaC__SSE_OS_FALSE@ -FLaC__SSE_OS_TRUE = @FLaC__SSE_OS_TRUE@ -FLaC__SYS_DARWIN_FALSE = @FLaC__SYS_DARWIN_FALSE@ -FLaC__SYS_DARWIN_TRUE = @FLaC__SYS_DARWIN_TRUE@ -FLaC__SYS_LINUX_FALSE = @FLaC__SYS_LINUX_FALSE@ -FLaC__SYS_LINUX_TRUE = @FLaC__SYS_LINUX_TRUE@ -FLaC__USE_3DNOW_FALSE = @FLaC__USE_3DNOW_FALSE@ -FLaC__USE_3DNOW_TRUE = @FLaC__USE_3DNOW_TRUE@ -FLaC__USE_ALTIVEC_FALSE = @FLaC__USE_ALTIVEC_FALSE@ -FLaC__USE_ALTIVEC_TRUE = @FLaC__USE_ALTIVEC_TRUE@ -FLaC__WITH_CPPLIBS_FALSE = @FLaC__WITH_CPPLIBS_FALSE@ -FLaC__WITH_CPPLIBS_TRUE = @FLaC__WITH_CPPLIBS_TRUE@ -GAS = @GAS@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBICONV = @LIBICONV@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -LTLIBICONV = @LTLIBICONV@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ -MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ -MAKEINFO = @MAKEINFO@ -MINGW_WINSOCK_LIBS = @MINGW_WINSOCK_LIBS@ -NASM = @NASM@ -OBJEXT = @OBJEXT@ -OBJ_FORMAT = @OBJ_FORMAT@ -OGG_CFLAGS = @OGG_CFLAGS@ -OGG_LIBS = @OGG_LIBS@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -XMMS_CFLAGS = @XMMS_CFLAGS@ -XMMS_CONFIG = @XMMS_CONFIG@ -XMMS_DATA_DIR = @XMMS_DATA_DIR@ -XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@ -XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@ -XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@ -XMMS_LIBS = @XMMS_LIBS@ -XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@ -XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@ -XMMS_VERSION = @XMMS_VERSION@ -XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ - -AUTOMAKE_OPTIONS = foreign - -EXTRA_DIST = \ - cuesheet.h \ - file.h \ - picture.h \ - replaygain.h \ - seektable.h - -subdir = include/share/grabbag -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -DIST_SOURCES = -DIST_COMMON = $(srcdir)/Makefile.in Makefile.am -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign include/share/grabbag/Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = ../../.. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkinstalldirs) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile - -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool - -dvi: dvi-am - -dvi-am: - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/src/contrib/flacdecoder/include/share/grabbag/cuesheet.h b/src/contrib/flacdecoder/include/share/grabbag/cuesheet.h deleted file mode 100644 index 698d49bff..000000000 --- a/src/contrib/flacdecoder/include/share/grabbag/cuesheet.h +++ /dev/null @@ -1,42 +0,0 @@ -/* grabbag - Convenience lib for various routines common to several tools - * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* This .h cannot be included by itself; #include "share/grabbag.h" instead. */ - -#ifndef GRABBAG__CUESHEET_H -#define GRABBAG__CUESHEET_H - -#include -#include "FLAC/metadata.h" - -#ifdef __cplusplus -extern "C" { -#endif - -unsigned grabbag__cuesheet_msf_to_frame(unsigned minutes, unsigned seconds, unsigned frames); -void grabbag__cuesheet_frame_to_msf(unsigned frame, unsigned *minutes, unsigned *seconds, unsigned *frames); - -FLAC__StreamMetadata *grabbag__cuesheet_parse(FILE *file, const char **error_message, unsigned *last_line_read, FLAC__bool is_cdda, FLAC__uint64 lead_out_offset); - -void grabbag__cuesheet_emit(FILE *file, const FLAC__StreamMetadata *cuesheet, const char *file_reference); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/contrib/flacdecoder/include/share/grabbag/file.h b/src/contrib/flacdecoder/include/share/grabbag/file.h deleted file mode 100644 index c8b149f83..000000000 --- a/src/contrib/flacdecoder/include/share/grabbag/file.h +++ /dev/null @@ -1,63 +0,0 @@ -/* grabbag - Convenience lib for various routines common to several tools - * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* Convenience routines for manipulating files */ - -/* This .h cannot be included by itself; #include "share/grabbag.h" instead. */ - -#ifndef GRABAG__FILE_H -#define GRABAG__FILE_H - -/* needed because of off_t */ -#if HAVE_CONFIG_H -# include -#endif - -#include /* for off_t */ -#include /* for FILE */ -#include "FLAC/ordinals.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void grabbag__file_copy_metadata(const char *srcpath, const char *destpath); -off_t grabbag__file_get_filesize(const char *srcpath); -const char *grabbag__file_get_basename(const char *srcpath); - -/* read_only == false means "make file writable by user" - * read_only == true means "make file read-only for everyone" - */ -FLAC__bool grabbag__file_change_stats(const char *filename, FLAC__bool read_only); - -/* returns true iff stat() succeeds for both files and they have the same device and inode. */ -/* on windows, uses GetFileInformationByHandle() to compare */ -FLAC__bool grabbag__file_are_same(const char *f1, const char *f2); - -/* attempts to make writable before unlinking */ -FLAC__bool grabbag__file_remove_file(const char *filename); - -/* these will forcibly set stdin/stdout to binary mode (for OSes that require it) */ -FILE *grabbag__file_get_binary_stdin(void); -FILE *grabbag__file_get_binary_stdout(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/contrib/flacdecoder/include/share/grabbag/picture.h b/src/contrib/flacdecoder/include/share/grabbag/picture.h deleted file mode 100644 index e7f427880..000000000 --- a/src/contrib/flacdecoder/include/share/grabbag/picture.h +++ /dev/null @@ -1,46 +0,0 @@ -/* grabbag - Convenience lib for various routines common to several tools - * Copyright (C) 2006,2007 Josh Coalson - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -/* This .h cannot be included by itself; #include "share/grabbag.h" instead. */ - -#ifndef GRABBAG__PICTURE_H -#define GRABBAG__PICTURE_H - -#include "FLAC/metadata.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* spec should be of the form "[TYPE]|MIME_TYPE|[DESCRIPTION]|[WIDTHxHEIGHTxDEPTH[/COLORS]]|FILE", e.g. - * "|image/jpeg|||cover.jpg" - * "4|image/jpeg||300x300x24|backcover.jpg" - * "|image/png|description|300x300x24/71|cover.png" - * "-->|image/gif||300x300x24/71|http://blah.blah.blah/cover.gif" - * - * empty type means default to FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER - * empty resolution spec means to get from the file (cannot get used with "-->" linked images) - * spec and error_message must not be NULL - */ -FLAC__StreamMetadata *grabbag__picture_parse_specification(const char *spec, const char **error_message); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/contrib/flacdecoder/include/share/grabbag/replaygain.h b/src/contrib/flacdecoder/include/share/grabbag/replaygain.h deleted file mode 100644 index ea8c93598..000000000 --- a/src/contrib/flacdecoder/include/share/grabbag/replaygain.h +++ /dev/null @@ -1,72 +0,0 @@ -/* grabbag - Convenience lib for various routines common to several tools - * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* - * This wraps the replaygain_analysis lib, which is LGPL. This wrapper - * allows analysis of different input resolutions by automatically - * scaling the input signal - */ - -/* This .h cannot be included by itself; #include "share/grabbag.h" instead. */ - -#ifndef GRABBAG__REPLAYGAIN_H -#define GRABBAG__REPLAYGAIN_H - -#include "FLAC/metadata.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern const unsigned GRABBAG__REPLAYGAIN_MAX_TAG_SPACE_REQUIRED; - -extern const FLAC__byte * const GRABBAG__REPLAYGAIN_TAG_REFERENCE_LOUDNESS; /* = "REPLAYGAIN_REFERENCE_LOUDNESS" */ -extern const FLAC__byte * const GRABBAG__REPLAYGAIN_TAG_TITLE_GAIN; /* = "REPLAYGAIN_TRACK_GAIN" */ -extern const FLAC__byte * const GRABBAG__REPLAYGAIN_TAG_TITLE_PEAK; /* = "REPLAYGAIN_TRACK_PEAK" */ -extern const FLAC__byte * const GRABBAG__REPLAYGAIN_TAG_ALBUM_GAIN; /* = "REPLAYGAIN_ALBUM_GAIN" */ -extern const FLAC__byte * const GRABBAG__REPLAYGAIN_TAG_ALBUM_PEAK; /* = "REPLAYGAIN_ALBUM_PEAK" */ - -FLAC__bool grabbag__replaygain_is_valid_sample_frequency(unsigned sample_frequency); - -FLAC__bool grabbag__replaygain_init(unsigned sample_frequency); - -/* 'bps' must be valid for FLAC, i.e. >=4 and <= 32 */ -FLAC__bool grabbag__replaygain_analyze(const FLAC__int32 * const input[], FLAC__bool is_stereo, unsigned bps, unsigned samples); - -void grabbag__replaygain_get_album(float *gain, float *peak); -void grabbag__replaygain_get_title(float *gain, float *peak); - -/* These three functions return an error string on error, or NULL if successful */ -const char *grabbag__replaygain_analyze_file(const char *filename, float *title_gain, float *title_peak); -const char *grabbag__replaygain_store_to_vorbiscomment(FLAC__StreamMetadata *block, float album_gain, float album_peak, float title_gain, float title_peak); -const char *grabbag__replaygain_store_to_vorbiscomment_reference(FLAC__StreamMetadata *block); -const char *grabbag__replaygain_store_to_vorbiscomment_album(FLAC__StreamMetadata *block, float album_gain, float album_peak); -const char *grabbag__replaygain_store_to_vorbiscomment_title(FLAC__StreamMetadata *block, float title_gain, float title_peak); -const char *grabbag__replaygain_store_to_file(const char *filename, float album_gain, float album_peak, float title_gain, float title_peak, FLAC__bool preserve_modtime); -const char *grabbag__replaygain_store_to_file_reference(const char *filename, FLAC__bool preserve_modtime); -const char *grabbag__replaygain_store_to_file_album(const char *filename, float album_gain, float album_peak, FLAC__bool preserve_modtime); -const char *grabbag__replaygain_store_to_file_title(const char *filename, float title_gain, float title_peak, FLAC__bool preserve_modtime); - -FLAC__bool grabbag__replaygain_load_from_vorbiscomment(const FLAC__StreamMetadata *block, FLAC__bool album_mode, FLAC__bool strict, double *reference, double *gain, double *peak); -double grabbag__replaygain_compute_scale_factor(double peak, double gain, double preamp, FLAC__bool prevent_clipping); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/contrib/flacdecoder/include/share/grabbag/seektable.h b/src/contrib/flacdecoder/include/share/grabbag/seektable.h deleted file mode 100644 index 8010fc946..000000000 --- a/src/contrib/flacdecoder/include/share/grabbag/seektable.h +++ /dev/null @@ -1,38 +0,0 @@ -/* grabbag - Convenience lib for various routines common to several tools - * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* Convenience routines for working with seek tables */ - -/* This .h cannot be included by itself; #include "share/grabbag.h" instead. */ - -#ifndef GRABAG__SEEKTABLE_H -#define GRABAG__SEEKTABLE_H - -#include "FLAC/format.h" - -#ifdef __cplusplus -extern "C" { -#endif - -FLAC__bool grabbag__seektable_convert_specification_to_template(const char *spec, FLAC__bool only_explicit_placeholders, FLAC__uint64 total_samples_to_encode, unsigned sample_rate, FLAC__StreamMetadata *seektable_template, FLAC__bool *spec_has_real_points); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/contrib/flacdecoder/include/share/replaygain_analysis.h b/src/contrib/flacdecoder/include/share/replaygain_analysis.h deleted file mode 100644 index 02067d21f..000000000 --- a/src/contrib/flacdecoder/include/share/replaygain_analysis.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ReplayGainAnalysis - analyzes input samples and give the recommended dB change - * Copyright (C) 2001 David Robinson and Glen Sawyer - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * concept and filter values by David Robinson (David@Robinson.org) - * -- blame him if you think the idea is flawed - * coding by Glen Sawyer (glensawyer@hotmail.com) 442 N 700 E, Provo, UT 84606 USA - * -- blame him if you think this runs too slowly, or the coding is otherwise flawed - * minor cosmetic tweaks to integrate with FLAC by Josh Coalson - * - * For an explanation of the concepts and the basic algorithms involved, go to: - * http://www.replaygain.org/ - */ - -#ifndef GAIN_ANALYSIS_H -#define GAIN_ANALYSIS_H - -#include - -#define GAIN_NOT_ENOUGH_SAMPLES -24601 -#define GAIN_ANALYSIS_ERROR 0 -#define GAIN_ANALYSIS_OK 1 - -#define INIT_GAIN_ANALYSIS_ERROR 0 -#define INIT_GAIN_ANALYSIS_OK 1 - -#ifdef __cplusplus -extern "C" { -#endif - -typedef float Float_t; /* Type used for filtering */ - -extern Float_t ReplayGainReferenceLoudness; /* in dB SPL, currently == 89.0 */ - -int InitGainAnalysis ( long samplefreq ); -int AnalyzeSamples ( const Float_t* left_samples, const Float_t* right_samples, size_t num_samples, int num_channels ); -int ResetSampleFrequency ( long samplefreq ); -Float_t GetTitleGain ( void ); -Float_t GetAlbumGain ( void ); - -#ifdef __cplusplus -} -#endif - -#endif /* GAIN_ANALYSIS_H */ diff --git a/src/contrib/flacdecoder/include/share/replaygain_synthesis.h b/src/contrib/flacdecoder/include/share/replaygain_synthesis.h deleted file mode 100644 index ca1ae6413..000000000 --- a/src/contrib/flacdecoder/include/share/replaygain_synthesis.h +++ /dev/null @@ -1,51 +0,0 @@ -/* replaygain_synthesis - Routines for applying ReplayGain to a signal - * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef FLAC__SHARE__REPLAYGAIN_SYNTHESIS_H -#define FLAC__SHARE__REPLAYGAIN_SYNTHESIS_H - -#include /* for size_t */ -#include "FLAC/ordinals.h" - -#define FLAC_SHARE__MAX_SUPPORTED_CHANNELS 2 - -typedef enum { - NOISE_SHAPING_NONE = 0, - NOISE_SHAPING_LOW = 1, - NOISE_SHAPING_MEDIUM = 2, - NOISE_SHAPING_HIGH = 3 -} NoiseShaping; - -typedef struct { - const float* FilterCoeff; - FLAC__uint64 Mask; - double Add; - float Dither; - float ErrorHistory [FLAC_SHARE__MAX_SUPPORTED_CHANNELS] [16]; /* 16th order Noise shaping */ - float DitherHistory [FLAC_SHARE__MAX_SUPPORTED_CHANNELS] [16]; - int LastRandomNumber [FLAC_SHARE__MAX_SUPPORTED_CHANNELS]; - unsigned LastHistoryIndex; - NoiseShaping ShapingType; -} DitherContext; - -void FLAC__replaygain_synthesis__init_dither_context(DitherContext *dither, int bits, int shapingtype); - -/* scale = (float) pow(10., (double)replaygain * 0.05); */ -size_t FLAC__replaygain_synthesis__apply_gain(FLAC__byte *data_out, FLAC__bool little_endian_data_out, FLAC__bool unsigned_data_out, const FLAC__int32 * const input[], unsigned wide_samples, unsigned channels, const unsigned source_bps, const unsigned target_bps, const double scale, const FLAC__bool hard_limit, FLAC__bool do_dithering, DitherContext *dither_context); - -#endif diff --git a/src/contrib/flacdecoder/include/share/utf8.h b/src/contrib/flacdecoder/include/share/utf8.h deleted file mode 100644 index 7d6650d60..000000000 --- a/src/contrib/flacdecoder/include/share/utf8.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef SHARE__UTF8_H -#define SHARE__UTF8_H - -/* - * Convert a string between UTF-8 and the locale's charset. - * Invalid bytes are replaced by '#', and characters that are - * not available in the target encoding are replaced by '?'. - * - * If the locale's charset is not set explicitly then it is - * obtained using nl_langinfo(CODESET), where available, the - * environment variable CHARSET, or assumed to be US-ASCII. - * - * Return value of conversion functions: - * - * -1 : memory allocation failed - * 0 : data was converted exactly - * 1 : valid data was converted approximately (using '?') - * 2 : input was invalid (but still converted, using '#') - * 3 : unknown encoding (but still converted, using '?') - */ - -int utf8_encode(const char *from, char **to); -int utf8_decode(const char *from, char **to); - -#endif diff --git a/src/contrib/flacdecoder/lib/VS2008/FLAC++.dll b/src/contrib/flacdecoder/lib/VS2008/FLAC++.dll deleted file mode 100644 index f736c970d5dca8e714e8706ada6000ed0bfe78ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116736 zcmeFa4R}=5wKskyGf7U8ff*&yAOWL9ML~-OlsH7g#{^V@6JjPr2;ePpr>Si*%mKV5 z5Il*^$zhb<>blhb{AdJ8K zH{*pDQ{KE{pJmCLSKQ?-No+28nf_QJbM zvcL76wfEmJZd_`Pf%;EB`1RfY{@3@j%-?0dE6VyA-hbJ!I!osFrCBfW`|_;6@cZJd zXK=5XwJYmc-2eTr?`19K;l(`smkoCq>F?zCW#9O^k8qDx5|3LDmRJ&nH~g!LOqdQK z;fgd%iXgNgWKa*Cbsg?b{5tr%lRqa2LLz^S-UTND!OWJwS_C}d4~ZyURI#J{-Qd4}vmbH4 zKZpy_M`a};i22JFgf%x*t-a5GpCBZ+BccPpWB47yFXpcR;&OuyCY+jth(;8Ia6T1Z zAiy==P_?1z>xklIMVUF1o*xERa6{Go4}1rJpG^cXcpzMc`!9#V%}40}|Mz!rpj7QH zR*J%^JKRtt)-M*-KUW;E35O$pk$6$=Nbuk6+x3dzQ~_TcURG&GDi6!JL=e;>QU1{4 zcc`Ud`BU36wiaRXK^x*_W(!@81T6RG0CNM2#c#)ZF)N6`#O4{zPhD&)20nGZ&7);J z^O4|`4~lh-jwc#p!4F5_J)A7tvhx6=RPpdEplO=prN;h~lN#klOB`mM1^;9CaBiEt z*(NxiXliHz-e!ZN5qx2_z!np3GCUG5QhC^4_7Zc$L5uh$`0fr5qi_g(^;d)+cY*MZ zm)v#`Bo-4<_5Ti{O2ff~7@|Z&W`@vn{h+4B(HxD}<*D(&PU^gZD z853V%lN(dc6A%3JGGTATfyAWe@kd!aL|lBsysWsypdc<@EftlERJUE3N2NGGbsQJp zP%73J$D33}Jmf_rqoe;Mq!&y85l1`JJ2T}Ezf5a|?7-?#7H1ODSYs?Uf89QKbC)5X zo(q)!uL%E_pIjLJc=@M9B>yo)jUxY(e@s$3TtCO*+xv6`$V6kBOHqCs_G$YsqwPiH z?L|tXBE;+Kg9sbaUYdVEnZ)SpT@jerYKYXYk>C2pXnwjqoH#;$_e5|-+RGWz#IgC! zjKGYXAJ-RuAbyd)^Icedf9os4e@U#q0Q_=tMWr5I-{1s~ z5A=?q57)mol;2Napgy#II}tXdeq~b1vHWg~z?_HQ-!l2(zc7A(N#!H{T_Akm0^#HM zEm9)lcT6V3`K{~o>|y-6UmVV_7ZEmuU)J42__Z?vGa|pjs;FiNe?slp8USD_?P&cY zzBH_)#?^kTz6=VzVZClkMN)szsj-4$wD>4Ky?h0Gqw=7)_qyca~`33@P6W z5tvcRS0pNwLu_m;{Z#%n7^aR={%}yJAsK?Y|0?Bce|Bj3o=qBFzFve4Dc_m8A?0h2 zz{Hjy!cWi_{wn+rqs^h?Qath16v1cc$6Y@iO8=h|htoeRLR&;XS|1)lzcT_egnrfS zgzm7zSs*TBTWrJ$`*8USs{+zBN9g17>iKZg`Vz_ipk>Sj1aa2viDT09x}0y*+6k}O zAw}Yi^1twtVdV#fL-p0|k+Ma~KVj?8@`G=B9Y=_Xvj>d!zI$kX(g^t-iQtOn2WMoQ ze%!@58DG0md50SS;~CCUv*`Se^2^<#?opCAXF99WNa7(Ur30Z9v>v(9rnm=G{Oe4M z@Qc^S-ZAUr@zLtTl(&B!R(|VnejkaHEmHm;z#AH0exw_l-|L?onqT4w`K=zF-^VL*7f-%Ise4_7N=EOP-$ZhbYJE2{b9k&ZlOoT-C5V@Pw{%# za(XQfy2J3jXbe_`AXj$^(k+@KhEkF8928x7v$s;vX4~2=PA#LeLvYqLN|&&Dh@sk} zWiSMI*c`kmN#*P#I98fLjgSIrc9NIn{!XIEHTxi_*>ojPK8(J>AV$HkjfgSx2QlDl zCwq!xv9W5NyQ-n$y+9%lb~wI=u0|*+Q}a8JubfXr2~s9|1Fql7DQseRc=4B-)bUBr#u1~TQ$}JB0xc7v`>CXUH*w2v@(!hTyiCy0%u5CpFQD(AD{I*(cUJ*+7vWE$beH~#z!486Q z8&^dezR?QQg*o;TpjxKhlOyK7->@>r-hTi!EBG&INR?^rH8uB**R;XGt=6;hX)X7Ne89H- zL&0L%?#BQk4E$4X3i&5Cbvf~9$74dMb#-9AwxT&Oe{eNjzvS02u9fM&Y^v1Xl4}B@ zq!l?g-wNF{y~wTZ*}<7g6>l&6{_}BGy6WO zNWGt#RsLT=o|LJyGV1^mFrClqD$dIz?3A#JUzi(oJNC|A6 zj*1KLMVgeZNls0&Q=Ju{nwq&7RdgKhD zheyhjLf=p!F;*gO% zgD&8j7mG{JiEBlBXdDqf_fkXH=%p8wljMEe*4&raeZ=Cl?C-!;nkbLsZ|Ym@9%SQd zI)Q>6#N0}`H&E2e-PXR9U~a(O>tW3ZKWwn#Q)=|H+acQQxygD)30iyQM0N~nq|#C; zuz@VnYxb^pk;+K40%`ao#>7`XVXLkX1T?H<_6%Y|UF`Rm z64NqHqRs9(i6+S&y;czR^n!Z!pHm64I+?u#5<*AVE7RzGOE#NxHGjAiWK4nkk=kjR zme_+dU3;mz4_yWLwp`5>ly1z+r|_-YwQ+RM%dbBQz9h0=K#$~AJEiZkrvc0)h3CBEXl9fJzGsT!|v~l$X2u9kn;3j9zW_w1d!ivm1#&Di~3&wS)VYmU-DX zh+E}a#wpT4OKqBx6w36nO<$mXy1oEYNxdYOvC!oJgTh%28M2dzzd$1XPvj#xtNvB3 z5D`bJxKFa@Wf0+x+SgGsl6O~+KT#e`kZ#y5bdtjLi)G#ttsT%L-j3RT0USbD6>=jK zjgDH`2)boD)DhqYEm976mR;s4VN(%SRwlJ!N z{)EKSlkPqaj5ac5WkkdmQ=#E-G@h-Gb`aLqb4p*r}G< zSvRsOC&n1kB<8lcY;P_{8}mU3c7U*xkFZ5m%WZh1wsYI}1f;wqXG7ov75 z$CtZWCpAuOk{iW}X7(DY2V^JhYizPOn-Qkxo7Yvz~#H1W30?Qv$ZXwc|;d z^Wd@ZaKvvSF1_Dn?jJ1)uSDc#(%tOh0aA-I@+w) z39XiK5Lr}E2j5Pj{GVy)*tA7Tbtf^63Wct?0F4!0@uOh4-WC51a!_85?lLfo6Pz~% zU2!nTe`J1bP?a>UkDJfsuZ~~-PKeT%55~@ zIv+yEQH2Xih9)Xcfc0zYqB`%jw7NZ zkaeRvK`HH3y( z)kDWafh7sH{^M7y+_!KrMVbl%u9z6g3f$QdiFs<@K_ozA5=EBV)C#*=BC0EFu)wWF zy~@2dG*K1TWuj8TP4uI2xmFCwf3heQy^gxafM>cipjHetowHTmu1NN~R=NJTF+u&K zwP--)sZc7{+X#8v^`3tfMqlcKHrIoqeETVdcOV6$KMmA!x>IN}R!LG8&cxJtk0v_m&LDpGa`aK8w@(s* zg>aiG@no)2u&Y4tc&fxC4Ey;ti7$r^CSlD6pzSX)dHs;DL+$BRjT7f=-}c7 zI>2IQ%|iJ&wFM)PiZ`a=DLE8GLvf?Jbs*5?%2r*YPNZzNn29{jZ zT^v}PUhH87*MMr+W(VyW2X!S9>_(gXEis+9jyU=XF+!y8{;x|J(g-@$p%H=>z} zh6PF?68eLcHlL6UB}5IgOv`wc$Jl}LVr`={k`3wj(7(w`MNPR)*=o}gDGRmGDT|ug zvU-)?>WeX#jYce%c-04;Wx4N%tk%W_uv*Tl&EII`t+;k3wPMJ>d*EKBKvZbLLA+Dy zt+c7QyV+ zbUw)4SdT&442+P_%T(LdccvFZqg~qcsY5+9M5FbpcZV^ey2Eukuq7|7Uak~5q0SwT zmV&UpW~ezg9<1-W&Nv=(;R&jz>8uSpa6mqL`^Kco+spB&uC}>Wi_!w##N@Nt8!n^P zI1pH3;RZITE8ECI%MnT&NxiW%D>^;O-&Hqm~nmV6&Z*tpv^l z7Ty$AL}iI34E>>2>QLT7x8YAR`8__`p)BPc3Xd7a zY;-8#_a?4vH;KSX`c{HNBCP22L^3Su4cJes4-qSs?{fa$g{x@vY+!4WshpE+G6(`& zxpIE%HBeu3{Bu&yd7Q0p5nB<5!gs_(K4c3RY+V||R<~2JDho5i+?a|Ac=~Rx0E$GY zBx@q68oB9G`NJM`(2&lOJ0OGJvg$PXE$#Sca?yYm8V9kH4{5o5$3LZRdK}k#@4_x9 zv8k@9r2|t3)83I%<>qvyLUf(1Vy=_YHgz%~9tGxIz`QH12-)TDib71v9;Cd{NSP8B z_ij}WQe?1Q7=frKkq`V9G!#oAGlJcUbqnR{T~5WKE^x|oH2AerddTpFbfItoi^8|BAHG4745{YzOZWb?7T54myxR zN&^r;uei%*7zzW(M^yjGraWXrhU!0&VsO+3sAWVX^G;C#0Op_X#8outTBS>7+F%o; zvK~@eJ+-DfO_0*K=%Lkop5juYLK;rlQooRl27ru<3TVoA$>s{Ys*}33gBwN1KTEj< zima~9pQfZLOD>{D4_zqrSdUV>M$k=Y*1hWZz(W@0wz@XyGS_74XTfgRTHKhBlI5!? zh}5bg2Ikwi7C-FEo+CKdYO_&10sbea@<5I=fZz0v5^ve=8jN^vbcb_a_bB%>4OX2y zY?#sL*8=XIwR8(>LH{_IUe+VI_Bm|jl^|rPT`d&#_a*f17W)cp>l}5LkQ5X-1EowU39BpY zikm4#-SW9X|LVXULcq2{UGhkJVBsT9#oa?rC*oMT`VJGPVv(v_v%ry1ux$}}kWV64 z>8+Y-P4MTaN%17SdxcJdmy>WSYom8}uU@id5KbixwL#Bp&m)HxT1Ngpv|quW?V~&U z0kVVp7XvA*Y7{FiSXW5lScHhqggwVgWY1e}_h0POIdWWWWxv#eQLoBk`%sb!hmdqL zC#grpqRV&KJf!>$#ywhIiQQ4V3=am{H&{8My0Q?$>!R#6X65F_3ovpp^42n5#KZO= zg>Ki@d@2Z=i0D7AHU=xK*2YKZ>}Ue+vuT*fzK>xOAIE9!e6EBe_NBusp<_e(44)0J z7+pUP?08S4tlABn)Pl`))14`=f9q?yE;k(3Z1<0KN_YIsZjMTkfCaqX+h^f!AIsR3^ZR z&Y(~l@Kt8|dT3buBph`p+7GE{q(gJxUywI>2il_U-%%!$d#b_h{An%j@QnzLI$`m4&=Cm7)7CHen?mpiqa z*@t*l2iQ^ElqBsP1L+$))Ihc$FR07B>P{&!&)wl4PdKYjlFycMP^(Xde&XAU;_rKg zc(9rrHNF?<{ds!7o8HaQ_2nR3u7(eOn!<~SatC3aQf;&FmzsvMQ?y@1#4jnLne9h^ zq}MnYXd%F6VC2F@PDl9rex<(y$jd~cyvNI~gh;|;e;HkS;I;L#@4=DgWyxrJUiNu5 zU4M&Z!d~VBq;JVwP&pQ|`cvSR)n~Xk zaGKF357YI32aK^niQ{fVhm4^96W25HSf6+s}o;1xM{XJp06N1#J1)BkI37>js55blyi1BT*LpJ2y57=hkd$&Q( z{+bBXd!9!wx%L<#_hQUqBYOqu}>kYJ=YT+U^$t_nQ}R;f`DXMR}q$0~5%~ zoi-24?WDG|(Z;T$2YH<>GQ|M}ATXKoRNF(Z1NEA2Kt$$}X-WyxNH%pzj%Z95%~ca_ zwMaLlHu|r=^*)PqRcfbyauajjIxj(*h`@_(z0WGaxV2$YD78~MrfRv3%{wPG9__&D z_U8TrkWRs$*^q#VD4_X7Zn7ZJsr~~HNx}cjIu#Lw|1E^J5dPPJ|95gzLa3f=bG@0V zXM@Q-5DC=^c3$maDOXZ!F7&c%sC?zhBI8ZQ7Oa@0Cj<_%zq=YxCV0+kV$o5Q5kz4vpmSU zkh0FyHrUG0oD6wQA&!Tvh+B=h9iFrNkSJiX2xai6Xb;-h_dg=GtMiarO58VqaHIDM z(6Xe{OoJc>lboOO*`WyO#&i$$)p3zQ3qf}ME5h|Y(7^Hv$C5QN7CXl>O60G3$4oCYsrwK%xn@YeX5 zhq~5EJs@><)c1wiM7$gGF%Qcm3V)pbL12MR9~2y?-S5u@sOYf ztwC3?%Hh$ZFiS?y!8`X$;7LJf0S`S5Q0_~=vFTg_)Xl@m<{+A6cz3epqknaHk%;BpLm2pSVQiIthlS2e@oj(K0w2_Di3 zHCV95H29{uT0vd|;LV8h-vDf8e*~m1TSV8(s1TFlOdfEAH?r$hW;u5dFzy!WR6{LKA?R)T2qAn$)3XJPB>vW;UPg-P6EuJ^;vl z9f|uAb6~q$yy&=7*#W4Xa@K*lN}v=gFJT|yv0Mj9aMT_`^(b{6=H53FxUSpr!~nkqy7}$tR(`8H$ZyX!^4l+7#qFub>UwZfC0oF4Q|fy09ITs( zt3|K~%C8y46@)82N?j)&19d0K;u1XUM=(e9H&lpHH;qS9x=JC)fv_r|K>2kiz?Hfg z2-h-pf(ro-2?O?Vyr8>Tjj08FGz0s6H!%Wc{nS!>|Iw+fX@`_?6k^l?rU_?I{Olb_ zs=W>VT(O(x4WX(1m%^nHY4VFkZVx+Q*&I>pP5zmL$|KIF6+IZ-Fa zjqGj6i030#I@xI&w@?hMq9=*-t+3lcb6uaKb^zs23vExGpC#qbAcvne@y z7EVkZfK$qz;O~?x&xzIXcOq*KUz#D|T|TH2%6{HK>lgg@`+62pL*fXJ007+FW2)uF zW?T9ZNd%UBpe@acZ%a?48>E1*ttyg3=+fdSj44IP_&qf1V0@ z2hg)!IIiX)xC~6MU_1qyh^QHPZoB^iDQnWPRo>%kB)#xL2*sySbin--UQ^ZKb$QiqIcif$y4~%BTcc{66IgBw*j(rd_H)3& zEeYyi&`rC>h0qG3hdswNBI?wu7Ig&d0ZxuZP9%b|13NiI*TqmoBaE6gIW;Cp@|rmy zPp9c3>)WmaRmU`U2NoM4{g$UgNh*Jm@9z-mw5{KwWpJW=R`Yx1vxENP2J2pn|E|5F zl!k@E4}epkW3DQ7s4YzciSoynH+`IBomEF9>Fei`8m#q&Hooj3P-yqCZy3g`qqYqt z(h5any+C$%+VZM9w)`OXef11sn9UKuy{Y-r$j6yfv(#1-s%j~;ZO4>AVrAd*P^#Lz zSl`0@H`Ey)n-9pE=3fBCcsrD;LE9|lwyTJ-v`~t$6ogV}Rg(>mVw9@mrZIgBC<>(# zTri1xtp)Nqt7FGM;z{Ebu4Sx8nc={@D1Imnp=ZDB;&v|78K<6BuG|>-9+<7Z8qi4rf?{F6hM5alaCZJBke57 zZS*S1SV~rE57LB*faOm96k7h^7H!G|nDI5YT`7U>dG7G9uEa8^LIj28YRPrS{9;2= zeZqXD)ZQ?~@lvy=kWGMgAscjpmP|fLe=2O>h9u2xueTKPIY?*i`~I6~s#N-U&ADuU zV$Hb}=_kNsYniX{MQbRTqqYlVG$hT<_S@!SbxC39%+k=GctkrQs8a-iST{ffIyDR2 zgSl;?gu;0>x2^P_C2Ft60vPytkd2>aIcw%zDcRr{9+%sQHAe0*3V|{l?Sd!e;yZZe z2`lHLKyA`#Dhuk+U&?6|LBd^gQ~ZnS-uLG__BVO}JeA#WrC!K!4OmEG*9)g5M@t$S z$I=WCYoV5ms8V}jmltA; zpTpSDy?rO4{=FsjlTZB~9WD3u?WX0B%IqzuTvxL{8D*Q3DOnW>J3pXS2RtPuf$CnC ziZ+E=3`kWza=m@SotT<}ZrLzj9ccO_Az*W0&C$&sR!ciXd&*sB{MQ=Et%GG=LeK`| zP)D$M&l=>V%wCHt+9P#4#;6w7%kB;khDm-*@6Wym%?(Q(utcL-x&cd2uu98s4<-@> zSE^HWYgHcDETvW^EZ;*Bp+p@6T&8u~QQx$%OHaz@BWa+h2G`|X?jK)Jur4oCI;-FQ zs?J`H+)7GHrUy%o4itFGN=g)Wul6cL`z+A8pH&J=%Y0a$&GE`8Hm3OvY* zEkHJC_#oSkK6))ubh!bH{JdpsTsCjlMg(_FQH^`|wPWf1e!7%_Ni7>3DyagR!wA}3 zgH@-wec;`9lA!1^DwJ+U6c@vtjZqERY)x_1YiEL}s3EwGk*=^FSV<+E6&w2#8atw+XczMrl~t!G{DROfuN&8}`;DX-0g=PjQ{ zPp0Vk)(=3C>-d(BPzBgPvvqC$qd3GxN(mOOm4Pa>Du1W>PO=eNn*V+Cy_Vi@%m0D- zUPtdYAr-&V+s{;9)ffC=DK@w zdtCie^8UMlIh0m+MoNY`(BVw$QTWVh|J%xJ%3#%Mb9n-pn4M^6hIKg9X(K;Nju4@w za!H`>6rRW>LbD{gOC;7G!rdd}0QtY;w{hD7MYb4^O&twRl>qs1)H}jTfV?)kL*`PO z&=};zl2U;`2V`p*bHJfW^s*zkXQ;hHq{Yev_TlAF=03uJy;n#9))o+Ji^92Yu3%O; z=?#sn%_gR?md~IfNLyEE9Z3FDN?y_R-=te<=tj(CoVk@wUk4euM=+YueRZ^rK+Bi~ z?65FHU!#T30^jA3+m?SRq|otrliEa61ly}S=pFO{ely@{1B_u6!?I&dKxsPdk!Kk# z3q@~2ExQQ~ti?6BQFIMB9)1Sw*nSq?E};sO9yPEFu`8s^D}RDLDh}7+s@0OXYIQ}| zw@`-upcSl>GMc&)eVmc~;AL;^1<@xl;}PhGOL|Ta{hzuv%NSoVt@`7#rmT zPEb7V%jwP#mX3!x_)R?u+aS52&{Dt1(omQHy!DF`wv)yRii?m!jIt>Cfw-3SGP6q zq!PzI>!mkBKw}(7zz!2O;J*>eQS!n@CFDdaVceHzo(&`4HTNPHt^Zwc+KETtGVA25 zUMJJ3PS%$5Iw9blemp;kUn71Eh1RJ@>laz&&p7u!=iK}67}P|Y0TZpO&l2R%c`ek( zK<n!j(3-?Ui zGjUJHJso!^?i6pw-HyA6yNJ6DcZ}6y>qh6%df?lPUp;kaAD3&^rV2EkvmacZv`$@&zRyGf{ zQL6efX`SwRr?x(w-G&gT?g|crVkimwsC8qfDyIF^YqbZnvS?tJ8(%(wi;Ks$AzsryhE@WTXdd2o4tyzQXJ!flO~WCV z2Xe$^#hO1SoxKRHNtEz|EX@6ET#FWo`-<)rgmrlqKi2Ldqj__!P21MxyN2f zLowIoEzWd2en34Cwg;M^U_Paj+Y-y$~{&VSSV)J^=+I)3r-i?U1zIO zP$O75daf#UzT7y?^>!8GlQVJXbPs;zpifA{R5)Mvv>VJ4JlJ#^UFH{&t+pVJiBV^-+9zRI|QQ#*%w1 zAC-^Z0!5FRP|j_PT~TGEpv@s#;N^NqFUGl#eFA<5ZRMDn(xz3hSf5ij`m8-Ybm^tb z0Pn&gyc|cCqc_iE!`h_N-|VwnvFNzb?rN#(h8<@u5?8sJHY8FsjK&I#I0*-P3b|o< zPPQ)_tYfY4V3D7P7KzZ{@?6@sCH@SxxiX=AdXxW3{6zfLPH&PHve_8S8;e(@bl6>8 z_o2G?6N$U&5?Z5eTB#mq6<{B{T`i)T6uMW%W<`g8uFR7B(--@**!9?Y7Zk9T19GV^ zceojLImXYSU+yRJcGD$v$$l#HZn}h0_fx5N)5X{s=wT;6hRNaXzy>V2x&vnJN#Mh3 z7bzJNJX`;O#Z&H1@-Lrx6GhFXL8W|7^rxb5*ba5hCQVZBhDm%vS+oY>Qh|E+TBWEx zxM=MTprMc(bkkTVI;D=|)^P@z!q!81MW?DKszs;BN-kTeEW8Mwnp2_oSpkugWC#eO z`2fOlxwdI-iB{TC9-2t&601+r_AX4Z32ZxD6X^z zin@y{EgtP1AW!OZ_gbWs?L|&O$QD9*yNNE~or&#_lo>#-qFJ>t9QcIn#TVwALVS&{;<(cm^a?{HBkrV&uOq=feD;9OZ$0%^f~V&1JA%w zjq!_qQ!T&Ydzsti9xe9(R<8VPWFxNRZ)2zaYs6sNB6Hsl<(Q2E>)=^TU z=uNTJhE*)y+&u|O07qV8gUe+0X^W{s%jl2&4f89Y8!1C2=2pi!*o^--R1ZyI zmar)hGI&@zFt|-qH-zQSQWU8Z%Z{bU?)uECMrk+e{Iu3{5%EAL8n$EN%0`hac>P%O^e_EL`hcyj?iRii} zd6^p$g$<|Wn7SV1Q_on)Q2r&N)!-_uN2CQqYp7}84WA}k36Fu=v-=c8wXSfz|4Mo5 z0|JaBHwCYM05cjQ=C<;WQR)`<4@g043MRjfck1v1g%7BFnwxzCnZkKtS|ADFR;US} znFlGU)Y*LfGf>6A&usonWj4-lU+l+m8O{4_aHKTvyO>{XnDA-dcM(0)1hm@2M>?=m z3$w6{ZW5d~xs8sOTh%6PrBk+w%2s>Rht9O7z*gsT&pr1FP19r00O09wy+%W%hIC84 zv*2#2Kk&$8yzVDW(2y=7Y^l_5+PK@hv(OntmnM~z1?m_kXgydbsb%D#wqK)kWT>1& zp>iARYZK`_lLD;y>TRg|44^G_6p)Qx;)cM}pCiEWQmf-7tE+X>CDWS`pMD;t8 zh+QGErItSkRMh<;ug=9_T_^DT1Qh4CUCW=J390Njj49FH6@#1bIrUR<-=+n|wdMyt3CZgpz7 zd_BjYzMjL&a$W)aZURyk`BV;#WB?`gV@fhv3ZX}--@z)8CM3|+Jq%$S>CsYXhh#`! zXBi+BYeLn<4=Cf+#Xj0MJl-{qF95k%9miYO;`KPNq6Yj`lGH+*E0Gg-33jGLsY}eSAwA6h)Ah&B>{CO>&9WMvrea++*h%G4y3AmXD6EW00 zsb%IOi0g{Lf-J9xoyH2g++*|6(rC-y276v9b38JDENZGh1NtL)3P_(fjIV8T)E>Z# z6%klnBOIZ8QPmSn`FdMw;Xt3yirqJMQ!nF ztSd)bO!w`gws_4U#1?gEZ037Zvr6?TR*D)`SNkwNU=oxF78$t~*c`QGR1MisK5RMK zLphyrq|Y(EQV-hDD%Epmo|UKKTo5GOhlH5ec6Xox>%tT-oziG6oY7D(QVV_gdQ-*n zZ7e)4S62B-)O>23+Bk}MxG|SYNNX-jVf`7mZ8fndbfbykW3v7GpQ9d}w_Uzzy z`<|V+({Q{~9!RWqu2YvRaIRDA?kxx|2*JyPn0)Fws>d}f$;_&+Z^aVof>4(pLH$5A z6lW$Wy88O|R*L%=XWXE|B4khC3ME2#@F_Xut>6rVe#x5KSD5=g&d0z3TARLMn*Vp{=Uw5z253rG;z5wN z=@yvoA5noZBp?Z3WE;d74Xc4!t>|=p;Ku<=Vp$2hwwHI8t`DU9yz!gxvE$0 zd^(6bH{t~Y4on7($EckB{#QuVbr>uL7W6;pf&cv96!bEJj6yr=et;M5%i@QLHQ)^y zeoh(kQBWo?JdJ`JwLeB-jdRQHpmiNzH1e{d(h}*ck=b6>)=cT#oftD+qb>+9hF2{? zZSkP-bg~bCx`ed?Ga3+5e}*Ucd}-6wV$?|z>IAHh)B&x7rvp^9j1IIO9cT7XoGRhO z+HJO*BTF}h^#)K1y(LIDqTJ>|X29;HLmmvY`+!y*fFeYFSBNNd_HRIZvs&E=+qv#F zU@+=x2G)*}?}_T_7(|!-cpsc)823F8J?`xe1i=*X;k(hWO}0l>T0ywuW!t=|Zl^J2 z4tuwthL)aSg$M74jR{1o_otJK;FkLlXu#l$JDQQ#-#dTz3z*!a&EM7fF&AXc6~)fq zJ-LC;6+KSzm{rQ8`(A{dz;6J*$ei5y=I;nQ=652n#$3>l`8!U-sPlIQj_(4M55G0| zEyvG;-(vg<@SB4l=6pIa=ks^Y-%)0&MumO~zrFaqN+ISP(f_siyX=jWFQ30_mqwkx z%Rv^UdEGxKDtFQ}}h_*NtBe?vPK);YeDgx^vpF5YZhR?S@J*p`gn-3Z!NhM;Y$5%isP1-N|MgUiM>xNKdI zh<`-bw(lTp+a`o<+qORNQVnnhUZd+B(jFCgVx7N!Cam0@rBwHV48GdPt~UQrZADRY z4^2NLf9Rmw4`E$@G5rfn*3(TriUT0-gu76EOa5@1Qp8-R{S&62rY_|gu1%-|R*M*x zv~9xCB3N-|JwE-YQrc}jIsILwqDPgw)#@GqoOuR-p%T{-X*S$qO-`i<+a7dIbRw=u zv?2hhOK}FHbGp0Jv#gjciR2Kv%ml_t9!SoaXW=^g(8`h0iXAFqFBK8ihhRtldh|7@ zI=B$lIi@ukvnrvf#>xjijpa|xpN!co?jxZ{?Xh1V7wyVqRdBr03XTo3-noEj*+YTRT zD9v~P5*&piDhq7NH|?dxp5^5gHp9m6Iohyf(AZ>TUd3SKa(iM?n3gLL2x z{U5+PtyK3=Fmz`R1w%z5mDAcfy?t4wP|UV+TwJ;8x|^4srp#zz<#vb$ZM1Is8NfD* z>=k~uv;X3EC;K_Sr?cJsp2>bl_nX;2^Ve+F!0$QiVSb;+{)yjbuqu9^$twAM7W)T& z&tmuT`y956-{-PBahDGkXd4UI?L259yM^Buv#;^{5_S#0d)Vdteh<5p-GxX@?k9+CyEq;b{QD?lSn{o`?5Kf@G^&Xm=&P zXr%e*8IHy2O5A6JwCf@1uEbZ3ko|f{rYo`02zg!)$-=PM2>Fp7lI==tHA3on$i^Jk z?87|7%QjL7s4<%;bgh;=XR5R9zzWA; zMK&$Jc4D3pWA1?MbyBcci=C;j@^;idhxe^>w`=efZ`(90u<&*xh|7-`D~akN?7;M0^O{eEHcq-tD{;9AfH z>2#nFm?M&e1tC#U(xvEh-sFRj6lqRL33jKJaXIplD-B0-2&ORQ6G$i{Mwo($6hw|P ztOMA3rCO8@v-6HQnSQar^@h|3xmMlj)0-B%-09Vp0>z!ao8Y<3(MLQ<=4h2GmpO9V zaGA?SwIy+x%Z|!i4#`|PmpNxt=CVzhdkl%UE~xCtJ+{2RANZ?oiIuyTFvK1zcR$C$ zKk;%0!xK)}irze&X<0ACIAw%Ur-^R72^ zUv#-@jNTIsk*y`5FKTYK0FuN3^*<8ZMG||1GBs*uR_#o2aQUECWuxQS(kRq!@wEVP3?*fpSuF- zT<&Z~?fWPpHLr9uFRam)ve|V2MdJd`(e_WMvu&KA;5K4)hN3}3wI%2Fb-j$#Tl3|C zj!ko*9&}}L3HuPp)i4&!{2`dkxf0}DIr@`fTp0jYGyuK`uHf{V%^z@$f)~^RmaIgo zP|wkp+ZVbD%z;it^TY%OwbX9*5bBf8Mk1Ba|HnyvQ<0qA{3$XEU1qWp$k5U``59Co z75wVOnIYh1#g73A0|lkE=Rw<`FT0ZmwFK_(h$xL^*vd9cY25f{QX12^(#YY|#OsY| z7yzJk578TjA1ssfW}t|%P$zel1{PTIsaEXdMLVJ1Jy2h9w#EI0P##LnZL6;sXmOtv<^dBL$oh0`JLC)EY=%BgwWE9f(&0xX-(NQyK-U3%gfTCwKj=?TFcB}!U`O|0 z9+v)$B{iooLn$9juc;m&LfpMNfn6uTrM&8N>!b z<#}+=vh~t{yW4{ebd@6Z!$XGy1|3$&seYex_oZeqc)r|03q=zfE?*Q1)||UuN|K8* z6GGTPH(jzK5NZ<2Wd|KUzz>_6&mVFekLBS3+`F#k+)Q+l?(|e-8Jg9QJa@By+}!0n z2pyFWx&m=ddPtQAoYDk9U4i4{$+jyAEWFuJ$6sU1poP%K2K{pk+wS@@w8K+KN}VTmWntr8zl5bNT}Oe| z!>)xJ9s9y#>^{tRp#QDz#Qcc=WWaVasoqX@2zC^j6HZUUku@>sKHhTzyLOC#ps53X0XqWN2 zRRS32YOP9Do5~-@<{?{7^YwIMa~(dA!4)6uJA8uy!{W3ye-TCoXh|>6`_;WKWz)Ff z>eSALWdAi7B20y4hqZ9Geo~cm>z_6yBz$~p5Kql`YPq#TN~1M$M|0b5?eM3(LhZdO zq5oaAX$9?a;UbCE2-K02={t{WOXh!@Y8Quc{WA(m`<~HVUWsbMy5UYlp#s3rarzq8 zS}YSpv%q8vTyH3JbhLB$u>R#3W69>)9L#jm8ov_tB-ZP}DPo*U=Fi}ts=>0-BeiY* zV&kx~P}<2dwHaTu@urNmFlFuW#EjX)8|A38@broOyd7N$* zN!k_lh2y{83;Ospdr{d$k%R= zjy`vz-@<^6{5XUUXXA4x6?}5>&YfsHv>7%X1Yl9nH?{fqK0Wv-0spv_lhT=={WS26 z48QX$!e`_2bn?Lq$3Jakc&IAQFZ$$KSWO__>})6A93wAeEO&K&j06v>_dM`0Mo}M5 z;J2d=!YbGV{!@2168}|q7KhISd^+IG&%v3r9gN9KukVrZH;#gzzGh}tiCMoiM2ZB) z6nSX8`CUd6#Egd>#?y}yuM1v`Xq@6zjYf;^lJYgv8Tf|5dwA8I2cEvKi(@P5_3x>f zc*)01^2_CI=A)PcTtk8|I0#VrzYj^pT{QoId)(ZM?ul)9ds- zrPCLI8ybIbjQE8-pXf)1ho*Oq5uc^UkH81?oK`{?)@FG_hT&`<)z9gEuUXE#h zn6~m_#xA!FjpjEPW(fTsId(Snznj)t%tDV-R|xM|4+b_EKAHzbr_kXHO%?@5oWrwS zYTp3ANG~1VjZe9tQ&0aFC4GD7eZ3V9Kn*cW{(%CUn4!Hqd^UTBi~mZ zx&JK^*+mUl6(6;}I!)^+Vw=Y52f%-*#KE6DFFZa%AUv;eN?0aFG-i=adhvZ(+A59g z4LDeVWGk5Qc;$M22Is8}ja6ixM<{_v`ZS`#hQfF1+~M%qqr>kr?YoF#HaZX!AF?}L zA6MR8=PfVbo8sYVs*PK-QDO~!JCeP;gP^~HeO-TE_>t}3T9cv}k)ZOTGvfBOIS#7f za9DzER+_;ZQyxa3-?POaUdK0V{NULf7e69>^Zi4O{|LWEhF?Dl{0R2^O=ek)`i<0o zM39U!e%1KVW`Y8;50}RRtjZyma_y=@;j2gdqjQF)<#4jHsK68xtEqeT@@;0ECZ+LtRzh-hA zWAG~me&L0{8~j}}8htVN=3EHA7;a>N zMOsNZ&&`y;2tDXmDLoD}Lj2hF0Qsxp+f$t9%E>dK;e1?g7HhwpH+|0EnLhjPOyA4J z_`LK7g&f`f;^+684c6o*?3LX#RYdj*ha1IS@pD3Tdu3PksP;;{eA)RRc*F)|=5Oko z<@$KpBrisubba%@FA!N)uI_V zzoB#{KG>)h&BCV`)zUeN2RjqyDvPn?w?Og0OE3*b(`2fL;Z0U>%11hx-KClI!7(^3 z=h@ZLY^50MPji%c={Tvc*zr@jP)@u;e5`C;LMI)eHdx4kiVe`Z9L&n3&p6PczI3dprgqvE%`1ABL#@?7aH8L z6L*}PJL#M|nVdUWoIBZ^J2BSMa?TjcLSwj8Uvw_Ckg%K}I~Cq&C%(EuoSu*QyiDaz zEEddC=0ha1l{?dM=6}>jbTW$NKz-@C2KPCL!GU;&pnMT}QFi~7IJNgG$G{89>Bx%1 z-x-aK!5?oCM&y5!YzwXKL8C`^044v;wrT1=?TbS$ z2nS;DbAHJmS=4!%a>rmAoe_fiQs&2visInqrWCMPO~6-(=iA73TgGLCk40MMWpHi} z;aFUHOz$^+1TCCxMP}m25@0xVhsoy!_{&$ujE`ZDhxIwRHC$HB78s>xNPlO7LC&}% z=P9G%V&~d?vbu(=F1hCzfr}G-tP3+S7pLp&{AbW2vbQ3DReXnqGuGeAtfINgu@~ z_%Qm(qA;||0Ia-Tol!6H+@dx`yZ}V`MeTFc{@2u}=h4UV=1jpql?!R+GWHgZARs>* znZudX$Pf{nm&Kn(ZjbV29KWomcP?X(#-zvkEh9Z`k{hi(%bV?HdiyfAG$y@0l3pA& zJ%+LWMZ;L!=@2KnU!l);;A;CwwJD)La0DOP6##m2B9icc*V z#@sl0QwxSEn<4R}OX51a_;`$mF&KuJh%`VQGA{#A{ufKnu+A9}vGKz?-y!kjju@Su zh61zA>pAP!DE^?Z&=@b#!7L`Kk>Y*2qlbe;<8|pjs5g7FCyd(vG5vMc1@+hZz<6l? z>#-}?3h8l@9aaEu0=xz>g`$gmr)IKlOG>VA;$xK+z0ZCRf7e(0fyC8_`Vid5!eHa zPvZjtG!o{>q2($DS7 zNq};^R4mpV!=83-C&T({*ZT}usKNO$u5ZrqX!@YQ4FAgBc>i~V-#WzK!R$DGnfZyJ z&@7^9pT<;Dym=Q>U;k_A^|huZ33^4BhFj)G!ouBOf|^M-2SVQQ&D3MJ>v~Fe4kojQEA00Y3a7wQ_=EqB(_h zd}apol`t3BFDf+c1xv^lN-$P<@cKa0vj?e~FiMyPv^hYV4frfPXW}^>&(7jNX&BF< zCl>WQ9IkqOrLjh|SEj9Q6ObDbQPj&mSVbp;^^g?waO|Z$e58c2`G6wE(ZL(H(cWl} z9Z4y^PGwdSF9YR|GIXsRQU)_E-G`JX%8n>1qWK|R{vp5-nt7(Z%mwUmG#B;ISEEW{ zxeq7_!)Qi+*bZpYJHUAkA&#Xt?|(#Z6cy3i<{QRigI;y{SEYA*_Y0_uKpmY-XYhGi zgwGj)Cn%gVy0LUPqp7^QcPJ?Mjq!mGdmv4t!idM2ED6{_&e783ZkTIX)!~M9$rDw!Fa6c&Be&1pQm3vEPc%d zrq}y2NX<8oO|yQVe0$)i$j0OAy2i-Q$T_zB9<%&sN8)GVkn$4{@sp>DEkC|(2meJS zK7~F&)yp0_4MLcU?hIvT;y2!!uOAKe(+SW{D|P2Vc^?GC#o7ouvy>P3TXs7x-0pS+GwIN)(Z^Vj{`H_{sli?`z=W zn)1KTZG)&-gQB{{w2IQId4GRPo3sf@P1{t9GD$O&W^|GnGm}bf+0dfZvO!U{2#T^r z*s?{DQWQm&t}WZOK@nQJLD?+9^ZnhInLCqvXQuq0XFt#LnD(3da(=(x`JLZ+Kli*y zj=SJEN9Kq&Z|~)j;~qG+$s9>+NOJ6j<2somiLHk&E+6b}(!yKWi`Y@Q&UKs;R(TLzNnhOT!dv z_=TxEKc)4gpT2=V`~fE<<1k4^_mWGxNk;W9RE*ud3#XBc)g*&PxY2fBy?hqF*Khx{ zon)-wW$a-|lJPoP0sIn-txGQ1N;0rqVny}V-g#$|j8!Cqrp}_$U4?bAE6TThT17IZ z@-lh_8COd(a867YAC_K(rK|T^l=aKY+et<{FQdGDdHI$V-z_g+MlzQ1GOCv?uimhte8Z=0c-(#Il1utn(gp#W>qKL$TXM-d zJ|KMv$hzK-P*p82UrGX&@&d}2E-zodqI~`CNxOagL94{QMB?sPa!Cgt1Zt;r^d2>v zxZ8-E{6i4hmd{$dqI@kil(7Ahti#NgZ;jZLRPd!39~G*}Ap0M3)#I?%idh?R9GYz_ zj`l0*9WHq%Yh>`{U+?2*kcS({!wtNk>J5A&1Iu9sKD`fe!2Ncu7*sUikrb#|g=CDi z_q|)O;ob7`PU7wqxI3uYDjhKmRI+znAJnvpW_8IA0=^bUvkNI8Ta*tc>!#kT`J^SwtJSNQ zS9h(L)dg0n=8-tCcDeFJrnw4u0T}uc)06_g1)c=>hK2YC=?9JNq14T%&xX$G;smWy zw$P?tvr3lFLQ`CWRqg!C(O7mn6w`OG>CCL*&RH7%CEB6G{kWD0a*=XyA3me^TZ}%_c53KSV5D+Z|B{QbZy@o}G3TGY z&!-cflJ}7&e84}Azjw_2ynnnHSRK|F{$kNE)z5X7#@`iT_-HeQ`U{ zkf9)wPa}ArMlkG1C-}7c;@uaLEU=drkDoMrNiS)*ymXY%E1opU-|LrYI+))9YxCcl zXzXVN==ok0-H!10wqT3{#^IG6!7DpTRQAP5^3Nlw_B3Ly?qlrdj(H%6sZlsLivQq; zq;oMJ%^FDOXOs;rxwwS47e<<3uRC~q;X@}a90n(?ImU-V#Lt)ai7LPmv-JjsVm2RS z;GQSIJ>Fk^a1RD$mX!#f7jX(3r6C%#B^o|RE2dMA5|WWb2Zo-Gy7v}QFuf$gp{I`m z0Zrc{k%&opFN7AO92udN^&f=q`It^4b-`K=f-KN8L)Y#wMD_j|I~kBY5SADD#7Z9U zF$o(8G0EFtx0yUfW}FT^WYYu?4gb71Z39F@$%{opPznu*yP^zSjZeN9TaTsWn6e*|iOhbmJMFs1Cu1REQ}%ls@}Q!!{e<>AReb}! z4G~?wf0FoHd46d( z0wH2*(%katDXH>^dKMDDjprAq-oa=7`=X$-JnQfpr1eLAvx3i&D@vXd3MI_r7)1j! zWq%gtkGJzd=f5YVQKYgX}xveTtv7 zeQfC{O@&L09!2}^=;7m+k5$?mITfobxE20^6`RN76UYnydQ=jLSDlFh}_u{#+~!Dy!4WH831pW^%~{tmxI3ie$o z`qMYQ;YBTdI5fJt7z`s*3>6Z?0mSh3?$@9Y4&&obQuP-ZU%uka#Tsk?i!?m^(6d&= ziiegM&R@ZXZcgn>G#tt;sqX)g6g0k!4S8EJ!hvBq%)USd9B{sK$dzwVy#-ZGSB=NE zYUO(u8nDG)^>FBMcuJ41CPDF*BhiOK0p|w;rHLsx3~{7e}G=^5&oeRF_|}hd;Qq2M2Xxzt|Vcf8>^5(vO4kt~?ygd1@`-08i6p zs1lszeG83)4Rc>aG|W+a2!`U68E}zBaL&&UGz~_y%uy*@CPkJ*u2>Gsi`F?Ag#d4z zRC!QPo zol#UD!uNvk(1QnIS05ZLGoo=BZ34axy>v`)qw}0_7{kyYoo#~My;i*5`zlo={Rq8p zV0=r-_VViA?F06uG8KZt7-xOQ)SX}=zfZS3w(PT$36pg z0M7xP!0o_Fpbc0ETmYO8OamqXBZ2*aFDG*BJzxv)5O6!N6u1DW0UW>>pcwe(RF3rm zZv)Q&4*@p;D}hUaI1mJ;0H**WfFZz_6FBxUumgAzcm{X?SOcsClE7S`46p#>fRR8k z@FjZp9|P|KDEN7UY#qh1eqba{6FMD;0jq&7U=N@@7CHby;96iK@GiiPXUEyw)8VqhKcI?xCF3R`6w06)+MJOsQ83>m{QEiefKo6k7X~H(30k|A^68IQ67WSP6#DVL93!t+D zI1>2g*GMBkJ1`f}0Y8l7*mhtYa5*po7zY#sy+?Cw18^m94qyXD0((XvK7cl$1~37? z0zNnjX#-ddv;yY<6M?-)a%>yW30w~}13q9F(02sF1Y8d!0Y5MfC;@ijY~)U$4VVX* zfZ@Q$s9rVzmjhM6u>b?!J`D80QeYY|4*20v$N?S#+JPWo0fqqY;xK^?z^@R8?YL(D z4w%d|b04;|!wwtkebwO=iBoeK!ONOJ(C`>s{^UjG( zQ#^#zXis9AgGvSYlcVwS)^O4vkJg703C5aOg4MGqi?a~^O=Lk9!9N@o*V3E}H-)sJ zcsv@{GIlWbuB@p#bLLFp4L!1%mD8rm9$DF$)uolw(r;#1bVk#`!%CaAb+K3^EU2b! ztV?K{>VhF{9o{FCp{7_;n~Z8BQG_7b7}8GGN`6Pe^Wt^!McQz4eKZ~q)h8p1CJysQ zLUoCdwm#aNtg8nnIAqdKN@x=;u~;+?mrz}kwgJjFMdKmJz-<$6oQb^h(4X`(9z5(+ zZE0GK7RauiSy=@SpkhNj+5|7c32j{>5o($jS)>iN#KX<=wapN(%NY51 zOY>P&`4Y)s4n8yS#afWs7KY==mbyqff+!|=4@fWM2^HH1qRk=X&eM=^aM30yh$+4F zcH&EiI~of$Q$9#UVTWL7VYpsKE7~a38biK8iXqFSb0%+RJ#U{D_$bmeA=!nKjqwn2 zB2vMEY#dIHPMyy4fn?lV=gn?*z8!FP)#pkyWVM2;i9iN{XP>3Zd z!^WcF=47fQA`w))h4>WASarBQ9!*3WlG?Mvd?+W6AD^;El~CxRcw)nlA0|$m$Xu~_ zbbcJAS#upq*7{IP zs25ttalAT%m9rUa z8va%>BQu~jDZ^bAPh1wtq@5B;Oo@j=4A+^V6OZ<5_#gZpBU=33eP?_~G*449(9$*8IO>t**h$nK$xSWnJIaUQ*BW|A)`7~aoH zgyLt;y8wBsGF`Eh!hg6`)g_XpD3=$)G_jT#|4w)o#IS1Aymj+KlcKGqY}U;38Aijz zvMQKKI~nDBB!qk*h}Kq7bsmkM1i9MD5mZ6iif{;3VtwNxZCNN$9}mYwXQrJ*wW2^& z8jsg40+ak*njDp`b{x~zEQ*D)gw*myzcxX^tVbs03xfGAb@AXythTAH89E2G3lV12 z67|v8BEImEDw;6TfT(P(NV9OBP*bZ@GA7aHlowotln<4}VljwPM6BMZ!XopqT8SoI z8=&SBTx&y(lG=GylF{Z;X^=f+I>{^ny$0DWT{p`KYhw{qz*MH7D5o@V?s?k!NHl@k zLe2RBT0;QYg&_(B-2R($iUD&|aDH$=B@+Ol8aXzD_hR$!Q zEw5m;Ex{yOCdrm~GYUAk4YE#343pVVvbSQOWps+>letqhC&jtkY)C(1RT~T^(k5!E zi@^?3+RCMbM5Cwxg*}ztl@+K>plYv+3nr(cKP^a1m!XC_YR<_+kTz9HJ|AUD{DSfs zQfpxfJ`za3j65r5R(hXA{*E>XIxM8-2jXnuJU;g6Wv!SJ=>B{+V~c?k0hi0oJRUbY z0r#f?rvl@FQ-H;bL31Lm!~vq1yBa~02g2bOn?rU0E`310$N}cFajt6 z7|{POgbUaXYy~y|tAHd>1DJr}K;J(>19SrIKqF8ExBwfV1GK=v=Qz6(=mmBFn}9Vy z5~u>k0{yVrPGBRj3TOmefEFN|azlm|?YI8{#Rm>MsN~>Z9iln(u)~KRapX}Wjvo2z zQO6v6oObk>^{~O1of7vcd&lN~wx&AF>ga2jHU&hk^=&;5@{>dd=&eH#e zU@WDOe-gj;|KEsDg?wgy(pq~_jbiJHQ{~N*;_D|v;9Qu8IlP?F5 zPs8y~@{yj>_Zn7Ea8pFt^o4~sO{HP!d*Kd)j`+1*cKMQ}S6q43vgKE=Sb5F0ziYql z`Wsf=c+<_RZ@KmNYi_&!j*dI;x_j+C_ujYe{s;cB{=tVH?tJ9YKW=#J@jq>R;>o8r zJ^jqHU7MeKe#;9lzO?n_S6%|-T$9&zZ>}ehacI`tq{};{DLZk|91HQ+y4J-`{%2W z)!q3D`M(|hiV8Ul84Kb!L0gTVmTnf|$EvGO3kFZa4Ss%%+Lr#F;+*iN@MXbHB_r5D>zdijI&|%Va3Fc{Fn?Fm*b+~O?`DUB%^~rj z2E%ytx;om-yUuJ8uXRb{W#D6=XP_e*26qxmS3Ke^96QL_6ciZzvcGX;KT|)U>Htnt`vlsIC@za|-+3(Bn)`DazZUK0y8zsid+ac@ImP>q z!_g+)Pk6660&Q>c-ghM0&f+~Af%a(;r)fWmX?h+-yB+r=NB3*A!ExU;5^dmz(1sS@ zcZ@<`0Ap!H(|ruu@wjh44sHBt;lCL&04>mW6T%I&1GRt-z(Ap<`$otCVt^0O z06nWfi@I)Qc|2KWITpaJ^Y;SO{H z?SLQ90DZrMA3!@01NgYXRR?H+aR`_0`2YLE<-Z1DmW9g)TXy3eyB2o9eGK;E3Ew5eVZJ~;di4BDyssd~pZIIrf;0qs)7bWm znPoGVUHIKqiys?4_38!lcAQ*$)JkgT)H~*uMeBtDe|($>YB6F>!~BW47qmpeb4aGHeiqsLkk!+kMr;Gg_B;* zjn2DZZXCmY7;c!0cZ4ZbrT8om5W_n$7Mzz6!lEutvmM`frI)1VE^B0iUjKQWP)c!;-6CXe1pKjN3u z()%sXquiG9lTKZD-X@blG)g+j`AAj|=mxT6m7pvh0Z8E^8YNkBK9a?dRw}^9-{TLZ znK^iF1myCFj&!D<++K2Ca?@bB*=m_Q(qSE*JH>b8PIUB>%aQYt8!h=NKUAL^Mh|$@xeYEfVa=lGTalO)^UJYLv9;EH$u!G^h|Qb;aMlXBX@dFKe-$^54q8@(b_CIF+5B5 zCU>HvpInZdhuq4LkJriMki9qJc?(d2I!dBZvXPvR=z@^7S0;;iiXcOhL+(UJKev_q?4SFcsoJ2OeTwXR?Fm&JJHcku9L*0wP6m@xr}Y& zdnp2){4XY@^7Y(y@hUy{p)Eyp(sQ=1^4vx%lrD-H#C4(UAj%^1l_= zRRHl)9ZFXzTqU@lD$+}JsN8L}k7<7A;xC_?4qJ`vUakl6A5fX5J6v|ZQl@YDG{g@e_pe*#K5RDA zj0WWHa(|rXG0mBP+`UW2Pw&qUWV*}cle;#U>7Jdw-kP7={k97--R0?z7FgW zHkRq0t=|h5X1dGyi(1j=0LY)WFdu}j6_{*IS85m073Sdc6{Xq5pyAs+pqT(j>6_X- z*|d*~@@9(HwW3@pUCGns_1l@|UVzG%PMKV4=Vi;aKwkgBQi;RZ0L=&f}vLS+iaecmLeIi zXrQivp9I$+QVX+<0}G?^d6;exZK9by0U*985KaUlq4}6=IQ9@>U20O&UR8JDYN_&0CY~zHBN{zsw+G5@@J77!WOhF}rN8`bJDk z4qOz6zJZG{`xGNPk;pv6LV|71rp?wP77s1N@}aC$lx?S!y{}ZGj9}U=Tc+kJr47N5 zLK0yQs!(T!UQ8jW&_7xb7o~oQWxmLfBR$cq&~&0=k7fIjZ8b3*LjG#arl!Pz$uyWe zPgCYGOss6(7-rjGZW^Cco3KzIz$cx{vZ+(4kh1BTY*#U+5~0uneqvHURE?iL%h;c? z>9a$UO1O-LvuTBNRo@t*{M-Oy+{Cfh9)iVV|X9#ocX zQgms>64^Ae^v>{6L6A@_m4Gw((ydaQOGy(>TM{$**W0SyH*l7ozOKY-%Co39QWs#Oi`U44`7;r7Q~yG=j%i zo1*AS(^A><*>2g^pjoUf3D%NLC$oQ6c@x0UZYrHH7E|UV-?JDQyC|EMEG=dc#%|1Z z6|F4>lRcB|o*fpHU{pZTY5<1SIf_={>%rTz-3H~bRAI;#WYY?kX$r;Xhf)#5nw6<| zD@5ndXE$WKi$12(gixdM+Wk?5HnYs6(r+Q^jA)$7Axb5WXY*y-hpa7IZ4d|t*%jG5 zqF!<`@`>6VSnZTeEv8i=4c(OOD$0T_v7~|K40fncq)RsPODNW^RiVwY80Lu5*WUKR zsKu-*v{;s8^Q6ipzQV-3&8!rZa;M4Dj6I$0o^5YRMEL%~*lpRAgVUSPloCtyr?Tk> zNhSrZ$)?IqQ)En`kYTr|(8}v4A&whG${aQ6LRyB9u1cTFmYuCF=^<33Y*Rj3g~sAl z**w|dL{q4~1>eI$f%;%@9wlq`L^e;hPN}LV5N&9Hf|%*17TZ|)gE%}&bWhbmlc`0P zQT4D}vt@{yW>{HVkU+~1quKOAev(R!LFH##HoYuG@=bA}c{(qI$P2M2v#Hf>z_&{N zEYb_j8Z?GxdPk$3;1OvU?) zvQunkG4^+5I^Or7Il#AJs2qGh2c6V_z)a{Ere&~qm1(h(h`zI8@^msBL4PEORFcwT zyE0EoUur+$BbYLkSebPzyOL#+(PUjDkf@{n8|KV>q)eGu5RL^B2rk-c4Oqg_cUH=TOijgB2yZC6uosl& zG{DG-M)r!bD`|w%s<}B7NwB{u)4+--SlI{4t{LG^#Sc~@ysS(w^D%%mUa%Mq7O+>< zsf7{@?TG{y9@A>?*VSo-{1(6>3&g^U%5)8p78r!Rq3lZf@yUg;zbaGkt-Ec?Zp7Ur zFU5Y$qzmzj2;%{wTZkOkuqahP^J~v}uM_MrPN>C%yn&KSD8tFt!Dyf=6!wEi}exXjU z5Q|5shpDNqH4ur_2cmIIrD5#X>XcX(MBN#xNsu-$UO|&416VDVWM8Rk6NyF>p+U)t z6)F3ZN*6+H^dEJ(Ikfp$nMiSaKR@!sH^CB@k1>T*+M^mpnsVyU%Pogyn8{ZpM1 z_Cf=QuTESQz`2G9BrRQ66MeR6kH55?UBSul5ji>Os~Ru1>3xmyTBFP-u;P zqaHIDs8qM(x9WTuHRJxu+VB>XtoJW^9#2y_J=YpnYf(Fr&{Fs|6>@&b`{lM6rLn^Sp2fv{LyN$mu z5o=pr_| z=qzE0H81`dtYDz!>60-Yi4ATdGx7P1s`h^ksiHDF`!#wN<+MA*p!YSBR6$X;miKc; zNO=4YX;>W%wnRb|P%;vljTON~Gb16aWY7+Qn;-qy(qNDZEX-@-CX#@s!j2XOdJ;ourhBjoE=GFdE!s7tk}O1DJ43d%viWtQ0n@jGm?>6%@<*um3=X!3VXU# z3EQe+U(rPg7*$SeF<3stw27WuOCy0lw!jul6|1Ilc$uAxC5W z4&WOJ8lb%kb9G+_T{oWJfE%uUT(y4$&7E+kGa|J3=6o024+sBYpvBb(v_o$9ui+1% z8wEO`{aNroi7U|c1bA@mJOXoQ0nL%%$F*-Wo{xo2>mV9>$Vkgoqiqc0{5SyiZ%4f5f*)~L`v=gjMLbe^dIUfks--lJbfd#_UnkNJ zpm`pCyn?uU12SKO-rcyzwf#=q--~<1YY$}AB0YBEijVkAdn?>;!Min(^E>#1YbR*2 zo{aTf2Rsg*t)P1uSG?EW2R|SW(>xf~nz2sMbmH0#VC@sr{0ZTE0Q}IQ>uKBr+Q%Rl z@A{x`Ev{If#yW6i&;e_r7}i8Fte;|jx;~0`Ko_6^I)J`MAcx+8#|K$4EHNo@Bw# zcJOo(z~6%~VJ#c$>42XA)?;>NcLasVBkb+Bg)_N=`Yau5$X#AheqN4)eQKDzL} z;}Oi1L%sebaBLa&qy^Rhn}JV&{mVI43S0o(2Ydh&P2rdwxByrKYy-XrPMONFsX!38 z26z~tbD0jU;8-(%kG))hYk}8+ zuYr-%5kBBtU>R@^@EouU*lz~**99tp2(SwHBk(5h4RGvCj(LFw-~nJKpsj%)z%{@o z;CsM63;Xs0>wvd`BhTX4S-?_Y3$Xue>=z5P0#5>;0TbrH7Ql_b%fJtS>uiqw7U%@N z0!}#x@dB&{b^ynoi@kM$)xckYqPZNK4Ez?jANUB+o`>)NOMz#BUf}riIaUj-0JZ}A z1vsVynt(q5e+7=H#e7j<5wHRH8W>y0u@JBp_%ooHhp+<+fk%PQfg|fVHXT?AJO=au zrv^DT2e=V<6Zjr*gb;pUE${(wOasyka2fC%@C9I)51oLAfiD0{BkT-32)qXL0SAX6 zAD9CqfNOz=fY*RMz`++_zhIySxDdD&=mg#dz6M4vz`n)6N?;T4IdD=0=?!=i;F>sA z0bB?C4H(nRu_*8?@C9&66zLzh6j%$q3j78_!1bMfK7qxfNz20k{l}o8i9L&w}As%kp6*%z+=E3;P{0c3j>booc0r&tYSp>TRA>jAG7T{}O+{JhY+zR{!u>1yb0o)IK1e~~-WA(s2 zz#G7Kz|2b^8(0tg9T;{g_<&~MF5qoozuzK_0&(C@U?*@;8}b#903HE80gky0b_Es# z4+8%HCSA_4yMZr&lb4`818xOg0`>wYF6G$Sz)GMC_!cl;fp`FJ1>OLPuY_N~O~5YT zgsYG?fNOxqfggd2Wk@T)SAcIhYzQ21HRym_fLDM4z_$YV3K+H$wg%P$r(DCa-vC>H zl54>OtOj-gC;txR3a|w@svY(ME(iVyya()e9r6Vb1bzoR3w#V5d_CeDhygDE<{OZI zfptJ1Fmn}j2X+F*HzIsM2)GV-8u$v(-h{LU+yra|j<^~56j%hj0vxj%Q7Z3q% z0$v7w0Ni(Ak8a=*;4@%s2lnL#?gZWkO728?3S0wx3>MS4u+zD(0_P?8BP9O%{ z3A_&+wif9HxD@|cs<8FKr8SvF!Dj{few5L9Q_c= zFW^R?7nuJr%3y$2C=OvmSrOZh?avNi#q2;fj2*;E*um^q><~014rPb2!`X0l1UnM* zdPcCL*+}+lHVV6@9?OnnS~i-EVaKzv*q!f0b`o}MIvM-$jmQ3dr(&ojI5j`}tu{K;~sWR>~%^$=KDkoK0avpx zIul>!XR))`Y&M6T&CX%xvbpR$>=zhdwXBZK!*1h2>@?oM=Cel3+Pwht5F?oBNppr` zm@^v3e&k8a+FXb^m93b;dNF3>F2>yTOEC|>ja`P>OiQpk*cI$bb`@r9FUOqJ6>KFM zpVwl(d^@`iGyHF0t1#p8CU!GhjoD$hqVux`^VDuf1FeJIi6-scY%RNo-OKL7EZFF8{f)zVD$4{%pur`89wh}j!_SLA9Dsi zWVt&zfOZ9HH2j98=$^M0H_rAavyRX<@_BH#4{hRf(|FCb_cWeOPgMVN@ zBKkS(R5g?<;`ZbA=MLbCxdXXj+(BFkcQE%W?hq`(Jd`_(JDeNN9l;&R9mS2{j^;*k zzvf19$8g7T$8lP2G&hDjo*T=Zz@5mQ#Es)l=1$?pa}&5zxry9qoQ~6T2F}QtI5TJA ztelOra}LhQxi~lH;k=xWE9E9}lesdkoSVW;7vO5SI&L0U&jq;<*TBu^8o4lc0k?pQpi*t-qFju- zkc)E(F3GiU3%QH9R&Eh@G4~s8F?R`fDfe5h4Lg2a&Mo1Va#wIya#wN7xaHi{+zM_b zcMW$f_dBkgyN0$A zeaO!Da}RKT;MQ{wau0D2bDi8H+@stdxeeT7+~eGzxQ*Ns+>_i>+$Qd6?iub`u8Z5u zJ;y!IZQ)+vUgTclwsJ3XuW+w&+ql=b*SR;iZtlJ>2`;2i%9;F76}lW9}2Km;03ajN8ra;Xdd7$qnA~fd=QiUR`N=-jGk4 zr01jA5I*1Z(sJx-I7^rsfzdw9+D}pVeCHIzeHQjfER5D)s^U{%T0wsKf0m|m_~2lq zIozyl23bH#V3ZcgbnfM~#S^UbR z$->GcWkXPCjAGI#kjX!(OeYv>9~dh4m1AG&_ss*rO7va9C(bI9V+*v&brx9RhtIO1pa zNdg8JZkYn)vjOD-S`t3h%2$#gHBkaQC3y=jnG$%)Z=*rNGFh^vQqxGmDw64V=fPo? zJJUy5<;coe5DO8a&Mc21t8gCVtY#1O@-;0YcfpaSQ^{ayf}9C1MP|y8;Lyw| zE#)&&?tXirGSd06Fbe&R3xvY8&Cf5_HXn69ZPiLAbdd^6 zc)2=CDG73o^ZS@bXVv1eU>g@CL8fy7^!aqoS$@kEmwTJD7a|xpJ8$Lgc&PK_=xgL; z%Iqnq7GHzaq+Wtb^E{Poa%OAw%1YIo`Tfijjkznol)u@bRjCV8^m)deO$G4Fl1*Of zJb}zvF&C_J!BS+J7s!)ae_O5=!=&=SwA_t_0@%|U=Oxags%ouWfS!4HWlH9x%%h=N zby$FcxmjiU}h5566aAhXEB?*(y`~^l_{B%GLMG23feph=4O@Ymy0l;dN~T(eCp+7m8+M7FrRuk z3)y@M=3$nrn3FV*lDP}nJWA$cmMNK=G@p{Wi`aZx=Hr&DnVU9`p1BIzJWA$fm1&rZ zFpqlq3)ehK79v2VYJT$E3QtlUD?oEdm6ab-o|MtA&6-LusoYyCeZmrYg_)n^6eMJh zfWrH12_k{utuU<3>!8|CmWxpSD3?|v|3^7RX_8qS1R_Uu8Rp=S+gTgJk2dp_N zTFWFKWFz|V424!`<%h{T?I^g^OiDUc-RoP_{SRF|<$ao)*M)FD4hNFCA; zaa|%%pWxR~;}g32mv|~P$|!lO(PtWpFJzSHbL44d4+_b@DNfpi%9kT|2_q^L^gQ4A zg#D~?eKW?uS>bY2^25HWlXJYgaBWnx&%WxTo(=X@l1fI{S1~y=%svVW2zy2PR4Y

584h>JzY&IucS;?ud@BK>Kv88G+{1lJ$4|9D^pdMme1j3^CSgS5v3UnYDIpg zSXEKkYXha$lM?J@pSdHG#c_l+4_-)0Bq>{5T}S!uIi z&a!{fSw?Z{GHqT&8+P%^?vq#1W)#{j^~pk+qzSG#(Qn@w`FW^6g_9<{{uDmmLtzIo zVN)ufTJl4tmePI(eeM)Cm`mI&ynq^1t{cB^v3hPM-74ku{C2{=T;(qq$Y^3%lKEyX ziR2;dhAN#uAkBo!Y`7!;3C&MAX+W9wjM9p%9)ctb)#e;hPuSs5@=;aH95peDJqUik z7^$T#dL-<8sH`UDEeJu%B+6`vq={&+$UK7PV?QUfs3O=Ph~LsI9LztVFEGuIxj3*1 zF=uV+q~e`e$md|l3PWB7#gBV(F50ChS02hJqtHB}ih|dVXUv&_O+@N}WC0q{f#SWI;-va2F_xHqv_nh4k>Q$9X$(N^Aw?H;uMWQMn(t-vQmXv!41oFhnw`VX9|m&RM;Cs;rWfp9BDg6iKa!a zaf*ygEVMFnk0>D|Ugc$u=}GC8bS{|BmnsZ#97cUmz4a;$Xi|a@PtH*948#9)9t`8` za9>`1#Zem)k1lBt=NjbHO!?FU--TyRz0bFOF)K}2W4I;z7P5cN4Vr? z2&6J~O!^tu?cw22v94c zDboBrce-@OuGRq@{?=HR2p5nP(%Ck%Ey8d5n?JFt@9&i$WX~u~G3o}Mu)<=zR2qj* zsadnKz6YIrm#e>$(E#)n%6OJKoBX^RDP)6UG@W%b&S?<#xSzP?4`}mUk@1PU3X>8_t#RmH86Mpw9=gI@<4?-*utPhwV)G*A(WTrvbih z2Ex&KEe*o@sGlipQdy=(S-EqtO+F;dyW$GUltKLAGioC5`x`D07XgWoeQpu@4fhob}bn zvU2tyvfS-lxe260s0)p4VT3XN7j>1kU=@FixzrkzzLaDMRsCpQn9$4(CZxg?-{-0A z%zvZLI1pPUZHW_Ynxs=$r7!wY<6M#}6w)+@N2P-#v@=!ZWJcw_%TYB}wmy==m}H~) zwZtdQU>Kxo%8N{0&nV6ILUPaR1szkIy9lRxh^NYvk)(+ZIBe~wOcugO(!%_T@Kl8= zBAja@B@@Xcsk%HcZTh6?lPdV$cT7CGS9U;NPQFYo;m}lxL5g0PM`T0Ei;UBOr5OGx zya}Pbtz2HEVj~`%PX{@r%L%^6m}v}3>wzcT~_ciqX5BEDX(ULRVo5e2cttj zSfFU%%-}1C6bT9tnaahPYMxPAfRfkXVj#tGPJrU&XA`TC%Ig9o(WCqxF}>slc;$rl!eV{ zA}*ON_jOj&AojxMH4S3R{F<11W>Y3};Zu)@PgeHqGh-?N?c>xVC4Z^A+)~hz0e)a1 zTkU;kPbr^w?oc|_<(WK$;uW>Ll-}}=NpT>Da;hLRcLyBynX~VLb5BX4 z#x&nB<&_YJaMTAZvdHsKO5!cY4_A^0d1ob&e0~UiciRVovh3w9xLNftFf65c^#2I&#MhX-oYwlEwLo+_{Tee(E0IMCNakaVS6gkRY zi=~o5(ngdMKrbtc&{hVBgnPde_^@5M7Y*pA?FL0!bN_<8{ zOClbwi%9bX)sw*KQfgIYQpk%bru?59)axkfWr>rrBpvo;P8NkYRaa#;qjF8k$|zIg zp@tC7K(7y}PrRj7nrVObc^+4WcZ26!0X4$CGh;x514@a8hmk=28 z4s8$SOok$n)L@@-02D@-#70XEn5Drg=^K!uz|8VXL7+&GS72%wDYMx$co<1Z!^|Fl zBtiZ`DMR^`Uzyqu_Df0mOur-va=++{T}bt#6_pMAaXtCTFl?(d431fnXwLj(_7rnE zbtsShXAfkGVVzCElM)9S7UC>rUZ0f6l!>Lt5L&^5O)R=+2vr+^Oue5Hufx)KAOD?3 z9NSj$UWy+z@0G%o@UO3t;y3xs$M*>4c3>B|MxZ)^uoL0$j zLM3DS0|x>J03|@Nc%^srJPaVWg8<2m)t>QUJXl4bXctK+mP( z^JMYak1O%a5Z})fud{I_`DX*$bzI5)uK>A^fKkXklFj%C#54Uk;gY(F zkEv(LUG2S^`@Ygka-^%o|KGe;xrDS%ww&`R(@>h4fGfojj^5Nz+%@(x4cXI$E2WJR zTq#ZUe!?_|t0CHQJDYde;U=F;FnhQ_dl=8e?wy3y!v3MVSZ!yf(4PL=4kA~cp}-d@S@g5 zlnwDKoiw?ue9F{{%G1xNs-AYHfBKA>HM7o|J?HFm1o!_J{;DPcF(0TV0qy?_p-+Y3 z|MH|jWd%2+sCX?3+S^S3dFjSb_AVBK_l_f8(xQca3Bp-PL>7x$5#Sy_4sdjt1iNch7%U%L4CS@UCGn z{aZWU>-i63`b#Cv1QP9jH&B(F`cb)hI_iwp0j5a;F(3jo0zse_m;?BM3cv;EfN{Vm zU<5E6Kt-%60g8bl00(eu2EJpOeqb-q2kZfM0Xu+hU@JiMUAS%pI)Syo8lW9m3bX-> zffz6s@B;^;ku22}R2NJ{Xx5^x*z`_*{8s!?-SPwKY?4F#lDxKY=k4+gg zDpOoCXcQJUX1FVUjDap)C?~oBdAuqNdnw7127rVyB*@C{BT!iL{ZQoK$MJo0^ljSs zNBoiAQ-4XP@Se)53b@Vb;n+FIN4o?D=E5$op{99}McUS;NOQtHrX}9&NZ=cEQ(fZJ zrf_{cnuslLiH^e5M0E|p(czg9=Z@4RV70~e>}Vp2YSyBB~p%Z=kivt(uhV?XkjR# zjnH5Bn7Tw|^TOzYP<)KGC0tsMtt1e(hPp^1G{)mPEhRgXIVE34G01nVuJ~Mr1VwUqQuUnY)VCzxVQ>md%)Ib`^I*tz0`i5y~V!O{MC&^=bG%=;p%to?>@*q%{$jS z&%4-rnYZ10i}zmdBi`q|Z+qYOe&YSy`=$3g3KufRHe5#Nj@6y4o2awsT)HW`YF(YK zQP-?ntXra6rn^peyKb%S8QmMYzvw>JouU84^p)vEbCvl@^Q-3Dt@m3WvA$saz-q9S z*oWIE*vss{w?Aor-ri?F$Z@D+q+_&Wvg0nt1CFN=n%5kEcYNabr{h14A!@b9OPx4OnR(Y8Z`5AfHs=G>eukJhD;rj9V3jHkoh5Bptf6#B$ z|3!bGL1&m_s5kuG@QvX(<5;89xW@Q~@k8T3jfa~4V*0@JZ_|P1qs+&c$C*v$O0(Y_ zG%qk;kMwi5`C;=Gg!UiikIg@rhgme1QI_!*y~SafVyUs5V`;ENEQ>5lELU6ZvOHqh zXnDcXYx&-CytUpMw%%a9#rl}_HS1T_CR@AhR@OM>$40#yC!NOmOHOR)@=RhNI3A zaa`zF?6}Oa(s7;RcE@_hqmE}C|8RWd;9%Lw&MM~|=kJ`Wook(ccYX}Z9)y(Pb4_uz zy54a8)peA6w7b$h&waQ1E%!%mtH%wC{?>CRZ2FYvE6?|yYVRDRoP_sMN+W)u-J#b{ z(x0yP!=mTvU(&y(|4{!={eFf+4aXWzFw8al!SIZs&v2k|gz*@o$2i%z*!Z>aJL7QE zNK>EbaI@At0XB7+E6fpd5-Df3`2tJQa+zg~tC%q ztv%LV)`M+E+jQF;+gw|%Eof`BMQkx!()NsPi*2iIo2}bsL7tgwueUeaBlej6I{Q=h z&+U7WuLtbRQRFCglsGhwa~!pfpraAi`jg`wSmz7pM%UA@!RIc{eSo{geY1Ow`%d@0 z?#E$=uiOrg*R#~K+|%y4(X$5j(0GqV`nuoyg7+=&JKj&d|0H|V3T?9ebtSrA>qhHz z$TeliGjow^7U&k~p3uFm`$~77F=)KNc%AWOV~Oc7Q?2Pu)6M41<`T;s%YBxAS!P)y z)=R8Upd7f=cB8G>akOJ5^t`~)iuhdNc+2rON1x+6#}wp_bDc@&rOxY|k2&`^N4rd} zwXV&s1EKdS_ko@xJmWkL&n(Y*o{(oTG=9YMB+9IpJ+C8Q6nRhedQf_8_5Pi7Mqx=E zrsI*z&AO{~PwT$c)#@Acf6_m#e_vl@uo*mt(+$@d9LA_|nelhVn~^g*jBAar8NWi_ z7-1S^(wfGa#+fFVbS9JOQqxkDtt(CKrf*D~d6fBhx);nyE+BWiW_zGh1ueSGWAKCWUzOsF53j8i^*`wMN6IZVTxcjZ zZZ!VQc(&;jGihSA*Vx;T4_~z3VJsQii;-*0SBQpVe#)TGv~jv%YEFWBt;)7_~(g zYKvvgPL%k4PK`_F^1EWLm9FbtH@SZA>TuoTdcgItYm;lI>wVY9uHCLa*VnFZT|c@? z+$MLeyUpF6ZEV?YT1PnwA`EYZt}kA{lGgwX{Cd)b+`=CP0;C)wx{YM zx(js+QL3)jJ)(PD_mXap?hD;Fx&!nR^fmgJ{vOnYeR_?-YFKVqZ`fvd)4+^c)QVpi zPch9hJ#HE>dCYUoPndU_2h2k(W|Wm{EL$vn7L8SB^;=`sc5A2g2kXhUD&+6D?Lm}} zr`X>{sTXtJ;@slwcTREb^nB?#+Iup}__I-)UFlu#ebl?l%Q`WJ4LxV*N{kbXeq+-3 zy75@l_@9{)uo6T1S!!R8(zM4u3MJ=UM}uRH<9^41&PAvz{jN6GE3OmV*Sgk|5G$Dt0qP4}qo6Ww_I0{u$;gZk(6JN4h|4>L?KR2$|Q78`Ce zJc=-XZWv-5WgKm^qwG7&c&;&FY&EtUZ!|t=eAM^~>X=WAdyM54o6TkO*~)Ac2&>=r zrA=oqb#8VBP!jF*j6z+Fz;p}WXBO)=>HcMGHC1?xk7hz77vUxs?H3MF@qevW=F(qvHI zsE;7#lKNKtVx-We`eg`PyMC2^wSEoK>stLf{d#?;euI9aeiKsf7Sx{G5X;-q&f1Bz zybF0~58`~UzF$9plwD*fHk24NhT(=0hEYi8V-4eAADzL3a>a#IUuLK!h%COq72Ki&HVI5LZr(uI(qhS+TSY^gtu3pz3 zq~^V7*$lXtyU1PaE^%wz!`&m?qug5eSob*h1hf`RZkyZX_PNX4749mxAFYQu?zu?$ zL3g7&;*PnK?pF6=U%v@Y9`|5l@x>F})etV1c*>Dl1f=-Grkxy7>; zCE9k+4$n?c4{~U)XOE{3mBPI=bhlyc}-rM*X8wj z%e)oHDSmGa>hQVVT5r(Xh0a$2u*U{U@OYoono#TK)Zx$Gn>g}@|h}7JI72(zD{d5tut*jZ9;DAHf=ZU zH0?DNnTyRMP{)l$>!k{9!dkQn8_hBEGPGgVnAe*-QQvJcZ#VBU_oA0EU}lzL)OR|I z38i?2r3&rCh-I;*&C+gJWm#?MKwy`#o%_f!~bI=-ULmy(5ZMCffb!xwDgxzGf z+2`16(ISf3llH~-cKd3Sfm_h4=(QK~7*4PSXgqEo^8v&M_~B%~zV+&8uMf4)a=bx4p-)%hBuDgSHZdV!*+i zMb2VpiBsdG5RGzbonxKj&}Y)2*JN|LoIdoND$p|aJ8KZyxz1W=5PhhKGln)+t8=ll z&AHUM%(>Fpj$YL|=X%t#8(@!3&MwqLTbNLYu&ZJl=-G?-vXFVu4>Q@QVe0vA{1D_{9RhSl|~6{9=KhZGryRvP|2{gtgI}*uj@MJK6B1}pL3rx(EI!O$9>eu zJmm8^y2xg~ zL%JmXH#(hZ@9!Eh-KIkPb)gW$zb?Po|4oX)!E)kcC%fuXUxwt~4#9YxP z+C>NUC^Di`bct?}6<3ORA}4x8ugHr&ag`{Dq9}=eF<)FQ7Km%awc?{@>8ZW5mspAk#N&Em7-7O_m+DsB_Ei{;`Dai{p4SRpD(Uy2vRuf(s#Z^U--qIgOCR=g};5x*0^7dynO;x+NQ*eU)X-VlEjyTqH~ zPvXzwE%CPai}U ze%AihhpYpv1Fa8R2U&xygRMiXL#-j!Vb&F^3~Qz}%evT_ZCzqr zYF%c{u`ai+uu|4stIcY+I;^ynu{y0TtJ}(2S6cI|oYiCXT6wF_y2>h8MXO}>Tl1}} ztp(OK*0t70t%cTg*2k=mTZ^pgtxs5=v=&=8ST|aqvX)pkS)aB(V=c9Awmxg!VlA_7 zwQjR+x0YLXSa({VvsPH2x9+mOV6C+7w!Ub6$y#N7+4_ogkG0zRs`WMN>((0UUh5my zeb!p*e(M42o7RKYx2$hl-?7$N4_Oaek67!i?^=&q-?KJYk6Djf-?uhePgqY{Pg$F+ zA6QRYKeRSmKeB#o{lwa0{nYxI^>b^h^^Enb^_;cMdfxhl^-Jpo>sQvVt>0MNtrxAA ztlwHMTd!EZvwm;wuwJ!ZvtGA$T7R(Ku>NT6vfi}*WaYB$=T2=Nf7)rO^fkS0J=u=Y z>0C~X9b47h*O$w7w3V{?-sJh2QX6ghB`Ik#d13R!Wb?S0^d*&=UMghTdfXJrLDeXpejyH;WO)w;k ztVmNX5w&O%wM##-w^X<$IV)di&lbn$dwMdxAr(QTsdbu0Orh3s6RPaCP=P>8r4p5< zuPg(*md?%QGRX;(@bos%j}v=?e{3mb3T>r)A-HvUnusZ(olk39I-Tw93f2_T z8STn3N_uQCq>F5&CRuY=H%K}K&vumh3z^+1xJlAm@bGle1vkh>6g*tgDR?1Y%9pO` z(~8~_?dn_2vfjd*QbrfwC~dBQ>6y&D8Ex(8Tkb#=dnk*L^_0(;GO~PT={+c)eTk=M zd-`%2Q|E6U=PgTQaz|~ct&~aHlYjunb#cNwOK=?9be3^ky#2*dpgT9e0_S&4L4PqB zI`~Qr^2(<;C8>av#|V6jt|LvEUqsbPQ=@=dkyXb(>t*)-+|t{b-9{@*>=wCo!6VcI%Jk; z95s!So-1WY7kQaXvgT`KkhBXPV@_u*ehhg}B}AraMadeImHix>)*mWFB zgU99=>7#5m`fsn{-fWGl5W8~KzGYr`gv%J#8b%@iN+HyJ>1NU@A!wxW)`hWKhYwa> z6~5|>&NJdNng>5OU$wL$W1*WqV&6FtL*7%)$kY*qG!D$MZH}$QV|h#&v;B>x8N;}V zscGiPLJaY;#gU04Obs2iW7ruX>oL-pGQz^J;V_1QW>JrQri4-Eg^Yi3%rlC5%`+s7 zGB0efyD*M{5yD;*jY%Vn3?JQM7#St(G18ng%E<6Nl{i*LNqfySr;V^P%=yMJ(k$w+ z(3CL3JhO+5VPqTy9#f-}n+8$2#_uK?4bP*L7e9_L%vDxn19 zCXQ{EM_Bf%(0?QspuxWbitJSlP69hyds~}r2wf+8RRkZ(mCcAglnd16Uu(-#IjJ`2 zRE`F8-|t$vo!?UphJm(zToTbwsfNG}P4~x;O?~-$j15DXG+;yD_mjU6@~5y}MfrQk zz~ufMJTSOFhdE`LAk-nc35;7nZYp+I$_BpjV{rMy_d}$(dG|u53UNsCXQLC~L~VV2 zncj4&!wH8n3Sc{d7UZ++)*-iu+lr}3h4-y zs)=g<*j|lYO{skQm6?uGGISudx9wx->uAe$^yd)elIlpO+f&(ecr3!Wi7nL0I=V9* z^HSN)R4LQb*NKR}RBtAe&Ok6Ej5IaPj%Dr0W!ehCsm^bnIGc5Ik{Clovriz*<@?o! zR+c}Re{@xMvQe>ROH&yR`>fR7RA)AmOQ#T!oJsDc?EJP|e}%&NUM)WClIGUtS>R5zL>F%t;o)NFPwHinrF3=E#CBf`7DB#P5u`GRB29GN>PzZ zPV!8?GX*b`Yo|ab+bb*68uUMV`sq!Y3Qjwvd6Ke1kc$8eo3qKhOrel3xH*QZnH{Dk za0M}ul**a5lTl~3H(TruHWP6Rc9Hyv{1cIKqFjHZqOMFSg&CE+Yk@pGZtLyM9es#i4O$REi+f?z zl#w<{oly<6BcIC`ipj7EuGfTEOC2h?XQ9JBm0DIuf2J682hAnTsc9G@n`y9iC;iSK z9ZN1yitl(bEk|f8W}zn5LMpBrQWcjwOum*w3YEDg& zUN4>LL-&rQzSvR7_Oa^laDh-hZ-EIBFQg(hO z)q~q$a;YLF#U1V_VixYnrc=diI+H5mc9=|F_6f7lRk=P`nCa|H^%XK5@$-v4x8+^4 zzz~g;Z_Sgkr-N?S=2>u@IbwOiPL*g+o*lm(V}|K<-jz+fgYuRJT0#( z@6$bP3+#o5XGD$~!$_vHfVNwqOs=mZl`qikdSTwpEe>T-fc|uUTQ1etRw%KXjxC+8 zOYzQvz1bJAiH)(od=-1rb;bT3$Ec9Pdwg|ICY^1=nxNE{%Xg)E`+M3^BEtpsT>hRc zIy}$Y!h4P{d2i(xC)->3#evN3*EVWE?#mV8fM)x3h>OfMww#0lZ z^hPx$7hYT9uBVW*1h2DlE@otpcI|Pd?vVoJPTd#mGQIOM*)}jO^RFLe|4%t7QuZXg z3XQV`e{z}*qP4Pg**jw&}5%ek4i z#P}lHeuply+xgksMSE0b!%EhAc@AZ(b{kK`pjF-{&plYD9^w=WBvS0A=`OPsB0)YBRgTrURM@U_P!zY zIJaRbml|9Dw6tt(ZmF(rZJtykowuUM&}q>&vG#X5t=zaQclWEa>FC8Ob{$K}fTMBj zCaRaz$)N=jlqZfW>5iJQBiiA&u@bbacEZfDBd~W;NTC^Gi!eDMSuCZKNhHIjZ60$b zJau705|1-sOl96P3vjxb%I4eqJMH_U_E6cl34V*TOQzO|li>fZPIkwF&^p;IWu7_- z-D^Z!#(^U?-mtQPFLEm}Vq1~6wK3aGO{*?T1a8d5YK-I>`1;!(2zvqEr+)-A=zxnS zb)@oLUH|X9#hzIa&^h6pWP`InzC%iY?;#zrDwLEq7l#z z101Wb9qw^^E@lciv7v4ER9h!zz2-AU^@zhRlcpn1-}asd!!Ot;_t{>LuJ%l49#4@m zcoy1$^&Bg^?uC_9aG0sZ137lYI@t^fc`VPCoE;}mUBx;94b$scCV5oaQ@hZ0EFZ$6 znD(@YCWS2PY-mMXFS#E=`(K%^ww!6XOy|(8&9b>m0n>Wio+m*!_8ciHBrv$cV}hM5 z#+InN@^E#BHYH8HXbttB(hbG=n?bs<~gXZOT3*xq4u&$s0~ z*YC1$qOQ(+oCH((yi?8wKnZvWYOPS%H|L-mPYJA zN;V>ynQR*Fgu`}b(mbDR(VlMy`zuebUDzJRA&QK=;T5B7A9g;})>Bie>|IFY<(Ej= zvuVG``0yr|no`};;L-Ruw-@`(oYEZPRlO>e{wy`n!%AVjr`FvXadY!uKs~pB z0w}pj4Qg(l%|&UD(tyzf^Eq@XgoDJ7ocrZ&M&J5pYnX6K7tC`@rY@yLGro;6^Zf zVp)tM%tEK9wky+DI-Dbm#u&2HrIPL3Tos=4T77%OiLj)^*ukR^D$}s%7E4JRSq+f^ zP~{rilhqv;13||$ZsA}Ei<g`r15`O;E6UerIwkgH}_F76s189P*NbrHcsaIYApWqXU<$(h~K61L$Y zH&s%ejU4K!wodZ`9Q8B1a>eG5B$`a~#FUMQj7d_GM+YTw&GB|6We^#aMEW@j(oW4$ z&f&Lum9JkVQAz$z6+12ornxOEc3_e!6cw37w)t|wuu@5El3zYLI!URE$oM3_oNh;` zEI^56-KL-}CIf~_Z2biX;3e%-Xlf%d)p({m?#6|4mhIJ&!rhLvO&mCj<{4e^X|ePS z(i%rk3adneF50XJ$lZIxghATlklbw1TKe+6?rwmbBzq>8G3|F0RayX7tbEHy%o0S# zt5Hk!j14`AB;%6?&r~yVN=QPn;t74-w(^)YUoVUo>V+KLZWS-q3le2liDN{}BnnxC zjX3#*H{r>$wT21>^hH-F`nVx{jH2bC6O<)ws3azfO6-nR{%MpcD9d*>3Yks>q4#!V z!tX+*yEM!BR2;|U%TABCGOma8x(yW(K(H?w;htbygp&s2bD?5UaCNLR8}XyYcqv> zoO_d;2NB?XfdcOl6nKN+FnsRK{~C_Z0sOBK_}qv8H4>kHvnbt;fkN!dY!p8K&TJF~h!RNo2y$kjsW=VYho7sC{WbHt_ zb5Mx)m{A4?GMj|Y|1cW>_F-mI@%dk7gTM}A){4*fnH>N&nAr?`QY8!&gTW4FHXEN7 zvms!IFq=ckm<ZX-|*-CsK z!fZC!3CvdE^H64Uz^J_q#5);Llg#FVoycqrJ`ZD-20Mw_T6`YPtQ+iPW)I@?Bg}GO zBblwk=TK&SV5cx!kIy5RmB3DAwgI0rC?Rew&8O)vt?k_%wE9fam<#3)iB$R&*Pb`0IOy8 zGCogWwh}DCYzIC^Fk1yy$80A)Ph_?lte)8}e4fN?4Oj!SxA1u~v$bH2%-+H0NM;X$ zH8Fb^pQkWe2X-d2_wactv-MzSF%#%(r!m_AHip>%uu;r5f}PE55ZLL=Hi4bP>;SOQ z%r=9KWi}Y>3}#!vlFWvHRWaKN*34`uST(b4VB?q#1FK>70@!$F!@+8qZ3mmcYy?<> z*~?%PnT-UiW3~hATxO%d>Y42XJC9ivSOc?NV3U|7z#5so1=hl>5v+;XJ7ANUjR8B8 z*}GsSu5CBW(R<^GMfRG zWHuP=LT0nUnwbp&yNKBwuyM?Wf=y>O7i>JUVPG?urNJgJ8xA&;SvS~3W+T96G0TCS z%WNdr#mxG^&SN$TY&NqJ*d%6EV3#mk0M^1R0d^^~g#C9@4+moi%bHjmjxu*;Y&1j{ko1U84+BCsB2o53z;wiv9J*%q)X zm@NUzGusN5Vzv~lkJ&b`xy+V#G86bdkJ$#Wh0JJfkYlzH>^f#NzV|TO1okmzG)DI_+YI(`W;D*`nQZ}E#Eizu zK4x3Nu4hK$-BrxCfqjA*jada|FMxfL*>HR>GTRQenAr$?FEM)=>;`7!|NEKk0K1VH z`SAJ7c7lD18TsL>ne75w!i;?B0%mW4-NcOi;WfV9S_MUt7d%FxaiksJ~p# zYzWwG%&5(Og4s~8+nLS9_fIk#2DY488s8T)8xD2{GipCKFdG4OCo^gTH!>Ru_Bm#B z9Y4iv6xa%8bS;)Js{;ExGpf&s zcQacI_5iaj`2Iy^OTfO#Y%9KhiP=)H2bpcdcdCbhVj0-Cn7x4SUuL!(?Ay$?o!MHj z^~~PEcdGw^;z6+QGJ6-_?`5_Q>``X#;rln3tq1!aGg?yK$7}=G24(}m=-Lew8^Io9 zHVEu~W}CnsXLbPC1I#vqeV^H2ux~Qk0=ALa5HPy#1I1RbCzuTd`xdipU{5j|2KH@c zFMvJ8Y&h6=m~98!#B2l@wV8q9Ww0MG8wvIhvmIbhGaCi=FteRtKV((~_6W0GV4ImG zz^J_q6mNn3h*=}pcbUBd_G4yaz#e7xF4#|)CBeSO>^-n8%qDYL%^P8HV5oUW<$ZA zV>TD;DQ3gKwlPbCQ6Cv7hJ!uNtQ+hH%tnCyf>{piX=WqAe#xv4?1#)ofxW=21V;S} zy9;2yVzvP6N6Zpnzh<@&?8nR+!G6PR5!g?djRD)vY%v)1&4D5b_9C+-U_WIx0qiAa zOTm7|Y!cXSnJokRIkTx?FEd*XM*SN859}3YE5M#%HUsQ;%vORu%WO8-@0qOvdyd&0 zupP`+gON{w{{wrK*&49tnWe#AW40FT7tFfBUT5|o*e{voz;-fQ2S)w`{txUA%+`bb zidhNl4Q3m_e$8wF*dLi~1p5uMg zKd`?s+X?n6v(;dKXSNIMHD+tT{=w`mu-BQb1$&p-J7DBL;s3z?$?RRQKQLPd_Ah4d zfxW?OJ=njQ(MH-InQZ`jkJ$h)^1bkXVE;SMoG20CGKC{7Ke`dA? zOjx942pIWo_&+d<*-)^znQa5xi`g)+zc70NY;R`6!T!o@JJf71%$R?E)LbECEL21^ge_e#{!d{>kheu>F~h0s9xTcfmfy zED82+X77O=z-$5-jWzIp2VmEV*(9+4FdG2&VP;do{>y9-*g?!%!QN+f0N7w=Gr$C{ z9sD2I!OUiZSuz}1*femF=0vp7v3hW4G3&8ecmH<1F*+Q`WnKgnP#cUDShnS548^&xg z*a6IvU`I1s0(Ky?31G)CTMG7JW|P2=$cU`@>41v`b= zI*eGTj!Omtj2<&ubo50Rtb^zFDW}CsrG8+tb z2D2?-NoGU9s+esBYi2eSteV+2uyM?Wfz>d30c}9Zt%tnIM zG1~!lF0)Z!^~`pHoyV*Stby4suu04kV2#Y)0&8K`2-d{x9k9vF#(|L-a%#vVd zF?$beDzgb-W0=w5$N9`Aft}540N6BUQ^C$*HVEtjX02djnH>Pu%4`N$lG$Le3z^LZ zYi2eC>>_4!z{W8f3O1eDT(I%XhJnpsmIj-^Y&h6VX5C;DnT-IO#ViMQF0+wf7c=Vv zJCE5Yu-VK?V3U|tfnCCE0ay#O1lXm_7J^M?)(CbPvqfN2n2iCO!)!6wRAx!A%b6_! zJD=GEuq&7?1)Iif5?G4aGO!DnO$D3FY&lpfvsSP+W-GuhWHtk=o!LsTitMDD zY&x?!U}W?R6nV73G-&ulAL zirG@IK4#m%<}zCbb``T1z}lEC2P-h!4%W_W1z3^U%U~VMR)Uq7?Ep(NTLsq7Y$sTT z*=n%)%yxlwGFt<7HM6(Cx|pp6Tfpocux@4#f?dPxU9c>(bzs*rdk^eNX6wN|%8ZUm z=P}y=wvgEXupG0EVAnAl1lGfB6WGU?9RSwLY%|!$nGFWZGur~Th}jUZK4x3Nu4gtB z>?&s4z&^oj7+8VX3t*pQHXN+TY&+OuW+T8#%w7h&f!Ro~er7wsZe%tJY(BG{V4q@E z1$H&FU0_R?CBPOidkgF)W{qIiFnb5=)6B+zUCZoUu+K0{f_;?PdtghMO#oZSj1GEl zW;O}zI%WgFKFe$>*vFU+0=tD-E7-@G9RRkB*$l8n%m#zq%4{~+^~{EV-NtMV*e93` z1-qTuT(D0v8wR$VSsH9Hv*BQOFzW`pf!PSKJDKIcZe%tR>~qZez&^!n6xa%8C9oyT zs=z+aYysF!%o1RCF@&>9fURV<7;GuCB-q`|mVn*NYy#L9nJoqT zEVD^qUt+cl>=tHI!B#O_4z`S0E7+HrtpK}~*$l9+Fk1&zYm`y8_z*cxW*z*aEp1G|^mda%zkD}jB3 z*#@w?m@NRikJ(1BFECpOwwBo@u$9aff!)t+GuYkC7K1&&Yzx>InJoePCbO+zUt+ct z>_KMRz*aF^2KFsxFMxfS*>bRNGusaK6=o~IzQgQguzQ%T1Y5^!2iR(6tH2&&wiE2D z%vOUv%xo9f*O;vVdxY6rU|(mp7HmDUcfi&#dl2lq%-#jNm)Sb7N143`_6=t1!M?|g z7HRh}+W@wK*#NM$%r=5O#%vJS{meFjJEHwgqe>vmsy)GTRFF z1hb)F-(t26>`7+Bz`o7w1+b@>4F~%Uv+ZD;n2i8i$LwXWA21sU_7JljU{5m}1@=|aW!Jc3?1ngO6 zbHJWtHWchRW^=)wVm1tH8?!XnCT7FIo@dq#_5)@kz<$9j2lh0xkzl`M)(7@OW~0Df zU{(U#%&ZFRSIicG{fJot?AOc|g8i6TBiL`4Edu)qvoT=XnJos}!Ym2)BC{o6KV>!n z>?LMP!G6YU64-BGv#DS&Gg}U}m02s;E6i4aJ;Q7U*zcIF1bdd*Y_Q)mTLtzU zvpHZpn5_oe#%wOwtIXDbJHEC;re**dTnnDv4Ef!TVn zUok6zy}@h)*sqx_0Q)1ejbOiFwh(L=vrS;znJof)li6ml7nv;v`xCP*U@tLS0`_NS zTfu(IY$@1V%(j8O%xoFh+ss}7dxhC@u)i?d4)!}{E5QEB>}9auGg}Gv4l^u6c^C2Z zg%mks9gMGH^yoSGA6`E+r+`;ny7ns9JLh|3X#UisHBgUUO2alHNLfGMOij^$RDH}K|Tf_s6hfgo{ zr?dItO{1&k%o;zZJ==>i_s&BxGZgL8crYpq@5ZY#JvSS#;t08yElD@K*FXz4)M9Co zFJn9xGE}?KIfvf=!;$P%0=n8U^!VdrWt2FV;52B#)IEk4L{*PMVvKW?I4oS69#&Xo zKQr`1q^721N)4sWNH)kx7WVAmh|6#WR8TXeoQx`@Y2zV)Bc&(-^93Nou`e5`#8CSq zp#obQQ7TYNXCWmP0hBVv^O|t4q;nx^shKuF7$ax}!noIn0-_rs2-i}fAl<@O56Qum zN;;;J(~4hCm`WMeBEv%}5=5<@0HH%|p@64zQY|`(hIkUm;A1;}*-1oA@Gv`(;n@S8 z-a(iC@Mr<#pG3-!*eSzr1~s~=(aT8E)?oD2;|MQU&= zXqb~Q__5!1e+YTJ5*iOx(9tn8cq{0b$n?<_bZoSahzc4WsR0#4*Yh|hVc64v@sd1a z8>)hi<74TNl|%#72{9zh)kLhoq-ENzL!qa)%fiVW|-RhFz`3osJJwTD}r2UGV-^+?7L(%B6qR{usqS#WCY(XiW49VMXP#bfg z>kOZ+$eYDOQUnBhLYNN zN@VYt2$4h_5p(w-^Xp=%G4zj9p`<>J64Vz>Y#Qvek+)Jh!#&TzWOhHFf-iE|<~ zpn_<9Hr7sPeu90(fSG`vWNbaMvL->QIi{4k%BURU;%YKf-09FWKBgX2A1x>+aPn%y z!WvJLps6+asEKyszy+m~jONPcI>|!TcTP%L1)OK6jIm5|glH8o$rcJ&1$Yv*coO-Y zsmIXCcA~IVfRmD%;}kn($fVwraH^9qcyj9`q(T0CCt=tm&y#eToiubl?6afD7n>HstC zghq$pB&UhQEKZ&z;+LW$wjOUO(lMn>rJ!*c z+s4?JN?_L+j{>20{K|Qm^G+Kqp=0!Enm~3|ph=d5Ea-|Y7gd&STT`g}k9SR|EZGV) zdCPKTY&la|XkT=mqscfvc?%@XI1|D-N7%RuwJ)o$Pm^pV z<^RpNVy1#nT|CH&#)a-;VR{*=0!KEq4fQQsg?)G)_^4$lQ6E+5Ke~4`eLFytvV)>) zauPUa_s}#2Hhrh8DRe)@t4i+O`48`*>~bhu=TjE3zY?g`FC$Oyq5dSOe@LniI=!cf zj+5?TUplQ`I2|4PJRZFUY zF-{`KLF9XmNWejxOtQh7#9wG>;A2jbu-$Y@cOr6o+({QQDUiv&FOvli!j$Y}Xxk{0 zg$;T#;S)~6&;f=LQZVh4GNEznl2V_5)KAIOK?iFx(I$T)z5eJh^#{I0K`R|;;nPk^ z^R61DruzP&lRCt?Q!+Xq-s~hZI#Wta&gMq~yDx2hee@c>_^&EL7_!|eofovyPW6vj zQw47|LpLP3pP1zQ70k|a0_12@bW4Do!8ak06@nD$@Y7&HzfaNjdC6~+h6|zLXSRkS z-sq4tcm;bWkgCWWOE3*8f9_Ekx;)?$kZ679L*G`9zL5SI*E~}9j8|Q7KaQ*J0;qe| zqb{@?$5q%0h0l2vhR@w9sK9L=jUgQ_u7T5G;PW1J#*P_R=`1MyMOkSIH=txXO5txF zu#eB88xI|d|C01}wBCSehN|~O% zPTW0`>dj=*c#&w}u!sUXZx5is_E)R`_t6xBQ{#c_vmFQU>vGZ=jZlZD#N?^qJAy36m*D|4aX z_qKvwyt1Mn-5_RzaBjq)QDMh!E1>%$&VhzkcUJ@CsSaM-U3qy&$m^sajhoQWXZig# z=GO@GeNJPL@lH+7+;Yo3mZbmSk&ZuukT$>Jk&b-#8Qxzd<^JfAi+*j4{o*Uy#N6eP zD;3&0=7oDT@=KH*&Bfm&u?*f*46m4LC$YeV8T5%#mz&Vzkdz#6a2;#doBV_H3z` z>dO>T_N#D0%4H8`G{gK`grHJJTadcM-_3$SD+13L`VUt+>Se1wpNeTFh7;PXe%G%c zva$ly(5UoJpBlVhkKdRVq0O!Y691Q9+-}w;v+69%fJs z5mm`W(Dq({wn$UTdn}qx@(KU(>GZrSOu1uVrd=l_^50OAz_vtly!WL@hy6ZVyf~WH z9dt8rXag=Aju{ud1h=^?Lp4HY-NJIZmZR5wPp)(q_Dv#=@g!k|Nd($X&UUX52}1{< zjP`cL^0|DWm~0JMaM<-qd#3}+5iCc=#&?{jFt^K=@EYULW{b*g=GV^AQRx9?>Aq5TL>nM)ePCH2`Ype* zcuf%euqznvUBAv2B8^W6c|{j=xAhlG+4-4NPad-{^V@eFB^0YR*rO!gdw(5a+Ha=Y z?0JMt=TrXI*2T)d3n~tgDq^oa*xv?5#HM^5FJ(`|$>q?9aHz~E{yT%^t_v-5hWNx~ zJB%^Ycg9xIahP8Rp3IPmvsQoxd-sRV3J%wGRBjBlo{#ty#a?l_*3bst&;TWsn?r8* z2&pOZ-Nw|zX{~#tl!$o6vFvSEK;|e{rZ=5gkTman8XB7Pzw%|ra;84a)o*?|vD1gh z^B(OH$+Z;?n<%h{C%xovjwwqOI-<*Aw;zgwGvcv;APadFr#IZUL> zL*v`icdUV%Ex|>v7I-`p5T>@^YFedjs(iO|3vu#-0mD+OoF8Q8S*~Zm*i0c3- z=Tlr2k?*;cUW_i#sb#U4Z@VpD+|#_W6?$%YJxy9*H3*Ja8&n=2c-{2Ea zX>w*V+AED+hipft7~O+u%0&kjXLzM~?*Vh?&>P>&Evw2a$9oUO@XZHXjQmWsN31;ySuHJjnR~N5TUtWgOvBr z-Au0>wp#{GW*Vh%#qSZebsu>_Ab!jXcSi!UIy(rE-LgySAltJmm7;c^`yo^z4>y8pX(QooSQ29wywvMel8- z^jcw3cz%dNQk9Y06^bgazmZ#J>~^R~)1<Rm8*odb^SnW{w?!-MvBzlMQTrCnqF}rF1fhWH`jgW3HJm zfYl^zjJlwM>efBC1knzuY`(p}lkab)vycn_2TI3HfQ3|77x|Sb*F~=@C&B+gT}|I} zOZ2*$@jps*l+y{w`;%sjcz7Um6qxCFTFk+jWj)AbYO--wYB;6N( zaal4bk}6(fMz`R5>{VU6bFraoDeSsL>PqFiy8fSbvx{NPrT-gi{LP1a*=7GD#oUCb z-sb2Ecjqen58M;g+vWcoYxH`%;(w%=>y0A1Qa**Y+g7L4y0dbI60fsD`z3vIgY@mr zm2mo2o2{>yDU|GJfmB;(3F}LPqo56XPZWpkE$DcyJw#U=-=S#as011_Iy9Z_na+G6 zQ?Y?`BXruMtb!l~HO`SXFf$%iu_6{i?wU=xv&0tO2_?^a3G{b*^v8;92-ELbu0k~} z7`r^GF(-%&en9c+8(fXduc;u}oK6&a~}8v0$yu7*UWP z9hqL~6ErQ`c~MOfTk{+dY^YPz8joyp##^3cyKC^AFL{jf1e}SoFm0Om_=H3Ijw3+@ z>h(#4hLm9)z?sluEbkMESLsv{eSW#X;n>NBl3x{+T=6g-s|vp4=JkTCGFr|T9l5Iu z*%Ci1GG2i$gJ_9F?LY)K4o1$;_rr)lOM+-B{7K^hCLwna*9bXFW)6KX_|+Zm`+ zlRi9voJlm`|<@r8sAYK!wFSIgMedUVsS76z0yY?unYt32tZJ*MtW+i_| zJYwL1X3`15qPWqIQdYg01ts$kgz=RQ#}>M&BigqUNJaY>*O5$LTVXeXAj!awv3Maf zKbCkRkP5ZPmdRtoJbaCvns(v13&%~OT@~7^zuqI0!rp79fP=632nTlNMDh|i z0Vh-)jx_Bxe!?qVMCZu4D{|RPJc6iu8t6Xh73%LTWpfCuO{WmQCmXrUJXia!$=u9$SZt*p{Y-$rd08+I4#0&43tdSs}{fL`0ys3 zno`};V)qoPluwaTSROVc@=C6Gw$lw-E*S3^jJ*Y(l#PatC2@4nY7p0+rt3G!^h)vl z)gJDwFM_$!RU_;a8#ho)v!qY!iUXTdfNH1y0#%ow`ZJp9P{$QA3V2m3enl2MX_v;n zI+W|u@Lc^Dd`h#LYe0dNT%`tIt`v-Uvz==Zu};S3Ob^ldtdlmML+3>pTB-vbfkrF3 zKp~ydKB>e!vZgjcgAM7qC6*p(vfa5=JqhSpMtX`klS#F;7xTIPFdI1dl;etKLh4pm z%I%PWB@bvg&b6aCsBDw2+S@|a`U?`E)=8kL?Sr+qYicWPi(a)#t8m+*oQ+V9%foZ@ zmn5_u8gi5xk}^kH8r)&$NI|~&boN>f@|CSo3V2++y)>YSZLCC88rUosyw8=<A$8;uPig4Uf40l;0eo=_;W^w)>=#_@R>|Z~ID`&92>T1=KJpaOZxX zhE(j($+8`EO&;)Ti68S=RzvRLn|r8+3PqmjL8&J)=8;=7b((KUk%*v23>TQSARip4 z9Q$BMmkglSaT;1!OFtR$PM(A3`^^9oiN zwI}tE0gtch^WRUOX#<&~niz{=+bZ(FLP0 z`_19v6_kv+z>i!_k@33J1MDH3dj5~gf-xg@J#OPCUg1jI2KD|eUg6#B{p8($D)k_0 zH%2Hc%%|~_rjS3AlJR0$A;~VDs_o~lXjd0zT!k#c*_`~tyU1kZOTt?tg#(sYBurZk z&q(3uW4zg+gFdaMouE^wrMcjPN_y{Y^JX8oK)bSj+%l_y*_-K6fa~tGlfiV z2V&X6qR!~y0Guz)AfI;y5pa#O4!m3xx2ofITs-ZeqdS$(;?@i2k_6N$4MjAw_=VIG z5V0B}MlI-<;bNxcE4joMTv6WmjgAC$M=p~7m6XO~?X^hCu&lZD(oVy#1Er%vBG~|% z<4}9~jjLiej(n#>!FE@HDQ*#0S~_6+BFf=K2>^#xG@!reQyOE^3OTBfm!w=J;fA&& zC1*mDzTcKr7y=I6i%5&!m!(KlKp#&NseG@n#Jp@@%09G6vD209J7Dy}2ueBqj^*+Q z%7}9qNCV36S;CG23_Cc){jScIr4t-YGua&;!N~n5O~b{|@G5C2WpcUl_I{vG4cPT` zYG4M03svmz;sJ`C1ObW*Q2e^4xY7+(pJM+?OL+{|}TWov>#@50h!9gkD2S%knqkCC70^(D4wW&h1y-{c(@fK*=SrWtXd@ z+^T}l%t8)AE~aA3MujP*eYeRCQ2nN^y3)(82@k*{OC6ET_5pf&$(iv+5v8Mog>1U$t27 z>aj_Ucvc~`;=c+>h;xSc_0)-l3aJ-gR!D>Rp+XwPYYJ%+#~tR=TwNt5E2LU{N+C7k zNrlvk9STW^BM$d#t`n0LQZE)Nq(Q7zNTYaBAx&cckN7m#REd)nQY|JZq(<~8q*mOb zkc9Y=Lh8iZ3aJ;T5B2BXAi5OND3&OsNj&K%wN>H`g;a}^j__%&tr2q-QY)@kNJ2cO zkUH_YLh8kdNBT84h&F{Zin|rkB!1{8i7K(rQ9eD1YSFBa8j)5=t+-tw3GqFJ)QR^L zQZLRP=Fh7^T(6Ku@k@m?iNE_vU6nZOXrG?CYH^W5YQ%L4sTCU(k`Vt?NS!$P7{BIv zalS$t#N7&M6hBZ%lX%}x>d~H$^=YoJ799$y5qB%3Ry?kdg!r#Q>cptwe$DlwS0N4J z0fjV*=M~Z<{^chPRpN-_e3~1o#aRle5#0)@6*nj(A-CnV_vhXy zPEkmcnCd5uRidPjYH_cp`p`0Qz{7w0OZL3~;vjbejBnuHkP z)6-NXMk%CP^eCi8tW-#?cu^tn&nNmd*NI6AsTWHW(jXpINTc|>LYhSVNnXv>RaGLb zkZQ47AvNMPh180}Pxk9ch}jCM6L%@3Ui?@g4dMU{)s~>qoW|Vhsz%YQkS5XZCm09s zRYciNg?oc3PF25-KPiR;3*2J7HNglh%YIm zR%}*CLhL=-uenYn6;dzeDWpNHQAneBRUu7c@EJbM7zfW+NVWKkLTbb#3aJ%;Q%FLf zYj|5`qE1|*kb1FPAr0brg*1u*)qXuqVxpg599*oBYVj?F)QGnfQY%K)_%zog#4Lr> ziQ5!XFMg_!2Jv@=GzxSUZ`tdbM9xnz4&I@VYOz%zHR8a8PftA#G8K{#{R*iQ-&RPy zcu^q@;>bF`=0-7FAx&bjpI{t(QX$piKMJW4C)N8jH`IzYg)(rYNLF+^mpValb+mVyi;x#G4AK7YD)#c)W2V_IVW2 zD5fi&-B^TR3{P&sTUV2q(Ss5q){wWNRxQj zM{3a7pI1n=_?JRz#F(?Z_S96>ikw0cVx>ar#7`AcF9weB>uC@dDWp-{rI04^il1N{ z9C@}+Pj$7pN+C7kdkU!)d!6H#N{9;-QYXHokb3cqLK?*WWBqy>#pw!Z5?A;M#=*r3 zsTTJsq(=NwA+_SeNnc(y2{BnAb>dSBsTbc>NQ3x`LK?+s&3?^IBI73*2k%x$wfKcX zYQ(6RuN6`)-d9MC7%{=8 zIZ-PnDI_6oP)MD4SRwV|b%ivDqbK?`H;P#bX%ct%3C6)K3aJ)*pX<|8S0h>!QY-FI zNJ4B>NS*kjLh8j?=lL}^h>SwupB2(19`_TBgF6+1y@E+T&Gj|n3Wd~)qE;kZN&*LTbb}6;dmHqmYECJ>RdnPF$goda+a?4dO9{ zG>SJA(j*R_=F^OEaGFA@#U~U}BOX>rt$0--330*&e$92_B8Ak8>lM-2->qk65{I$sT122QZM$M;n&gNaLhQrH*0Mjb5pIjL?H?B4TaQ+|0o3eNZo!t4dPb{X%zoaNRv1_ z>y=7i9K22;Sf?nYM*K@5wW8%pzn+BnjzVxYG0&f-UQAO6&Qlc9DAp^aN&MAMFb>w| ze44Qy>`+LJxJ4ng;`<6oh&L2cCr<70YsMaikL~qouBjGN z6;dPSE2LK3tB{0vNg=4`ykB#@n4ypcajQZa#g7%zBnI^P^k5tur;uuKy+Ufl6AGyn zyA*qL)2>c!Iv!5UT}jpDe1Ur&>m?k5-ruUAO5SgR21^DCrQ998sbP9#LD zLh8iz3aJ-QC6RR~1q%{-}@|QQPm+Q&%gp3W48HNS*krLh8k- z^Zj}nL{1?%hgC?Ec-Bua4i3E9rw8NUc?zi!*C?b`tW`)tyrK}Strqw-*Ncoo8pIbB zg7ZOzU~P4cPY=ey2@0teMTOLeuPFp`B!wizA=mmf*NO8LQZH^)NP~DzA&p}1kNWjA ziF5n}<6u@HI3H9kLL9Tumsew*n5~d{aj!xe#J?2MC_1n6>p|P_6O4oZ zR0zTXKjxEasuBGP!Fh^865_m%`=#o{BQ6p68$ch<-(LLRaq=tvYZJIj_s=E|xZh=( zT^c#qDkEE}K_jy?a;rw@W)%5n>-mR9YV034nf=ch8o5a$k7{I>MuzPz^Ohw&UnAFQ zJf`>5r*R3mq4WUEHr*2wAms+up>$Q>Ga zMk5CfRP{7yq+cW7(#STA>^(@;e40jb8o6I1Z)@bd{Z!4J8o5CuPio{%jf~n~)tuGH z%^G=3BL{v+)l;XDyhc8!k>@mW-~p=U(HiO1$V!d8q>*C|R5ef3$dwwoNh9}Z9;)h@ zp^@7)@^g*+QzLapsG9pU@_CJH)5t+bs(KnVQq;(U8u^Vzh90GAo~e;V8hK13|JKOK z!&J=~jjYnhk2EsiXjRWdjg&O^)dd}8Jr$)Z4k?k7U zXSk|4sgdh6vPL7XYUKFig!^avg!47>X^m{w$U7RTIo?(5%;$SFa;HX~(a0eusCt?; z@(GPRrjhqG(mX=de4|Dv@=^Zn#sBz^MvgvFrjQ;osgcVya-BxjXyhr4yrhx;YUJpX zRC~r~^3T2&?Hc)lMxNKmfup4sc`eS>$b5~g)yVHOa>yB~=5ZRiN+T;Z@`^?# zSE-uw8lgx``DfS9dX4-|BPUf$8Ce?_Yvg8)Jgt#^YE(UAG*Z;acQvw4t*QqhX6~O| zuFEuXpGKb7$om=@op2R9Bgkxx+^LbDX=Fg1s;5RHb2M_JMjq10A2l+hUd?NwMiyw~ zA&tDDkrNwK%{OY~F^&9FBXy0cp7|R2jz<2bkz<=wJySGtk4Ao`k@qxm`kAWcOEq$% zMjqG5Uo>*kS*qrl8o6B~Pio|Cjf@(jYQ9V(w`k-kjaX-^dKxs+qmjEcvPC2R(a0I+ zsCnI{k-uuBd8{gRjYb~O$Qv5@NK(}^K_l}ua<4|VYh-Yp}Bg-_hO(U01QuW-Yk#{t5ZHp@P6O9a+tfrZxk<}X6sgcAKRnIjV*`Sdj zQ&p)hjohP=XEn0-`Kq4L8kwn)PithIMt-Z2gQlr@)obK(johq}jT$-Z0#)-38hKD7 z?`kC3s_MB%Bl}*crWvJ?*&4Y;BM)ih6^$Htk($?djr3_`twvtc$k6Gk=8Q(ZtdSpS zrWGrjeU9 zvPmP>997Sm8YyYy+ZuUWBh{Cyn&)WbCXKwPk@_oCJ?$E~RU=PnbXoK_h{r-8ac9E)zhJoyEL+0BL{Y_7#8i!ZLL-l9$UCS?qi6cF$sv7U3#B<9ca|(UTCO>X2 zhWs8`iidR}i?F9{(YrXy1qn^%DCy5k@6O-_43$@>;W5IB35Gl(E7FvU`=BHLBj4op zHi_D$kMX)KJhIp+4Znm8^&V3QkItm$TU91Nj~T2;qSEx0WnkA*z)NANRy;q-XFj>l zD|UVieIuD$sZMt@CA9Nt4ShCpRJS)udU}c>U1TdY$(p;mLDDIBwxiUKC+b$-LBk*4 z@9&?6bkPM5w=SZ08gg|C9`;zzmS|TW`bbb))_c`WxkMM=C~dy-^la4`{0h3tFKvXZ zr+mhgk>xW>??L(OOC0&!M}I?&PVT5Ryb=g)$N!*E=dp?O#6CPL&-SPGm%yjNlIQa) zaGal}0I$Uk9ekw*dF4}_Qa&}XYy@;f7g|&17g4q1C0sqqt6 z*w!5`>}|FDtlO}p(aqK@9?@=%!gf7GJ~7s5xN^=Aoj$}{mS4MIt8f}SEXKmGiUd!`y$aKD(BE}54oH$^1sr=}lU6y|gn>3bFgiNkH34*6Do&;e7 zd^t(z80krp?di*9qV09OuY8iP`*s26!UQ^JPcEU3tDMH{ILhflI#@Y@vB9~?5{3qc zL8rNyJCS+a9#==XKgN>?@wm<$AQ9LLyf%CCGpsb@6)}#2it>vnT#O#-7PZztmLB$l+8x}?KRw+t#K7%Ummq@nHL`6GKRH=QOLhi2-sr? zlQt{^Y>|lhWx}`^a8>xKGdjt5l#sE|O&?X%81kNSMy8G^q;X)5ZF6ib z9?N6OnC)*g%^1evl|*Le5JS9dab)5MQ$t7X7&^h^NgZi^9%{2%nKXr@M?p|h8Vg9=?HsGH0BdwWccV7!^kLMkCEo2QAUO?P2yCg zVXUyr=rz-vQ-qyi&NoI?nngVpni58sXZEl$jEtkeV`_AAv%yV!=FDS=myL}~9AT=_ z&6)?DrU+S&k;aq}7MdJwgn?#JkA0?uQRW#OZIpRNQLlN1gi+=hootkW5yD;*jY%Vn zG&|V{Bcp^pMw*jG8EJO0QC3Dtd(AYbjj+??Xd{d?i+U_HC5$jH+POv;8ApM~)ac}9 zgU6X>G@+ur?>x@8uJvzkVgjJPNy~pE7ofqvBOIW?e${D*QrB@yf9 zKy7{*c`7H>2A#^$fbRQUE4TA|s=+YO){jdfrX5y4of**RelUEfA}0%iko*YWU3H{ zB!4zK0Z!D`*O%!{r|{yno=k5kX%xVA0uyFsOzLOMdFYNFadwkl&+Q!3wnWu~JP{=#B=+dhWAj<#G! ze-3>s)sarOr?Tl}XuHB&7^#zWbZ0u|rLvu=Ql_V`Gn>n#dNY}H27=vf+1`MiUwT0& z_2!NoUXUD|3hzIi&AK^Bj3L5#tD~bc%;o#lhR!Z%`sHX>@YPl2+lUu(LRxs%9*y4QD?R{TkH;=lOS%vE|Ncy zeMLYA;^!B8Zp*u7fst1!-M*iN^g^pyTz0Q6Q zwKptD(1-R;1f{lIzAM$+-_wo~87`>j^7mxX;d$N`-gA7(dn>;<+1|=8 z4rF$}wowCeU$z*rG3#ltB!&K-?Z_0PdyqSIASqs3V!jo6qneTnuPt%cQ^;9@*I79i zGqOj!_Bd1bNP%*v?hAIA-g%j98<>{)*N?LQr<@cidlFuS#@T{DIZcVmV%8pKkk4Wd z-gE)NTr|nFvUJ%yVPl%21CE|M*J=5g92#&s+OG&pi7@LrhqI1`vu zIt!QYEDFM9?X_;I5PEpvT|opSu0(T)8*6*P$D z;liCA47q+&j)SOV?s!}ZNFQ>YLWD5MFJ*f??MJW2a&G1=F<$uDeuply+xgksMSE0b z!^-t6(o3dn)o$a77_`d!1NNnL_4z%OY>KwFu+vX&jneZ;O}4A^DTwsCZf}{7vqS9T zp=r{Lz~7E!2IWbWXRM!}DP%jZ33UzSR&OUv+3U(eD#QDR)Z^TSrCe%k{nOI2wYjCb zy0v*yjdb3MB15M|+bs8UIlU=&_p7t%=*22_9ZSi8qjBses+ZKsp#>7;TX0-Schrm> z(GI_jm7ra<6K0MbfxVML3e6B(gvklXVkw;T+9@3Vnf^R zskTncdczM5xJP4?*}6;1ZZeYV%5t3A`1$5Uhso`rT`J;%y^gDN=8)Z&30 zJ7S$|hJ-wpAA{iRIN8^q%NOeeG)%8&ndDJvPwnIkO`R$8QEv;1X-|u2QpmE-hE~M& zk~4VP|H^c=#c&T3)vDsyC_70G9{;#Ou|OdUEqlJI=?SeYRZqDh{1sHT)2$t)$Zi&XTc~d2CRIui;YDE*y8^xJkVF?z7Wk zR}*6_Hu~oyj4il_Q!!PkB37oMffR1NI9c@fma;hnjHMAfkdlo^W+t14JK?aMnKaKQ zTeRof!T!pVYZtbMafpINTzeaWlz7D`+lQSGwe{4LDti|adHE$$K_cVBn_Oy2bxVuW zg0WQ;He`^6NaZxomJ7x^24Zb$Pd1`tY4t&)B&Ab|=dZ?aCwLJ=r3=Iuj0L@}Ft8Z} zsC23{hDx^=`^}uv9O6~IDwX~$H6(58J++FG z-kd0?4dD~la!{Lehccn3H91pPG`X-qwg4gS*5M+78^Q32WigI03!R?Yu1sI)aE>e* zW5`mMO15)zRd~*8_3aTSAd?bf2aiIiOv9dAEG2DZHADtLm1}HIR(D(s1Rc}3MG=m< z%=}Ew&?MaQM20fi7iwZlxo+c$;Eaw21~SYT0LA*%#9=W|A;uV!dv!+yG?lMK8sSM% z5lxQeZYkr%G?A32E-Q^{(!}G%KxktA(?oM*lV3P~=n=_zd{4!KZUd??^e8A_T8hVu z`sa-W)$Gc}UE?EThsv!kB6tYy6{EClZ;?AWvsTC-%jtH6$^w*F)@=&vVlrSNgss2e0KBAq z3QcV!rW((5$KAMa&a%B)Qn=fZwuu90(LCo4J}s7>L0aSJNnw>}&_$aS0l9l`m@r6t z9Fm(YT1#KP*WC?}lVs0~G^YKIqDl+kij{Bqh*^Tjcr|LNp0S|^kz{<*;F)ShP6Dsha6nM5IrFcT-g@FqN2w$@OgfWGJoMISeW zk5RNdbb_*^4VA=XQHkBL%0G=V1!eiJMj_LQAoSjjO!!@>beCp1pNiwSeAz_@XGJ8B zY|};FSc{IFqI}AwiXCC(Yh^yEs1PI0&>hQn>qv>5qcI)`)=7tEw|D8>mB2;W+E`hP zNtR4sNjMLc7XdwGQA0qF|6)W1&^YssdD%YPM?ssnwi7dWRvuaMIE;;TSW&d2Y{CvS zoY)`4;m9CAM<8;aK$k3KayfUiFSq~!yGzbEHUq+Pvr3);1uFdiI=g}-06`G=HBWt^ z7kF-_W3LZ%K|vUs&gm{FQ?y{&`&R&n0b4+ok?fOnm60L~?Hhm~%mpQ5ymDFVSFXr- z%Owai7gy|RQV{Lo*nZcuAC}1A)Fnyj%D5Ng2 zY(`Iv)+NSu1L|Z!ffz-rgL{2TX>}TC+X=nwPevd4${@Ad_|w3JfXQV<#L?!DVydUx-7@7+== zBBG)qD&iX=z9AwaD!w5iA}S&(A|fgxDk`EPDk8oi;_oDx%p^0(Niui3@c%zwp69rB zH|OM&larH^aAkjfc-TWMB2afmsU|^v|BVaA2K7lNbtMsNEq!v!sGTO;mLc!&&x@;{$LWGa4QK;aeDRDB&77i6`X!>9tkO3eJH1!wvdog zv%+cjjU)sL{?4gySAYx@-m){JzNeo;8117%sAU5vt0&LE8LxQ2w3etIIKzFp4) zeyHzTD>-cftdyR59i!m>YYC;WyEmt=HAzV69%wtISN)jN)*DGk>5S7koe6rN^lH!> zrEk8K(+}@}b^_f7@+f`x*Npmh+n-PhzkMO6t8at$1C5`+>FK+ZkW%mfr;9HoA*B!B z#p!I&5vAAP$?5W&Nyz9R_zCp!b2;62KM5)Q@hnbnTtGrf&j9R{o(%m->Av-xez%&0 zl5Vsme4y7sIZAJOnA7=(k&x2o z_TqHTIV7a?KEO}uQx|Z0+7=Q51^-#kC~VwI7~MFNgp@Xe9a6dh+62`1vL zZ*)mW=^?0x(%;|7>7Vd-N{>K4Q~D%eq4XhWC#84p&FNi$h0^;#N0fG5!YKI5HH1?5 z(Cv)+o&vT86#nB{PVYF0gp|I!g3~jAm(q*CRw?ZWV}Q}!@DpgpyE%2Q20H^f8FWSI z>)+w@yL+G??twZ$*FfRx=W)6cbVlg|%Q)=?c1&rPOE}&3DX=r3$&H*|u>%PiT?Rja z+RI`By|#f`2XUGJnUuysuaq`HS)jgW9>6I4EBu?%gHRWxzi!9rFE@~o(gQV4=YhRa zdK+M-^wu#>Z}|WTDZL%~gVK3`gVNhT4yAA1#c9`@LEk{nt}qH7SVTDe0)7Jhbu*_2 zcP0U&OW-Ha-wtCG-U$6cY3e>sH_QS%nML}Zcow7ZBNK$t2hSuSr9Gg{l*p}|{;(ej z8C?%Qf&O+jr#I{l_6>ACV59U@kP8(25$XmC|M`1PyF=T7f`6UND12mpus0a%JDtHO z{LK}F(Y=5XsP9S37={17icsq7`!S>N-(b5yeSL>A3NO5vFuH<}kkaWFa(dk^FwTHJ z2Dm9*05(VI{WCbd2Xs#9qDfABf^AUR0oq3CAHYND-JlmrpI*V~olu5Sqo33BHb-v0CiA0_zq4l0v%F1cnPPSz(+EA2z~-RX=Y3}z)zrMz)R_+ z7jas4IQ$!E!2z7+{fmT@=3mIEemw~(J@0%@&s|SKMvubJM@jJT9x+`FKY{-Bdrtp; zBME@QrO=0z76TSaOWw_C4(OcH>{T&62tR>pHBS3nKtf8-g7#C|Cu9`-xl0)RWls`N z`V)*pM)$x^@Jl-^;Piw&Ngtyt;pdg$Q}5*TfqTF|0bTN3PM-!$l-{+7(}%7AzYFx? zC7f38LPAQbZsT;!RuWPgYI3R^OhQIKhMzziPv_Ks0|_Y|at5b<&@ZK@K;JV0{XGR} z=e=Y4I{XA$aVDqbN0N}ypW!Fai|^ue=%pm2^kVosrLhT4FF28el=j;vrW@hsjU@Qr zIgCOAIDvvk*T?iQ{CpVtWF@CXyOWU7HSiN?*5#ZACP_$X)*hTjKMQsYv^Ug4X)nM< z>6vFU3hq0BF#00_{{!@gnK8i_`U8xmBcM)7OX2@hI^q;g^FS|@=FW@>@XrOR@5<>p zP$#8*w{Ut6)D0B;Q_%JB|AGDvK915q&SMm=JORcP&`}_l5!87U&`Yl3bQtKH(o5j) zls14|N(TWJN(X{o7+nWHfu6XT(++!sp90#x64O2K6KM6-oW8vS#7{s+Udm}0bV%t) zkVomzkkf*jVcY>Nguemx?YNmyc>ED0d^xoBr}uHX2I{7C?FgqYL;q0vTufhp@{~S* zKBwJICLvJpw_6#7ThzNa+{A2h{geh<|~?AKwzwLGTmkM;CDV`F13vwDmAf zr_CfGrLT^0`V#O`decdqUITSf`skyaUI~Arbk?CUJpey}J^{a@bm2~%J_b6Y^uLXa z`p9;KQuydKjQRqI6B#`WKY_>5Cwr(p8{mO1s^|D0pZM%vaFIx8BI8Z;u(U-k3qcUtP|qZ?83kQg|1%gVOf_ z8&KcwXEF-!2HjJ-6WT`UcEHI9ba^|_X;*T(9@4&^n6aIhY&{qz4lB_?;#K`0G)d>r^`Se zls`eNA!iVo;)VE!mPzwKaS4QadpU)y8rQg1r)9=qAAyD6p&oT;svn#|`K=&TN zsP9R?hWH9-7l^YcZGSJL@H^LmodNB+Kc^=^n<%~TP)_SE1Um!z#T-sm=zmIUKv$Id z_M;Re*<>(%k$ ziLsWY9H^&RAMV!M)o!bemt8xtX`*$ir46gvt!}G(+GHJpk!EXjQ&b%T%~VX~j~QATtz0#02Pf)Vx~>wP%EI_) zpc2;)4XxvzH#0Q-*ajP&XmhpMsF~3(0$-5o!@2z6XtQ25yO^Vfmab2wI+Yz9955Nr z+M%VAl~~IS4)&WQf$Nhc*~$%eTHsSBSAy0H$EYhx_x z*2gEu8qIn%QLoqPHB{AUEk)S}Atu7=Fm$Foll36MTKl3UJ~hRq2Rq$rcdBF5+~Cl< zV|j@I@PMf+@nuUrpnf(0<1h1$4bJpcyg}~ow|D1JpSRpk+Iu;GD zS^OyXxe_P2@~SZ+k60aevmuO(Lle0cl_MMcDGxHP6KDkzPyDpnC$^`s*wjqr*H zVHm3E`Z9u;!YYT(GfPwdM-dbik?J67)+aV}H`;1nv~*b0b}weBP8Qo*+FKyP?M0%5 zt~E9WR%X}8kvfg|FjH^Ztaco#$^?}jOgw(KXojv})5fqU-i?FD@@{400n8$LHx8;F z8aJ`EyoDt<^LR3f8PrnE5UjhSS^SZ zJ>Rzz>-s1z5%C3n|0;0C@L$?RbSBuA)i||-PL**}w{1&$tBAE_bgJIb?f<5ol5E04 zTU14R^Sadtt?Hr9JU6SgTiwvf?!cyPRJT-f4fSWX*9ka#snx*F>g}+-?uKTsJ8iMF zAD(M&A$}IuvI7Lewm1v!A#59#18W+?x-&V}0Zt(`RJR&93)3D7XVFq{Ica=A-HlUu z@YM#jWSul#47{_UK-Mke#ZpZQPbFMzeE!3GORq@>7AAkR)oisp6;p9gWTv0o7&!L& zB!uejqH8YYndFW2#)geu57BN6O!ldbnip!P^07WTqwU5dJE1dag~v3~x`~aAx(_3( zYrHXD=NsvGO-s~K=)=b9VQV9E73-a11QkPBB2!Oc!e{anw(^N&v7$6HWY(e75xFt3 zI;?{&Bi^YzM{gNx8Ns%pNsBYN)`6B0>{OmfwvDrlV3*>tChUVtXDAM1Qn0al>_dwd zU!qQ2?o6x>bm+)i6llnW!7un5fman0t}V-ttn{lS}B*BaFblD(?U)`nLh6e>skPdf@;-qO^?o6x>OCPHnnpD0U1Cwp-Uy!~$onokT zR~9DUuRnE>hL=eR0rUjZ&>h)H-BOO8V;Ur7r*%s?$sh6A2Pwb4C#O`dc!rxrTMlwn z@8QA4wbN;jR_wLpyhg)^kB=!f30bP5gWhd2%QzE0HS5^u2tOuxB`B@;l>5y z#!^ttRdOpmI5-EF3L^=&@cU^v1_2WLnHo|tW*E2DI(3!#aXHnp$`%oEpi)HSg55)^ z6Ux-dyVMS)MN~f;XKbrm(%F>?3qjLPjU!M$-a$C1uTRt>cP_9dp7^Xr`aR1L5wSZG zaOhenae7D(f|%#*fnQ1q=|KuZu^D=&)sEm0fF{-34FWdAQC!PF+ordW+WDV{>_HVa?U%woJphsk&=Fr;|EM4k;*t=c2^S@Euu?)q6^aYp=5p zn7l_aZ?`XVoPATQHjmC3+*)t9Jj%z@g(nxAo0%tcw;u4hEVU*bG<1G0E~FO>(h%wa z1RF^yzpE8uiYOo>)q_j7Bb9ry7pqsNd7p}z&S`MtYdB&fM~aV%ieNDkXLjx{WA)w= z(%PN$W~$hWnbqm+@?d|`w9TOeS`qh#(svKEW4C2BsqVPn5+~FSZaKf{Dw&VJ90>`v z0Dl2FJ1! z^kgr{Y>4Fu52YWuX^zp^CvE!NXlF)`xk29dL|dLX3<2L_1&nVn%*7G^P4 zK$`7WXC79A1&&6(BL~BGTUyv z7_`|?AlqKN7;EczZEk03yu!1Ybe90p=H|@RgNxMy_xx0wQKw385CS)6ym5$D7G-jD zym?uTBaLn+nykZV4Xe~rXJ*9vGqXBJH&!Pm>P=e%GnIL8v08Y8BDjUA?$;_mMpoB& zbxSnXh9zOAvDLFSUshgUW1?_bFF+?S$!UZGZ!^^^RgOUMrf`ocP3Vc)h*hL*kDleYAu(*l zcq75&xFVt1g}xf#If;}jJ{LA>Uw6}ztuS5nn1)r>b=eBim5)gl*sPni_9VlKK%We$ z*n*`Ehy+{hm<7eNkEQjP1bgjS>%&{B*j;NPcN6RJL+~ko+TU!ISV*tSKC)yN(BQ){;}Xv|*aLF`{Gm^%fa$22)3 zR(T}h>4;E^6$V}zh2y+R>`96X z3arOON7&nfNpV9Vdef&)!2>?ktS8r%S78a3+L1MrXe){y;m2#n`oyJXjNewX=oz&bPdDJ;QK zJ2F#dFWvw|fTeD%Yn^f3&LMGcVw`Ybj#~I%hvr~n9B~LY?p3Q`f_SkvWr{u7rK%?ZtcP(xuX$1?OV6t17C{k&UG&9 zNs0psWHu6Qx3&b4VMl=Vmn#BHh6@7GYwq<44)Exv%ORX+wW0znbz@2q4Mo9Y0<3il z1v%Cvii77ast!?8VF8x9F?BfAjR~;UEfnNflPE4`Dw9$R%~CxI122q9aGsrdlH!5_ z>oL(0_O@VB+)#+#^r=(ufd4b=$#oVgEWuJcGINNwqUaHRyk@LVTx!PnZ8eLYajQp^ z29Jx}A>cgO^dQ5I0Mm+St*sT93>O4KU+(n@4)DP}Xh+o7iwrvgOgpX!Fc~fggudMC z6C7eTLeyMnLh4-}_+gt6=V_@|L5^6kZWLYP)F@1lGZxXso;3?L@R_LETqmktgxE14 z(~W4itr>_2YyDV9Io6MfaHwB&mve1`0lt1sZy*p~Pm71(jVVqQ z5i5okS1R)sRfs?y&F8LLQ)IABU!;X+tD7U$(M=VNAh=H_{j8nKiECO7tm4yixZh*d zkaTHe*<#_|=|(qdZP=iL2v_tNAPxhUfCyK)49*;Z?AlTBI@*%8gEL1r!m~b*&k0v? zR+dyc-CCsr#Xuh|ctf|OqLo&9M)p)>D>9xGhZMC$sm2nTtRysQF{| zQbTi*!Fsz5Pdo~z9mO~7X1x3Iq4k;gNK6pPO*@J=UrL1vU%6^%ed_L}tGdDQdbdjN z0Pmq`nIc3(Ub3|=(|glapBjl9ow~s`a~*rpPuZ|geq{#`$F z(HlH7ZAkriIxXd#crj^;mokcwcQ9mMgfnD4j93al{pBmJcFH0jmfA3?|e7m zm1PzKXxI6ymh=NgPp-kqb_+g8>_k%&-9{508>~ezt#{bv+MP8zuUQQH;&r=8 zNNVQ__NvZ>1^hjHw(BI;q2%CLbE>n^Nt#2+!7*4bxr%crn(hgh4AkHNho$|S)Pm_^ zj_n2YCXKIqdy^qAFME^3zVfWGJv?}7tJCN6M~kG08WBK6#Bp5qQO|I9fP)T_@wUvb)ZDA^g$HBnKfQ zBfImgl@S+WIV)x#$})@~nP+xMEc2W8#S3kD44PZX*}dMdM=_o)t*VgTb&r&y zk#?)Oxeg;2h>kdn7T*A^6e>^Eo*?bjcT>YrzfB|ImZ+ zNqNK%lhmS%b4M=X@0Doz!0@oL^;V|HJU$&fx~~>3?;n2n}#e3^3%L-DMU#cEJa zHRw}VG8FZ!q71?5s#DXg;5ZE^U z0xAa>+qOnnt>{iT1vX3T(vfg@wLeFguro6e)H6 z!_GFnctwq9E!uiqI5KB%ssXbmq?-fkF`d3>8uM%Cd$))&tulM|maEh-z~ogGNaOKi zX^4!9bwoqA_?7dDsNU%|#-;6xOgmu%Ds$0l5q5Sa(T4keqsb~gzXt<`P0DI}bYoO& zz*E(F{p6113QFLoF7T!}>})h@Q?N4%D7x(6F>1Bxrv#4m(>K=($>0d!4fR6Y(peUL ztGtj5hM?Ap>RUEer=ZI>*Q0UxilP~JgHZ$W4lXsGq9T&|JEPS}$QNzZq|>jw%}M*l zqE>fCQP(S)lTcB8Y%GEcoZ({#W^g_&Eg*o^t@1TG(g}C2shQiKeOXz3)GnKoqyEP1 z#>DE#9f#Xm;>N&aYYxM0(p_0NcK!Letq#Naxt5L96Q6V^C(YWD(r9)n&m=cntqzRX zMh()SYIQiJg>SA}&Zb;|o7D<~y=axbtgOBcJKd;`K$=%)Y6OnIoLlJ0$!gmSr(|QN zIalFQT#_57sk9^hRRKL$H`xVE17!>G;emlwL(68RQ6%+!yx!i#>2N70{W(ibQv^in zM>bO+gR79ZxYv#0hexi0+5!zDtVbY?B0lmr^g2C(U8TNsew5&tU6JDHQe^oc(!SnM zDF_J>#xQw>cI7G zte)y51pZsAa?YpfxY@#AIW?jF#D|U5;}h}dI&$6QpsB}gRUjC-{&cs+s&XZ!t3t*;oBqBzu2_ZT2q>$WyVo2Tzf4}Qx zAz26XdH7omes?7N{p;6z*2t zYwr)p-rbNizXn*KjvqrEH*O8d>1P0rGXXQy_ttNQ+gnS|K0k?h2IXz zZBYLS<00Ao=^=R_2+5@vLpweUn9dH#ov#nc&6kJdAfR(U4zlkH$yt94$$~e6{AWO$ zpB$3)@VnK&3&|e$hvcCLfoGRKaw+`(i^D#0;?8~KvNwd}CMbXD>q7GIn?iEf`GDth zAvxz9DEq#UT<|HV>uDh8KLNS75t5lVf=)L>T{l3xp4>;)OogQT4d8hQ>ic_0*8CIN z{0PYTB-HsKXwN%A&bt5;$Xc>1=;$v2xgE;x@{~Su?LR_t(mO!c(B1`rm%Ir2V8@W$ z4fO6A&<~)qOQAo%1O0OkwBb_VnFnn?=gN>Q`#?xm?iG?tb_vO+KxZ2#L$bpwLUI|< zvUW)B1v;n&WhVeD=IgMI{k-+VrleJWu8V?cfn`g&mZkevLlfb0)?J7cFl za>Z{zxAy{uC-sr5{tfoh*GKk(pNGQFi!TH{T@jKCPX`@BpY8WC(A@pA7*}h-PPT)xt3vYV z%8-2MXt2paD06s79s#;#1IRlVFhU0l6CJ_n@yg{yQN1Ed@D?!Csbt?&pML)$EWw2vnBpgTVa_Vs~~Jogfi1-e=U_Id@_ z?h+VhyR3#W2yNPW42<6)@GBMQ51`XG0`7k3uR{PY{9N}Gzz4MV&frsk&RhYuygVd- z2Dwz8sKX%?f0&>DiD0>v}0$ueIzU}wkjh}*yYeF(|Ewt&& zK%WcA5nq6Q{XE$HZZJk*46WG$cJh7D&of|*o(eYlJ)oyS-`oxQ`We{MEuaVZ{pmLY zR`87zzXZSX3uy0C`^YUnhOrKG!H>W$e-6H9E41M>7|&mYzkdmQ%$tDsHPAmFg@3;i z#?e_Y=73K5L`ZhJ5U_m={Kx-*m-LZq9)?R!u)ahui)Q%K|ObYOwhxbyZ4cq(DsY(1i7~ZR-h}PO}k$Y1iHNF z3cv~N+4x@YBku=)@n*1JphwPyF#~pd+XdkBpv~uB3jK0A$a^h}_4k0j;qMP#1~&T{ zurZ)hJ`1)7|K1teee!?7kAqL&c}5?(@8OWNw}ZLuPtfN;`~C&SFN~Sh@cXU52KpC_ zw?D(U`z_e;@4?1^XV>3=+t89YBYi(E+#AmikHq#axtJd1peyo}sN zK28oJ?+^YMe2a9+GV&U7crX~eB)F5z2%Z$|7+gf|AS;5Sg5|*@-;;aEGlRW@y@Hd2j|6`WenIXb9}4~)Y$X>5 z4+K9azafVOI|N4t50is~^}+pQ-{5=XMKc{-Uz&JDgDye&8{ zxHzashb z6mm0pda#LnhkP&iCiw=rDfoJDesCRWlHQ*9egU-iyTVM3BDRMgNa}~xIDNb_(brg;JRQ}@*=Vuc_kSoA0;P~Ipier5wbtI zkUW!AgN5Xx;J%Ykoo8S}R zhmIsm$q{4)Ihy<|xHI@wa98klay~hayp_C-97R4!YNSQ#yeoKb@Sfm;U={fa`7-%w@YG<};C;a#f=kIR!Ow$@!B2vF zf-jNZ1y_+D2UT(mnIx|wzYkWDvw~-n7mx+y)xp)lX~E}$=aJ`-=aP>Hn}aU|Zy^DJ z8T0=}@3f8HCy*zS9mrEiBe*npD%p|jOrA`3Ax|Qw1Ro7%z#O&{*`EC02>-tkUfu}r zBd}#)c~S_!lGe_hTrq2{2`;;&X}?j#w>OgG+6vq1v?I+VSf~83vtj3^8GeKPi#Jvq z6S+6UVdn()rs$3DT$Hg?EM%&F?8Z9eJR}f!Iy2qSv#4`1$|^%Z3R)G3)nd^i#>!j2 zbfVintzvzumn(F3tWifM*d*-dUEsk$&oQ8D-8p>A`&GcT#J+nG2^pz*NPo<4yYW8` zL&gxh=T~c8l8ImixhUiv7mJ;uoDv44oYhJ(UiB-OL=&+!A)Il;8>8K+cD=v=U4?PV z4L6swHyq)$G~CP?H{5iC`mo(Mt-^Wb#$zSz%}2R$1<;QT*3h)G0$pq2mD-1vw6+iD z?xB6Wi;r!LPd4k=;8*4{d+}JTd^VAHT;f_3K6k61=yQLH9d3Z}sRD9G6X3w9fT>Q! zIQa?*!W%@aWXu(NhWKChM(2d7ELo}Wkx1^w2WXT~9s9G%p>vfDPmHyS7%e+}G&9Rq zix#z;EzWMSTa=lrX-%8n=Z^&#YRq6SZ-`|gQAfl@#I|9V$8oNm*fh~P)et2bLRdZo zP)@0*kaE^;!g%pMLO6ND9b!7P`40S&60D`Is<2DI6=LOQY8gNlP>=(~eZYX$Ye|1L zg!5?$hwwEmtcfl&e^i}O`bX2ek(Mw7S5g6e5F!;YP4Hv(d1 zHtECcoKq3F<4DUH23T4EHMpeMWAX4YT%v@SIV@~>5{mhQd*%S=Xh%WHEe9rZgp<}x zig9K58pTOK>Tev18>W*ApFid}jL@X1%577iT+^^i7?cf&>3n1qz!^q-ip`=J^P0)6 zBOUmqezcahp*49YSRy&%b&((=wwJeHHoD8Sk1T`5NrHsgp}Y+<>c3^+a<%9xgm+JN zY|&Ufxr|Ho^GPi_9%QXyt_Yaam4eZI<*THt1Vbe6W_aewDruz-H1x(t^-59XbHSStWc}K^r`M_zmCDS^L>Eb#hi29#V%5o@ugk0%&2DA)-YsAkDLz zgBESf5=gwL4WxNb#Ra8}TZW03wcs>4Uk8vltAr3MXn}`&SO<_U0wk#R;yB=iy*YCS z_7tqOumvjWX7Nd9p@mlhiI%h=#2l>!AkHe`!wTBqA&%At4`r3%Aq8#lP$z2xXknHi zqD3traVKj5X=9c^;zeyBaTjYtY2%h*;$S~_v+*%eK-ofdSx%6;2llBl!VPoz5___lBe69rtipdT?JV!6p^WX4xqj~(hWui zReiaw3U;eJht`2-Jt|n_!8XTe(=Ep`{6!kTI2;2EDGa8)e^sn8`$jE> zk7!VAiWDBkqnUcXc%!jKy;+MUs_=ksL0))0WXhAdHIYl{IbOZq2eLC)Em}7_PST{e z70`>e7+5cyt%**zJq70J*f^1sI9h~}r4AP1q!UaLK2{;z76=zNM(pN@ipl(7TT|G+ zQXaRkJeT_nDr0L*)aqNzqnTo3PcaO}*d|+WA!-Hlzx-wfQNC+SHi?USyqqc*P3~+~ zC;R0?mbas)?V(3yfYBomMjWN_yJJ``GNS^>Zr_6@C zIx@IpCyy|w!4y1yM{jLJYS5m?$Xv}9BrPFhXw}fV)OGVm+IV%0(W(TL9jrNZ!7X|o2hB~2l7PNo=tX3>dvsrf#W%Iv3B zpM>G{v)iCWT@5|pZ%w89e^5(Z9^%k@Uy}wPa&pEbb z_e*Ni79(ZN6Y+46rSnm3I0u$cLA?G>*o56UM3}&x*pOe~t*e&??LAfQ9J%XiXUqkw z-&k*K*a%BT<6d>5B?v9BeF|j|^C;7j!azNq-av#ui-uXW%I@%Fh6^`LjiPH&9$ry{ zfTGPRT%4W;31X|P5`PvXn{}hp9<5mMO7;e;)>;IgvP9!fU8vU$$fU&@jUV;~kzZ z=-5Y45<1Yj*xC}}E#tREnOfM|5;WE$o)1<6O7^_Lu+@bZVn!U#!x{nD`5o zLI96)VaqY?0zO*f0`fCVaK<_~a|HZ0yaB^iyJYR)OxQbVM_`6<4{&8krPHldDo_lb zJ#InF)M~@;VC1r2)7`}05WwkX)M$-Njq$HOdK9*3iHb;dk{X@F1-6||iXbrRq>wO4 zC&s--IL3kl$HnZj4)8^Z5-r<`bXyyu-Du@N%E2avtP^%JM(SHw|8sMN^CJ0`Znw@8 zGSVl1AIo9U8w!mX^e8Yjg;Y=xEtlmsdP9Ngr%1EFl!YBLWU(CVXer)tlAt-AfSTk=%Opu85ABTWSkX)#7SW)P@x~ikmi`j44Bh{# zZ>To09&D=8 z!&L1wmP4Q)*|}nPoGYt@ZaLq>}s7F@y3J4KoweQJwZ zTt=wz?A=YMdMAKzrqTo3@R)FW1AYIp#$Ga79CRM0di$B{wI8ooy#a%d^&sZsoT~ZfD%fd6FMUsVJ zCuy@C2rK0Zq}`&=`-*{~s*L4j9J45Xs8>Ad3)}lJ$GScvoN#quWeWEsX-6Qdi0OsH ziKZsHjV2_F)gX5u_w<@DjbtSk>r}_v;f~5$>jwHtO*(4Wg%+wZsI5oK`}r>9WV@wu zM0}B{vMe6TTDAB)yf8m796wMFk5^Q&d_b`C_&8|z=*6)k>r~=f3T?b}^+87oEthGY zsz$RDTn((k1wy(NJglA<80%LwkN1p5WL&^OWHO3Xn9GL@UR4&EaY;gg@+`cnk)$@Y z1^L=E4an3cBxGx288F&uQ#b|dBPOCD$w3{2C=m9|nmva_LRNkO&A{J*z3Zqt0xzjd zr5~`Xb+UoVXF*oF=)_86DPdEHI2Ewjo-E>$-c=iu@7?(Cvbap|3JEZPMlFSl}RuP7D+nngGS*XA7HhpbTKp;<9W@LQ~ooHAqjgWi-XelUBOrG*K=|m%cBl z=h)rynsRLFX(FE4q%ymw9#Ot{*-XvAn=vsU&(tGby^(wFP&w=gcx&!ZYIT<6A#ks7 zaw+W1x|6ehc-XYzA~sb->X0fEUw}iZW zVx1(dFX)@A%e;F$7(0G)7X++_>5oJj`~*5;DU12U5t*e9Kbwign5L{(@)kJ=fw1ezGnrp9E% zH*a~~E#g_(%+i9xSf|4Zn)+kBMSz~kKpGt@L67>FX#P*@K0%(dTW>bg?N9AAtJz(O zo!A;+7MoS#3`i?b^%U`+cFTrgUC!vt-p-^{fqYB_K2TlD#z80zY9XwYM<)MO zyn4#JTvbf`cY_#Y-Iu@-lW^`~t<*9c7le6{s{TX(uQnEPW(<#PNdQ=(ye?Gj(?W(F z6}PE^>)b3NKL*(LjETW@5a2?bMgb~9){^xMDjo)EykzGx`0zBfnTt>i-7Zx|Za$25 z>s*vS*Rx1z$8Ny9joCN|d=QJrJ9h$-04mNNvOxnlZYE?3MH)?^DBH2djOko(hO zVkkO1_~q1eWD_EJwI|nZJCjqR9lQiA^EeFU1)f9+rs1BjX@Xt*gJ4dIGkB2RYIaha zd4-ttn0+Rk;~*v1?^Yf+{3dV7FV3Y8)w}h8i=2EL>|9Q*FuHQt0v!6mNlva64qR@n zK<62`DR~I!Di9mB_`=V|iLCV;Sk;x9X15rZfh@f^qnqiX3$R3xM&Cz(Wqh&7c)ImtL4OSK>@Wx<*e%R@R z+#(?d8!hjI*);h(L&gQ<5M#yN0P7braO~=+W7E{n1>^xE^|=8yP17EbEh6%uQ3fa2 z=6Ts!(>4(~*f@h5Z1cXFJ8qkdJaC-D3At%XaE6Tw$YI8cI|0W1zB6nWF*)#dCYL5y zpH*{l+73dp@U1LP;8ExAgxn$_2OBN#gc)=HPLOc{ImB3TH^7MdcLR(H$OA@-y8%XB zzZ+zWh&*VN!3j3*`ki3gMC4%O3~sP-$M1&QCL<3V=Ws%fxqm0vxPTmHthf_kyUTZi z?II=z-p=IGgu;)^iCseVp*S^Z5~9g$DyDj1EuE&Qa@2DOjU4sFIxEMxiy;HjA6aWe zS#~wFGF2XNW~~Zm$I&^Bu?sRJ?XprieJG`(`N*y2^A=T-9I|M>HeWDP#BdCymU7r$ zRv9!$P?`d2L)8MN{b;q6VS3FJ(obobLZ&H1EoOAtnPTW>V5Tf{rkNurZ4pdg=6x_# z6uw`jmNmFcwGir>q@wWZPjBxi#>2$)I$~~YK`LfC1WjD3O2PMFT!^Q!u&Ev*w^y30 zwyakc6P+=E#_-wk4M0_zVeIj3Kl__~8DaV{T1=R6kQNkYj&=$u&M>TsfkTI1A(5rM z${6>s_uGtukAA6K;DtuPZhfawDd;f8#jiCgY^G@nzA>T?EGlJJ;uRA8}#ol=Ag$pK3;`N`CZF{~;!f zaygKf8I0edSzd{Z0rNZG#g$)1Vc9$HM8uRN;qn+V{`Jy!yVVwJ8U8t0T%GzDq>#eD z@PN!Bxshs7HQ34)ZBBLI1w&mhoGD2kUMTv8WZVQQLVuf9CJv7uhP1O~+6EutrS9Kc zn=U;Jg3v6l?E28MDJm7bG zXp}2oZFg1D{V0+5CSd7LFH#%o(7>PZNEwXO9%HG=O=~vT z+47F4g?u+dw_eef85nL;3DryHrAo;pM*ZKb^x@9FS}E~bZ*LP%)Ma_hC&>H(k!*R> zg2NzRjB;}|nQo~0zG*1~v|I$2tIB>GoUU1JH^R{~Lv?r;ed|(gVJmXG8BSZfdaVh5 zJ6v8s-SuU6w(F|Ru`|AYDK*jkKDo?J2lYgJ=@CCU=&%gS&yRkKm+U4_ilNx6m{~oz zuYt@+3cipjL9yO-ml;@=3-2^zipS#kej;L4Vlzryd?&@yv`66Txl#MenNox8ch%*G zhtDgTQdQPl>!2q3c9+7!udXxgGUtuj=LWlc%bahq%f%_)>YJ=Q=^}AoOipgAs zCB5M(0kl=r%S)beHD$f$Da-VK)l=eD<1OqOxtsxc-wcMlLrG=KO=t^@Ey-9le4uKZY_7f);vNR5H+vIK(NK z-xrm{*)BQC8qov@m zXsJlkAh#nuh+=(+9G7L^Bb6Iv*>a{wCr}rEl~my~9ExPSCEml8yCwBq40yb8Tto}1 zr1S;M%*JuvSTv~09a6nvF&a#dVzWk*iYuc1ZKbgySR6D~NUT<4vBeg#GL6NSWdG7T zqQ%}dO-6T4l8cYXJWDFyUs=W*rz$wNGZuCl4o1rNZ)uz-yG+(fr?Y!Q3UwOi4NuhS zTjU!b;ubrd@tdU6U4rx;a<%=I=vFj54RED~d%b`vsujWa0+?$~=zNpEoiCzxu z@rG)w-^`<@`V0!qmDjOH)xM;v7i~-|F~lJm(dv~yf<>)vtIiq(d%8o}|9 zcNU!Z3gL827tzOmmj!2>ppc-vvZ`xLQfJmbWoHvjV={FL3HmzW(GdNFkVz|q)2>!? zbG-(MR?#RJJ%1#N-nFVVeTYI}u?`_`{K{+6MvD{yHog&CFQo$ksq>4kam|cJB!TKN zYfL5XFB&z{?R)sd1>QAHLs+d)wFw%baRDcxi5&>bvDlt0G-C%sLh>@JPBTe;YAf<@ zK4=<|sZU7A*XQ>hYy#7mlqzbHl5C}YbowlgKATm001!WDBiCw6Folh&%%W2^5vbiQ z#WXKQUc0hpP(es`BwKE&bz3qM?HrCuvL+|8XL%&8_P%na8UZN~*FYX;YXTDUHrJB} ztSb<|q-<@{c+mBs>>jBkU$S3>6Z0mT-W$Pvr{$5RC9GK0PjC^FL`1Kd_AT$?O6KAy%=|j8Mph4R z|Eb<3$!V<)CM_Lr*?a$*KT^YM;#;Im(yQZA# zS$iMfUhnHlZFbAa1k_olZG1LY(?RsvT)EB-8z97LH>%AjhOOP=VLKHWR{MdMd0wS! z=-hc1bv8v_-<6u929H?sq{c7%yu>Tj>78|{sXCt#X?m4csyNT&xR8XsC8w-L-7KV} z>cx)0RBhHy6<+7pdZiZka1=_73(dxZapjb*td1X-EV{g(@kyhjoxor5l@x&{(&@U* zmaL}4R(|jL3RteM`-<{>vk$%#ZA|1&m^E+ws%+MSliW+cF~9P{t$rfY>?g*KRP#J9 zCRUA`7YdJHWA? z?S>;AyZbop%fNC26TwLbhz{ej z^BoZXT@jtxEEXav$?x;;1LGjn2IfJ;f5$)w5y~sUajl+j1;0A?Ffe}>c+Il4E0;%0 zhSm&`8HXIQukzo(tc45uXU|=gyuT zmppmKilC2tw|ml2&khLLfw2FAgKPDXsSPua<^LpPIsBh<#XsVo6|&2sgBx^nbLK4Z zr`_TI`~>Ka@h|$|XNB}%AD5dK|C;Op|7S<2Pn4s-uaJGO58>zDWJmf>@-%HzUqE)- z<%#fDDw+OA%kH>k*P|Mv?N+BX*4=mi)i2z4#qdgsIQQR9@EgiV1rV|w`+vK@|2~2J zKW%-aLU)=0|BhSULH_qYQ8DGE|53mp5o)Lq!kVyA{Dw7{*4QV0Gl!OeUy!8C-1Il} z_Xp7biT|V030WNfi~b1782oRK4^lhXsHa8EnkN{jMTN|wzQF)f*hFhlHTI|UeeJ#M@lR?|+t^ZEdi_}d$N1>C?}!8!kQd`P z7awiR6#N^{@# zxuH~p!xSY%Smj`xzfj+|F9uC+=Y$cmxAjnFc-xt9*cm%J46r#EP&_e4VYnC=&TG(DiS%mn?=yp*1_9v?E(meQ;EiXX zUjR})0}UK^wBsq_77AcA_v#D>jNVSc8{vH6UNhFe0JQidJ3`|C@EwH3c* ziQ{lcbmv2X8XEiBp(M*+C^|8tqn84#1J2jDyh|(|m)j=+bCcj!BbG zOGn@IVAxH!sR{Dy|j$|cWvn74kK9gnedd`I{|zZl}G zw_XK$*@NRS-$h;^Sn9hN1SHZbC7=JoEzSw}t%+wX|5YKT!Shnp8K&sEDyM51fz%xD8 zZ|>FSxnSJp_K(e+GdV(vHxvXgO=01)`fZcK3WIgwtnt`#Iow ztnKavE*Q7D-OV?w$ri%s-QNLWd7gKHVb^vkAbDYo1bx{m-4dbqKj@9#I}XC)j00Rz z8I|N4^$hfj?oxg2aiF6EV>HM`c`!ezc}{U&0KYr0M6F>s57OYwuWVJE@!!kGIiOz+ zoB;ZKQHs;}_Lihj;gch_oi9FTG#a9J&(BIvF6AAtCLldnL26BpN^Bs3tg@7j9Xoe8 zL|~_BiJ1#0%iZC?Q1mM(^44e^z~24@+shx2Q5X^{3j~7d_oG;u+CW<>0FwS+sXdDW@9&Mp; zy%{8Q?|dFdV*PpxMgz4po_TIh~%iuYj<4~_|76DjgTG#Q08DI(Y=Abjmvd4e`rCQi}z*KR>G(96h zBoU}MX^z&AE6!~`9u^qRG+zQJ7dfIVZ&YB}Sc@5&0pw9}`1-8OlU5O+WnvDR0kwo< z(Pm?nj6xVu1_jMTSsJ4-WI&-neElYN9)ASK;gE@fLh|;Z*m?X*IVR0{{Pba1CSg$5 zi6vt|Y-E^YFrCMvKzwZkn_G|MI1K0CC=7qQ5DUP}n4#yQ%VQk+^T?8Mhz+<54!U2u zBF14lADTWSM{y*^6N7S*V5^UnF%op=7KP(&v51d9I!2?tc6HijnpFylZR$ltSe3C> zy4pWRMxonnDz#TI8(Gbf;H&*o(O_QfSdPZ9LPcSCdo?UlTf=dnD~58>3?RGVYZ;n3 zNTde4wL?Q}S+MQTBC&kXbzVqIUdJFBJkA4`VFRhm(_BM*LBD@l&yi{)VY!z})*W)T zb$pD-5EaXy44=Rl4`TesEOJhHf;&!JdETh76StSSqVhMp0yxc?7$; zSMFp-O#TC-OqA6arG9<$c|zoU+rrlWtw&``%O-QldoC{61|$Sa(_$VzPW zXI2dKRIcuUv+O=LYj4aM)nnVs8#qqmntVFPF?RO4(F5o7^>V`*)wb_t>$pUj$ zns_7|7n}uvovt(HZvj5?BSy(09CGtE8?o zO56l}F=3jUa>V3se%>et^t%Tqg7t0YDAE1W>Fi}}zB|4FgN zQg1xiok*{-pbY7^ksk zKk9;LT6)&JM{#M4@$tMz@i9k?c-Q(zBxbE$=7h+hDNCVK4_NMfK+$T#sTZ+6s(pkS1o9jM_g}M9{TxW z;?C@z(sv0zFVO4mH>A6}Mi{|_G#}Xvowuk` z*3GThO(I{6k!U}0EfWJ`8CMGohL2j!FnlcoyU+1UF$#x|F3o_v$NM}n+%r}(09JBM zj7W3M%QPYQvW!3-EF~hq#_P2)0@H`4W*EMu}UPF8ap3wunJM0DpgDwHYtPJ1&z-;52F%JAgkn*r#-s8p? zi(y;B48q?!409TNb@W>?3Unb|A{J~dbrX#RtCN%UiCP4&ZjaX|x)l@`d^AB*{nqgi zq14-UvF}j7&2V<2(N4GBnAlLk7k{f3Eh#OM#!!6+L#2*-NRccRmBIVaw;8{yL4_>r zFj(GpkKOirvmTeaAk*aaV*q_U)xdyQlBjFTD(LNd9ABrgVWNVpO893()bfj5GU~6< z0kLdQ5uXHzZ;=oilMdK@0Y%~Z>sNo)^m0J^eF?20ikx=cn$g}Wqt!>7(~eezq^c!E zpxYlvXpPa}wBr@wiHi4RzPS8m-kvqDHM^ zbjFL84wo012m{DO|3`xb{Dk4!SRdUKHO8WDeSC7P(X2-k^?I!i@HSQ(6S^sn3 zr0B*P^=2)asE*frhUlw5?5(3;W)W_#Hm7=r=xueFr@xzHY)#a&j`R4TRYU92aWOEf zvTD(~+3>^YN_};=5b^ZCVz^r4ldVoYV*T55*ZS)X!S`#9ZvqzXQ!uAHjtp4y^&8da zjSpLu{-!X#VIx5A{uPJF8Q-!Je9JvW@s)=T>D}KJMQ2u?ckg05H1|?`wR*D-!P!W& zHM*%{noJ>lN5dcQJ{60fOrNfRKK)$|6+V$oC$`^9*xYvn&E4s(H^Vsty>svn61K)f zt-i$^Xw%*to*q>9NvI}U4cI}&R^R}uw2_J3PWwj*RkvLQ%Qr4cn68YVyvHMU!hAnP zRd0<&ux4tGP*mCk9tb9pGz4!%14#DEpR$M|J*4GB%QAUSBIgM90oRwOy@5F*&{Ws; zuLk@7GsD_$x7vyRjA+-J&}#FdmQtZ28K%_sU@!jsg|=s`G12I3)GHmXv@g>RFf0$` zv8X%vWn(eS`Sdl0zcMV%sbXsJ^|)AM{vbuNq27()jHuZdt#%u&3A(}IFkh{LCp1cX zc^O;5|4m>VX>>c$WW61As^gQ*y1}HdEf{alg5i3|f-7TQ<>Er3kH6!%bVtQ-dNn=! zR{uz_*@87?%>{=scV+!k#b+G`+YTkRAMq~*Wz?)sZ0LfAMYA)|F7_W6ViL2=hH{wA(c3!@h>1dt2Sz}X z|IuKz>M_lX7KywiBgW#tM-;@J#@1=^(io!u8WC+v|BSsX{HQ=Qy0JPjQEx`o4n31* zxf$AMd97@Qu(wZ{hEksLY!SQt?tdB7odVOZ@7TcbkRXm+Vl5_kJi65zk71{T-kcE_ z@OV$R-o6;qQkbA>HCydYWtHKiyUh6?yML!I#p9BUL=9g`MJjJ)y-+ya%=|@no9i-M;brfd;Cze5;ic0=)Q2W=q`0X7>Vwl;EZnDV8iY+-d#9uZ2K)nr~Kc>Aq|h?UPs zP}N6UwR!}n9}T)THBLG(B8Q^o#s#UjMTx|rj71HCMLj9SHVI+(^ymu72iz&e(;00y zCYhehs4zqK??Z#0hCxqHPH?rNdS|pc3HcMP8qe-zA4uh9>N59&uw9RxWn^16R;N1M z#^!o74wlx8I*_z5n(S9?Q;gW#B2SSpjyGyirvbyD)2+AbEinkTDK_lBwOu4^uV_v} zx7NqTqRDoBbUL*+Fk84ab>(y_*xpkGLg({(SRW4#X`f7sloYFopKzLkZvQcatfhAq z?QlN%wIm{Yqr)-}c2m%a$;06Y7~PEU_0<@{-BpCHnGqHx`XdxwtXe9)8SrU&gk>qR zKwk@YuHvM31n;5Zbk5+gsImY?5xT1w>Dy{g*I+D5nZA9Ft;+TkI5*ZC8#Y2B?Q@YqM- zg7no|1c|i5h_d?tR8`AM#AH|x(N~(Eonm5p{b@Q{W^V#8nU`qZy(e64W)(ztN%l<; zwPV};zJB){fo{CIg(n6{d(qxoa%CcWu8eG~4XK*bi44mqd7g}{IXN1& z+O>MyxY#h8nfGYKb_{3AsM?^c+Eld}O;+1owjod$q;H>MntOhNu{JjvrCIsXDp#bD z@T+TJFCTHQ-kQTu?I)q?OpV7KX)yj$cLlJu;|mg0^;)9}c`n^*v$Y|bm>M4eV?$hR zx&B`)9W$Pd?&R;EAZ(1+BX&S&4$w+Pg}oy7!W7lSv`d}i4N(WpV||f~4H7aNqxFtGP%Cd=AItnbSjNWEGT{WUUf;B) zIs&Od+cGM`eC{DKDwdYn!F*bYb0`*R_e-d#m$k;)<}UP}p|Ec*1_Z7+N5qN?3AcUc z^MN^HOI=-ko(6V5OW>N+FU;iwKruDI`JbA3DNHbmOGG>kqaSA4VffE@RN<{*Y#(&C zYfIKW4%#tGzaLP89+{K0!;*k)-U^`3VHM*paTfqPN1mHtZr3CDLUUua({ON~NO