diff options
author | Tim Blechmann <tim@klingt.org> | 2024-05-06 12:22:16 +0800 |
---|---|---|
committer | Tim Blechmann <tim@klingt.org> | 2024-05-08 10:40:34 +0800 |
commit | ccbf3993463b69307a4bd67c3e631d37a98bb2c0 (patch) | |
tree | 17329919f75a85f2c563a369908d52d43b1a2b9c | |
parent | 2c59e31801a51cddde8f713eb72a380ead96c542 (diff) |
GStreamer: use alsasrc/sink when configured for alsa
When configured for alsa, the gstreamer backend used to crash, since
casted to `QGStreamerAudioDeviceInfo`, which was never used. We avoid
this codepath and tirectly construct the alsasrc/alsasink and set the
intendend device explicitly.
Fixes: QTBUG-125080
Pick-to: 6.5 6.7
Change-Id: I95b383df88b8b36de3bc396447176826eae6880d
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
-rw-r--r-- | src/plugins/multimedia/gstreamer/common/qgstreameraudioinput.cpp | 22 | ||||
-rw-r--r-- | src/plugins/multimedia/gstreamer/common/qgstreameraudiooutput.cpp | 17 |
2 files changed, 27 insertions, 12 deletions
diff --git a/src/plugins/multimedia/gstreamer/common/qgstreameraudioinput.cpp b/src/plugins/multimedia/gstreamer/common/qgstreameraudioinput.cpp index 0381b921e..59d40097e 100644 --- a/src/plugins/multimedia/gstreamer/common/qgstreameraudioinput.cpp +++ b/src/plugins/multimedia/gstreamer/common/qgstreameraudioinput.cpp @@ -67,21 +67,29 @@ void QGstreamerAudioInput::setAudioDevice(const QAudioDevice &device) return; qCDebug(qLcMediaAudioInput) << "setAudioInput" << device.description() << device.isNull(); m_audioDevice = device; + const QByteArray &id = m_audioDevice.id(); QGstElement newSrc; if constexpr (QT_CONFIG(pulseaudio)) { - auto id = m_audioDevice.id(); newSrc = QGstElement::createFromFactory("pulsesrc", "audiosrc"); - if (!newSrc.isNull()) + if (newSrc) newSrc.set("device", id.constData()); else - qCWarning(qLcMediaAudioInput) << "Invalid audio device"; - } else { - auto *deviceInfo = static_cast<const QGStreamerAudioDeviceInfo *>(m_audioDevice.handle()); - if (deviceInfo && deviceInfo->gstDevice) - newSrc = QGstElement::createFromDevice(deviceInfo->gstDevice, "audiosrc"); + qCWarning(qLcMediaAudioInput) << "Cannot create pulsesrc"; + } else if constexpr (QT_CONFIG(alsa)) { + newSrc = QGstElement::createFromFactory("alsasrc", "audiosrc"); + if (newSrc) + newSrc.set("device", id.constData()); else + qCWarning(qLcMediaAudioInput) << "Cannot create alsasrc"; + } else { + auto *gstDeviceInfo = + dynamic_cast<const QGStreamerAudioDeviceInfo *>(m_audioDevice.handle()); + if (gstDeviceInfo && gstDeviceInfo->gstDevice) { + newSrc = QGstElement::createFromDevice(gstDeviceInfo->gstDevice, "audiosrc"); + } else { qCWarning(qLcMediaAudioInput) << "Invalid audio device"; + } } if (newSrc.isNull()) { diff --git a/src/plugins/multimedia/gstreamer/common/qgstreameraudiooutput.cpp b/src/plugins/multimedia/gstreamer/common/qgstreameraudiooutput.cpp index f45c371e9..2ad619fb2 100644 --- a/src/plugins/multimedia/gstreamer/common/qgstreameraudiooutput.cpp +++ b/src/plugins/multimedia/gstreamer/common/qgstreameraudiooutput.cpp @@ -74,17 +74,23 @@ void QGstreamerAudioOutput::setAudioDevice(const QAudioDevice &info) return; qCDebug(qLcMediaAudioOutput) << "setAudioOutput" << info.description() << info.isNull(); m_audioOutput = info; + const QByteArray &id = m_audioOutput.id(); QGstElement newSink; if constexpr (QT_CONFIG(pulseaudio)) { - auto id = m_audioOutput.id(); newSink = QGstElement::createFromFactory("pulsesink", "audiosink"); - if (!newSink.isNull()) + if (newSink) newSink.set("device", id.constData()); else - qCWarning(qLcMediaAudioOutput) << "Invalid audio device"; + qCWarning(qLcMediaAudioOutput) << "Cannot create pulsesink"; + } else if constexpr (QT_CONFIG(alsa)) { + newSink = QGstElement::createFromFactory("alsasink", "audiosink"); + if (newSink) + newSink.set("device", id.constData()); + else + qCWarning(qLcMediaAudioOutput) << "Cannot create alsasink"; } else { - auto *deviceInfo = static_cast<const QGStreamerAudioDeviceInfo *>(m_audioOutput.handle()); + auto *deviceInfo = dynamic_cast<const QGStreamerAudioDeviceInfo *>(m_audioOutput.handle()); if (deviceInfo && deviceInfo->gstDevice) newSink = QGstElement::createFromDevice(deviceInfo->gstDevice, "audiosink"); else @@ -92,7 +98,8 @@ void QGstreamerAudioOutput::setAudioDevice(const QAudioDevice &info) } if (newSink.isNull()) { - qCWarning(qLcMediaAudioOutput) << "Failed to create a gst element for the audio device, using a default audio sink"; + qCWarning(qLcMediaAudioOutput) << "Failed to create a gst element for the audio " + "device using a default audio sink"; newSink = QGstElement::createFromFactory("autoaudiosink", "audiosink"); } |