sclass AudioLine { Mixer mixer; Line.Info lineInfo; *() {} *(Mixer *mixer, Line.Info *lineInfo) {} Line open() ctex { ret mixer.getLine(lineInfo); } static S renderMixerInfo(Mixer.Info info) { ret info.getName() + " / " + info.getVendor() + " / " + info.getDescription() + " / " + info.getVersion(); } toString { ret shortClassName(mixer) + "/" + shortClassName(lineInfo.getLineClass()) + " " + renderMixerInfo(mixer.getMixerInfo()) + " :: " + lineInfo; } Class lineClass() { ret lineInfo.getLineClass(); } } static L allAudioLines() { ret concatMap(listAudioDevices(), f allAudioLines); } static L allAudioLines(Mixer m) { new L l; for (Line.Info lineInfo : concatLists( asList(m.getTargetLineInfo()), asList(m.getSourceLineInfo()))) l.add(new AudioLine(m, lineInfo)); ret l; }