feat: voice compressor with RMS+peak leveling, sliding window envelope, rate-limited gain

This commit is contained in:
Evgeny committed 2026-07-27 11:24:47 +03:00
1 parent 7004b110ae
commit f1b599f0c0
8 files changed
+406 -9

No files matched your search

+17 -2
View File
@@ -9,6 +9,7 @@
#include "invite_link.h"
#include "sound_manager.h"
#include "audiorecorder.h"
#include "audiocompressor.h"
#include "voicemessageencoder.h"
#include "animtimer.h"
#include "../db/db_manager.h"
@@ -25,6 +26,7 @@
#include <QFile>
#include <QTextStream>
#include <QDir>
#include <cmath>
extern "C" {
#include "../transport/chat_core.h"
@@ -207,9 +209,22 @@ void MainWindow::setupSoundFromConfig() {
if (m_db && m_db->isOpen()) {
m_recorder->setCaptureDeviceIndex(m_db->getUiStateInt("audio_input_device", -1));
VoiceEncoder::setPreset(m_db->getUiStateInt("opus_codec_preset", 1));
int compEnabled = m_db->getUiStateInt("compressor_enabled", 0);
m_recorder->setCompressorEnabled(compEnabled != 0);
if (m_recorder->compressor()) {
AudioCompressor::Config compCfg;
compCfg.maxGainDb = (float)m_db->getUiStateInt("compressor_max_gain_db", 30);
compCfg.lookbackMs = m_db->getUiStateInt("compressor_lookback_ms", 200);
compCfg.lookaheadMs = m_db->getUiStateInt("compressor_lookahead_ms", 100);
compCfg.riseRatePer500ms = (float)m_db->getUiStateInt("compressor_rise_rate_tenths", 20) / 10.0f;
compCfg.targetLevel = powf(10.0f, (float)m_db->getUiStateInt("compressor_target_level_db", -12) / 20.0f);
m_recorder->compressor()->configure(compCfg);
}
}
qDebug("MainWindow: AudioRecorder initialized (captureDevice=%d, opusPreset=%d)",
m_recorder->captureDeviceIndex(), VoiceEncoder::preset());
qDebug("MainWindow: AudioRecorder initialized (captureDevice=%d, opusPreset=%d, compressor=%d)",
m_recorder->captureDeviceIndex(), VoiceEncoder::preset(),
m_recorder->isCompressorEnabled() ? 1 : 0);
}
}