summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-05-06 12:22:16 +0800
committerTim Blechmann <tim@klingt.org>2024-05-08 10:40:34 +0800
commitccbf3993463b69307a4bd67c3e631d37a98bb2c0 (patch)
tree17329919f75a85f2c563a369908d52d43b1a2b9c
parent2c59e31801a51cddde8f713eb72a380ead96c542 (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.cpp22
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstreameraudiooutput.cpp17
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");
}