31 using QtMultimediaPrivate::drop;
32 using QtMultimediaPrivate::take;
33 namespace ranges = QtMultimediaPrivate::ranges;
35 if (!m_playing.load(std::memory_order_relaxed)) {
36 ranges::fill(output, 0.f);
40 QSpan<
const float> wholeSampleBuffer{
41 m_buffer.constData<
float>(),
42 m_buffer.sampleCount(),
45 while (!output.empty()) {
46 QSpan remainingSamples = drop(wholeSampleBuffer, m_currentSample);
47 const QSpan samplesToCopy = take(remainingSamples, output.size());
48 ranges::copy(samplesToCopy, output.begin());
49 output = drop(output, samplesToCopy.size());
50 m_currentSample += samplesToCopy.size();
56 Q_ASSERT(m_currentSample == wholeSampleBuffer.size());
65 ranges::fill(output, 0.f);
69 if (m_currentLoop >= m_loops) {
72 ranges::fill(output, 0.f);
211 qCDebug(qLcSpatialAudioEngine) <<
"Loading sound:" << url;
214 auto *ep = QAudioEnginePrivate::get(engine);
218 m_loadFuture.cancelChain();
223 m_loadFuture = QSampleCache::instance()
224 ->requestSampleFuture(m_sourceResolver->resolve(url), ep->sampleRate())
225 .then(q_ptr, [
this](SharedSamplePtr sample) {
227 qCWarning(qLcSpatialAudioEngine) <<
"QAmbientSound: cannot load file";
234 const QAudioFormat &srcFmt = sample->format();
235 const int srcChannels = srcFmt.channelCount();
238 QAudioFormat outFmt = srcFmt;
239 outFmt.setChannelCount(nchannels);
240 outFmt.setChannelConfig(nchannels == 2 ? QAudioFormat::ChannelConfigStereo
241 : QAudioFormat::ChannelConfigMono);
243 using namespace QAudioHelperInternal;
245 if (srcChannels == nchannels) {
246 pcmData = sample->data();
248 m_sample = std::move(sample);
249 }
else if (srcChannels == 1 && nchannels == 2) {
250 qWarning() <<
"QAmbientSound: upmixing mono source to stereo";
251 pcmData = upmixMonoToStereo(sample->dataAsFloatSpan(), UpmixScaling::Duplicate);
252 }
else if (srcChannels == 2 && nchannels == 1) {
253 qWarning() <<
"QAmbientSound: downmixing stereo source to mono";
254 pcmData = downmixStereoToMono(sample->dataAsFloatSpan(), DownmixScaling::Average);
256 qWarning() <<
"QAmbientSound: unsupported channel count"
257 << srcChannels <<
"- rejecting file";
261 m_buffer = QAudioBuffer{
266 qCDebug(qLcSpatialAudioEngine) <<
"Sound loaded";
268 const bool startingPlayback = m_autoPlay || m_state != State::Stopped;
269 if (!startingPlayback)
271 const bool startPaused = (m_state == State::Paused) && !m_autoPlay;
272 setState(std::make_shared<QSpatialAudioPlaybackState>(*m_buffer, !startPaused,
275 m_state = startPaused ? State::Paused : State::Playing;
276 qCDebug(qLcSpatialAudioEngine)
277 <<
"Sound playback started:" << (startPaused ?
"paused" :
"playing");