summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2022-05-25 17:42:12 +0200
committerLars Knoll <lars.knoll@qt.io>2022-05-31 11:31:32 +0200
commitbda1feae80e1f570cbc88b6cef371c2be8672792 (patch)
tree14941eb986c5ed4ffcfe2ae5003b8557d15ce849
parentbfec5416903d664a9143d4c0fe7145702ffc3f38 (diff)
Add a Surround mode to QAudioEngine
So far, we only had a Normal and Headphone mode here. Extend this to cover Surround configurations, and explicit Stereo mode and the Headphone mode. Change-Id: I086d02157d4edfd92e5b24076bee9a51bb5cc68a Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
-rw-r--r--examples/multimedia/spatialaudio/main.cpp22
-rw-r--r--src/multimedia/spatial/qaudioengine.cpp19
-rw-r--r--src/multimedia/spatial/qaudioengine.h3
-rw-r--r--src/multimedia/spatial/qaudioengine_p.h2
-rw-r--r--src/multimediaquick3d/qquick3daudioengine.cpp6
-rw-r--r--src/multimediaquick3d/qquick3daudioengine_p.h3
6 files changed, 33 insertions, 22 deletions
diff --git a/examples/multimedia/spatialaudio/main.cpp b/examples/multimedia/spatialaudio/main.cpp
index b49396013..8aa9bb672 100644
--- a/examples/multimedia/spatialaudio/main.cpp
+++ b/examples/multimedia/spatialaudio/main.cpp
@@ -85,24 +85,28 @@ public:
roomDimension = new QSlider(Qt::Horizontal);
roomDimension->setRange(0, 10000);
- roomDimension->setValue(500);
+ roomDimension->setValue(1000);
grid->addWidget(new QLabel(tr("Room dimension (0 - 100 meter):")), 5, 0);
grid->addWidget(roomDimension, 5, 1);
reverbGain = new QSlider(Qt::Horizontal);
reverbGain->setRange(0, 500);
- reverbGain->setValue(100);
+ reverbGain->setValue(0);
grid->addWidget(new QLabel(tr("Reverb gain (0-5):")), 6, 0);
grid->addWidget(reverbGain, 6, 1);
reflectionGain = new QSlider(Qt::Horizontal);
reflectionGain->setRange(0, 500);
- reflectionGain->setValue(100);
+ reflectionGain->setValue(0);
grid->addWidget(new QLabel(tr("Reflection gain (0-5):")), 7, 0);
grid->addWidget(reflectionGain, 7, 1);
- useHeadphone = new QCheckBox(tr("Use headphone spatialization"));
- grid->addWidget(useHeadphone, 8, 1, 1, 2);
+ mode = new QComboBox;
+ mode->addItem(tr("Surround"), QVariant::fromValue(QAudioEngine::Surround));
+ mode->addItem(tr("Stereo"), QVariant::fromValue(QAudioEngine::Stereo));
+ mode->addItem(tr("Headphone"), QVariant::fromValue(QAudioEngine::Headphone));
+ grid->addWidget(new QLabel(tr("Output mode:")), 8, 0);
+ grid->addWidget(mode, 8, 1);
connect(fileEdit, &QLineEdit::textChanged, this, &AudioWidget::fileChanged);
connect(fileDialogButton, &QPushButton::clicked, this, &AudioWidget::openFileDialog);
@@ -116,18 +120,16 @@ public:
connect(reverbGain, &QSlider::valueChanged, this, &AudioWidget::updateRoom);
connect(reflectionGain, &QSlider::valueChanged, this, &AudioWidget::updateRoom);
- connect(useHeadphone, &QCheckBox::stateChanged, this, &AudioWidget::useHeadphoneChanged);
+ connect(mode, &QComboBox::currentIndexChanged, this, &AudioWidget::modeChanged);
room = new QAudioRoom(&engine);
- room->setDimensions(QVector3D(5, 5, 5));
room->setWallMaterial(QAudioRoom::BackWall, QAudioRoom::BrickBare);
room->setWallMaterial(QAudioRoom::FrontWall, QAudioRoom::BrickBare);
room->setWallMaterial(QAudioRoom::LeftWall, QAudioRoom::BrickBare);
room->setWallMaterial(QAudioRoom::RightWall, QAudioRoom::BrickBare);
room->setWallMaterial(QAudioRoom::Floor, QAudioRoom::Marble);
room->setWallMaterial(QAudioRoom::Ceiling, QAudioRoom::WoodCeiling);
- room->setReverbGain(1);
- room->setReflectionGain(1);
+ updateRoom();
listener = new QAudioListener(&engine);
listener->setPosition({});
@@ -185,7 +187,7 @@ private slots:
QSlider *roomDimension = nullptr;
QSlider *reverbGain = nullptr;
QSlider *reflectionGain = nullptr;
- QCheckBox *useHeadphone = nullptr;
+ QComboBox *mode = nullptr;
QAudioEngine engine;
QAudioListener *listener = nullptr;
diff --git a/src/multimedia/spatial/qaudioengine.cpp b/src/multimedia/spatial/qaudioengine.cpp
index c88251b34..a0c33bb63 100644
--- a/src/multimedia/spatial/qaudioengine.cpp
+++ b/src/multimedia/spatial/qaudioengine.cpp
@@ -147,7 +147,7 @@ qint64 QAudioOutputStream::readData(char *data, qint64 len)
d->api->SetInterleavedBuffer(sp->sourceId, buf, 2, QAudioEnginePrivate::bufferSize);
}
- if (d->ambisonicDecoder && d->outputMode == QAudioEngine::Normal && d->format.channelCount() != 2) {
+ if (d->ambisonicDecoder && d->outputMode == QAudioEngine::Surround) {
const float *channels[QAmbisonicDecoder::maxAmbisonicChannels];
int nSamples = vraudio::getAmbisonicOutput(d->api, channels, d->ambisonicDecoder->nInputChannels());
Q_ASSERT(d->ambisonicDecoder->nOutputChannels() <= 8);
@@ -361,10 +361,13 @@ QAudioEngine::~QAudioEngine()
}
/*! \enum QAudioEngine::OutputMode
- \value Normal Map the sounds to the loudspeaker configuration of the output device.
- This is normally a stereo or surround speaker setup.
+ \value Surround Map the sounds to the loudspeaker configuration of the output device.
+ This is normally a stereo or surround speaker setup.
+ \value Stereo Map the sounds to the stereo loudspeaker configuration of the output device.
+ This will ignore any additional speakers and only use the left and right channels
+ to create a stero rendering of the sound field.
\value Headphone Use Headphone spatialization to create a 3D audio effect when listening
- to the sound field through headphones
+ to the sound field through headphones
*/
/*!
@@ -379,9 +382,9 @@ void QAudioEngine::setOutputMode(OutputMode mode)
if (d->outputMode == mode)
return;
d->outputMode = mode;
- if (d->api) {
- d->api->SetStereoSpeakerMode(mode == Normal);
- }
+ if (d->api)
+ d->api->SetStereoSpeakerMode(mode != Headphone);
+
emit outputModeChanged();
}
@@ -452,7 +455,7 @@ void QAudioEngine::start()
d->format.setSampleRate(d->sampleRate);
d->format.setSampleFormat(QAudioFormat::Int16);
- d->api->SetStereoSpeakerMode(d->outputMode == Normal);
+ d->api->SetStereoSpeakerMode(d->outputMode != Headphone);
d->api->SetMasterVolume(d->masterVolume);
d->outputStream.reset(new QAudioOutputStream(d));
diff --git a/src/multimedia/spatial/qaudioengine.h b/src/multimedia/spatial/qaudioengine.h
index dca0b1cc1..3044b61db 100644
--- a/src/multimedia/spatial/qaudioengine.h
+++ b/src/multimedia/spatial/qaudioengine.h
@@ -59,7 +59,8 @@ public:
~QAudioEngine();
enum OutputMode {
- Normal,
+ Surround,
+ Stereo,
Headphone
};
Q_ENUM(OutputMode)
diff --git a/src/multimedia/spatial/qaudioengine_p.h b/src/multimedia/spatial/qaudioengine_p.h
index 36a26ec40..42ae27834 100644
--- a/src/multimedia/spatial/qaudioengine_p.h
+++ b/src/multimedia/spatial/qaudioengine_p.h
@@ -85,7 +85,7 @@ public:
vraudio::ResonanceAudioApi *api = nullptr;
int sampleRate = 44100;
float masterVolume = 1.;
- QAudioEngine::OutputMode outputMode = QAudioEngine::Normal;
+ QAudioEngine::OutputMode outputMode = QAudioEngine::Surround;
bool roomEffectsEnabled = true;
// Resonance Audio uses meters internally, while Qt Quick 3D and our API uses cm by default.
diff --git a/src/multimediaquick3d/qquick3daudioengine.cpp b/src/multimediaquick3d/qquick3daudioengine.cpp
index 5bf7608af..60f083bca 100644
--- a/src/multimediaquick3d/qquick3daudioengine.cpp
+++ b/src/multimediaquick3d/qquick3daudioengine.cpp
@@ -94,9 +94,13 @@ QQuick3DAudioEngine::~QQuick3DAudioEngine()
\table
\header \li Property value
\li Description
- \row \li Normal
+ \row \li Surround
\li Map the sounds to the loudspeaker configuration of the output device.
This is normally a stereo or surround speaker setup.
+ \row \li Stereo
+ \li Map the sounds to the stereo loudspeaker configuration of the output device.
+ This will ignore any additional speakers and only use the left and right channels
+ to create a stero rendering of the sound field.
\row \li Headphone
\li Use Headphone spatialization to create a 3D audio effect when listening
to the sound field through headphones.
diff --git a/src/multimediaquick3d/qquick3daudioengine_p.h b/src/multimediaquick3d/qquick3daudioengine_p.h
index ed01eedc0..f44b3c0ad 100644
--- a/src/multimediaquick3d/qquick3daudioengine_p.h
+++ b/src/multimediaquick3d/qquick3daudioengine_p.h
@@ -56,7 +56,8 @@ class QQuick3DAudioEngine : public QObject
public:
// Keep in sync with QAudioEngine::OutputMode
enum OutputMode {
- Normal,
+ Surround,
+ Stereo,
Headphone
};
Q_ENUM(OutputMode)