audio settings kind of works now

master
zetaPRIME 2022-03-21 19:40:08 -04:00
parent 1ebc8f04c5
commit 41a591a957
3 changed files with 238 additions and 14 deletions

View File

@ -143,14 +143,16 @@ void AudioEngine::play(std::shared_ptr<Project> 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<Project> 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<Project> 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<Project> p, QString fileName) {
tempo = project->tempo;
tickAcc = 0;
sampleRate = AudioConfig::renderSampleRate;
initAudio(); // we actually need the period size. whoops.
QFileInfo fi(fileName);

View File

@ -5,11 +5,16 @@ using namespace Xybrid;
#include <QDialogButtonBox>
#include <QPushButton>
#include <QRegularExpression>
#include <QDebug>
#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);
}

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>646</width>
<height>562</height>
<width>350</width>
<height>360</height>
</rect>
</property>
<property name="windowTitle">
@ -34,13 +34,182 @@
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tabAudio">
<attribute name="title">
<string>Audio</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>4</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Playback Sample Rate</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="playbackSampleRate"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_2" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
<number>4</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Playback Buffer Size</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="playbackBufferMs"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_3" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<property name="spacing">
<number>4</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Preview Sample Rate</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="previewSampleRate"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_5" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<property name="spacing">
<number>4</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>Preview Buffer Size</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="previewBufferMs"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_4" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="spacing">
<number>4</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Rendering Sample Rate</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="renderSampleRate"/>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabUI">
<property name="minimumSize">
<size>
<width>642</width>
<height>0</height>
</size>
</property>
<attribute name="title">
<string>UI</string>
</attribute>
@ -113,7 +282,7 @@
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel</set>
<set>QDialogButtonBox::Apply|QDialogButtonBox::Close</set>
</property>
</widget>
</item>