!7 srecord AudioSource { S description; S volume, baseVolume; int index; } module ListAudioSources > DynObjectTable { start { dontPersist(); doEvery(0.0, 10.0, r updateList); } void updateList enter { LS lines = lines(backtick("pactl list sources")); new Matches m; new L list; for i over lines: if (swic(lines.get(i), "Source #")) { int idx = parseFirstInt(lines.get(i)); AudioSource as = nu(AudioSource, index := idx, description := lines.get(i)); for (int j = i+1; j < l(lines); j++) { S line = lines.get(j); if (!startsWithSpace(line)) break; line = trim(line); if (swic_trim(line, "Description:", m)) as.description = m.rest(); else if (swic_trim(line, "Base Volume:", m)) as.baseVolume = m.rest(); else if (swic_trim(line, "Volume:", m)) as.volume = m.rest(); } list.add(as); } setData(list); } }