| 17 | Resampler::~Resampler() = default; |
| 18 | |
| 19 | QByteArray Resampler::process(const float* in, int numSamples) |
| 20 | { |
| 21 | if (numSamples <= 0) return {}; |
| 22 | |
| 23 | // r8b does not bounds-check against aMaxInLen; exceeding it silently |
| 24 | // overflows internal filter buffers. Chunk so each call stays within limit. |
| 25 | if (numSamples > m_maxBlockSamples) { |
| 26 | QByteArray result; |
| 27 | for (int offset = 0; offset < numSamples; offset += m_maxBlockSamples) |
| 28 | result.append(process(in + offset, std::min(numSamples - offset, m_maxBlockSamples))); |
| 29 | return result; |
| 30 | } |
| 31 | |
| 32 | // Convert float32 → double |
| 33 | m_inBuf.resize(numSamples); |
| 34 | for (int i = 0; i < numSamples; ++i) |
| 35 | m_inBuf[i] = static_cast<double>(in[i]); |
| 36 | |
| 37 | // Resample |
| 38 | double* outPtr = nullptr; |
| 39 | int outLen = m_resampler->process(m_inBuf.data(), numSamples, outPtr); |
| 40 | |
| 41 | if (outLen <= 0 || !outPtr) return {}; |
| 42 | |
| 43 | // Convert double → float32 |
| 44 | QByteArray result(outLen * static_cast<int>(sizeof(float)), Qt::Uninitialized); |
| 45 | auto* dst = reinterpret_cast<float*>(result.data()); |
| 46 | for (int i = 0; i < outLen; ++i) |
| 47 | dst[i] = static_cast<float>(outPtr[i]); |
| 48 | return result; |
| 49 | } |
| 50 | |
| 51 | QByteArray Resampler::processStereoToMono(const float* stereoIn, int numStereoFrames) |
| 52 | { |
no test coverage detected