kopia lustrzana https://github.com/jameshball/osci-render
Abstract AudioPlayer into Renderer to reduce coupling
rodzic
c08076d4ce
commit
cee2b19165
|
@ -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);
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
package sh.ball;
|
||||
|
||||
public interface Renderer<T> extends Runnable {
|
||||
void stop();
|
||||
void setQuality(double quality);
|
||||
void addFrame(T frame);
|
||||
}
|
|
@ -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 {
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package sh.ball.gui;
|
||||
|
||||
|
||||
import javafx.application.Application;
|
||||
import javafx.application.Platform;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
|
|
Ładowanie…
Reference in New Issue