summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoris Verria <doris.verria@qt.io>2022-01-13 07:48:32 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-01-13 09:02:05 +0000
commit349d81b571e89b6365c131506785f43fd5a1fa48 (patch)
tree209a1ee5486cb7f5245e878421459bc280ab962a
parent74f08fdd28f03581eb9594525f9ef066347ed1e6 (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.cpp3
-rw-r--r--src/multimedia/audio/qaudiosink.cpp42
-rw-r--r--src/multimedia/audio/qaudiosource.cpp40
-rw-r--r--src/multimedia/platform/qplatformmediadevices.cpp4
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;