|
|
|
|
@ -1,5 +1,6 @@
|
|
|
|
|
#include "radiosettingspage.h" |
|
|
|
|
#include "ptt_hotkey_manager.h" |
|
|
|
|
#include "radio_audio_engine.h" |
|
|
|
|
#include "../db/db_manager.h" |
|
|
|
|
#include "../../lib/debug_config.h" |
|
|
|
|
|
|
|
|
|
@ -10,12 +11,44 @@
|
|
|
|
|
#include <QPushButton> |
|
|
|
|
#include <QHideEvent> |
|
|
|
|
#include <QShowEvent> |
|
|
|
|
#include <QFormLayout> |
|
|
|
|
#include <QSpinBox> |
|
|
|
|
#include <QCheckBox> |
|
|
|
|
|
|
|
|
|
RadioSettingsPage::RadioSettingsPage(DbManager* db, QWidget* parent) : QWidget(parent), m_db(db) { |
|
|
|
|
auto* layout = new QVBoxLayout(this); |
|
|
|
|
auto* title = new QLabel("Рация (PTT)", this); |
|
|
|
|
title->setStyleSheet("font-weight: bold; font-size: 13px;"); |
|
|
|
|
layout->addWidget(title); |
|
|
|
|
m_audioSettings = new QWidget(this); |
|
|
|
|
auto* form = new QFormLayout(m_audioSettings); |
|
|
|
|
form->setContentsMargins(0, 0, 0, 12); |
|
|
|
|
auto add = [&](const QString& label, int min, int max, const QString& suffix) { |
|
|
|
|
auto* spin = new QSpinBox(m_audioSettings); |
|
|
|
|
spin->setRange(min, max); |
|
|
|
|
spin->setSuffix(suffix); |
|
|
|
|
form->addRow(label, spin); |
|
|
|
|
return spin; |
|
|
|
|
}; |
|
|
|
|
m_threshold = add(QStringLiteral("Порог речи VAD:"), 10, 95, QStringLiteral(" %")); |
|
|
|
|
m_threshold->setToolTip(QStringLiteral("Порог вероятности речи: меньше — чувствительнее. Это не порог громкости.")); |
|
|
|
|
m_hangover = add(QStringLiteral("Тишина до окончания передачи:"), 50, 2000, QStringLiteral(" мс")); |
|
|
|
|
m_compressor = new QCheckBox(QStringLiteral("Компрессор передачи и VAD"), m_audioSettings); |
|
|
|
|
form->addRow(m_compressor); |
|
|
|
|
m_txGain = add(QStringLiteral("Max gain передачи:"), 1, 60, QStringLiteral(" dB")); |
|
|
|
|
m_vadGain = add(QStringLiteral("Max gain VAD:"), 1, 60, QStringLiteral(" dB")); |
|
|
|
|
auto* explanation = new QLabel(QStringLiteral("VAD включается кнопкой на панели рации. Буфер начала речи — 0,6 с. " |
|
|
|
|
"Компрессор VAD имеет отдельный max gain; остальные параметры общие с компрессором передачи. " |
|
|
|
|
"Скорость нарастания усиления задаётся в разделе Audio."), m_audioSettings); |
|
|
|
|
explanation->setWordWrap(true); |
|
|
|
|
form->addRow(explanation); |
|
|
|
|
layout->addWidget(m_audioSettings); |
|
|
|
|
connect(RadioAudioEngine::instance(), &RadioAudioEngine::stateChanged, this, [this]() { |
|
|
|
|
auto* engine = RadioAudioEngine::instance(); |
|
|
|
|
m_audioSettings->setEnabled(engine->settingsReady() && !engine->settingsBusy()); |
|
|
|
|
if (!m_audioSettingsLoaded && engine->settingsReady()) loadAudioSettings(); |
|
|
|
|
}); |
|
|
|
|
loadAudioSettings(); |
|
|
|
|
if (PttHotkeyManager::usesPortal()) { |
|
|
|
|
auto* hint = new QLabel("Глобальные хоткеи работают из любых приложений. " |
|
|
|
|
"Назначьте обычную клавишу с Ctrl, Shift, Alt или Win в системном окне. " |
|
|
|
|
@ -142,6 +175,7 @@ void RadioSettingsPage::updateLabel(int index) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void RadioSettingsPage::loadFromDb() { |
|
|
|
|
loadAudioSettings(); |
|
|
|
|
if (m_portalStatus) { updatePortalLabels(); return; } |
|
|
|
|
finishCapture(false); |
|
|
|
|
QStringList values; |
|
|
|
|
@ -159,10 +193,29 @@ QStringList RadioSettingsPage::hotkeys() const {
|
|
|
|
|
return values; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void RadioSettingsPage::apply() { |
|
|
|
|
if (m_portalStatus) return; |
|
|
|
|
bool RadioSettingsPage::apply() { |
|
|
|
|
if (!RadioAudioEngine::instance()->applySettings({ |
|
|
|
|
{QStringLiteral("radio_vad_threshold"), m_threshold->value()}, |
|
|
|
|
{QStringLiteral("radio_vad_hangover_ms"), m_hangover->value()}, |
|
|
|
|
{QStringLiteral("radio_compressor_enabled"), m_compressor->isChecked() ? 1 : 0}, |
|
|
|
|
{QStringLiteral("radio_compressor_max_gain_db"), m_txGain->value()}, |
|
|
|
|
{QStringLiteral("radio_vad_compressor_max_gain_db"), m_vadGain->value()}})) return false; |
|
|
|
|
if (m_portalStatus) return true; |
|
|
|
|
finishCapture(false); |
|
|
|
|
PttHotkeyManager::instance()->setHotkeys(hotkeys()); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void RadioSettingsPage::loadAudioSettings() { |
|
|
|
|
auto* engine = RadioAudioEngine::instance(); |
|
|
|
|
m_audioSettings->setEnabled(engine->settingsReady() && !engine->settingsBusy()); |
|
|
|
|
if (!engine->settingsReady()) return; |
|
|
|
|
m_threshold->setValue(engine->setting(QStringLiteral("radio_vad_threshold"))); |
|
|
|
|
m_hangover->setValue(engine->setting(QStringLiteral("radio_vad_hangover_ms"))); |
|
|
|
|
m_compressor->setChecked(engine->setting(QStringLiteral("radio_compressor_enabled")) != 0); |
|
|
|
|
m_txGain->setValue(engine->setting(QStringLiteral("radio_compressor_max_gain_db"))); |
|
|
|
|
m_vadGain->setValue(engine->setting(QStringLiteral("radio_vad_compressor_max_gain_db"))); |
|
|
|
|
m_audioSettingsLoaded = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void RadioSettingsPage::updatePortalLabels() { |
|
|
|
|
|