aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Output/qtmultimedia
diff options
context:
space:
mode:
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;
};