mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-24 09:14:04 +02:00
Update dr_flac.
This commit is contained in:
+30
-25
@@ -1,5 +1,5 @@
|
|||||||
// FLAC audio decoder. Public domain. See "unlicense" statement at the end of this file.
|
// FLAC audio decoder. Public domain. See "unlicense" statement at the end of this file.
|
||||||
// dr_flac - v0.9.10 - 2018-08-07
|
// dr_flac - v0.9.11 - 2018-08-29
|
||||||
//
|
//
|
||||||
// David Reid - mackron@gmail.com
|
// David Reid - mackron@gmail.com
|
||||||
|
|
||||||
@@ -5146,10 +5146,10 @@ drflac_uint64 drflac__read_s32__misaligned(drflac* pFlac, drflac_uint64 samplesT
|
|||||||
case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE:
|
case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE:
|
||||||
{
|
{
|
||||||
if (channelIndex == 0) {
|
if (channelIndex == 0) {
|
||||||
decodedSample = pFlac->currentFrame.subframes[channelIndex].pDecodedSamples[nextSampleInFrame];
|
decodedSample = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample;
|
||||||
} else {
|
} else {
|
||||||
int side = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame];
|
int side = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample;
|
||||||
int left = pFlac->currentFrame.subframes[channelIndex - 1].pDecodedSamples[nextSampleInFrame];
|
int left = pFlac->currentFrame.subframes[channelIndex - 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex - 1].wastedBitsPerSample;
|
||||||
decodedSample = left - side;
|
decodedSample = left - side;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
@@ -5157,11 +5157,11 @@ drflac_uint64 drflac__read_s32__misaligned(drflac* pFlac, drflac_uint64 samplesT
|
|||||||
case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE:
|
case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE:
|
||||||
{
|
{
|
||||||
if (channelIndex == 0) {
|
if (channelIndex == 0) {
|
||||||
int side = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame];
|
int side = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample;
|
||||||
int right = pFlac->currentFrame.subframes[channelIndex + 1].pDecodedSamples[nextSampleInFrame];
|
int right = pFlac->currentFrame.subframes[channelIndex + 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 1].wastedBitsPerSample;
|
||||||
decodedSample = side + right;
|
decodedSample = side + right;
|
||||||
} else {
|
} else {
|
||||||
decodedSample = pFlac->currentFrame.subframes[channelIndex].pDecodedSamples[nextSampleInFrame];
|
decodedSample = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
@@ -5170,14 +5170,14 @@ drflac_uint64 drflac__read_s32__misaligned(drflac* pFlac, drflac_uint64 samplesT
|
|||||||
int mid;
|
int mid;
|
||||||
int side;
|
int side;
|
||||||
if (channelIndex == 0) {
|
if (channelIndex == 0) {
|
||||||
mid = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame];
|
mid = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample;
|
||||||
side = pFlac->currentFrame.subframes[channelIndex + 1].pDecodedSamples[nextSampleInFrame];
|
side = pFlac->currentFrame.subframes[channelIndex + 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 1].wastedBitsPerSample;
|
||||||
|
|
||||||
mid = (((unsigned int)mid) << 1) | (side & 0x01);
|
mid = (((unsigned int)mid) << 1) | (side & 0x01);
|
||||||
decodedSample = (mid + side) >> 1;
|
decodedSample = (mid + side) >> 1;
|
||||||
} else {
|
} else {
|
||||||
mid = pFlac->currentFrame.subframes[channelIndex - 1].pDecodedSamples[nextSampleInFrame];
|
mid = pFlac->currentFrame.subframes[channelIndex - 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex - 1].wastedBitsPerSample;
|
||||||
side = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame];
|
side = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample;
|
||||||
|
|
||||||
mid = (((unsigned int)mid) << 1) | (side & 0x01);
|
mid = (((unsigned int)mid) << 1) | (side & 0x01);
|
||||||
decodedSample = (mid - side) >> 1;
|
decodedSample = (mid - side) >> 1;
|
||||||
@@ -5187,12 +5187,12 @@ drflac_uint64 drflac__read_s32__misaligned(drflac* pFlac, drflac_uint64 samplesT
|
|||||||
case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT:
|
case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT:
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
decodedSample = pFlac->currentFrame.subframes[channelIndex].pDecodedSamples[nextSampleInFrame];
|
decodedSample = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample;
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
decodedSample <<= ((32 - pFlac->bitsPerSample) + pFlac->currentFrame.subframes[channelIndex].wastedBitsPerSample);
|
decodedSample <<= (32 - pFlac->bitsPerSample);
|
||||||
|
|
||||||
if (bufferOut) {
|
if (bufferOut) {
|
||||||
*bufferOut++ = decodedSample;
|
*bufferOut++ = decodedSample;
|
||||||
@@ -5284,12 +5284,12 @@ drflac_uint64 drflac_read_s32(drflac* pFlac, drflac_uint64 samplesToRead, drflac
|
|||||||
const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame;
|
const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame;
|
||||||
|
|
||||||
for (drflac_uint64 i = 0; i < alignedSampleCountPerChannel; ++i) {
|
for (drflac_uint64 i = 0; i < alignedSampleCountPerChannel; ++i) {
|
||||||
int left = pDecodedSamples0[i];
|
int left = pDecodedSamples0[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample);
|
||||||
int side = pDecodedSamples1[i];
|
int side = pDecodedSamples1[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample);
|
||||||
int right = left - side;
|
int right = left - side;
|
||||||
|
|
||||||
bufferOut[i*2+0] = left << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample);
|
bufferOut[i*2+0] = left;
|
||||||
bufferOut[i*2+1] = right << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample);
|
bufferOut[i*2+1] = right;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
@@ -5299,12 +5299,12 @@ drflac_uint64 drflac_read_s32(drflac* pFlac, drflac_uint64 samplesToRead, drflac
|
|||||||
const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame;
|
const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame;
|
||||||
|
|
||||||
for (drflac_uint64 i = 0; i < alignedSampleCountPerChannel; ++i) {
|
for (drflac_uint64 i = 0; i < alignedSampleCountPerChannel; ++i) {
|
||||||
int side = pDecodedSamples0[i];
|
int side = pDecodedSamples0[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample);
|
||||||
int right = pDecodedSamples1[i];
|
int right = pDecodedSamples1[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample);
|
||||||
int left = right + side;
|
int left = right + side;
|
||||||
|
|
||||||
bufferOut[i*2+0] = left << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample);
|
bufferOut[i*2+0] = left;
|
||||||
bufferOut[i*2+1] = right << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample);
|
bufferOut[i*2+1] = right;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
@@ -5314,11 +5314,13 @@ drflac_uint64 drflac_read_s32(drflac* pFlac, drflac_uint64 samplesToRead, drflac
|
|||||||
const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame;
|
const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame;
|
||||||
|
|
||||||
for (drflac_uint64 i = 0; i < alignedSampleCountPerChannel; ++i) {
|
for (drflac_uint64 i = 0; i < alignedSampleCountPerChannel; ++i) {
|
||||||
int side = pDecodedSamples1[i];
|
int mid = pDecodedSamples0[i] << pFlac->currentFrame.subframes[0].wastedBitsPerSample;
|
||||||
int mid = (((drflac_uint32)pDecodedSamples0[i]) << 1) | (side & 0x01);
|
int side = pDecodedSamples1[i] << pFlac->currentFrame.subframes[1].wastedBitsPerSample;
|
||||||
|
|
||||||
bufferOut[i*2+0] = ((mid + side) >> 1) << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample);
|
mid = (((drflac_uint32)mid) << 1) | (side & 0x01);
|
||||||
bufferOut[i*2+1] = ((mid - side) >> 1) << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample);
|
|
||||||
|
bufferOut[i*2+0] = ((mid + side) >> 1) << (unusedBitsPerSample);
|
||||||
|
bufferOut[i*2+1] = ((mid - side) >> 1) << (unusedBitsPerSample);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
@@ -5750,6 +5752,9 @@ const char* drflac_next_vorbis_comment(drflac_vorbis_comment_iterator* pIter, dr
|
|||||||
|
|
||||||
// REVISION HISTORY
|
// REVISION HISTORY
|
||||||
//
|
//
|
||||||
|
// v0.9.11 - 2018-08-29
|
||||||
|
// - Fix a bug with sample reconstruction.
|
||||||
|
//
|
||||||
// v0.9.10 - 2018-08-07
|
// v0.9.10 - 2018-08-07
|
||||||
// - Improve 64-bit detection.
|
// - Improve 64-bit detection.
|
||||||
//
|
//
|
||||||
|
|||||||
Reference in New Issue
Block a user