Erster Teststream absolviert. Positives Ergebnis

This commit is contained in:
2026-09-05 18:55:56 +02:00
parent 953c37d8d1
commit cc3527f86a
11 changed files with 1198 additions and 46 deletions

View File

@@ -1,9 +1,13 @@
#include "DeviceDialog.h"
#include "VideoWidget.h" // für kBrightnessMin/Max, kSharpenMin/Max (eine Quelle der Wahrheit)
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFormLayout>
#include <QComboBox>
#include <QCheckBox>
#include <QDoubleSpinBox>
#include <QSpinBox>
#include <QLabel>
#include <QPushButton>
#include <QDir>
@@ -51,11 +55,79 @@ DeviceDialog::DeviceDialog(QWidget* parent)
form->addRow("Audio-Gerät (ALSA):", m_audioCombo);
form->addRow("Ziel-Framerate:", m_fpsCombo);
m_smoothCheck = new QCheckBox("Bildglättung aktivieren (empfohlen)", this);
m_smoothCheck->setChecked(true);
m_smoothCheck->setToolTip(
"Reduziert live Kompressions-/Scaler-Artefakte deines HDMI-Upscalers:\n"
"Farbrauschen/Dot-Crawl wird weicher gezeichnet, harte blockige\n"
"Pixelkanten werden geglättet und dezent gegengeschärft.\n"
"Das ist keine Optik-Spielerei, sondern eine Bildverbesserung \n"
"empfohlen für Composite-Quellen wie PS1/PS2 an billigen Scalern.\n"
"Umschaltbar im laufenden Betrieb mit [S].");
form->addRow("", m_smoothCheck);
m_retroCheck = new QCheckBox("Retro-Optik (Scanlines/Maske) aktivieren", this);
m_retroCheck->setToolTip(
"Rein optischer Nostalgie-Look: Scanlines, Phosphor-Maske,\n"
"leichte Wölbung wie bei einem alten Röhrenfernseher.\n"
"Lässt sich mit der Bildglättung kombinieren.\n"
"Umschaltbar im laufenden Betrieb mit [C].");
form->addRow("", m_retroCheck);
m_sharpenSpin = new QDoubleSpinBox(this);
m_sharpenSpin->setRange(VideoWidget::kSharpenMin, VideoWidget::kSharpenMax);
m_sharpenSpin->setSingleStep(VideoWidget::kSharpenStep);
m_sharpenSpin->setDecimals(1);
m_sharpenSpin->setValue(0.0);
m_sharpenSpin->setSpecialValueText("aus");
m_sharpenSpin->setToolTip(
"Unsharp Mask übers gesamte Bild, unabhängig von der Bildglättung.\n"
"0 = aus. Im laufenden Betrieb mit [X]/[+]/[-] änderbar.");
form->addRow("Nachschärfen:", m_sharpenSpin);
m_brightnessSpin = new QDoubleSpinBox(this);
m_brightnessSpin->setRange(VideoWidget::kBrightnessMin * 100.0, VideoWidget::kBrightnessMax * 100.0);
m_brightnessSpin->setSingleStep(VideoWidget::kBrightnessStep * 100.0);
m_brightnessSpin->setDecimals(0);
m_brightnessSpin->setSuffix(" %");
m_brightnessSpin->setValue(100.0);
m_brightnessSpin->setToolTip(
"Gamma-Helligkeit, 100 % = unverändert. Im laufenden Betrieb\n"
"mit [,]/[.] änderbar.");
form->addRow("Helligkeit:", m_brightnessSpin);
m_hwContrastSpin = new QSpinBox(this);
m_hwContrastSpin->setRange(-1, 100);
m_hwContrastSpin->setValue(-1);
m_hwContrastSpin->setSpecialValueText("unverändert");
m_hwContrastSpin->setToolTip(
"Hardware-Kontrast direkt am Grabber-Chip, VOR der JPEG-Kompression\n"
"(Wertebereich hängt vom jeweiligen Chip ab, hier 0-100 angenommen).\n"
"\"unverändert\" lässt den aktuellen Chip-Wert einfach in Ruhe.\n"
"Im laufenden Betrieb mit [1]/[2] änderbar. hdmi-viewer merkt sich\n"
"beim Start den Ausgangswert und stellt ihn beim Beenden wieder her.");
form->addRow("Hardware-Kontrast:", m_hwContrastSpin);
m_hwSaturationSpin = new QSpinBox(this);
m_hwSaturationSpin->setRange(-1, 100);
m_hwSaturationSpin->setValue(-1);
m_hwSaturationSpin->setSpecialValueText("unverändert");
m_hwSaturationSpin->setToolTip(
"Hardware-Sättigung direkt am Grabber-Chip, VOR der JPEG-Kompression.\n"
"\"unverändert\" lässt den aktuellen Chip-Wert einfach in Ruhe.\n"
"Im laufenden Betrieb mit [3]/[4] änderbar. hdmi-viewer merkt sich\n"
"beim Start den Ausgangswert und stellt ihn beim Beenden wieder her.");
form->addRow("Hardware-Sättigung:", m_hwSaturationSpin);
auto* hint = new QLabel(
"<small><b>Hinweis:</b> Der Grabber liefert die gewünschte FPS-Zahl nur wenn "
"genug USB-Bandbreite vorhanden ist. Die tatsächliche Rate wird in der "
"Titelleiste angezeigt.<br>"
"<b>F</b> = Vollbild &nbsp;·&nbsp; <b>Esc</b> = zurück hierher</small>",
"<b>F</b> Vollbild &nbsp;·&nbsp; <b>S</b> Glättung &nbsp;·&nbsp; "
"<b>C</b> Retro &nbsp;·&nbsp; <b>X/+/-</b> Schärfen &nbsp;·&nbsp; "
"<b>,/.</b> Helligkeit &nbsp;·&nbsp; <b>1/2</b> HW-Kontrast &nbsp;·&nbsp; "
"<b>3/4</b> HW-Sättigung &nbsp;·&nbsp; <b>V</b> Vergleich &nbsp;·&nbsp; "
"<b>P</b> Screenshot &nbsp;·&nbsp; <b>Esc</b> zurück hierher</small>",
this);
hint->setWordWrap(true);
@@ -81,10 +153,22 @@ DeviceDialog::DeviceDialog(QWidget* parent)
QString DeviceDialog::selectedVideoDevice() const { return m_videoCombo->currentData().toString(); }
QString DeviceDialog::selectedAudioDevice() const { return m_audioCombo->currentData().toString(); }
int DeviceDialog::selectedFps() const { return m_fpsCombo->currentData().toInt(); }
bool DeviceDialog::selectedSmoothMode() const { return m_smoothCheck->isChecked(); }
bool DeviceDialog::selectedRetroMode() const { return m_retroCheck->isChecked(); }
float DeviceDialog::selectedSharpenAmount() const { return static_cast<float>(m_sharpenSpin->value()); }
float DeviceDialog::selectedBrightness() const { return static_cast<float>(m_brightnessSpin->value() / 100.0); }
int DeviceDialog::selectedHwContrast() const { return m_hwContrastSpin->value(); }
int DeviceDialog::selectedHwSaturation() const { return m_hwSaturationSpin->value(); }
void DeviceDialog::setPreselectedVideo(const QString& device) { selectByData(m_videoCombo, device); }
void DeviceDialog::setPreselectedAudio(const QString& device) { selectByData(m_audioCombo, device); }
void DeviceDialog::setPreselectedFps(int fps) { selectByData(m_fpsCombo, QString::number(fps)); }
void DeviceDialog::setPreselectedSmoothMode(bool enabled) { m_smoothCheck->setChecked(enabled); }
void DeviceDialog::setPreselectedRetroMode(bool enabled) { m_retroCheck->setChecked(enabled); }
void DeviceDialog::setPreselectedSharpenAmount(float amount) { m_sharpenSpin->setValue(amount); }
void DeviceDialog::setPreselectedBrightness(float gamma) { m_brightnessSpin->setValue(gamma * 100.0); }
void DeviceDialog::setPreselectedHwContrast(int value) { m_hwContrastSpin->setValue(value); }
void DeviceDialog::setPreselectedHwSaturation(int value) { m_hwSaturationSpin->setValue(value); }
void DeviceDialog::selectByData(QComboBox* combo, const QString& data)
{