Implement fixed-time recordings

pull/35/head
James Ball 2021-07-10 21:53:24 +01:00
rodzic 544ef5b635
commit 9703acde53
2 zmienionych plików z 70 dodań i 19 usunięć

Wyświetl plik

@ -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);

Wyświetl plik

@ -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:&#10; &#10;" />
<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:&#10; &#10;" />
<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">