From 5da815234c850dd1f1517e89854bbbed4eeb02e8 Mon Sep 17 00:00:00 2001 From: raysan5 Date: Mon, 26 Dec 2016 10:52:57 +0100 Subject: [PATCH] Improved FLAC audio support --- examples/resources/audio/tanatana.flac | Bin 0 -> 100733 bytes src/audio.c | 25 +- src/external/dr_flac.h | 323 +++++++++++++++++++------ 3 files changed, 255 insertions(+), 93 deletions(-) create mode 100644 examples/resources/audio/tanatana.flac diff --git a/examples/resources/audio/tanatana.flac b/examples/resources/audio/tanatana.flac new file mode 100644 index 0000000000000000000000000000000000000000..dfe735cd6ef0bd73fa8e1255a342eda578b3f196 GIT binary patch literal 100733 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 N$nd<&bCJ+={~t_wXpjH^ literal 0 HcmV?d00001 diff --git a/src/audio.c b/src/audio.c index 04ff90da4..3a4ca3dfa 100644 --- a/src/audio.c +++ b/src/audio.c @@ -593,6 +593,7 @@ Music LoadMusicStream(const char *fileName) music->ctxType = MUSIC_AUDIO_OGG; music->loop = true; // We loop by default + TraceLog(DEBUG, "[%s] FLAC total samples: %i", fileName, music->totalSamples); TraceLog(DEBUG, "[%s] OGG sample rate: %i", fileName, info.sample_rate); TraceLog(DEBUG, "[%s] OGG channels: %i", fileName, info.channels); TraceLog(DEBUG, "[%s] OGG memory required: %i", fileName, info.temp_memory_required); @@ -606,11 +607,12 @@ Music LoadMusicStream(const char *fileName) else { music->stream = InitAudioStream(music->ctxFlac->sampleRate, music->ctxFlac->bitsPerSample, music->ctxFlac->channels); - music->totalSamples = (unsigned int)music->ctxFlac->totalSampleCount; + music->totalSamples = (unsigned int)music->ctxFlac->totalSampleCount/music->ctxFlac->channels; music->samplesLeft = music->totalSamples; music->ctxType = MUSIC_AUDIO_FLAC; music->loop = true; // We loop by default + TraceLog(DEBUG, "[%s] FLAC total samples: %i", fileName, music->totalSamples); TraceLog(DEBUG, "[%s] FLAC sample rate: %i", fileName, music->ctxFlac->sampleRate); TraceLog(DEBUG, "[%s] FLAC bits per sample: %i", fileName, music->ctxFlac->bitsPerSample); TraceLog(DEBUG, "[%s] FLAC channels: %i", fileName, music->ctxFlac->channels); @@ -745,9 +747,7 @@ void UpdateMusicStream(Music music) case MUSIC_AUDIO_FLAC: { // NOTE: Returns the number of samples to process - unsigned int numSamplesFlac = (unsigned int)drflac_read_s32(music->ctxFlac, numSamples/2, (int *)pcm); - - // TODO: Samples should be provided as 16 bit instead of 32 bit! + unsigned int numSamplesFlac = (unsigned int)drflac_read_s16(music->ctxFlac, numSamples*music->stream.channels, (short *)pcm); } break; case MUSIC_MODULE_XM: jar_xm_generate_samples_16bit(music->ctxXm, pcm, numSamples); break; @@ -1145,21 +1145,14 @@ static Wave LoadFLAC(const char *fileName) // Decode an entire FLAC file in one go uint64_t totalSampleCount; - wave.data = drflac_open_and_decode_file_s32(fileName, &wave.channels, &wave.sampleRate, &totalSampleCount); + wave.data = drflac_open_and_decode_file_s16(fileName, &wave.channels, &wave.sampleRate, &totalSampleCount); - wave.sampleCount = (int)totalSampleCount; - wave.sampleSize = 32; // 32 bit per sample (float) - - // NOTE: By default, dr_flac returns 32bit float samples, needs to be converted to 16bit - WaveFormat(&wave, wave.sampleRate, 16, wave.channels); + wave.sampleCount = (int)totalSampleCount/wave.channels; + wave.sampleSize = 16; // NOTE: Only support up to 2 channels (mono, stereo) - if (wave.channels > 2) - { - WaveFormat(&wave, wave.sampleRate, wave.sampleSize, 2); - TraceLog(WARNING, "[%s] FLAC channels number (%i) not supported, converted to 2 channels", fileName, wave.channels); - } - + if (wave.channels > 2) TraceLog(WARNING, "[%s] FLAC channels number (%i) not supported", fileName, wave.channels); + if (wave.data == NULL) TraceLog(WARNING, "[%s] FLAC data could not be loaded", fileName); else TraceLog(INFO, "[%s] FLAC file loaded successfully (%i Hz, %i bit, %s)", fileName, wave.sampleRate, wave.sampleSize, (wave.channels == 1) ? "Mono" : "Stereo"); diff --git a/src/external/dr_flac.h b/src/external/dr_flac.h index d7b66f206..d2bebea5e 100644 --- a/src/external/dr_flac.h +++ b/src/external/dr_flac.h @@ -1,5 +1,5 @@ // FLAC audio decoder. Public domain. See "unlicense" statement at the end of this file. -// dr_flac - v0.4 - 2016-09-29 +// dr_flac - v0.4c - 2016-12-26 // // David Reid - mackron@gmail.com @@ -105,18 +105,32 @@ #include #include -#ifndef DR_BOOL_DEFINED -#define DR_BOOL_DEFINED -#ifdef _WIN32 -typedef char drBool8; -typedef int drBool32; +#ifndef DR_SIZED_TYPES_DEFINED +#define DR_SIZED_TYPES_DEFINED +#if defined(_MSC_VER) && _MSC_VER < 1600 +typedef signed char dr_int8; +typedef unsigned char dr_uint8; +typedef signed short dr_int16; +typedef unsigned short dr_uint16; +typedef signed int dr_int32; +typedef unsigned int dr_uint32; +typedef signed __int64 dr_int64; +typedef unsigned __int64 dr_uint64; #else #include -typedef int8_t drBool8; -typedef int32_t drBool32; +typedef int8_t dr_int8; +typedef uint8_t dr_uint8; +typedef int16_t dr_int16; +typedef uint16_t dr_uint16; +typedef int32_t dr_int32; +typedef uint32_t dr_uint32; +typedef int64_t dr_int64; +typedef uint64_t dr_uint64; #endif -#define DR_TRUE 1 -#define DR_FALSE 0 +typedef dr_int8 dr_bool8; +typedef dr_int32 dr_bool32; +#define DR_TRUE 1 +#define DR_FALSE 0 #endif // As data is read from the client it is placed into an internal buffer for fast access. This controls the @@ -262,7 +276,7 @@ typedef struct { char catalog[128]; uint64_t leadInSampleCount; - drBool32 isCD; + dr_bool32 isCD; uint8_t trackCount; const uint8_t* pTrackData; } cuesheet; @@ -305,7 +319,7 @@ typedef size_t (* drflac_read_proc)(void* pUserData, void* pBufferOut, size_t by // // The offset will never be negative. Whether or not it is relative to the beginning or current position is determined // by the "origin" parameter which will be either drflac_seek_origin_start or drflac_seek_origin_current. -typedef drBool32 (* drflac_seek_proc)(void* pUserData, int offset, drflac_seek_origin origin); +typedef dr_bool32 (* drflac_seek_proc)(void* pUserData, int offset, drflac_seek_origin origin); // Callback for when a metadata block is read. // @@ -546,6 +560,10 @@ void drflac_close(drflac* pFlac); // seeked. uint64_t drflac_read_s32(drflac* pFlac, uint64_t samplesToRead, int32_t* pBufferOut); +// Same as drflac_read_s32(), except outputs samples as 16-bit integer PCM rather than 32-bit. Note +// that this is lossey. +uint64_t drflac_read_s16(drflac* pFlac, uint64_t samplesToRead, int16_t* pBufferOut); + // Seeks to the sample at the given index. // // pFlac [in] The decoder. @@ -558,7 +576,7 @@ uint64_t drflac_read_s32(drflac* pFlac, uint64_t samplesToRead, int32_t* pBuffer // // When seeking, you will likely want to ensure it's rounded to a multiple of the channel count. You can do this with // something like drflac_seek_to_sample(pFlac, (mySampleIndex + (mySampleIndex % pFlac->channels))) -drBool32 drflac_seek_to_sample(drflac* pFlac, uint64_t sampleIndex); +dr_bool32 drflac_seek_to_sample(drflac* pFlac, uint64_t sampleIndex); @@ -607,14 +625,17 @@ drflac* drflac_open_memory_with_metadata(const void* data, size_t dataSize, drfl // // Do not call this function on a broadcast type of stream (like internet radio streams and whatnot). int32_t* drflac_open_and_decode_s32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, uint64_t* totalSampleCount); +int16_t* drflac_open_and_decode_s16(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, uint64_t* totalSampleCount); #ifndef DR_FLAC_NO_STDIO // Same as drflac_open_and_decode_s32() except opens the decoder from a file. int32_t* drflac_open_and_decode_file_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, uint64_t* totalSampleCount); +int16_t* drflac_open_and_decode_file_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, uint64_t* totalSampleCount); #endif // Same as drflac_open_and_decode_s32() except opens the decoder from a block of memory. int32_t* drflac_open_and_decode_memory_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, uint64_t* totalSampleCount); +int16_t* drflac_open_and_decode_memory_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, uint64_t* totalSampleCount); // Frees data returned by drflac_open_and_decode_*(). void drflac_free(void* pSampleDataReturnedByOpenAndDecode); @@ -684,7 +705,7 @@ const char* drflac_next_vorbis_comment(drflac_vorbis_comment_iterator* pIter, ui //// Endian Management //// -static DRFLAC_INLINE drBool32 drflac__is_little_endian() +static DRFLAC_INLINE dr_bool32 drflac__is_little_endian() { int n = 1; return (*(char*)&n) == 1; @@ -817,7 +838,7 @@ static DRFLAC_INLINE uint32_t drflac__le2host_32(uint32_t n) #define DRFLAC_CACHE_L2_LINE_COUNT(bs) (DRFLAC_CACHE_L2_SIZE_BYTES(bs) / sizeof((bs)->cacheL2[0])) #define DRFLAC_CACHE_L2_LINES_REMAINING(bs) (DRFLAC_CACHE_L2_LINE_COUNT(bs) - (bs)->nextL2Line) -static DRFLAC_INLINE drBool32 drflac__reload_l1_cache_from_l2(drflac_bs* bs) +static DRFLAC_INLINE dr_bool32 drflac__reload_l1_cache_from_l2(drflac_bs* bs) { // Fast path. Try loading straight from L2. if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { @@ -871,7 +892,7 @@ static DRFLAC_INLINE drBool32 drflac__reload_l1_cache_from_l2(drflac_bs* bs) } } -static drBool32 drflac__reload_cache(drflac_bs* bs) +static dr_bool32 drflac__reload_cache(drflac_bs* bs) { // Fast path. Try just moving the next value in the L2 cache to the L1 cache. if (drflac__reload_l1_cache_from_l2(bs)) { @@ -907,7 +928,7 @@ static void drflac__reset_cache(drflac_bs* bs) bs->unalignedCache = 0; } -static drBool32 drflac__seek_bits(drflac_bs* bs, size_t bitsToSeek) +static dr_bool32 drflac__seek_bits(drflac_bs* bs, size_t bitsToSeek) { if (bitsToSeek <= DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { bs->consumedBits += bitsToSeek; @@ -958,7 +979,7 @@ static drBool32 drflac__seek_bits(drflac_bs* bs, size_t bitsToSeek) } } -static drBool32 drflac__read_uint32(drflac_bs* bs, unsigned int bitCount, uint32_t* pResultOut) +static dr_bool32 drflac__read_uint32(drflac_bs* bs, unsigned int bitCount, uint32_t* pResultOut) { assert(bs != NULL); assert(pResultOut != NULL); @@ -999,7 +1020,7 @@ static drBool32 drflac__read_uint32(drflac_bs* bs, unsigned int bitCount, uint32 } } -static drBool32 drflac__read_int32(drflac_bs* bs, unsigned int bitCount, int32_t* pResult) +static dr_bool32 drflac__read_int32(drflac_bs* bs, unsigned int bitCount, int32_t* pResult) { assert(bs != NULL); assert(pResult != NULL); @@ -1018,7 +1039,7 @@ static drBool32 drflac__read_int32(drflac_bs* bs, unsigned int bitCount, int32_t return DR_TRUE; } -static drBool32 drflac__read_uint64(drflac_bs* bs, unsigned int bitCount, uint64_t* pResultOut) +static dr_bool32 drflac__read_uint64(drflac_bs* bs, unsigned int bitCount, uint64_t* pResultOut) { assert(bitCount <= 64); assert(bitCount > 32); @@ -1039,7 +1060,7 @@ static drBool32 drflac__read_uint64(drflac_bs* bs, unsigned int bitCount, uint64 // Function below is unused, but leaving it here in case I need to quickly add it again. #if 0 -static drBool32 drflac__read_int64(drflac_bs* bs, unsigned int bitCount, int64_t* pResultOut) +static dr_bool32 drflac__read_int64(drflac_bs* bs, unsigned int bitCount, int64_t* pResultOut) { assert(bitCount <= 64); @@ -1056,7 +1077,7 @@ static drBool32 drflac__read_int64(drflac_bs* bs, unsigned int bitCount, int64_t } #endif -static drBool32 drflac__read_uint16(drflac_bs* bs, unsigned int bitCount, uint16_t* pResult) +static dr_bool32 drflac__read_uint16(drflac_bs* bs, unsigned int bitCount, uint16_t* pResult) { assert(bs != NULL); assert(pResult != NULL); @@ -1072,7 +1093,7 @@ static drBool32 drflac__read_uint16(drflac_bs* bs, unsigned int bitCount, uint16 return DR_TRUE; } -static drBool32 drflac__read_int16(drflac_bs* bs, unsigned int bitCount, int16_t* pResult) +static dr_bool32 drflac__read_int16(drflac_bs* bs, unsigned int bitCount, int16_t* pResult) { assert(bs != NULL); assert(pResult != NULL); @@ -1088,7 +1109,7 @@ static drBool32 drflac__read_int16(drflac_bs* bs, unsigned int bitCount, int16_t return DR_TRUE; } -static drBool32 drflac__read_uint8(drflac_bs* bs, unsigned int bitCount, uint8_t* pResult) +static dr_bool32 drflac__read_uint8(drflac_bs* bs, unsigned int bitCount, uint8_t* pResult) { assert(bs != NULL); assert(pResult != NULL); @@ -1104,7 +1125,7 @@ static drBool32 drflac__read_uint8(drflac_bs* bs, unsigned int bitCount, uint8_t return DR_TRUE; } -static drBool32 drflac__read_int8(drflac_bs* bs, unsigned int bitCount, int8_t* pResult) +static dr_bool32 drflac__read_int8(drflac_bs* bs, unsigned int bitCount, int8_t* pResult) { assert(bs != NULL); assert(pResult != NULL); @@ -1121,7 +1142,7 @@ static drBool32 drflac__read_int8(drflac_bs* bs, unsigned int bitCount, int8_t* } -static inline drBool32 drflac__seek_past_next_set_bit(drflac_bs* bs, unsigned int* pOffsetOut) +static inline dr_bool32 drflac__seek_past_next_set_bit(drflac_bs* bs, unsigned int* pOffsetOut) { unsigned int zeroCounter = 0; while (bs->cache == 0) { @@ -1169,7 +1190,7 @@ static inline drBool32 drflac__seek_past_next_set_bit(drflac_bs* bs, unsigned in -static drBool32 drflac__seek_to_byte(drflac_bs* bs, uint64_t offsetFromStart) +static dr_bool32 drflac__seek_to_byte(drflac_bs* bs, uint64_t offsetFromStart) { assert(bs != NULL); assert(offsetFromStart > 0); @@ -1214,7 +1235,7 @@ static drBool32 drflac__seek_to_byte(drflac_bs* bs, uint64_t offsetFromStart) } -static drBool32 drflac__read_utf8_coded_number(drflac_bs* bs, uint64_t* pNumberOut) +static dr_bool32 drflac__read_utf8_coded_number(drflac_bs* bs, uint64_t* pNumberOut) { assert(bs != NULL); assert(pNumberOut != NULL); @@ -1267,7 +1288,7 @@ static drBool32 drflac__read_utf8_coded_number(drflac_bs* bs, uint64_t* pNumberO -static DRFLAC_INLINE drBool32 drflac__read_and_seek_rice(drflac_bs* bs, uint8_t m) +static DRFLAC_INLINE dr_bool32 drflac__read_and_seek_rice(drflac_bs* bs, uint8_t m) { unsigned int unused; if (!drflac__seek_past_next_set_bit(bs, &unused)) { @@ -1520,7 +1541,7 @@ static DRFLAC_INLINE int32_t drflac__calculate_prediction_64(uint32_t order, int // iteration. The prediction is done at the end, and there's an annoying branch I'd like to avoid so the main function is defined // as a #define - sue me! #define DRFLAC__DECODE_SAMPLES_WITH_RESIDULE__RICE__PROC(funcName, predictionFunc) \ -static drBool32 funcName (drflac_bs* bs, uint32_t count, uint8_t riceParam, uint32_t order, int32_t shift, const int16_t* coefficients, int32_t* pSamplesOut) \ +static dr_bool32 funcName (drflac_bs* bs, uint32_t count, uint8_t riceParam, uint32_t order, int32_t shift, const int16_t* coefficients, int32_t* pSamplesOut) \ { \ assert(bs != NULL); \ assert(count > 0); \ @@ -1630,7 +1651,7 @@ DRFLAC__DECODE_SAMPLES_WITH_RESIDULE__RICE__PROC(drflac__decode_samples_with_res // Reads and seeks past a string of residual values as Rice codes. The decoder should be sitting on the first bit of the Rice codes. -static drBool32 drflac__read_and_seek_residual__rice(drflac_bs* bs, uint32_t count, uint8_t riceParam) +static dr_bool32 drflac__read_and_seek_residual__rice(drflac_bs* bs, uint32_t count, uint8_t riceParam) { assert(bs != NULL); assert(count > 0); @@ -1644,7 +1665,7 @@ static drBool32 drflac__read_and_seek_residual__rice(drflac_bs* bs, uint32_t cou return DR_TRUE; } -static drBool32 drflac__decode_samples_with_residual__unencoded(drflac_bs* bs, uint32_t bitsPerSample, uint32_t count, uint8_t unencodedBitsPerSample, uint32_t order, int32_t shift, const int16_t* coefficients, int32_t* pSamplesOut) +static dr_bool32 drflac__decode_samples_with_residual__unencoded(drflac_bs* bs, uint32_t bitsPerSample, uint32_t count, uint8_t unencodedBitsPerSample, uint32_t order, int32_t shift, const int16_t* coefficients, int32_t* pSamplesOut) { assert(bs != NULL); assert(count > 0); @@ -1671,7 +1692,7 @@ static drBool32 drflac__decode_samples_with_residual__unencoded(drflac_bs* bs, u // Reads and decodes the residual for the sub-frame the decoder is currently sitting on. This function should be called // when the decoder is sitting at the very start of the RESIDUAL block. The first residuals will be ignored. The // and parameters are used to determine how many residual values need to be decoded. -static drBool32 drflac__decode_samples_with_residual(drflac_bs* bs, uint32_t bitsPerSample, uint32_t blockSize, uint32_t order, int32_t shift, const int16_t* coefficients, int32_t* pDecodedSamples) +static dr_bool32 drflac__decode_samples_with_residual(drflac_bs* bs, uint32_t bitsPerSample, uint32_t blockSize, uint32_t order, int32_t shift, const int16_t* coefficients, int32_t* pDecodedSamples) { assert(bs != NULL); assert(blockSize != 0); @@ -1755,7 +1776,7 @@ static drBool32 drflac__decode_samples_with_residual(drflac_bs* bs, uint32_t bit // Reads and seeks past the residual for the sub-frame the decoder is currently sitting on. This function should be called // when the decoder is sitting at the very start of the RESIDUAL block. The first residuals will be set to 0. The // and parameters are used to determine how many residual values need to be decoded. -static drBool32 drflac__read_and_seek_residual(drflac_bs* bs, uint32_t blockSize, uint32_t order) +static dr_bool32 drflac__read_and_seek_residual(drflac_bs* bs, uint32_t blockSize, uint32_t order) { assert(bs != NULL); assert(blockSize != 0); @@ -1823,7 +1844,7 @@ static drBool32 drflac__read_and_seek_residual(drflac_bs* bs, uint32_t blockSize } -static drBool32 drflac__decode_samples__constant(drflac_bs* bs, uint32_t blockSize, uint32_t bitsPerSample, int32_t* pDecodedSamples) +static dr_bool32 drflac__decode_samples__constant(drflac_bs* bs, uint32_t blockSize, uint32_t bitsPerSample, int32_t* pDecodedSamples) { // Only a single sample needs to be decoded here. int32_t sample; @@ -1840,7 +1861,7 @@ static drBool32 drflac__decode_samples__constant(drflac_bs* bs, uint32_t blockSi return DR_TRUE; } -static drBool32 drflac__decode_samples__verbatim(drflac_bs* bs, uint32_t blockSize, uint32_t bitsPerSample, int32_t* pDecodedSamples) +static dr_bool32 drflac__decode_samples__verbatim(drflac_bs* bs, uint32_t blockSize, uint32_t bitsPerSample, int32_t* pDecodedSamples) { for (uint32_t i = 0; i < blockSize; ++i) { int32_t sample; @@ -1854,7 +1875,7 @@ static drBool32 drflac__decode_samples__verbatim(drflac_bs* bs, uint32_t blockSi return DR_TRUE; } -static drBool32 drflac__decode_samples__fixed(drflac_bs* bs, uint32_t blockSize, uint32_t bitsPerSample, uint8_t lpcOrder, int32_t* pDecodedSamples) +static dr_bool32 drflac__decode_samples__fixed(drflac_bs* bs, uint32_t blockSize, uint32_t bitsPerSample, uint8_t lpcOrder, int32_t* pDecodedSamples) { short lpcCoefficientsTable[5][4] = { {0, 0, 0, 0}, @@ -1882,7 +1903,7 @@ static drBool32 drflac__decode_samples__fixed(drflac_bs* bs, uint32_t blockSize, return DR_TRUE; } -static drBool32 drflac__decode_samples__lpc(drflac_bs* bs, uint32_t blockSize, uint32_t bitsPerSample, uint8_t lpcOrder, int32_t* pDecodedSamples) +static dr_bool32 drflac__decode_samples__lpc(drflac_bs* bs, uint32_t blockSize, uint32_t bitsPerSample, uint8_t lpcOrder, int32_t* pDecodedSamples) { // Warm up samples. for (uint8_t i = 0; i < lpcOrder; ++i) { @@ -1925,7 +1946,7 @@ static drBool32 drflac__decode_samples__lpc(drflac_bs* bs, uint32_t blockSize, u } -static drBool32 drflac__read_next_frame_header(drflac_bs* bs, uint8_t streaminfoBitsPerSample, drflac_frame_header* header) +static dr_bool32 drflac__read_next_frame_header(drflac_bs* bs, uint8_t streaminfoBitsPerSample, drflac_frame_header* header) { assert(bs != NULL); assert(header != NULL); @@ -1983,7 +2004,7 @@ static drBool32 drflac__read_next_frame_header(drflac_bs* bs, uint8_t streaminfo } - drBool32 isVariableBlockSize = blockingStrategy == 1; + dr_bool32 isVariableBlockSize = blockingStrategy == 1; if (isVariableBlockSize) { uint64_t sampleNumber; if (!drflac__read_utf8_coded_number(bs, &sampleNumber)) { @@ -2055,7 +2076,7 @@ static drBool32 drflac__read_next_frame_header(drflac_bs* bs, uint8_t streaminfo return DR_TRUE; } -static drBool32 drflac__read_subframe_header(drflac_bs* bs, drflac_subframe* pSubframe) +static dr_bool32 drflac__read_subframe_header(drflac_bs* bs, drflac_subframe* pSubframe) { uint8_t header; if (!drflac__read_uint8(bs, 8, &header)) { @@ -2105,7 +2126,7 @@ static drBool32 drflac__read_subframe_header(drflac_bs* bs, drflac_subframe* pSu return DR_TRUE; } -static drBool32 drflac__decode_subframe(drflac_bs* bs, drflac_frame* frame, int subframeIndex, int32_t* pDecodedSamplesOut) +static dr_bool32 drflac__decode_subframe(drflac_bs* bs, drflac_frame* frame, int subframeIndex, int32_t* pDecodedSamplesOut) { assert(bs != NULL); assert(frame != NULL); @@ -2155,7 +2176,7 @@ static drBool32 drflac__decode_subframe(drflac_bs* bs, drflac_frame* frame, int return DR_TRUE; } -static drBool32 drflac__seek_subframe(drflac_bs* bs, drflac_frame* frame, int subframeIndex) +static dr_bool32 drflac__seek_subframe(drflac_bs* bs, drflac_frame* frame, int subframeIndex) { assert(bs != NULL); assert(frame != NULL); @@ -2249,7 +2270,7 @@ static DRFLAC_INLINE uint8_t drflac__get_channel_count_from_channel_assignment(i return lookup[channelAssignment]; } -static drBool32 drflac__decode_frame(drflac* pFlac) +static dr_bool32 drflac__decode_frame(drflac* pFlac) { // This function should be called while the stream is sitting on the first byte after the frame header. memset(pFlac->currentFrame.subframes, 0, sizeof(pFlac->currentFrame.subframes)); @@ -2273,7 +2294,7 @@ static drBool32 drflac__decode_frame(drflac* pFlac) return DR_TRUE; } -static drBool32 drflac__seek_frame(drflac* pFlac) +static dr_bool32 drflac__seek_frame(drflac* pFlac) { int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFrame.header.channelAssignment); for (int i = 0; i < channelCount; ++i) @@ -2287,7 +2308,7 @@ static drBool32 drflac__seek_frame(drflac* pFlac) return drflac__seek_bits(&pFlac->bs, (DRFLAC_CACHE_L1_BITS_REMAINING(&pFlac->bs) & 7) + 16); } -static drBool32 drflac__read_and_decode_next_frame(drflac* pFlac) +static dr_bool32 drflac__read_and_decode_next_frame(drflac* pFlac) { assert(pFlac != NULL); @@ -2324,24 +2345,24 @@ static void drflac__get_current_frame_sample_range(drflac* pFlac, uint64_t* pFir } } -static drBool32 drflac__seek_to_first_frame(drflac* pFlac) +static dr_bool32 drflac__seek_to_first_frame(drflac* pFlac) { assert(pFlac != NULL); - drBool32 result = drflac__seek_to_byte(&pFlac->bs, pFlac->firstFramePos); + dr_bool32 result = drflac__seek_to_byte(&pFlac->bs, pFlac->firstFramePos); memset(&pFlac->currentFrame, 0, sizeof(pFlac->currentFrame)); return result; } -static DRFLAC_INLINE drBool32 drflac__seek_to_next_frame(drflac* pFlac) +static DRFLAC_INLINE dr_bool32 drflac__seek_to_next_frame(drflac* pFlac) { // This function should only ever be called while the decoder is sitting on the first byte past the FRAME_HEADER section. assert(pFlac != NULL); return drflac__seek_frame(pFlac); } -static drBool32 drflac__seek_to_frame_containing_sample(drflac* pFlac, uint64_t sampleIndex) +static dr_bool32 drflac__seek_to_frame_containing_sample(drflac* pFlac, uint64_t sampleIndex) { assert(pFlac != NULL); @@ -2372,7 +2393,7 @@ static drBool32 drflac__seek_to_frame_containing_sample(drflac* pFlac, uint64_t return DR_TRUE; } -static drBool32 drflac__seek_to_sample__brute_force(drflac* pFlac, uint64_t sampleIndex) +static dr_bool32 drflac__seek_to_sample__brute_force(drflac* pFlac, uint64_t sampleIndex) { if (!drflac__seek_to_frame_containing_sample(pFlac, sampleIndex)) { return DR_FALSE; @@ -2398,7 +2419,7 @@ static drBool32 drflac__seek_to_sample__brute_force(drflac* pFlac, uint64_t samp } -static drBool32 drflac__seek_to_sample__seek_table(drflac* pFlac, uint64_t sampleIndex) +static dr_bool32 drflac__seek_to_sample__seek_table(drflac* pFlac, uint64_t sampleIndex) { assert(pFlac != NULL); @@ -2508,7 +2529,7 @@ typedef struct uint64_t totalSampleCount; uint16_t maxBlockSize; uint64_t runningFilePos; - drBool32 hasMetadataBlocks; + dr_bool32 hasMetadataBlocks; #ifndef DR_FLAC_NO_OGG uint32_t oggSerial; @@ -2525,7 +2546,7 @@ static DRFLAC_INLINE void drflac__decode_block_header(uint32_t blockHeader, uint *blockSize = (blockHeader & 0xFFFFFF); } -static DRFLAC_INLINE drBool32 drflac__read_and_decode_block_header(drflac_read_proc onRead, void* pUserData, uint8_t* isLastBlock, uint8_t* blockType, uint32_t* blockSize) +static DRFLAC_INLINE dr_bool32 drflac__read_and_decode_block_header(drflac_read_proc onRead, void* pUserData, uint8_t* isLastBlock, uint8_t* blockType, uint32_t* blockSize) { uint32_t blockHeader; if (onRead(pUserData, &blockHeader, 4) != 4) { @@ -2536,7 +2557,7 @@ static DRFLAC_INLINE drBool32 drflac__read_and_decode_block_header(drflac_read_p return DR_TRUE; } -drBool32 drflac__read_streaminfo(drflac_read_proc onRead, void* pUserData, drflac_streaminfo* pStreamInfo) +dr_bool32 drflac__read_streaminfo(drflac_read_proc onRead, void* pUserData, drflac_streaminfo* pStreamInfo) { // min/max block size. uint32_t blockSizes; @@ -2579,7 +2600,7 @@ drBool32 drflac__read_streaminfo(drflac_read_proc onRead, void* pUserData, drfla return DR_TRUE; } -drBool32 drflac__read_and_decode_metadata(drflac* pFlac) +dr_bool32 drflac__read_and_decode_metadata(drflac* pFlac) { assert(pFlac != NULL); @@ -2823,7 +2844,7 @@ drBool32 drflac__read_and_decode_metadata(drflac* pFlac) return DR_TRUE; } -drBool32 drflac__init_private__native(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD) +dr_bool32 drflac__init_private__native(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD) { (void)onSeek; @@ -2869,7 +2890,7 @@ drBool32 drflac__init_private__native(drflac_init_info* pInit, drflac_read_proc } #ifndef DR_FLAC_NO_OGG -static DRFLAC_INLINE drBool32 drflac_ogg__is_capture_pattern(uint8_t pattern[4]) +static DRFLAC_INLINE dr_bool32 drflac_ogg__is_capture_pattern(uint8_t pattern[4]) { return pattern[0] == 'O' && pattern[1] == 'g' && pattern[2] == 'g' && pattern[3] == 'S'; } @@ -2889,7 +2910,7 @@ static DRFLAC_INLINE uint32_t drflac_ogg__get_page_body_size(drflac_ogg_page_hea return pageBodySize; } -drBool32 drflac_ogg__read_page_header_after_capture_pattern(drflac_read_proc onRead, void* pUserData, drflac_ogg_page_header* pHeader, uint32_t* pHeaderSize) +dr_bool32 drflac_ogg__read_page_header_after_capture_pattern(drflac_read_proc onRead, void* pUserData, drflac_ogg_page_header* pHeader, uint32_t* pHeaderSize) { if (onRead(pUserData, &pHeader->structureVersion, 1) != 1 || pHeader->structureVersion != 0) { return DR_FALSE; // Unknown structure version. Possibly corrupt stream. @@ -2920,7 +2941,7 @@ drBool32 drflac_ogg__read_page_header_after_capture_pattern(drflac_read_proc onR return DR_TRUE; } -drBool32 drflac_ogg__read_page_header(drflac_read_proc onRead, void* pUserData, drflac_ogg_page_header* pHeader, uint32_t* pHeaderSize) +dr_bool32 drflac_ogg__read_page_header(drflac_read_proc onRead, void* pUserData, drflac_ogg_page_header* pHeader, uint32_t* pHeaderSize) { uint8_t id[4]; if (onRead(pUserData, id, 4) != 4) { @@ -2961,7 +2982,7 @@ static size_t drflac_oggbs__read_physical(drflac_oggbs* oggbs, void* bufferOut, return bytesActuallyRead; } -static drBool32 drflac_oggbs__seek_physical(drflac_oggbs* oggbs, uint64_t offset, drflac_seek_origin origin) +static dr_bool32 drflac_oggbs__seek_physical(drflac_oggbs* oggbs, uint64_t offset, drflac_seek_origin origin) { if (origin == drflac_seek_origin_start) { @@ -3000,7 +3021,7 @@ static drBool32 drflac_oggbs__seek_physical(drflac_oggbs* oggbs, uint64_t offset } } -static drBool32 drflac_oggbs__goto_next_page(drflac_oggbs* oggbs) +static dr_bool32 drflac_oggbs__goto_next_page(drflac_oggbs* oggbs) { drflac_ogg_page_header header; for (;;) @@ -3049,12 +3070,12 @@ static uint8_t drflac_oggbs__get_current_segment_index(drflac_oggbs* oggbs, uint return iSeg; } -static drBool32 drflac_oggbs__seek_to_next_packet(drflac_oggbs* oggbs) +static dr_bool32 drflac_oggbs__seek_to_next_packet(drflac_oggbs* oggbs) { // The current packet ends when we get to the segment with a lacing value of < 255 which is not at the end of a page. for (;;) // <-- Loop over pages. { - drBool32 atEndOfPage = DR_FALSE; + dr_bool32 atEndOfPage = DR_FALSE; uint8_t bytesRemainingInSeg; uint8_t iFirstSeg = drflac_oggbs__get_current_segment_index(oggbs, &bytesRemainingInSeg); @@ -3099,7 +3120,7 @@ static drBool32 drflac_oggbs__seek_to_next_packet(drflac_oggbs* oggbs) } } -static drBool32 drflac_oggbs__seek_to_next_frame(drflac_oggbs* oggbs) +static dr_bool32 drflac_oggbs__seek_to_next_frame(drflac_oggbs* oggbs) { // The bitstream should be sitting on the first byte just after the header of the frame. @@ -3148,7 +3169,7 @@ static size_t drflac__on_read_ogg(void* pUserData, void* bufferOut, size_t bytes return bytesRead; } -static drBool32 drflac__on_seek_ogg(void* pUserData, int offset, drflac_seek_origin origin) +static dr_bool32 drflac__on_seek_ogg(void* pUserData, int offset, drflac_seek_origin origin) { drflac_oggbs* oggbs = (drflac_oggbs*)pUserData; assert(oggbs != NULL); @@ -3204,7 +3225,7 @@ static drBool32 drflac__on_seek_ogg(void* pUserData, int offset, drflac_seek_ori return DR_TRUE; } -drBool32 drflac_ogg__seek_to_sample(drflac* pFlac, uint64_t sample) +dr_bool32 drflac_ogg__seek_to_sample(drflac* pFlac, uint64_t sample) { drflac_oggbs* oggbs = (drflac_oggbs*)(((int32_t*)pFlac->pExtraData) + pFlac->maxBlockSize*pFlac->channels); @@ -3327,7 +3348,7 @@ drBool32 drflac_ogg__seek_to_sample(drflac* pFlac, uint64_t sample) } -drBool32 drflac__init_private__ogg(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD) +dr_bool32 drflac__init_private__ogg(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD) { // Pre: The bit stream should be sitting just past the 4-byte OggS capture pattern. @@ -3491,7 +3512,7 @@ drBool32 drflac__init_private__ogg(drflac_init_info* pInit, drflac_read_proc onR } #endif -drBool32 drflac__init_private(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD) +dr_bool32 drflac__init_private(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD) { if (pInit == NULL || onRead == NULL || onSeek == NULL) { return DR_FALSE; @@ -3610,7 +3631,7 @@ static size_t drflac__on_read_stdio(void* pUserData, void* bufferOut, size_t byt return fread(bufferOut, 1, bytesToRead, (FILE*)pUserData); } -static drBool32 drflac__on_seek_stdio(void* pUserData, int offset, drflac_seek_origin origin) +static dr_bool32 drflac__on_seek_stdio(void* pUserData, int offset, drflac_seek_origin origin) { assert(offset > 0 || (offset == 0 && origin == drflac_seek_origin_start)); @@ -3651,7 +3672,7 @@ static size_t drflac__on_read_stdio(void* pUserData, void* bufferOut, size_t byt return (size_t)bytesRead; } -static drBool32 drflac__on_seek_stdio(void* pUserData, int offset, drflac_seek_origin origin) +static dr_bool32 drflac__on_seek_stdio(void* pUserData, int offset, drflac_seek_origin origin) { assert(offset > 0 || (offset == 0 && origin == drflac_seek_origin_start)); @@ -3727,7 +3748,7 @@ static size_t drflac__on_read_memory(void* pUserData, void* bufferOut, size_t by return bytesToRead; } -static drBool32 drflac__on_seek_memory(void* pUserData, int offset, drflac_seek_origin origin) +static dr_bool32 drflac__on_seek_memory(void* pUserData, int offset, drflac_seek_origin origin) { drflac__memory_stream* memoryStream = (drflac__memory_stream*)pUserData; assert(memoryStream != NULL); @@ -4107,7 +4128,32 @@ uint64_t drflac_read_s32(drflac* pFlac, uint64_t samplesToRead, int32_t* bufferO return samplesRead; } -drBool32 drflac_seek_to_sample(drflac* pFlac, uint64_t sampleIndex) +uint64_t drflac_read_s16(drflac* pFlac, uint64_t samplesToRead, int16_t* pBufferOut) +{ + // This reads samples in 2 passes and can probably be optimized. + uint64_t samplesRead = 0; + + while (samplesToRead > 0) { + int32_t samples32[4096]; + uint64_t samplesJustRead = drflac_read_s32(pFlac, samplesToRead > 4096 ? 4096 : samplesToRead, samples32); + if (samplesJustRead == 0) { + break; // Reached the end. + } + + // s32 -> s16 + for (uint64_t i = 0; i < samplesJustRead; ++i) { + pBufferOut[i] = (int16_t)(samples32[i] >> 16); + } + + samplesRead += samplesJustRead; + samplesToRead -= samplesJustRead; + pBufferOut += samplesJustRead; + } + + return samplesRead; +} + +dr_bool32 drflac_seek_to_sample(drflac* pFlac, uint64_t sampleIndex) { if (pFlac == NULL) { return DR_FALSE; @@ -4147,7 +4193,7 @@ drBool32 drflac_seek_to_sample(drflac* pFlac, uint64_t sampleIndex) //// High Level APIs //// -int32_t* drflac__full_decode_and_close(drflac* pFlac, unsigned int* channelsOut, unsigned int* sampleRateOut, uint64_t* totalSampleCountOut) +int32_t* drflac__full_decode_and_close_s32(drflac* pFlac, unsigned int* channelsOut, unsigned int* sampleRateOut, uint64_t* totalSampleCountOut) { assert(pFlac != NULL); @@ -4218,6 +4264,77 @@ on_error: return NULL; } +int16_t* drflac__full_decode_and_close_s16(drflac* pFlac, unsigned int* channelsOut, unsigned int* sampleRateOut, uint64_t* totalSampleCountOut) +{ + assert(pFlac != NULL); + + int16_t* pSampleData = NULL; + uint64_t totalSampleCount = pFlac->totalSampleCount; + + if (totalSampleCount == 0) + { + int16_t buffer[4096]; + + size_t sampleDataBufferSize = sizeof(buffer); + pSampleData = (int16_t*)malloc(sampleDataBufferSize); + if (pSampleData == NULL) { + goto on_error; + } + + uint64_t samplesRead; + while ((samplesRead = (uint64_t)drflac_read_s16(pFlac, sizeof(buffer)/sizeof(buffer[0]), buffer)) > 0) + { + if (((totalSampleCount + samplesRead) * sizeof(int16_t)) > sampleDataBufferSize) { + sampleDataBufferSize *= 2; + int16_t* pNewSampleData = (int16_t*)realloc(pSampleData, sampleDataBufferSize); + if (pNewSampleData == NULL) { + free(pSampleData); + goto on_error; + } + + pSampleData = pNewSampleData; + } + + memcpy(pSampleData + totalSampleCount, buffer, (size_t)(samplesRead*sizeof(int16_t))); + totalSampleCount += samplesRead; + } + + // At this point everything should be decoded, but we just want to fill the unused part buffer with silence - need to + // protect those ears from random noise! + memset(pSampleData + totalSampleCount, 0, (size_t)(sampleDataBufferSize - totalSampleCount*sizeof(int16_t))); + } + else + { + uint64_t dataSize = totalSampleCount * sizeof(int16_t); + if (dataSize > SIZE_MAX) { + goto on_error; // The decoded data is too big. + } + + pSampleData = (int16_t*)malloc((size_t)dataSize); // <-- Safe cast as per the check above. + if (pSampleData == NULL) { + goto on_error; + } + + uint64_t samplesDecoded = drflac_read_s16(pFlac, pFlac->totalSampleCount, pSampleData); + if (samplesDecoded != pFlac->totalSampleCount) { + free(pSampleData); + goto on_error; // Something went wrong when decoding the FLAC stream. + } + } + + + if (sampleRateOut) *sampleRateOut = pFlac->sampleRate; + if (channelsOut) *channelsOut = pFlac->channels; + if (totalSampleCountOut) *totalSampleCountOut = totalSampleCount; + + drflac_close(pFlac); + return pSampleData; + +on_error: + drflac_close(pFlac); + return NULL; +} + int32_t* drflac_open_and_decode_s32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, uint64_t* totalSampleCount) { // Safety. @@ -4230,7 +4347,22 @@ int32_t* drflac_open_and_decode_s32(drflac_read_proc onRead, drflac_seek_proc on return NULL; } - return drflac__full_decode_and_close(pFlac, channels, sampleRate, totalSampleCount); + return drflac__full_decode_and_close_s32(pFlac, channels, sampleRate, totalSampleCount); +} + +int16_t* drflac_open_and_decode_s16(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, uint64_t* totalSampleCount) +{ + // Safety. + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalSampleCount) *totalSampleCount = 0; + + drflac* pFlac = drflac_open(onRead, onSeek, pUserData); + if (pFlac == NULL) { + return NULL; + } + + return drflac__full_decode_and_close_s16(pFlac, channels, sampleRate, totalSampleCount); } #ifndef DR_FLAC_NO_STDIO @@ -4245,7 +4377,21 @@ int32_t* drflac_open_and_decode_file_s32(const char* filename, unsigned int* cha return NULL; } - return drflac__full_decode_and_close(pFlac, channels, sampleRate, totalSampleCount); + return drflac__full_decode_and_close_s32(pFlac, channels, sampleRate, totalSampleCount); +} + +int16_t* drflac_open_and_decode_file_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, uint64_t* totalSampleCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalSampleCount) *totalSampleCount = 0; + + drflac* pFlac = drflac_open_file(filename); + if (pFlac == NULL) { + return NULL; + } + + return drflac__full_decode_and_close_s16(pFlac, channels, sampleRate, totalSampleCount); } #endif @@ -4260,7 +4406,21 @@ int32_t* drflac_open_and_decode_memory_s32(const void* data, size_t dataSize, un return NULL; } - return drflac__full_decode_and_close(pFlac, channels, sampleRate, totalSampleCount); + return drflac__full_decode_and_close_s32(pFlac, channels, sampleRate, totalSampleCount); +} + +int16_t* drflac_open_and_decode_memory_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, uint64_t* totalSampleCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalSampleCount) *totalSampleCount = 0; + + drflac* pFlac = drflac_open_memory(data, dataSize); + if (pFlac == NULL) { + return NULL; + } + + return drflac__full_decode_and_close_s16(pFlac, channels, sampleRate, totalSampleCount); } void drflac_free(void* pSampleDataReturnedByOpenAndDecode) @@ -4305,6 +4465,15 @@ const char* drflac_next_vorbis_comment(drflac_vorbis_comment_iterator* pIter, ui // REVISION HISTORY // +// v0.4c - 2016-12-26 +// - Add support for signed 16-bit integer PCM decoding. +// +// v0.4b - 2016-10-23 +// - A minor change to dr_bool8 and dr_bool32 types. +// +// v0.4a - 2016-10-11 +// - Rename drBool32 to dr_bool32 for styling consistency. +// // v0.4 - 2016-09-29 // - API/ABI CHANGE: Use fixed size 32-bit booleans instead of the built-in bool type. // - API CHANGE: Rename drflac_open_and_decode*() to drflac_open_and_decode*_s32()