diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-11-12 05:26:22 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-11-12 05:26:22 +0000 |
| commit | 019fdddd238d14bde9178a765cdcacecf242d46c (patch) | |
| tree | bed783477bcac691639b604643fb8e7310121335 /src/plugins/Output/qtmultimedia/outputqtmultimedia.cpp | |
| parent | 1aa170d827b8c2a693ce8874acbf77d5df838df0 (diff) | |
| download | qmmp-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/outputqtmultimedia.cpp')
| -rw-r--r-- | src/plugins/Output/qtmultimedia/outputqtmultimedia.cpp | 19 |
1 files changed, 17 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); } |
