diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-09-10 18:37:27 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-09-10 18:37:27 +0000 |
| commit | 894560da81dd47961dad69a4cda2ee75d839da2f (patch) | |
| tree | 4052f25d6365ea8655184bb8b237867953c6d339 | |
| parent | 1ef3a1732abb01a1ae9f68c58668e8b8df2db141 (diff) | |
| download | qmmp-894560da81dd47961dad69a4cda2ee75d839da2f.tar.gz qmmp-894560da81dd47961dad69a4cda2ee75d839da2f.tar.bz2 qmmp-894560da81dd47961dad69a4cda2ee75d839da2f.zip | |
crossfade plugin: fixed cutting off last track
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1884 90c681e8-e032-0410-971d-27865f9a5e38
| -rw-r--r-- | src/plugins/Effect/crossfade/crossfadeplugin.cpp | 10 | ||||
| -rw-r--r-- | src/plugins/Effect/crossfade/crossfadeplugin.h | 1 | ||||
| -rw-r--r-- | src/qmmp/soundcore.cpp | 9 | ||||
| -rw-r--r-- | src/qmmp/soundcore.h | 3 | ||||
| -rw-r--r-- | src/qmmp/statehandler.cpp | 23 | ||||
| -rw-r--r-- | src/qmmp/statehandler.h | 22 |
6 files changed, 62 insertions, 6 deletions
diff --git a/src/plugins/Effect/crossfade/crossfadeplugin.cpp b/src/plugins/Effect/crossfade/crossfadeplugin.cpp index b937dd51b..a50df9b2b 100644 --- a/src/plugins/Effect/crossfade/crossfadeplugin.cpp +++ b/src/plugins/Effect/crossfade/crossfadeplugin.cpp @@ -50,9 +50,15 @@ void CrossfadePlugin::applyEffect(Buffer *b) if(m_core->totalTime() - m_handler->elapsed() < m_overlap + 2000) { StateHandler::instance()->sendNextTrackRequest(); - m_state = PREPARING; + m_state = CHECKING; } return; + case CHECKING: + //next source has been received and current engine will be used to play it + if(m_handler->nextEngine() == m_handler->currentEngine()) + m_state = PREPARING; + else + return; case PREPARING: if(m_core->totalTime() - m_handler->elapsed() < m_overlap) { @@ -92,7 +98,5 @@ void CrossfadePlugin::applyEffect(Buffer *b) void CrossfadePlugin::configure(quint32 freq, int chan, Qmmp::AudioFormat format) { - //m_buffer_size = m_overlap * freq * chan * AudioParameters::sampleSize(format) / 1000; - //m_buffer =(uchar *) malloc(m_buffer_size); Effect::configure(freq, chan, format); } diff --git a/src/plugins/Effect/crossfade/crossfadeplugin.h b/src/plugins/Effect/crossfade/crossfadeplugin.h index ec025aded..968405923 100644 --- a/src/plugins/Effect/crossfade/crossfadeplugin.h +++ b/src/plugins/Effect/crossfade/crossfadeplugin.h @@ -44,6 +44,7 @@ private: enum State { WAITING = 0, + CHECKING, PREPARING, PROCESSING, }; diff --git a/src/qmmp/soundcore.cpp b/src/qmmp/soundcore.cpp index 31c35e78a..925f66ab5 100644 --- a/src/qmmp/soundcore.cpp +++ b/src/qmmp/soundcore.cpp @@ -226,6 +226,9 @@ bool SoundCore::enqueue(InputSource *s) { if(state() == Qmmp::Stopped || state() == Qmmp::Buffering) m_engine->play(); + else + m_handler->setNextEngine(m_engine); + m_handler->setCurrentEngine(m_engine); } else { @@ -247,12 +250,15 @@ bool SoundCore::enqueue(InputSource *s) engine->deleteLater(); engine = 0; } + else + break; } } if(!engine) //unsupported file format { s->deleteLater(); + m_handler->setCurrentEngine(0); return false; } connect(engine, SIGNAL(playbackFinished()), SIGNAL(finished())); @@ -261,12 +267,14 @@ bool SoundCore::enqueue(InputSource *s) if(m_pendingEngine) m_pendingEngine->deleteLater(); m_pendingEngine = engine; + m_handler->setNextEngine(engine); } else { m_engine->deleteLater(); m_engine = engine; m_engine->play(); + m_handler->setCurrentEngine(m_engine); m_pendingEngine = 0; } } @@ -282,6 +290,7 @@ void SoundCore::startPendingEngine() m_engine = m_pendingEngine; m_pendingEngine = 0; m_engine->play(); + m_handler->setCurrentEngine(m_engine); } } diff --git a/src/qmmp/soundcore.h b/src/qmmp/soundcore.h index 2019598f9..2e44ee6ac 100644 --- a/src/qmmp/soundcore.h +++ b/src/qmmp/soundcore.h @@ -98,12 +98,11 @@ public: * Returns the metdata string associated with the given \b key. */ QString metaData(Qmmp::MetaData key); - /*! + /*! * Returns a pointer to the SoundCore instance. */ static SoundCore* instance(); - public slots: /*! * Sets volume. diff --git a/src/qmmp/statehandler.cpp b/src/qmmp/statehandler.cpp index c48538c78..e2f3f6d5a 100644 --- a/src/qmmp/statehandler.cpp +++ b/src/qmmp/statehandler.cpp @@ -40,6 +40,8 @@ StateHandler::StateHandler(QObject *parent) m_channels = 0; m_sendAboutToFinish = true; m_state = Qmmp::Stopped; + m_next_engine = 0; + m_current_engine = 0; } @@ -134,6 +136,7 @@ void StateHandler::dispatch(Qmmp::State state) m_frequency = 0; m_precision = 0; m_channels = 0; + m_next_engine = 0; m_metaData.clear(); } if(state == Qmmp::Playing) @@ -163,6 +166,16 @@ void StateHandler::dispatchBuffer(int percent) emit bufferingProgress(percent); } +void StateHandler::setNextEngine(AbstractEngine *engine) +{ + m_next_engine = engine; +} + +void StateHandler::setCurrentEngine(AbstractEngine *engine) +{ + m_current_engine = engine; +} + qint64 StateHandler::elapsed() { return m_elapsed; @@ -214,6 +227,16 @@ void StateHandler::sendNextTrackRequest() m_mutex.unlock(); } +AbstractEngine *StateHandler::nextEngine() +{ + return m_next_engine; +} + +AbstractEngine *StateHandler::currentEngine() +{ + return m_current_engine; +} + StateHandler *StateHandler::instance() { return m_instance; diff --git a/src/qmmp/statehandler.h b/src/qmmp/statehandler.h index 1fac1b4d1..2e60f327e 100644 --- a/src/qmmp/statehandler.h +++ b/src/qmmp/statehandler.h @@ -23,7 +23,7 @@ #include <QObject> #include <QMap> #include <QMutex> - +#include "abstractengine.h" #include "qmmp.h" /*! @brief The StateHandler class allows to track information about playback progress. @@ -69,6 +69,14 @@ public: */ virtual void dispatchBuffer(int percent); /*! + * Sets next audio engine. + */ + void setNextEngine(AbstractEngine *engine); + /*! + * Sets current audio engine. + */ + void setCurrentEngine(AbstractEngine *engine); + /*! * Returns the current time (in milliseconds). */ qint64 elapsed(); @@ -105,6 +113,16 @@ public: */ void sendNextTrackRequest(); /*! + * Returns a pointer to the audio engine which will be used to play next (queued) audio source. + * Otherwise returns \b 0 + */ + AbstractEngine *nextEngine(); + /*! + * Returns a pointer to the current audio engine. + * Otherwise returns \b 0 + */ + AbstractEngine *currentEngine(); + /*! * Returns a pointer to the first created StateHandler instance. */ static StateHandler* instance(); @@ -167,6 +185,8 @@ private: QMap <Qmmp::MetaData, QString> m_cachedMetaData; Qmmp::State m_state; QMutex m_mutex; + AbstractEngine *m_next_engine; + AbstractEngine *m_current_engine; }; #endif |
