[SCM] qtmultimedia packaging branch, ubuntu+1, updated. debian/5.6.1-2-41-g0c1ecfb
Timo Jyrinki
timo at moszumanska.debian.org
Wed Jul 20 04:38:46 UTC 2016
Gitweb-URL: http://git.debian.org/?p=pkg-kde/qt/qtmultimedia.git;a=commitdiff;h=0c1ecfb
The following commit has been merged in the ubuntu+1 branch:
commit 0c1ecfba6860739d660001d734e2ea33380c9956
Author: Timo Jyrinki <timo.jyrinki at canonical.com>
Date: Wed Jul 20 04:38:36 2016 +0000
Drop the Pulseaudio patch, now included in 5.6.1.
---
debian/changelog | 1 +
...lseAudio-change-the-way-volume-is-applied.patch | 791 ---------------------
debian/patches/series | 1 -
3 files changed, 1 insertion(+), 792 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index 80afa5d..4a2f0ad 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -9,6 +9,7 @@ qtmultimedia-opensource-src (5.6.1-2ubuntu1) UNRELEASED; urgency=medium
* Update symbols.
* debian/patches/PulseAudio-change-the-way-volume-is-applied.patch:
- Use upstream version instead of the backported to 5.5 version.
+ * Drop the Pulseaudio patch, now included in 5.6.1.
-- Timo Jyrinki <timo-jyrinki at ubuntu.com> Thu, 28 Jan 2016 10:28:53 +0000
diff --git a/debian/patches/PulseAudio-change-the-way-volume-is-applied.patch b/debian/patches/PulseAudio-change-the-way-volume-is-applied.patch
deleted file mode 100644
index 486534f..0000000
--- a/debian/patches/PulseAudio-change-the-way-volume-is-applied.patch
+++ /dev/null
@@ -1,791 +0,0 @@
-From b17e0cd5dd28b93b1ea567c676f0e183acb6dd7c Mon Sep 17 00:00:00 2001
-From: Yoann Lopes <yoann.lopes at theqtcompany.com>
-Date: Fri, 5 Feb 2016 14:07:20 +0100
-Subject: [PATCH] PulseAudio: change the way volume is applied.
-
-We used to change the PulseAudio sink input volume. Doing so had
-some potential unwanted side effects depending on the PulseAudio server
-configuration. When flat volumes were enabled, it would affect the
-global system volume. It could also affect the volume of other streams
-having the same audio role.
-Volumes in Qt Multimedia are supposed to be relative to the application
-volume and should not affect anything else than the object on which it
-was changed. To guarantee that, PulseAudio volume APIs are not used
-anymore. Instead, software-based volume attenuation is applied on the
-audio samples before being passed to PulseAudio.
-
-Applies to QSoundEffect, QAudioOutput and QAudioInput.
-
-Task-number: QTBUG-40823
-Task-number: QTBUG-49461
-Change-Id: I690716976bda8fe666969ca2cbdf6d8d0b419733
-Reviewed-by: Christian Stromme <christian.stromme at theqtcompany.com>
----
- src/multimedia/audio/qsoundeffect_pulse_p.cpp | 214 +++++++-------------------
- src/multimedia/audio/qsoundeffect_pulse_p.h | 13 +-
- src/plugins/pulseaudio/qaudioinput_pulse.cpp | 99 +++---------
- src/plugins/pulseaudio/qaudioinput_pulse.h | 8 +-
- src/plugins/pulseaudio/qaudiooutput_pulse.cpp | 84 ++++------
- src/plugins/pulseaudio/qaudiooutput_pulse.h | 2 -
- 6 files changed, 113 insertions(+), 307 deletions(-)
-
-diff --git a/src/multimedia/audio/qsoundeffect_pulse_p.cpp b/src/multimedia/audio/qsoundeffect_pulse_p.cpp
-index ecc42ca..43d4a6c 100644
---- a/src/multimedia/audio/qsoundeffect_pulse_p.cpp
-+++ b/src/multimedia/audio/qsoundeffect_pulse_p.cpp
-@@ -49,10 +49,7 @@
-
- #include "qsoundeffect_pulse_p.h"
-
--#if defined(Q_WS_MAEMO_6) || defined(NEMO_AUDIO)
--#include <pulse/ext-stream-restore.h>
--#endif
--
-+#include <private/qaudiohelpers_p.h>
- #include <private/qmediaresourcepolicy_p.h>
- #include <private/qmediaresourceset_p.h>
-
-@@ -124,26 +121,9 @@ public:
- return m_context;
- }
-
-- inline pa_cvolume * calcVolume(pa_cvolume *dest, int soundEffectVolume)
-- {
-- pa_volume_t v = m_vol * soundEffectVolume / 100;
-- for (int i = 0; i < dest->channels; ++i)
-- dest->values[i] = v;
-- return dest;
-- }
--
-- void updateStatus(const pa_cvolume& volume)
-- {
-- if (m_vol != pa_cvolume_max(&volume)) {
-- m_vol = pa_cvolume_max(&volume);
-- emit volumeChanged();
-- }
-- }
--
- Q_SIGNALS:
- void contextReady();
- void contextFailed();
-- void volumeChanged();
-
- private Q_SLOTS:
- void onContextFailed()
-@@ -158,8 +138,6 @@ private Q_SLOTS:
-
- void prepare()
- {
-- m_vol = PA_VOLUME_NORM;
--
- m_context = 0;
- m_mainLoop = pa_threaded_mainloop_new();
- if (m_mainLoop == 0) {
-@@ -232,11 +210,6 @@ private:
- case PA_CONTEXT_SETTING_NAME:
- break;
- case PA_CONTEXT_READY:
-- #if defined(Q_WS_MAEMO_6) || defined(NEMO_AUDIO)
-- pa_ext_stream_restore_read(c, &stream_restore_info_callback, self);
-- pa_ext_stream_restore_set_subscribe_cb(c, &stream_restore_monitor_callback, self);
-- pa_ext_stream_restore_subscribe(c, 1, 0, self);
-- #endif
- QMetaObject::invokeMethod(self, "contextReady", Qt::QueuedConnection);
- break;
- case PA_CONTEXT_FAILED:
-@@ -247,37 +220,6 @@ private:
- }
- }
-
--#if defined(Q_WS_MAEMO_6) || defined(NEMO_AUDIO)
--
-- static void stream_restore_monitor_callback(pa_context *c, void *userdata)
-- {
-- PulseDaemon *self = reinterpret_cast<PulseDaemon*>(userdata);
-- pa_ext_stream_restore_read(c, &stream_restore_info_callback, self);
-- }
--
-- static void stream_restore_info_callback(pa_context *c,
-- const pa_ext_stream_restore_info *info,
-- int eol, void *userdata)
-- {
-- Q_UNUSED(c)
--
-- PulseDaemon *self = reinterpret_cast<PulseDaemon*>(userdata);
--
-- if (!eol) {
-- if (QString(info->name).startsWith(QLatin1String("sink-input-by-media-role:x-maemo"))) {
--#ifdef QT_PA_DEBUG
-- qDebug() << "x-maemo volume =(" << info->volume.values[0] * 100 / PA_VOLUME_NORM << ","
-- << info->volume.values[1] * 100 / PA_VOLUME_NORM << "), "
-- << "mute = " << info->mute;
--#endif
-- self->updateStatus(info->volume);
-- }
-- }
-- }
--#endif
--
-- pa_volume_t m_vol;
--
- bool m_prepared;
- pa_context *m_context;
- pa_threaded_mainloop *m_mainLoop;
-@@ -385,9 +327,6 @@ QSoundEffectPrivate::QSoundEffectPrivate(QObject* parent):
- m_sample(0),
- m_position(0),
- m_resourcesAvailable(false)
--#if defined(Q_WS_MAEMO_6) || defined(NEMO_AUDIO)
-- , m_customVolume(false)
--#endif
- {
- m_ref = new QSoundEffectRef(this);
- pa_sample_spec_init(&m_pulseSpec);
-@@ -538,60 +477,32 @@ void QSoundEffectPrivate::setLoopCount(int loopCount)
-
- qreal QSoundEffectPrivate::volume() const
- {
-+ QReadLocker locker(&m_volumeLock);
- return m_volume;
- }
-
- void QSoundEffectPrivate::setVolume(qreal volume)
- {
--#if defined(Q_WS_MAEMO_6) || defined(NEMO_AUDIO)
-- m_customVolume = true;
--#endif
-- m_volume = volume;
-- emit volumeChanged();
-- updateVolume();
--}
-+ QWriteLocker locker(&m_volumeLock);
-
--void QSoundEffectPrivate::updateVolume()
--{
-- if (m_sinkInputId < 0)
-+ if (qFuzzyCompare(m_volume, volume))
- return;
--#if defined(Q_WS_MAEMO_6) || defined(NEMO_AUDIO)
-- if (!m_customVolume)
-- return;
--#endif
-- PulseDaemonLocker locker;
-- pa_cvolume volume;
-- volume.channels = m_pulseSpec.channels;
-- if (pulseDaemon()->context())
-- pa_operation_unref(pa_context_set_sink_input_volume(pulseDaemon()->context(), m_sinkInputId, pulseDaemon()->calcVolume(&volume, qRound(m_volume * 100)), setvolume_callback, m_ref->getRef()));
-- Q_ASSERT(pa_cvolume_valid(&volume));
--#ifdef QT_PA_DEBUG
-- qDebug() << this << "updateVolume =" << pa_cvolume_max(&volume);
--#endif
-+
-+ m_volume = qBound(qreal(0), volume, qreal(1));
-+ emit volumeChanged();
- }
-
- bool QSoundEffectPrivate::isMuted() const
- {
-+ QReadLocker locker(&m_volumeLock);
- return m_muted;
- }
-
- void QSoundEffectPrivate::setMuted(bool muted)
- {
-+ QWriteLocker locker(&m_volumeLock);
- m_muted = muted;
- emit mutedChanged();
-- updateMuted();
--}
--
--void QSoundEffectPrivate::updateMuted()
--{
-- if (m_sinkInputId < 0)
-- return;
-- PulseDaemonLocker locker;
-- if (pulseDaemon()->context())
-- pa_operation_unref(pa_context_set_sink_input_mute(pulseDaemon()->context(), m_sinkInputId, m_muted, setmuted_callback, m_ref->getRef()));
--#ifdef QT_PA_DEBUG
-- qDebug() << this << "updateMuted = " << m_muted;
--#endif
- }
-
- bool QSoundEffectPrivate::isLoaded() const
-@@ -801,7 +712,6 @@ void QSoundEffectPrivate::unloadPulseStream()
- pa_stream_set_underflow_callback(m_pulseStream, 0, 0);
- pa_stream_disconnect(m_pulseStream);
- pa_stream_unref(m_pulseStream);
-- disconnect(pulseDaemon(), SIGNAL(volumeChanged()), this, SLOT(updateVolume()));
- disconnect(pulseDaemon(), SIGNAL(contextFailed()), this, SLOT(contextFailed()));
- m_pulseStream = 0;
- m_reloadCategory = false; // category will be reloaded when we connect anyway
-@@ -822,11 +732,8 @@ void QSoundEffectPrivate::prepare()
- << "actual writeBytes =" << writeBytes
- << "m_playQueued =" << m_playQueued;
- #endif
-- m_position = int(writeBytes);
-- if (pa_stream_write(m_pulseStream, reinterpret_cast<void *>(const_cast<char*>(m_sample->data().data())), writeBytes,
-- stream_write_done_callback, 0, PA_SEEK_RELATIVE) != 0) {
-- qWarning("QSoundEffect(pulseaudio): pa_stream_write, error = %s", pa_strerror(pa_context_errno(pulseDaemon()->context())));
-- }
-+ m_position = writeToStream(m_sample->data().data(), writeBytes);
-+
- if (m_playQueued) {
- m_playQueued = false;
- setLoopsRemaining(m_loopCount);
-@@ -854,15 +761,13 @@ void QSoundEffectPrivate::uploadSample()
- }
- }
-
-- int writtenBytes = 0;
- int writableSize = int(pa_stream_writable_size(m_pulseStream));
- int firstPartLength = qMin(m_sample->data().size() - m_position, writableSize);
-- if (pa_stream_write(m_pulseStream, reinterpret_cast<void *>(const_cast<char*>(m_sample->data().data()) + m_position),
-- firstPartLength, stream_write_done_callback, 0, PA_SEEK_RELATIVE) != 0) {
-- qWarning("QSoundEffect(pulseaudio): pa_stream_write, error = %s", pa_strerror(pa_context_errno(pulseDaemon()->context())));
-- }
-- writtenBytes = firstPartLength;
-- m_position += firstPartLength;
-+
-+ int writtenBytes = writeToStream(m_sample->data().data() + m_position,
-+ firstPartLength);
-+
-+ m_position += writtenBytes;
- if (m_position == m_sample->data().size()) {
- m_position = 0;
- if (m_runningCount > 0)
-@@ -871,11 +776,8 @@ void QSoundEffectPrivate::uploadSample()
- {
- while (writtenBytes < writableSize) {
- int writeSize = qMin(writableSize - writtenBytes, m_sample->data().size());
-- if (pa_stream_write(m_pulseStream, reinterpret_cast<void *>(const_cast<char*>(m_sample->data().data())),
-- writeSize, stream_write_done_callback, 0, PA_SEEK_RELATIVE) != 0) {
-- qWarning("QSoundEffect(pulseaudio): pa_stream_write, error = %s", pa_strerror(pa_context_errno(pulseDaemon()->context())));
-- }
-- writtenBytes += writeSize;
-+ writtenBytes += writeToStream(m_sample->data().data(), writeSize);
-+
- if (writeSize < m_sample->data().size()) {
- m_position = writeSize;
- break;
-@@ -893,6 +795,39 @@ void QSoundEffectPrivate::uploadSample()
- #endif
- }
-
-+int QSoundEffectPrivate::writeToStream(const void *data, int size)
-+{
-+ m_volumeLock.lockForRead();
-+ qreal volume = m_muted ? 0 : m_volume;
-+ m_volumeLock.unlock();
-+ pa_free_cb_t writeDoneCb = stream_write_done_callback;
-+
-+ if (volume < 1.0f) {
-+ // Don't use PulseAudio volume, as it might affect all other streams of the same category
-+ // or even affect the system volume if flat volumes are enabled
-+ void *dest = NULL;
-+ size_t nbytes = size;
-+ if (pa_stream_begin_write(m_pulseStream, &dest, &nbytes) < 0) {
-+ qWarning("QSoundEffect(pulseaudio): pa_stream_begin_write, error = %s",
-+ pa_strerror(pa_context_errno(pulseDaemon()->context())));
-+ return 0;
-+ }
-+
-+ size = int(nbytes);
-+ QAudioHelperInternal::qMultiplySamples(volume, m_sample->format(), data, dest, size);
-+ data = dest;
-+ writeDoneCb = NULL;
-+ }
-+
-+ if (pa_stream_write(m_pulseStream, data, size, writeDoneCb, 0, PA_SEEK_RELATIVE) < 0) {
-+ qWarning("QSoundEffect(pulseaudio): pa_stream_write, error = %s",
-+ pa_strerror(pa_context_errno(pulseDaemon()->context())));
-+ return 0;
-+ }
-+
-+ return size;
-+}
-+
- void QSoundEffectPrivate::playSample()
- {
- #ifdef QT_PA_DEBUG
-@@ -939,8 +874,6 @@ void QSoundEffectPrivate::streamReady()
- #endif
- PulseDaemonLocker locker;
- m_sinkInputId = pa_stream_get_index(m_pulseStream);
-- updateMuted();
-- updateVolume();
- #ifdef QT_PA_DEBUG
- const pa_buffer_attr *realBufAttr = pa_stream_get_buffer_attr(m_pulseStream);
- qDebug() << this << "m_sinkInputId =" << m_sinkInputId
-@@ -966,7 +899,6 @@ void QSoundEffectPrivate::createPulseStream()
- pa_stream *stream = pa_stream_new_with_proplist(pulseDaemon()->context(), m_name.constData(), &m_pulseSpec, 0, propList);
- pa_proplist_free(propList);
-
-- connect(pulseDaemon(), SIGNAL(volumeChanged()), this, SLOT(updateVolume()));
- connect(pulseDaemon(), SIGNAL(contextFailed()), this, SLOT(contextFailed()));
-
- if (stream == 0) {
-@@ -994,9 +926,7 @@ void QSoundEffectPrivate::createPulseStream()
- #else
- if (pa_stream_connect_playback(m_pulseStream, 0, 0,
- #endif
-- m_muted ? pa_stream_flags_t(PA_STREAM_START_MUTED | PA_STREAM_START_CORKED)
-- : pa_stream_flags_t(PA_STREAM_START_UNMUTED | PA_STREAM_START_CORKED),
-- 0, 0) < 0) {
-+ PA_STREAM_START_CORKED, 0, 0) < 0) {
- qWarning("QSoundEffect(pulseaudio): Failed to connect stream, error = %s",
- pa_strerror(pa_context_errno(pulseDaemon()->context())));
- }
-@@ -1115,46 +1045,6 @@ void QSoundEffectPrivate::stream_adjust_prebuffer_callback(pa_stream *s, int suc
- QMetaObject::invokeMethod(self, "streamReady", Qt::QueuedConnection);
- }
-
--void QSoundEffectPrivate::setvolume_callback(pa_context *c, int success, void *userdata)
--{
--#ifdef QT_PA_DEBUG
-- qDebug() << "setvolume_callback";
--#endif
-- Q_UNUSED(c);
-- Q_UNUSED(userdata);
-- QSoundEffectRef *ref = reinterpret_cast<QSoundEffectRef*>(userdata);
-- QSoundEffectPrivate *self = ref->soundEffect();
-- ref->release();
-- if (!self)
-- return;
--#ifdef QT_PA_DEBUG
-- qDebug() << self << "setvolume_callback";
--#endif
-- if (!success) {
-- qWarning("QSoundEffect(pulseaudio): faild to set volume");
-- }
--}
--
--void QSoundEffectPrivate::setmuted_callback(pa_context *c, int success, void *userdata)
--{
--#ifdef QT_PA_DEBUG
-- qDebug() << "setmuted_callback";
--#endif
-- Q_UNUSED(c);
-- Q_UNUSED(userdata);
-- QSoundEffectRef *ref = reinterpret_cast<QSoundEffectRef*>(userdata);
-- QSoundEffectPrivate *self = ref->soundEffect();
-- ref->release();
-- if (!self)
-- return;
--#ifdef QT_PA_DEBUG
-- qDebug() << self << "setmuted_callback";
--#endif
-- if (!success) {
-- qWarning("QSoundEffect(pulseaudio): faild to set muted");
-- }
--}
--
- void QSoundEffectPrivate::stream_underrun_callback(pa_stream *s, void *userdata)
- {
- Q_UNUSED(s);
-diff --git a/src/multimedia/audio/qsoundeffect_pulse_p.h b/src/multimedia/audio/qsoundeffect_pulse_p.h
-index 9b3564c..0f16b98 100644
---- a/src/multimedia/audio/qsoundeffect_pulse_p.h
-+++ b/src/multimedia/audio/qsoundeffect_pulse_p.h
-@@ -50,6 +50,7 @@
-
- #include <QtCore/qobject.h>
- #include <QtCore/qdatetime.h>
-+#include <QtCore/qreadwritelock.h>
- #include <qmediaplayer.h>
- #include <pulse/pulseaudio.h>
- #include "qsamplecache_p.h"
-@@ -111,8 +112,6 @@ private Q_SLOTS:
- void prepare();
- void streamReady();
- void emptyComplete(void *stream);
-- void updateVolume();
-- void updateMuted();
-
- void handleAvailabilityChanged(bool available);
-
-@@ -124,6 +123,8 @@ private:
- void createPulseStream();
- void unloadPulseStream();
-
-+ int writeToStream(const void *data, int size);
-+
- void setPlaying(bool playing);
- void setStatus(QSoundEffect::Status status);
- void setLoopsRemaining(int loopsRemaining);
-@@ -136,8 +137,6 @@ private:
- static void stream_write_done_callback(void *p);
- static void stream_adjust_prebuffer_callback(pa_stream *s, int success, void *userdata);
- static void stream_reset_buffer_callback(pa_stream *s, int success, void *userdata);
-- static void setvolume_callback(pa_context *c, int success, void *userdata);
-- static void setmuted_callback(pa_context *c, int success, void *userdata);
-
- pa_stream *m_pulseStream;
- int m_sinkInputId;
-@@ -165,11 +164,9 @@ private:
-
- bool m_resourcesAvailable;
-
-- QMediaPlayerResourceSetInterface *m_resources;
-+ mutable QReadWriteLock m_volumeLock;
-
--#if defined(Q_WS_MAEMO_6) || defined(NEMO_AUDIO)
-- bool m_customVolume;
--#endif
-+ QMediaPlayerResourceSetInterface *m_resources;
- };
-
- QT_END_NAMESPACE
-diff --git a/src/plugins/pulseaudio/qaudioinput_pulse.cpp b/src/plugins/pulseaudio/qaudioinput_pulse.cpp
-index 77b438f..93d4105 100644
---- a/src/plugins/pulseaudio/qaudioinput_pulse.cpp
-+++ b/src/plugins/pulseaudio/qaudioinput_pulse.cpp
-@@ -34,6 +34,7 @@
- #include <QtCore/qcoreapplication.h>
- #include <QtCore/qdebug.h>
- #include <QtCore/qmath.h>
-+#include <private/qaudiohelpers_p.h>
-
- #include "qaudioinput_pulse.h"
- #include "qaudiodeviceinfo_pulse.h"
-@@ -118,39 +119,12 @@ static void inputStreamSuccessCallback(pa_stream *stream, int success, void *use
- pa_threaded_mainloop_signal(pulseEngine->mainloop(), 0);
- }
-
--void QPulseAudioInput::sourceInfoCallback(pa_context *context, const pa_source_info *i, int eol, void *userdata)
--{
-- Q_UNUSED(context);
-- Q_UNUSED(eol);
--
-- Q_ASSERT(userdata);
-- if (i) {
-- QPulseAudioInput *that = reinterpret_cast<QPulseAudioInput*>(userdata);
-- that->m_volume = pa_sw_volume_to_linear(pa_cvolume_avg(&i->volume));
-- }
--}
--
--void QPulseAudioInput::inputVolumeCallback(pa_context *context, int success, void *userdata)
--{
-- Q_UNUSED(success);
--
-- if (!success)
-- qWarning() << "QAudioInput: failed to set input volume";
--
-- QPulseAudioInput *that = reinterpret_cast<QPulseAudioInput*>(userdata);
--
-- // Regardless of success or failure, we update the volume property
-- if (that->m_stream)
-- pa_context_get_source_info_by_index(context, pa_stream_get_device_index(that->m_stream), sourceInfoCallback, userdata);
--}
--
- QPulseAudioInput::QPulseAudioInput(const QByteArray &device)
- : m_totalTimeValue(0)
- , m_audioSource(0)
- , m_errorState(QAudio::NoError)
- , m_deviceState(QAudio::StoppedState)
- , m_volume(qreal(1.0f))
-- , m_customVolumeRequired(false)
- , m_pullMode(true)
- , m_opened(false)
- , m_bytesAvailable(0)
-@@ -356,9 +330,6 @@ bool QPulseAudioInput::open()
- if (actualBufferAttr->tlength != (uint32_t)-1)
- m_bufferSize = actualBufferAttr->tlength;
-
-- if (m_customVolumeRequired)
-- setPulseVolume();
--
- pulseEngine->unlock();
-
- connect(pulseEngine, &QPulseAudioEngine::contextFailed, this, &QPulseAudioInput::onPulseContextFailed);
-@@ -407,32 +378,6 @@ void QPulseAudioInput::close()
- m_opened = false;
- }
-
--/* Call this with the stream opened and the mainloop locked */
--void QPulseAudioInput::setPulseVolume()
--{
-- QPulseAudioEngine *pulseEngine = QPulseAudioEngine::instance();
-- Q_ASSERT(pulseEngine->context() != 0);
--
-- pa_cvolume cvolume;
--
-- if (qFuzzyCompare(m_volume, 0.0)) {
-- pa_cvolume_mute(&cvolume, m_spec.channels);
-- } else {
-- pa_cvolume_set(&cvolume, m_spec.channels, pa_sw_volume_from_linear(m_volume));
-- }
--
-- pa_operation *op = pa_context_set_source_volume_by_index(pulseEngine->context(),
-- pa_stream_get_device_index(m_stream),
-- &cvolume,
-- inputVolumeCallback,
-- this);
--
-- if (op == NULL)
-- qWarning() << "QAudioInput: Failed to set volume";
-- else
-- pa_operation_unref(op);
--}
--
- int QPulseAudioInput::checkBytesReady()
- {
- if (m_deviceState != QAudio::ActiveState && m_deviceState != QAudio::IdleState) {
-@@ -494,7 +439,9 @@ qint64 QPulseAudioInput::read(char *data, qint64 len)
-
- qint64 actualLength = 0;
- if (m_pullMode) {
-- actualLength = m_audioSource->write(static_cast<const char *>(audioBuffer), readLength);
-+ QByteArray adjusted(readLength, Qt::Uninitialized);
-+ applyVolume(audioBuffer, adjusted.data(), readLength);
-+ actualLength = m_audioSource->write(adjusted);
-
- if (actualLength < qint64(readLength)) {
- pulseEngine->unlock();
-@@ -506,7 +453,7 @@ qint64 QPulseAudioInput::read(char *data, qint64 len)
- }
- } else {
- actualLength = qMin(static_cast<int>(len - readBytes), static_cast<int>(readLength));
-- memcpy(data + readBytes, audioBuffer, actualLength);
-+ applyVolume(audioBuffer, data + readBytes, actualLength);
- }
-
- #ifdef DEBUG_PULSE
-@@ -517,7 +464,10 @@ qint64 QPulseAudioInput::read(char *data, qint64 len)
- #ifdef DEBUG_PULSE
- qDebug() << "QPulseAudioInput::read -- appending " << readLength - actualLength << " bytes of data to temp buffer";
- #endif
-- m_tempBuffer.append(static_cast<const char *>(audioBuffer) + actualLength, readLength - actualLength);
-+ int diff = readLength - actualLength;
-+ int oldSize = m_tempBuffer.size();
-+ m_tempBuffer.resize(m_tempBuffer.size() + diff);
-+ applyVolume(static_cast<const char *>(audioBuffer) + actualLength, m_tempBuffer.data() + oldSize, diff);
- QMetaObject::invokeMethod(this, "userFeed", Qt::QueuedConnection);
- }
-
-@@ -544,6 +494,14 @@ qint64 QPulseAudioInput::read(char *data, qint64 len)
- return readBytes;
- }
-
-+void QPulseAudioInput::applyVolume(const void *src, void *dest, int len)
-+{
-+ if (m_volume < 1.f)
-+ QAudioHelperInternal::qMultiplySamples(m_volume, m_format, src, dest, len);
-+ else
-+ memcpy(dest, src, len);
-+}
-+
- void QPulseAudioInput::resume()
- {
- if (m_deviceState == QAudio::SuspendedState || m_deviceState == QAudio::IdleState) {
-@@ -567,30 +525,17 @@ void QPulseAudioInput::resume()
-
- void QPulseAudioInput::setVolume(qreal vol)
- {
-- if (vol >= 0.0 && vol <= 1.0) {
-- QPulseAudioEngine *pulseEngine = QPulseAudioEngine::instance();
-- pulseEngine->lock();
-- m_customVolumeRequired = true;
-- if (!qFuzzyCompare(m_volume, vol)) {
-- m_volume = vol;
-- if (m_opened) {
-- setPulseVolume();
-- }
-- }
-- pulseEngine->unlock();
-- }
-+ if (qFuzzyCompare(m_volume, vol))
-+ return;
-+
-+ m_volume = qBound(qreal(0), vol, qreal(1));
- }
-
- qreal QPulseAudioInput::volume() const
- {
-- QPulseAudioEngine *pulseEngine = QPulseAudioEngine::instance();
-- pulseEngine->lock();
-- qreal vol = m_volume;
-- pulseEngine->unlock();
-- return vol;
-+ return m_volume;
- }
-
--
- void QPulseAudioInput::setBufferSize(int value)
- {
- m_bufferSize = value;
-diff --git a/src/plugins/pulseaudio/qaudioinput_pulse.h b/src/plugins/pulseaudio/qaudioinput_pulse.h
-index 7b898c4..c130f8c 100644
---- a/src/plugins/pulseaudio/qaudioinput_pulse.h
-+++ b/src/plugins/pulseaudio/qaudioinput_pulse.h
-@@ -100,8 +100,6 @@ public:
- QAudio::Error m_errorState;
- QAudio::State m_deviceState;
- qreal m_volume;
-- bool m_customVolumeRequired;
-- pa_cvolume m_chVolume;
-
- private slots:
- void userFeed();
-@@ -112,13 +110,11 @@ private:
- void setState(QAudio::State state);
- void setError(QAudio::Error error);
-
-+ void applyVolume(const void *src, void *dest, int len);
-+
- int checkBytesReady();
- bool open();
- void close();
-- void setPulseVolume();
--
-- static void sourceInfoCallback(pa_context *c, const pa_source_info *i, int eol, void *userdata);
-- static void inputVolumeCallback(pa_context *context, int success, void *userdata);
-
- bool m_pullMode;
- bool m_opened;
-diff --git a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp
-index c1d46fa..a850c9b 100644
---- a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp
-+++ b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp
-@@ -34,6 +34,7 @@
- #include <QtCore/qcoreapplication.h>
- #include <QtCore/qdebug.h>
- #include <QtCore/qmath.h>
-+#include <private/qaudiohelpers_p.h>
-
- #include "qaudiooutput_pulse.h"
- #include "qaudiodeviceinfo_pulse.h"
-@@ -162,7 +163,6 @@ QPulseAudioOutput::QPulseAudioOutput(const QByteArray &device)
- , m_audioBuffer(0)
- , m_resuming(false)
- , m_volume(1.0)
-- , m_customVolumeRequired(false)
- {
- connect(m_tickTimer, SIGNAL(timeout()), SLOT(userFeed()));
- }
-@@ -312,27 +312,6 @@ bool QPulseAudioOutput::open()
- pa_stream_set_overflow_callback(m_stream, outputStreamOverflowCallback, this);
- pa_stream_set_latency_update_callback(m_stream, outputStreamLatencyCallback, this);
-
-- pa_volume_t paVolume;
--
-- /* streams without a custom volume set are expected to already have a
-- * sensible volume set by Pulse, so we don't set it explicitly.
-- *
-- * explicit setting also breaks volume handling on sailfish, where each
-- * stream's volume is set separately inside pulseaudio, with the
-- * exception of streams that already have a volume set (i.e. if we set
-- * it here, we'd ignore system volume).
-- */
-- if (m_customVolumeRequired) {
-- if (qFuzzyCompare(m_volume, 0.0)) {
-- paVolume = PA_VOLUME_MUTED;
-- m_volume = 0.0;
-- } else {
-- paVolume = qFloor(m_volume * PA_VOLUME_NORM + 0.5);
-- }
--
-- pa_cvolume_set(&m_chVolume, m_spec.channels, paVolume);
-- }
--
- if (m_bufferSize <= 0 && m_category == LOW_LATENCY_CATEGORY_NAME) {
- m_bufferSize = bytesPerSecond * LowLatencyBufferSizeMs / qint64(1000);
- }
-@@ -344,7 +323,7 @@ bool QPulseAudioOutput::open()
- requestedBuffer.prebuf = (uint32_t)-1;
- requestedBuffer.tlength = m_bufferSize;
-
-- if (pa_stream_connect_playback(m_stream, m_device.data(), (m_bufferSize > 0) ? &requestedBuffer : NULL, (pa_stream_flags_t)0, m_customVolumeRequired ? &m_chVolume : NULL, NULL) < 0) {
-+ if (pa_stream_connect_playback(m_stream, m_device.data(), (m_bufferSize > 0) ? &requestedBuffer : NULL, (pa_stream_flags_t)0, NULL, NULL) < 0) {
- qWarning() << "pa_stream_connect_playback() failed!";
- pa_stream_unref(m_stream);
- m_stream = 0;
-@@ -491,8 +470,33 @@ qint64 QPulseAudioOutput::write(const char *data, qint64 len)
- QPulseAudioEngine *pulseEngine = QPulseAudioEngine::instance();
-
- pulseEngine->lock();
-+
- len = qMin(len, static_cast<qint64>(pa_stream_writable_size(m_stream)));
-- pa_stream_write(m_stream, data, len, 0, 0, PA_SEEK_RELATIVE);
-+
-+ if (m_volume < 1.0f) {
-+ // Don't use PulseAudio volume, as it might affect all other streams of the same category
-+ // or even affect the system volume if flat volumes are enabled
-+ void *dest = NULL;
-+ size_t nbytes = len;
-+ if (pa_stream_begin_write(m_stream, &dest, &nbytes) < 0) {
-+ qWarning("QAudioOutput(pulseaudio): pa_stream_begin_write, error = %s",
-+ pa_strerror(pa_context_errno(pulseEngine->context())));
-+ setError(QAudio::IOError);
-+ return 0;
-+ }
-+
-+ len = int(nbytes);
-+ QAudioHelperInternal::qMultiplySamples(m_volume, m_format, data, dest, len);
-+ data = reinterpret_cast<char *>(dest);
-+ }
-+
-+ if (pa_stream_write(m_stream, data, len, NULL, 0, PA_SEEK_RELATIVE) < 0) {
-+ qWarning("QAudioOutput(pulseaudio): pa_stream_write, error = %s",
-+ pa_strerror(pa_context_errno(pulseEngine->context())));
-+ setError(QAudio::IOError);
-+ return 0;
-+ }
-+
- pulseEngine->unlock();
- m_totalTimeValue += len;
-
-@@ -664,34 +668,10 @@ qint64 PulseOutputPrivate::writeData(const char *data, qint64 len)
-
- void QPulseAudioOutput::setVolume(qreal vol)
- {
-- if (vol >= 0.0 && vol <= 1.0) {
-- if (!qFuzzyCompare(m_volume, vol)) {
-- m_customVolumeRequired = true;
-- m_volume = vol;
-- if (m_opened) {
-- QPulseAudioEngine *pulseEngine = QPulseAudioEngine::instance();
-- pulseEngine->lock();
-- pa_volume_t paVolume;
-- if (qFuzzyCompare(vol, 0.0)) {
-- pa_cvolume_mute(&m_chVolume, m_spec.channels);
-- m_volume = 0.0;
-- } else {
-- paVolume = qFloor(m_volume * PA_VOLUME_NORM + 0.5);
-- pa_cvolume_set(&m_chVolume, m_spec.channels, paVolume);
-- }
-- pa_operation *op = pa_context_set_sink_input_volume(pulseEngine->context(),
-- pa_stream_get_index(m_stream),
-- &m_chVolume,
-- NULL,
-- NULL);
-- if (op == NULL)
-- qWarning()<<"QAudioOutput: Failed to set volume";
-- else
-- pa_operation_unref(op);
-- pulseEngine->unlock();
-- }
-- }
-- }
-+ if (qFuzzyCompare(m_volume, vol))
-+ return;
-+
-+ m_volume = qBound(qreal(0), vol, qreal(1));
- }
-
- qreal QPulseAudioOutput::volume() const
-diff --git a/src/plugins/pulseaudio/qaudiooutput_pulse.h b/src/plugins/pulseaudio/qaudiooutput_pulse.h
-index e24fd51..a165da8 100644
---- a/src/plugins/pulseaudio/qaudiooutput_pulse.h
-+++ b/src/plugins/pulseaudio/qaudiooutput_pulse.h
-@@ -135,8 +135,6 @@ private:
- QString m_category;
-
- qreal m_volume;
-- bool m_customVolumeRequired;
-- pa_cvolume m_chVolume;
- pa_sample_spec m_spec;
- };
-
---
-2.7.4
-
diff --git a/debian/patches/series b/debian/patches/series
index 3d7fd65..8aa347c 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -5,4 +5,3 @@ skip_failing_tests.patch
Added-addItems-to-QML-Playlist-for-batch-adding-of-t.patch
Added-insertItems-and-removeItems-to-QML-Playlist.patch
Add-moveItem-from-to-to-QMediaPlaylist.patch
-PulseAudio-change-the-way-volume-is-applied.patch
--
qtmultimedia packaging
More information about the pkg-kde-commits
mailing list