diff options
| -rw-r--r-- | src/plugins/Output/qtmultimedia/outputqtmultimedia.cpp | 19 | ||||
| -rw-r--r-- | src/plugins/Output/qtmultimedia/outputqtmultimedia.h | 1 |
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; }; |
