From 019fdddd238d14bde9178a765cdcacecf242d46c Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Thu, 12 Nov 2015 05:26:22 +0000 Subject: 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 --- .../Output/qtmultimedia/outputqtmultimedia.cpp | 19 +++++++++++++++++-- src/plugins/Output/qtmultimedia/outputqtmultimedia.h | 1 + 2 files changed, 18 insertions(+), 2 deletions(-) (limited to 'src/plugins/Output') 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 #include #include -#include #include #include +#include -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(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 m_output; QIODevice *m_buffer; + qint64 m_bytes_per_second; }; -- cgit v1.2.3-13-gbd6f