diff options
author | Paul Olav Tvete <paul.tvete@qt.io> | 2022-06-30 14:23:41 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-08-04 17:35:25 +0000 |
commit | 1b59dd3fe7d8e3ce4f32d65dd1d5d7aefc1bf5b9 (patch) | |
tree | d699d38dc7ba781c80261016f67af96448032fbb | |
parent | 20d531893a94e377bdadb9c361d173e49b56c77f (diff) | |
download | qtmultimedia-1b59dd3fe7d8e3ce4f32d65dd1d5d7aefc1bf5b9.tar.gz |
Support sound files in qrc
This is required for QML examples that include audio files.
This has two parts. One is letting relative urls map to qrc:// for
spatial audio when the QML file is in qrc. The other is to support
qrc:// URLs in QAudioEngine.
Change-Id: Ide3fdee1503eb6782029306bfa4399946f27b130
Reviewed-by: Lars Knoll <lars.knoll@gmail.com>
(cherry picked from commit 399a538ff7601022e716e17fe2bd70fe0b256f48)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/spatialaudio/qaudioengine.cpp | 14 | ||||
-rw-r--r-- | src/spatialaudio/qaudioengine_p.h | 3 | ||||
-rw-r--r-- | src/spatialaudioquick3d/qquick3dambientsound.cpp | 13 | ||||
-rw-r--r-- | src/spatialaudioquick3d/qquick3dspatialsound.cpp | 13 |
4 files changed, 34 insertions, 9 deletions
diff --git a/src/spatialaudio/qaudioengine.cpp b/src/spatialaudio/qaudioengine.cpp index 9f14b0e2e..fdf3864f8 100644 --- a/src/spatialaudio/qaudioengine.cpp +++ b/src/spatialaudio/qaudioengine.cpp @@ -14,6 +14,8 @@ #include <qdebug.h> #include <qelapsedtimer.h> +#include <QFile> + QT_BEGIN_NAMESPACE // We'd like to have short buffer times, so the sound adjusts itself to changes @@ -540,6 +542,7 @@ void QAmbientSoundPrivate::load() decoder.reset(new QAudioDecoder); buffers.clear(); currentBuffer = 0; + sourceDeviceFile.reset(nullptr); bufPos = 0; m_playing = false; m_loading = true; @@ -549,8 +552,15 @@ void QAmbientSoundPrivate::load() f.setSampleRate(ep->sampleRate); f.setChannelConfig(nchannels == 2 ? QAudioFormat::ChannelConfigStereo : QAudioFormat::ChannelConfigMono); decoder->setAudioFormat(f); - decoder->setSource(url); - + if (url.scheme().compare(u"qrc", Qt::CaseInsensitive) == 0) { + auto qrcFile = std::make_unique<QFile>(u':' + url.path()); + if (!qrcFile->open(QFile::ReadOnly)) + return; + sourceDeviceFile = std::move(qrcFile); + decoder->setSourceDevice(sourceDeviceFile.get()); + } else { + decoder->setSource(url); + } connect(decoder.get(), &QAudioDecoder::bufferReady, this, &QAmbientSoundPrivate::bufferReady); connect(decoder.get(), &QAudioDecoder::finished, this, &QAmbientSoundPrivate::finished); decoder->start(); diff --git a/src/spatialaudio/qaudioengine_p.h b/src/spatialaudio/qaudioengine_p.h index 606196bac..046a845cc 100644 --- a/src/spatialaudio/qaudioengine_p.h +++ b/src/spatialaudio/qaudioengine_p.h @@ -24,6 +24,7 @@ #include <qurl.h> #include <qaudiobuffer.h> #include <qvector3d.h> +#include <qfile.h> namespace vraudio { class ResonanceAudio; @@ -98,11 +99,11 @@ public: template<typename T> static QAmbientSoundPrivate *get(T *soundSource) { return soundSource ? soundSource->d : nullptr; } - QUrl url; float volume = 1.; int nchannels = 2; std::unique_ptr<QAudioDecoder> decoder; + std::unique_ptr<QFile> sourceDeviceFile; QAudioEngine *engine = nullptr; QMutex mutex; diff --git a/src/spatialaudioquick3d/qquick3dambientsound.cpp b/src/spatialaudioquick3d/qquick3dambientsound.cpp index f12bb1f5a..165052e98 100644 --- a/src/spatialaudioquick3d/qquick3dambientsound.cpp +++ b/src/spatialaudioquick3d/qquick3dambientsound.cpp @@ -5,6 +5,8 @@ #include "qambientsound.h" #include <QAudioFormat> #include <qdir.h> +#include <QQmlContext> +#include <QQmlFile> QT_BEGIN_NAMESPACE @@ -47,9 +49,14 @@ QUrl QQuick3DAmbientSound::source() const void QQuick3DAmbientSound::setSource(QUrl source) { - QUrl url = QUrl::fromLocalFile(QDir::currentPath() + u"/"); - url = url.resolved(source); - + const QQmlContext *context = qmlContext(this); + QUrl url; + if (context) { + url = context->resolvedUrl(source); + } else { + url = QUrl::fromLocalFile(QDir::currentPath() + u"/"); + url = url.resolved(source); + } m_sound->setSource(url); } diff --git a/src/spatialaudioquick3d/qquick3dspatialsound.cpp b/src/spatialaudioquick3d/qquick3dspatialsound.cpp index 9ffa8a517..79926d93a 100644 --- a/src/spatialaudioquick3d/qquick3dspatialsound.cpp +++ b/src/spatialaudioquick3d/qquick3dspatialsound.cpp @@ -5,6 +5,8 @@ #include "qspatialsound.h" #include <QAudioFormat> #include <qdir.h> +#include <QQmlContext> +#include <QQmlFile> QT_BEGIN_NAMESPACE @@ -60,9 +62,14 @@ QUrl QQuick3DSpatialSound::source() const void QQuick3DSpatialSound::setSource(QUrl source) { - QUrl url = QUrl::fromLocalFile(QDir::currentPath() + u"/"); - url = url.resolved(source); - + const QQmlContext *context = qmlContext(this); + QUrl url; + if (context) { + url = context->resolvedUrl(source); + } else { + url = QUrl::fromLocalFile(QDir::currentPath() + u"/"); + url = url.resolved(source); + } m_sound->setSource(url); } |