diff options
| -rw-r--r-- | src/qmmp/qmmpaudioengine.cpp | 50 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine_p.h | 3 |
2 files changed, 32 insertions, 21 deletions
diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp index 0a72526ed..b66d6b0c4 100644 --- a/src/qmmp/qmmpaudioengine.cpp +++ b/src/qmmp/qmmpaudioengine.cpp @@ -79,6 +79,22 @@ void QmmpAudioEngine::reset() m_next = false; } +void QmmpAudioEngine::clearDecoders() +{ + if(m_decoder) + { + m_inputs.take(m_decoder)->deleteLater (); + delete m_decoder; + m_decoder = 0; + } + while(!m_decoders.isEmpty()) + { + Decoder *d = m_decoders.dequeue(); + m_inputs.take(d)->deleteLater (); + delete d; + } +} + bool QmmpAudioEngine::play() { if(isRunning() || m_decoders.isEmpty() || (m_output && m_output->isRunning())) @@ -258,14 +274,8 @@ void QmmpAudioEngine::stop() m_output = 0; } - while(!m_decoders.isEmpty()) - { - Decoder *d = m_decoders.dequeue(); - m_inputs.take(d)->deleteLater (); - delete d; - } + clearDecoders(); reset(); - m_decoder = 0; while(!m_effects.isEmpty()) //delete effects delete m_effects.takeFirst(); } @@ -328,7 +338,7 @@ void QmmpAudioEngine::run() StateHandler::instance()->dispatch(Qmmp::Playing); sendMetaData(); - while (! m_done && ! m_finish) + while (!m_done && !m_finish) { mutex()->lock (); //seek @@ -360,13 +370,19 @@ void QmmpAudioEngine::run() if(delay > TRANSPORT_TIMEOUT) { qWarning("QmmpAudioEngine: unable to receive more data"); - m_finish = true; + m_done = true; + StateHandler::instance()->dispatch(Qmmp::NormalError); + break; } - continue; + else + continue; + } + else + { + delay = 0; + // decode + len = m_decoder->read((char *)(m_output_buf + m_output_at), m_output_size - m_output_at); } - delay = 0; - // decode - len = m_decoder->read((char *)(m_output_buf + m_output_at), m_output_size - m_output_at); if (len > 0) { @@ -457,13 +473,7 @@ void QmmpAudioEngine::run() m_finish = true; mutex()->unlock(); } - if(m_decoder) - { - m_inputs.take(m_decoder)->deleteLater (); - delete m_decoder; - m_decoder = 0; - } - + clearDecoders(); mutex()->lock (); m_next = false; if (m_finish) diff --git a/src/qmmp/qmmpaudioengine_p.h b/src/qmmp/qmmpaudioengine_p.h index 52731027b..89e7e8b30 100644 --- a/src/qmmp/qmmpaudioengine_p.h +++ b/src/qmmp/qmmpaudioengine_p.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2009-2012 by Ilya Kotov * + * Copyright (C) 2009-2013 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -65,6 +65,7 @@ private slots: private: void run(); void reset(); + void clearDecoders(); void flush(bool = false); void addOffset(); qint64 produceSound(char *data, qint64 size, quint32 brate); |
