diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-09-10 11:43:25 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-09-10 11:43:25 +0000 |
| commit | c8ccd3ae4ce1da61ed1f721d6d35846cc2c1f35d (patch) | |
| tree | e4bfafd046b5a7e0c837a2a07712462c34ac59e3 /src | |
| parent | 8452a9b72397a6245a11b688fa6ef272a0a26616 (diff) | |
| download | qmmp-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.cpp | 6 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/mplayerengine.h | 3 | ||||
| -rw-r--r-- | src/qmmp/abstractengine.h | 5 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine.cpp | 12 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine_p.h | 1 | ||||
| -rw-r--r-- | src/qmmp/soundcore.cpp | 2 | ||||
| -rw-r--r-- | src/qmmp/statehandler.cpp | 23 | ||||
| -rw-r--r-- | src/qmmp/statehandler.h | 12 |
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; |
