| @@ -56,6 +56,15 @@ static constexpr const uint16_t kMinLengthSeconds = 30; | |||
| // size of the audio file ring buffer | |||
| static constexpr const uint16_t kRingBufferLengthSeconds = 6; | |||
| static inline | |||
| constexpr float max4f(const float a, const float b, const float c, const float d) noexcept | |||
| { | |||
| return a > b && a > c && a > d ? a : | |||
| b > a && b > c && b > d ? b : | |||
| c > a && c > b && c > d ? c : | |||
| d; | |||
| } | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| struct AudioMemoryPool { | |||
| @@ -439,15 +448,11 @@ public: | |||
| const uint fileNumFrames = static_cast<uint>(fFileNfo.frames); | |||
| const float fileNumFramesF = static_cast<float>(fileNumFrames); | |||
| const float previewDataSizeF = static_cast<float>(previewDataSize); | |||
| const uint samplesPerRun = fFileNfo.channels; | |||
| const uint channels = fFileNfo.channels; | |||
| const uint samplesPerRun = channels * 4; | |||
| const uint maxSampleToRead = fileNumFrames - samplesPerRun; | |||
| CARLA_SAFE_ASSERT_INT_RETURN(samplesPerRun == 1 || samplesPerRun == 2 || samplesPerRun == 4, samplesPerRun,); | |||
| float tmp[4]; | |||
| if (samplesPerRun == 4) | |||
| previewDataSize -= 3; | |||
| else if (samplesPerRun == 2) | |||
| previewDataSize -= 1; | |||
| const uint8_t quadoffs = fQuad2ndChannels ? 2 : 0; | |||
| float tmp[16] = {}; | |||
| for (uint i=0; i<previewDataSize; ++i) | |||
| { | |||
| @@ -456,7 +461,36 @@ public: | |||
| ad_seek(fFilePtr, pos); | |||
| ad_read(fFilePtr, tmp, samplesPerRun); | |||
| previewData[i] = std::max(std::fabs(tmp[0]), std::fabs(tmp[1])); | |||
| switch (channels) | |||
| { | |||
| case 1: | |||
| previewData[i] = max4f(std::fabs(tmp[0]), | |||
| std::fabs(tmp[1]), | |||
| std::fabs(tmp[2]), | |||
| std::fabs(tmp[3])); | |||
| break; | |||
| case 2: | |||
| previewData[i] = max4f(std::fabs(tmp[0]), | |||
| std::fabs(tmp[2]), | |||
| std::fabs(tmp[4]), | |||
| std::fabs(tmp[6])); | |||
| previewData[i] = std::max(previewData[i], max4f(std::fabs(tmp[1]), | |||
| std::fabs(tmp[3]), | |||
| std::fabs(tmp[5]), | |||
| std::fabs(tmp[7]))); | |||
| break; | |||
| case 4: | |||
| previewData[i] = max4f(std::fabs(tmp[quadoffs+0]), | |||
| std::fabs(tmp[quadoffs+4]), | |||
| std::fabs(tmp[quadoffs+8]), | |||
| std::fabs(tmp[quadoffs+12])); | |||
| previewData[i] = std::max(previewData[i], max4f(std::fabs(tmp[quadoffs+1]), | |||
| std::fabs(tmp[quadoffs+5]), | |||
| std::fabs(tmp[quadoffs+9]), | |||
| std::fabs(tmp[quadoffs+13]))); | |||
| break; | |||
| } | |||
| } | |||
| } | |||