aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2010-09-10 18:37:27 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2010-09-10 18:37:27 +0000
commit894560da81dd47961dad69a4cda2ee75d839da2f (patch)
tree4052f25d6365ea8655184bb8b237867953c6d339
parent1ef3a1732abb01a1ae9f68c58668e8b8df2db141 (diff)
downloadqmmp-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.cpp10
-rw-r--r--src/plugins/Effect/crossfade/crossfadeplugin.h1
-rw-r--r--src/qmmp/soundcore.cpp9
-rw-r--r--src/qmmp/soundcore.h3
-rw-r--r--src/qmmp/statehandler.cpp23
-rw-r--r--src/qmmp/statehandler.h22
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