From 2edc44936ee96596031e026ba7fd3cde9a644ab3 Mon Sep 17 00:00:00 2001 From: Tim Schneeberger Date: Sun, 23 Jul 2023 01:07:27 +0200 Subject: [PATCH] feat: implement new libjamesdsp features & fix bugs 1. Compander: support for time-frequency transforms parameter 2. Stereo widener: fixed broken audio when enaling without setting strength 3. Convolver benchmarking: Add setting to disable benchmarks on boot (Pipewire only) --- libjamesdsp/libjamesdsp.pro | 58 ++++++++++++++++++++- src/MainWindow.cpp | 5 -- src/audio/base/DspHost.cpp | 1 + src/audio/pipewire/PwJamesDspPlugin.cpp | 4 +- src/audio/pulseaudio/wrapper/gstjamesdsp.c | 3 +- src/config/AppConfig.cpp | 2 + src/config/AppConfig.h | 2 + src/interface/fragment/SettingsFragment.cpp | 25 ++++++--- src/interface/fragment/SettingsFragment.h | 1 + src/interface/fragment/SettingsFragment.ui | 50 +++++++++++++++++- 10 files changed, 136 insertions(+), 15 deletions(-) diff --git a/libjamesdsp/libjamesdsp.pro b/libjamesdsp/libjamesdsp.pro index eb839211..fd6a7959 100644 --- a/libjamesdsp/libjamesdsp.pro +++ b/libjamesdsp/libjamesdsp.pro @@ -57,7 +57,21 @@ HEADERS += \ $$BASEPATH/jdsp_header.h \ EELStdOutExtension.h \ PrintfStdOutExtension.h \ - JdspImpResToolbox.h + JdspImpResToolbox.h \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/cxpre.h \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/cxxsrc/xcomplex.h \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/cxxsrc/xreal.h \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/doc/xcomplex.h \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/doc/xreal.h \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/hpaconf.h \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/mp/const07.h \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/mp/const11.h \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/mp/const15.h \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/mp/const19.h \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/mp/const23.h \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/mp/const27.h \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/mp/const31.h \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xpre.h SOURCES += \ $$BASEPATH/Effects/arbEqConv.c \ @@ -107,6 +121,45 @@ SOURCES += \ EELStdOutExtension.c \ PrintfStdOutExtension.c \ JdspImpResToolbox.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/loose_eel.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/atox.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/constant.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/cxaop.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/cxbasic.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/cxconstant.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/cxconvf.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/cxexp.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/cxhypb.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/cxidiv.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/cxpow.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/cxprcmp.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/cxtrig.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/hpaconf.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/prcxpr.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/print.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/prxpr.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/sfmod.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/shift.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xadd.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xchcof.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xdiv.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xevtch.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xexp.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xfmod.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xfrac.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xhypb.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xivhypb.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xivtrg.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xlog.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xmul.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xneg.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xprcmp.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xpwr.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xsigerr.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xsqrt.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xtodbl.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xtoflt.c \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/xtrig.c \ subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/multimodalEQ.c unix { @@ -120,3 +173,6 @@ unix { else: error("Static linking only available on Linux systems") !isEmpty(target.path): INSTALLS += target + +DISTFILES += \ + subtree/Main/libjamesdsp/jni/jamesdsp/jdsp/Effects/eel2/numericSys/HPFloat/doc/hpa.txt diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 19b7d698..67cbaa03 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -137,11 +137,6 @@ MainWindow::MainWindow(bool statupInTray, // GraphicEQ ui->graphicEq->setEnableSwitchVisible(true); ui->graphicEq->setAutoEqAvailable(true); - - // Compander - // TODO remove this once the option is actually implemented in libjamesdsp - ui->label_5->setVisible(false); - ui->comp_tf_transforms->setVisible(false); } // Allocate pointers and init important variables diff --git a/src/audio/base/DspHost.cpp b/src/audio/base/DspHost.cpp index 75a0f3bb..88d68e21 100755 --- a/src/audio/base/DspHost.cpp +++ b/src/audio/base/DspHost.cpp @@ -556,6 +556,7 @@ bool DspHost::update(DspConfig *config, bool ignoreCache) StereoEnhancementEnable(cast(this->_dsp)); else StereoEnhancementDisable(cast(this->_dsp)); + StereoEnhancementSetParam(cast(this->_dsp), _cache->get(DspConfig::stereowide_level) / 100.0f); break; case DspConfig::stereowide_level: StereoEnhancementDisable(cast(this->_dsp)); diff --git a/src/audio/pipewire/PwJamesDspPlugin.cpp b/src/audio/pipewire/PwJamesDspPlugin.cpp index 336c778a..6c3005c9 100644 --- a/src/audio/pipewire/PwJamesDspPlugin.cpp +++ b/src/audio/pipewire/PwJamesDspPlugin.cpp @@ -1,6 +1,8 @@ #include "PwJamesDspPlugin.h" #include +#include "config/AppConfig.h" + extern "C" { #ifdef DEBUG_FPE #include @@ -27,7 +29,7 @@ PwJamesDspPlugin::PwJamesDspPlugin(PwPipelineManager* pipe_manager, IAudioServic #ifdef DEBUG_FPE feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT & ~FE_INVALID); #endif - JamesDSPGlobalMemoryAllocation(); + JamesDSPGlobalMemoryAllocation((int)AppConfig::instance().get(AppConfig::BenchmarkOnBoot)); JamesDSPInit(this->dsp, 128, 48000); #ifdef DEBUG_FPE fedisableexcept(FE_ALL_EXCEPT & ~FE_INEXACT & ~FE_INVALID); diff --git a/src/audio/pulseaudio/wrapper/gstjamesdsp.c b/src/audio/pulseaudio/wrapper/gstjamesdsp.c index c1151e00..8fefd7cc 100644 --- a/src/audio/pulseaudio/wrapper/gstjamesdsp.c +++ b/src/audio/pulseaudio/wrapper/gstjamesdsp.c @@ -112,7 +112,8 @@ gst_jamesdsp_init(Gstjamesdsp *self) { self->dsp = malloc(sizeof(JamesDSPLib)); memset(self->dsp, 0, sizeof(JamesDSPLib)); - JamesDSPGlobalMemoryAllocation(); + // TODO: Add benchmark toggle support to pulse version... + JamesDSPGlobalMemoryAllocation(0); JamesDSPInit(self->dsp, 128, 48000); self->enable = FALSE; diff --git a/src/config/AppConfig.cpp b/src/config/AppConfig.cpp index 4563d94d..8a810218 100644 --- a/src/config/AppConfig.cpp +++ b/src/config/AppConfig.cpp @@ -43,6 +43,8 @@ AppConfig::AppConfig() DEFINE_KEY(AudioAppBlocklistInvert, false); DEFINE_KEY(AudioInactivityTimeout, 10); + DEFINE_KEY(BenchmarkOnBoot, true); + DEFINE_KEY(AeqPlotDarkMode, false); DEFINE_KEY(ConvolverDefaultPath, ENCLOSE_QUOTES(getPath("irs"))); diff --git a/src/config/AppConfig.h b/src/config/AppConfig.h index 90670b52..23dbe48a 100644 --- a/src/config/AppConfig.h +++ b/src/config/AppConfig.h @@ -67,6 +67,8 @@ class AppConfig : AudioAppBlocklistInvert, AudioInactivityTimeout, + BenchmarkOnBoot, + AeqPlotDarkMode, ConvolverDefaultPath, diff --git a/src/interface/fragment/SettingsFragment.cpp b/src/interface/fragment/SettingsFragment.cpp index d7b87aee..c5b1bc37 100644 --- a/src/interface/fragment/SettingsFragment.cpp +++ b/src/interface/fragment/SettingsFragment.cpp @@ -41,9 +41,10 @@ SettingsFragment::SettingsFragment(TrayIcon *trayIcon, ui->setupUi(this); #ifdef USE_PULSEAUDIO - ui->selector->topLevelItem(2)->setHidden(true); // Hide devices + ui->selector->topLevelItem(3)->setHidden(true); // Hide devices ui->devices->setVisible(false); ui->blocklistBox->setVisible(false); + ui->benchmarkOnBoot->setEnabled(false); #endif _paletteEditor->setFixedSize(_paletteEditor->geometry().width(), _paletteEditor->geometry().height()); @@ -54,7 +55,7 @@ SettingsFragment::SettingsFragment(TrayIcon *trayIcon, ui->selector->setCurrentItem(ui->selector->topLevelItem(0)); ui->stackedWidget->setCurrentIndex(0); ui->stackedWidget->repaint(); - ui->selector->expandItem(ui->selector->topLevelItem(4)); // Expand tray-icon + ui->selector->expandItem(ui->selector->topLevelItem(5)); // Expand tray-icon connect(ui->selector, &QTreeWidget::currentItemChanged, this, &SettingsFragment::onTreeItemSelected); /* @@ -86,14 +87,19 @@ SettingsFragment::SettingsFragment(TrayIcon *trayIcon, connect(ui->menu_edit, &QMenuEditor::resetPressed, this, &SettingsFragment::onTrayEditorReset); ui->menu_edit->setSourceMenu(trayIcon->buildAvailableActions()); - /* + /* * Interface signals - */ + */ connect(ui->themeSelect, qOverload(&QComboBox::currentIndexChanged), this, &SettingsFragment::onThemeSelected); connect(ui->paletteSelect, qOverload(&QComboBox::currentIndexChanged), this, &SettingsFragment::onPaletteSelected); connect(ui->paletteConfig, &QPushButton::clicked, _paletteEditor, &PaletteEditor::show); connect(ui->eq_alwaysdrawhandles, &QCheckBox::clicked, this, &SettingsFragment::onEqualizerHandlesToggled); + /* + * Audio processing + */ + connect(ui->benchmarkOnBoot, &QCheckBox::clicked, this, &SettingsFragment::onBenchmarkOnBootToggled); + /* * Paths signals */ @@ -252,6 +258,8 @@ void SettingsFragment::refreshAll() ui->eq_alwaysdrawhandles->setChecked(AppConfig::instance().get(AppConfig::EqualizerShowHandles)); + ui->benchmarkOnBoot->setChecked(AppConfig::instance().get(AppConfig::BenchmarkOnBoot)); + ui->blocklistInvert->blockSignals(true); ui->blocklistInvert->setChecked(AppConfig::instance().get(AppConfig::AudioAppBlocklistInvert)); ui->blocklistInvert->blockSignals(false); @@ -313,9 +321,9 @@ void SettingsFragment::onTreeItemSelected(QTreeWidgetItem *cur, QTreeWidgetItem switch (topLevelIndex) { case -1: - if (ui->selector->indexOfTopLevelItem(cur->parent()) == 4 /* Tray-icon */) + if (ui->selector->indexOfTopLevelItem(cur->parent()) == 5 /* Tray-icon */) { - ui->stackedWidget->setCurrentIndex(5); // Context menu + ui->stackedWidget->setCurrentIndex(6); // Context menu } break; default: @@ -419,6 +427,11 @@ void SettingsFragment::onEqualizerHandlesToggled() AppConfig::instance().set(AppConfig::EqualizerShowHandles, ui->eq_alwaysdrawhandles->isChecked()); } +void SettingsFragment::onBenchmarkOnBootToggled() +{ + AppConfig::instance().set(AppConfig::BenchmarkOnBoot, ui->benchmarkOnBoot->isChecked()); +} + void SettingsFragment::onLiveprogAutoExtractToggled() { AppConfig::instance().set(AppConfig::LiveprogAutoExtract, ui->liveprog_autoextract->isChecked()); diff --git a/src/interface/fragment/SettingsFragment.h b/src/interface/fragment/SettingsFragment.h index 4ed0d9e4..ee6a12cc 100644 --- a/src/interface/fragment/SettingsFragment.h +++ b/src/interface/fragment/SettingsFragment.h @@ -66,6 +66,7 @@ private slots: void onTrayEditorCommitted(); void onTrayEditorReset(); void onEqualizerHandlesToggled(); + void onBenchmarkOnBootToggled(); void onLiveprogAutoExtractToggled(); void onGithubLinkClicked(); void onAeqDatabaseManageClicked(); diff --git a/src/interface/fragment/SettingsFragment.ui b/src/interface/fragment/SettingsFragment.ui index e3d9dd16..49854f3a 100644 --- a/src/interface/fragment/SettingsFragment.ui +++ b/src/interface/fragment/SettingsFragment.ui @@ -88,6 +88,11 @@ Interface + + + Audio processing + + Default paths @@ -129,7 +134,7 @@ true - 3 + 1 @@ -286,6 +291,49 @@ + + + + + + Convolver benchmarking + + + + + + Enable benchmarking on boot + + + + + + + Optimizes convolver performance but causes temporarily increased CPU usage for about 1 minute after launch. + + + true + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + true