43 QList<QAudioDevice> devices;
47 if (snd_device_name_hint(-1,
"pcm", &hints) < 0) {
48 qWarning() <<
"no alsa devices available";
52 std::string_view filter = (mode == QAudioDevice::Input) ?
"Input" :
"Output";
54 QAlsaAudioDeviceInfo *sysdefault =
nullptr;
56 auto makeDeviceInfo = [&filter, mode](
void *entry) -> QAlsaAudioDeviceInfo * {
57 unique_str name{ snd_device_name_get_hint(entry,
"NAME") };
58 if (name && name !=
"null") {
59 unique_str descr{ snd_device_name_get_hint(entry,
"DESC") };
60 unique_str io{ snd_device_name_get_hint(entry,
"IOID") };
62 if (descr && (!io || (io == filter))) {
63 auto *infop =
new QAlsaAudioDeviceInfo{
65 QString::fromUtf8(descr.get()),
74 bool hasDefault =
false;
77 QAlsaAudioDeviceInfo *infop = makeDeviceInfo(*n++);
80 devices.append(infop->create());
81 if (!hasDefault && infop->id.startsWith(
"default")) {
82 infop->isDefault =
true;
85 if (!sysdefault && infop->id.startsWith(
"sysdefault"))
90 if (!hasDefault && sysdefault) {
92 sysdefault->isDefault =
true;
95 if (!hasDefault && devices.size() > 0) {
97 QAlsaAudioDeviceInfo *infop = makeDeviceInfo(hints[0]);
99 infop->isDefault =
true;
100 devices.prepend(infop->create());
104 snd_device_name_free_hint(hints);