Commit c74c91d0 authored by David Reid's avatar David Reid

Work in progress on C89 support.

parent 7db82c7a
#define DR_FLAC_IMPLEMENTATION #define DR_FLAC_IMPLEMENTATION
#include "../extras/dr_flac.h" // Enables FLAC decoding. #include "../extras/dr_flac.h" /* Enables FLAC decoding. */
#define DR_MP3_IMPLEMENTATION #define DR_MP3_IMPLEMENTATION
#include "../extras/dr_mp3.h" // Enables MP3 decoding. #include "../extras/dr_mp3.h" /* Enables MP3 decoding. */
#define DR_WAV_IMPLEMENTATION #define DR_WAV_IMPLEMENTATION
#include "../extras/dr_wav.h" // Enables WAV decoding. #include "../extras/dr_wav.h" /* Enables WAV decoding. */
#define MINIAUDIO_IMPLEMENTATION #define MINIAUDIO_IMPLEMENTATION
#include "../miniaudio.h" #include "../miniaudio.h"
...@@ -24,25 +24,28 @@ void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uin ...@@ -24,25 +24,28 @@ void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uin
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
ma_result result;
ma_decoder decoder;
ma_device_config config;
ma_device device;
if (argc < 2) { if (argc < 2) {
printf("No input file.\n"); printf("No input file.\n");
return -1; return -1;
} }
ma_decoder decoder; result = ma_decoder_init_file(argv[1], NULL, &decoder);
ma_result result = ma_decoder_init_file(argv[1], NULL, &decoder);
if (result != MA_SUCCESS) { if (result != MA_SUCCESS) {
return -2; return -2;
} }
ma_device_config config = ma_device_config_init(ma_device_type_playback); config = ma_device_config_init(ma_device_type_playback);
config.playback.format = decoder.outputFormat; config.playback.format = decoder.outputFormat;
config.playback.channels = decoder.outputChannels; config.playback.channels = decoder.outputChannels;
config.sampleRate = decoder.outputSampleRate; config.sampleRate = decoder.outputSampleRate;
config.dataCallback = data_callback; config.dataCallback = data_callback;
config.pUserData = &decoder; config.pUserData = &decoder;
ma_device device;
if (ma_device_init(NULL, &config, &device) != MA_SUCCESS) { if (ma_device_init(NULL, &config, &device) != MA_SUCCESS) {
printf("Failed to open playback device.\n"); printf("Failed to open playback device.\n");
ma_decoder_uninit(&decoder); ma_decoder_uninit(&decoder);
......
/* /*
FLAC audio decoder. Choice of public domain or MIT-0. See license statements at the end of this file. FLAC audio decoder. Choice of public domain or MIT-0. See license statements at the end of this file.
dr_flac - v0.11.6 - 2019-05-05 dr_flac - v0.11.7 - 2019-05-06
David Reid - mackron@gmail.com David Reid - mackron@gmail.com
*/ */
...@@ -1485,14 +1485,14 @@ static DRFLAC_INLINE drflac_uint16 drflac_crc16__64bit(drflac_uint16 crc, drflac ...@@ -1485,14 +1485,14 @@ static DRFLAC_INLINE drflac_uint16 drflac_crc16__64bit(drflac_uint16 crc, drflac
switch (wholeBytes) { switch (wholeBytes) {
default: default:
case 8: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0xFF000000 << 16 << 16) << leftoverBits)) >> (56 + leftoverBits))); /* Weird "16 << 16" bitshift is required for C89 because it doesn't support 64-bit constants. Should be optimized out by a good compiler. */ case 8: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0xFF000000 << 32) << leftoverBits)) >> (56 + leftoverBits))); /* Weird "<< 32" bitshift is required for C89 because it doesn't support 64-bit constants. Should be optimized out by a good compiler. */
case 7: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x00FF0000 << 16 << 16) << leftoverBits)) >> (48 + leftoverBits))); case 7: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x00FF0000 << 32) << leftoverBits)) >> (48 + leftoverBits)));
case 6: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x0000FF00 << 16 << 16) << leftoverBits)) >> (40 + leftoverBits))); case 6: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x0000FF00 << 32) << leftoverBits)) >> (40 + leftoverBits)));
case 5: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x000000FF << 16 << 16) << leftoverBits)) >> (32 + leftoverBits))); case 5: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x000000FF << 32) << leftoverBits)) >> (32 + leftoverBits)));
case 4: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0xFF000000 ) << leftoverBits)) >> (24 + leftoverBits))); case 4: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0xFF000000 ) << leftoverBits)) >> (24 + leftoverBits)));
case 3: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x00FF0000 ) << leftoverBits)) >> (16 + leftoverBits))); case 3: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x00FF0000 ) << leftoverBits)) >> (16 + leftoverBits)));
case 2: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x0000FF00 ) << leftoverBits)) >> ( 8 + leftoverBits))); case 2: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x0000FF00 ) << leftoverBits)) >> ( 8 + leftoverBits)));
case 1: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x000000FF ) << leftoverBits)) >> ( 0 + leftoverBits))); case 1: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x000000FF ) << leftoverBits)) >> ( 0 + leftoverBits)));
case 0: if (leftoverBits > 0) crc = (crc << leftoverBits) ^ drflac__crc16_table[(crc >> (16 - leftoverBits)) ^ (data & leftoverDataMask)]; case 0: if (leftoverBits > 0) crc = (crc << leftoverBits) ^ drflac__crc16_table[(crc >> (16 - leftoverBits)) ^ (data & leftoverDataMask)];
} }
return crc; return crc;
...@@ -2010,10 +2010,10 @@ static DRFLAC_INLINE drflac_uint32 drflac__clz_software(drflac_cache_t x) ...@@ -2010,10 +2010,10 @@ static DRFLAC_INLINE drflac_uint32 drflac__clz_software(drflac_cache_t x)
n = clz_table_4[x >> (sizeof(x)*8 - 4)]; n = clz_table_4[x >> (sizeof(x)*8 - 4)];
if (n == 0) { if (n == 0) {
#ifdef DRFLAC_64BIT #ifdef DRFLAC_64BIT
if ((x & 0xFFFFFFFF00000000ULL) == 0) { n = 32; x <<= 32; } if ((x & ((drflac_uint64)0xFFFFFFFF << 32)) == 0) { n = 32; x <<= 32; }
if ((x & 0xFFFF000000000000ULL) == 0) { n += 16; x <<= 16; } if ((x & ((drflac_uint64)0xFFFF0000 << 32)) == 0) { n += 16; x <<= 16; }
if ((x & 0xFF00000000000000ULL) == 0) { n += 8; x <<= 8; } if ((x & ((drflac_uint64)0xFF000000 << 32)) == 0) { n += 8; x <<= 8; }
if ((x & 0xF000000000000000ULL) == 0) { n += 4; x <<= 4; } if ((x & ((drflac_uint64)0xF0000000 << 32)) == 0) { n += 4; x <<= 4; }
#else #else
if ((x & 0xFFFF0000) == 0) { n = 16; x <<= 16; } if ((x & 0xFFFF0000) == 0) { n = 16; x <<= 16; }
if ((x & 0xFF000000) == 0) { n += 8; x <<= 8; } if ((x & 0xFF000000) == 0) { n += 8; x <<= 8; }
...@@ -2050,9 +2050,9 @@ static DRFLAC_INLINE drflac_uint32 drflac__clz_lzcnt(drflac_cache_t x) ...@@ -2050,9 +2050,9 @@ static DRFLAC_INLINE drflac_uint32 drflac__clz_lzcnt(drflac_cache_t x)
return sizeof(x)*8; return sizeof(x)*8;
} }
#ifdef DRFLAC_64BIT #ifdef DRFLAC_64BIT
return (drflac_uint32)__builtin_clzll((unsigned long long)x); return (drflac_uint32)__builtin_clzll((drflac_uint64)x);
#else #else
return (drflac_uint32)__builtin_clzl((unsigned long)x); return (drflac_uint32)__builtin_clzl((drflac_uint32)x);
#endif #endif
#else #else
/* Unsupported compiler. */ /* Unsupported compiler. */
...@@ -7491,6 +7491,7 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__sse2(drfl ...@@ -7491,6 +7491,7 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__sse2(drfl
drflac_uint64 i; drflac_uint64 i;
drflac_uint64 frameCount4; drflac_uint64 frameCount4;
float factor; float factor;
int shift;
__m128 factor128; __m128 factor128;
drflac_assert(pFlac->bitsPerSample <= 24); drflac_assert(pFlac->bitsPerSample <= 24);
...@@ -7500,9 +7501,14 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__sse2(drfl ...@@ -7500,9 +7501,14 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__sse2(drfl
factor = 1.0f / 8388608.0f; factor = 1.0f / 8388608.0f;
factor128 = _mm_set1_ps(1.0f / 8388608.0f); factor128 = _mm_set1_ps(1.0f / 8388608.0f);
int shift = unusedBitsPerSample - 8; shift = unusedBitsPerSample - 8;
if (shift == 0) { if (shift == 0) {
for (i = 0; i < frameCount4; ++i) { for (i = 0; i < frameCount4; ++i) {
__m128i tempL;
__m128i tempR;
__m128 leftf;
__m128 rightf;
__m128i inputSample0 = _mm_loadu_si128((const __m128i*)pInputSamples0 + i); __m128i inputSample0 = _mm_loadu_si128((const __m128i*)pInputSamples0 + i);
__m128i inputSample1 = _mm_loadu_si128((const __m128i*)pInputSamples1 + i); __m128i inputSample1 = _mm_loadu_si128((const __m128i*)pInputSamples1 + i);
...@@ -7511,15 +7517,15 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__sse2(drfl ...@@ -7511,15 +7517,15 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__sse2(drfl
mid = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01))); mid = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01)));
__m128i tempL = _mm_add_epi32(mid, side); tempL = _mm_add_epi32(mid, side);
__m128i tempR = _mm_sub_epi32(mid, side); tempR = _mm_sub_epi32(mid, side);
/* Signed bit shift. */ /* Signed bit shift. */
tempL = _mm_or_si128(_mm_srli_epi32(tempL, 1), _mm_and_si128(tempL, _mm_set1_epi32(0x80000000))); tempL = _mm_or_si128(_mm_srli_epi32(tempL, 1), _mm_and_si128(tempL, _mm_set1_epi32(0x80000000)));
tempR = _mm_or_si128(_mm_srli_epi32(tempR, 1), _mm_and_si128(tempR, _mm_set1_epi32(0x80000000))); tempR = _mm_or_si128(_mm_srli_epi32(tempR, 1), _mm_and_si128(tempR, _mm_set1_epi32(0x80000000)));
__m128 leftf = _mm_mul_ps(_mm_cvtepi32_ps(tempL), factor128); leftf = _mm_mul_ps(_mm_cvtepi32_ps(tempL), factor128);
__m128 rightf = _mm_mul_ps(_mm_cvtepi32_ps(tempR), factor128); rightf = _mm_mul_ps(_mm_cvtepi32_ps(tempR), factor128);
pOutputSamples[i*8+0] = ((float*)&leftf)[0]; pOutputSamples[i*8+0] = ((float*)&leftf)[0];
pOutputSamples[i*8+1] = ((float*)&rightf)[0]; pOutputSamples[i*8+1] = ((float*)&rightf)[0];
...@@ -8643,6 +8649,9 @@ drflac_bool32 drflac_next_cuesheet_track(drflac_cuesheet_track_iterator* pIter, ...@@ -8643,6 +8649,9 @@ drflac_bool32 drflac_next_cuesheet_track(drflac_cuesheet_track_iterator* pIter,
/* /*
REVISION HISTORY REVISION HISTORY
================ ================
v0.11.7 - 2019-05-06
- C89 fixes.
v0.11.6 - 2019-05-05 v0.11.6 - 2019-05-05
- Add support for C89. - Add support for C89.
- Fix a compiler warning when CRC is disabled. - Fix a compiler warning when CRC is disabled.
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment