in pedalboard/juce_overrides/juce_PatchedMP3AudioFormat.cpp [2249:2339]
void decodeLayer3Frame(float *pcm0, float *pcm1, int &samplesDone) noexcept {
if (!rollBackBufferPointer((int)sideinfo.mainDataStart))
return;
const int single = frame.numChannels == 1 ? 0 : frame.single;
const int numChans = (frame.numChannels == 1 || single >= 0) ? 1 : 2;
const bool msStereo = (frame.mode == 1) && (frame.modeExt & 2) != 0;
const bool iStereo = (frame.mode == 1) && (frame.modeExt & 1) != 0;
const int granules = frame.lsf ? 1 : 2;
int scaleFactors[2][39];
for (int gr = 0; gr < granules; ++gr) {
{
auto &granule = sideinfo.ch[0].gr[gr];
auto part2bits =
frame.lsf ? getLayer3ScaleFactors2(scaleFactors[0], granule, 0)
: getLayer3ScaleFactors1(scaleFactors[0], granule);
if (layer3DequantizeSample(hybridIn[0], scaleFactors[0], granule,
frame.sampleRateIndex, part2bits))
return;
}
if (frame.numChannels == 2) {
auto &granule = sideinfo.ch[1].gr[gr];
auto part2bits =
frame.lsf
? getLayer3ScaleFactors2(scaleFactors[1], granule, iStereo)
: getLayer3ScaleFactors1(scaleFactors[1], granule);
if (layer3DequantizeSample(hybridIn[1], scaleFactors[1], granule,
frame.sampleRateIndex, part2bits))
return;
if (msStereo) {
for (int i = 0; i < 32 * 18; ++i) {
auto tmp0 = ((const float *)hybridIn[0])[i];
auto tmp1 = ((const float *)hybridIn[1])[i];
((float *)hybridIn[1])[i] = tmp0 - tmp1;
((float *)hybridIn[0])[i] = tmp0 + tmp1;
}
}
if (iStereo)
granule.doIStereo(hybridIn, scaleFactors[1], frame.sampleRateIndex,
msStereo, frame.lsf);
if (msStereo || iStereo || single == 3) {
if (granule.maxb > sideinfo.ch[0].gr[gr].maxb)
sideinfo.ch[0].gr[gr].maxb = granule.maxb;
else
granule.maxb = sideinfo.ch[0].gr[gr].maxb;
}
switch (single) {
case 3: {
auto *in0 = (float *)hybridIn[0];
auto *in1 = (const float *)hybridIn[1];
for (int i = 0; i < (int)(18 * granule.maxb); ++i, ++in0)
*in0 = (*in0 + *in1++);
} break;
case 1: {
auto *in0 = (float *)hybridIn[0];
auto *in1 = (const float *)hybridIn[1];
for (int i = 0; i < (int)(18 * granule.maxb); ++i)
*in0++ = *in1++;
} break;
default:
break;
}
}
for (int ch = 0; ch < numChans; ++ch) {
auto &granule = sideinfo.ch[ch].gr[gr];
granule.doAntialias(hybridIn[ch]);
layer3Hybrid(hybridIn[ch], hybridOut[ch], ch, granule);
}
for (int ss = 0; ss < 18; ++ss) {
if (single >= 0)
synthesise(hybridOut[0][ss], 0, pcm0, samplesDone);
else
synthesiseStereo(hybridOut[0][ss], hybridOut[1][ss], pcm0, pcm1,
samplesDone);
}
}
}