From c8ccd3ae4ce1da61ed1f721d6d35846cc2c1f35d Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Tue, 10 Sep 2013 11:43:25 +0000 Subject: 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 --- src/plugins/Engines/mplayer/mplayerengine.cpp | 6 +----- src/plugins/Engines/mplayer/mplayerengine.h | 3 +-- src/qmmp/abstractengine.h | 5 ----- src/qmmp/qmmpaudioengine.cpp | 12 ++++-------- src/qmmp/qmmpaudioengine_p.h | 1 - src/qmmp/soundcore.cpp | 2 +- src/qmmp/statehandler.cpp | 23 +++++++++++++++++++---- src/qmmp/statehandler.h | 12 +++++++++++- 8 files changed, 37 insertions(+), 27 deletions(-) (limited to 'src') 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 @@ -53,11 +53,6 @@ public: * Subclass should reimplement this function. */ 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 #include +#include #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 &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 @@ -52,6 +52,11 @@ public: * @param channels Number of channels. */ 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 */ @@ -73,6 +78,10 @@ public: * Returns the current time (in milliseconds). */ qint64 elapsed(); + /*! + * Returns length in milliseconds + */ + qint64 totalTime(); /*! * Returns current bitrate (in kbps) */ @@ -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; -- cgit v1.2.3-13-gbd6f