42 QList<QAudioDevice> devices;
46 if (snd_device_name_hint(-1,
"pcm", &hints) < 0) {
47 qWarning() <<
"no alsa devices available";
51 std::string_view filter = (mode == QAudioDevice::Input) ?
"Input" :
"Output";
53 QAlsaAudioDeviceInfo *sysdefault =
nullptr;
55 auto makeDeviceInfo = [&filter, mode](
void *entry) -> std::unique_ptr<QAlsaAudioDeviceInfo> {
56 unique_str name{ snd_device_name_get_hint(entry,
"NAME") };
57 if (name && name !=
"null") {
58 unique_str descr{ snd_device_name_get_hint(entry,
"DESC") };
59 unique_str io{ snd_device_name_get_hint(entry,
"IOID") };
61 if (descr && (!io || (io == filter))) {
62 auto info = std::make_unique<QAlsaAudioDeviceInfo>(
63 name.get(), QString::fromUtf8(descr.get()), mode);
70 bool hasDefault =
false;
73 std::unique_ptr<QAlsaAudioDeviceInfo> info = makeDeviceInfo(*n++);
76 if (!hasDefault && info->id.startsWith(
"default")) {
77 info->isDefault =
true;
80 if (!sysdefault && info->id.startsWith(
"sysdefault"))
81 sysdefault = info.get();
82 devices.append(QAudioDevicePrivate::createQAudioDevice(std::move(info)));
86 if (!hasDefault && sysdefault) {
88 sysdefault->isDefault =
true;
91 if (!hasDefault && devices.size() > 0) {
93 std::unique_ptr<QAlsaAudioDeviceInfo> info = makeDeviceInfo(hints[0]);
95 info->isDefault =
true;
96 devices.prepend(QAudioDevicePrivate::createQAudioDevice(std::move(info)));
100 snd_device_name_free_hint(hints);