summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Olav Tvete <paul.tvete@qt.io>2022-06-30 14:23:41 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-08-04 17:35:25 +0000
commit1b59dd3fe7d8e3ce4f32d65dd1d5d7aefc1bf5b9 (patch)
treed699d38dc7ba781c80261016f67af96448032fbb
parent20d531893a94e377bdadb9c361d173e49b56c77f (diff)
downloadqtmultimedia-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.cpp14
-rw-r--r--src/spatialaudio/qaudioengine_p.h3
-rw-r--r--src/spatialaudioquick3d/qquick3dambientsound.cpp13
-rw-r--r--src/spatialaudioquick3d/qquick3dspatialsound.cpp13
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);
}