summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
authorLing Hu <ling.hu@nokia.com>2012-01-18 17:17:54 +1000
committerQt by Nokia <qt-info@nokia.com>2012-02-06 05:35:28 +0100
commit809bbc35c67f085e91db9202795cccab0a5ae548 (patch)
tree2449887bd384208bd4e354a95156909444ef93c7 /src/multimedia
parent262f397e3ed6a10ee99518535cdc3ee20ee52688 (diff)
Add AudioEngine with new implementation
Change-Id: I5eebe662ecbce9814ed3e763db56df9be737d11f Reviewed-by: Michael Goddard <michael.goddard@nokia.com>
Diffstat (limited to 'src/multimedia')
-rw-r--r--src/multimedia/audio/qsamplecache_p.cpp33
-rw-r--r--src/multimedia/audio/qsamplecache_p.h16
2 files changed, 44 insertions, 5 deletions
diff --git a/src/multimedia/audio/qsamplecache_p.cpp b/src/multimedia/audio/qsamplecache_p.cpp
index aca08955b..addc03da3 100644
--- a/src/multimedia/audio/qsamplecache_p.cpp
+++ b/src/multimedia/audio/qsamplecache_p.cpp
@@ -93,13 +93,17 @@ QT_BEGIN_NAMESPACE
\endcode
*/
-QSampleCache::QSampleCache()
- : m_networkAccessManager(0)
+QSampleCache::QSampleCache(QObject *parent)
+ : QObject(parent)
+ , m_networkAccessManager(0)
, m_mutex(QMutex::Recursive)
, m_capacity(0)
, m_usage(0)
+ , m_loadingRefCount(0)
{
m_loadingThread.setObjectName(QLatin1String("QSampleCache::LoadingThread"));
+ connect(&m_loadingThread, SIGNAL(finished()), this, SIGNAL(isLoadingChanged()));
+ connect(&m_loadingThread, SIGNAL(started()), this, SIGNAL(isLoadingChanged()));
}
QNetworkAccessManager& QSampleCache::networkAccessManager()
@@ -128,10 +132,31 @@ QSampleCache::~QSampleCache()
delete m_networkAccessManager;
}
+void QSampleCache::loadingRelease()
+{
+ QMutexLocker locker(&m_loadingMutex);
+ m_loadingRefCount--;
+ if (m_loadingRefCount == 0) {
+ if (m_loadingThread.isRunning())
+ m_loadingThread.exit();
+ }
+}
+
+bool QSampleCache::isLoading() const
+{
+ return m_loadingThread.isRunning();
+}
+
QSample* QSampleCache::requestSample(const QUrl& url)
{
+ //lock and add first to make sure live loadingThread will not be killed during this function call
+ m_loadingMutex.lock();
+ m_loadingRefCount++;
+ m_loadingMutex.unlock();
+
if (!m_loadingThread.isRunning())
m_loadingThread.start();
+
#ifdef QT_SAMPLECACHE_DEBUG
qDebug() << "QSampleCache: request sample [" << url << "]";
#endif
@@ -250,6 +275,8 @@ void QSample::loadIfNecessary()
if (m_state == QSample::Error || m_state == QSample::Creating) {
m_state = QSample::Loading;
QMetaObject::invokeMethod(this, "load", Qt::QueuedConnection);
+ } else {
+ qobject_cast<QSampleCache*>(m_parent)->loadingRelease();
}
}
@@ -367,6 +394,7 @@ void QSample::decoderError()
#endif
cleanup();
m_state = QSample::Error;
+ qobject_cast<QSampleCache*>(m_parent)->loadingRelease();
emit error();
}
@@ -380,6 +408,7 @@ void QSample::onReady()
m_audioFormat = m_waveDecoder->audioFormat();
cleanup();
m_state = QSample::Ready;
+ qobject_cast<QSampleCache*>(m_parent)->loadingRelease();
emit ready();
}
diff --git a/src/multimedia/audio/qsamplecache_p.h b/src/multimedia/audio/qsamplecache_p.h
index d5997b9cc..0c1bc5e7e 100644
--- a/src/multimedia/audio/qsamplecache_p.h
+++ b/src/multimedia/audio/qsamplecache_p.h
@@ -74,7 +74,7 @@ class QSampleCache;
class QWaveDecoder;
// Lives in application thread
-class QSample : public QObject
+class Q_MULTIMEDIA_EXPORT QSample : public QObject
{
Q_OBJECT
public:
@@ -127,17 +127,23 @@ private:
int m_ref;
};
-class QSampleCache
+class Q_MULTIMEDIA_EXPORT QSampleCache : public QObject
{
+ Q_OBJECT
public:
friend class QSample;
- QSampleCache();
+ QSampleCache(QObject *parent = 0);
~QSampleCache();
QSample* requestSample(const QUrl& url);
void setCapacity(qint64 capacity);
+ bool isLoading() const;
+
+Q_SIGNALS:
+ void isLoadingChanged();
+
private:
QMap<QUrl, QSample*> m_samples;
QSet<QSample*> m_staleSamples;
@@ -152,6 +158,10 @@ private:
bool notifyUnreferencedSample(QSample* sample);
void removeUnreferencedSample(QSample* sample);
void unloadSample(QSample* sample);
+
+ void loadingRelease();
+ int m_loadingRefCount;
+ QMutex m_loadingMutex;
};
QT_END_NAMESPACE