aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-05-19 09:12:53 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-05-19 09:12:53 +0000
commit7709775236bd77460ca64d2c48ba75312bd5fc5a (patch)
treea251ebafe30f60208aef674eddfb7a1df82f5b66 /src
parent7c3a5146cc623ea2940177e272afdd072a07e690 (diff)
downloadqmmp-7709775236bd77460ca64d2c48ba75312bd5fc5a.tar.gz
qmmp-7709775236bd77460ca64d2c48ba75312bd5fc5a.tar.bz2
qmmp-7709775236bd77460ca64d2c48ba75312bd5fc5a.zip
fixed noise on buffer underrun
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3472 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
-rw-r--r--src/qmmp/qmmpaudioengine.cpp50
-rw-r--r--src/qmmp/qmmpaudioengine_p.h3
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);