aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/Transports/http/httpinputfactory.cpp2
-rw-r--r--src/plugins/Transports/http/httpinputfactory.h4
-rw-r--r--src/plugins/Transports/http/httpinputsource.cpp7
-rw-r--r--src/plugins/Transports/http/httpinputsource.h1
-rw-r--r--src/plugins/Transports/http/httpstreamreader.cpp18
-rw-r--r--src/plugins/Transports/mms/mmsinputfactory.cpp2
-rw-r--r--src/plugins/Transports/mms/mmsinputfactory.h4
-rw-r--r--src/plugins/Transports/mms/mmsinputsource.cpp7
-rw-r--r--src/plugins/Transports/mms/mmsinputsource.h1
-rw-r--r--src/plugins/Transports/mms/mmsstreamreader.cpp4
-rw-r--r--src/qmmp/inputsource.cpp5
-rw-r--r--src/qmmp/inputsource.h6
-rw-r--r--src/qmmp/qmmpaudioengine.cpp23
13 files changed, 69 insertions, 15 deletions
diff --git a/src/plugins/Transports/http/httpinputfactory.cpp b/src/plugins/Transports/http/httpinputfactory.cpp
index 46688d2f6..9660877c3 100644
--- a/src/plugins/Transports/http/httpinputfactory.cpp
+++ b/src/plugins/Transports/http/httpinputfactory.cpp
@@ -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 *
diff --git a/src/plugins/Transports/http/httpinputfactory.h b/src/plugins/Transports/http/httpinputfactory.h
index d674f71d0..acc4f5999 100644
--- a/src/plugins/Transports/http/httpinputfactory.h
+++ b/src/plugins/Transports/http/httpinputfactory.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 *
@@ -33,7 +33,7 @@ class QTranslator;
class HTTPInputFactory : public QObject, InputSourceFactory
{
Q_OBJECT
-Q_INTERFACES(InputSourceFactory);
+Q_INTERFACES(InputSourceFactory)
public:
const InputSourceProperties properties() const;
InputSource *create(const QString &url, QObject *parent = 0);
diff --git a/src/plugins/Transports/http/httpinputsource.cpp b/src/plugins/Transports/http/httpinputsource.cpp
index 623f39bac..aebbe89b3 100644
--- a/src/plugins/Transports/http/httpinputsource.cpp
+++ b/src/plugins/Transports/http/httpinputsource.cpp
@@ -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 *
@@ -44,6 +44,11 @@ bool HTTPInputSource::isReady()
return m_reader->isOpen();
}
+bool HTTPInputSource::isWaiting()
+{
+ return (!m_reader->bytesAvailable() && m_reader->isOpen());
+}
+
QString HTTPInputSource::contentType() const
{
return m_reader->contentType();
diff --git a/src/plugins/Transports/http/httpinputsource.h b/src/plugins/Transports/http/httpinputsource.h
index ca90a1b79..cea3bc7b4 100644
--- a/src/plugins/Transports/http/httpinputsource.h
+++ b/src/plugins/Transports/http/httpinputsource.h
@@ -37,6 +37,7 @@ public:
QIODevice *ioDevice();
bool initialize();
bool isReady();
+ bool isWaiting();
QString contentType() const;
private:
diff --git a/src/plugins/Transports/http/httpstreamreader.cpp b/src/plugins/Transports/http/httpstreamreader.cpp
index da71be35d..adf9916e7 100644
--- a/src/plugins/Transports/http/httpstreamreader.cpp
+++ b/src/plugins/Transports/http/httpstreamreader.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2006-2012 by Ilya Kotov *
+ * Copyright (C) 2006-2013 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -201,6 +201,11 @@ qint64 HttpStreamReader::readData(char* data, qint64 maxlen)
qint64 len = 0;
m_mutex.lock();
+ if(m_stream.buf_fill == 0)
+ {
+ m_mutex.unlock();
+ return 0;
+ }
if (!m_stream.icy_meta_data || m_stream.icy_metaint == 0)
len = readBuffer(data, maxlen);
else
@@ -210,7 +215,6 @@ qint64 HttpStreamReader::readData(char* data, qint64 maxlen)
while (maxlen > nread && m_stream.buf_fill > nread)
{
to_read = qMin<qint64>(m_stream.icy_metaint - m_metacount, maxlen - nread);
- //to_read = (maxlen - nread);
qint64 res = readBuffer(data + nread, to_read);
nread += res;
m_metacount += res;
@@ -343,6 +347,7 @@ void HttpStreamReader::run()
setErrorString(errorBuffer);
emit error();
}
+ QIODevice::close();
}
qint64 HttpStreamReader::readBuffer(char* data, qint64 maxlen)
@@ -392,7 +397,14 @@ void HttpStreamReader::readICYMetaData()
uint8_t packet_size;
m_metacount = 0;
m_mutex.lock();
- readBuffer((char *)&packet_size, sizeof(packet_size));
+
+ while (m_stream.buf_fill < 1 && m_thread->isRunning())
+ {
+ m_mutex.unlock();
+ qApp->processEvents();
+ m_mutex.lock();
+ }
+ readBuffer((char *)&packet_size, 1);
if (packet_size != 0)
{
int size = packet_size * 16;
diff --git a/src/plugins/Transports/mms/mmsinputfactory.cpp b/src/plugins/Transports/mms/mmsinputfactory.cpp
index beb9fbf87..b485c7d03 100644
--- a/src/plugins/Transports/mms/mmsinputfactory.cpp
+++ b/src/plugins/Transports/mms/mmsinputfactory.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2010-2012 by Ilya Kotov *
+ * Copyright (C) 2010-2013 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
diff --git a/src/plugins/Transports/mms/mmsinputfactory.h b/src/plugins/Transports/mms/mmsinputfactory.h
index 8e12d7f3c..fd2bdb77e 100644
--- a/src/plugins/Transports/mms/mmsinputfactory.h
+++ b/src/plugins/Transports/mms/mmsinputfactory.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2010 by Ilya Kotov *
+ * Copyright (C) 2010-2013 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -33,7 +33,7 @@ class QTranslator;
class MMSInputFactory : public QObject, InputSourceFactory
{
Q_OBJECT
-Q_INTERFACES(InputSourceFactory);
+Q_INTERFACES(InputSourceFactory)
public:
const InputSourceProperties properties() const;
InputSource *create(const QString &url, QObject *parent = 0);
diff --git a/src/plugins/Transports/mms/mmsinputsource.cpp b/src/plugins/Transports/mms/mmsinputsource.cpp
index 31f995890..8e72fa264 100644
--- a/src/plugins/Transports/mms/mmsinputsource.cpp
+++ b/src/plugins/Transports/mms/mmsinputsource.cpp
@@ -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 *
@@ -44,6 +44,11 @@ bool MMSInputSource::isReady()
return m_reader->isOpen();
}
+bool MMSInputSource::isWaiting()
+{
+ return (!m_reader->bytesAvailable() && m_reader->isOpen());
+}
+
QString MMSInputSource::contentType() const
{
return "audio/x-ms-wma";
diff --git a/src/plugins/Transports/mms/mmsinputsource.h b/src/plugins/Transports/mms/mmsinputsource.h
index 9590e1e7c..359a96f09 100644
--- a/src/plugins/Transports/mms/mmsinputsource.h
+++ b/src/plugins/Transports/mms/mmsinputsource.h
@@ -37,6 +37,7 @@ public:
QIODevice *ioDevice();
bool initialize();
bool isReady();
+ bool isWaiting();
QString contentType() const;
private:
diff --git a/src/plugins/Transports/mms/mmsstreamreader.cpp b/src/plugins/Transports/mms/mmsstreamreader.cpp
index db4663fb1..8bc9e9790 100644
--- a/src/plugins/Transports/mms/mmsstreamreader.cpp
+++ b/src/plugins/Transports/mms/mmsstreamreader.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2006-2012 by Ilya Kotov *
+ * Copyright (C) 2006-2013 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -145,6 +145,7 @@ void MMSStreamReader::run()
qWarning("MMSStreamReader: connection failed");
setErrorString("connection failed");
emit error();
+ QIODevice::close();
return;
}
m_mutex.lock();
@@ -188,6 +189,7 @@ void MMSStreamReader::run()
break;
DownloadThread::usleep(5000);
}
+ QIODevice::close();
}
void MMSStreamReader::checkBuffer()
diff --git a/src/qmmp/inputsource.cpp b/src/qmmp/inputsource.cpp
index 72fbce863..00ad4b15f 100644
--- a/src/qmmp/inputsource.cpp
+++ b/src/qmmp/inputsource.cpp
@@ -34,6 +34,11 @@ InputSource::InputSource(const QString &source, QObject *parent) : QObject(paren
m_hasStreamInfo = false;
}
+bool InputSource::isWaiting()
+{
+ return false;
+}
+
QString InputSource::contentType() const
{
return QString();
diff --git a/src/qmmp/inputsource.h b/src/qmmp/inputsource.h
index 04eba674e..02b2c04ea 100644
--- a/src/qmmp/inputsource.h
+++ b/src/qmmp/inputsource.h
@@ -60,6 +60,12 @@ public:
*/
virtual bool isReady() = 0;
/*!
+ * Returns \b true if the transport is waiting more data; otherwise returns \b false.
+ * Reader should wait until this function returns \b false.
+ * Default implementation allways returns \b false.
+ */
+ virtual bool isWaiting();
+ /*!
* Returns content type of the input stream. Default implementation returns empty string.
*/
virtual QString contentType() const;
diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp
index a1df412f3..0a72526ed 100644
--- a/src/qmmp/qmmpaudioengine.cpp
+++ b/src/qmmp/qmmpaudioengine.cpp
@@ -34,6 +34,7 @@
#include "qmmpaudioengine_p.h"
#include "metadatamanager.h"
+#define TRANSPORT_TIMEOUT 5000 //ms
QmmpAudioEngine::QmmpAudioEngine(QObject *parent)
: AbstractEngine(parent), m_factory(0), m_output(0)
@@ -313,6 +314,7 @@ void QmmpAudioEngine::run()
mutex()->lock ();
m_next = false;
qint64 len = 0;
+ int delay = 0;
if(m_decoders.isEmpty())
{
mutex()->unlock ();
@@ -346,7 +348,23 @@ void QmmpAudioEngine::run()
StateHandler::instance()->dispatch(m_inputs[m_decoder]->takeMetaData());
if(m_inputs[m_decoder]->hasStreamInfo())
StateHandler::instance()->dispatch(m_inputs[m_decoder]->takeStreamInfo());
-
+ //wait more data
+ if(m_inputs[m_decoder]->isWaiting())
+ {
+ mutex()->unlock();
+ msleep(5);
+ delay += 5;
+ mutex()->lock();
+ m_done = m_user_stop;
+ mutex()->unlock();
+ if(delay > TRANSPORT_TIMEOUT)
+ {
+ qWarning("QmmpAudioEngine: unable to receive more data");
+ m_finish = true;
+ }
+ continue;
+ }
+ delay = 0;
// decode
len = m_decoder->read((char *)(m_output_buf + m_output_at), m_output_size - m_output_at);
@@ -354,8 +372,7 @@ void QmmpAudioEngine::run()
{
m_bitrate = m_decoder->bitrate();
m_output_at += len;
- if (m_output)
- flush();
+ flush();
}
else if (len == 0)
{