diff options
Diffstat (limited to 'src/spatialaudioquick3d/qquick3daudioroom.cpp')
-rw-r--r-- | src/spatialaudioquick3d/qquick3daudioroom.cpp | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/src/spatialaudioquick3d/qquick3daudioroom.cpp b/src/spatialaudioquick3d/qquick3daudioroom.cpp new file mode 100644 index 000000000..b79a6f609 --- /dev/null +++ b/src/spatialaudioquick3d/qquick3daudioroom.cpp @@ -0,0 +1,270 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-3.0-only +#include <qquick3daudioroom_p.h> +#include <qquick3daudioengine_p.h> +#include <qaudioroom.h> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype AudioRoom + \inqmlmodule QtQuick3D.SpatialAudio + \ingroup quick3d_spatialaudio + \ingroup multimedia_audio_qml + + Defines a room for the spatial audio engine. + + If the listener is inside a room, first order sound reflections and reverb + matching the rooms properties will get applied to the sound field. + + A room is always square and defined by its center position, its orientation and dimensions. + Each of the 6 walls of the room can be made of different materials that will contribute + to the computed reflections and reverb that the listener will experience while being inside + the room. + + If multiple rooms cover the same position, the engine will use the room with the smallest + volume. + */ + +QQuick3DAudioRoom::QQuick3DAudioRoom() +{ + m_room = new QAudioRoom(QQuick3DAudioEngine::getEngine()); + + connect(this, &QQuick3DNode::scenePositionChanged, this, &QQuick3DAudioRoom::updatePosition); + connect(this, &QQuick3DNode::sceneRotationChanged, this, &QQuick3DAudioRoom::updateRotation); + connect(m_room, &QAudioRoom::dimensionsChanged, this, &QQuick3DAudioRoom::dimensionsChanged); + connect(m_room, &QAudioRoom::rotationChanged, this, &QQuick3DAudioRoom::rotationChanged); + connect(m_room, &QAudioRoom::wallsChanged, this, &QQuick3DAudioRoom::wallsChanged); + connect(m_room, &QAudioRoom::reflectionGainChanged, this, &QQuick3DAudioRoom::reflectionGainChanged); + connect(m_room, &QAudioRoom::reverbGainChanged, this, &QQuick3DAudioRoom::reverbGainChanged); + connect(m_room, &QAudioRoom::reverbTimeChanged, this, &QQuick3DAudioRoom::reverbTimeChanged); + connect(m_room, &QAudioRoom::reverbBrightnessChanged, this, &QQuick3DAudioRoom::reverbBrightnessChanged); +} + +QQuick3DAudioRoom::~QQuick3DAudioRoom() +{ + delete m_room; +} + +/*! + \qmlproperty vector3D AudioRoom::dimensions + + Defines the dimensions of the room in 3D space. Units are in centimeters + by default. + + \sa QtQuick3D::Node::position + */ +void QQuick3DAudioRoom::setDimensions(QVector3D dim) +{ + m_room->setDimensions(dim); +} + +QVector3D QQuick3DAudioRoom::dimensions() const +{ + return m_room->dimensions(); +} + +/*! + \qmlproperty AudioRoom::Material AudioRoom::leftMaterial + \qmlproperty AudioRoom::Material AudioRoom::rightMaterial + \qmlproperty AudioRoom::Material AudioRoom::frontMaterial + \qmlproperty AudioRoom::Material AudioRoom::backMaterial + \qmlproperty AudioRoom::Material AudioRoom::floorMaterial + \qmlproperty AudioRoom::Material AudioRoom::ceilingMaterial + + Sets the material to use for the different sides of the room. Properties correlate to + coordinates as follows: + + \table + \header + \li Property + \li Coordinate + \row \li left \li Negative x + \row \li right \li Positive x + \row \li back \li Negative z + \row \li front \li Positive z + \row \li floor \li Negative y + \row \li ceiling \li Positive y + \endtable + + Valid values for the material are: + + \table + \header + \li Property value + \li Description + \row \li Transparent \li The side of the room is open and won't contribute to reflections or reverb. + \row \li AcousticCeilingTiles \li Acoustic tiles that suppress most reflections and reverb. + \row \li BrickBare \li A bare brick wall. + \row \li BrickPainted \li A painted brick wall. + \row \li ConcreteBlockCoarse \li A raw concrete wall + \row \li ConcreteBlockPainted \li A painted concrete wall + \row \li CurtainHeavy \li A heavy curtain. Will mostly reflect low frequencies + \row \li FiberGlassInsulation \li Fiber glass insulation. Only reflects very low frequencies + \row \li GlassThin \li A thin glass wall + \row \li GlassThick \li A thick glass wall + \row \li Grass \li Grass + \row \li LinoleumOnConcrete \li A Linoleum floor + \row \li Marble \li A marble floor + \row \li Metal \li Metal + \row \li ParquetOnConcrete \li Parquet wooden floor on concrete + \row \li PlasterRough \li Rough plaster + \row \li PlasterSmooth \li Smooth plaster + \row \li PlywoodPanel \li Plywodden panel + \row \li PolishedConcreteOrTile \li Polished concrete or tiles + \row \li Sheetrock \li Rock + \row \li WaterOrIceSurface \li Water or ice + \row \li WoodCeiling \li A wooden ceiling + \row \li WoodPanel \li Wooden panel + \row \li Uniform \li Artificial material giving uniform reflections on all frequencies + \endtable + */ +void QQuick3DAudioRoom::setLeftMaterial(Material material) +{ + m_room->setWallMaterial(QAudioRoom::LeftWall, QAudioRoom::Material(material)); +} + +QQuick3DAudioRoom::Material QQuick3DAudioRoom::leftMaterial() const +{ + return Material(m_room->wallMaterial(QAudioRoom::LeftWall)); +} + +void QQuick3DAudioRoom::setRightMaterial(Material material) +{ + m_room->setWallMaterial(QAudioRoom::RightWall, QAudioRoom::Material(material)); +} + +QQuick3DAudioRoom::Material QQuick3DAudioRoom::rightMaterial() const +{ + return Material(m_room->wallMaterial(QAudioRoom::RightWall)); +} + +void QQuick3DAudioRoom::setFrontMaterial(Material material) +{ + m_room->setWallMaterial(QAudioRoom::FrontWall, QAudioRoom::Material(material)); +} + +QQuick3DAudioRoom::Material QQuick3DAudioRoom::frontMaterial() const +{ + return Material(m_room->wallMaterial(QAudioRoom::FrontWall)); +} + +void QQuick3DAudioRoom::setBackMaterial(Material material) +{ + m_room->setWallMaterial(QAudioRoom::BackWall, QAudioRoom::Material(material)); +} + +QQuick3DAudioRoom::Material QQuick3DAudioRoom::backMaterial() const +{ + return Material(m_room->wallMaterial(QAudioRoom::BackWall)); +} + +void QQuick3DAudioRoom::setFloorMaterial(Material material) +{ + m_room->setWallMaterial(QAudioRoom::Floor, QAudioRoom::Material(material)); +} + +QQuick3DAudioRoom::Material QQuick3DAudioRoom::floorMaterial() const +{ + return Material(m_room->wallMaterial(QAudioRoom::Floor)); +} + +void QQuick3DAudioRoom::setCeilingMaterial(Material material) +{ + m_room->setWallMaterial(QAudioRoom::Ceiling, QAudioRoom::Material(material)); +} + +QQuick3DAudioRoom::Material QQuick3DAudioRoom::ceilingMaterial() const +{ + return Material(m_room->wallMaterial(QAudioRoom::Ceiling)); +} + +/*! + \qmlproperty float AudioRoom::reflectionGain + + A gain factor for reflections generated in this room. A value + from 0 to 1 will dampen reflections, while a value larger than 1 + will apply a gain to reflections, making them louder. + + The default is 1, a factor of 0 disables reflections. Negative + values are mapped to 0. + */ +void QQuick3DAudioRoom::setReflectionGain(float factor) +{ + m_room->setReflectionGain(factor); +} + +float QQuick3DAudioRoom::reflectionGain() const +{ + return m_room->reflectionGain(); +} + +/*! + \qmlproperty float AudioRoom::reverbGain + + A gain factor for reverb generated in this room. A value + from 0 to 1 will dampen reverb, while a value larger than 1 + will apply a gain to the reverb, making it louder. + + The default is 1, a factor of 0 disables reverb. Negative + values are mapped to 0. + */ +void QQuick3DAudioRoom::setReverbGain(float factor) +{ + m_room->setReverbGain(factor); +} + +float QQuick3DAudioRoom::reverbGain() const +{ + return m_room->reverbGain(); +} + +/*! + \qmlproperty float AudioRoom::reverbTime + + A factor to be applies to all reverb timings generated for this room. + Larger values will lead to longer reverb timings, making the room sound + larger. + + The default is 1. Negative values are mapped to 0. + */ +void QQuick3DAudioRoom::setReverbTime(float factor) +{ + m_room->setReverbTime(factor); +} + +float QQuick3DAudioRoom::reverbTime() const +{ + return m_room->reverbTime(); +} + +/*! + \qmlproperty float AudioRoom::reverbBrightness + + A brightness factor to be applied to the generated reverb. + A positive value will increase reverb for higher frequencies and + dampen lower frequencies, a negative value does the reverse. + + The default is 0. + */ +void QQuick3DAudioRoom::setReverbBrightness(float factor) +{ + m_room->setReverbBrightness(factor); +} + +float QQuick3DAudioRoom::reverbBrightness() const +{ + return m_room->reverbBrightness(); +} + +void QQuick3DAudioRoom::updatePosition() +{ + m_room->setPosition(scenePosition()); +} + +void QQuick3DAudioRoom::updateRotation() +{ + m_room->setRotation(sceneRotation()); +} + +QT_END_NAMESPACE |