This is rather puzzling, since the test I use to include the mixer in the list is exactly the ability to generate the Tone used at 30sec.
Since I take it you have a CS background, here's what is going on... The test I use to determine the mixers is as follows
public static List<Mixer> getOutputs() {
List<Mixer> mixers = outputs(AudioSystem.getMixer(null), AudioSystem.getMixerInfo());
return mixers;
}
protected static List<Mixer> outputs(Mixer defaultMixer, Mixer.Info[] infos) {
List<Mixer> mixers = new ArrayList<Mixer>();
for (Mixer.Info info : infos) {
Mixer mixer = AudioSystem.getMixer(info);
try {
if (!mixer.getMixerInfo().toString().startsWith("Java")) {
AudioFormat af = new AudioFormat(8000f, 8, 1, true, false);
if (AudioSystem.getSourceDataLine(af, info) != null) {
mixers.add(mixer);
}
}
} catch (IllegalArgumentException e) {
} catch (LineUnavailableException e) {
}
}
return mixers;
}
and the code that generates the Tone (and most likely generates the exception you are seeing), is as follows
(the red boxed exceptions are "brute-force" converted to RuntimeExceptions so they percolate all the way up to the UI.
af = new AudioFormat(8000f, 8, 1, true, false);
try {
sdl = AudioSystem.getSourceDataLine(af, mixer.getMixerInfo());
} catch (LineUnavailableException e) {
throw new RuntimeException(e);
}