+ }
+ };
+ }
+
+ //
+ // CONTROLLED METHODS
+ //
+
+ @Override
+ public String name() {
+ return "Audio Output";
+ }
+
+ @Override
+ public Metadata metadata() {
+ return metadata;
+ }
+
+ @Override
+ public List<Controller<?>> controllers() {
+ return Arrays.<Controller<?>>asList(volumeFader, muteSwitch);
+ }
+
+ //
+ // SINK METHODS
+ //
+
+ @Override
+ public void open(Metadata metadata) throws IOException {
+ Preconditions.checkArgument(metadata.encoding().equalsIgnoreCase("PCM"), "source must be PCM-encoded");
+ AudioFormat audioFormat = new AudioFormat(metadata.frequency(), 16, metadata.channels(), true, false);
+ try {
+ sourceDataLine = AudioSystem.getSourceDataLine(audioFormat);
+ sourceDataLine.open(audioFormat);
+ sourceDataLine.start();
+ } catch (LineUnavailableException e) {
+ /* TODO */
+ throw new IOException(e);