summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoni Poikelin <joni.poikelin@qt.io>2024-01-31 07:24:35 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-02-02 05:17:55 +0000
commit96315754830fd62f46d0b16346c9419d2abbbaf8 (patch)
treea796ccf6221337e08159d2b88ecf2c8e4fb5e204
parente900ec338db4d3b9308534ef7f9ae3bef6ac000c (diff)
alsa: Try to use sysdefault if default device has not been set
In some configurations there is no "default" device at all, but there may be "sysdefault" device. Outputting to non-existent "default" device in some systems seems to cause buffer underrun errors to occur. Task-number: QTBUG-114900 Pick-to: 6.6 6.5 Change-Id: I5311ec95af8938aa04ddec838b762ab3482f953f Reviewed-by: Artem Dyomin <artem.dyomin@qt.io> (cherry picked from commit e54f02fde0cb2902e367468107709d17a3a1a60c) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/multimedia/alsa/qalsamediadevices.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/multimedia/alsa/qalsamediadevices.cpp b/src/multimedia/alsa/qalsamediadevices.cpp
index 98b4c1362..5a133e9d1 100644
--- a/src/multimedia/alsa/qalsamediadevices.cpp
+++ b/src/multimedia/alsa/qalsamediadevices.cpp
@@ -41,6 +41,8 @@ static QList<QAudioDevice> availableDevices(QAudioDevice::Mode mode)
filter = "Output";
}
+ QAlsaAudioDeviceInfo* sysdefault = nullptr;
+
while (*n != NULL) {
name = snd_device_name_get_hint(*n, "NAME");
if (name != 0 && qstrcmp(name, "null") != 0) {
@@ -50,10 +52,13 @@ static QList<QAudioDevice> availableDevices(QAudioDevice::Mode mode)
if ((descr != NULL) && ((io == NULL) || (io == filter))) {
auto *infop = new QAlsaAudioDeviceInfo(name, QString::fromUtf8(descr), mode);
devices.append(infop->create());
- if (strcmp(name, "default") == 0) {
+ if (!hasDefault && strcmp(name, "default") == 0) {
infop->isDefault = true;
hasDefault = true;
}
+ else if (!sysdefault && !hasDefault && strcmp(name, "sysdefault") == 0) {
+ sysdefault = infop;
+ }
}
free(descr);
@@ -64,6 +69,11 @@ static QList<QAudioDevice> availableDevices(QAudioDevice::Mode mode)
}
snd_device_name_free_hint(hints);
+ if (!hasDefault && sysdefault) {
+ // Make "sysdefault" the default device if there is no "default" device exists
+ sysdefault->isDefault = true;
+ hasDefault = true;
+ }
if (!hasDefault && devices.size() > 0) {
auto infop = new QAlsaAudioDeviceInfo("default", QString(), QAudioDevice::Output);
infop->isDefault = true;