From 809bbc35c67f085e91db9202795cccab0a5ae548 Mon Sep 17 00:00:00 2001 From: Ling Hu Date: Wed, 18 Jan 2012 17:17:54 +1000 Subject: Add AudioEngine with new implementation Change-Id: I5eebe662ecbce9814ed3e763db56df9be737d11f Reviewed-by: Michael Goddard --- .../audioengine/qdeclarative_audiosample_p.cpp | 242 +++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 src/imports/audioengine/qdeclarative_audiosample_p.cpp (limited to 'src/imports/audioengine/qdeclarative_audiosample_p.cpp') diff --git a/src/imports/audioengine/qdeclarative_audiosample_p.cpp b/src/imports/audioengine/qdeclarative_audiosample_p.cpp new file mode 100644 index 000000000..24a88ae76 --- /dev/null +++ b/src/imports/audioengine/qdeclarative_audiosample_p.cpp @@ -0,0 +1,242 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qdeclarative_audiosample_p.h" +#include "qdeclarative_audioengine_p.h" +#include "qdebug.h" +#include "qsoundbuffer_p.h" +#include "qaudioengine_p.h" + +#define DEBUG_AUDIOENGINE + +QT_USE_NAMESPACE + +/*! + \qmlclass AudioSample QDeclarativeAudioSample + \since 5.0 + \brief The AudioSample element allows you to load audio samples, mostly wav file. + \ingroup qml-multimedia + \inherits Item + + This element is part of the \bold{QtAudioEngine 1.0} module. + + AudioSample element can be accessed through AudioEngine::samples with its unique name and must + be defined inside AudioEngine. + + \qml + import QtQuick 2.0 + import QtAudioEngine 1.0 + + Rectangle { + color:"white" + width: 300 + height: 500 + + AudioEngine { + id:audioengine + + AudioSample { + name:"explosion" + source: "explosion-02.wav" + } + } + } + \endqml +*/ +QDeclarativeAudioSample::QDeclarativeAudioSample(QObject *parent) + : QObject(parent) + , m_complete(false) + , m_streaming(false) + , m_preloaded(false) + , m_soundBuffer(0) +{ +} + +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; +} + +QUrl QDeclarativeAudioSample::source() const +{ + return m_url; +} + +void QDeclarativeAudioSample::setSource(const QUrl& url) +{ + if (m_complete) { + qWarning("AudioSample: source not changable after initialization."); + return; + } + m_url = url; +} + +bool QDeclarativeAudioSample::isStreaming() const +{ + return m_streaming; +} + +/*! + \qmlproperty bool AudioSample::preloaded + + This property holds indicates whether this sample needs to be preloaded or not. + If true, the audio engine will start loading the sample file immediately when the app started, + otherwise the sample will not be loaded untill be used by other element. +*/ + +bool QDeclarativeAudioSample::isPreloaded() const +{ + return m_preloaded; +} + +/*! + \qmlproperty bool AudioSample::isLoaded + + This property holds indicates whether this sample has been loaded into memory or not. +*/ +bool QDeclarativeAudioSample::isLoaded() const +{ + if (!m_soundBuffer) + return false; + return m_soundBuffer->isReady(); +} + +/*! + \qmlproperty AudioSample::load() + + Starts loading the sample into memory if not loaded. +*/ +void QDeclarativeAudioSample::load() +{ + if (isLoaded()) + return; + if (!m_soundBuffer) { + m_preloaded = true; + return; + } + m_soundBuffer->load(); +} + +void QDeclarativeAudioSample::setPreloaded(bool preloaded) +{ + if (m_complete) { + qWarning("AudioSample: preloaded not changable after initialization."); + return; + } + m_preloaded = preloaded; +} + +void QDeclarativeAudioSample::setStreaming(bool streaming) +{ + if (m_complete) { + qWarning("AudioSample: streaming not changable after initialization."); + return; + } + m_streaming = streaming; +} + +/*! + \qmlproperty string AudioSample::name + + This property holds the name of AudioSample, must be unique among all samples and only + defined once. +*/ +QString QDeclarativeAudioSample::name() const +{ + return m_name; +} + +void QDeclarativeAudioSample::setName(const QString& name) +{ + if (m_complete) { + qWarning("AudioSample: name not changable after initialization."); + return; + } + m_name = name; +} + +void QDeclarativeAudioSample::init() +{ + if (m_streaming) { + //TODO + + } else { + m_soundBuffer = + qobject_cast(parent())->engine()->getStaticSoundBuffer(m_url); + if (m_soundBuffer->isReady()) { + emit loadedChanged(); + } else { + connect(m_soundBuffer, SIGNAL(ready()), this, SIGNAL(loadedChanged())); + } + if (m_preloaded) { + m_soundBuffer->load(); + } + } +} + +QSoundBuffer* QDeclarativeAudioSample::soundBuffer() const +{ + return m_soundBuffer; +} + +/*! + \qmlsignal AudioSample::onLoadedChanged() + + This handler is called when \l loaded is changed +*/ + + -- cgit v1.2.3