mirror of
https://github.com/outbackdingo/UltraGrid.git
synced 2026-03-21 12:40:19 +00:00
Probably all of the useful devices are now reported by capabilities, so it's likely to be not even needed, so to avoid confusion it's moved into the settings window and given a more descriptive name
281 lines
9.3 KiB
C++
281 lines
9.3 KiB
C++
#include <stdio.h>
|
|
#include <iostream>
|
|
#include <QMetaType>
|
|
#include <QLabel>
|
|
#include <QLineEdit>
|
|
#include <QFormLayout>
|
|
#include <QCheckBox>
|
|
#include <functional>
|
|
#include "settings_ui.hpp"
|
|
#include "video_opts.hpp"
|
|
|
|
void SettingsUi::init(Settings *settings, AvailableSettings *availableSettings){
|
|
this->settings = settings;
|
|
this->availableSettings = availableSettings;
|
|
}
|
|
|
|
void SettingsUi::addControl(WidgetUi *widget){
|
|
uiControls.emplace_back(widget);
|
|
|
|
connect(widget, &WidgetUi::changed, this, &SettingsUi::changed);
|
|
}
|
|
|
|
|
|
|
|
void SettingsUi::initMainWin(Ui::UltragridWindow *ui){
|
|
mainWin = ui;
|
|
|
|
refreshAll();
|
|
|
|
addCallbacks();
|
|
#ifdef DEBUG
|
|
connect(mainWin->actionTest, SIGNAL(triggered()), this, SLOT(test()));
|
|
#endif
|
|
|
|
addControl(new CheckboxUi(ui->fECCheckBox, settings, "network.fec.enabled"));
|
|
addControl(new CheckboxUi(ui->previewCheckBox, settings, "preview"));
|
|
addControl(
|
|
new LineEditUi(ui->networkDestinationEdit, settings, "network.destination")
|
|
);
|
|
addControl(new ActionCheckableUi(ui->actionVuMeter, settings, "vuMeter"));
|
|
addControl(new ActionCheckableUi(ui->actionUse_hw_acceleration,
|
|
settings,
|
|
"decode.hwaccel"));
|
|
|
|
addControl(
|
|
new ComboBoxUi(ui->videoSourceComboBox,
|
|
settings,
|
|
"video.source",
|
|
std::bind(getVideoSrc, availableSettings))
|
|
);
|
|
|
|
LineEditUi *videoBitrate = new LineEditUi(ui->videoBitrateEdit,
|
|
settings,
|
|
"");
|
|
addControl(videoBitrate);
|
|
|
|
std::unique_ptr<VideoBitrateCallbackData> vidBitrateCallData(new VideoBitrateCallbackData());
|
|
|
|
vidBitrateCallData->availSettings = availableSettings;
|
|
vidBitrateCallData->lineEditUi = videoBitrate;
|
|
vidBitrateCallData->label = mainWin->videoBitrateLabel;
|
|
|
|
auto extraPtr = vidBitrateCallData.get();
|
|
videoBitrate->registerCustomCallback("video.compress",
|
|
Option::Callback(videoCompressBitrateCallback, extraPtr),
|
|
std::move(vidBitrateCallData));
|
|
|
|
|
|
addControl(
|
|
new ComboBoxUi(ui->videoCompressionComboBox,
|
|
settings,
|
|
"video.compress",
|
|
std::bind(getVideoCompress, availableSettings))
|
|
);
|
|
|
|
addControl(
|
|
new ComboBoxUi(ui->videoDisplayComboBox,
|
|
settings,
|
|
"video.display",
|
|
std::bind(getVideoDisplay, availableSettings))
|
|
);
|
|
|
|
ComboBoxUi *videoModeCombo = new ComboBoxUi(ui->videoModeComboBox,
|
|
settings,
|
|
"",
|
|
std::bind(getVideoModes, availableSettings));
|
|
videoModeCombo->registerCallback("video.source");
|
|
addControl(videoModeCombo);
|
|
|
|
addControl(
|
|
new ComboBoxUi(ui->audioCompressionComboBox,
|
|
settings,
|
|
"audio.compress",
|
|
std::bind(getAudioCompress, availableSettings))
|
|
);
|
|
|
|
ComboBoxUi *audioSrc = new ComboBoxUi(ui->audioSourceComboBox,
|
|
settings,
|
|
"audio.source",
|
|
std::bind(getAudioSrc, availableSettings));
|
|
audioSrc->registerCallback("video.source");
|
|
addControl(audioSrc);
|
|
|
|
ComboBoxUi *audioPlayback = new ComboBoxUi(ui->audioPlaybackComboBox,
|
|
settings,
|
|
"audio.playback",
|
|
std::bind(getAudioPlayback, availableSettings));
|
|
audioPlayback->registerCallback("video.display");
|
|
addControl(audioPlayback);
|
|
|
|
addControl(new LineEditUi(ui->audioBitrateEdit,
|
|
settings,
|
|
"audio.compress.bitrate"));
|
|
|
|
addControl(new SpinBoxUi(ui->audioChannelsSpinBox,
|
|
settings,
|
|
"audio.source.channels"));
|
|
|
|
addControl(new LineEditUi(ui->portLineEdit, settings, "network.port"));
|
|
}
|
|
|
|
void SettingsUi::refreshAll(){
|
|
for(auto &i : uiControls){
|
|
i->refresh();
|
|
}
|
|
}
|
|
|
|
void SettingsUi::refreshAllCallback(Option&, bool, void *opaque){
|
|
static_cast<SettingsUi *>(opaque)->refreshAll();
|
|
}
|
|
|
|
void vuMeterCallback(Option &opt, bool /*suboption*/, void *opaque){
|
|
static_cast<Ui::UltragridWindow *>(opaque)->vuMeter->setVisible(opt.isEnabled());
|
|
}
|
|
|
|
void SettingsUi::addCallbacks(){
|
|
settings->getOption("audio.compress").addOnChangeCallback(
|
|
Option::Callback(&audioCompressionCallback, mainWin));
|
|
|
|
settings->getOption("advanced").addOnChangeCallback(
|
|
Option::Callback(&SettingsUi::refreshAllCallback, this));
|
|
|
|
settings->getOption("vuMeter").addOnChangeCallback(
|
|
Option::Callback(&vuMeterCallback, mainWin));
|
|
}
|
|
|
|
void SettingsUi::test(){
|
|
printf("%s\n", settings->getLaunchParams().c_str());
|
|
}
|
|
|
|
void SettingsUi::initSettingsWin(Ui::Settings *ui){
|
|
settingsWin = ui;
|
|
|
|
addControl(new LineEditUi(ui->basePort, settings, "network.port"));
|
|
addControl(new LineEditUi(ui->controlPort, settings, "network.control_port"));
|
|
addControl(new CheckboxUi(ui->fecAutoCheck, settings, "network.fec.auto"));
|
|
addControl(new GroupBoxUi(ui->fecGroupBox, settings, "network.fec.enabled"));
|
|
addControl(new SpinBoxUi(ui->multSpin, settings, "network.fec.mult.factor"));
|
|
addControl(new SpinBoxUi(ui->ldgmK, settings, "network.fec.ldgm.k"));
|
|
addControl(new SpinBoxUi(ui->ldgmM, settings, "network.fec.ldgm.m"));
|
|
addControl(new SpinBoxUi(ui->ldgmC, settings, "network.fec.ldgm.c"));
|
|
addControl(new SpinBoxUi(ui->rsK, settings, "network.fec.rs.k"));
|
|
addControl(new SpinBoxUi(ui->rsN, settings, "network.fec.rs.n"));
|
|
addControl(new RadioButtonUi(ui->fecNoneRadio, "", settings, "network.fec.type"));
|
|
addControl(new RadioButtonUi(ui->fecMultRadio, "mult", settings, "network.fec.type"));
|
|
addControl(new RadioButtonUi(ui->fecLdgmRadio, "ldgm", settings, "network.fec.type"));
|
|
addControl(new RadioButtonUi(ui->fecRsRadio, "rs", settings, "network.fec.type"));
|
|
addControl(new CheckboxUi(ui->glCursor, settings, "video.display.gl.cursor"));
|
|
addControl(new CheckboxUi(ui->glDeinterlace, settings, "video.display.gl.deinterlace"));
|
|
addControl(new CheckboxUi(ui->glFullscreen, settings, "video.display.gl.fullscreen"));
|
|
addControl(new CheckboxUi(ui->glNoDecorate, settings, "video.display.gl.nodecorate"));
|
|
addControl(new CheckboxUi(ui->glNoVsync, settings, "video.display.gl.novsync"));
|
|
addControl(new CheckboxUi(ui->sdlDeinterlace, settings, "video.display.sdl.deinterlace"));
|
|
addControl(new CheckboxUi(ui->sdlFullscreen, settings, "video.display.sdl.fullscreen"));
|
|
addControl(new RadioButtonUi(ui->ldgmSimpCpuRadio, "CPU", settings, "network.fec.ldgm.device"));
|
|
addControl(new RadioButtonUi(ui->ldgmSimpGpuRadio, "GPU", settings, "network.fec.ldgm.device"));
|
|
addControl(new RadioButtonUi(ui->ldgmCpuRadio, "CPU", settings, "network.fec.ldgm.device"));
|
|
addControl(new RadioButtonUi(ui->ldgmGpuRadio, "GPU", settings, "network.fec.ldgm.device"));
|
|
addControl(new CheckboxUi(ui->decodeAccelCheck, settings, "decode.hwaccel"));
|
|
addControl(new CheckboxUi(ui->errorsFatalBox, settings, "errors_fatal"));
|
|
addControl(new LineEditUi(ui->encryptionLineEdit, settings, "encryption"));
|
|
addControl(new CheckboxUi(ui->advModeCheck, settings, "advanced"));
|
|
|
|
buildSettingsCodecList();
|
|
connect(settingsWin->codecList, &QListWidget::currentItemChanged,
|
|
this, &SettingsUi::settingsCodecSelected);
|
|
}
|
|
|
|
void SettingsUi::buildSettingsCodecList(){
|
|
QListWidget *list = settingsWin->codecList;
|
|
list->clear();
|
|
|
|
auto codecs = getVideoCompress(availableSettings);
|
|
|
|
for(const auto& codec : codecs){
|
|
QListWidgetItem *item = new QListWidgetItem(list);
|
|
item->setText(QString::fromStdString(codec.name));
|
|
item->setData(Qt::UserRole, QVariant::fromValue(codec));
|
|
|
|
list->addItem(item);
|
|
}
|
|
}
|
|
|
|
void SettingsUi::settingsCodecSelected(QListWidgetItem *curr, QListWidgetItem *){
|
|
const SettingItem &settingItem = curr->data(Qt::UserRole).value<SettingItem>();
|
|
|
|
auto modIt = std::find_if(settingItem.opts.begin(), settingItem.opts.end(),
|
|
[](const SettingValue& si){ return si.opt == "video.compress"; });
|
|
|
|
if(modIt == settingItem.opts.end())
|
|
return;
|
|
|
|
const std::string& modName = modIt->val;
|
|
|
|
auto codecIt = std::find_if(settingItem.opts.begin(), settingItem.opts.end(),
|
|
[modName](const SettingValue& si){
|
|
return si.opt == "video.compress." + modName + ".codec"; });
|
|
|
|
if(codecIt == settingItem.opts.end())
|
|
return;
|
|
|
|
buildCodecOptControls(modName, codecIt->val);
|
|
}
|
|
|
|
void SettingsUi::buildCodecOptControls(const std::string& mod, const std::string& codec){
|
|
codecControls.clear();
|
|
|
|
QWidget *container = new QWidget();
|
|
QFormLayout *formLayout = new QFormLayout(container);
|
|
|
|
QComboBox *encoderCombo = new QComboBox();
|
|
formLayout->addRow("Encoder", encoderCombo);
|
|
|
|
WidgetUi *encoderComboUi = new ComboBoxUi(encoderCombo,
|
|
settings,
|
|
"video.compress." + mod + ".codec." + codec + ".encoder",
|
|
std::bind(getCodecEncoders, availableSettings, mod, codec));
|
|
|
|
codecControls.emplace_back(encoderComboUi);
|
|
connect(encoderComboUi, &WidgetUi::changed, this, &SettingsUi::changed);
|
|
|
|
for(const auto& compMod : availableSettings->getVideoCompressModules()){
|
|
if(compMod.name == mod){
|
|
for(const auto& modOpt : compMod.opts){
|
|
QLabel *label = new QLabel(QString::fromStdString(modOpt.displayName));
|
|
QWidget *field = nullptr;
|
|
WidgetUi *widgetUi = nullptr;
|
|
std::string optKey = "video.compress." + mod + "." + modOpt.key;
|
|
if(modOpt.booleanOpt){
|
|
QCheckBox *checkBox = new QCheckBox();
|
|
field = checkBox;
|
|
|
|
widgetUi = new CheckboxUi(checkBox,
|
|
settings,
|
|
optKey);
|
|
} else {
|
|
QLineEdit *lineEdit = new QLineEdit();
|
|
field = lineEdit;
|
|
|
|
widgetUi = new LineEditUi(lineEdit,
|
|
settings,
|
|
optKey);
|
|
}
|
|
label->setToolTip(QString::fromStdString(modOpt.displayDesc));
|
|
field->setToolTip(QString::fromStdString(modOpt.displayDesc));
|
|
|
|
formLayout->addRow(label, field);
|
|
|
|
codecControls.emplace_back(widgetUi);
|
|
connect(widgetUi, &WidgetUi::changed, this, &SettingsUi::changed);
|
|
}
|
|
}
|
|
}
|
|
|
|
container->setLayout(formLayout);
|
|
|
|
delete settingsWin->scrollContents;
|
|
settingsWin->scrollContents = container;
|
|
settingsWin->codecOptScroll->setWidget(container);
|
|
}
|