diff options
author | Doris Verria <doris.verria@qt.io> | 2022-01-13 07:48:32 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-01-13 09:02:05 +0000 |
commit | 349d81b571e89b6365c131506785f43fd5a1fa48 (patch) | |
tree | 209a1ee5486cb7f5245e878421459bc280ab962a | |
parent | 74f08fdd28f03581eb9594525f9ef066347ed1e6 (diff) |
Don't crash if system has no audio device
Fixes: QTBUG-97838
Change-Id: I355958b99f62fc85228b3dd3afd06aa01005008c
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
(cherry picked from commit e95f7256fb534c3dd03b3091dd9835cd2f33d327)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | examples/multimedia/audiosource/audiosource.cpp | 3 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiosink.cpp | 42 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiosource.cpp | 40 | ||||
-rw-r--r-- | src/multimedia/platform/qplatformmediadevices.cpp | 4 |
4 files changed, 59 insertions, 30 deletions
diff --git a/examples/multimedia/audiosource/audiosource.cpp b/examples/multimedia/audiosource/audiosource.cpp index 1f84ae63a..ef0379e02 100644 --- a/examples/multimedia/audiosource/audiosource.cpp +++ b/examples/multimedia/audiosource/audiosource.cpp @@ -215,6 +215,9 @@ void InputTest::toggleMode() } else { m_modeButton->setText(tr("Enable pull mode")); auto *io = m_audioInput->start(); + if (!io) + return; + connect(io, &QIODevice::readyRead, [this, io]() { static const qint64 BufferSize = 4096; diff --git a/src/multimedia/audio/qaudiosink.cpp b/src/multimedia/audio/qaudiosink.cpp index 6b16a71aa..c0cce2c79 100644 --- a/src/multimedia/audio/qaudiosink.cpp +++ b/src/multimedia/audio/qaudiosink.cpp @@ -123,9 +123,10 @@ QAudioSink::QAudioSink(const QAudioDevice &audioDevice, const QAudioFormat &form QObject(parent) { d = QPlatformMediaIntegration::instance()->devices()->audioOutputDevice(format, audioDevice); - if (d) { + if (d) connect(d, SIGNAL(stateChanged(QAudio::State)), SIGNAL(stateChanged(QAudio::State))); - } + else + qWarning() << ("No audio device detected"); } /*! @@ -144,7 +145,7 @@ QAudioSink::~QAudioSink() */ QAudioFormat QAudioSink::format() const { - return d->format(); + return d ? d->format() : QAudioFormat(); } /*! @@ -163,6 +164,8 @@ QAudioFormat QAudioSink::format() const */ void QAudioSink::start(QIODevice* device) { + if (!d) + return; d->elapsedTime.restart(); d->start(device); } @@ -186,6 +189,8 @@ void QAudioSink::start(QIODevice* device) */ QIODevice* QAudioSink::start() { + if (!d) + return nullptr; d->elapsedTime.restart(); return d->start(); } @@ -198,7 +203,8 @@ QIODevice* QAudioSink::start() */ void QAudioSink::stop() { - d->stop(); + if (d) + d->stop(); } /*! @@ -207,7 +213,8 @@ void QAudioSink::stop() */ void QAudioSink::reset() { - d->reset(); + if (d) + d->reset(); } /*! @@ -218,7 +225,8 @@ void QAudioSink::reset() */ void QAudioSink::suspend() { - d->suspend(); + if (d) + d->suspend(); } /*! @@ -231,7 +239,8 @@ void QAudioSink::suspend() */ void QAudioSink::resume() { - d->resume(); + if (d) + d->resume(); } /*! @@ -242,7 +251,7 @@ void QAudioSink::resume() */ qsizetype QAudioSink::bytesFree() const { - return d->bytesFree(); + return d ? d->bytesFree() : 0; } /*! @@ -255,7 +264,8 @@ qsizetype QAudioSink::bytesFree() const */ void QAudioSink::setBufferSize(qsizetype value) { - d->setBufferSize(value); + if (d) + d->setBufferSize(value); } /*! @@ -269,7 +279,7 @@ void QAudioSink::setBufferSize(qsizetype value) */ qsizetype QAudioSink::bufferSize() const { - return d->bufferSize(); + return d ? d->bufferSize() : 0; } /*! @@ -278,7 +288,7 @@ qsizetype QAudioSink::bufferSize() const */ qint64 QAudioSink::processedUSecs() const { - return d->processedUSecs(); + return d ? d->processedUSecs() : 0; } /*! @@ -287,7 +297,7 @@ qint64 QAudioSink::processedUSecs() const */ qint64 QAudioSink::elapsedUSecs() const { - return d->state() == QAudio::StoppedState ? 0 : d->elapsedTime.nsecsElapsed()/1000; + return state() == QAudio::StoppedState ? 0 : d->elapsedTime.nsecsElapsed()/1000; } /*! @@ -295,7 +305,7 @@ qint64 QAudioSink::elapsedUSecs() const */ QAudio::Error QAudioSink::error() const { - return d->error(); + return d ? d->error() : QAudio::OpenError; } /*! @@ -303,7 +313,7 @@ QAudio::Error QAudioSink::error() const */ QAudio::State QAudioSink::state() const { - return d->state(); + return d ? d->state() : QAudio::StoppedState; } /*! @@ -324,6 +334,8 @@ QAudio::State QAudioSink::state() const */ void QAudioSink::setVolume(qreal volume) { + if (!d) + return; qreal v = qBound(qreal(0.0), volume, qreal(1.0)); d->setVolume(v); } @@ -333,7 +345,7 @@ void QAudioSink::setVolume(qreal volume) */ qreal QAudioSink::volume() const { - return d->volume(); + return d ? d->volume() : 1.0; } /*! diff --git a/src/multimedia/audio/qaudiosource.cpp b/src/multimedia/audio/qaudiosource.cpp index a5f6de89d..4c2fb50b3 100644 --- a/src/multimedia/audio/qaudiosource.cpp +++ b/src/multimedia/audio/qaudiosource.cpp @@ -135,6 +135,9 @@ QAudioSource::QAudioSource(const QAudioDevice &audioDevice, const QAudioFormat & d = QPlatformMediaIntegration::instance()->devices()->audioInputDevice(format, audioDevice); if (d) connect(d, SIGNAL(stateChanged(QAudio::State)), SIGNAL(stateChanged(QAudio::State))); + else + qWarning() << ("No audio device detected"); + } /*! @@ -163,6 +166,8 @@ QAudioSource::~QAudioSource() void QAudioSource::start(QIODevice* device) { + if (!d) + return; d->elapsedTime.start(); d->start(device); } @@ -187,6 +192,8 @@ void QAudioSource::start(QIODevice* device) QIODevice* QAudioSource::start() { + if (!d) + return nullptr; d->elapsedTime.start(); return d->start(); } @@ -197,7 +204,7 @@ QIODevice* QAudioSource::start() QAudioFormat QAudioSource::format() const { - return d->format(); + return d ? d->format() : QAudioFormat(); } /*! @@ -209,7 +216,8 @@ QAudioFormat QAudioSource::format() const void QAudioSource::stop() { - d->stop(); + if (d) + d->stop(); } /*! @@ -218,7 +226,8 @@ void QAudioSource::stop() void QAudioSource::reset() { - d->reset(); + if (d) + d->reset(); } /*! @@ -230,7 +239,8 @@ void QAudioSource::reset() void QAudioSource::suspend() { - d->suspend(); + if (d) + d->suspend(); } /*! @@ -244,7 +254,8 @@ void QAudioSource::suspend() void QAudioSource::resume() { - d->resume(); + if (d) + d->resume(); } /*! @@ -259,7 +270,8 @@ void QAudioSource::resume() void QAudioSource::setBufferSize(qsizetype value) { - d->setBufferSize(value); + if (d) + d->setBufferSize(value); } /*! @@ -274,7 +286,7 @@ void QAudioSource::setBufferSize(qsizetype value) qsizetype QAudioSource::bufferSize() const { - return d->bufferSize(); + return d ? d->bufferSize() : 0; } /*! @@ -290,7 +302,7 @@ qsizetype QAudioSource::bytesAvailable() const -If not ActiveState|IdleState, return 0 -return amount of audio data available to read */ - return d->bytesReady(); + return d ? d->bytesReady() : 0; } /*! @@ -309,6 +321,8 @@ qsizetype QAudioSource::bytesAvailable() const */ void QAudioSource::setVolume(qreal volume) { + if (!d) + return; qreal v = qBound(qreal(0.0), volume, qreal(1.0)); d->setVolume(v); } @@ -321,7 +335,7 @@ void QAudioSource::setVolume(qreal volume) */ qreal QAudioSource::volume() const { - return d->volume(); + return d ? d->volume() : 1.0; } /*! @@ -331,7 +345,7 @@ qreal QAudioSource::volume() const qint64 QAudioSource::processedUSecs() const { - return d->processedUSecs(); + return d ? d->processedUSecs() : 0; } /*! @@ -343,7 +357,7 @@ qint64 QAudioSource::processedUSecs() const qint64 QAudioSource::elapsedUSecs() const { - return d->state() == QAudio::StoppedState ? 0 : d->elapsedTime.nsecsElapsed()/1000; + return state() == QAudio::StoppedState ? 0 : d->elapsedTime.nsecsElapsed()/1000; } /*! @@ -352,7 +366,7 @@ qint64 QAudioSource::elapsedUSecs() const QAudio::Error QAudioSource::error() const { - return d->error(); + return d ? d->error() : QAudio::OpenError; } /*! @@ -361,7 +375,7 @@ QAudio::Error QAudioSource::error() const QAudio::State QAudioSource::state() const { - return d->state(); + return d ? d->state() : QAudio::StoppedState; } /*! diff --git a/src/multimedia/platform/qplatformmediadevices.cpp b/src/multimedia/platform/qplatformmediadevices.cpp index 4ac1ec14c..fcedfe6ac 100644 --- a/src/multimedia/platform/qplatformmediadevices.cpp +++ b/src/multimedia/platform/qplatformmediadevices.cpp @@ -85,7 +85,7 @@ QPlatformAudioSource* QPlatformMediaDevices::audioInputDevice(const QAudioFormat if (info.isNull()) info = audioInputs().value(0); - QPlatformAudioSource* p = createAudioSource(info); + QPlatformAudioSource* p = !info.isNull() ? createAudioSource(info) : nullptr; if (p) p->setFormat(format); return p; @@ -97,7 +97,7 @@ QPlatformAudioSink* QPlatformMediaDevices::audioOutputDevice(const QAudioFormat if (info.isNull()) info = audioOutputs().value(0); - QPlatformAudioSink* p = createAudioSink(info); + QPlatformAudioSink* p = !info.isNull() ? createAudioSink(info) : nullptr; if (p) p->setFormat(format); return p; |