7#include <QtCore/qspan.h>
9#include "platforms/common/room_effects_utils.h"
17 return QVector3D(f[0], f[1], f[2]);
20inline void toFloats(QVector3D v, QSpan<
float, 3> f)
30 return QQuaternion(f[3], f[0], f[1], f[2]);
33inline void toFloats(QQuaternion q, QSpan<
float, 4> f)
50} occlusionAndDampening[] = {
81static_assert(QAudioRoom::LeftWall == 0);
82static_assert(QAudioRoom::RightWall == 1);
83static_assert(QAudioRoom::Floor == 2);
84static_assert(QAudioRoom::Ceiling == 3);
85static_assert(QAudioRoom::FrontWall == 4);
86static_assert(QAudioRoom::BackWall == 5);
88void QAudioRoomPrivate::requestUpdate()
91 auto ep = QAudioEnginePrivate::get(engine);
97float QAudioRoomPrivate::wallOcclusion(QAudioRoom::Wall wall)
const
99 return m_wallOcclusion[wall] < 0 ? occlusionAndDampening[roomProperties.material_names[wall]].occlusion : m_wallOcclusion[wall];
102float QAudioRoomPrivate::wallDampening(QAudioRoom::Wall wall)
const
104 return m_wallDampening[wall] < 0 ? occlusionAndDampening[roomProperties.material_names[wall]].dampening : m_wallDampening[wall];
107void QAudioRoomPrivate::update()
111 reflections = vraudio::ComputeReflectionProperties(roomProperties);
112 reverb = vraudio::ComputeReverbProperties(roomProperties);
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
138
139
140
141
142QAudioRoom::QAudioRoom(QAudioEngine *engine) : QObject(*
new QAudioRoomPrivate)
145 qWarning() <<
"Cannot create QAudioRoom without a valid QAudioEngine";
151 auto *ep = QAudioEnginePrivate::get(engine);
158
159
160QAudioRoom::~QAudioRoom()
163 auto *ep = QAudioEnginePrivate::get(d->engine);
165 ep->removeRoom(
this);
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
200
201
202
203
204
205
206
207
208
209
210
214
215
216
217
218
219
220
221void QAudioRoom::setPosition(QVector3D pos)
224 auto *ep = QAudioEnginePrivate::get(d->engine);
228 pos *= ep->distanceScale();
229 if (toVector(d->roomProperties.position) == pos)
231 toFloats(pos, d->roomProperties.position);
233 emit positionChanged();
236QVector3D QAudioRoom::position()
const
238 Q_D(
const QAudioRoom);
239 auto *ep = QAudioEnginePrivate::get(d->engine);
243 auto pos = toVector(d->roomProperties.position);
244 pos /= ep->distanceScale();
249
250
251
252
253
254
255
256void QAudioRoom::setDimensions(QVector3D dim)
259 auto *ep = QAudioEnginePrivate::get(d->engine);
263 dim *= ep->distanceScale();
264 if (toVector(d->roomProperties.dimensions) == dim)
266 toFloats(dim, d->roomProperties.dimensions);
268 emit dimensionsChanged();
271QVector3D QAudioRoom::dimensions()
const
273 Q_D(
const QAudioRoom);
274 auto *ep = QAudioEnginePrivate::get(d->engine);
278 auto dim = toVector(d->roomProperties.dimensions);
279 dim /= ep->distanceScale();
284
285
286
287
288void QAudioRoom::setRotation(
const QQuaternion &q)
292 if (toQuaternion(d->roomProperties.rotation) == q)
294 toFloats(q, d->roomProperties.rotation);
296 emit rotationChanged();
299QQuaternion QAudioRoom::rotation()
const
301 Q_D(
const QAudioRoom);
303 return toQuaternion(d->roomProperties.rotation);
307
308
309
310
312
313
314
315
316
317
318
319void QAudioRoom::setWallMaterial(Wall wall, Material material)
323 static_assert(vraudio::kUniform ==
int(UniformMaterial));
324 static_assert(vraudio::kTransparent ==
int(Transparent));
326 if (d->roomProperties.material_names[
int(wall)] ==
int(material))
328 d->roomProperties.material_names[
int(wall)] = vraudio::MaterialName(
int(material));
334
335
336
337
338QAudioRoom::Material QAudioRoom::wallMaterial(Wall wall)
const
340 Q_D(
const QAudioRoom);
341 return Material(d->roomProperties.material_names[
int(wall)]);
345
346
347
348
349
350
351
352
353
354void QAudioRoom::setReflectionGain(
float factor)
360 if (d->roomProperties.reflection_scalar == factor)
362 d->roomProperties.reflection_scalar = factor;
364 emit reflectionGainChanged();
367float QAudioRoom::reflectionGain()
const
369 Q_D(
const QAudioRoom);
370 return d->roomProperties.reflection_scalar;
374
375
376
377
378
379
380
381
382
383void QAudioRoom::setReverbGain(
float factor)
389 if (d->roomProperties.reverb_gain == factor)
391 d->roomProperties.reverb_gain = factor;
393 emit reverbGainChanged();
396float QAudioRoom::reverbGain()
const
398 Q_D(
const QAudioRoom);
400 return d->roomProperties.reverb_gain;
404
405
406
407
408
409
410
411
412void QAudioRoom::setReverbTime(
float factor)
418 if (d->roomProperties.reverb_time == factor)
420 d->roomProperties.reverb_time = factor;
422 emit reverbTimeChanged();
425float QAudioRoom::reverbTime()
const
427 Q_D(
const QAudioRoom);
429 return d->roomProperties.reverb_time;
433
434
435
436
437
438
439
440
441void QAudioRoom::setReverbBrightness(
float factor)
445 if (d->roomProperties.reverb_brightness == factor)
447 d->roomProperties.reverb_brightness = factor;
449 emit reverbBrightnessChanged();
452float QAudioRoom::reverbBrightness()
const
454 Q_D(
const QAudioRoom);
456 return d->roomProperties.reverb_brightness;
461#include "moc_qaudioroom.cpp"
Combined button and popup list for selecting options.
QQuaternion toQuaternion(QSpan< const float, 4 > f)
QVector3D toVector(QSpan< const float, 3 > f)
void toFloats(QVector3D v, QSpan< float, 3 > f)