audio settings backend

master
zetaPRIME 2022-03-21 18:28:01 -04:00
parent c6e22d3521
commit 1ebc8f04c5
4 changed files with 60 additions and 5 deletions

View File

@ -5,6 +5,9 @@ using namespace Xybrid::Data;
#include "data/graph.h"
#include "data/porttypes.h"
#include "config/audioconfig.h"
using namespace Xybrid::Config;
#include "mainwindow.h"
#include "uisocket.h"
@ -91,7 +94,7 @@ void AudioEngine::initAudio(bool startNow) {
const QAudioDeviceInfo& deviceInfo = QAudioDeviceInfo::defaultOutputDevice();
QAudioFormat format;
format.setSampleRate(48000);
format.setSampleRate(sampleRate);
format.setChannelCount(2);
format.setSampleSize(16);
format.setCodec("audio/pcm");
@ -146,6 +149,8 @@ void AudioEngine::play(std::shared_ptr<Project> p, int fromPos) {
portLastNoteId.fill(0);
project->rootGraph->reset();
sampleRate = AudioConfig::playbackSampleRate;
bufferMs = AudioConfig::playbackBufferMs;
initAudio();
for (auto& b : buffer) {
b.clear();
@ -196,6 +201,8 @@ uint16_t AudioEngine::preview(std::shared_ptr<Project> p, int16_t port, int16_t
buf.clear();
project->rootGraph->reset();
sampleRate = AudioConfig::previewSampleRate;
bufferMs = AudioConfig::previewBufferMs;
initAudio();
for (auto& b : buffer) {
b.clear();
@ -252,6 +259,7 @@ 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

@ -0,0 +1,13 @@
#pragma once
namespace Xybrid::Config {
namespace AudioConfig {
extern int playbackSampleRate;
extern int playbackBufferMs;
extern int previewSampleRate;
extern int previewBufferMs;
extern int renderSampleRate;
}
}

View File

@ -1,3 +1,4 @@
#include "audioconfig.h"
#include "uiconfig.h"
#include "colorscheme.h"
#include "directories.h"
@ -6,6 +7,15 @@
using namespace Xybrid::Config;
// Audio defaults
int AudioConfig::playbackSampleRate = 48000;
int AudioConfig::playbackBufferMs = 64;
int AudioConfig::previewSampleRate = 48000;
int AudioConfig::previewBufferMs = 64;
int AudioConfig::renderSampleRate = 48000;
// UIConfig defaults
bool UIConfig::verticalKnobs = false;

View File

@ -2,6 +2,7 @@
#include "uisocket.h"
#include "config/audioconfig.h"
#include "config/uistate.h"
#include "config/uiconfig.h"
@ -33,8 +34,11 @@ using namespace Xybrid::Config;
namespace { // utilities
inline void load(QCborValueRef m, QString& v) { v = m.toString(v); }
inline void load(QCborValueRef m, bool& v) { v = m.toBool(v); }
inline void load(QCborValueRef m, int& v) { v = static_cast<int>(m.toInteger(v)); }
}
#define section(NAME) if (auto NAME = root[qs(#NAME)].toMap(); !NAME.isEmpty())
void FileOps::loadConfig() {
QFile file(Config::Directories::configFile);
if (file.open({QFile::ReadOnly})) { // file exists! read in
@ -42,15 +46,23 @@ void FileOps::loadConfig() {
auto root = QCborValue::fromCbor(read).toMap();
file.close();
if (auto dirs = root[qs("directories")].toMap(); !dirs.isEmpty()) {
load(dirs[qs("projects")], Directories::projects);
load(dirs[qs("presets")], Directories::presets);
section(directories) {
load(directories[qs("projects")], Directories::projects);
load(directories[qs("presets")], Directories::presets);
}
if (auto ui = root[qs("ui")].toMap(); !ui.isEmpty()) {
section(ui) {
load(ui[qs("verticalKnobs")], UIConfig::verticalKnobs);
}
section(audio) {
load(audio[qs("playbackSampleRate")], AudioConfig::playbackSampleRate);
load(audio[qs("playbackBufferMs")], AudioConfig::playbackBufferMs);
load(audio[qs("previewSampleRate")], AudioConfig::previewSampleRate);
load(audio[qs("previewBufferMs")], AudioConfig::previewBufferMs);
load(audio[qs("renderSampleRate")], AudioConfig::renderSampleRate);
}
}
// make sure directories exist
@ -84,6 +96,18 @@ void FileOps::saveConfig() {
root[qs("ui")] = ui;
}
{
QCborMap audio;
audio[qs("playbackSampleRate")] = AudioConfig::playbackSampleRate;
audio[qs("playbackBufferMs")] = AudioConfig::playbackBufferMs;
audio[qs("previewSampleRate")] = AudioConfig::previewSampleRate;
audio[qs("previewBufferMs")] = AudioConfig::previewBufferMs;
audio[qs("renderSampleRate")] = AudioConfig::renderSampleRate;
root[qs("audio")] = audio;
}
// write out
QCborStreamWriter w(&file);
root.toCborValue().toCbor(w);