aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Output/qtmultimedia
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2015-11-12 05:26:22 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2015-11-12 05:26:22 +0000
commit019fdddd238d14bde9178a765cdcacecf242d46c (patch)
treebed783477bcac691639b604643fb8e7310121335 /src/plugins/Output/qtmultimedia
parent1aa170d827b8c2a693ce8874acbf77d5df838df0 (diff)
downloadqmmp-019fdddd238d14bde9178a765cdcacecf242d46c.tar.gz
qmmp-019fdddd238d14bde9178a765cdcacecf242d46c.tar.bz2
qmmp-019fdddd238d14bde9178a765cdcacecf242d46c.zip
reduced CPU loading in Qt Multimedia output module (patch by Ivan Ponomarev)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@5759 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Output/qtmultimedia')
-rw-r--r--src/plugins/Output/qtmultimedia/outputqtmultimedia.cpp19
-rw-r--r--src/plugins/Output/qtmultimedia/outputqtmultimedia.h1
2 files changed, 18 insertions, 2 deletions
diff --git a/src/plugins/Output/qtmultimedia/outputqtmultimedia.cpp b/src/plugins/Output/qtmultimedia/outputqtmultimedia.cpp
index 142292bdd..1f39ecc60 100644
--- a/src/plugins/Output/qtmultimedia/outputqtmultimedia.cpp
+++ b/src/plugins/Output/qtmultimedia/outputqtmultimedia.cpp
@@ -23,12 +23,12 @@
#include <QAudioOutput>
#include <QAudioFormat>
#include <QAudioDeviceInfo>
-#include <QBuffer>
#include <QSettings>
#include <QDebug>
+#include <unistd.h>
-OutputQtMultimedia::OutputQtMultimedia() : Output(), m_buffer(NULL)
+OutputQtMultimedia::OutputQtMultimedia() : Output(), m_buffer(NULL), m_bytes_per_second(0)
{
}
@@ -44,19 +44,27 @@ bool OutputQtMultimedia::initialize(quint32 freq, ChannelMap map, Qmmp::AudioFor
qformat.setByteOrder(QAudioFormat::LittleEndian);
qformat.setChannels(map.size());
qformat.setSampleType(QAudioFormat::SignedInt);
+
+ //Size of sample representation in input data. For 24-bit is 4, high byte is ignored.
+ qint64 bytes_per_sample = 0;
+
switch (format)
{
case Qmmp::PCM_S8:
qformat.setSampleSize(8);
+ bytes_per_sample = 1;
break;
case Qmmp::PCM_S16LE:
qformat.setSampleSize(16);
+ bytes_per_sample = 2;
break;
case Qmmp::PCM_S24LE:
qformat.setSampleSize(24);
+ bytes_per_sample = 4;
break;
case Qmmp::PCM_S32LE:
qformat.setSampleSize(32);
+ bytes_per_sample = 4;
break;
default:
break;
@@ -65,6 +73,8 @@ bool OutputQtMultimedia::initialize(quint32 freq, ChannelMap map, Qmmp::AudioFor
if (!qformat.isValid())
return false;
+ m_bytes_per_second = bytes_per_sample * freq * qformat.channels();
+
const QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
const QString saved_device_name = settings.value("QTMULTIMEDIA/device").toString();
@@ -111,6 +121,11 @@ qint64 OutputQtMultimedia::latency()
qint64 OutputQtMultimedia::writeAudio(unsigned char *data, qint64 maxSize)
{
+ if (!m_output->bytesFree()) {
+ //If the buffer is full, waiting for some bytes to be played:
+ //trying to play maxSize bytes, but not more than half of buffer.
+ usleep(qMin(maxSize, static_cast<qint64>(m_output->bufferSize() / 2)) * 1000000 / m_bytes_per_second);
+ }
return m_buffer->write((const char*)data, maxSize);
}
diff --git a/src/plugins/Output/qtmultimedia/outputqtmultimedia.h b/src/plugins/Output/qtmultimedia/outputqtmultimedia.h
index ab60ce290..ea69b9b3f 100644
--- a/src/plugins/Output/qtmultimedia/outputqtmultimedia.h
+++ b/src/plugins/Output/qtmultimedia/outputqtmultimedia.h
@@ -47,6 +47,7 @@ public:
private:
QScopedPointer<QAudioOutput> m_output;
QIODevice *m_buffer;
+ qint64 m_bytes_per_second;
};