From 7c55a711cf5153d5b0a7e2318314cbe0c1e42361 Mon Sep 17 00:00:00 2001 From: Piotr Srebrny Date: Fri, 4 Nov 2022 12:20:19 +0100 Subject: Add parent-child relationship on audio sources and sinks QAudioSink and QAudioSource must propagate their parents to the platform specific implementation to enable correct operation of the moveToThread function. Furthermore, all QObject elements that are owned by audio sink/source must also establish the parent-child relationship. This mainly affects QTimer's used by the audio sink/sources. Pick-to: 6.4 Fixes: QTBUG-108187 Change-Id: I476a97300a6fb1e0022b2a5570a3803be8fd0a88 Reviewed-by: Lars Knoll --- src/multimedia/alsa/qalsaaudiosink.cpp | 3 ++- src/multimedia/alsa/qalsaaudiosink_p.h | 2 +- src/multimedia/alsa/qalsaaudiosource.cpp | 3 ++- src/multimedia/alsa/qalsaaudiosource_p.h | 2 +- src/multimedia/alsa/qalsamediadevices.cpp | 10 +++++---- src/multimedia/alsa/qalsamediadevices_p.h | 6 ++++-- src/multimedia/android/qandroidaudiosink.cpp | 5 +++-- src/multimedia/android/qandroidaudiosink_p.h | 2 +- src/multimedia/android/qandroidaudiosource.cpp | 7 ++++--- src/multimedia/android/qandroidaudiosource_p.h | 2 +- src/multimedia/android/qandroidmediadevices.cpp | 10 +++++---- src/multimedia/android/qandroidmediadevices_p.h | 6 ++++-- src/multimedia/audio/qaudiosink.cpp | 2 +- src/multimedia/audio/qaudiosource.cpp | 2 +- src/multimedia/audio/qaudiosystem_p.h | 2 ++ src/multimedia/darwin/qdarwinaudiosink.mm | 4 ++-- src/multimedia/darwin/qdarwinaudiosink_p.h | 2 +- src/multimedia/darwin/qdarwinaudiosource.mm | 5 +++-- src/multimedia/darwin/qdarwinaudiosource_p.h | 2 +- src/multimedia/darwin/qdarwinmediadevices.mm | 10 +++++---- src/multimedia/darwin/qdarwinmediadevices_p.h | 6 ++++-- src/multimedia/platform/qplatformmediadevices.cpp | 12 +++++++---- src/multimedia/platform/qplatformmediadevices_p.h | 15 +++++++++----- .../pulseaudio/qpulseaudiomediadevices.cpp | 10 +++++---- .../pulseaudio/qpulseaudiomediadevices_p.h | 6 ++++-- src/multimedia/pulseaudio/qpulseaudiosink.cpp | 5 +++-- src/multimedia/pulseaudio/qpulseaudiosink_p.h | 2 +- src/multimedia/pulseaudio/qpulseaudiosource.cpp | 5 +++-- src/multimedia/pulseaudio/qpulseaudiosource_p.h | 2 +- src/multimedia/qnx/qqnxaudiosink.cpp | 20 ++++++++++-------- src/multimedia/qnx/qqnxaudiosink_p.h | 4 ++-- src/multimedia/qnx/qqnxaudiosource.cpp | 5 +++-- src/multimedia/qnx/qqnxaudiosource_p.h | 2 +- src/multimedia/qnx/qqnxmediadevices.cpp | 10 +++++---- src/multimedia/qnx/qqnxmediadevices_p.h | 6 ++++-- src/multimedia/wasm/qwasmaudiosink.cpp | 18 ++++++++-------- src/multimedia/wasm/qwasmaudiosink_p.h | 4 ++-- src/multimedia/wasm/qwasmaudiosource.cpp | 14 +++++++------ src/multimedia/wasm/qwasmaudiosource_p.h | 4 ++-- src/multimedia/wasm/qwasmmediadevices.cpp | 10 +++++---- src/multimedia/wasm/qwasmmediadevices_p.h | 6 ++++-- src/multimedia/windows/qwindowsaudiosink.cpp | 24 ++++++++++++---------- src/multimedia/windows/qwindowsaudiosink_p.h | 4 ++-- src/multimedia/windows/qwindowsaudiosource.cpp | 3 ++- src/multimedia/windows/qwindowsaudiosource_p.h | 2 +- src/multimedia/windows/qwindowsmediadevices.cpp | 10 +++++---- src/multimedia/windows/qwindowsmediadevices_p.h | 6 ++++-- .../gstreamer/audio/qgstreameraudiosink.cpp | 9 ++++---- .../gstreamer/audio/qgstreameraudiosink_p.h | 5 ++--- .../gstreamer/audio/qgstreameraudiosource.cpp | 5 +++-- .../gstreamer/audio/qgstreameraudiosource_p.h | 2 +- tests/auto/unit/mockbackend/qmockmediadevices.cpp | 8 ++++++-- tests/auto/unit/mockbackend/qmockmediadevices_p.h | 6 ++++-- 53 files changed, 200 insertions(+), 137 deletions(-) diff --git a/src/multimedia/alsa/qalsaaudiosink.cpp b/src/multimedia/alsa/qalsaaudiosink.cpp index f64b03c64..138ada624 100644 --- a/src/multimedia/alsa/qalsaaudiosink.cpp +++ b/src/multimedia/alsa/qalsaaudiosink.cpp @@ -24,7 +24,8 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(lcAlsaOutput, "qt.multimedia.alsa.output") //#define DEBUG_AUDIO 1 -QAlsaAudioSink::QAlsaAudioSink(const QByteArray &device) +QAlsaAudioSink::QAlsaAudioSink(const QByteArray &device, QObject *parent) + : QPlatformAudioSink(parent) { bytesAvailable = 0; handle = 0; diff --git a/src/multimedia/alsa/qalsaaudiosink_p.h b/src/multimedia/alsa/qalsaaudiosink_p.h index 447210d88..9df697522 100644 --- a/src/multimedia/alsa/qalsaaudiosink_p.h +++ b/src/multimedia/alsa/qalsaaudiosink_p.h @@ -36,7 +36,7 @@ class QAlsaAudioSink : public QPlatformAudioSink friend class AlsaOutputPrivate; Q_OBJECT public: - QAlsaAudioSink(const QByteArray &device); + QAlsaAudioSink(const QByteArray &device, QObject *parent); ~QAlsaAudioSink(); qint64 write( const char *data, qint64 len ); diff --git a/src/multimedia/alsa/qalsaaudiosource.cpp b/src/multimedia/alsa/qalsaaudiosource.cpp index 6427ae80d..8e82ab7d2 100644 --- a/src/multimedia/alsa/qalsaaudiosource.cpp +++ b/src/multimedia/alsa/qalsaaudiosource.cpp @@ -22,7 +22,8 @@ QT_BEGIN_NAMESPACE //#define DEBUG_AUDIO 1 -QAlsaAudioSource::QAlsaAudioSource(const QByteArray &device) +QAlsaAudioSource::QAlsaAudioSource(const QByteArray &device, QObject *parent) + : QPlatformAudioSource(parent) { bytesAvailable = 0; handle = 0; diff --git a/src/multimedia/alsa/qalsaaudiosource_p.h b/src/multimedia/alsa/qalsaaudiosource_p.h index 4ab0e9ef6..87487a6ad 100644 --- a/src/multimedia/alsa/qalsaaudiosource_p.h +++ b/src/multimedia/alsa/qalsaaudiosource_p.h @@ -62,7 +62,7 @@ class QAlsaAudioSource : public QPlatformAudioSource { Q_OBJECT public: - QAlsaAudioSource(const QByteArray &device); + QAlsaAudioSource(const QByteArray &device, QObject *parent); ~QAlsaAudioSource(); qint64 read(char* data, qint64 len); diff --git a/src/multimedia/alsa/qalsamediadevices.cpp b/src/multimedia/alsa/qalsamediadevices.cpp index 7df97dcb2..9f3b3d963 100644 --- a/src/multimedia/alsa/qalsamediadevices.cpp +++ b/src/multimedia/alsa/qalsamediadevices.cpp @@ -79,14 +79,16 @@ QList QAlsaMediaDevices::videoInputs() const return {}; } -QPlatformAudioSource *QAlsaMediaDevices::createAudioSource(const QAudioDevice &deviceInfo) +QPlatformAudioSource *QAlsaMediaDevices::createAudioSource(const QAudioDevice &deviceInfo, + QObject *parent) { - return new QAlsaAudioSource(deviceInfo.id()); + return new QAlsaAudioSource(deviceInfo.id(), parent); } -QPlatformAudioSink *QAlsaMediaDevices::createAudioSink(const QAudioDevice &deviceInfo) +QPlatformAudioSink *QAlsaMediaDevices::createAudioSink(const QAudioDevice &deviceInfo, + QObject *parent) { - return new QAlsaAudioSink(deviceInfo.id()); + return new QAlsaAudioSink(deviceInfo.id(), parent); } QT_END_NAMESPACE diff --git a/src/multimedia/alsa/qalsamediadevices_p.h b/src/multimedia/alsa/qalsamediadevices_p.h index 149d964e2..612ea2119 100644 --- a/src/multimedia/alsa/qalsamediadevices_p.h +++ b/src/multimedia/alsa/qalsamediadevices_p.h @@ -31,8 +31,10 @@ public: QList audioInputs() const override; QList audioOutputs() const override; QList videoInputs() const override; - QPlatformAudioSource *createAudioSource(const QAudioDevice &deviceInfo) override; - QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo) override; + QPlatformAudioSource *createAudioSource(const QAudioDevice &deviceInfo, + QObject *parent) override; + QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo, + QObject *parent) override; }; QT_END_NAMESPACE diff --git a/src/multimedia/android/qandroidaudiosink.cpp b/src/multimedia/android/qandroidaudiosink.cpp index 7a51977f5..39f3132b1 100644 --- a/src/multimedia/android/qandroidaudiosink.cpp +++ b/src/multimedia/android/qandroidaudiosink.cpp @@ -28,8 +28,9 @@ static inline void openSlDebugInfo() << "\nDefault buffer size: " << QOpenSLESEngine::getDefaultBufferSize(format); } -QAndroidAudioSink::QAndroidAudioSink(const QByteArray &device) - : m_deviceName(device), +QAndroidAudioSink::QAndroidAudioSink(const QByteArray &device, QObject *parent) + : QPlatformAudioSink(parent), + m_deviceName(device), m_state(QAudio::StoppedState), m_error(QAudio::NoError), m_outputMixObject(nullptr), diff --git a/src/multimedia/android/qandroidaudiosink_p.h b/src/multimedia/android/qandroidaudiosink_p.h index 8293d08ab..ca86d9a24 100644 --- a/src/multimedia/android/qandroidaudiosink_p.h +++ b/src/multimedia/android/qandroidaudiosink_p.h @@ -29,7 +29,7 @@ class QAndroidAudioSink : public QPlatformAudioSink Q_OBJECT public: - QAndroidAudioSink(const QByteArray &device); + QAndroidAudioSink(const QByteArray &device, QObject *parent); ~QAndroidAudioSink(); void start(QIODevice *device) override; diff --git a/src/multimedia/android/qandroidaudiosource.cpp b/src/multimedia/android/qandroidaudiosource.cpp index 2f0291bdc..5e1ba549d 100644 --- a/src/multimedia/android/qandroidaudiosource.cpp +++ b/src/multimedia/android/qandroidaudiosource.cpp @@ -48,8 +48,9 @@ static void bufferQueueCallback(SLBufferQueueItf, void *context) QMetaObject::invokeMethod(reinterpret_cast(context), "processBuffer"); } -QAndroidAudioSource::QAndroidAudioSource(const QByteArray &device) - : m_device(device) +QAndroidAudioSource::QAndroidAudioSource(const QByteArray &device, QObject *parent) + : QPlatformAudioSource(parent) + , m_device(device) , m_engine(QOpenSLESEngine::instance()) , m_recorderObject(0) , m_recorder(0) @@ -144,7 +145,7 @@ QIODevice *QAndroidAudioSource::start() m_pullMode = false; m_pushBuffer.clear(); - m_bufferIODevice = new QBuffer(&m_pushBuffer); + m_bufferIODevice = new QBuffer(&m_pushBuffer, this); m_bufferIODevice->open(QIODevice::ReadOnly); if (startRecording()) { diff --git a/src/multimedia/android/qandroidaudiosource_p.h b/src/multimedia/android/qandroidaudiosource_p.h index 6eea0d078..13578509c 100644 --- a/src/multimedia/android/qandroidaudiosource_p.h +++ b/src/multimedia/android/qandroidaudiosource_p.h @@ -40,7 +40,7 @@ class QAndroidAudioSource : public QPlatformAudioSource Q_OBJECT public: - QAndroidAudioSource(const QByteArray &device); + QAndroidAudioSource(const QByteArray &device, QObject *parent); ~QAndroidAudioSource(); void start(QIODevice *device); diff --git a/src/multimedia/android/qandroidmediadevices.cpp b/src/multimedia/android/qandroidmediadevices.cpp index 6b4c625dc..9e45479a5 100644 --- a/src/multimedia/android/qandroidmediadevices.cpp +++ b/src/multimedia/android/qandroidmediadevices.cpp @@ -29,14 +29,16 @@ QList QAndroidMediaDevices::audioOutputs() const return QOpenSLESEngine::availableDevices(QAudioDevice::Output); } -QPlatformAudioSource *QAndroidMediaDevices::createAudioSource(const QAudioDevice &deviceInfo) +QPlatformAudioSource *QAndroidMediaDevices::createAudioSource(const QAudioDevice &deviceInfo, + QObject *parent) { - return new QAndroidAudioSource(deviceInfo.id()); + return new QAndroidAudioSource(deviceInfo.id(), parent); } -QPlatformAudioSink *QAndroidMediaDevices::createAudioSink(const QAudioDevice &deviceInfo) +QPlatformAudioSink *QAndroidMediaDevices::createAudioSink(const QAudioDevice &deviceInfo, + QObject *parent) { - return new QAndroidAudioSink(deviceInfo.id()); + return new QAndroidAudioSink(deviceInfo.id(), parent); } void QAndroidMediaDevices::forwardAudioOutputsChanged() diff --git a/src/multimedia/android/qandroidmediadevices_p.h b/src/multimedia/android/qandroidmediadevices_p.h index 15e740fbe..97106d6dd 100644 --- a/src/multimedia/android/qandroidmediadevices_p.h +++ b/src/multimedia/android/qandroidmediadevices_p.h @@ -27,8 +27,10 @@ public: QList audioInputs() const override; QList audioOutputs() const override; - QPlatformAudioSource *createAudioSource(const QAudioDevice &deviceInfo) override; - QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo) override; + QPlatformAudioSource *createAudioSource(const QAudioDevice &deviceInfo, + QObject *parent) override; + QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo, + QObject *parent) override; void forwardAudioOutputsChanged(); void forwardAudioInputsChanged(); diff --git a/src/multimedia/audio/qaudiosink.cpp b/src/multimedia/audio/qaudiosink.cpp index 20e1a83fc..5f38bbc98 100644 --- a/src/multimedia/audio/qaudiosink.cpp +++ b/src/multimedia/audio/qaudiosink.cpp @@ -86,7 +86,7 @@ QAudioSink::QAudioSink(const QAudioFormat &format, QObject *parent) QAudioSink::QAudioSink(const QAudioDevice &audioDevice, const QAudioFormat &format, QObject *parent): QObject(parent) { - d = QPlatformMediaDevices::instance()->audioOutputDevice(format, audioDevice); + d = QPlatformMediaDevices::instance()->audioOutputDevice(format, audioDevice, parent); if (d) connect(d, SIGNAL(stateChanged(QAudio::State)), SIGNAL(stateChanged(QAudio::State))); else diff --git a/src/multimedia/audio/qaudiosource.cpp b/src/multimedia/audio/qaudiosource.cpp index 3ed48449e..3290c12c0 100644 --- a/src/multimedia/audio/qaudiosource.cpp +++ b/src/multimedia/audio/qaudiosource.cpp @@ -96,7 +96,7 @@ QAudioSource::QAudioSource(const QAudioFormat &format, QObject *parent) QAudioSource::QAudioSource(const QAudioDevice &audioDevice, const QAudioFormat &format, QObject *parent): QObject(parent) { - d = QPlatformMediaDevices::instance()->audioInputDevice(format, audioDevice); + d = QPlatformMediaDevices::instance()->audioInputDevice(format, audioDevice, parent); if (d) connect(d, SIGNAL(stateChanged(QAudio::State)), SIGNAL(stateChanged(QAudio::State))); else diff --git a/src/multimedia/audio/qaudiosystem_p.h b/src/multimedia/audio/qaudiosystem_p.h index 1e864716d..cfb21fd22 100644 --- a/src/multimedia/audio/qaudiosystem_p.h +++ b/src/multimedia/audio/qaudiosystem_p.h @@ -33,6 +33,7 @@ class Q_MULTIMEDIA_EXPORT QPlatformAudioSink : public QObject Q_OBJECT public: + QPlatformAudioSink(QObject *parent) : QObject(parent) {} virtual void start(QIODevice *device) = 0; virtual QIODevice* start() = 0; virtual void stop() = 0; @@ -62,6 +63,7 @@ class Q_MULTIMEDIA_EXPORT QPlatformAudioSource : public QObject Q_OBJECT public: + QPlatformAudioSource(QObject *parent) : QObject(parent) {} virtual void start(QIODevice *device) = 0; virtual QIODevice* start() = 0; virtual void stop() = 0; diff --git a/src/multimedia/darwin/qdarwinaudiosink.mm b/src/multimedia/darwin/qdarwinaudiosink.mm index 57036f617..340472671 100644 --- a/src/multimedia/darwin/qdarwinaudiosink.mm +++ b/src/multimedia/darwin/qdarwinaudiosink.mm @@ -183,8 +183,8 @@ qint64 QDarwinAudioSinkDevice::writeData(const char *data, qint64 len) return m_audioBuffer->writeBytes(data, len); } -QDarwinAudioSink::QDarwinAudioSink(const QAudioDevice &device) - : m_audioDeviceInfo(device) +QDarwinAudioSink::QDarwinAudioSink(const QAudioDevice &device, QObject *parent) + : QPlatformAudioSink(parent), m_audioDeviceInfo(device) { QAudioDevice di = device; if (di.isNull()) diff --git a/src/multimedia/darwin/qdarwinaudiosink_p.h b/src/multimedia/darwin/qdarwinaudiosink_p.h index 4e9b35c78..4d528de79 100644 --- a/src/multimedia/darwin/qdarwinaudiosink_p.h +++ b/src/multimedia/darwin/qdarwinaudiosink_p.h @@ -89,7 +89,7 @@ class QDarwinAudioSink : public QPlatformAudioSink Q_OBJECT public: - QDarwinAudioSink(const QAudioDevice &device); + QDarwinAudioSink(const QAudioDevice &device, QObject *parent); ~QDarwinAudioSink(); void start(QIODevice *device); diff --git a/src/multimedia/darwin/qdarwinaudiosource.mm b/src/multimedia/darwin/qdarwinaudiosource.mm index 989bdc9c6..6ff52faa9 100644 --- a/src/multimedia/darwin/qdarwinaudiosource.mm +++ b/src/multimedia/darwin/qdarwinaudiosource.mm @@ -412,8 +412,9 @@ qint64 QDarwinAudioSourceDevice::writeData(const char *data, qint64 len) return 0; } -QDarwinAudioSource::QDarwinAudioSource(const QAudioDevice &device) - : m_audioDeviceInfo(device) +QDarwinAudioSource::QDarwinAudioSource(const QAudioDevice &device, QObject *parent) + : QPlatformAudioSource(parent) + , m_audioDeviceInfo(device) , m_isOpen(false) , m_internalBufferSize(DEFAULT_BUFFER_SIZE) , m_totalFrames(0) diff --git a/src/multimedia/darwin/qdarwinaudiosource_p.h b/src/multimedia/darwin/qdarwinaudiosource_p.h index 48dfa6fde..cb9ab63d4 100644 --- a/src/multimedia/darwin/qdarwinaudiosource_p.h +++ b/src/multimedia/darwin/qdarwinaudiosource_p.h @@ -165,7 +165,7 @@ class QDarwinAudioSource : public QPlatformAudioSource Q_OBJECT public: - QDarwinAudioSource(const QAudioDevice &device); + QDarwinAudioSource(const QAudioDevice &device, QObject *parent); ~QDarwinAudioSource(); void start(QIODevice *device); diff --git a/src/multimedia/darwin/qdarwinmediadevices.mm b/src/multimedia/darwin/qdarwinmediadevices.mm index 08ea21e8b..46a91a850 100644 --- a/src/multimedia/darwin/qdarwinmediadevices.mm +++ b/src/multimedia/darwin/qdarwinmediadevices.mm @@ -279,14 +279,16 @@ void QDarwinMediaDevices::onOutputsUpdated() } } -QPlatformAudioSource *QDarwinMediaDevices::createAudioSource(const QAudioDevice &info) +QPlatformAudioSource *QDarwinMediaDevices::createAudioSource(const QAudioDevice &info, + QObject *parent) { - return new QDarwinAudioSource(info); + return new QDarwinAudioSource(info, parent); } -QPlatformAudioSink *QDarwinMediaDevices::createAudioSink(const QAudioDevice &info) +QPlatformAudioSink *QDarwinMediaDevices::createAudioSink(const QAudioDevice &info, + QObject *parent) { - return new QDarwinAudioSink(info); + return new QDarwinAudioSink(info, parent); } QT_END_NAMESPACE diff --git a/src/multimedia/darwin/qdarwinmediadevices_p.h b/src/multimedia/darwin/qdarwinmediadevices_p.h index 6134d0544..0c7a45433 100644 --- a/src/multimedia/darwin/qdarwinmediadevices_p.h +++ b/src/multimedia/darwin/qdarwinmediadevices_p.h @@ -31,8 +31,10 @@ public: QList audioInputs() const override; QList audioOutputs() const override; - QPlatformAudioSource *createAudioSource(const QAudioDevice &info) override; - QPlatformAudioSink *createAudioSink(const QAudioDevice &info) override; + QPlatformAudioSource *createAudioSource(const QAudioDevice &info, + QObject *parent) override; + QPlatformAudioSink *createAudioSink(const QAudioDevice &info, + QObject *parent) override; void onInputsUpdated(); void onOutputsUpdated(); diff --git a/src/multimedia/platform/qplatformmediadevices.cpp b/src/multimedia/platform/qplatformmediadevices.cpp index 26e62d64b..867edb7c7 100644 --- a/src/multimedia/platform/qplatformmediadevices.cpp +++ b/src/multimedia/platform/qplatformmediadevices.cpp @@ -87,25 +87,29 @@ QList QPlatformMediaDevices::videoInputs() const return {}; } -QPlatformAudioSource* QPlatformMediaDevices::audioInputDevice(const QAudioFormat &format, const QAudioDevice &deviceInfo) +QPlatformAudioSource *QPlatformMediaDevices::audioInputDevice(const QAudioFormat &format, + const QAudioDevice &deviceInfo, + QObject *parent) { QAudioDevice info = deviceInfo; if (info.isNull()) info = audioInputs().value(0); - QPlatformAudioSource* p = !info.isNull() ? createAudioSource(info) : nullptr; + QPlatformAudioSource* p = !info.isNull() ? createAudioSource(info, parent) : nullptr; if (p) p->setFormat(format); return p; } -QPlatformAudioSink* QPlatformMediaDevices::audioOutputDevice(const QAudioFormat &format, const QAudioDevice &deviceInfo) +QPlatformAudioSink *QPlatformMediaDevices::audioOutputDevice(const QAudioFormat &format, + const QAudioDevice &deviceInfo, + QObject *parent) { QAudioDevice info = deviceInfo; if (info.isNull()) info = audioOutputs().value(0); - QPlatformAudioSink* p = !info.isNull() ? createAudioSink(info) : nullptr; + QPlatformAudioSink* p = !info.isNull() ? createAudioSink(info, parent) : nullptr; if (p) p->setFormat(format); return p; diff --git a/src/multimedia/platform/qplatformmediadevices_p.h b/src/multimedia/platform/qplatformmediadevices_p.h index aba9a6468..5786c28a4 100644 --- a/src/multimedia/platform/qplatformmediadevices_p.h +++ b/src/multimedia/platform/qplatformmediadevices_p.h @@ -20,6 +20,7 @@ QT_BEGIN_NAMESPACE +class QObject; class QMediaDevices; class QAudioDevice; class QCameraDevice; @@ -40,11 +41,15 @@ public: virtual QList audioInputs() const = 0; virtual QList audioOutputs() const = 0; virtual QList videoInputs() const; - virtual QPlatformAudioSource *createAudioSource(const QAudioDevice &deviceInfo) = 0; - virtual QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo) = 0; - - QPlatformAudioSource *audioInputDevice(const QAudioFormat &format, const QAudioDevice &deviceInfo); - QPlatformAudioSink *audioOutputDevice(const QAudioFormat &format, const QAudioDevice &deviceInfo); + virtual QPlatformAudioSource *createAudioSource(const QAudioDevice &deviceInfo, + QObject *parent) = 0; + virtual QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo, + QObject *parent) = 0; + + QPlatformAudioSource *audioInputDevice(const QAudioFormat &format, + const QAudioDevice &deviceInfo, QObject *parent); + QPlatformAudioSink *audioOutputDevice(const QAudioFormat &format, + const QAudioDevice &deviceInfo, QObject *parent); void addMediaDevices(QMediaDevices *m) { diff --git a/src/multimedia/pulseaudio/qpulseaudiomediadevices.cpp b/src/multimedia/pulseaudio/qpulseaudiomediadevices.cpp index 772585b54..d744e0417 100644 --- a/src/multimedia/pulseaudio/qpulseaudiomediadevices.cpp +++ b/src/multimedia/pulseaudio/qpulseaudiomediadevices.cpp @@ -38,14 +38,16 @@ QList QPulseAudioMediaDevices::videoInputs() const return {}; } -QPlatformAudioSource *QPulseAudioMediaDevices::createAudioSource(const QAudioDevice &deviceInfo) +QPlatformAudioSource *QPulseAudioMediaDevices::createAudioSource(const QAudioDevice &deviceInfo, + QObject *parent) { - return new QPulseAudioSource(deviceInfo.id()); + return new QPulseAudioSource(deviceInfo.id(), parent); } -QPlatformAudioSink *QPulseAudioMediaDevices::createAudioSink(const QAudioDevice &deviceInfo) +QPlatformAudioSink *QPulseAudioMediaDevices::createAudioSink(const QAudioDevice &deviceInfo, + QObject *parent) { - return new QPulseAudioSink(deviceInfo.id()); + return new QPulseAudioSink(deviceInfo.id(), parent); } QT_END_NAMESPACE diff --git a/src/multimedia/pulseaudio/qpulseaudiomediadevices_p.h b/src/multimedia/pulseaudio/qpulseaudiomediadevices_p.h index 14ebd78fa..36435b220 100644 --- a/src/multimedia/pulseaudio/qpulseaudiomediadevices_p.h +++ b/src/multimedia/pulseaudio/qpulseaudiomediadevices_p.h @@ -32,8 +32,10 @@ public: QList audioInputs() const override; QList audioOutputs() const override; QList videoInputs() const override; - QPlatformAudioSource *createAudioSource(const QAudioDevice &deviceInfo) override; - QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo) override; + QPlatformAudioSource *createAudioSource(const QAudioDevice &deviceInfo, + QObject *parent) override; + QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo, + QObject *parent) override; private: QPulseAudioEngine *pulseEngine; diff --git a/src/multimedia/pulseaudio/qpulseaudiosink.cpp b/src/multimedia/pulseaudio/qpulseaudiosink.cpp index 7e224f2f3..132b024d3 100644 --- a/src/multimedia/pulseaudio/qpulseaudiosink.cpp +++ b/src/multimedia/pulseaudio/qpulseaudiosink.cpp @@ -112,8 +112,9 @@ static void streamAdjustPrebufferCallback(pa_stream *stream, int success, void * } -QPulseAudioSink::QPulseAudioSink(const QByteArray &device) - : m_device(device) +QPulseAudioSink::QPulseAudioSink(const QByteArray &device, QObject *parent) + : QPlatformAudioSink(parent), + m_device(device) { } diff --git a/src/multimedia/pulseaudio/qpulseaudiosink_p.h b/src/multimedia/pulseaudio/qpulseaudiosink_p.h index c73c7ee8f..c2c62d109 100644 --- a/src/multimedia/pulseaudio/qpulseaudiosink_p.h +++ b/src/multimedia/pulseaudio/qpulseaudiosink_p.h @@ -36,7 +36,7 @@ class QPulseAudioSink : public QPlatformAudioSink Q_OBJECT public: - QPulseAudioSink(const QByteArray &device); + QPulseAudioSink(const QByteArray &device, QObject *parent); ~QPulseAudioSink(); void start(QIODevice *device) override; diff --git a/src/multimedia/pulseaudio/qpulseaudiosource.cpp b/src/multimedia/pulseaudio/qpulseaudiosource.cpp index d00af3641..883720ed2 100644 --- a/src/multimedia/pulseaudio/qpulseaudiosource.cpp +++ b/src/multimedia/pulseaudio/qpulseaudiosource.cpp @@ -89,8 +89,9 @@ static void inputStreamSuccessCallback(pa_stream *stream, int success, void *use pa_threaded_mainloop_signal(pulseEngine->mainloop(), 0); } -QPulseAudioSource::QPulseAudioSource(const QByteArray &device) - : m_totalTimeValue(0) +QPulseAudioSource::QPulseAudioSource(const QByteArray &device, QObject *parent) + : QPlatformAudioSource(parent) + , m_totalTimeValue(0) , m_audioSource(nullptr) , m_errorState(QAudio::NoError) , m_deviceState(QAudio::StoppedState) diff --git a/src/multimedia/pulseaudio/qpulseaudiosource_p.h b/src/multimedia/pulseaudio/qpulseaudiosource_p.h index b687ad5e0..e367cb006 100644 --- a/src/multimedia/pulseaudio/qpulseaudiosource_p.h +++ b/src/multimedia/pulseaudio/qpulseaudiosource_p.h @@ -37,7 +37,7 @@ class QPulseAudioSource : public QPlatformAudioSource Q_OBJECT public: - QPulseAudioSource(const QByteArray &device); + QPulseAudioSource(const QByteArray &device, QObject *parent); ~QPulseAudioSource(); qint64 read(char *data, qint64 len); diff --git a/src/multimedia/qnx/qqnxaudiosink.cpp b/src/multimedia/qnx/qqnxaudiosink.cpp index 0a4c073c5..f78371b02 100644 --- a/src/multimedia/qnx/qqnxaudiosink.cpp +++ b/src/multimedia/qnx/qqnxaudiosink.cpp @@ -14,9 +14,11 @@ QT_BEGIN_NAMESPACE -QQnxAudioSink::QQnxAudioSink(const QAudioDevice &deviceInfo) - : m_source(0) +QQnxAudioSink::QQnxAudioSink(const QAudioDevice &deviceInfo, QObject *parent) + : QPlatformAudioSink(parent) + , m_source(0) , m_pushSource(false) + , m_timer(new QTimer(this)) , m_error(QAudio::NoError) , m_state(QAudio::StoppedState) , m_volume(1.0) @@ -26,9 +28,9 @@ QQnxAudioSink::QQnxAudioSink(const QAudioDevice &deviceInfo) , m_deviceInfo(deviceInfo) , m_pcmNotifier(0) { - m_timer.setSingleShot(false); - m_timer.setInterval(20); - connect(&m_timer, &QTimer::timeout, this, &QQnxAudioSink::pullData); + m_timer->setSingleShot(false); + m_timer->setInterval(20); + connect(m_timer, &QTimer::timeout, this, &QQnxAudioSink::pullData); const std::optional info = QnxAudioUtils::pcmChannelInfo( m_deviceInfo.id(), QAudioDevice::Output); @@ -52,7 +54,7 @@ void QQnxAudioSink::start(QIODevice *source) if (open()) { changeState(QAudio::ActiveState, QAudio::NoError); - m_timer.start(); + m_timer->start(); } else { changeState(QAudio::StoppedState, QAudio::OpenError); } @@ -308,7 +310,7 @@ bool QQnxAudioSink::open() void QQnxAudioSink::close() { if (!m_pushSource) - m_timer.stop(); + m_timer->stop(); destroyPcmNotifiers(); @@ -412,7 +414,7 @@ qint64 QQnxAudioSink::write(const char *data, qint64 len) void QQnxAudioSink::suspendInternal(QAudio::State suspendState) { if (!m_pushSource) - m_timer.stop(); + m_timer->stop(); changeState(suspendState, QAudio::NoError); } @@ -423,7 +425,7 @@ void QQnxAudioSink::resumeInternal() changeState(state, QAudio::NoError); - m_timer.start(); + m_timer->start(); } QAudio::State suspendState(const snd_pcm_event_t &event) diff --git a/src/multimedia/qnx/qqnxaudiosink_p.h b/src/multimedia/qnx/qqnxaudiosink_p.h index aed42d07f..94669ecb7 100644 --- a/src/multimedia/qnx/qqnxaudiosink_p.h +++ b/src/multimedia/qnx/qqnxaudiosink_p.h @@ -36,7 +36,7 @@ class QQnxAudioSink : public QPlatformAudioSink Q_OBJECT public: - explicit QQnxAudioSink(const QAudioDevice &deviceInfo); + explicit QQnxAudioSink(const QAudioDevice &deviceInfo, QObject *parent); ~QQnxAudioSink(); void start(QIODevice *source) override; @@ -79,7 +79,7 @@ private: QIODevice *m_source; bool m_pushSource; - QTimer m_timer; + QTimer *m_timer; QAudio::Error m_error; QAudio::State m_state; diff --git a/src/multimedia/qnx/qqnxaudiosource.cpp b/src/multimedia/qnx/qqnxaudiosource.cpp index 214427da3..1726a82d8 100644 --- a/src/multimedia/qnx/qqnxaudiosource.cpp +++ b/src/multimedia/qnx/qqnxaudiosource.cpp @@ -9,8 +9,9 @@ QT_BEGIN_NAMESPACE -QQnxAudioSource::QQnxAudioSource(const QAudioDevice &deviceInfo) - : m_audioSource(0) +QQnxAudioSource::QQnxAudioSource(const QAudioDevice &deviceInfo, QObject *parent) + : QPlatformAudioSource(parent) + , m_audioSource(0) , m_pcmNotifier(0) , m_error(QAudio::NoError) , m_state(QAudio::StoppedState) diff --git a/src/multimedia/qnx/qqnxaudiosource_p.h b/src/multimedia/qnx/qqnxaudiosource_p.h index 5b923502c..6b9cf61ac 100644 --- a/src/multimedia/qnx/qqnxaudiosource_p.h +++ b/src/multimedia/qnx/qqnxaudiosource_p.h @@ -33,7 +33,7 @@ class QQnxAudioSource : public QPlatformAudioSource Q_OBJECT public: - explicit QQnxAudioSource(const QAudioDevice &deviceInfo); + explicit QQnxAudioSource(const QAudioDevice &deviceInfo, QObject *parent); ~QQnxAudioSource(); void start(QIODevice*) override; diff --git a/src/multimedia/qnx/qqnxmediadevices.cpp b/src/multimedia/qnx/qqnxmediadevices.cpp index 899c8bb15..d9e33fcdc 100644 --- a/src/multimedia/qnx/qqnxmediadevices.cpp +++ b/src/multimedia/qnx/qqnxmediadevices.cpp @@ -55,14 +55,16 @@ QList QQnxMediaDevices::audioOutputs() const return ::enumeratePcmDevices(QAudioDevice::Output); } -QPlatformAudioSource *QQnxMediaDevices::createAudioSource(const QAudioDevice &deviceInfo) +QPlatformAudioSource *QQnxMediaDevices::createAudioSource(const QAudioDevice &deviceInfo, + QObject *parent) { - return new QQnxAudioSource(deviceInfo); + return new QQnxAudioSource(deviceInfo, parent); } -QPlatformAudioSink *QQnxMediaDevices::createAudioSink(const QAudioDevice &deviceInfo) +QPlatformAudioSink *QQnxMediaDevices::createAudioSink(const QAudioDevice &deviceInfo, + QObject *parent) { - return new QQnxAudioSink(deviceInfo); + return new QQnxAudioSink(deviceInfo, parent); } QT_END_NAMESPACE diff --git a/src/multimedia/qnx/qqnxmediadevices_p.h b/src/multimedia/qnx/qqnxmediadevices_p.h index 55aa759b3..b8ccf5807 100644 --- a/src/multimedia/qnx/qqnxmediadevices_p.h +++ b/src/multimedia/qnx/qqnxmediadevices_p.h @@ -28,8 +28,10 @@ public: QList audioInputs() const override; QList audioOutputs() const override; - QPlatformAudioSource *createAudioSource(const QAudioDevice &deviceInfo) override; - QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo) override; + QPlatformAudioSource *createAudioSource(const QAudioDevice &deviceInfo, + QObject *parent) override; + QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo, + QObject *parent) override; }; QT_END_NAMESPACE diff --git a/src/multimedia/wasm/qwasmaudiosink.cpp b/src/multimedia/wasm/qwasmaudiosink.cpp index 7c6a5cff1..a6a27ef9e 100644 --- a/src/multimedia/wasm/qwasmaudiosink.cpp +++ b/src/multimedia/wasm/qwasmaudiosink.cpp @@ -41,12 +41,14 @@ protected: qint64 writeData(const char *data, qint64 len) override; }; -QWasmAudioSink::QWasmAudioSink(const QByteArray &device) - : m_name(device) +QWasmAudioSink::QWasmAudioSink(const QByteArray &device, QObject *parent) + : QPlatformAudioSink(parent), + m_name(device), + m_timer(new QTimer(this)) { - m_timer.setSingleShot(false); + m_timer->setSingleShot(false); aldata = new ALData(); - connect(&m_timer, &QTimer::timeout, this, [this](){ + connect(m_timer, &QTimer::timeout, this, [this](){ if (m_pullMode) nextALBuffers(); else { @@ -156,8 +158,8 @@ void QWasmAudioSink::start(bool mode) alSourcef(aldata->source, AL_GAIN, m_volume); if (m_pullMode) loadALBuffers(); - m_timer.setInterval(DEFAULT_BUFFER_DURATION / 3000); - m_timer.start(); + m_timer->setInterval(DEFAULT_BUFFER_DURATION / 3000); + m_timer->start(); if (m_pullMode) alSourcePlay(aldata->source); m_running = true; @@ -172,7 +174,7 @@ void QWasmAudioSink::stop() m_elapsedTimer.invalidate(); alSourceStop(aldata->source); alSourceRewind(aldata->source); - m_timer.stop(); + m_timer->stop(); m_bufferFragmentsBusyCount = 0; alDeleteSources(1, &aldata->source); alDeleteBuffers(m_bufferFragmentsCount, aldata->buffers); @@ -386,7 +388,7 @@ void QWasmAudioSink::setError(QAudio::Error error) return; m_error = error; if (error != QAudio::NoError) { - m_timer.stop(); + m_timer->stop(); alSourceRewind(aldata->source); } diff --git a/src/multimedia/wasm/qwasmaudiosink_p.h b/src/multimedia/wasm/qwasmaudiosink_p.h index c165f28cb..5f8759c34 100644 --- a/src/multimedia/wasm/qwasmaudiosink_p.h +++ b/src/multimedia/wasm/qwasmaudiosink_p.h @@ -30,7 +30,7 @@ class QWasmAudioSink : public QPlatformAudioSink QByteArray m_name; ALData *aldata = nullptr; - QTimer m_timer; + QTimer *m_timer = nullptr; QIODevice *m_device = nullptr; QAudioFormat m_format; QAudio::Error m_error = QAudio::NoError; @@ -58,7 +58,7 @@ private slots: void setError(QAudio::Error); public: - QWasmAudioSink(const QByteArray &device); + QWasmAudioSink(const QByteArray &device, QObject *parent); ~QWasmAudioSink(); public: diff --git a/src/multimedia/wasm/qwasmaudiosource.cpp b/src/multimedia/wasm/qwasmaudiosource.cpp index bc7b34b7e..9f51d7077 100644 --- a/src/multimedia/wasm/qwasmaudiosource.cpp +++ b/src/multimedia/wasm/qwasmaudiosource.cpp @@ -64,11 +64,13 @@ void QWasmAudioSource::writeBuffer() m_device->write(m_tmpData,bytes); } -QWasmAudioSource::QWasmAudioSource(const QByteArray &device) - : QPlatformAudioSource(), m_name(device) +QWasmAudioSource::QWasmAudioSource(const QByteArray &device , QObject *parent) + : QPlatformAudioSource(parent), + m_name(device), + m_timer(new QTimer(this)) { aldata = new ALData(); - connect(&m_timer, &QTimer::timeout, this, [this](){ + connect(m_timer, &QTimer::timeout, this, [this](){ Q_ASSERT(m_running); if (m_pullMode) writeBuffer(); @@ -146,7 +148,7 @@ void QWasmAudioSource::start(bool mode) m_tmpData = new char[m_bufferSize]; else m_tmpData = nullptr; - m_timer.setInterval(m_format.durationForBytes(m_bufferSize) / 3'000); + m_timer->setInterval(m_format.durationForBytes(m_bufferSize) / 3'000); aldata->device = alcCaptureOpenDevice(m_name.data(), m_format.sampleRate(), format, m_format.framesForBytes(m_bufferSize)); @@ -165,7 +167,7 @@ void QWasmAudioSource::start(bool mode) } m_processed = 0; m_running = true; - m_timer.start(); + m_timer->start(); } void QWasmAudioSource::stop() @@ -181,7 +183,7 @@ void QWasmAudioSource::stop() } if (!m_pullMode) m_device->deleteLater(); - m_timer.stop(); + m_timer->stop(); m_running = false; } diff --git a/src/multimedia/wasm/qwasmaudiosource_p.h b/src/multimedia/wasm/qwasmaudiosource_p.h index 96cb94da2..41faa34fb 100644 --- a/src/multimedia/wasm/qwasmaudiosource_p.h +++ b/src/multimedia/wasm/qwasmaudiosource_p.h @@ -29,7 +29,7 @@ class QWasmAudioSource : public QPlatformAudioSource QByteArray m_name; ALData *aldata = nullptr; - QTimer m_timer; + QTimer *m_timer = nullptr; QIODevice *m_device = nullptr; QAudioFormat m_format; qreal m_volume = 1; @@ -45,7 +45,7 @@ class QWasmAudioSource : public QPlatformAudioSource void writeBuffer(); public: - QWasmAudioSource(const QByteArray &device); + QWasmAudioSource(const QByteArray &device, QObject *parent); public: void start(QIODevice *device) override; diff --git a/src/multimedia/wasm/qwasmmediadevices.cpp b/src/multimedia/wasm/qwasmmediadevices.cpp index 533c874e7..5244236be 100644 --- a/src/multimedia/wasm/qwasmmediadevices.cpp +++ b/src/multimedia/wasm/qwasmmediadevices.cpp @@ -43,14 +43,16 @@ QList QWasmMediaDevices::videoInputs() const return {}; } -QPlatformAudioSource *QWasmMediaDevices::createAudioSource(const QAudioDevice &deviceInfo) +QPlatformAudioSource *QWasmMediaDevices::createAudioSource(const QAudioDevice &deviceInfo, + QObject *parent) { - return new QWasmAudioSource(deviceInfo.id()); + return new QWasmAudioSource(deviceInfo.id(), parent); } -QPlatformAudioSink *QWasmMediaDevices::createAudioSink(const QAudioDevice &deviceInfo) +QPlatformAudioSink *QWasmMediaDevices::createAudioSink(const QAudioDevice &deviceInfo, + QObject *parent) { - return new QWasmAudioSink(deviceInfo.id()); + return new QWasmAudioSink(deviceInfo.id(), parent); } QT_END_NAMESPACE diff --git a/src/multimedia/wasm/qwasmmediadevices_p.h b/src/multimedia/wasm/qwasmmediadevices_p.h index 47bd28fbf..b19bec3a2 100644 --- a/src/multimedia/wasm/qwasmmediadevices_p.h +++ b/src/multimedia/wasm/qwasmmediadevices_p.h @@ -32,8 +32,10 @@ public: QList audioInputs() const override; QList audioOutputs() const override; QList videoInputs() const override; - QPlatformAudioSource *createAudioSource(const QAudioDevice &deviceInfo) override; - QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo) override; + QPlatformAudioSource *createAudioSource(const QAudioDevice &deviceInfo, + QObject *parent) override; + QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo, + QObject *parent) override; private: QList m_outs; diff --git a/src/multimedia/windows/qwindowsaudiosink.cpp b/src/multimedia/windows/qwindowsaudiosink.cpp index b16b8a3b8..f38654d92 100644 --- a/src/multimedia/windows/qwindowsaudiosink.cpp +++ b/src/multimedia/windows/qwindowsaudiosink.cpp @@ -39,7 +39,7 @@ class OutputPrivate : public QIODevice { Q_OBJECT public: - OutputPrivate(QWindowsAudioSink& audio) : audioDevice(audio) {} + OutputPrivate(QWindowsAudioSink &audio) : QIODevice(&audio), audioDevice(audio) {} ~OutputPrivate() override = default; qint64 readData(char *, qint64) override { return 0; } @@ -77,13 +77,15 @@ std::optional audioClientFramesAvailable(IAudioClient *client) return {}; } -QWindowsAudioSink::QWindowsAudioSink(QWindowsIUPointer device) : +QWindowsAudioSink::QWindowsAudioSink(QWindowsIUPointer device, QObject *parent) : + QPlatformAudioSink(parent), + m_timer(new QTimer(this)), m_pushSource(new OutputPrivate(*this)), m_device(std::move(device)) { m_pushSource->open(QIODevice::WriteOnly|QIODevice::Unbuffered); - m_timer.setSingleShot(true); - m_timer.setTimerType(Qt::PreciseTimer); + m_timer->setSingleShot(true); + m_timer->setTimerType(Qt::PreciseTimer); } QWindowsAudioSink::~QWindowsAudioSink() @@ -105,7 +107,7 @@ void QWindowsAudioSink::deviceStateChange(QAudio::State state, QAudio::Error err qCDebug(qLcAudioOutput) << "Audio client started"; } else if (deviceState == QAudio::ActiveState) { - m_timer.stop(); + m_timer->stop(); m_audioClient->Stop(); qCDebug(qLcAudioOutput) << "Audio client stopped"; } @@ -154,7 +156,7 @@ void QWindowsAudioSink::pullSource() deviceStateChange(QAudio::IdleState, m_pullSource->atEnd() ? QAudio::NoError : QAudio::UnderrunError); } else { deviceStateChange(QAudio::ActiveState, QAudio::NoError); - m_timer.start(playTimeUs / 2000); + m_timer->start(playTimeUs / 2000); } } @@ -176,8 +178,8 @@ void QWindowsAudioSink::start(QIODevice* device) m_pullSource = device; connect(device, &QIODevice::readyRead, this, &QWindowsAudioSink::pullSource); - m_timer.disconnect(); - m_timer.callOnTimeout(this, &QWindowsAudioSink::pullSource); + m_timer->disconnect(); + m_timer->callOnTimeout(this, &QWindowsAudioSink::pullSource); pullSource(); } @@ -189,7 +191,7 @@ qint64 QWindowsAudioSink::push(const char *data, qint64 len) qint64 written = write(data, len); if (written > 0) { deviceStateChange(QAudio::ActiveState, QAudio::NoError); - m_timer.start(remainingPlayTimeUs() /1000); + m_timer->start(remainingPlayTimeUs() /1000); } return written; @@ -209,8 +211,8 @@ QIODevice* QWindowsAudioSink::start() deviceStateChange(QAudio::IdleState, QAudio::NoError); - m_timer.disconnect(); - m_timer.callOnTimeout([&](){ + m_timer->disconnect(); + m_timer->callOnTimeout([&](){ deviceStateChange(QAudio::IdleState, QAudio::UnderrunError); }); diff --git a/src/multimedia/windows/qwindowsaudiosink_p.h b/src/multimedia/windows/qwindowsaudiosink_p.h index 0920719f4..f04a144f9 100644 --- a/src/multimedia/windows/qwindowsaudiosink_p.h +++ b/src/multimedia/windows/qwindowsaudiosink_p.h @@ -55,7 +55,7 @@ class QWindowsAudioSink : public QPlatformAudioSink { Q_OBJECT public: - QWindowsAudioSink(QWindowsIUPointer device); + QWindowsAudioSink(QWindowsIUPointer device, QObject *parent); ~QWindowsAudioSink(); void setFormat(const QAudioFormat& fmt) override; @@ -94,7 +94,7 @@ private: qsizetype m_bufferSize = 0; qreal m_volume = 1.0; - QTimer m_timer; + QTimer *m_timer = nullptr; QScopedPointer m_pushSource; QIODevice *m_pullSource = nullptr; QWindowsIUPointer m_device; diff --git a/src/multimedia/windows/qwindowsaudiosource.cpp b/src/multimedia/windows/qwindowsaudiosource.cpp index c4699a36f..23fc18828 100644 --- a/src/multimedia/windows/qwindowsaudiosource.cpp +++ b/src/multimedia/windows/qwindowsaudiosource.cpp @@ -22,7 +22,8 @@ QT_BEGIN_NAMESPACE //#define DEBUG_AUDIO 1 -QWindowsAudioSource::QWindowsAudioSource(int deviceId) +QWindowsAudioSource::QWindowsAudioSource(int deviceId, QObject *parent) + : QPlatformAudioSource(parent) { bytesAvailable = 0; buffer_size = 0; diff --git a/src/multimedia/windows/qwindowsaudiosource_p.h b/src/multimedia/windows/qwindowsaudiosource_p.h index 99b04510b..74ce440cd 100644 --- a/src/multimedia/windows/qwindowsaudiosource_p.h +++ b/src/multimedia/windows/qwindowsaudiosource_p.h @@ -46,7 +46,7 @@ class QWindowsAudioSource : public QPlatformAudioSource { Q_OBJECT public: - QWindowsAudioSource(int deviceId); + QWindowsAudioSource(int deviceId, QObject *parent); ~QWindowsAudioSource(); qint64 read(char* data, qint64 len); diff --git a/src/multimedia/windows/qwindowsmediadevices.cpp b/src/multimedia/windows/qwindowsmediadevices.cpp index c91597102..b01ac5fa5 100644 --- a/src/multimedia/windows/qwindowsmediadevices.cpp +++ b/src/multimedia/windows/qwindowsmediadevices.cpp @@ -270,16 +270,18 @@ QList QWindowsMediaDevices::audioOutputs() const return availableDevices(QAudioDevice::Output); } -QPlatformAudioSource *QWindowsMediaDevices::createAudioSource(const QAudioDevice &deviceInfo) +QPlatformAudioSource *QWindowsMediaDevices::createAudioSource(const QAudioDevice &deviceInfo, + QObject *parent) { const auto *devInfo = static_cast(deviceInfo.handle()); - return new QWindowsAudioSource(devInfo->waveId()); + return new QWindowsAudioSource(devInfo->waveId(), parent); } -QPlatformAudioSink *QWindowsMediaDevices::createAudioSink(const QAudioDevice &deviceInfo) +QPlatformAudioSink *QWindowsMediaDevices::createAudioSink(const QAudioDevice &deviceInfo, + QObject *parent) { const auto *devInfo = static_cast(deviceInfo.handle()); - return new QWindowsAudioSink(devInfo->immDev()); + return new QWindowsAudioSink(devInfo->immDev(), parent); } QT_END_NAMESPACE diff --git a/src/multimedia/windows/qwindowsmediadevices_p.h b/src/multimedia/windows/qwindowsmediadevices_p.h index b3d6c0ea2..f32577535 100644 --- a/src/multimedia/windows/qwindowsmediadevices_p.h +++ b/src/multimedia/windows/qwindowsmediadevices_p.h @@ -35,8 +35,10 @@ public: QList audioInputs() const override; QList audioOutputs() const override; - QPlatformAudioSource *createAudioSource(const QAudioDevice &deviceInfo) override; - QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo) override; + QPlatformAudioSource *createAudioSource(const QAudioDevice &deviceInfo, + QObject *parent) override; + QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo, + QObject *parent) override; private: QList availableDevices(QAudioDevice::Mode mode) const; diff --git a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink.cpp b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink.cpp index cf339d7d7..86a10da66 100644 --- a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink.cpp +++ b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink.cpp @@ -21,7 +21,7 @@ QT_BEGIN_NAMESPACE -QMaybe QGStreamerAudioSink::create(const QAudioDevice &device) +QMaybe QGStreamerAudioSink::create(const QAudioDevice &device, QObject *parent) { auto maybeAppSrc = QGstAppSrc::create(); if (!maybeAppSrc) @@ -35,12 +35,13 @@ QMaybe QGStreamerAudioSink::create(const QAudioDevice &dev if (!volume) return errorMessageCannotFindElement("volume"); - return new QGStreamerAudioSink(device, maybeAppSrc.value(), audioconvert, volume); + return new QGStreamerAudioSink(device, maybeAppSrc.value(), audioconvert, volume, parent); } QGStreamerAudioSink::QGStreamerAudioSink(const QAudioDevice &device, QGstAppSrc *appsrc, - QGstElement audioconvert, QGstElement volume) - : m_device(device.id()), + QGstElement audioconvert, QGstElement volume, QObject *parent) + : QPlatformAudioSink(parent), + m_device(device.id()), gstPipeline("pipeline"), gstVolume(std::move(volume)), m_appSrc(appsrc) diff --git a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink_p.h b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink_p.h index 26d2c9b28..07286a3b5 100644 --- a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink_p.h +++ b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink_p.h @@ -43,7 +43,7 @@ class QGStreamerAudioSink Q_OBJECT public: - static QMaybe create(const QAudioDevice &device); + static QMaybe create(const QAudioDevice &device, QObject *parent); ~QGStreamerAudioSink(); void start(QIODevice *device) override; @@ -70,7 +70,7 @@ private Q_SLOTS: private: QGStreamerAudioSink(const QAudioDevice &device, QGstAppSrc *appsrc, QGstElement audioconvert, - QGstElement volume); + QGstElement volume, QObject *parent); void setState(QAudio::State state); void setError(QAudio::Error error); @@ -89,7 +89,6 @@ private: bool m_pullMode = true; bool m_opened = false; QIODevice *m_audioSource = nullptr; - QTimer m_periodTimer; int m_bufferSize = 0; qint64 m_bytesProcessed = 0; QElapsedTimer m_timeStamp; diff --git a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp index 77d09be49..8d018f859 100644 --- a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp +++ b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp @@ -18,8 +18,9 @@ Q_DECLARE_METATYPE(GstSample *); QT_BEGIN_NAMESPACE -QGStreamerAudioSource::QGStreamerAudioSource(const QAudioDevice &device) - : m_info(device), +QGStreamerAudioSource::QGStreamerAudioSource(const QAudioDevice &device, QObject *parent) + : QPlatformAudioSource(parent), + m_info(device), m_device(device.id()) { qRegisterMetaType(); diff --git a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource_p.h b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource_p.h index 24c84fe56..9a6860a68 100644 --- a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource_p.h +++ b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource_p.h @@ -43,7 +43,7 @@ class QGStreamerAudioSource Q_OBJECT friend class GStreamerInputPrivate; public: - QGStreamerAudioSource(const QAudioDevice &device); + QGStreamerAudioSource(const QAudioDevice &device, QObject *parent); ~QGStreamerAudioSource(); void start(QIODevice *device) override; diff --git a/tests/auto/unit/mockbackend/qmockmediadevices.cpp b/tests/auto/unit/mockbackend/qmockmediadevices.cpp index 0a17dfa57..5259b1327 100644 --- a/tests/auto/unit/mockbackend/qmockmediadevices.cpp +++ b/tests/auto/unit/mockbackend/qmockmediadevices.cpp @@ -24,15 +24,19 @@ QList QMockMediaDevices::audioOutputs() const return m_outputDevices; } -QPlatformAudioSource *QMockMediaDevices::createAudioSource(const QAudioDevice &info) +QPlatformAudioSource *QMockMediaDevices::createAudioSource(const QAudioDevice &info, + QObject *parent) { Q_UNUSED(info); + Q_UNUSED(parent); return nullptr;// ### } -QPlatformAudioSink *QMockMediaDevices::createAudioSink(const QAudioDevice &info) +QPlatformAudioSink *QMockMediaDevices::createAudioSink(const QAudioDevice &info, + QObject *parent) { Q_UNUSED(info); + Q_UNUSED(parent); return nullptr; //### } diff --git a/tests/auto/unit/mockbackend/qmockmediadevices_p.h b/tests/auto/unit/mockbackend/qmockmediadevices_p.h index 2483f5e10..f9b8c1272 100644 --- a/tests/auto/unit/mockbackend/qmockmediadevices_p.h +++ b/tests/auto/unit/mockbackend/qmockmediadevices_p.h @@ -32,8 +32,10 @@ public: QList audioInputs() const override; QList audioOutputs() const override; - QPlatformAudioSource *createAudioSource(const QAudioDevice &info) override; - QPlatformAudioSink *createAudioSink(const QAudioDevice &info) override; + QPlatformAudioSource *createAudioSource(const QAudioDevice &info, + QObject *parent) override; + QPlatformAudioSink *createAudioSink(const QAudioDevice &info, + QObject *parent) override; private: QList m_inputDevices; -- cgit v1.2.3