32 using QtMultimediaPrivate::drop;
33 using QtMultimediaPrivate::take;
34 namespace ranges = QtMultimediaPrivate::ranges;
36 if (!m_playing.load(std::memory_order_relaxed)) {
37 ranges::fill(output, 0.f);
41 QSpan<
const float> wholeSampleBuffer{
42 m_buffer.constData<
float>(),
43 m_buffer.sampleCount(),
46 while (!output.empty()) {
47 QSpan remainingSamples = drop(wholeSampleBuffer, m_currentSample);
48 const QSpan samplesToCopy = take(remainingSamples, output.size());
49 ranges::copy(samplesToCopy, output.begin());
50 output = drop(output, samplesToCopy.size());
51 m_currentSample += samplesToCopy.size();
57 Q_ASSERT(m_currentSample == wholeSampleBuffer.size());
66 ranges::fill(output, 0.f);
70 if (m_currentLoop >= m_loops) {
73 ranges::fill(output, 0.f);
212 qCDebug(qLcSpatialAudioEngine) <<
"Loading sound:" << url;
215 auto *ep = QAudioEnginePrivate::get(engine);
219 m_loadFuture.cancelChain();
224 m_loadFuture = QSampleCache::instance()
225 ->requestSampleFuture(m_sourceResolver->resolve(url), ep->sampleRate())
226 .then(q_ptr, [
this](SharedSamplePtr sample) {
228 qCWarning(qLcSpatialAudioEngine) <<
"QAmbientSound: cannot load file";
235 const QAudioFormat &srcFmt = sample->format();
236 const int srcChannels = srcFmt.channelCount();
239 QAudioFormat outFmt = srcFmt;
240 outFmt.setChannelCount(nchannels);
241 outFmt.setChannelConfig(nchannels == 2 ? QAudioFormat::ChannelConfigStereo
242 : QAudioFormat::ChannelConfigMono);
244 using namespace QAudioHelperInternal;
246 if (srcChannels == nchannels) {
247 pcmData = sample->data();
249 m_sample = std::move(sample);
250 }
else if (srcChannels == 1 && nchannels == 2) {
251 qWarning() <<
"QAmbientSound: upmixing mono source to stereo";
252 pcmData = upmixMonoToStereo(sample->dataAsFloatSpan(), UpmixScaling::Duplicate);
253 }
else if (srcChannels == 2 && nchannels == 1) {
254 qWarning() <<
"QAmbientSound: downmixing stereo source to mono";
255 pcmData = downmixStereoToMono(sample->dataAsFloatSpan(), DownmixScaling::Average);
257 qWarning() <<
"QAmbientSound: unsupported channel count"
258 << srcChannels <<
"- rejecting file";
262 m_buffer = QAudioBuffer{
267 qCDebug(qLcSpatialAudioEngine) <<
"Sound loaded";
269 const bool startingPlayback = m_autoPlay || m_state != State::Stopped;
270 if (!startingPlayback)
272 const bool startPaused = (m_state == State::Paused) && !m_autoPlay;
273 setState(std::make_shared<QSpatialAudioPlaybackState>(*m_buffer, !startPaused,
276 m_state = startPaused ? State::Paused : State::Playing;
277 qCDebug(qLcSpatialAudioEngine)
278 <<
"Sound playback started:" << (startPaused ?
"paused" :
"playing");