kopia lustrzana https://github.com/jameshball/osci-render
Implement fixed-time recordings
rodzic
544ef5b635
commit
9703acde53
|
@ -61,6 +61,7 @@ public class Controller implements Initializable, FrequencyListener, Listener {
|
|||
private FrequencyAnalyser<List<Shape>> analyser;
|
||||
private final AudioDevice defaultDevice;
|
||||
private boolean recording = false;
|
||||
private Timeline recordingTimeline;
|
||||
private String lastVisitedDirectory;
|
||||
|
||||
private FrameProducer<List<Shape>> producer;
|
||||
|
@ -85,6 +86,12 @@ public class Controller implements Initializable, FrequencyListener, Listener {
|
|||
@FXML
|
||||
private Label recordLabel;
|
||||
@FXML
|
||||
private TextField recordTextField;
|
||||
@FXML
|
||||
private CheckBox recordCheckBox;
|
||||
@FXML
|
||||
private Label recordLengthLabel;
|
||||
@FXML
|
||||
private TextField translationXTextField;
|
||||
@FXML
|
||||
private TextField translationYTextField;
|
||||
|
@ -264,6 +271,11 @@ public class Controller implements Initializable, FrequencyListener, Listener {
|
|||
|
||||
recordButton.setOnAction(event -> toggleRecord());
|
||||
|
||||
recordCheckBox.selectedProperty().addListener((e, oldVal, newVal) -> {
|
||||
recordLengthLabel.setDisable(!newVal);
|
||||
recordTextField.setDisable(!newVal);
|
||||
});
|
||||
|
||||
updateObjectRotateSpeed();
|
||||
|
||||
audioPlayer.addEffect(EffectType.SCALE, scaleEffect);
|
||||
|
@ -321,27 +333,62 @@ public class Controller implements Initializable, FrequencyListener, Listener {
|
|||
|
||||
private void toggleRecord() {
|
||||
recording = !recording;
|
||||
boolean timedRecord = recordCheckBox.isSelected();
|
||||
if (recording) {
|
||||
if (timedRecord) {
|
||||
double recordingLength;
|
||||
try {
|
||||
recordingLength = Double.parseDouble(recordTextField.getText());
|
||||
} catch (NumberFormatException e) {
|
||||
recordLabel.setText("Please set a valid record length");
|
||||
recording = false;
|
||||
return;
|
||||
}
|
||||
recordButton.setText("Cancel");
|
||||
KeyFrame kf1 = new KeyFrame(
|
||||
Duration.seconds(0),
|
||||
e -> audioPlayer.startRecord()
|
||||
);
|
||||
KeyFrame kf2 = new KeyFrame(
|
||||
Duration.seconds(recordingLength),
|
||||
e -> {
|
||||
saveRecording();
|
||||
recording = false;
|
||||
}
|
||||
);
|
||||
recordingTimeline = new Timeline(kf1, kf2);
|
||||
Platform.runLater(recordingTimeline::play);
|
||||
} else {
|
||||
recordButton.setText("Stop Recording");
|
||||
audioPlayer.startRecord();
|
||||
}
|
||||
recordLabel.setText("Recording...");
|
||||
recordButton.setText("Stop Recording");
|
||||
audioPlayer.startRecord();
|
||||
} else if (timedRecord) {
|
||||
recordingTimeline.stop();
|
||||
recordLabel.setText("");
|
||||
recordButton.setText("Record");
|
||||
audioPlayer.stopRecord();
|
||||
} else {
|
||||
saveRecording();
|
||||
}
|
||||
}
|
||||
|
||||
private void saveRecording() {
|
||||
try {
|
||||
recordButton.setText("Record");
|
||||
AudioInputStream input = audioPlayer.stopRecord();
|
||||
try {
|
||||
File file = fileChooser.showSaveDialog(stage);
|
||||
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
|
||||
Date date = new Date(System.currentTimeMillis());
|
||||
if (file == null) {
|
||||
file = new File("out-" + formatter.format(date) + ".wav");
|
||||
}
|
||||
AudioSystem.write(input, AudioFileFormat.Type.WAVE, file);
|
||||
input.close();
|
||||
recordLabel.setText("Saved to " + file.getAbsolutePath());
|
||||
} catch (IOException e) {
|
||||
recordLabel.setText("Error saving file");
|
||||
e.printStackTrace();
|
||||
File file = fileChooser.showSaveDialog(stage);
|
||||
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
|
||||
Date date = new Date(System.currentTimeMillis());
|
||||
if (file == null) {
|
||||
file = new File("out-" + formatter.format(date) + ".wav");
|
||||
}
|
||||
AudioSystem.write(input, AudioFileFormat.Type.WAVE, file);
|
||||
input.close();
|
||||
recordLabel.setText("Saved to " + file.getAbsolutePath());
|
||||
} catch (IOException e) {
|
||||
recordLabel.setText("Error saving file");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -423,7 +470,8 @@ public class Controller implements Initializable, FrequencyListener, Listener {
|
|||
try {
|
||||
frameSets.add(ParserFactory.getParser(file.getAbsolutePath()).parse());
|
||||
frameSetPaths.add(file.getName());
|
||||
} catch (IOException ignored) {}
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
jkLabel.setVisible(false);
|
||||
|
|
|
@ -49,12 +49,15 @@
|
|||
<children>
|
||||
<Button fx:id="chooseFileButton" layoutX="14.0" layoutY="53.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="114.0" text="Choose File" />
|
||||
<Label fx:id="fileLabel" layoutX="144.0" layoutY="57.0" maxWidth="270.0" prefHeight="18.0" prefWidth="246.0" text="cube.obj" />
|
||||
<Button fx:id="recordButton" layoutX="14.0" layoutY="129.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="114.0" text="Record" />
|
||||
<Label fx:id="recordLabel" layoutX="144.0" layoutY="133.0" maxWidth="270.0" prefHeight="18.0" prefWidth="245.0" />
|
||||
<Label id="frequency" fx:id="frequencyLabel" layoutX="13.0" layoutY="208.0" prefHeight="58.0" prefWidth="376.0" text="L/R Frequency: " />
|
||||
<Button fx:id="recordButton" layoutX="13.0" layoutY="142.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="114.0" text="Record" />
|
||||
<Label fx:id="recordLabel" layoutX="13.0" layoutY="184.0" maxWidth="358.0" prefHeight="18.0" prefWidth="357.0" />
|
||||
<Label id="frequency" fx:id="frequencyLabel" layoutX="13.0" layoutY="212.0" prefHeight="58.0" prefWidth="376.0" text="L/R Frequency: " />
|
||||
<ComboBox fx:id="deviceComboBox" layoutX="14.0" layoutY="11.0" prefHeight="26.0" prefWidth="376.0" />
|
||||
<Button fx:id="chooseFolderButton" layoutX="14.0" layoutY="91.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="114.0" text="Choose Folder" />
|
||||
<Label fx:id="jkLabel" layoutX="143.0" layoutY="95.0" maxWidth="270.0" prefHeight="18.0" prefWidth="246.0" text="Use j and k to cycle between files" visible="false" />
|
||||
<TextField fx:id="recordTextField" disable="true" layoutX="300.0" layoutY="154.0" prefHeight="26.0" prefWidth="70.0" text="2.0" />
|
||||
<Label fx:id="recordLengthLabel" disable="true" layoutX="290.0" layoutY="128.0" text="Record length (s)" />
|
||||
<CheckBox fx:id="recordCheckBox" layoutX="143.0" layoutY="146.0" mnemonicParsing="false" text="Timed record" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<TitledPane collapsible="false" layoutX="12.0" layoutY="289.0" prefHeight="239.0" prefWidth="402.0" text="Image settings">
|
||||
|
|
Ładowanie…
Reference in New Issue