Refactored code for audio engine to allow dynamic object creation
QDeclarativeSound, QDeclarativeAudioSample, QDeclarativeAudioCategory and QDeclarativeAttenuationModel can now be dynamically added to AudioEngine instance or declared inside AudioEngine object definition. QDeclarativePlayVariation can now be dynamically added to Sound instance or declared inside Sound object definition. Change-Id: If4c2e16895a71eb71ded1998c107360698f8ac7f Reviewed-by: Yoann Lopes <yoann.lopes@theqtcompany.com>
This commit is contained in:
committed by
Konstantin Ritt
parent
227c8aa723
commit
176d52bb28
@@ -68,6 +68,10 @@ public:
|
|||||||
|
|
||||||
qmlRegisterType<QDeclarativeAttenuationModelLinear>(uri, 1, 0, "AttenuationModelLinear");
|
qmlRegisterType<QDeclarativeAttenuationModelLinear>(uri, 1, 0, "AttenuationModelLinear");
|
||||||
qmlRegisterType<QDeclarativeAttenuationModelInverse>(uri, 1, 0, "AttenuationModelInverse");
|
qmlRegisterType<QDeclarativeAttenuationModelInverse>(uri, 1, 0, "AttenuationModelInverse");
|
||||||
|
|
||||||
|
// Dynamically adding audio engine related objects is only supported through revision 1
|
||||||
|
qmlRegisterRevision<QDeclarativeAudioEngine, 1>(uri, 1, 1);
|
||||||
|
qmlRegisterRevision<QDeclarativeSound, 1>(uri, 1, 1);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "qdeclarative_attenuationmodel_p.h"
|
#include "qdeclarative_attenuationmodel_p.h"
|
||||||
|
#include "qdeclarative_audioengine_p.h"
|
||||||
#include "qdebug.h"
|
#include "qdebug.h"
|
||||||
|
|
||||||
#define DEBUG_AUDIOENGINE
|
#define DEBUG_AUDIOENGINE
|
||||||
@@ -40,7 +41,7 @@ QT_USE_NAMESPACE
|
|||||||
|
|
||||||
QDeclarativeAttenuationModel::QDeclarativeAttenuationModel(QObject *parent)
|
QDeclarativeAttenuationModel::QDeclarativeAttenuationModel(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_complete(false)
|
, m_engine(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,22 +49,9 @@ QDeclarativeAttenuationModel::~QDeclarativeAttenuationModel()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void QDeclarativeAttenuationModel::classBegin()
|
void QDeclarativeAttenuationModel::setEngine(QDeclarativeAudioEngine *engine)
|
||||||
{
|
{
|
||||||
if (!parent() || !parent()->inherits("QDeclarativeAudioEngine")) {
|
m_engine = engine;
|
||||||
qWarning("AttenuationModel must be defined inside AudioEngine!");
|
|
||||||
//TODO: COMPILE_EXCEPTION ?
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QDeclarativeAttenuationModel::componentComplete()
|
|
||||||
{
|
|
||||||
if (m_name.isEmpty()) {
|
|
||||||
qWarning("AttenuationModel must have a name!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_complete = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString QDeclarativeAttenuationModel::name() const
|
QString QDeclarativeAttenuationModel::name() const
|
||||||
@@ -73,7 +61,7 @@ QString QDeclarativeAttenuationModel::name() const
|
|||||||
|
|
||||||
void QDeclarativeAttenuationModel::setName(const QString& name)
|
void QDeclarativeAttenuationModel::setName(const QString& name)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("AttenuationModel: you can not change name after initialization.");
|
qWarning("AttenuationModel: you can not change name after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -93,7 +81,9 @@ void QDeclarativeAttenuationModel::setName(const QString& name)
|
|||||||
|
|
||||||
This type is part of the \b{QtAudioEngine 1.0} module.
|
This type is part of the \b{QtAudioEngine 1.0} module.
|
||||||
|
|
||||||
AttenuationModelLinear must be defined inside \l AudioEngine.
|
AttenuationModelLinear must be defined inside \l AudioEngine or be added to it using
|
||||||
|
\l{QtAudioEngine::AudioEngine::addAttenuationModel()}{AudioEngine.addAttenuationModel()}
|
||||||
|
if AttenuationModelLinear is created dynamically.
|
||||||
|
|
||||||
\qml
|
\qml
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
@@ -144,13 +134,13 @@ QDeclarativeAttenuationModelLinear::QDeclarativeAttenuationModelLinear(QObject *
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void QDeclarativeAttenuationModelLinear::componentComplete()
|
void QDeclarativeAttenuationModelLinear::setEngine(QDeclarativeAudioEngine *engine)
|
||||||
{
|
{
|
||||||
if (m_start > m_end) {
|
if (m_start > m_end) {
|
||||||
qSwap(m_start, m_end);
|
qSwap(m_start, m_end);
|
||||||
qWarning() << "AttenuationModelLinear[" << m_name << "]: start must be less or equal than end.";
|
qWarning() << "AttenuationModelLinear[" << m_name << "]: start must be less or equal than end.";
|
||||||
}
|
}
|
||||||
QDeclarativeAttenuationModel::componentComplete();
|
QDeclarativeAttenuationModel::setEngine(engine);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -167,7 +157,7 @@ qreal QDeclarativeAttenuationModelLinear::startDistance() const
|
|||||||
|
|
||||||
void QDeclarativeAttenuationModelLinear::setStartDistance(qreal startDist)
|
void QDeclarativeAttenuationModelLinear::setStartDistance(qreal startDist)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning() << "AttenuationModelLinear[" << m_name << "]: you can not change properties after initialization.";
|
qWarning() << "AttenuationModelLinear[" << m_name << "]: you can not change properties after initialization.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -192,7 +182,7 @@ qreal QDeclarativeAttenuationModelLinear::endDistance() const
|
|||||||
|
|
||||||
void QDeclarativeAttenuationModelLinear::setEndDistance(qreal endDist)
|
void QDeclarativeAttenuationModelLinear::setEndDistance(qreal endDist)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning() << "AttenuationModelLinear[" << m_name << "]: you can not change properties after initialization.";
|
qWarning() << "AttenuationModelLinear[" << m_name << "]: you can not change properties after initialization.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -226,7 +216,9 @@ qreal QDeclarativeAttenuationModelLinear::calculateGain(const QVector3D &listene
|
|||||||
|
|
||||||
This type is part of the \b{QtAudioEngine 1.0} module.
|
This type is part of the \b{QtAudioEngine 1.0} module.
|
||||||
|
|
||||||
AttenuationModelInverse must be defined inside AudioEngine.
|
AttenuationModelInverse must be defined inside \l AudioEngine or be added to it using
|
||||||
|
\l{QtAudioEngine::AudioEngine::addAttenuationModel()}{AudioEngine.addAttenuationModel()}
|
||||||
|
if AttenuationModelInverse is created dynamically.
|
||||||
|
|
||||||
\qml
|
\qml
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
@@ -309,13 +301,13 @@ QDeclarativeAttenuationModelInverse::QDeclarativeAttenuationModelInverse(QObject
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void QDeclarativeAttenuationModelInverse::componentComplete()
|
void QDeclarativeAttenuationModelInverse::setEngine(QDeclarativeAudioEngine *engine)
|
||||||
{
|
{
|
||||||
if (m_ref > m_max) {
|
if (m_ref > m_max) {
|
||||||
qSwap(m_ref, m_max);
|
qSwap(m_ref, m_max);
|
||||||
qWarning() << "AttenuationModelInverse[" << m_name << "]: referenceDistance must be less or equal than maxDistance.";
|
qWarning() << "AttenuationModelInverse[" << m_name << "]: referenceDistance must be less or equal than maxDistance.";
|
||||||
}
|
}
|
||||||
QDeclarativeAttenuationModel::componentComplete();
|
QDeclarativeAttenuationModel::setEngine(engine);
|
||||||
}
|
}
|
||||||
|
|
||||||
qreal QDeclarativeAttenuationModelInverse::referenceDistance() const
|
qreal QDeclarativeAttenuationModelInverse::referenceDistance() const
|
||||||
@@ -325,7 +317,7 @@ qreal QDeclarativeAttenuationModelInverse::referenceDistance() const
|
|||||||
|
|
||||||
void QDeclarativeAttenuationModelInverse::setReferenceDistance(qreal referenceDistance)
|
void QDeclarativeAttenuationModelInverse::setReferenceDistance(qreal referenceDistance)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning() << "AttenuationModelInverse[" << m_name << "]: you can not change properties after initialization.";
|
qWarning() << "AttenuationModelInverse[" << m_name << "]: you can not change properties after initialization.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -343,7 +335,7 @@ qreal QDeclarativeAttenuationModelInverse::maxDistance() const
|
|||||||
|
|
||||||
void QDeclarativeAttenuationModelInverse::setMaxDistance(qreal maxDistance)
|
void QDeclarativeAttenuationModelInverse::setMaxDistance(qreal maxDistance)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning() << "AttenuationModelInverse[" << m_name << "]: you can not change properties after initialization.";
|
qWarning() << "AttenuationModelInverse[" << m_name << "]: you can not change properties after initialization.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -361,7 +353,7 @@ qreal QDeclarativeAttenuationModelInverse::rolloffFactor() const
|
|||||||
|
|
||||||
void QDeclarativeAttenuationModelInverse::setRolloffFactor(qreal rolloffFactor)
|
void QDeclarativeAttenuationModelInverse::setRolloffFactor(qreal rolloffFactor)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning() << "AttenuationModelInverse[" << m_name << "]: you can not change properties after initialization.";
|
qWarning() << "AttenuationModelInverse[" << m_name << "]: you can not change properties after initialization.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,32 +35,31 @@
|
|||||||
#define QDECLARATIVEATTENUATIONMODEL_P_H
|
#define QDECLARATIVEATTENUATIONMODEL_P_H
|
||||||
|
|
||||||
#include <QtQml/qqml.h>
|
#include <QtQml/qqml.h>
|
||||||
#include <QtQml/qqmlcomponent.h>
|
|
||||||
#include <QVector3D>
|
#include <QVector3D>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
class QDeclarativeAttenuationModel : public QObject, public QQmlParserStatus
|
class QDeclarativeAudioEngine;
|
||||||
|
|
||||||
|
class QDeclarativeAttenuationModel : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_INTERFACES(QQmlParserStatus)
|
|
||||||
Q_PROPERTY(QString name READ name WRITE setName)
|
Q_PROPERTY(QString name READ name WRITE setName)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QDeclarativeAttenuationModel(QObject *parent = 0);
|
QDeclarativeAttenuationModel(QObject *parent = 0);
|
||||||
~QDeclarativeAttenuationModel();
|
~QDeclarativeAttenuationModel();
|
||||||
|
|
||||||
void classBegin();
|
|
||||||
void componentComplete();
|
|
||||||
|
|
||||||
QString name() const;
|
QString name() const;
|
||||||
void setName(const QString& name);
|
void setName(const QString& name);
|
||||||
|
|
||||||
virtual qreal calculateGain(const QVector3D &listenerPosition, const QVector3D &sourcePosition) const = 0;
|
virtual qreal calculateGain(const QVector3D &listenerPosition, const QVector3D &sourcePosition) const = 0;
|
||||||
|
|
||||||
|
virtual void setEngine(QDeclarativeAudioEngine *engine);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool m_complete;
|
|
||||||
QString m_name;
|
QString m_name;
|
||||||
|
QDeclarativeAudioEngine *m_engine;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(QDeclarativeAttenuationModel);
|
Q_DISABLE_COPY(QDeclarativeAttenuationModel);
|
||||||
@@ -75,8 +74,6 @@ class QDeclarativeAttenuationModelLinear : public QDeclarativeAttenuationModel
|
|||||||
public:
|
public:
|
||||||
QDeclarativeAttenuationModelLinear(QObject *parent = 0);
|
QDeclarativeAttenuationModelLinear(QObject *parent = 0);
|
||||||
|
|
||||||
void componentComplete();
|
|
||||||
|
|
||||||
qreal startDistance() const;
|
qreal startDistance() const;
|
||||||
void setStartDistance(qreal startDist);
|
void setStartDistance(qreal startDist);
|
||||||
|
|
||||||
@@ -85,6 +82,8 @@ public:
|
|||||||
|
|
||||||
qreal calculateGain(const QVector3D &listenerPosition, const QVector3D &sourcePosition) const;
|
qreal calculateGain(const QVector3D &listenerPosition, const QVector3D &sourcePosition) const;
|
||||||
|
|
||||||
|
void setEngine(QDeclarativeAudioEngine *engine);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(QDeclarativeAttenuationModelLinear);
|
Q_DISABLE_COPY(QDeclarativeAttenuationModelLinear);
|
||||||
qreal m_start;
|
qreal m_start;
|
||||||
@@ -101,8 +100,6 @@ class QDeclarativeAttenuationModelInverse : public QDeclarativeAttenuationModel
|
|||||||
public:
|
public:
|
||||||
QDeclarativeAttenuationModelInverse(QObject *parent = 0);
|
QDeclarativeAttenuationModelInverse(QObject *parent = 0);
|
||||||
|
|
||||||
void componentComplete();
|
|
||||||
|
|
||||||
qreal referenceDistance() const;
|
qreal referenceDistance() const;
|
||||||
void setReferenceDistance(qreal referenceDistance);
|
void setReferenceDistance(qreal referenceDistance);
|
||||||
|
|
||||||
@@ -114,6 +111,8 @@ public:
|
|||||||
|
|
||||||
qreal calculateGain(const QVector3D &listenerPosition, const QVector3D &sourcePosition) const;
|
qreal calculateGain(const QVector3D &listenerPosition, const QVector3D &sourcePosition) const;
|
||||||
|
|
||||||
|
void setEngine(QDeclarativeAudioEngine *engine);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(QDeclarativeAttenuationModelInverse);
|
Q_DISABLE_COPY(QDeclarativeAttenuationModelInverse);
|
||||||
qreal m_ref;
|
qreal m_ref;
|
||||||
|
|||||||
@@ -51,7 +51,9 @@ QT_USE_NAMESPACE
|
|||||||
This type is part of the \b{QtAudioEngine 1.0} module.
|
This type is part of the \b{QtAudioEngine 1.0} module.
|
||||||
|
|
||||||
An instance of AudioCategory can be accessed through \l {QtAudioEngine::AudioEngine::categories}
|
An instance of AudioCategory can be accessed through \l {QtAudioEngine::AudioEngine::categories}
|
||||||
{AudioEngine.categories} with its unique name and must be defined inside AudioEngine.
|
{AudioEngine.categories} with its unique name and must be defined inside AudioEngine or be added
|
||||||
|
to it using \l{QtAudioEngine::AudioEngine::addAudioCategory()}{AudioEngine.addAudioCategory()} if
|
||||||
|
AudioCategory is created dynamically.
|
||||||
|
|
||||||
\qml
|
\qml
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
@@ -103,8 +105,8 @@ QT_USE_NAMESPACE
|
|||||||
*/
|
*/
|
||||||
QDeclarativeAudioCategory::QDeclarativeAudioCategory(QObject *parent)
|
QDeclarativeAudioCategory::QDeclarativeAudioCategory(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_complete(false)
|
|
||||||
, m_volume(1)
|
, m_volume(1)
|
||||||
|
, m_engine(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,21 +114,9 @@ QDeclarativeAudioCategory::~QDeclarativeAudioCategory()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void QDeclarativeAudioCategory::classBegin()
|
void QDeclarativeAudioCategory::setEngine(QDeclarativeAudioEngine *engine)
|
||||||
{
|
{
|
||||||
if (!parent() || !parent()->inherits("QDeclarativeAudioEngine")) {
|
m_engine = engine;
|
||||||
qWarning("AudioCategory must be defined inside AudioEngine!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QDeclarativeAudioCategory::componentComplete()
|
|
||||||
{
|
|
||||||
if (m_name.isEmpty()) {
|
|
||||||
qWarning("AudioCategory must have a name!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_complete = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -159,7 +149,7 @@ void QDeclarativeAudioCategory::setVolume(qreal volume)
|
|||||||
*/
|
*/
|
||||||
void QDeclarativeAudioCategory::setName(const QString& name)
|
void QDeclarativeAudioCategory::setName(const QString& name)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("AudioCategory: you can not change name after initialization.");
|
qWarning("AudioCategory: you can not change name after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,14 +35,14 @@
|
|||||||
#define QDECLARATIVEAUDIOCATEGORY_P_H
|
#define QDECLARATIVEAUDIOCATEGORY_P_H
|
||||||
|
|
||||||
#include <QtQml/qqml.h>
|
#include <QtQml/qqml.h>
|
||||||
#include <QtQml/qqmlcomponent.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
class QDeclarativeAudioCategory : public QObject, public QQmlParserStatus
|
class QDeclarativeAudioEngine;
|
||||||
|
|
||||||
|
class QDeclarativeAudioCategory : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_INTERFACES(QQmlParserStatus)
|
|
||||||
Q_PROPERTY(qreal volume READ volume WRITE setVolume NOTIFY volumeChanged)
|
Q_PROPERTY(qreal volume READ volume WRITE setVolume NOTIFY volumeChanged)
|
||||||
Q_PROPERTY(QString name READ name WRITE setName)
|
Q_PROPERTY(QString name READ name WRITE setName)
|
||||||
|
|
||||||
@@ -50,15 +50,14 @@ public:
|
|||||||
QDeclarativeAudioCategory(QObject *parent = 0);
|
QDeclarativeAudioCategory(QObject *parent = 0);
|
||||||
~QDeclarativeAudioCategory();
|
~QDeclarativeAudioCategory();
|
||||||
|
|
||||||
void classBegin();
|
|
||||||
void componentComplete();
|
|
||||||
|
|
||||||
qreal volume() const;
|
qreal volume() const;
|
||||||
void setVolume(qreal volume);
|
void setVolume(qreal volume);
|
||||||
|
|
||||||
QString name() const;
|
QString name() const;
|
||||||
void setName(const QString& name);
|
void setName(const QString& name);
|
||||||
|
|
||||||
|
void setEngine(QDeclarativeAudioEngine *engine);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void volumeChanged(qreal newVolume);
|
void volumeChanged(qreal newVolume);
|
||||||
void stopped();
|
void stopped();
|
||||||
@@ -72,9 +71,9 @@ public Q_SLOTS:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(QDeclarativeAudioCategory);
|
Q_DISABLE_COPY(QDeclarativeAudioCategory);
|
||||||
bool m_complete;
|
|
||||||
QString m_name;
|
QString m_name;
|
||||||
qreal m_volume;
|
qreal m_volume;
|
||||||
|
QDeclarativeAudioEngine *m_engine;
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|||||||
@@ -221,6 +221,222 @@ void QDeclarativeAudioEngine::releaseSoundInstance(QSoundInstance* instance)
|
|||||||
emit liveInstanceCountChanged();
|
emit liveInstanceCountChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QDeclarativeAudioEngine::initAudioSample(QDeclarativeAudioSample *sample)
|
||||||
|
{
|
||||||
|
sample->init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QDeclarativeAudioEngine::initSound(QDeclarativeSound *sound)
|
||||||
|
{
|
||||||
|
QDeclarativeAudioCategory *category = m_defaultCategory;
|
||||||
|
if (m_categories.contains(sound->category())) {
|
||||||
|
category = qobject_cast<QDeclarativeAudioCategory*>(
|
||||||
|
qvariant_cast<QObject*>(m_categories[sound->category()]));
|
||||||
|
}
|
||||||
|
sound->setCategoryObject(category);
|
||||||
|
|
||||||
|
QDeclarativeAttenuationModel *attenuationModel = 0;
|
||||||
|
if (sound->attenuationModel().isEmpty()) {
|
||||||
|
if (m_defaultAttenuationModel)
|
||||||
|
attenuationModel = m_defaultAttenuationModel;
|
||||||
|
} else if (m_attenuationModels.contains(sound->attenuationModel())){
|
||||||
|
attenuationModel = m_attenuationModels[sound->attenuationModel()];
|
||||||
|
} else {
|
||||||
|
qWarning() << "Sound[" << sound->name() << "] contains invalid attenuationModel["
|
||||||
|
<< sound->attenuationModel() << "]";
|
||||||
|
}
|
||||||
|
sound->setAttenuationModelObject(attenuationModel);
|
||||||
|
|
||||||
|
foreach (QDeclarativePlayVariation *playVariation, sound->playlist()) {
|
||||||
|
if (m_samples.contains(playVariation->sample())) {
|
||||||
|
playVariation->setSampleObject(
|
||||||
|
qobject_cast<QDeclarativeAudioSample*>(
|
||||||
|
qvariant_cast<QObject*>(m_samples[playVariation->sample()])));
|
||||||
|
} else {
|
||||||
|
qWarning() << "Sound[" << sound->name() << "] contains invalid sample["
|
||||||
|
<< playVariation->sample() << "] for its playVarations";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod QtAudioEngine::AudioEngine::addAudioSample(AudioSample sample)
|
||||||
|
|
||||||
|
Adds the given \a sample to the engine.
|
||||||
|
This can be used when the AudioSample is created dynamically:
|
||||||
|
|
||||||
|
\qml
|
||||||
|
import QtAudioEngine 1.1
|
||||||
|
|
||||||
|
AudioEngine {
|
||||||
|
id: engine
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
var sample = Qt.createQmlObject('import QtAudioEngine 1.1; AudioSample {}', engine);
|
||||||
|
sample.name = "example";
|
||||||
|
sample.source = "example.wav";
|
||||||
|
engine.addAudioSample(sample);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\endqml
|
||||||
|
*/
|
||||||
|
void QDeclarativeAudioEngine::addAudioSample(QDeclarativeAudioSample *sample)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_AUDIOENGINE
|
||||||
|
qDebug() << "add QDeclarativeAudioSample[" << sample->name() << "]";
|
||||||
|
#endif
|
||||||
|
if (sample->name().isEmpty()) {
|
||||||
|
qWarning("AudioSample must have a name!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_samples.contains(sample->name())) {
|
||||||
|
qWarning() << "Failed to add AudioSample[" << sample->name() << "], already exists!";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_samples.insert(sample->name(), QVariant::fromValue(sample));
|
||||||
|
sample->setEngine(this);
|
||||||
|
|
||||||
|
if (m_complete) { initAudioSample(sample); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod QtAudioEngine::AudioEngine::addSound(Sound sound)
|
||||||
|
|
||||||
|
Adds the given \a sound to the engine.
|
||||||
|
This can be used when the Sound is created dynamically:
|
||||||
|
|
||||||
|
\qml
|
||||||
|
import QtAudioEngine 1.1
|
||||||
|
|
||||||
|
AudioEngine {
|
||||||
|
id: engine
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
var sound = Qt.createQmlObject('import QtAudioEngine 1.1; Sound {}', engine);
|
||||||
|
sound.name = "example";
|
||||||
|
engine.addSound(sound);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\endqml
|
||||||
|
*/
|
||||||
|
void QDeclarativeAudioEngine::addSound(QDeclarativeSound *sound)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_AUDIOENGINE
|
||||||
|
qDebug() << "add QDeclarativeSound[" << sound->name() << "]";
|
||||||
|
#endif
|
||||||
|
if (sound->name().isEmpty()) {
|
||||||
|
qWarning("Sound must have a name!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_sounds.contains(sound->name())) {
|
||||||
|
qWarning() << "Failed to add Sound[" << sound->name() << "], already exists!";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_sounds.insert(sound->name(), QVariant::fromValue(sound));
|
||||||
|
sound->setEngine(this);
|
||||||
|
|
||||||
|
if (m_complete) { initSound(sound); }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod QtAudioEngine::AudioEngine::addAudioCategory(AudioCategory category)
|
||||||
|
|
||||||
|
Adds the given \a category to the engine.
|
||||||
|
This can be used when the AudioCategory is created dynamically:
|
||||||
|
|
||||||
|
\qml
|
||||||
|
import QtAudioEngine 1.1
|
||||||
|
|
||||||
|
AudioEngine {
|
||||||
|
id: engine
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
var category = Qt.createQmlObject('import QtAudioEngine 1.1; AudioCategory {}', engine);
|
||||||
|
category.name = "sample";
|
||||||
|
category.volume = 0.9;
|
||||||
|
engine.addAudioCategory(category);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\endqml
|
||||||
|
*/
|
||||||
|
void QDeclarativeAudioEngine::addAudioCategory(QDeclarativeAudioCategory *category)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_AUDIOENGINE
|
||||||
|
qDebug() << "add QDeclarativeAudioCategory[" << category->name() << "]";
|
||||||
|
#endif
|
||||||
|
if (category->name().isEmpty()) {
|
||||||
|
qWarning("AudioCategory must have a name!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_categories.contains(category->name())) {
|
||||||
|
qWarning() << "Failed to add AudioCategory[" << category->name() << "], already exists!";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_categories.insert(category->name(), QVariant::fromValue(category));
|
||||||
|
if (category->name() == QLatin1String("default")) {
|
||||||
|
if (!m_complete) {
|
||||||
|
m_defaultCategory = category;
|
||||||
|
} else {
|
||||||
|
qWarning() << "Can not change default category after initializing engine";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
category->setEngine(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod QtAudioEngine::AudioEngine::addAttenuationModel(AttenuationModel attenuationModel)
|
||||||
|
|
||||||
|
Adds the given \a attenuationModel to the engine.
|
||||||
|
This can be used when the AttenuationModelLinear / AttenuationModelInverse is created dynamically:
|
||||||
|
|
||||||
|
\qml
|
||||||
|
import QtAudioEngine 1.1
|
||||||
|
|
||||||
|
AudioEngine {
|
||||||
|
id: engine
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
var attenuationModel = Qt.createQmlObject('import QtAudioEngine 1.1; AttenuationModelLinear {}', engine);
|
||||||
|
attenuationModel.name ="linear"
|
||||||
|
attenuationModel.start = 20
|
||||||
|
attenuationModel.end = 180
|
||||||
|
engine.addAttenuationModel(attenuationModel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\endqml
|
||||||
|
*/
|
||||||
|
void QDeclarativeAudioEngine::addAttenuationModel(QDeclarativeAttenuationModel *attenModel)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_AUDIOENGINE
|
||||||
|
qDebug() << "add AttenuationModel[" << attenModel->name() << "]";
|
||||||
|
#endif
|
||||||
|
if (attenModel->name().isEmpty()) {
|
||||||
|
qWarning("AttenuationModel must have a name!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_attenuationModels.contains(attenModel->name())) {
|
||||||
|
qWarning() << "Failed to add AttenuationModel[" << attenModel->name() << "], already exists!";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_attenuationModels.insert(attenModel->name(), attenModel);
|
||||||
|
|
||||||
|
if (attenModel->name() == QLatin1String("default")) {
|
||||||
|
if (!m_complete) {
|
||||||
|
m_defaultAttenuationModel = attenModel;
|
||||||
|
} else {
|
||||||
|
qWarning() << "Can not change default attenuation model after initializing engine";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
attenModel->setEngine(this);
|
||||||
|
}
|
||||||
|
|
||||||
void QDeclarativeAudioEngine::componentComplete()
|
void QDeclarativeAudioEngine::componentComplete()
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_AUDIOENGINE
|
#ifdef DEBUG_AUDIOENGINE
|
||||||
@@ -231,10 +447,9 @@ void QDeclarativeAudioEngine::componentComplete()
|
|||||||
qDebug() << "creating default category";
|
qDebug() << "creating default category";
|
||||||
#endif
|
#endif
|
||||||
m_defaultCategory = new QDeclarativeAudioCategory(this);
|
m_defaultCategory = new QDeclarativeAudioCategory(this);
|
||||||
m_defaultCategory->classBegin();
|
|
||||||
m_defaultCategory->setName(QString::fromLatin1("default"));
|
m_defaultCategory->setName(QString::fromLatin1("default"));
|
||||||
m_defaultCategory->setVolume(1);
|
m_defaultCategory->setVolume(1);
|
||||||
m_defaultCategory->componentComplete();
|
m_defaultCategory->setEngine(this);
|
||||||
}
|
}
|
||||||
#ifdef DEBUG_AUDIOENGINE
|
#ifdef DEBUG_AUDIOENGINE
|
||||||
qDebug() << "init samples" << m_samples.keys().count();
|
qDebug() << "init samples" << m_samples.keys().count();
|
||||||
@@ -246,7 +461,8 @@ void QDeclarativeAudioEngine::componentComplete()
|
|||||||
qWarning() << "accessing invalid sample[" << key << "]";
|
qWarning() << "accessing invalid sample[" << key << "]";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
sample->init();
|
|
||||||
|
initAudioSample(sample);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_AUDIOENGINE
|
#ifdef DEBUG_AUDIOENGINE
|
||||||
@@ -260,35 +476,8 @@ void QDeclarativeAudioEngine::componentComplete()
|
|||||||
qWarning() << "accessing invalid sound[" << key << "]";
|
qWarning() << "accessing invalid sound[" << key << "]";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
QDeclarativeAudioCategory *category = m_defaultCategory;
|
|
||||||
if (m_categories.contains(sound->category())) {
|
|
||||||
category = qobject_cast<QDeclarativeAudioCategory*>(
|
|
||||||
qvariant_cast<QObject*>(m_categories[sound->category()]));
|
|
||||||
}
|
|
||||||
sound->setCategoryObject(category);
|
|
||||||
|
|
||||||
QDeclarativeAttenuationModel *attenuationModel = 0;
|
initSound(sound);
|
||||||
if (sound->attenuationModel().isEmpty()) {
|
|
||||||
if (m_defaultAttenuationModel)
|
|
||||||
attenuationModel = m_defaultAttenuationModel;
|
|
||||||
} else if (m_attenuationModels.contains(sound->attenuationModel())){
|
|
||||||
attenuationModel = m_attenuationModels[sound->attenuationModel()];
|
|
||||||
} else {
|
|
||||||
qWarning() << "Sound[" << sound->name() << "] contains invalid attenuationModel["
|
|
||||||
<< sound->attenuationModel() << "]";
|
|
||||||
}
|
|
||||||
sound->setAttenuationModelObject(attenuationModel);
|
|
||||||
|
|
||||||
foreach (QDeclarativePlayVariation* playVariation, sound->playlist()) {
|
|
||||||
if (m_samples.contains(playVariation->sample())) {
|
|
||||||
playVariation->setSampleObject(
|
|
||||||
qobject_cast<QDeclarativeAudioSample*>(
|
|
||||||
qvariant_cast<QObject*>(m_samples[playVariation->sample()])));
|
|
||||||
} else {
|
|
||||||
qWarning() << "Sound[" << sound->name() << "] contains invalid sample["
|
|
||||||
<< playVariation->sample() << "] for its playVarations";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
m_complete = true;
|
m_complete = true;
|
||||||
#ifdef DEBUG_AUDIOENGINE
|
#ifdef DEBUG_AUDIOENGINE
|
||||||
@@ -330,65 +519,30 @@ void QDeclarativeAudioEngine::appendFunction(QQmlListProperty<QObject> *property
|
|||||||
{
|
{
|
||||||
QDeclarativeAudioEngine* engine = static_cast<QDeclarativeAudioEngine*>(property->object);
|
QDeclarativeAudioEngine* engine = static_cast<QDeclarativeAudioEngine*>(property->object);
|
||||||
if (engine->m_complete) {
|
if (engine->m_complete) {
|
||||||
qWarning("AudioEngine: cannot add child after initialization!");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDeclarativeSound *sound = qobject_cast<QDeclarativeSound*>(value);
|
QDeclarativeSound *sound = qobject_cast<QDeclarativeSound*>(value);
|
||||||
if (sound) {
|
if (sound) {
|
||||||
#ifdef DEBUG_AUDIOENGINE
|
engine->addSound(sound);
|
||||||
qDebug() << "add QDeclarativeSound[" << sound->name() << "]";
|
|
||||||
#endif
|
|
||||||
if (engine->m_sounds.contains(sound->name())) {
|
|
||||||
qWarning() << "Failed to add Sound[" << sound->name() << "], already exists!";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
engine->m_sounds.insert(sound->name(), QVariant::fromValue(value));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDeclarativeAudioSample *sample = qobject_cast<QDeclarativeAudioSample*>(value);
|
QDeclarativeAudioSample *sample = qobject_cast<QDeclarativeAudioSample*>(value);
|
||||||
if (sample) {
|
if (sample) {
|
||||||
#ifdef DEBUG_AUDIOENGINE
|
engine->addAudioSample(sample);
|
||||||
qDebug() << "add QDeclarativeAudioSample[" << sample->name() << "]";
|
|
||||||
#endif
|
|
||||||
if (engine->m_samples.contains(sample->name())) {
|
|
||||||
qWarning() << "Failed to add AudioSample[" << sample->name() << "], already exists!";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
engine->m_samples.insert(sample->name(), QVariant::fromValue(value));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDeclarativeAudioCategory *category = qobject_cast<QDeclarativeAudioCategory*>(value);
|
QDeclarativeAudioCategory *category = qobject_cast<QDeclarativeAudioCategory*>(value);
|
||||||
if (category) {
|
if (category) {
|
||||||
#ifdef DEBUG_AUDIOENGINE
|
engine->addAudioCategory(category);
|
||||||
qDebug() << "add QDeclarativeAudioCategory[" << category->name() << "]";
|
|
||||||
#endif
|
|
||||||
if (engine->m_categories.contains(category->name())) {
|
|
||||||
qWarning() << "Failed to add AudioCategory[" << category->name() << "], already exists!";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
engine->m_categories.insert(category->name(), QVariant::fromValue(value));
|
|
||||||
if (category->name() == QLatin1String("default")) {
|
|
||||||
engine->m_defaultCategory = category;
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDeclarativeAttenuationModel *attenModel = qobject_cast<QDeclarativeAttenuationModel*>(value);
|
QDeclarativeAttenuationModel *attenModel = qobject_cast<QDeclarativeAttenuationModel*>(value);
|
||||||
if (attenModel) {
|
if (attenModel) {
|
||||||
#ifdef DEBUG_AUDIOENGINE
|
engine->addAttenuationModel(attenModel);
|
||||||
qDebug() << "add AttenuationModel[" << attenModel->name() << "]";
|
|
||||||
#endif
|
|
||||||
if (attenModel->name() == QLatin1String("default")) {
|
|
||||||
engine->m_defaultAttenuationModel = attenModel;
|
|
||||||
}
|
|
||||||
if (engine->m_attenuationModels.contains(attenModel->name())) {
|
|
||||||
qWarning() << "Failed to add AttenuationModel[" << attenModel->name() << "], already exists!";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
engine->m_attenuationModels.insert(attenModel->name(), attenModel);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -111,6 +111,11 @@ public:
|
|||||||
QSoundInstance* newSoundInstance(const QString &name);
|
QSoundInstance* newSoundInstance(const QString &name);
|
||||||
void releaseSoundInstance(QSoundInstance* instance);
|
void releaseSoundInstance(QSoundInstance* instance);
|
||||||
|
|
||||||
|
Q_REVISION(1) Q_INVOKABLE void addAudioSample(QDeclarativeAudioSample *);
|
||||||
|
Q_REVISION(1) Q_INVOKABLE void addSound(QDeclarativeSound *);
|
||||||
|
Q_REVISION(1) Q_INVOKABLE void addAudioCategory(QDeclarativeAudioCategory *);
|
||||||
|
Q_REVISION(1) Q_INVOKABLE void addAttenuationModel(QDeclarativeAttenuationModel *);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void ready();
|
void ready();
|
||||||
void liveInstanceCountChanged();
|
void liveInstanceCountChanged();
|
||||||
@@ -149,6 +154,9 @@ private:
|
|||||||
QList<QDeclarativeSoundInstance*> m_managedDeclSoundInstances;
|
QList<QDeclarativeSoundInstance*> m_managedDeclSoundInstances;
|
||||||
QList<QDeclarativeSoundInstance*> m_managedDeclSndInstancePool;
|
QList<QDeclarativeSoundInstance*> m_managedDeclSndInstancePool;
|
||||||
void releaseManagedDeclarativeSoundInstance(QDeclarativeSoundInstance* declSndInstance);
|
void releaseManagedDeclarativeSoundInstance(QDeclarativeSoundInstance* declSndInstance);
|
||||||
|
|
||||||
|
void initAudioSample(QDeclarativeAudioSample *);
|
||||||
|
void initSound(QDeclarativeSound *);
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|||||||
@@ -54,7 +54,9 @@ QT_USE_NAMESPACE
|
|||||||
\c AudioSample is part of the \b{QtAudioEngine 1.0} module.
|
\c AudioSample is part of the \b{QtAudioEngine 1.0} module.
|
||||||
|
|
||||||
It can be accessed through QtAudioEngine::AudioEngine::samples with its unique
|
It can be accessed through QtAudioEngine::AudioEngine::samples with its unique
|
||||||
name and must be defined inside AudioEngine.
|
name and must be defined inside AudioEngine or be added to it using
|
||||||
|
\l{QtAudioEngine::AudioEngine::addAudioSample()}{AudioEngine.addAudioSample()}
|
||||||
|
if AudioSample is created dynamically.
|
||||||
|
|
||||||
\qml
|
\qml
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
@@ -78,10 +80,10 @@ QT_USE_NAMESPACE
|
|||||||
*/
|
*/
|
||||||
QDeclarativeAudioSample::QDeclarativeAudioSample(QObject *parent)
|
QDeclarativeAudioSample::QDeclarativeAudioSample(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_complete(false)
|
|
||||||
, m_streaming(false)
|
, m_streaming(false)
|
||||||
, m_preloaded(false)
|
, m_preloaded(false)
|
||||||
, m_soundBuffer(0)
|
, m_soundBuffer(0)
|
||||||
|
, m_engine(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,23 +91,6 @@ QDeclarativeAudioSample::~QDeclarativeAudioSample()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void QDeclarativeAudioSample::classBegin()
|
|
||||||
{
|
|
||||||
if (!parent() || !parent()->inherits("QDeclarativeAudioEngine")) {
|
|
||||||
qWarning("AudioSample must be defined inside AudioEngine!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QDeclarativeAudioSample::componentComplete()
|
|
||||||
{
|
|
||||||
if (m_name.isEmpty()) {
|
|
||||||
qWarning("AudioSample must have a name!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_complete = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\qmlproperty url QtAudioEngine::AudioSample::source
|
\qmlproperty url QtAudioEngine::AudioSample::source
|
||||||
|
|
||||||
@@ -118,7 +103,7 @@ QUrl QDeclarativeAudioSample::source() const
|
|||||||
|
|
||||||
void QDeclarativeAudioSample::setSource(const QUrl& url)
|
void QDeclarativeAudioSample::setSource(const QUrl& url)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("AudioSample: source not changeable after initialization.");
|
qWarning("AudioSample: source not changeable after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -130,6 +115,11 @@ bool QDeclarativeAudioSample::isStreaming() const
|
|||||||
return m_streaming;
|
return m_streaming;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDeclarativeAudioEngine *QDeclarativeAudioSample::engine() const
|
||||||
|
{
|
||||||
|
return m_engine;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\qmlproperty bool QtAudioEngine::AudioSample::preloaded
|
\qmlproperty bool QtAudioEngine::AudioSample::preloaded
|
||||||
|
|
||||||
@@ -173,7 +163,7 @@ void QDeclarativeAudioSample::load()
|
|||||||
|
|
||||||
void QDeclarativeAudioSample::setPreloaded(bool preloaded)
|
void QDeclarativeAudioSample::setPreloaded(bool preloaded)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("AudioSample: preloaded not changeable after initialization.");
|
qWarning("AudioSample: preloaded not changeable after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -182,13 +172,22 @@ void QDeclarativeAudioSample::setPreloaded(bool preloaded)
|
|||||||
|
|
||||||
void QDeclarativeAudioSample::setStreaming(bool streaming)
|
void QDeclarativeAudioSample::setStreaming(bool streaming)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("AudioSample: streaming not changeable after initialization.");
|
qWarning("AudioSample: streaming not changeable after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_streaming = streaming;
|
m_streaming = streaming;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QDeclarativeAudioSample::setEngine(QDeclarativeAudioEngine *engine)
|
||||||
|
{
|
||||||
|
if (m_engine) {
|
||||||
|
qWarning("AudioSample: engine not changeable after initialization.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_engine = engine;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\qmlproperty string QtAudioEngine::AudioSample::name
|
\qmlproperty string QtAudioEngine::AudioSample::name
|
||||||
|
|
||||||
@@ -202,7 +201,7 @@ QString QDeclarativeAudioSample::name() const
|
|||||||
|
|
||||||
void QDeclarativeAudioSample::setName(const QString& name)
|
void QDeclarativeAudioSample::setName(const QString& name)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("AudioSample: name not changeable after initialization.");
|
qWarning("AudioSample: name not changeable after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -211,12 +210,13 @@ void QDeclarativeAudioSample::setName(const QString& name)
|
|||||||
|
|
||||||
void QDeclarativeAudioSample::init()
|
void QDeclarativeAudioSample::init()
|
||||||
{
|
{
|
||||||
|
Q_ASSERT(m_engine != 0);
|
||||||
|
|
||||||
if (m_streaming) {
|
if (m_streaming) {
|
||||||
//TODO
|
//TODO
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
m_soundBuffer =
|
m_soundBuffer = m_engine->engine()->getStaticSoundBuffer(m_url);
|
||||||
qobject_cast<QDeclarativeAudioEngine*>(parent())->engine()->getStaticSoundBuffer(m_url);
|
|
||||||
if (m_soundBuffer->state() == QSoundBuffer::Ready) {
|
if (m_soundBuffer->state() == QSoundBuffer::Ready) {
|
||||||
emit loadedChanged();
|
emit loadedChanged();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -35,16 +35,15 @@
|
|||||||
#define QDECLARATIVEAUDIOSAMPLE_P_H
|
#define QDECLARATIVEAUDIOSAMPLE_P_H
|
||||||
|
|
||||||
#include <QtQml/qqml.h>
|
#include <QtQml/qqml.h>
|
||||||
#include <QtQml/qqmlcomponent.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
class QSoundBuffer;
|
class QSoundBuffer;
|
||||||
|
class QDeclarativeAudioEngine;
|
||||||
|
|
||||||
class QDeclarativeAudioSample : public QObject, public QQmlParserStatus
|
class QDeclarativeAudioSample : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_INTERFACES(QQmlParserStatus)
|
|
||||||
Q_PROPERTY(QString name READ name WRITE setName)
|
Q_PROPERTY(QString name READ name WRITE setName)
|
||||||
Q_PROPERTY(QUrl source READ source WRITE setSource)
|
Q_PROPERTY(QUrl source READ source WRITE setSource)
|
||||||
Q_PROPERTY(bool preloaded READ isPreloaded WRITE setPreloaded)
|
Q_PROPERTY(bool preloaded READ isPreloaded WRITE setPreloaded)
|
||||||
@@ -55,9 +54,6 @@ public:
|
|||||||
QDeclarativeAudioSample(QObject *parent = 0);
|
QDeclarativeAudioSample(QObject *parent = 0);
|
||||||
~QDeclarativeAudioSample();
|
~QDeclarativeAudioSample();
|
||||||
|
|
||||||
void classBegin();
|
|
||||||
void componentComplete();
|
|
||||||
|
|
||||||
QString name() const;
|
QString name() const;
|
||||||
void setName(const QString& name);
|
void setName(const QString& name);
|
||||||
|
|
||||||
@@ -70,6 +66,9 @@ public:
|
|||||||
bool isPreloaded() const;
|
bool isPreloaded() const;
|
||||||
void setPreloaded(bool preloaded);
|
void setPreloaded(bool preloaded);
|
||||||
|
|
||||||
|
QDeclarativeAudioEngine *engine() const;
|
||||||
|
void setEngine(QDeclarativeAudioEngine *);
|
||||||
|
|
||||||
bool isLoaded() const;
|
bool isLoaded() const;
|
||||||
|
|
||||||
QSoundBuffer* soundBuffer() const;
|
QSoundBuffer* soundBuffer() const;
|
||||||
@@ -85,13 +84,12 @@ public Q_SLOTS:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(QDeclarativeAudioSample);
|
Q_DISABLE_COPY(QDeclarativeAudioSample);
|
||||||
bool m_complete;
|
|
||||||
QString m_name;
|
QString m_name;
|
||||||
QUrl m_url;
|
QUrl m_url;
|
||||||
bool m_streaming;
|
bool m_streaming;
|
||||||
bool m_preloaded;
|
bool m_preloaded;
|
||||||
|
|
||||||
QSoundBuffer *m_soundBuffer;
|
QSoundBuffer *m_soundBuffer;
|
||||||
|
QDeclarativeAudioEngine *m_engine;
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|||||||
@@ -55,7 +55,9 @@ QT_USE_NAMESPACE
|
|||||||
|
|
||||||
This type is part of the \b{QtAudioEngine 1.0} module.
|
This type is part of the \b{QtAudioEngine 1.0} module.
|
||||||
|
|
||||||
PlayVariation must be defined inside a \l Sound.
|
PlayVariation must be defined inside a \l Sound or be added to it using
|
||||||
|
\l{QtAudioEngine::Sound::addPlayVariation()}{Sound.addPlayVariation()}
|
||||||
|
if PlayVariation is created dynamically.
|
||||||
|
|
||||||
\qml
|
\qml
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
@@ -100,13 +102,13 @@ QT_USE_NAMESPACE
|
|||||||
*/
|
*/
|
||||||
QDeclarativePlayVariation::QDeclarativePlayVariation(QObject *parent)
|
QDeclarativePlayVariation::QDeclarativePlayVariation(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_complete(false)
|
|
||||||
, m_looping(false)
|
, m_looping(false)
|
||||||
, m_maxGain(1)
|
, m_maxGain(1)
|
||||||
, m_minGain(1)
|
, m_minGain(1)
|
||||||
, m_maxPitch(1)
|
, m_maxPitch(1)
|
||||||
, m_minPitch(1)
|
, m_minPitch(1)
|
||||||
, m_sampleObject(0)
|
, m_sampleObject(0)
|
||||||
|
, m_engine(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,15 +116,7 @@ QDeclarativePlayVariation::~QDeclarativePlayVariation()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void QDeclarativePlayVariation::classBegin()
|
void QDeclarativePlayVariation::setEngine(QDeclarativeAudioEngine *engine)
|
||||||
{
|
|
||||||
if (!parent() || !parent()->inherits("QDeclarativeSound")) {
|
|
||||||
qWarning("PlayVariation must be defined inside Sound!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QDeclarativePlayVariation::componentComplete()
|
|
||||||
{
|
{
|
||||||
if (m_maxGain < m_minGain) {
|
if (m_maxGain < m_minGain) {
|
||||||
qWarning("PlayVariation: maxGain must be no less than minGain");
|
qWarning("PlayVariation: maxGain must be no less than minGain");
|
||||||
@@ -132,7 +126,7 @@ void QDeclarativePlayVariation::componentComplete()
|
|||||||
qWarning("PlayVariation: maxPitch must be no less than minPitch");
|
qWarning("PlayVariation: maxPitch must be no less than minPitch");
|
||||||
qSwap(m_minPitch, m_maxPitch);
|
qSwap(m_minPitch, m_maxPitch);
|
||||||
}
|
}
|
||||||
m_complete = true;
|
m_engine = engine;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -147,7 +141,7 @@ QString QDeclarativePlayVariation::sample() const
|
|||||||
|
|
||||||
void QDeclarativePlayVariation::setSample(const QString& sample)
|
void QDeclarativePlayVariation::setSample(const QString& sample)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("PlayVariation: cannot change properties after initialization.");
|
qWarning("PlayVariation: cannot change properties after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -166,7 +160,7 @@ bool QDeclarativePlayVariation::isLooping() const
|
|||||||
|
|
||||||
void QDeclarativePlayVariation::setLooping(bool looping)
|
void QDeclarativePlayVariation::setLooping(bool looping)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("PlayVariation: cannot change properties after initialization.");
|
qWarning("PlayVariation: cannot change properties after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -185,7 +179,7 @@ qreal QDeclarativePlayVariation::maxGain() const
|
|||||||
|
|
||||||
void QDeclarativePlayVariation::setMaxGain(qreal maxGain)
|
void QDeclarativePlayVariation::setMaxGain(qreal maxGain)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("PlayVariation: cannot change properties after initialization.");
|
qWarning("PlayVariation: cannot change properties after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -208,7 +202,7 @@ qreal QDeclarativePlayVariation::minGain() const
|
|||||||
|
|
||||||
void QDeclarativePlayVariation::setMinGain(qreal minGain)
|
void QDeclarativePlayVariation::setMinGain(qreal minGain)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("PlayVariation: cannot change properties after initialization.");
|
qWarning("PlayVariation: cannot change properties after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -231,7 +225,7 @@ qreal QDeclarativePlayVariation::maxPitch() const
|
|||||||
|
|
||||||
void QDeclarativePlayVariation::setMaxPitch(qreal maxPitch)
|
void QDeclarativePlayVariation::setMaxPitch(qreal maxPitch)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("PlayVariation: cannot change properties after initialization.");
|
qWarning("PlayVariation: cannot change properties after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -254,7 +248,7 @@ qreal QDeclarativePlayVariation::minPitch() const
|
|||||||
|
|
||||||
void QDeclarativePlayVariation::setMinPitch(qreal minPitch)
|
void QDeclarativePlayVariation::setMinPitch(qreal minPitch)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("PlayVariation: cannot change properties after initialization.");
|
qWarning("PlayVariation: cannot change properties after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,17 +35,16 @@
|
|||||||
#define QDECLARATIVEPLAYVARIATION_P_H
|
#define QDECLARATIVEPLAYVARIATION_P_H
|
||||||
|
|
||||||
#include <QtQml/qqml.h>
|
#include <QtQml/qqml.h>
|
||||||
#include <QtQml/qqmlcomponent.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
class QDeclarativeAudioSample;
|
class QDeclarativeAudioSample;
|
||||||
class QSoundInstance;
|
class QSoundInstance;
|
||||||
|
class QDeclarativeAudioEngine;
|
||||||
|
|
||||||
class QDeclarativePlayVariation : public QObject, public QQmlParserStatus
|
class QDeclarativePlayVariation : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_INTERFACES(QQmlParserStatus)
|
|
||||||
Q_PROPERTY(QString sample READ sample WRITE setSample)
|
Q_PROPERTY(QString sample READ sample WRITE setSample)
|
||||||
Q_PROPERTY(bool looping READ isLooping WRITE setLooping)
|
Q_PROPERTY(bool looping READ isLooping WRITE setLooping)
|
||||||
Q_PROPERTY(qreal maxGain READ maxGain WRITE setMaxGain)
|
Q_PROPERTY(qreal maxGain READ maxGain WRITE setMaxGain)
|
||||||
@@ -57,9 +56,6 @@ public:
|
|||||||
QDeclarativePlayVariation(QObject *parent = 0);
|
QDeclarativePlayVariation(QObject *parent = 0);
|
||||||
~QDeclarativePlayVariation();
|
~QDeclarativePlayVariation();
|
||||||
|
|
||||||
void classBegin();
|
|
||||||
void componentComplete();
|
|
||||||
|
|
||||||
QString sample() const;
|
QString sample() const;
|
||||||
void setSample(const QString& sample);
|
void setSample(const QString& sample);
|
||||||
|
|
||||||
@@ -82,9 +78,10 @@ public:
|
|||||||
|
|
||||||
void applyParameters(QSoundInstance *soundInstance);
|
void applyParameters(QSoundInstance *soundInstance);
|
||||||
|
|
||||||
|
void setEngine(QDeclarativeAudioEngine *engine);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(QDeclarativePlayVariation);
|
Q_DISABLE_COPY(QDeclarativePlayVariation);
|
||||||
bool m_complete;
|
|
||||||
QString m_sample;
|
QString m_sample;
|
||||||
bool m_looping;
|
bool m_looping;
|
||||||
qreal m_maxGain;
|
qreal m_maxGain;
|
||||||
@@ -92,6 +89,7 @@ private:
|
|||||||
qreal m_maxPitch;
|
qreal m_maxPitch;
|
||||||
qreal m_minPitch;
|
qreal m_minPitch;
|
||||||
QDeclarativeAudioSample *m_sampleObject;
|
QDeclarativeAudioSample *m_sampleObject;
|
||||||
|
QDeclarativeAudioEngine *m_engine;
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|||||||
@@ -64,8 +64,12 @@ qreal QDeclarativeSoundCone::innerAngle() const
|
|||||||
void QDeclarativeSoundCone::setInnerAngle(qreal innerAngle)
|
void QDeclarativeSoundCone::setInnerAngle(qreal innerAngle)
|
||||||
{
|
{
|
||||||
QDeclarativeSound *s = qobject_cast<QDeclarativeSound*>(parent());
|
QDeclarativeSound *s = qobject_cast<QDeclarativeSound*>(parent());
|
||||||
if (s && s->m_complete)
|
|
||||||
|
if (s && s->m_engine) {
|
||||||
|
qWarning("SoundCone: innerAngle not changeable after initialization.");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (innerAngle < 0 || innerAngle > 360) {
|
if (innerAngle < 0 || innerAngle > 360) {
|
||||||
qWarning() << "innerAngle should be within[0, 360] degrees";
|
qWarning() << "innerAngle should be within[0, 360] degrees";
|
||||||
return;
|
return;
|
||||||
@@ -88,8 +92,12 @@ qreal QDeclarativeSoundCone::outerAngle() const
|
|||||||
void QDeclarativeSoundCone::setOuterAngle(qreal outerAngle)
|
void QDeclarativeSoundCone::setOuterAngle(qreal outerAngle)
|
||||||
{
|
{
|
||||||
QDeclarativeSound *s = qobject_cast<QDeclarativeSound*>(parent());
|
QDeclarativeSound *s = qobject_cast<QDeclarativeSound*>(parent());
|
||||||
if (s && s->m_complete)
|
|
||||||
|
if (s && s->m_engine) {
|
||||||
|
qWarning("SoundCone: outerAngle not changeable after initialization.");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (outerAngle < 0 || outerAngle > 360) {
|
if (outerAngle < 0 || outerAngle > 360) {
|
||||||
qWarning() << "outerAngle should be within[0, 360] degrees";
|
qWarning() << "outerAngle should be within[0, 360] degrees";
|
||||||
return;
|
return;
|
||||||
@@ -112,8 +120,12 @@ qreal QDeclarativeSoundCone::outerGain() const
|
|||||||
void QDeclarativeSoundCone::setOuterGain(qreal outerGain)
|
void QDeclarativeSoundCone::setOuterGain(qreal outerGain)
|
||||||
{
|
{
|
||||||
QDeclarativeSound *s = qobject_cast<QDeclarativeSound*>(parent());
|
QDeclarativeSound *s = qobject_cast<QDeclarativeSound*>(parent());
|
||||||
if (s && s->m_complete)
|
|
||||||
|
if (s && s->m_engine) {
|
||||||
|
qWarning("SoundCone: outerGain not changeable after initialization.");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (outerGain < 0 || outerGain > 1) {
|
if (outerGain < 0 || outerGain > 1) {
|
||||||
qWarning() << "outerGain should no less than 0 and no more than 1";
|
qWarning() << "outerGain should no less than 0 and no more than 1";
|
||||||
return;
|
return;
|
||||||
@@ -121,11 +133,18 @@ void QDeclarativeSoundCone::setOuterGain(qreal outerGain)
|
|||||||
m_outerGain = outerGain;
|
m_outerGain = outerGain;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QDeclarativeSoundCone::componentComplete()
|
void QDeclarativeSoundCone::setEngine(QDeclarativeAudioEngine *engine)
|
||||||
{
|
{
|
||||||
|
if (m_engine) {
|
||||||
|
qWarning("SoundCone: engine not changeable after initialization.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_outerAngle < m_innerAngle) {
|
if (m_outerAngle < m_innerAngle) {
|
||||||
m_outerAngle = m_innerAngle;
|
m_outerAngle = m_innerAngle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_engine = engine;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
@@ -143,7 +162,9 @@ void QDeclarativeSoundCone::componentComplete()
|
|||||||
This type is part of the \b{QtAudioEngine 1.0} module.
|
This type is part of the \b{QtAudioEngine 1.0} module.
|
||||||
|
|
||||||
Sound can be accessed through QtAudioEngine::AudioEngine::sounds with its unique name
|
Sound can be accessed through QtAudioEngine::AudioEngine::sounds with its unique name
|
||||||
and must be defined inside AudioEngine.
|
and must be defined inside AudioEngine or be added to it using
|
||||||
|
\l{QtAudioEngine::AudioEngine::addSound()}{AudioEngine.addSound()}
|
||||||
|
if \l Sound is created dynamically.
|
||||||
|
|
||||||
\qml
|
\qml
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
@@ -194,10 +215,10 @@ void QDeclarativeSoundCone::componentComplete()
|
|||||||
|
|
||||||
QDeclarativeSound::QDeclarativeSound(QObject *parent)
|
QDeclarativeSound::QDeclarativeSound(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_complete(false)
|
|
||||||
, m_playType(Random)
|
, m_playType(Random)
|
||||||
, m_attenuationModelObject(0)
|
, m_attenuationModelObject(0)
|
||||||
, m_categoryObject(0)
|
, m_categoryObject(0)
|
||||||
|
, m_engine(0)
|
||||||
{
|
{
|
||||||
m_cone = new QDeclarativeSoundCone(this);
|
m_cone = new QDeclarativeSoundCone(this);
|
||||||
}
|
}
|
||||||
@@ -206,20 +227,6 @@ QDeclarativeSound::~QDeclarativeSound()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void QDeclarativeSound::classBegin()
|
|
||||||
{
|
|
||||||
if (!parent() || !parent()->inherits("QDeclarativeAudioEngine")) {
|
|
||||||
qWarning("Sound must be defined inside AudioEngine!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QDeclarativeSound::componentComplete()
|
|
||||||
{
|
|
||||||
m_complete = true;
|
|
||||||
m_cone->componentComplete();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\qmlproperty enumeration QtAudioEngine::Sound::playType
|
\qmlproperty enumeration QtAudioEngine::Sound::playType
|
||||||
|
|
||||||
@@ -239,7 +246,7 @@ QDeclarativeSound::PlayType QDeclarativeSound::playType() const
|
|||||||
|
|
||||||
void QDeclarativeSound::setPlayType(PlayType playType)
|
void QDeclarativeSound::setPlayType(PlayType playType)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("Sound: playType not changeable after initialization.");
|
qWarning("Sound: playType not changeable after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -258,7 +265,7 @@ QString QDeclarativeSound::category() const
|
|||||||
|
|
||||||
void QDeclarativeSound::setCategory(const QString& category)
|
void QDeclarativeSound::setCategory(const QString& category)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("Sound: category not changeable after initialization.");
|
qWarning("Sound: category not changeable after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -278,7 +285,7 @@ QString QDeclarativeSound::name() const
|
|||||||
|
|
||||||
void QDeclarativeSound::setName(const QString& name)
|
void QDeclarativeSound::setName(const QString& name)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("Sound: category not changeable after initialization.");
|
qWarning("Sound: category not changeable after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -322,13 +329,28 @@ QDeclarativePlayVariation* QDeclarativeSound::getVariation(int index)
|
|||||||
|
|
||||||
void QDeclarativeSound::setAttenuationModel(const QString &attenuationModel)
|
void QDeclarativeSound::setAttenuationModel(const QString &attenuationModel)
|
||||||
{
|
{
|
||||||
if (m_complete) {
|
if (m_engine) {
|
||||||
qWarning("Sound: attenuationModel not changeable after initialization.");
|
qWarning("Sound: attenuationModel not changeable after initialization.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_attenuationModel = attenuationModel;
|
m_attenuationModel = attenuationModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QDeclarativeSound::setEngine(QDeclarativeAudioEngine *engine)
|
||||||
|
{
|
||||||
|
if (m_engine) {
|
||||||
|
qWarning("Sound: engine not changeable after initialization.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_cone->setEngine(engine);
|
||||||
|
m_engine = engine;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDeclarativeAudioEngine *QDeclarativeSound::engine() const
|
||||||
|
{
|
||||||
|
return m_engine;
|
||||||
|
}
|
||||||
|
|
||||||
QDeclarativeSoundCone* QDeclarativeSound::cone() const
|
QDeclarativeSoundCone* QDeclarativeSound::cone() const
|
||||||
{
|
{
|
||||||
return m_cone;
|
return m_cone;
|
||||||
@@ -367,11 +389,42 @@ QList<QDeclarativePlayVariation*>& QDeclarativeSound::playlist()
|
|||||||
void QDeclarativeSound::appendFunction(QQmlListProperty<QDeclarativePlayVariation> *property, QDeclarativePlayVariation *value)
|
void QDeclarativeSound::appendFunction(QQmlListProperty<QDeclarativePlayVariation> *property, QDeclarativePlayVariation *value)
|
||||||
{
|
{
|
||||||
QDeclarativeSound *sound = static_cast<QDeclarativeSound*>(property->object);
|
QDeclarativeSound *sound = static_cast<QDeclarativeSound*>(property->object);
|
||||||
if (sound->m_complete) {
|
if (sound->m_engine) {
|
||||||
qWarning("Sound: PlayVariation not addable after initialization.");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sound->m_playlist.append(value);
|
sound->addPlayVariation(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod QtAudioEngine::Sound::addPlayVariation(PlayVariation playVariation)
|
||||||
|
|
||||||
|
Adds the given \a playVariation to sound.
|
||||||
|
This can be used when the PlayVariation is created dynamically:
|
||||||
|
|
||||||
|
\qml
|
||||||
|
import QtAudioEngine 1.1
|
||||||
|
|
||||||
|
AudioEngine {
|
||||||
|
id: engine
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
var playVariation = Qt.createQmlObject('import QtAudioEngine 1.1; PlayVariation {}', engine);
|
||||||
|
playVariation.sample = "sample";
|
||||||
|
playVariation.minPitch = 0.8
|
||||||
|
playVariation.maxPitch = 1.1
|
||||||
|
|
||||||
|
var sound = Qt.createQmlObject('import QtAudioEngine 1.1; Sound {}', engine);
|
||||||
|
sound.name = "example";
|
||||||
|
sound.addPlayVariation(playVariation);
|
||||||
|
engine.addSound(sound);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\endqml
|
||||||
|
*/
|
||||||
|
void QDeclarativeSound::addPlayVariation(QDeclarativePlayVariation *value)
|
||||||
|
{
|
||||||
|
m_playlist.append(value);
|
||||||
|
value->setEngine(m_engine);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -507,7 +560,7 @@ void QDeclarativeSound::play(const QVector3D& position, const QVector3D& velocit
|
|||||||
*/
|
*/
|
||||||
void QDeclarativeSound::play(const QVector3D& position, const QVector3D& velocity, const QVector3D& direction, qreal gain, qreal pitch)
|
void QDeclarativeSound::play(const QVector3D& position, const QVector3D& velocity, const QVector3D& direction, qreal gain, qreal pitch)
|
||||||
{
|
{
|
||||||
if (!m_complete) {
|
if (!m_engine) {
|
||||||
qWarning() << "AudioEngine::play not ready!";
|
qWarning() << "AudioEngine::play not ready!";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -546,8 +599,13 @@ QDeclarativeSoundInstance* QDeclarativeSound::newInstance()
|
|||||||
|
|
||||||
QDeclarativeSoundInstance* QDeclarativeSound::newInstance(bool managed)
|
QDeclarativeSoundInstance* QDeclarativeSound::newInstance(bool managed)
|
||||||
{
|
{
|
||||||
|
if (!m_engine) {
|
||||||
|
qWarning("engine attrbiute must be set for Sound object!");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
QDeclarativeSoundInstance *instance =
|
QDeclarativeSoundInstance *instance =
|
||||||
qobject_cast<QDeclarativeAudioEngine*>(this->parent())->newDeclarativeSoundInstance(managed);
|
m_engine->newDeclarativeSoundInstance(managed);
|
||||||
instance->setSound(m_name);
|
instance->setSound(m_name);
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,6 @@
|
|||||||
#define QDECLARATIVESOUND_P_H
|
#define QDECLARATIVESOUND_P_H
|
||||||
|
|
||||||
#include <QtQml/qqml.h>
|
#include <QtQml/qqml.h>
|
||||||
#include <QtQml/qqmlcomponent.h>
|
|
||||||
#include <QtCore/qlist.h>
|
#include <QtCore/qlist.h>
|
||||||
#include "qdeclarative_playvariation_p.h"
|
#include "qdeclarative_playvariation_p.h"
|
||||||
|
|
||||||
@@ -44,6 +43,7 @@ QT_BEGIN_NAMESPACE
|
|||||||
class QDeclarativeAudioCategory;
|
class QDeclarativeAudioCategory;
|
||||||
class QDeclarativeAttenuationModel;
|
class QDeclarativeAttenuationModel;
|
||||||
class QDeclarativeSoundInstance;
|
class QDeclarativeSoundInstance;
|
||||||
|
class QDeclarativeAudioEngine;
|
||||||
|
|
||||||
class QDeclarativeSoundCone : public QObject
|
class QDeclarativeSoundCone : public QObject
|
||||||
{
|
{
|
||||||
@@ -65,21 +65,21 @@ public:
|
|||||||
qreal outerGain() const;
|
qreal outerGain() const;
|
||||||
void setOuterGain(qreal outerGain);
|
void setOuterGain(qreal outerGain);
|
||||||
|
|
||||||
void componentComplete();
|
void setEngine(QDeclarativeAudioEngine *engine);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(QDeclarativeSoundCone)
|
Q_DISABLE_COPY(QDeclarativeSoundCone)
|
||||||
qreal m_innerAngle;
|
qreal m_innerAngle;
|
||||||
qreal m_outerAngle;
|
qreal m_outerAngle;
|
||||||
qreal m_outerGain;
|
qreal m_outerGain;
|
||||||
|
QDeclarativeAudioEngine *m_engine;
|
||||||
};
|
};
|
||||||
|
|
||||||
class QDeclarativeSound : public QObject, public QQmlParserStatus
|
class QDeclarativeSound : public QObject
|
||||||
{
|
{
|
||||||
friend class QDeclarativeSoundCone;
|
friend class QDeclarativeSoundCone;
|
||||||
|
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_INTERFACES(QQmlParserStatus)
|
|
||||||
Q_PROPERTY(QString name READ name WRITE setName)
|
Q_PROPERTY(QString name READ name WRITE setName)
|
||||||
Q_PROPERTY(PlayType playType READ playType WRITE setPlayType)
|
Q_PROPERTY(PlayType playType READ playType WRITE setPlayType)
|
||||||
Q_PROPERTY(QString category READ category WRITE setCategory)
|
Q_PROPERTY(QString category READ category WRITE setCategory)
|
||||||
@@ -99,9 +99,6 @@ public:
|
|||||||
QDeclarativeSound(QObject *parent = 0);
|
QDeclarativeSound(QObject *parent = 0);
|
||||||
~QDeclarativeSound();
|
~QDeclarativeSound();
|
||||||
|
|
||||||
void classBegin();
|
|
||||||
void componentComplete();
|
|
||||||
|
|
||||||
PlayType playType() const;
|
PlayType playType() const;
|
||||||
void setPlayType(PlayType playType);
|
void setPlayType(PlayType playType);
|
||||||
|
|
||||||
@@ -114,6 +111,9 @@ public:
|
|||||||
QString attenuationModel() const;
|
QString attenuationModel() const;
|
||||||
void setAttenuationModel(const QString &attenuationModel);
|
void setAttenuationModel(const QString &attenuationModel);
|
||||||
|
|
||||||
|
QDeclarativeAudioEngine *engine() const;
|
||||||
|
void setEngine(QDeclarativeAudioEngine *);
|
||||||
|
|
||||||
QDeclarativeSoundCone* cone() const;
|
QDeclarativeSoundCone* cone() const;
|
||||||
|
|
||||||
QDeclarativeAttenuationModel* attenuationModelObject() const;
|
QDeclarativeAttenuationModel* attenuationModelObject() const;
|
||||||
@@ -128,6 +128,8 @@ public:
|
|||||||
QQmlListProperty<QDeclarativePlayVariation> playVariationlist();
|
QQmlListProperty<QDeclarativePlayVariation> playVariationlist();
|
||||||
QList<QDeclarativePlayVariation*>& playlist();
|
QList<QDeclarativePlayVariation*>& playlist();
|
||||||
|
|
||||||
|
Q_INVOKABLE Q_REVISION(1) void addPlayVariation(QDeclarativePlayVariation*);
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void play();
|
void play();
|
||||||
void play(qreal gain);
|
void play(qreal gain);
|
||||||
@@ -147,7 +149,6 @@ private:
|
|||||||
Q_DISABLE_COPY(QDeclarativeSound)
|
Q_DISABLE_COPY(QDeclarativeSound)
|
||||||
QDeclarativeSoundInstance* newInstance(bool managed);
|
QDeclarativeSoundInstance* newInstance(bool managed);
|
||||||
static void appendFunction(QQmlListProperty<QDeclarativePlayVariation> *property, QDeclarativePlayVariation *value);
|
static void appendFunction(QQmlListProperty<QDeclarativePlayVariation> *property, QDeclarativePlayVariation *value);
|
||||||
bool m_complete;
|
|
||||||
PlayType m_playType;
|
PlayType m_playType;
|
||||||
QString m_name;
|
QString m_name;
|
||||||
QString m_category;
|
QString m_category;
|
||||||
@@ -157,6 +158,7 @@ private:
|
|||||||
|
|
||||||
QDeclarativeAttenuationModel *m_attenuationModelObject;
|
QDeclarativeAttenuationModel *m_attenuationModelObject;
|
||||||
QDeclarativeAudioCategory *m_categoryObject;
|
QDeclarativeAudioCategory *m_categoryObject;
|
||||||
|
QDeclarativeAudioEngine *m_engine;
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|||||||
Reference in New Issue
Block a user