Revision control
++ // Copyright (C) 2022 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-3.0-only
++ #include "qquick3daudioengine_p.h"
++
++ #include <QtMultimedia/qaudiodevice.h>
++ #include <QtCore/qcoreapplication.h>
++
++ QT_BEGIN_NAMESPACE
++
++ static std::unique_ptr<QAudioEngine> globalEngine;
++
++ /*!
++ \qmltype AudioEngine
++ \inqmlmodule QtQuick3D.SpatialAudio
++ \ingroup quick3d_spatialaudio
++ \ingroup multimedia_audio_qml
++
++ \brief AudioEngine manages sound objects inside a 3D scene.
++
++ AudioEngine manages sound objects inside a 3D scene. You can add
++ SpatialSound objects to the scene to define sounds that happen
++ at a specified location in 3D space. AmbientSound allows you to add
++ a stereo overlay (for example voice over or a sound track).
++
++ You can use AudioListener to define the position of the person listening
++ to the sound field relative to the sound sources. Sound sources will be less audible
++ if the listener is further away from source. They will also get mapped to the corresponding
++ loudspeakers depending on the direction between listener and source. In many cases, the
++ AudioListener object can simply be instantiated as a child object of the
++ \l{QtQuick3D::Camera}{QtQuick3D.Camera} object.
++
++ Create AudioRoom objcects to simulate the sound (reflections and reverb) of a room with
++ certain dimensions and different types of walls.
++
++ AudioEngine does offer a mode where Qt is using simulating the effects of the ear
++ using head related impulse reponse functions (see also https://en.wikipedia.org/wiki/Sound_localization)
++ to localize the sound in 3D space when using headphones and create a spatial audio effect through
++ headphones.
++
++ As the rest of Qt Quick 3D, the audio engine uses a coordinate system that is in centimeters by default.
++ The axes are defined so that positive x points to the right, positive y points up and positive z points
++ backwards.
++ */
++
++
++ QQuick3DAudioEngine::QQuick3DAudioEngine()
++ {
++ auto *e = getEngine();
++ connect(e, &QAudioEngine::outputModeChanged, this, &QQuick3DAudioEngine::outputModeChanged);
++ connect(e, &QAudioEngine::outputDeviceChanged, this, &QQuick3DAudioEngine::outputDeviceChanged);
++ connect(e, &QAudioEngine::masterVolumeChanged, this, &QQuick3DAudioEngine::masterVolumeChanged);
++ connect(e, &QAudioEngine::distanceScaleChanged, this, &QQuick3DAudioEngine::distanceScaleChanged);
++ }
++
++ QQuick3DAudioEngine::~QQuick3DAudioEngine()
++ {
++ }
++
++ /*!
++ \qmlproperty enumeration AudioEngine::outputMode
++
++ Sets or retrieves the current output mode of the engine.
++
++ \table
++ \header \li Property value
++ \li Description
++ \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.
++ \endtable
++ */
++
++ void QQuick3DAudioEngine::setOutputMode(OutputMode mode)
++ {
++ globalEngine->setOutputMode(QAudioEngine::OutputMode(mode));
++ }
++
++ QQuick3DAudioEngine::OutputMode QQuick3DAudioEngine::outputMode() const
++ {
++ return OutputMode(globalEngine->outputMode());
++ }
++
++ /*!
++ \qmlproperty QtMultimedia.AudioDevice AudioEngine::outputDevice
++
++ Sets or returns the device that is being used for outputting the sound field.
++ */
++ void QQuick3DAudioEngine::setOutputDevice(const QAudioDevice &device)
++ {
++ globalEngine->setOutputDevice(device);
++ }
++
++ QAudioDevice QQuick3DAudioEngine::outputDevice() const
++ {
++ return globalEngine->outputDevice();
++ }
++
++ /*!
++ \qmlproperty real AudioEngine::masterVolume
++
++ Sets or returns overall volume being used to render the sound field.
++ */
++ void QQuick3DAudioEngine::setMasterVolume(float volume)
++ {
++ globalEngine->setMasterVolume(volume);
++ }
++
++ float QQuick3DAudioEngine::masterVolume() const
++ {
++ return globalEngine->masterVolume();
++ }
++
++ /*!
++ \qmlproperty real AudioEngine::distanceScale
++ \since 6.11
++
++ Defines the scale of the coordinate system being used by the spatial audio engine.
++ By default, all units are in centimeters, in line with the default units being
++ used by Qt Quick 3D.
++
++ Set the distance scale to 100 to get units in meters.
++ */
++ void QQuick3DAudioEngine::setDistanceScale(float scale)
++ {
++ globalEngine->setDistanceScale(scale);
++ }
++
++ float QQuick3DAudioEngine::distanceScale() const
++ {
++ return globalEngine->distanceScale();
++ }
++
++ QAudioEngine *QQuick3DAudioEngine::getEngine()
++ {
++ if (!globalEngine) {
++ globalEngine = std::make_unique<QAudioEngine>();
++ globalEngine->start();
++ qAddPostRoutine([] {
++ // ensure to destroy it before any Q_APPLICATION_STATIC that manages the connection to the audio backend
++ globalEngine = {};
++ });
++ }
++ return globalEngine.get();
++ }
++
++ QT_END_NAMESPACE
++
++ #include "moc_qquick3daudioengine_p.cpp"