forked from n7tae/mvoice
-
Notifications
You must be signed in to change notification settings - Fork 0
/
SettingsDlgALSA.cpp
111 lines (102 loc) · 3.09 KB
/
SettingsDlgALSA.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
* Copyright (c) 2019-2021 by Thomas A. Early N7TAE
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <iostream>
#include <alsa/asoundlib.h>
#include "SettingsDlg.h"
void CSettingsDlg::AudioRescanButton()
{
auto inchoice = pAudioInputChoice->value();
if (inchoice < 0)
inchoice = 0;
auto outchoice = pAudioOutputChoice->value();
if (outchoice < 0)
outchoice = 0;
void **hints;
if (snd_device_name_hint(-1, "pcm", &hints) < 0)
return;
void **n = hints;
pAudioInputChoice->clear();
pAudioOutputChoice->clear();
AudioInMap.clear();
AudioOutMap.clear();
while (*n != NULL) {
char *name = snd_device_name_get_hint(*n, "NAME");
if (NULL == name) {
n++;
continue;
}
char *desc = snd_device_name_get_hint(*n, "DESC");
if (NULL == desc) {
free(name);
n++;
continue;
}
if ((0==strcmp(name, "default") || strstr(name, "plughw")) && NULL==strstr(desc, "without any conversions")) {
char *io = snd_device_name_get_hint(*n, "IOID");
bool is_input = true, is_output = true;
if (io) { // io == NULL means it's for both input and output
if (0 == strcasecmp(io, "Input")) {
is_output = false;
} else if (0 == strcasecmp(io, "Output")) {
is_input = false;
} else {
std::cerr << "ERROR: unexpected IOID=" << io << std::endl;
}
free(io);
}
std::string short_name(name);
auto pos = short_name.find("plughw:CARD=");
if (short_name.npos != pos) {
short_name = short_name.replace(pos, 12, "");
pos = short_name.find(",DEV=0");
if (short_name.npos != pos)
short_name = short_name.replace(pos, 6, "");
if (0 == short_name.size())
short_name.assign(name);
}
if (is_input) {
snd_pcm_t *handle;
if (snd_pcm_open(&handle, name, SND_PCM_STREAM_CAPTURE, 0) == 0) {
AudioInMap[short_name] = std::pair<std::string, std::string>(name, desc);
snd_pcm_close(handle);
pAudioInputChoice->add(short_name.c_str());
}
}
if (is_output) {
snd_pcm_t *handle;
if (snd_pcm_open(&handle, name, SND_PCM_STREAM_PLAYBACK, 0) == 0) {
AudioOutMap[short_name] = std::pair<std::string, std::string>(name, desc);
snd_pcm_close(handle);
pAudioOutputChoice->add(short_name.c_str());
}
}
}
if (name) {
free(name);
}
if (desc) {
free(desc);
}
n++;
}
snd_device_name_free_hint(hints);
pAudioInputChoice->value(inchoice);
AudioInputChoice();
pAudioOutputChoice->value(outchoice);
AudioOutputChoice();
}