| 1 | // Copyright (C) 2022 The Qt Company Ltd. |
| 2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-3.0-only |
| 3 | #include <qquick3daudioroom_p.h> |
| 4 | #include <qquick3daudioengine_p.h> |
| 5 | #include <qaudioroom.h> |
| 6 | |
| 7 | QT_BEGIN_NAMESPACE |
| 8 | |
| 9 | /*! |
| 10 | \qmltype AudioRoom |
| 11 | \inqmlmodule QtQuick3D.SpatialAudio |
| 12 | \ingroup quick3d_spatialaudio |
| 13 | \ingroup multimedia_audio_qml |
| 14 | |
| 15 | Defines a room for the spatial audio engine. |
| 16 | |
| 17 | If the listener is inside a room, first order sound reflections and reverb |
| 18 | matching the rooms properties will get applied to the sound field. |
| 19 | |
| 20 | A room is always square and defined by its center position, its orientation and dimensions. |
| 21 | Each of the 6 walls of the room can be made of different materials that will contribute |
| 22 | to the computed reflections and reverb that the listener will experience while being inside |
| 23 | the room. |
| 24 | |
| 25 | If multiple rooms cover the same position, the engine will use the room with the smallest |
| 26 | volume. |
| 27 | */ |
| 28 | |
| 29 | QQuick3DAudioRoom::QQuick3DAudioRoom() |
| 30 | { |
| 31 | m_room = new QAudioRoom(QQuick3DAudioEngine::getEngine()); |
| 32 | |
| 33 | connect(sender: this, signal: &QQuick3DNode::scenePositionChanged, context: this, slot: &QQuick3DAudioRoom::updatePosition); |
| 34 | connect(sender: this, signal: &QQuick3DNode::sceneRotationChanged, context: this, slot: &QQuick3DAudioRoom::updateRotation); |
| 35 | connect(sender: m_room, signal: &QAudioRoom::dimensionsChanged, context: this, slot: &QQuick3DAudioRoom::dimensionsChanged); |
| 36 | connect(sender: m_room, signal: &QAudioRoom::rotationChanged, context: this, slot: &QQuick3DAudioRoom::rotationChanged); |
| 37 | connect(sender: m_room, signal: &QAudioRoom::wallsChanged, context: this, slot: &QQuick3DAudioRoom::wallsChanged); |
| 38 | connect(sender: m_room, signal: &QAudioRoom::reflectionGainChanged, context: this, slot: &QQuick3DAudioRoom::reflectionGainChanged); |
| 39 | connect(sender: m_room, signal: &QAudioRoom::reverbGainChanged, context: this, slot: &QQuick3DAudioRoom::reverbGainChanged); |
| 40 | connect(sender: m_room, signal: &QAudioRoom::reverbTimeChanged, context: this, slot: &QQuick3DAudioRoom::reverbTimeChanged); |
| 41 | connect(sender: m_room, signal: &QAudioRoom::reverbBrightnessChanged, context: this, slot: &QQuick3DAudioRoom::reverbBrightnessChanged); |
| 42 | } |
| 43 | |
| 44 | QQuick3DAudioRoom::~QQuick3DAudioRoom() |
| 45 | { |
| 46 | delete m_room; |
| 47 | } |
| 48 | |
| 49 | /*! |
| 50 | \qmlproperty vector3D AudioRoom::dimensions |
| 51 | |
| 52 | Defines the dimensions of the room in 3D space. Units are in centimeters |
| 53 | by default. |
| 54 | |
| 55 | \sa QtQuick3D::Node::position |
| 56 | */ |
| 57 | void QQuick3DAudioRoom::setDimensions(QVector3D dim) |
| 58 | { |
| 59 | m_room->setDimensions(dim); |
| 60 | } |
| 61 | |
| 62 | QVector3D QQuick3DAudioRoom::dimensions() const |
| 63 | { |
| 64 | return m_room->dimensions(); |
| 65 | } |
| 66 | |
| 67 | /*! |
| 68 | \qmlproperty AudioRoom::Material AudioRoom::leftMaterial |
| 69 | \qmlproperty AudioRoom::Material AudioRoom::rightMaterial |
| 70 | \qmlproperty AudioRoom::Material AudioRoom::frontMaterial |
| 71 | \qmlproperty AudioRoom::Material AudioRoom::backMaterial |
| 72 | \qmlproperty AudioRoom::Material AudioRoom::floorMaterial |
| 73 | \qmlproperty AudioRoom::Material AudioRoom::ceilingMaterial |
| 74 | |
| 75 | Sets the material to use for the different sides of the room. Properties correlate to |
| 76 | coordinates as follows: |
| 77 | |
| 78 | \table |
| 79 | \header |
| 80 | \li Property |
| 81 | \li Coordinate |
| 82 | \row \li left \li Negative x |
| 83 | \row \li right \li Positive x |
| 84 | \row \li back \li Negative z |
| 85 | \row \li front \li Positive z |
| 86 | \row \li floor \li Negative y |
| 87 | \row \li ceiling \li Positive y |
| 88 | \endtable |
| 89 | |
| 90 | Valid values for the material are: |
| 91 | |
| 92 | \table |
| 93 | \header |
| 94 | \li Property value |
| 95 | \li Description |
| 96 | \row \li Transparent \li The side of the room is open and won't contribute to reflections or reverb. |
| 97 | \row \li AcousticCeilingTiles \li Acoustic tiles that suppress most reflections and reverb. |
| 98 | \row \li BrickBare \li A bare brick wall. |
| 99 | \row \li BrickPainted \li A painted brick wall. |
| 100 | \row \li ConcreteBlockCoarse \li A raw concrete wall |
| 101 | \row \li ConcreteBlockPainted \li A painted concrete wall |
| 102 | \row \li CurtainHeavy \li A heavy curtain. Will mostly reflect low frequencies |
| 103 | \row \li FiberGlassInsulation \li Fiber glass insulation. Only reflects very low frequencies |
| 104 | \row \li GlassThin \li A thin glass wall |
| 105 | \row \li GlassThick \li A thick glass wall |
| 106 | \row \li Grass \li Grass |
| 107 | \row \li LinoleumOnConcrete \li A Linoleum floor |
| 108 | \row \li Marble \li A marble floor |
| 109 | \row \li Metal \li Metal |
| 110 | \row \li ParquetOnConcrete \li Parquet wooden floor on concrete |
| 111 | \row \li PlasterRough \li Rough plaster |
| 112 | \row \li PlasterSmooth \li Smooth plaster |
| 113 | \row \li PlywoodPanel \li Plywodden panel |
| 114 | \row \li PolishedConcreteOrTile \li Polished concrete or tiles |
| 115 | \row \li Sheetrock \li Rock |
| 116 | \row \li WaterOrIceSurface \li Water or ice |
| 117 | \row \li WoodCeiling \li A wooden ceiling |
| 118 | \row \li WoodPanel \li Wooden panel |
| 119 | \row \li Uniform \li Artificial material giving uniform reflections on all frequencies |
| 120 | \endtable |
| 121 | */ |
| 122 | void QQuick3DAudioRoom::setLeftMaterial(Material material) |
| 123 | { |
| 124 | m_room->setWallMaterial(wall: QAudioRoom::LeftWall, material: QAudioRoom::Material(material)); |
| 125 | } |
| 126 | |
| 127 | QQuick3DAudioRoom::Material QQuick3DAudioRoom::leftMaterial() const |
| 128 | { |
| 129 | return Material(m_room->wallMaterial(wall: QAudioRoom::LeftWall)); |
| 130 | } |
| 131 | |
| 132 | void QQuick3DAudioRoom::setRightMaterial(Material material) |
| 133 | { |
| 134 | m_room->setWallMaterial(wall: QAudioRoom::RightWall, material: QAudioRoom::Material(material)); |
| 135 | } |
| 136 | |
| 137 | QQuick3DAudioRoom::Material QQuick3DAudioRoom::rightMaterial() const |
| 138 | { |
| 139 | return Material(m_room->wallMaterial(wall: QAudioRoom::RightWall)); |
| 140 | } |
| 141 | |
| 142 | void QQuick3DAudioRoom::setFrontMaterial(Material material) |
| 143 | { |
| 144 | m_room->setWallMaterial(wall: QAudioRoom::FrontWall, material: QAudioRoom::Material(material)); |
| 145 | } |
| 146 | |
| 147 | QQuick3DAudioRoom::Material QQuick3DAudioRoom::frontMaterial() const |
| 148 | { |
| 149 | return Material(m_room->wallMaterial(wall: QAudioRoom::FrontWall)); |
| 150 | } |
| 151 | |
| 152 | void QQuick3DAudioRoom::setBackMaterial(Material material) |
| 153 | { |
| 154 | m_room->setWallMaterial(wall: QAudioRoom::BackWall, material: QAudioRoom::Material(material)); |
| 155 | } |
| 156 | |
| 157 | QQuick3DAudioRoom::Material QQuick3DAudioRoom::backMaterial() const |
| 158 | { |
| 159 | return Material(m_room->wallMaterial(wall: QAudioRoom::BackWall)); |
| 160 | } |
| 161 | |
| 162 | void QQuick3DAudioRoom::setFloorMaterial(Material material) |
| 163 | { |
| 164 | m_room->setWallMaterial(wall: QAudioRoom::Floor, material: QAudioRoom::Material(material)); |
| 165 | } |
| 166 | |
| 167 | QQuick3DAudioRoom::Material QQuick3DAudioRoom::floorMaterial() const |
| 168 | { |
| 169 | return Material(m_room->wallMaterial(wall: QAudioRoom::Floor)); |
| 170 | } |
| 171 | |
| 172 | void QQuick3DAudioRoom::setCeilingMaterial(Material material) |
| 173 | { |
| 174 | m_room->setWallMaterial(wall: QAudioRoom::Ceiling, material: QAudioRoom::Material(material)); |
| 175 | } |
| 176 | |
| 177 | QQuick3DAudioRoom::Material QQuick3DAudioRoom::ceilingMaterial() const |
| 178 | { |
| 179 | return Material(m_room->wallMaterial(wall: QAudioRoom::Ceiling)); |
| 180 | } |
| 181 | |
| 182 | /*! |
| 183 | \qmlproperty real AudioRoom::reflectionGain |
| 184 | |
| 185 | A gain factor for reflections generated in this room. A value |
| 186 | from 0 to 1 will dampen reflections, while a value larger than 1 |
| 187 | will apply a gain to reflections, making them louder. |
| 188 | |
| 189 | The default is 1, a factor of 0 disables reflections. Negative |
| 190 | values are mapped to 0. |
| 191 | */ |
| 192 | void QQuick3DAudioRoom::setReflectionGain(float factor) |
| 193 | { |
| 194 | m_room->setReflectionGain(factor); |
| 195 | } |
| 196 | |
| 197 | float QQuick3DAudioRoom::reflectionGain() const |
| 198 | { |
| 199 | return m_room->reflectionGain(); |
| 200 | } |
| 201 | |
| 202 | /*! |
| 203 | \qmlproperty real AudioRoom::reverbGain |
| 204 | |
| 205 | A gain factor for reverb generated in this room. A value |
| 206 | from 0 to 1 will dampen reverb, while a value larger than 1 |
| 207 | will apply a gain to the reverb, making it louder. |
| 208 | |
| 209 | The default is 1, a factor of 0 disables reverb. Negative |
| 210 | values are mapped to 0. |
| 211 | */ |
| 212 | void QQuick3DAudioRoom::setReverbGain(float factor) |
| 213 | { |
| 214 | m_room->setReverbGain(factor); |
| 215 | } |
| 216 | |
| 217 | float QQuick3DAudioRoom::reverbGain() const |
| 218 | { |
| 219 | return m_room->reverbGain(); |
| 220 | } |
| 221 | |
| 222 | /*! |
| 223 | \qmlproperty real AudioRoom::reverbTime |
| 224 | |
| 225 | A factor to be applies to all reverb timings generated for this room. |
| 226 | Larger values will lead to longer reverb timings, making the room sound |
| 227 | larger. |
| 228 | |
| 229 | The default is 1. Negative values are mapped to 0. |
| 230 | */ |
| 231 | void QQuick3DAudioRoom::setReverbTime(float factor) |
| 232 | { |
| 233 | m_room->setReverbTime(factor); |
| 234 | } |
| 235 | |
| 236 | float QQuick3DAudioRoom::reverbTime() const |
| 237 | { |
| 238 | return m_room->reverbTime(); |
| 239 | } |
| 240 | |
| 241 | /*! |
| 242 | \qmlproperty real AudioRoom::reverbBrightness |
| 243 | |
| 244 | A brightness factor to be applied to the generated reverb. |
| 245 | A positive value will increase reverb for higher frequencies and |
| 246 | dampen lower frequencies, a negative value does the reverse. |
| 247 | |
| 248 | The default is 0. |
| 249 | */ |
| 250 | void QQuick3DAudioRoom::setReverbBrightness(float factor) |
| 251 | { |
| 252 | m_room->setReverbBrightness(factor); |
| 253 | } |
| 254 | |
| 255 | float QQuick3DAudioRoom::reverbBrightness() const |
| 256 | { |
| 257 | return m_room->reverbBrightness(); |
| 258 | } |
| 259 | |
| 260 | void QQuick3DAudioRoom::updatePosition() |
| 261 | { |
| 262 | m_room->setPosition(scenePosition()); |
| 263 | } |
| 264 | |
| 265 | void QQuick3DAudioRoom::updateRotation() |
| 266 | { |
| 267 | m_room->setRotation(sceneRotation()); |
| 268 | } |
| 269 | |
| 270 | QT_END_NAMESPACE |
| 271 | |