diff options
| author | dvs1 | 2024-10-28 23:32:26 +1000 |
|---|---|---|
| committer | dvs1 | 2024-10-28 23:32:26 +1000 |
| commit | 04dffa36f6040b661bf1af8f98e2ce1978a7df33 (patch) | |
| tree | a206d1597cec0a1932794f693f335405ba24289b | |
| parent | More clean ups. (diff) | |
| download | JackOnAllDevices-04dffa36f6040b661bf1af8f98e2ce1978a7df33.zip JackOnAllDevices-04dffa36f6040b661bf1af8f98e2ce1978a7df33.tar.gz JackOnAllDevices-04dffa36f6040b661bf1af8f98e2ce1978a7df33.tar.bz2 JackOnAllDevices-04dffa36f6040b661bf1af8f98e2ce1978a7df33.tar.xz | |
Let the user pick the best sound device.
Diffstat (limited to '')
| -rwxr-xr-x | aataaj.lua | 77 |
1 files changed, 51 insertions, 26 deletions
| @@ -141,45 +141,44 @@ if _.runnable('espeak-ng') then speaker = 'espeak-ng' end | |||
| 141 | 141 | ||
| 142 | 142 | ||
| 143 | local Cards = {} | 143 | local Cards = {} |
| 144 | local cnt = 0 | ||
| 144 | 145 | ||
| 145 | print('Scanning for audio devices.') | 146 | print('Scanning for audio devices.') |
| 146 | local cards = __'ls -d1 /proc/asound/card[0-9]*':noErr():Do() | 147 | local cards = __'ls -d1 /proc/asound/card[0-9]*':noErr():Do() |
| 147 | for i,l in ipairs(cards.lines) do | 148 | for i,l in ipairs(cards.lines) do |
| 148 | local f, e = io.open(l .. '/id', 'r') | 149 | local f, e = io.open(l .. '/id', 'r') |
| 149 | if nil == f then print('Could not open ' .. l .. '/id') else | 150 | if nil == f then print('Could not open ' .. l .. '/id - ' .. e) else |
| 150 | Cards[l] = {path = l, name = f:read('*a'):sub(1, -2), devs = {}, captureDevs = {}, playbackDevs = {}, card=i} | 151 | local n = f:read('*a'):sub(1, -2) |
| 151 | if 'Loopback' ~= Cards[l]['name'] then | 152 | Cards[n] = {path = l, name = n, devs = {}, captureDevs = {}, playbackDevs = {}, card=i} |
| 152 | Cards[l]['capture'] = __('ls -d1 ' .. l .. '/pcm[0-9]*c*'):noErr():Do() | 153 | cnt = cnt + 1 |
| 153 | for j,c in ipairs(Cards[l]['capture'].lines) do | 154 | if 'Loopback' ~= Cards[n]['name'] then |
| 154 | local n = c:match('.*pcm(%d+).*') | 155 | Cards[n]['capture'] = __('ls -d1 ' .. l .. '/pcm[0-9]*c*'):noErr():Do() |
| 155 | Cards[l]['captureDevs'][j] = n | 156 | for j,c in ipairs(Cards[n]['capture'].lines) do |
| 156 | Cards[l]['devs'][n] = n | 157 | local m = c:match('.*pcm(%d+).*') |
| 157 | print('\tFound capture device: ' .. Cards[l]['name'] .. '\tDEVICE: ' .. Cards[l]['captureDevs'][j] .. ' ' .. n) | 158 | Cards[n]['captureDevs'][j] = m |
| 159 | Cards[n]['devs'][m] = m | ||
| 160 | print('\tFound capture device: ' .. Cards[n]['name'] .. '\tDEVICE: ' .. Cards[n]['captureDevs'][j] .. ' ' .. m) | ||
| 158 | io.flush() | 161 | io.flush() |
| 159 | end | 162 | end |
| 160 | Cards[l]['playback'] = __('ls -d1 ' .. l .. '/pcm[0-9]*p*'):noErr():Do() | 163 | Cards[n]['playback'] = __('ls -d1 ' .. l .. '/pcm[0-9]*p*'):noErr():Do() |
| 161 | for j,p in ipairs(Cards[l]['playback'].lines) do | 164 | for j,p in ipairs(Cards[n]['playback'].lines) do |
| 162 | local n = p:match('.*pcm(%d+).*') | 165 | local m = p:match('.*pcm(%d+).*') |
| 163 | Cards[l]['playbackDevs'][j] = n | 166 | Cards[n]['playbackDevs'][j] = m |
| 164 | Cards[l]['devs'][n] = n | 167 | Cards[n]['devs'][m] = m |
| 165 | print('\tFound playback device ' .. Cards[l].card - 1 .. ' : ' .. Cards[l]['name'] .. '\tDEVICE: ' .. Cards[l]['playbackDevs'][j] .. ' ' .. n) | 168 | print('\tFound playback device ' .. Cards[n].card - 1 .. ' : ' .. Cards[n]['name'] .. '\tDEVICE: ' .. Cards[n]['playbackDevs'][j] .. ' ' .. m) |
| 166 | io.flush() | 169 | io.flush() |
| 167 | if 'JACK' ~= arg[1] then | 170 | if 'JACK' ~= arg[1] then |
| 168 | print('\t\tALSA_CARD=' .. Cards[l].card - 1 .. ' ' .. speaker .. ' "Found playback device ' .. Cards[l].card - 1 .. ' : ' .. Cards[l]['name'] .. ' DEVICE: ' .. Cards[l]['playbackDevs'][j] .. ' ' .. n .. '"') | 171 | print('\t\tALSA_CARD=' .. Cards[n].card - 1 .. ' ' .. speaker .. ' "Found playback device ' .. Cards[n].card - 1 .. ' : ' .. Cards[n]['name'] .. ' DEVICE: ' .. Cards[n]['playbackDevs'][j] .. ' ' .. m .. '"') |
| 169 | io.flush() | 172 | io.flush() |
| 170 | end | 173 | end |
| 171 | end | 174 | end |
| 172 | end | 175 | end |
| 173 | end | 176 | end |
| 174 | end | 177 | end |
| 178 | table.sort(Cards, function(a, b) return a.card < b.card end) | ||
| 175 | print('') | 179 | print('') |
| 176 | io.flush() | 180 | io.flush() |
| 177 | 181 | ||
| 178 | -- #Cards kept telling me 0, no number indexes. | ||
| 179 | local cnt = 0 | ||
| 180 | for i,C in pairs(Cards) do | ||
| 181 | cnt = cnt + 1 | ||
| 182 | end | ||
| 183 | 182 | ||
| 184 | print('Your ' .. cnt .. ' audio devices are ') | 183 | print('Your ' .. cnt .. ' audio devices are ') |
| 185 | for k,C in pairs(Cards) do | 184 | for k,C in pairs(Cards) do |
| @@ -193,13 +192,28 @@ io.flush() | |||
| 193 | for k,C in pairs(Cards) do | 192 | for k,C in pairs(Cards) do |
| 194 | print('' .. C.card - 1 .. ' : ' .. C.name) | 193 | print('' .. C.card - 1 .. ' : ' .. C.name) |
| 195 | __('echo "' .. C.card - 1 .. ' : ' .. C.name .. '"') | 194 | __('echo "' .. C.card - 1 .. ' : ' .. C.name .. '"') |
| 196 | __('ALSA_CARD=' .. C.card - 1 .. ' ' .. speaker .. ' "Device ' .. C.card - 1 .. ' ' .. C.name .. '"'):log():noErr():noOut():Do() | 195 | __('ALSA_CARD=' .. C.card - 1 .. ' ' .. speaker .. ' "Device number ' .. C.card - 1 .. ' ' .. C.name .. '"'):log():noErr():noOut():Do() |
| 197 | io.flush() | 196 | io.flush() |
| 198 | __'sleep 1':Do() | 197 | __'sleep 1':Do() |
| 199 | end | 198 | end |
| 200 | print('') | 199 | print('') |
| 201 | io.flush() | 200 | io.flush() |
| 202 | 201 | ||
| 202 | for k,C in pairs(Cards) do | ||
| 203 | print('' .. C.card - 1 .. ' : ' .. C.name) | ||
| 204 | __('ALSA_CARD=' .. C.card - 1 .. ' ' .. speaker .. ' "Please type the device number you heard best."'):log():noErr():noOut():fork() | ||
| 205 | end | ||
| 206 | io.write('Please type the device number you heard best - ') | ||
| 207 | local choice = tonumber(io.read()) -- Lua has no way of just checking IF there is ANY input, so can't do "check if there was a keypress, continue if not". | ||
| 208 | local ourCard = '' | ||
| 209 | |||
| 210 | for k,C in pairs(Cards) do | ||
| 211 | if (C.card - 1) == choice then | ||
| 212 | print('You choose ' .. choice .. ' ' .. C.name) | ||
| 213 | ourCard = C.name | ||
| 214 | end | ||
| 215 | end | ||
| 216 | |||
| 203 | 217 | ||
| 204 | if 'start' == arg[1] then | 218 | if 'start' == arg[1] then |
| 205 | __('mkdir -p ' .. options.asoundrcPath.value):Do() | 219 | __('mkdir -p ' .. options.asoundrcPath.value):Do() |
| @@ -218,10 +232,8 @@ if 'start' == arg[1] then | |||
| 218 | ]]) | 232 | ]]) |
| 219 | a:close() | 233 | a:close() |
| 220 | end | 234 | end |
| 221 | local a, e = io.open(options.asoundrcPath.value .. '/' .. options.asoundrc.value, 'w') | 235 | |
| 222 | if nil == a then print('Could not open ' .. options.asoundrcPath.value .. '/' .. options.asoundrc.value) else | 236 | local outCard = function(a, C, j) |
| 223 | for i,C in pairs(Cards) do | ||
| 224 | for j,c in pairs(C['devs']) do | ||
| 225 | a:write('pcm.' .. C['name'] .. j .. ' {\n') | 237 | a:write('pcm.' .. C['name'] .. j .. ' {\n') |
| 226 | a:write(' type hw\n') | 238 | a:write(' type hw\n') |
| 227 | a:write(' card ' .. C['name'] .. '\n') | 239 | a:write(' card ' .. C['name'] .. '\n') |
| @@ -232,6 +244,19 @@ if 'start' == arg[1] then | |||
| 232 | a:write(' card ' .. C['name'] .. '\n') | 244 | a:write(' card ' .. C['name'] .. '\n') |
| 233 | a:write(' device ' .. C['devs'][j] .. '\n') | 245 | a:write(' device ' .. C['devs'][j] .. '\n') |
| 234 | a:write('}\n\n') | 246 | a:write('}\n\n') |
| 247 | end | ||
| 248 | |||
| 249 | local a, e = io.open(options.asoundrcPath.value .. '/' .. options.asoundrc.value, 'w') | ||
| 250 | if nil == a then print('Could not open ' .. options.asoundrcPath.value .. '/' .. options.asoundrc.value .. ' - ' .. e) else | ||
| 251 | print('Writing suggested ALSA configuration file to ' .. options.asoundrcPath.value .. '/' .. options.asoundrc.value) | ||
| 252 | if '' ~= ourCard then | ||
| 253 | outCard(a, Cards[ourCard], '0') -- How the fuck is that a string? | ||
| 254 | end | ||
| 255 | for i,C in pairs(Cards) do | ||
| 256 | for j,c in pairs(C['devs']) do | ||
| 257 | if C.name ~= ourCard then | ||
| 258 | outCard(a, C, j) | ||
| 259 | end | ||
| 235 | end | 260 | end |
| 236 | end | 261 | end |
| 237 | a:write([[ | 262 | a:write([[ |
