From 96315754830fd62f46d0b16346c9419d2abbbaf8 Mon Sep 17 00:00:00 2001 From: Joni Poikelin Date: Wed, 31 Jan 2024 07:24:35 +0200 Subject: 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 (cherry picked from commit e54f02fde0cb2902e367468107709d17a3a1a60c) Reviewed-by: Qt Cherry-pick Bot --- src/multimedia/alsa/qalsamediadevices.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 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 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 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; -- cgit v1.2.3