| 112 | } |
| 113 | |
| 114 | QByteArray Resampler::processStereoToStereo(const float* stereoIn, int numStereoFrames) |
| 115 | { |
| 116 | if (numStereoFrames <= 0) return {}; |
| 117 | |
| 118 | if (numStereoFrames > m_maxBlockSamples) { |
| 119 | QByteArray result; |
| 120 | for (int offset = 0; offset < numStereoFrames; offset += m_maxBlockSamples) |
| 121 | result.append(processStereoToStereo(stereoIn + offset * 2, std::min(numStereoFrames - offset, m_maxBlockSamples))); |
| 122 | return result; |
| 123 | } |
| 124 | |
| 125 | // Downmix stereo → mono, resample, duplicate back to stereo |
| 126 | m_inBuf.resize(numStereoFrames); |
| 127 | for (int i = 0; i < numStereoFrames; ++i) |
| 128 | m_inBuf[i] = (stereoIn[2 * i] + stereoIn[2 * i + 1]) * 0.5; |
| 129 | |
| 130 | double* outPtr = nullptr; |
| 131 | int outLen = m_resampler->process(m_inBuf.data(), numStereoFrames, outPtr); |
| 132 | |
| 133 | if (outLen <= 0 || !outPtr) return {}; |
| 134 | |
| 135 | QByteArray result(outLen * 2 * static_cast<int>(sizeof(float)), Qt::Uninitialized); |
| 136 | auto* dst = reinterpret_cast<float*>(result.data()); |
| 137 | for (int i = 0; i < outLen; ++i) { |
| 138 | float s = static_cast<float>(outPtr[i]); |
| 139 | dst[2 * i] = s; |
| 140 | dst[2 * i + 1] = s; |
| 141 | } |
| 142 | return result; |
| 143 | } |
| 144 | |
| 145 | void Resampler::prewarm() |
| 146 | { |
no test coverage detected