diff options
author | Lars Knoll <lars.knoll@qt.io> | 2022-05-25 17:42:12 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2022-05-31 11:31:32 +0200 |
commit | bda1feae80e1f570cbc88b6cef371c2be8672792 (patch) | |
tree | 14941eb986c5ed4ffcfe2ae5003b8557d15ce849 | |
parent | bfec5416903d664a9143d4c0fe7145702ffc3f38 (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.cpp | 22 | ||||
-rw-r--r-- | src/multimedia/spatial/qaudioengine.cpp | 19 | ||||
-rw-r--r-- | src/multimedia/spatial/qaudioengine.h | 3 | ||||
-rw-r--r-- | src/multimedia/spatial/qaudioengine_p.h | 2 | ||||
-rw-r--r-- | src/multimediaquick3d/qquick3daudioengine.cpp | 6 | ||||
-rw-r--r-- | src/multimediaquick3d/qquick3daudioengine_p.h | 3 |
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) |