aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-09-10 11:43:25 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-09-10 11:43:25 +0000
commitc8ccd3ae4ce1da61ed1f721d6d35846cc2c1f35d (patch)
treee4bfafd046b5a7e0c837a2a07712462c34ac59e3 /src
parent8452a9b72397a6245a11b688fa6ef272a0a26616 (diff)
downloadqmmp-c8ccd3ae4ce1da61ed1f721d6d35846cc2c1f35d.tar.gz
qmmp-c8ccd3ae4ce1da61ed1f721d6d35846cc2c1f35d.tar.bz2
qmmp-c8ccd3ae4ce1da61ed1f721d6d35846cc2c1f35d.zip
SoundCore::totalTime() is thread-safe now
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3705 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
-rw-r--r--src/plugins/Engines/mplayer/mplayerengine.cpp6
-rw-r--r--src/plugins/Engines/mplayer/mplayerengine.h3
-rw-r--r--src/qmmp/abstractengine.h5
-rw-r--r--src/qmmp/qmmpaudioengine.cpp12
-rw-r--r--src/qmmp/qmmpaudioengine_p.h1
-rw-r--r--src/qmmp/soundcore.cpp2
-rw-r--r--src/qmmp/statehandler.cpp23
-rw-r--r--src/qmmp/statehandler.h12
8 files changed, 37 insertions, 27 deletions
diff --git a/src/plugins/Engines/mplayer/mplayerengine.cpp b/src/plugins/Engines/mplayer/mplayerengine.cpp
index 095fd4b05..d4d8b37ae 100644
--- a/src/plugins/Engines/mplayer/mplayerengine.cpp
+++ b/src/plugins/Engines/mplayer/mplayerengine.cpp
@@ -154,11 +154,6 @@ bool MplayerEngine::initialize()
return true;
}
-qint64 MplayerEngine::totalTime()
-{
- return m_length * 1000;
-}
-
void MplayerEngine::seek(qint64 pos)
{
if (m_process->state() == QProcess::Running)
@@ -244,6 +239,7 @@ void MplayerEngine::startMplayerProcess()
connect(m_process, SIGNAL(readyReadStandardOutput()), SLOT(readStdOut()));
m_process->start ("mplayer", m_args);
StateHandler::instance()->dispatch(Qmmp::Playing);
+ StateHandler::instance()->dispatch(m_length * 1000);
FileInfo *info = MplayerInfo::createFileInfo(m_source->url());
StateHandler::instance()->dispatch(info->metaData());
delete info;
diff --git a/src/plugins/Engines/mplayer/mplayerengine.h b/src/plugins/Engines/mplayer/mplayerengine.h
index 903dcce71..961a86cb6 100644
--- a/src/plugins/Engines/mplayer/mplayerengine.h
+++ b/src/plugins/Engines/mplayer/mplayerengine.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2008-2009 by Ilya Kotov *
+ * Copyright (C) 2008-2013 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -52,7 +52,6 @@ public:
bool play();
bool enqueue(InputSource *source);
bool initialize();
- qint64 totalTime();
void seek(qint64);
void stop();
void pause();
diff --git a/src/qmmp/abstractengine.h b/src/qmmp/abstractengine.h
index 67bcbc9f3..6ee1e9e3d 100644
--- a/src/qmmp/abstractengine.h
+++ b/src/qmmp/abstractengine.h
@@ -54,11 +54,6 @@ public:
*/
virtual bool enqueue(InputSource *source) = 0;
/*!
- * Returns the total time in milliseconds.
- * Subclass should reimplement this function.
- */
- virtual qint64 totalTime() = 0;
- /*!
* Starts playback. Returns \b true if playback has been started successful,
* otherwise returns \b false.
*/
diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp
index 06af5686a..221a47e00 100644
--- a/src/qmmp/qmmpaudioengine.cpp
+++ b/src/qmmp/qmmpaudioengine.cpp
@@ -158,14 +158,6 @@ bool QmmpAudioEngine::enqueue(InputSource *source)
return true;
}
-qint64 QmmpAudioEngine::totalTime()
-{
- if(m_decoder)
- return m_decoder->totalTime();
- else
- return 0;
-}
-
void QmmpAudioEngine::addEffect(EffectFactory *factory)
{
foreach(Effect *effect, m_effects)
@@ -344,6 +336,7 @@ void QmmpAudioEngine::run()
mutex()->unlock();
m_output->start();
StateHandler::instance()->dispatch(Qmmp::Playing);
+ StateHandler::instance()->dispatch(m_decoder->totalTime());
sendMetaData();
while (!m_done && !m_finish)
@@ -409,6 +402,7 @@ void QmmpAudioEngine::run()
StateHandler::instance()->dispatch(Qmmp::Buffering);
StateHandler::instance()->dispatch(Qmmp::Playing);
m_decoder->next();
+ StateHandler::instance()->dispatch(m_decoder->totalTime());
m_replayGain->setReplayGainInfo(m_decoder->replayGainInfo());
m_output->seek(0); //reset counter
addOffset(); //offset
@@ -431,6 +425,7 @@ void QmmpAudioEngine::run()
StateHandler::instance()->dispatch(Qmmp::Stopped); //fake stop/start cycle
StateHandler::instance()->dispatch(Qmmp::Buffering);
StateHandler::instance()->dispatch(Qmmp::Playing);
+ StateHandler::instance()->dispatch(m_decoder->totalTime());
m_output->seek(0); //reset counter
mutex()->unlock();
sendMetaData();
@@ -454,6 +449,7 @@ void QmmpAudioEngine::run()
{
m_output->start();
StateHandler::instance()->dispatch(Qmmp::Playing);
+ StateHandler::instance()->dispatch(m_decoder->totalTime());
sendMetaData();
addOffset(); //offset
continue;
diff --git a/src/qmmp/qmmpaudioengine_p.h b/src/qmmp/qmmpaudioengine_p.h
index 89e7e8b30..7878fc7a2 100644
--- a/src/qmmp/qmmpaudioengine_p.h
+++ b/src/qmmp/qmmpaudioengine_p.h
@@ -49,7 +49,6 @@ public:
bool play();
bool enqueue(InputSource *source);
- qint64 totalTime();
void seek(qint64 time);
void stop();
void pause();
diff --git a/src/qmmp/soundcore.cpp b/src/qmmp/soundcore.cpp
index 396a6f361..3e1d474f2 100644
--- a/src/qmmp/soundcore.cpp
+++ b/src/qmmp/soundcore.cpp
@@ -135,7 +135,7 @@ bool SoundCore::nextTrackAccepted() const
qint64 SoundCore::totalTime() const
{
- return (m_engine) ? m_engine->totalTime() : 0;
+ return m_handler->totalTime();
}
EqSettings SoundCore::eqSettings() const
diff --git a/src/qmmp/statehandler.cpp b/src/qmmp/statehandler.cpp
index 2c8c67b0b..c327fdc9c 100644
--- a/src/qmmp/statehandler.cpp
+++ b/src/qmmp/statehandler.cpp
@@ -20,6 +20,7 @@
#include <QStringList>
#include <QApplication>
+#include <QMutexLocker>
#include "soundcore.h"
#include "qmmpevents_p.h"
#include "statehandler.h"
@@ -36,6 +37,7 @@ StateHandler::StateHandler(QObject *parent)
qFatal("StateHandler: only one instance is allowed");
m_instance = this;
m_elapsed = -1;
+ m_length = 0;
m_bitrate = 0;
m_frequency = 0;
m_precision = 0;
@@ -44,7 +46,6 @@ StateHandler::StateHandler(QObject *parent)
m_state = Qmmp::Stopped;
}
-
StateHandler::~StateHandler()
{
m_instance = 0;
@@ -63,11 +64,11 @@ void StateHandler::dispatch(qint64 elapsed, int bitrate, quint32 frequency, int
emit (bitrateChanged(bitrate));
}
if((SoundCore::instance()->totalTime() > PREFINISH_TIME)
- && (SoundCore::instance()->totalTime() - m_elapsed < PREFINISH_TIME)
+ && (m_length - m_elapsed < PREFINISH_TIME)
&& m_sendAboutToFinish)
{
m_sendAboutToFinish = false;
- if(SoundCore::instance()->totalTime() - m_elapsed > PREFINISH_TIME/2)
+ if(m_length - m_elapsed > PREFINISH_TIME/2)
qApp->postEvent(parent(), new QEvent(EVENT_NEXT_TRACK_REQUEST));
}
}
@@ -89,6 +90,13 @@ void StateHandler::dispatch(qint64 elapsed, int bitrate, quint32 frequency, int
m_mutex.unlock();
}
+void StateHandler::dispatch(qint64 length)
+{
+ m_mutex.lock();
+ m_length = length;
+ m_mutex.unlock();
+}
+
void StateHandler::dispatch(const QMap<Qmmp::MetaData, QString> &metaData)
{
m_mutex.lock();
@@ -177,9 +185,16 @@ void StateHandler::dispatchBuffer(int percent)
qint64 StateHandler::elapsed()
{
+ QMutexLocker locker(&m_mutex);
return m_elapsed;
}
+qint64 StateHandler::totalTime()
+{
+ QMutexLocker locker(&m_mutex);
+ return m_length;
+}
+
int StateHandler::bitrate()
{
return m_bitrate;
@@ -200,7 +215,7 @@ int StateHandler::channels()
return m_channels;
}
-Qmmp::State StateHandler::state() const
+Qmmp::State StateHandler::state()
{
return m_state;
}
diff --git a/src/qmmp/statehandler.h b/src/qmmp/statehandler.h
index 92b9f8bc1..931ff09f1 100644
--- a/src/qmmp/statehandler.h
+++ b/src/qmmp/statehandler.h
@@ -53,6 +53,11 @@ public:
*/
void dispatch(qint64 elapsed, int bitrate, quint32 frequency, int precision, int channels);
/*!
+ * Sends information about song length
+ * @param length song length in milliseconds
+ */
+ void dispatch(qint64 length);
+ /*!
* Sends metadata \b metaData
*/
void dispatch(const QMap<Qmmp::MetaData, QString> &metaData);
@@ -74,6 +79,10 @@ public:
*/
qint64 elapsed();
/*!
+ * Returns length in milliseconds
+ */
+ qint64 totalTime();
+ /*!
* Returns current bitrate (in kbps)
*/
int bitrate();
@@ -92,7 +101,7 @@ public:
/*!
* Returns the current state.
*/
- Qmmp::State state() const;
+ Qmmp::State state();
/*!
* Sends next track request.
*/
@@ -141,6 +150,7 @@ signals:
private:
qint64 m_elapsed;
+ qint64 m_length;
quint32 m_frequency;
bool m_sendAboutToFinish;
int m_bitrate, m_precision, m_channels;