182runAudioCallback(std::conditional_t<IsSink, AudioSinkCallback, AudioSourceCallback> &audioCallback,
183 QSpan<std::conditional_t<IsSink, std::byte,
const std::byte>> hostBuffer,
184 const QAudioFormat &format)
186 Q_ASSERT(!hostBuffer.empty());
188 bool callbackIsValid = validateAudioCallback(audioCallback, format);
189 QT_MM_ASSUME(callbackIsValid);
191 int numberOfSamples = format.framesForBytes(hostBuffer.size()) * format.channelCount();
193 std::visit([&](
auto &callback) {
194 using FunctorType = std::decay_t<
decltype(callback)>;
195 Q_ASSERT(getSampleFormat<FunctorType>() == format.sampleFormat());
197 using SampleType = GetSampleType<FunctorType>;
199 bool audioCallbackIsValid =
bool(callback);
200 QT_MM_ASSUME(audioCallbackIsValid);
201 using HostBufferType = std::conditional_t<IsSink, SampleType,
const SampleType>;
203 auto buffer = QSpan<HostBufferType>{
204 reinterpret_cast<HostBufferType *>(hostBuffer.data()),
212 const QAudioFormat &format,
float volume)
215 QAudioHelperInternal::applyVolume(volume, format, hostBuffer, hostBuffer);
221inline void runAudioCallback(AudioSourceCallback &audioCallback, QSpan<
const std::byte> hostBuffer,
222 const QAudioFormat &format,
float volume)
224 if (volume == 1.0f) {
231 constexpr qsizetype sizeEstimate = 1024 * 16 *
sizeof(
float);
232 if (hostBuffer.size() <= sizeEstimate) {
233 std::array<
std::byte, sizeEstimate> stackBuffer;
234 QSpan<std::byte> stackBufferSpan{
239 QAudioHelperInternal::applyVolume(volume, format, hostBuffer, stackBufferSpan);
242 QtPrivate::ScopedRTSanDisabler allowAllocations;
244 auto buffer = q20::make_unique_for_overwrite<std::byte[]>(hostBuffer.size());
245 auto heapBufferSpan = QSpan{
249 QAudioHelperInternal::applyVolume(volume, format, hostBuffer, heapBufferSpan);
258 QAudioHelperInternal::applyVolume(volume, format, hostBuffer, hostBuffer);