diff options
author | Joni Poikelin <joni.poikelin@qt.io> | 2024-01-31 07:24:35 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-02-02 05:17:55 +0000 |
commit | 96315754830fd62f46d0b16346c9419d2abbbaf8 (patch) | |
tree | a796ccf6221337e08159d2b88ecf2c8e4fb5e204 | |
parent | e900ec338db4d3b9308534ef7f9ae3bef6ac000c (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.cpp | 12 |
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; |