| 49 | } |
| 50 | |
| 51 | QByteArray Resampler::processStereoToMono(const float* stereoIn, int numStereoFrames) |
| 52 | { |
| 53 | if (numStereoFrames <= 0) return {}; |
| 54 | |
| 55 | if (numStereoFrames > m_maxBlockSamples) { |
| 56 | QByteArray result; |
| 57 | for (int offset = 0; offset < numStereoFrames; offset += m_maxBlockSamples) |
| 58 | result.append(processStereoToMono(stereoIn + offset * 2, std::min(numStereoFrames - offset, m_maxBlockSamples))); |
| 59 | return result; |
| 60 | } |
| 61 | |
| 62 | // Downmix stereo → mono |
| 63 | m_inBuf.resize(numStereoFrames); |
| 64 | for (int i = 0; i < numStereoFrames; ++i) |
| 65 | m_inBuf[i] = (stereoIn[2 * i] + stereoIn[2 * i + 1]) * 0.5; |
| 66 | |
| 67 | // Resample |
| 68 | double* outPtr = nullptr; |
| 69 | int outLen = m_resampler->process(m_inBuf.data(), numStereoFrames, outPtr); |
| 70 | |
| 71 | if (outLen <= 0 || !outPtr) return {}; |
| 72 | |
| 73 | // Convert double → float32 mono |
| 74 | QByteArray result(outLen * static_cast<int>(sizeof(float)), Qt::Uninitialized); |
| 75 | auto* dst = reinterpret_cast<float*>(result.data()); |
| 76 | for (int i = 0; i < outLen; ++i) |
| 77 | dst[i] = static_cast<float>(outPtr[i]); |
| 78 | return result; |
| 79 | } |
| 80 | |
| 81 | QByteArray Resampler::processMonoToStereo(const float* monoIn, int numSamples) |
| 82 | { |
no test coverage detected