package com.xenoage.zong.desktop.gui.dialogs;
import static com.xenoage.utils.jse.javafx.FXUtils.getValue;
import static com.xenoage.utils.jse.javafx.FXUtils.setValue;
import static javafx.collections.FXCollections.observableArrayList;
import java.io.File;
import java.util.List;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.stage.FileChooser;
import lombok.Getter;
import com.xenoage.utils.jse.javafx.Dialog;
import com.xenoage.utils.jse.javafx.FileChooserUtils;
import com.xenoage.utils.jse.settings.Settings;
import com.xenoage.utils.lang.Lang;
import com.xenoage.zong.Voc;
import com.xenoage.zong.desktop.io.filefilter.SoundbankFileFilter;
import com.xenoage.zong.desktop.io.midi.out.SynthManager;
/**
* Controller for the <code>AudioSettingsDialog.fxml</code>.
*
* @author Andreas Wenger
*/
public class AudioSettingsDialog
extends Dialog {
@FXML private Pane root;
@FXML private ComboBox<String> cmbDeviceName;
@FXML private ComboBox<String> cmbSampleRateHz;
@FXML private ComboBox<String> cmbChannels;
@FXML private ComboBox<String> cmbBits;
@FXML private ComboBox<String> cmbLatencyMs;
@FXML private ComboBox<String> cmbMaxPolyphony;
@FXML private ComboBox<String> cmbInterpolation;
@FXML private Label lblSoundbank;
@FXML private Button btnSoundbankUseDefault;
@FXML private Button btnSoundbankSelect;
@Getter private String soundbankPath = "";
public void initialize() {
//fill device names and select default value
List<String> deviceNames = SynthManager.getAudioMixers();
deviceNames.add(0, Lang.get(Voc.Default));
cmbDeviceName.setItems(observableArrayList(deviceNames));
cmbDeviceName.getSelectionModel().select(0);
//fill other settings
cmbSampleRateHz.setItems(observableArrayList("11025", "22050", "44100"));
cmbSampleRateHz.getSelectionModel().select(2);
cmbChannels.setItems(observableArrayList("1", "2"));
cmbChannels.getSelectionModel().select(1);
cmbBits.setItems(observableArrayList("8", "16"));
cmbBits.getSelectionModel().select(1);
cmbLatencyMs.setItems(observableArrayList("100", "200", "400", "800"));
cmbLatencyMs.getSelectionModel().select(0);
cmbMaxPolyphony.setItems(observableArrayList("32", "64", "96", "128", "256"));
cmbMaxPolyphony.getSelectionModel().select(1);
cmbInterpolation.setItems(observableArrayList(
Lang.get(Voc.Linear), Lang.get(Voc.Cubic),
Lang.get(Voc.Sinc), Lang.get(Voc.Point)));
cmbInterpolation.getSelectionModel().select(0);
//fill with current values, if available
Settings s = Settings.getInstance();
String file = SynthManager.configFile;
setValue(cmbDeviceName, s.getSetting("devicename", file));
setValue(cmbSampleRateHz, s.getSetting("samplerate", file));
setValue(cmbChannels, s.getSetting("channels", file));
setValue(cmbBits, s.getSetting("bits", file));
setValue(cmbLatencyMs, s.getSetting("latency", file));
setValue(cmbMaxPolyphony, s.getSetting("polyphony", file));
setValue(cmbInterpolation, s.getSetting("interpolation", file));
String soundbank = s.getSetting("soundbank", file);
if (soundbank != null && soundbank.length() > 0) {
try {
File soundbankFile = new File(soundbank);
if (soundbankFile.exists()) {
soundbankPath = soundbankFile.getAbsolutePath();
lblSoundbank.setText(soundbankFile.getName());
}
} catch (Exception ex) {
}
}
}
@Override public void onStageInit() {
stage.setTitle(Lang.get(Voc.AudioSettings));
}
@FXML void onSoundbankSelect(ActionEvent event) {
FileChooser fc = new FileChooser();
FileChooserUtils.setInitialDir(fc, soundbankPath);
fc.getExtensionFilters().addAll(new FileChooser.ExtensionFilter(
SoundbankFileFilter.getDescription(), SoundbankFileFilter.getExtensions()));
File file = fc.showOpenDialog(stage);
if (file != null) {
soundbankPath = file.getAbsolutePath();
lblSoundbank.setText(file.getName());
}
}
@FXML void onSoundbankUseDefault(ActionEvent event) {
lblSoundbank.setText(Lang.get(Voc.Default));
}
@FXML void onOK(ActionEvent event) {
Settings s = Settings.getInstance();
String file = SynthManager.configFile;
s.setSetting("devicename", file, cmbDeviceName.getSelectionModel().getSelectedIndex() == 0 ?
"" : getValue(cmbDeviceName));
s.setSetting("samplerate", file, getValue(cmbSampleRateHz));
s.setSetting("channels", file, getValue(cmbChannels));
s.setSetting("bits", file, getValue(cmbBits));
s.setSetting("latency", file, getValue(cmbLatencyMs));
s.setSetting("polyphony", file, getValue(cmbMaxPolyphony));
s.setSetting("interpolation", file, getValue(cmbInterpolation));
s.setSetting("soundbank", file, soundbankPath);
s.save(file);
onOK();
}
@FXML void onCancel(ActionEvent event) {
onCancel();
}
}