From 41a591a95756ba25889a70510fdd0a7895d1a028 Mon Sep 17 00:00:00 2001 From: zetaPRIME Date: Mon, 21 Mar 2022 19:40:08 -0400 Subject: [PATCH] audio settings kind of works now --- xybrid/audio/audioengine.cpp | 18 +++- xybrid/settingsdialog.cpp | 47 +++++++++ xybrid/settingsdialog.ui | 187 +++++++++++++++++++++++++++++++++-- 3 files changed, 238 insertions(+), 14 deletions(-) diff --git a/xybrid/audio/audioengine.cpp b/xybrid/audio/audioengine.cpp index 1cf13a0..a700980 100644 --- a/xybrid/audio/audioengine.cpp +++ b/xybrid/audio/audioengine.cpp @@ -143,14 +143,16 @@ void AudioEngine::play(std::shared_ptr p, int fromPos) { if (!p) return; // nope project = p; + // load audio settings + sampleRate = AudioConfig::playbackSampleRate; + bufferMs = AudioConfig::playbackBufferMs; + // stop and reset, then init playback queueValid = false; queue.clear(); portLastNoteId.fill(0); project->rootGraph->reset(); - sampleRate = AudioConfig::playbackSampleRate; - bufferMs = AudioConfig::playbackBufferMs; initAudio(); for (auto& b : buffer) { b.clear(); @@ -196,13 +198,16 @@ uint16_t AudioEngine::preview(std::shared_ptr p, int16_t port, int16_t deinitAudio(); project = p; + // load audio settings + sampleRate = AudioConfig::previewSampleRate; + bufferMs = AudioConfig::previewBufferMs; + + // reset state queueValid = false; queue.clear(); buf.clear(); project->rootGraph->reset(); - sampleRate = AudioConfig::previewSampleRate; - bufferMs = AudioConfig::previewBufferMs; initAudio(); for (auto& b : buffer) { b.clear(); @@ -244,6 +249,10 @@ void AudioEngine::render(std::shared_ptr p, QString fileName) { mode = Rendering; QMetaObject::invokeMethod(this, [this, fileName] { + // load sample rate + sampleRate = AudioConfig::renderSampleRate; + + // reset state queueValid = false; queue.clear(); portLastNoteId.fill(0); @@ -259,7 +268,6 @@ void AudioEngine::render(std::shared_ptr p, QString fileName) { tempo = project->tempo; tickAcc = 0; - sampleRate = AudioConfig::renderSampleRate; initAudio(); // we actually need the period size. whoops. QFileInfo fi(fileName); diff --git a/xybrid/settingsdialog.cpp b/xybrid/settingsdialog.cpp index 08ca0de..9eb80cc 100644 --- a/xybrid/settingsdialog.cpp +++ b/xybrid/settingsdialog.cpp @@ -5,11 +5,16 @@ using namespace Xybrid; #include #include +#include +#include #include "fileops.h" +#include "config/audioconfig.h" #include "config/uiconfig.h" using namespace Xybrid::Config; +#include "util/strings.h" + SettingsDialog* SettingsDialog::instance = nullptr; namespace { @@ -21,6 +26,36 @@ namespace { v = o->isChecked(); }); } + + const QRegularExpression numeric("[0-9.]+"); + + void bind(QComboBox* o, int& v, const QStringList& items) { + o->clear(); + o->addItems(items); + int ld = 100000000; + QString cm; + for (auto& i : items) { // find closest match + auto q = numeric.match(i).captured().toInt(); + int id = std::abs(q - v); + if (id < ld) { + ld = id; + cm = i; + } + } + o->setCurrentText(cm); + bnd->push_back([o, &v] { // convert back to int + v = numeric.match(o->currentText()).captured().toInt(); + }); + } + + void bind(QSpinBox* o, int& v, int min, int max, const QString& suffix = { }) { + o->setRange(min, max); + o->setValue(std::clamp(v, min, max)); + o->setSuffix(suffix); + bnd->push_back([o, &v] { + v = o->value(); + }); + } } SettingsDialog::SettingsDialog(QWidget *parent) : @@ -33,6 +68,18 @@ SettingsDialog::SettingsDialog(QWidget *parent) : instance = this; bnd = &this->binds; + // audio page + QStringList sampleRates = { qs("44100Hz"), qs("48000Hz"), qs("96000Hz") }; + const constexpr int minBufMs = 5, maxBufMs = 250; + const QString ms = qs("ms"); + + bind(ui->playbackSampleRate, AudioConfig::playbackSampleRate, sampleRates); + bind(ui->playbackBufferMs, AudioConfig::playbackBufferMs, minBufMs, maxBufMs, ms); + bind(ui->previewSampleRate, AudioConfig::previewSampleRate, sampleRates); + bind(ui->previewBufferMs, AudioConfig::previewBufferMs, minBufMs, maxBufMs, ms); + bind(ui->renderSampleRate, AudioConfig::renderSampleRate, sampleRates); + + // UI page bind(ui->checkVerticalKnobs, UIConfig::verticalKnobs); } diff --git a/xybrid/settingsdialog.ui b/xybrid/settingsdialog.ui index ef4724c..31fe4e0 100644 --- a/xybrid/settingsdialog.ui +++ b/xybrid/settingsdialog.ui @@ -6,8 +6,8 @@ 0 0 - 646 - 562 + 350 + 360 @@ -34,13 +34,182 @@ 0 + + + Audio + + + + + + + 4 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Playback Sample Rate + + + + + + + + + + + + + + 4 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Playback Buffer Size + + + + + + + + + + + + + + 4 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Preview Sample Rate + + + + + + + + + + + + + + 4 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Preview Buffer Size + + + + + + + + + + + + + + 4 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Rendering Sample Rate + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + - - - 642 - 0 - - UI @@ -113,7 +282,7 @@ Qt::Horizontal - QDialogButtonBox::Apply|QDialogButtonBox::Cancel + QDialogButtonBox::Apply|QDialogButtonBox::Close