X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsonitus%2Fdata%2Fsink%2FAudioSink.java;h=a0a4c6a255fb6b319b6b2cbf46073656584d428c;hb=c548332c486d812bfce23a9121219bf86ecc5588;hp=611dcd97219a92b9b49d3eac929de5be661691a9;hpb=b61d311f6fd16ccf65decf3b29e9b06bb58406cd;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 611dcd9..a0a4c6a 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,8 +36,10 @@ 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; +import com.google.common.eventbus.EventBus; /** * {@link Sink} implementation that uses the JDK’s {@link AudioSystem} to play @@ -49,6 +52,9 @@ public class AudioSink implements Sink { /** The logger. */ private static final Logger logger = Logger.getLogger(AudioSink.class.getName()); + /** The event bus. */ + private final EventBus eventBus; + /** The volume fader. */ private final Fader volumeFader; @@ -61,9 +67,34 @@ public class AudioSink implements Sink { /** The audio output. */ private SourceDataLine sourceDataLine; - /** Creates a new audio sink. */ - public AudioSink() { - super(); + /** 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. + * + * @param eventBus + * The event bus + */ + public AudioSink(EventBus eventBus) { + this.eventBus = eventBus; volumeFader = new Fader("Volume") { @Override @@ -98,6 +129,16 @@ public class AudioSink implements Sink { // @Override + public String name() { + return "Audio Output"; + } + + @Override + public Metadata metadata() { + return metadata; + } + + @Override public List> controllers() { return Arrays.>asList(volumeFader, muteSwitch); } @@ -129,11 +170,12 @@ public class AudioSink implements Sink { @Override public void metadataUpdated(Metadata metadata) { logger.info(String.format("Now playing %s.", metadata)); + this.metadata = metadata; } @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)); }