Abstract AudioPlayer into Renderer to reduce coupling

pull/35/head
James Ball 2021-04-16 18:56:17 +01:00
rodzic c08076d4ce
commit cee2b19165
6 zmienionych plików z 60 dodań i 39 usunięć

Wyświetl plik

@ -0,0 +1,8 @@
package sh.ball;
public interface MovableRenderer<S, T> extends Renderer<S> {
void setRotationSpeed(double speed);
void setTranslation(T translation);
void setTranslationSpeed(double speed);
void setScale(double scale);
}

Wyświetl plik

@ -0,0 +1,7 @@
package sh.ball;
public interface Renderer<T> extends Runnable {
void stop();
void setQuality(double quality);
void addFrame(T frame);
}

Wyświetl plik

@ -1,5 +1,6 @@
package sh.ball.audio;
import sh.ball.MovableRenderer;
import xt.audio.Enums.XtSample;
import xt.audio.Enums.XtSetup;
import xt.audio.Enums.XtSystem;
@ -25,14 +26,15 @@ import sh.ball.shapes.Vector2;
import java.util.List;
public class AudioPlayer implements Runnable {
public class AudioPlayer implements MovableRenderer<List<Shape>, Vector2> {
private static final int SAMPLE_RATE = 192000;
private static final int BUFFER_SIZE = 20;
private final XtMix MIX = new XtMix(SAMPLE_RATE, XtSample.FLOAT32);
private final XtChannels CHANNELS = new XtChannels(0, 0, 2, 0);
private final XtFormat FORMAT = new XtFormat(MIX, CHANNELS);
private final BlockingQueue<List<Shape>> frameQueue;
private final BlockingQueue<List<Shape>> frameQueue = new ArrayBlockingQueue<>(BUFFER_SIZE);
private List<Shape> frame;
private int currentShape = 0;
@ -48,18 +50,14 @@ public class AudioPlayer implements Runnable {
private volatile boolean stopped;
public AudioPlayer(BlockingQueue<List<Shape>> frameQueue) {
this.frameQueue = frameQueue;
}
public AudioPlayer() {}
public AudioPlayer(ArrayBlockingQueue<List<Shape>> frameQueue, double rotateSpeed,
double translateSpeed, Vector2 translateVector, double scale, double weight) {
this(frameQueue);
setRotateSpeed(rotateSpeed);
public AudioPlayer(double rotateSpeed, double translateSpeed, Vector2 translateVector, double scale, double weight) {
setRotationSpeed(rotateSpeed);
setTranslationSpeed(translateSpeed);
setTranslation(translateVector);
setScale(scale);
setWeight(weight);
setQuality(weight);
}
private int render(XtStream stream, XtBuffer buffer, Object user) throws InterruptedException {
@ -136,20 +134,29 @@ public class AudioPlayer implements Runnable {
return shape;
}
public void setRotateSpeed(double speed) {
@Override
public void setRotationSpeed(double speed) {
this.rotateSpeed = speed;
}
@Override
public void setTranslation(Vector2 translation) {
this.translateVector = translation;
}
@Override
public void setTranslationSpeed(double speed) {
translateSpeed = speed;
}
@Override
public void setScale(double scale) {
this.scale = scale;
}
public void setWeight(double weight) {
this.weight = weight;
@Override
public void setQuality(double quality) {
this.weight = quality;
}
private Shape getCurrentShape() {
@ -195,12 +202,19 @@ public class AudioPlayer implements Runnable {
}
}
public void stopPlaying() {
@Override
public void stop() {
stopped = true;
}
public void setTranslationSpeed(Double speed) {
translateSpeed = speed;
@Override
public void addFrame(List<Shape> frame) {
try {
frameQueue.put(frame);
} catch (InterruptedException e) {
e.printStackTrace();
System.err.println("Frame missed.");
}
}
private static final class Phase {

Wyświetl plik

@ -1,9 +1,9 @@
package sh.ball.audio;
import sh.ball.Renderer;
import sh.ball.engine.Vector3;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import sh.ball.parser.FileParser;
@ -14,26 +14,21 @@ import sh.ball.shapes.Shape;
public class FrameProducer implements Runnable {
private final BlockingQueue<List<Shape>> frameQueue;
private final Renderer<List<Shape>> renderer;
private ObjParser objParser;
private SvgParser svgParser;
private TextParser textParser;
private FileParser parser;
public FrameProducer(BlockingQueue<List<Shape>> frameQueue) {
this.frameQueue = frameQueue;
public FrameProducer(Renderer<List<Shape>> renderer) {
this.renderer = renderer;
}
@Override
public void run() {
while (true) {
try {
frameQueue.put(parser.nextFrame());
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("Frame missed.");
}
renderer.addFrame(parser.nextFrame());
}
}

Wyświetl plik

@ -1,5 +1,6 @@
package sh.ball.gui;
import sh.ball.MovableRenderer;
import sh.ball.audio.AudioPlayer;
import sh.ball.audio.FrameProducer;
import sh.ball.engine.Vector3;
@ -9,8 +10,6 @@ import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import javafx.beans.InvalidationListener;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
@ -29,13 +28,12 @@ import sh.ball.shapes.Vector2;
public class Controller implements Initializable {
private static final int BUFFER_SIZE = 20;
private static final String DEFAULT_FILE = "src/main/resources/models/cube.obj";
private final FileChooser fileChooser = new FileChooser();
private final BlockingQueue<List<Shape>> frameQueue = new ArrayBlockingQueue<>(BUFFER_SIZE);
private final AudioPlayer player = new AudioPlayer(frameQueue);
private final FrameProducer producer = new FrameProducer(frameQueue);
private final MovableRenderer<List<Shape>, Vector2> renderer = new AudioPlayer();
private final FrameProducer producer = new FrameProducer(renderer);
private Stage stage;
@ -79,13 +77,13 @@ public class Controller implements Initializable {
private Map<Slider, SliderUpdater<Double>> initializeSliderMap() {
return Map.of(
weightSlider,
new SliderUpdater<>(weightLabel::setText, player::setWeight),
new SliderUpdater<>(weightLabel::setText, renderer::setQuality),
rotateSpeedSlider,
new SliderUpdater<>(rotateSpeedLabel::setText, player::setRotateSpeed),
new SliderUpdater<>(rotateSpeedLabel::setText, renderer::setRotationSpeed),
translationSpeedSlider,
new SliderUpdater<>(translationSpeedLabel::setText, player::setTranslationSpeed),
new SliderUpdater<>(translationSpeedLabel::setText, renderer::setTranslationSpeed),
scaleSlider,
new SliderUpdater<>(scaleLabel::setText, player::setScale),
new SliderUpdater<>(scaleLabel::setText, renderer::setScale),
focalLengthSlider,
new SliderUpdater<>(focalLengthLabel::setText, producer::setFocalLength)
);
@ -104,7 +102,7 @@ public class Controller implements Initializable {
}
InvalidationListener translationUpdate = observable ->
player.setTranslation(new Vector2(
renderer.setTranslation(new Vector2(
tryParse(translationXTextField.getText()),
tryParse(translationYTextField.getText())
));
@ -132,7 +130,7 @@ public class Controller implements Initializable {
});
new Thread(producer).start();
new Thread(player).start();
new Thread(renderer).start();
}
private double tryParse(String value) {

Wyświetl plik

@ -1,6 +1,5 @@
package sh.ball.gui;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;