6#include <QtCore/qspan.h>
8#include "platforms/common/room_effects_utils.h"
16 return QVector3D(f[0], f[1], f[2]);
19inline void toFloats(QVector3D v, QSpan<
float, 3> f)
29 return QQuaternion(f[3], f[0], f[1], f[2]);
32inline void toFloats(QQuaternion q, QSpan<
float, 4> f)
49} occlusionAndDampening[] = {
80static_assert(QAudioRoom::LeftWall == 0);
81static_assert(QAudioRoom::RightWall == 1);
82static_assert(QAudioRoom::Floor == 2);
83static_assert(QAudioRoom::Ceiling == 3);
84static_assert(QAudioRoom::FrontWall == 4);
85static_assert(QAudioRoom::BackWall == 5);
87float QAudioRoomPrivate::wallOcclusion(QAudioRoom::Wall wall)
const
89 return m_wallOcclusion[wall] < 0 ? occlusionAndDampening[roomProperties.material_names[wall]].occlusion : m_wallOcclusion[wall];
92float QAudioRoomPrivate::wallDampening(QAudioRoom::Wall wall)
const
94 return m_wallDampening[wall] < 0 ? occlusionAndDampening[roomProperties.material_names[wall]].dampening : m_wallDampening[wall];
97void QAudioRoomPrivate::update()
101 reflections = vraudio::ComputeReflectionProperties(roomProperties);
102 reverb = vraudio::ComputeReverbProperties(roomProperties);
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
128
129
130QAudioRoom::QAudioRoom(QAudioEngine *engine) : QObject(*
new QAudioRoomPrivate)
135 auto *ep = QAudioEnginePrivate::get(engine);
140
141
142QAudioRoom::~QAudioRoom()
145 auto *ep = QAudioEnginePrivate::get(d->engine);
147 ep->removeRoom(
this);
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
182
183
184
185
186
187
188
189
190
191
192
196
197
198
199
200
201
202
203void QAudioRoom::setPosition(QVector3D pos)
206 auto *ep = QAudioEnginePrivate::get(d->engine);
207 pos *= ep->distanceScale;
208 if (toVector(d->roomProperties.position) == pos)
210 toFloats(pos, d->roomProperties.position);
212 emit positionChanged();
215QVector3D QAudioRoom::position()
const
217 Q_D(
const QAudioRoom);
218 auto *ep = QAudioEnginePrivate::get(d->engine);
219 auto pos = toVector(d->roomProperties.position);
220 pos /= ep->distanceScale;
225
226
227
228
229
230
231
232void QAudioRoom::setDimensions(QVector3D dim)
235 auto *ep = QAudioEnginePrivate::get(d->engine);
236 dim *= ep->distanceScale;
237 if (toVector(d->roomProperties.dimensions) == dim)
239 toFloats(dim, d->roomProperties.dimensions);
241 emit dimensionsChanged();
244QVector3D QAudioRoom::dimensions()
const
246 Q_D(
const QAudioRoom);
248 auto *ep = QAudioEnginePrivate::get(d->engine);
249 auto dim = toVector(d->roomProperties.dimensions);
250 dim /= ep->distanceScale;
255
256
257
258
259void QAudioRoom::setRotation(
const QQuaternion &q)
263 if (toQuaternion(d->roomProperties.rotation) == q)
265 toFloats(q, d->roomProperties.rotation);
267 emit rotationChanged();
270QQuaternion QAudioRoom::rotation()
const
272 Q_D(
const QAudioRoom);
274 return toQuaternion(d->roomProperties.rotation);
278
279
280
281
283
284
285
286
287
288
289
290void QAudioRoom::setWallMaterial(Wall wall, Material material)
294 static_assert(vraudio::kUniform ==
int(UniformMaterial));
295 static_assert(vraudio::kTransparent ==
int(Transparent));
297 if (d->roomProperties.material_names[
int(wall)] ==
int(material))
299 d->roomProperties.material_names[
int(wall)] = vraudio::MaterialName(
int(material));
305
306
307
308
309QAudioRoom::Material QAudioRoom::wallMaterial(Wall wall)
const
311 Q_D(
const QAudioRoom);
312 return Material(d->roomProperties.material_names[
int(wall)]);
316
317
318
319
320
321
322
323
324
325void QAudioRoom::setReflectionGain(
float factor)
331 if (d->roomProperties.reflection_scalar == factor)
333 d->roomProperties.reflection_scalar = factor;
335 emit reflectionGainChanged();
338float QAudioRoom::reflectionGain()
const
340 Q_D(
const QAudioRoom);
341 return d->roomProperties.reflection_scalar;
345
346
347
348
349
350
351
352
353
354void QAudioRoom::setReverbGain(
float factor)
360 if (d->roomProperties.reverb_gain == factor)
362 d->roomProperties.reverb_gain = factor;
364 emit reverbGainChanged();
367float QAudioRoom::reverbGain()
const
369 Q_D(
const QAudioRoom);
371 return d->roomProperties.reverb_gain;
375
376
377
378
379
380
381
382
383void QAudioRoom::setReverbTime(
float factor)
389 if (d->roomProperties.reverb_time == factor)
391 d->roomProperties.reverb_time = factor;
393 emit reverbTimeChanged();
396float QAudioRoom::reverbTime()
const
398 Q_D(
const QAudioRoom);
400 return d->roomProperties.reverb_time;
404
405
406
407
408
409
410
411
412void QAudioRoom::setReverbBrightness(
float factor)
416 if (d->roomProperties.reverb_brightness == factor)
418 d->roomProperties.reverb_brightness = factor;
420 emit reverbBrightnessChanged();
423float QAudioRoom::reverbBrightness()
const
425 Q_D(
const QAudioRoom);
427 return d->roomProperties.reverb_brightness;
432#include "moc_qaudioroom.cpp"
QQuaternion toQuaternion(QSpan< const float, 4 > f)
QVector3D toVector(QSpan< const float, 3 > f)
void toFloats(QVector3D v, QSpan< float, 3 > f)