package net.pterodactylus.sonitus.data.sink;
+import static javax.sound.sampled.FloatControl.Type.VOLUME;
+
import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
import java.util.logging.Logger;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
+import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
+import net.pterodactylus.sonitus.data.Controller;
import net.pterodactylus.sonitus.data.Metadata;
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 com.google.common.base.Preconditions;
/** The logger. */
private static final Logger logger = Logger.getLogger(AudioSink.class.getName());
+ /** The volume fader. */
+ private final Fader volumeFader;
+
+ /** The “mute” switch. */
+ private final Switch muteSwitch;
+
/** The current metadata. */
private Metadata metadata;
/** The audio output. */
private SourceDataLine sourceDataLine;
+ /** Creates a new audio sink. */
+ public AudioSink() {
+ super();
+ volumeFader = new Fader() {
+
+ @Override
+ protected void valueSet(Double value) {
+ if (sourceDataLine != null) {
+ FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(VOLUME);
+ volumeControl.setValue((float) (value * volumeControl.getMaximum()));
+ }
+ }
+ };
+ muteSwitch = new Switch() {
+
+ private float previousValue;
+
+ @Override
+ protected void valueSet(Boolean value) {
+ if (sourceDataLine != null) {
+ FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(VOLUME);
+ if (value) {
+ previousValue = volumeControl.getValue();
+ volumeControl.setValue(0);
+ } else {
+ volumeControl.setValue(previousValue);
+ }
+ }
+ }
+ };
+ }
+
+ //
+ // CONTROLLED METHODS
+ //
+
+ @Override
+ public List<Controller<?>> controllers() {
+ return Arrays.<Controller<?>>asList(volumeFader, muteSwitch);
+ }
+
//
// SINK METHODS
//