X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsonitus%2Fdata%2Fsink%2FAudioSink.java;h=f7ab938d569e73ec52247ab15d4bede54900dc2a;hb=09f8bd2297dc864e24baa67c65be97104e00c320;hp=720b9198b39c20cfa4ab3248472ad5a20caadcaf;hpb=95eb945b04d1071315531e913196fdfaab08ac51;p=sonitus.git diff --git a/src/main/java/net/pterodactylus/sonitus/data/sink/AudioSink.java b/src/main/java/net/pterodactylus/sonitus/data/sink/AudioSink.java index 720b919..f7ab938 100644 --- a/src/main/java/net/pterodactylus/sonitus/data/sink/AudioSink.java +++ b/src/main/java/net/pterodactylus/sonitus/data/sink/AudioSink.java @@ -20,6 +20,7 @@ package net.pterodactylus.sonitus.data.sink; import static javax.sound.sampled.FloatControl.Type.VOLUME; import java.io.IOException; +import java.io.OutputStream; import java.util.Arrays; import java.util.List; import java.util.logging.Logger; @@ -35,6 +36,7 @@ import net.pterodactylus.sonitus.data.Sink; import net.pterodactylus.sonitus.data.Source; import net.pterodactylus.sonitus.data.controller.Fader; import net.pterodactylus.sonitus.data.controller.Switch; +import net.pterodactylus.sonitus.io.IntegralWriteOutputStream; import com.google.common.base.Preconditions; @@ -61,28 +63,47 @@ public class AudioSink implements Sink { /** The audio output. */ private SourceDataLine sourceDataLine; + /** A buffered output stream to ensure correct writing to the source data line. */ + private OutputStream sourceDataLineOutputStream = new IntegralWriteOutputStream(new OutputStream() { + + @Override + public void write(int b) throws IOException { + } + + @Override + public void write(byte[] b) throws IOException { + write(b, 0, b.length); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + if (sourceDataLine != null) { + sourceDataLine.write(b, off, len); + } + } + }, 1024); + /** Creates a new audio sink. */ public AudioSink() { - super(); - volumeFader = new Fader() { + volumeFader = new Fader("Volume") { @Override - protected void valueSet(int value) { + protected void valueSet(Double value) { if (sourceDataLine != null) { FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(VOLUME); - volumeControl.setValue(value * volumeControl.getMaximum() / (float) maximum()); + volumeControl.setValue((float) (value * volumeControl.getMaximum())); } } }; - muteSwitch = new Switch() { + muteSwitch = new Switch("Mute") { private float previousValue; @Override - protected void valueSet(int value) { + protected void valueSet(Boolean value) { if (sourceDataLine != null) { FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(VOLUME); - if (value == 1) { + if (value) { previousValue = volumeControl.getValue(); volumeControl.setValue(0); } else { @@ -98,8 +119,13 @@ public class AudioSink implements Sink { // @Override - public List controllers() { - return Arrays.asList(volumeFader, muteSwitch); + public String name() { + return "Audio Output"; + } + + @Override + public List> controllers() { + return Arrays.>asList(volumeFader, muteSwitch); } // @@ -132,8 +158,8 @@ public class AudioSink implements Sink { } @Override - public void process(byte[] buffer) { - sourceDataLine.write(buffer, 0, buffer.length); + public void process(byte[] buffer) throws IOException { + sourceDataLineOutputStream.write(buffer); logger.finest(String.format("AudioSink: Wrote %d Bytes.", buffer.length)); }