!7 sclass AudioSource { int index; S description; } 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)); S desc = lines.get(i); for (int j = i+1; j < l(lines); j++) if (swic_trim(trim(lines.get(j)), "Description: ", m)) break with desc = m.rest(); list.add(nu(AudioSource, index := idx, description := desc)); } setData(list); } }