diff --git a/frontend/components/SourceTree.cpp b/frontend/components/SourceTree.cpp index 9ffb7da3580ebe..c0161a7d5c2613 100644 --- a/frontend/components/SourceTree.cpp +++ b/frontend/components/SourceTree.cpp @@ -476,7 +476,7 @@ bool SourceTree::Edit(int row) QModelIndex index = stm->createIndex(row, 0); QWidget *widget = indexWidget(index); - SourceTreeItem *itemWidget = reinterpret_cast(widget); + SourceTreeItem *itemWidget = static_cast(widget); if (itemWidget->IsEditing()) { #ifdef __APPLE__ itemWidget->ExitEditMode(true); diff --git a/frontend/components/SourceTree.hpp b/frontend/components/SourceTree.hpp index 60cacaa3bdfe0b..2bc89b1c70c6c2 100644 --- a/frontend/components/SourceTree.hpp +++ b/frontend/components/SourceTree.hpp @@ -29,13 +29,13 @@ class SourceTree : public QListView { void UpdateWidget(const QModelIndex &idx, obs_sceneitem_t *item); void UpdateWidgets(bool force = false); - inline SourceTreeModel *GetStm() const { return reinterpret_cast(model()); } + inline SourceTreeModel *GetStm() const { return static_cast(model()); } public: inline SourceTreeItem *GetItemWidget(int idx) { QWidget *widget = indexWidget(GetStm()->createIndex(idx, 0)); - return reinterpret_cast(widget); + return static_cast(widget); } explicit SourceTree(QWidget *parent = nullptr); diff --git a/frontend/dialogs/OBSYoutubeActions.cpp b/frontend/dialogs/OBSYoutubeActions.cpp index cf1c1843082a84..69996763f6b90f 100644 --- a/frontend/dialogs/OBSYoutubeActions.cpp +++ b/frontend/dialogs/OBSYoutubeActions.cpp @@ -20,7 +20,7 @@ const QString IndexOfGamingCategory = "20"; OBSYoutubeActions::OBSYoutubeActions(QWidget *parent, Auth *auth, bool broadcastReady) : QDialog(parent), ui(new Ui::OBSYoutubeActions), - apiYouTube(dynamic_cast(auth)), + apiYouTube(qobject_cast(auth)), workerThread(new WorkerThread(apiYouTube)), broadcastReady(broadcastReady) { diff --git a/frontend/docks/YouTubeAppDock.cpp b/frontend/docks/YouTubeAppDock.cpp index a5b283484da1a7..95e827250ad157 100644 --- a/frontend/docks/YouTubeAppDock.cpp +++ b/frontend/docks/YouTubeAppDock.cpp @@ -381,7 +381,7 @@ YoutubeApiWrappers *YouTubeAppDock::GetYTApi() { Auth *auth = OBSBasic::Get()->GetAuth(); if (auth) { - YoutubeApiWrappers *apiYouTube(dynamic_cast(auth)); + YoutubeApiWrappers *apiYouTube(qobject_cast(auth)); if (apiYouTube) { return apiYouTube; } else { diff --git a/frontend/importer/ImporterEntryPathItemDelegate.cpp b/frontend/importer/ImporterEntryPathItemDelegate.cpp index 520dc5ef90e17f..36b421cc520a0a 100644 --- a/frontend/importer/ImporterEntryPathItemDelegate.cpp +++ b/frontend/importer/ImporterEntryPathItemDelegate.cpp @@ -154,7 +154,7 @@ void ImporterEntryPathItemDelegate::handleClear(QWidget *container) void ImporterEntryPathItemDelegate::updateText() { - QLineEdit *lineEdit = dynamic_cast(sender()); + QLineEdit *lineEdit = qobject_cast(sender()); QWidget *editor = lineEdit->parentWidget(); emit commitData(editor); } diff --git a/frontend/settings/OBSBasicSettings.cpp b/frontend/settings/OBSBasicSettings.cpp index a92e55cb1ca2d3..94607b3f00de99 100644 --- a/frontend/settings/OBSBasicSettings.cpp +++ b/frontend/settings/OBSBasicSettings.cpp @@ -135,7 +135,7 @@ static inline bool SetInvalidValue(QComboBox *combo, const QString &name, const { combo->insertItem(0, name, data); - QStandardItemModel *model = dynamic_cast(combo->model()); + QStandardItemModel *model = qobject_cast(combo->model()); if (!model) return false; @@ -1218,7 +1218,7 @@ void OBSBasicSettings::LoadBranchesList() // Disable item if branch is disabled if (!branch.is_enabled) { - QStandardItemModel *model = dynamic_cast(ui->updateChannelBox->model()); + QStandardItemModel *model = qobject_cast(ui->updateChannelBox->model()); QStandardItem *item = model->item(ui->updateChannelBox->count() - 1); item->setFlags(Qt::NoItemFlags); } @@ -4508,7 +4508,7 @@ static void DisableIncompatibleCodecs(QComboBox *cbox, const QString &format, co is_compatible = FFCodecAndFormatCompatible(codec, ext.c_str()); } - QStandardItemModel *model = dynamic_cast(cbox->model()); + QStandardItemModel *model = qobject_cast(cbox->model()); QStandardItem *item = model->item(idx); if (is_compatible) { @@ -4566,7 +4566,7 @@ static void ResetInvalidSelection(QComboBox *cbox) if (idx < 0) return; - QStandardItemModel *model = dynamic_cast(cbox->model()); + QStandardItemModel *model = qobject_cast(cbox->model()); QStandardItem *item = model->item(idx); if (item->isEnabled()) @@ -5119,7 +5119,7 @@ static void DisableIncompatibleSimpleCodecs(QComboBox *cbox, const QString &form codec = obs_get_encoder_codec(encoder_id); } - QStandardItemModel *model = dynamic_cast(cbox->model()); + QStandardItemModel *model = qobject_cast(cbox->model()); QStandardItem *item = model->item(idx); if (ContainerSupportsCodec(format.toStdString(), codec.toStdString())) { @@ -5149,7 +5149,7 @@ static void DisableIncompatibleSimpleContainer(QComboBox *cbox, const QString &c QString format = cbox->itemData(idx).toString(); string formatStr = format.toStdString(); - QStandardItemModel *model = dynamic_cast(cbox->model()); + QStandardItemModel *model = qobject_cast(cbox->model()); QStandardItem *item = model->item(idx); if (ContainerSupportsCodec(formatStr, vCodec) && ContainerSupportsCodec(formatStr, aCodec)) { diff --git a/frontend/settings/OBSBasicSettings_Stream.cpp b/frontend/settings/OBSBasicSettings_Stream.cpp index 5179f44d818360..f7f9215e549d8f 100644 --- a/frontend/settings/OBSBasicSettings_Stream.cpp +++ b/frontend/settings/OBSBasicSettings_Stream.cpp @@ -795,7 +795,7 @@ OBSService OBSBasicSettings::SpawnTempService() void OBSBasicSettings::OnOAuthStreamKeyConnected() { - OAuthStreamKey *a = reinterpret_cast(auth.get()); + OAuthStreamKey *a = static_cast(auth.get()); if (a) { bool validKey = !a->key().empty(); diff --git a/frontend/settings/OBSHotkeyWidget.hpp b/frontend/settings/OBSHotkeyWidget.hpp index 12f15f2829b162..7977a582e46aaf 100644 --- a/frontend/settings/OBSHotkeyWidget.hpp +++ b/frontend/settings/OBSHotkeyWidget.hpp @@ -87,7 +87,7 @@ class OBSHotkeyWidget : public QWidget { bool ignoreChangedBindings = false; OBSBasicSettings *settings; - QVBoxLayout *layout() const { return dynamic_cast(QWidget::layout()); } + QVBoxLayout *layout() const { return qobject_cast(QWidget::layout()); } private slots: void HandleChangedBindings(obs_hotkey_id id_); diff --git a/frontend/utility/ExtraBrowsersDelegate.cpp b/frontend/utility/ExtraBrowsersDelegate.cpp index e984797fb409de..3c7aede78462a3 100644 --- a/frontend/utility/ExtraBrowsersDelegate.cpp +++ b/frontend/utility/ExtraBrowsersDelegate.cpp @@ -21,7 +21,7 @@ QWidget *ExtraBrowsersDelegate::createEditor(QWidget *parent, const QStyleOption void ExtraBrowsersDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { - QLineEdit *text = reinterpret_cast(editor); + QLineEdit *text = static_cast(editor); text->blockSignals(true); text->setText(index.data().toString()); text->blockSignals(false); @@ -29,7 +29,7 @@ void ExtraBrowsersDelegate::setEditorData(QWidget *editor, const QModelIndex &in bool ExtraBrowsersDelegate::eventFilter(QObject *object, QEvent *event) { - QLineEdit *edit = qobject_cast(object); + QLineEdit *edit = static_cast(object); if (!edit) return false; @@ -65,7 +65,7 @@ bool ExtraBrowsersDelegate::ValidName(const QString &name) const void ExtraBrowsersDelegate::RevertText(QLineEdit *edit_) { - EditWidget *edit = reinterpret_cast(edit_); + EditWidget *edit = static_cast(edit_); int row = edit->index.row(); int col = edit->index.column(); bool newItem = (row == model->items.size()); @@ -82,7 +82,7 @@ void ExtraBrowsersDelegate::RevertText(QLineEdit *edit_) bool ExtraBrowsersDelegate::UpdateText(QLineEdit *edit_) { - EditWidget *edit = reinterpret_cast(edit_); + EditWidget *edit = static_cast(edit_); int row = edit->index.row(); int col = edit->index.column(); bool newItem = (row == model->items.size()); diff --git a/frontend/utility/ExtraBrowsersModel.cpp b/frontend/utility/ExtraBrowsersModel.cpp index 5409c3c1939af5..89d294856ac689 100644 --- a/frontend/utility/ExtraBrowsersModel.cpp +++ b/frontend/utility/ExtraBrowsersModel.cpp @@ -92,7 +92,7 @@ Qt::ItemFlags ExtraBrowsersModel::flags(const QModelIndex &index) const } void ExtraBrowsersModel::AddDeleteButton(int idx) { - QTableView *widget = reinterpret_cast(parent()); + QTableView *widget = static_cast(parent()); QModelIndex index = createIndex(idx, (int)Column::Delete, nullptr); @@ -134,7 +134,7 @@ void ExtraBrowsersModel::UpdateItem(Item &item) int idx = item.prevIdx; OBSBasic *main = OBSBasic::Get(); - BrowserDock *dock = reinterpret_cast(main->extraBrowserDocks[idx].get()); + BrowserDock *dock = static_cast(main->extraBrowserDocks[idx].get()); dock->setWindowTitle(item.title); dock->setObjectName(item.title + OBJ_NAME_SUFFIX); @@ -152,9 +152,9 @@ void ExtraBrowsersModel::UpdateItem(Item &item) void ExtraBrowsersModel::DeleteItem() { - QTableView *widget = reinterpret_cast(parent()); + QTableView *widget = static_cast(parent()); - DelButton *del = reinterpret_cast(sender()); + DelButton *del = static_cast(sender()); int row = del->index.row(); /* there's some sort of internal bug in Qt and deleting certain index @@ -211,7 +211,7 @@ void ExtraBrowsersModel::Apply() void ExtraBrowsersModel::TabSelection(bool forward) { - QListView *widget = reinterpret_cast(parent()); + QListView *widget = static_cast(parent()); QItemSelectionModel *selModel = widget->selectionModel(); QModelIndex sel = selModel->currentIndex(); diff --git a/frontend/utility/RemuxEntryPathItemDelegate.cpp b/frontend/utility/RemuxEntryPathItemDelegate.cpp index bcaa43f83bc52c..5073ce0f18f553 100644 --- a/frontend/utility/RemuxEntryPathItemDelegate.cpp +++ b/frontend/utility/RemuxEntryPathItemDelegate.cpp @@ -205,7 +205,7 @@ void RemuxEntryPathItemDelegate::handleClear(QWidget *container) void RemuxEntryPathItemDelegate::updateText() { - QLineEdit *lineEdit = dynamic_cast(sender()); + QLineEdit *lineEdit = static_cast(sender()); QWidget *editor = lineEdit->parentWidget(); emit commitData(editor); } diff --git a/frontend/utility/YoutubeApiWrappers.cpp b/frontend/utility/YoutubeApiWrappers.cpp index 4d1a2a1ea598f4..3d52308422f8e5 100644 --- a/frontend/utility/YoutubeApiWrappers.cpp +++ b/frontend/utility/YoutubeApiWrappers.cpp @@ -41,7 +41,7 @@ bool IsUserSignedIntoYT() { Auth *auth = OBSBasic::Get()->GetAuth(); if (auth) { - YoutubeApiWrappers *apiYouTube(dynamic_cast(auth)); + YoutubeApiWrappers *apiYouTube(qobject_cast(auth)); if (apiYouTube) { return true; } diff --git a/frontend/widgets/OBSBasic.cpp b/frontend/widgets/OBSBasic.cpp index eae813d2d63ab0..8b5b87906759ae 100644 --- a/frontend/widgets/OBSBasic.cpp +++ b/frontend/widgets/OBSBasic.cpp @@ -2082,7 +2082,7 @@ void OBSBasic::UpdateTitleBar() OBSBasic *OBSBasic::Get() { - return reinterpret_cast(App()->GetMainWindow()); + return qobject_cast(App()->GetMainWindow()); } void OBSBasic::UpdatePatronJson(const QString &text, const QString &error) diff --git a/frontend/widgets/OBSBasic_Clipboard.cpp b/frontend/widgets/OBSBasic_Clipboard.cpp index f42ff23af50979..e79670e8891dde 100644 --- a/frontend/widgets/OBSBasic_Clipboard.cpp +++ b/frontend/widgets/OBSBasic_Clipboard.cpp @@ -164,7 +164,7 @@ void OBSBasic::SourcePasteFilters(OBSSource source, OBSSource dstSource) void OBSBasic::AudioMixerCopyFilters() { - QAction *action = reinterpret_cast(sender()); + QAction *action = qobject_cast(sender()); VolControl *vol = action->property("volControl").value(); obs_source_t *source = vol->GetSource(); @@ -174,7 +174,7 @@ void OBSBasic::AudioMixerCopyFilters() void OBSBasic::AudioMixerPasteFilters() { - QAction *action = reinterpret_cast(sender()); + QAction *action = qobject_cast(sender()); VolControl *vol = action->property("volControl").value(); obs_source_t *dstSource = vol->GetSource(); diff --git a/frontend/widgets/OBSBasic_ContextToolbar.cpp b/frontend/widgets/OBSBasic_ContextToolbar.cpp index 02ea7bcde6529f..410b82602aacf3 100644 --- a/frontend/widgets/OBSBasic_ContextToolbar.cpp +++ b/frontend/widgets/OBSBasic_ContextToolbar.cpp @@ -156,10 +156,10 @@ void OBSBasic::UpdateContextBar(bool force) bool updateNeeded = true; QLayoutItem *la = ui->emptySpace->layout()->itemAt(0); if (la) { - if (SourceToolbar *toolbar = dynamic_cast(la->widget())) { + if (SourceToolbar *toolbar = qobject_cast(la->widget())) { if (toolbar->GetSource() == source) updateNeeded = false; - } else if (MediaControls *toolbar = dynamic_cast(la->widget())) { + } else if (MediaControls *toolbar = qobject_cast(la->widget())) { if (toolbar->GetSource() == source) updateNeeded = false; } diff --git a/frontend/widgets/OBSBasic_Profiles.cpp b/frontend/widgets/OBSBasic_Profiles.cpp index 4c655915fe1edf..765d06f25364da 100644 --- a/frontend/widgets/OBSBasic_Profiles.cpp +++ b/frontend/widgets/OBSBasic_Profiles.cpp @@ -249,7 +249,7 @@ void OBSBasic::DeleteProfile(const QString &name) void OBSBasic::ChangeProfile() { - QAction *action = reinterpret_cast(sender()); + QAction *action = qobject_cast(sender()); if (!action) { return; diff --git a/frontend/widgets/OBSBasic_SceneCollections.cpp b/frontend/widgets/OBSBasic_SceneCollections.cpp index a18e69939de338..1b375b2c64e5ae 100644 --- a/frontend/widgets/OBSBasic_SceneCollections.cpp +++ b/frontend/widgets/OBSBasic_SceneCollections.cpp @@ -337,7 +337,7 @@ void OBSBasic::DeleteSceneCollection(const QString &name) void OBSBasic::ChangeSceneCollection() { - QAction *action = reinterpret_cast(sender()); + QAction *action = qobject_cast(sender()); if (!action) { return; diff --git a/frontend/widgets/OBSBasic_SceneItems.cpp b/frontend/widgets/OBSBasic_SceneItems.cpp index e39e34feb69d9d..5b392865fd70b8 100644 --- a/frontend/widgets/OBSBasic_SceneItems.cpp +++ b/frontend/widgets/OBSBasic_SceneItems.cpp @@ -111,7 +111,7 @@ void OBSBasic::RenameSources(OBSSource source, QString newName, QString prevName void OBSBasic::GetAudioSourceFilters() { - QAction *action = reinterpret_cast(sender()); + QAction *action = qobject_cast(sender()); VolControl *vol = action->property("volControl").value(); obs_source_t *source = vol->GetSource(); @@ -120,7 +120,7 @@ void OBSBasic::GetAudioSourceFilters() void OBSBasic::GetAudioSourceProperties() { - QAction *action = reinterpret_cast(sender()); + QAction *action = qobject_cast(sender()); VolControl *vol = action->property("volControl").value(); obs_source_t *source = vol->GetSource(); @@ -129,7 +129,7 @@ void OBSBasic::GetAudioSourceProperties() void OBSBasic::MixerRenameSource() { - QAction *action = reinterpret_cast(sender()); + QAction *action = qobject_cast(sender()); VolControl *vol = action->property("volControl").value(); OBSSource source = vol->GetSource(); @@ -364,7 +364,7 @@ void OBSBasic::ResetAudioDevice(const char *sourceId, const char *deviceId, cons void OBSBasic::SetDeinterlacingMode() { - QAction *action = reinterpret_cast(sender()); + QAction *action = qobject_cast(sender()); obs_deinterlace_mode mode = (obs_deinterlace_mode)action->property("mode").toInt(); OBSSceneItem sceneItem = GetCurrentSceneItem(); obs_source_t *source = obs_sceneitem_get_source(sceneItem); @@ -374,7 +374,7 @@ void OBSBasic::SetDeinterlacingMode() void OBSBasic::SetDeinterlacingOrder() { - QAction *action = reinterpret_cast(sender()); + QAction *action = qobject_cast(sender()); obs_deinterlace_field_order order = (obs_deinterlace_field_order)action->property("order").toInt(); OBSSceneItem sceneItem = GetCurrentSceneItem(); obs_source_t *source = obs_sceneitem_get_source(sceneItem); @@ -422,7 +422,7 @@ QMenu *OBSBasic::AddDeinterlacingMenu(QMenu *menu, obs_source_t *source) void OBSBasic::SetScaleFilter() { - QAction *action = reinterpret_cast(sender()); + QAction *action = qobject_cast(sender()); obs_scale_type mode = (obs_scale_type)action->property("mode").toInt(); OBSSceneItem sceneItem = GetCurrentSceneItem(); @@ -453,7 +453,7 @@ QMenu *OBSBasic::AddScaleFilteringMenu(QMenu *menu, obs_sceneitem_t *item) void OBSBasic::SetBlendingMethod() { - QAction *action = reinterpret_cast(sender()); + QAction *action = qobject_cast(sender()); obs_blending_method method = (obs_blending_method)action->property("method").toInt(); OBSSceneItem sceneItem = GetCurrentSceneItem(); @@ -480,7 +480,7 @@ QMenu *OBSBasic::AddBlendingMethodMenu(QMenu *menu, obs_sceneitem_t *item) void OBSBasic::SetBlendingMode() { - QAction *action = reinterpret_cast(sender()); + QAction *action = qobject_cast(sender()); obs_blending_type mode = (obs_blending_type)action->property("mode").toInt(); OBSSceneItem sceneItem = GetCurrentSceneItem(); diff --git a/frontend/widgets/OBSBasic_Transitions.cpp b/frontend/widgets/OBSBasic_Transitions.cpp index 4463299466dd3a..4fa8d02d5300a3 100644 --- a/frontend/widgets/OBSBasic_Transitions.cpp +++ b/frontend/widgets/OBSBasic_Transitions.cpp @@ -1137,7 +1137,7 @@ void OBSBasic::AddQuickTransitionId(int id) button->setMenu(buttonMenu); connect(button, &QAbstractButton::clicked, this, &OBSBasic::QuickTransitionClicked); - QVBoxLayout *programLayout = reinterpret_cast(programOptions->layout()); + QVBoxLayout *programLayout = qobject_cast(programOptions->layout()); int idx = 3; for (;; idx++) { @@ -1187,7 +1187,7 @@ void OBSBasic::ClearQuickTransitions() if (!programOptions) return; - QVBoxLayout *programLayout = reinterpret_cast(programOptions->layout()); + QVBoxLayout *programLayout = qobject_cast(programOptions->layout()); for (int idx = 0;; idx++) { QLayoutItem *item = programLayout->itemAt(idx); @@ -1268,7 +1268,7 @@ void OBSBasic::ClearQuickTransitionWidgets() if (!IsPreviewProgramMode()) return; - QVBoxLayout *programLayout = reinterpret_cast(programOptions->layout()); + QVBoxLayout *programLayout = qobject_cast(programOptions->layout()); for (int idx = 0;; idx++) { QLayoutItem *item = programLayout->itemAt(idx); @@ -1310,7 +1310,7 @@ void OBSBasic::EnableTransitionWidgets(bool enable) if (!IsPreviewProgramMode()) return; - QVBoxLayout *programLayout = reinterpret_cast(programOptions->layout()); + QVBoxLayout *programLayout = qobject_cast(programOptions->layout()); for (int idx = 0;; idx++) { QLayoutItem *item = programLayout->itemAt(idx); diff --git a/frontend/widgets/OBSBasic_VolControl.cpp b/frontend/widgets/OBSBasic_VolControl.cpp index 120f8651d4db16..cb87b69a44bc4c 100644 --- a/frontend/widgets/OBSBasic_VolControl.cpp +++ b/frontend/widgets/OBSBasic_VolControl.cpp @@ -71,7 +71,7 @@ void OBSBasic::RefreshVolumeColors() void OBSBasic::HideAudioControl() { - QAction *action = reinterpret_cast(sender()); + QAction *action = qobject_cast(sender()); VolControl *vol = action->property("volControl").value(); obs_source_t *source = vol->GetSource(); @@ -121,7 +121,7 @@ void OBSBasic::ToggleHideMixer() void OBSBasic::LockVolumeControl(bool lock) { - QAction *action = reinterpret_cast(sender()); + QAction *action = qobject_cast(sender()); VolControl *vol = action->property("volControl").value(); obs_source_t *source = vol->GetSource(); @@ -133,7 +133,7 @@ void OBSBasic::LockVolumeControl(bool lock) void OBSBasic::VolControlContextMenu() { - VolControl *vol = reinterpret_cast(sender()); + VolControl *vol = qobject_cast(sender()); /* ------------------- */ diff --git a/frontend/widgets/OBSBasic_YouTube.cpp b/frontend/widgets/OBSBasic_YouTube.cpp index bd708bb3f87401..861c7f9df5367d 100644 --- a/frontend/widgets/OBSBasic_YouTube.cpp +++ b/frontend/widgets/OBSBasic_YouTube.cpp @@ -61,7 +61,7 @@ void OBSBasic::YouTubeActionDialogOk(const QString &broadcast_id, const QString void OBSBasic::YoutubeStreamCheck(const std::string &key) { - YoutubeApiWrappers *apiYouTube(dynamic_cast(GetAuth())); + YoutubeApiWrappers *apiYouTube(qobject_cast(GetAuth())); if (!apiYouTube) { /* technically we should never get here -Lain */ QMetaObject::invokeMethod(this, "ForceStopStreaming", Qt::QueuedConnection); diff --git a/frontend/wizards/AutoConfigStartPage.cpp b/frontend/wizards/AutoConfigStartPage.cpp index 706123a6fe1b58..6830bfc77e843c 100644 --- a/frontend/wizards/AutoConfigStartPage.cpp +++ b/frontend/wizards/AutoConfigStartPage.cpp @@ -6,8 +6,6 @@ #include "moc_AutoConfigStartPage.cpp" -#define wiz reinterpret_cast(wizard()) - AutoConfigStartPage::AutoConfigStartPage(QWidget *parent) : QWizardPage(parent), ui(new Ui_AutoConfigStartPage) { ui->setupUi(this); @@ -18,7 +16,7 @@ AutoConfigStartPage::AutoConfigStartPage(QWidget *parent) : QWizardPage(parent), if (main->VCamEnabled()) { QRadioButton *prioritizeVCam = new QRadioButton(QTStr("Basic.AutoConfig.StartPage.PrioritizeVirtualCam"), this); - QBoxLayout *box = reinterpret_cast(layout()); + QBoxLayout *box = qobject_cast(layout()); box->insertWidget(2, prioritizeVCam); connect(prioritizeVCam, &QPushButton::clicked, this, &AutoConfigStartPage::PrioritizeVCam); @@ -29,20 +27,20 @@ AutoConfigStartPage::~AutoConfigStartPage() {} int AutoConfigStartPage::nextId() const { - return wiz->type == AutoConfig::Type::VirtualCam ? AutoConfig::TestPage : AutoConfig::VideoPage; + return autoConfig()->type == AutoConfig::Type::VirtualCam ? AutoConfig::TestPage : AutoConfig::VideoPage; } void AutoConfigStartPage::on_prioritizeStreaming_clicked() { - wiz->type = AutoConfig::Type::Streaming; + autoConfig()->type = AutoConfig::Type::Streaming; } void AutoConfigStartPage::on_prioritizeRecording_clicked() { - wiz->type = AutoConfig::Type::Recording; + autoConfig()->type = AutoConfig::Type::Recording; } void AutoConfigStartPage::PrioritizeVCam() { - wiz->type = AutoConfig::Type::VirtualCam; + autoConfig()->type = AutoConfig::Type::VirtualCam; } diff --git a/frontend/wizards/AutoConfigStartPage.hpp b/frontend/wizards/AutoConfigStartPage.hpp index 73cff283831887..5a3019603ae184 100644 --- a/frontend/wizards/AutoConfigStartPage.hpp +++ b/frontend/wizards/AutoConfigStartPage.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include class Ui_AutoConfigStartPage; @@ -11,6 +13,9 @@ class AutoConfigStartPage : public QWizardPage { std::unique_ptr ui; +protected: + AutoConfig *autoConfig() const { return qobject_cast(wizard()); } + public: AutoConfigStartPage(QWidget *parent = nullptr); ~AutoConfigStartPage(); diff --git a/frontend/wizards/AutoConfigStreamPage.cpp b/frontend/wizards/AutoConfigStreamPage.cpp index 1e5c47536e4037..e03e6279e1201b 100644 --- a/frontend/wizards/AutoConfigStreamPage.cpp +++ b/frontend/wizards/AutoConfigStreamPage.cpp @@ -23,8 +23,6 @@ enum class ListOpt : int { struct QCef; extern QCef *cef; -#define wiz reinterpret_cast(wizard()) - AutoConfigStreamPage::AutoConfigStreamPage(QWidget *parent) : QWizardPage(parent), ui(new Ui_AutoConfigStreamPage) { ui->setupUi(this); @@ -101,11 +99,11 @@ bool AutoConfigStreamPage::validatePage() { OBSDataAutoRelease service_settings = obs_data_create(); - wiz->customServer = IsCustomService(); + autoConfig()->customServer = IsCustomService(); - const char *serverType = wiz->customServer ? "rtmp_custom" : "rtmp_common"; + const char *serverType = autoConfig()->customServer ? "rtmp_custom" : "rtmp_common"; - if (!wiz->customServer) { + if (!autoConfig()->customServer) { obs_data_set_string(service_settings, "service", QT_TO_UTF8(ui->service->currentText())); } @@ -114,17 +112,17 @@ bool AutoConfigStreamPage::validatePage() int bitrate; if (!ui->doBandwidthTest->isChecked()) { bitrate = ui->bitrate->value(); - wiz->idealBitrate = bitrate; + autoConfig()->idealBitrate = bitrate; } else { /* Default test target is 10 Mbps */ bitrate = 10000; #ifdef YOUTUBE_ENABLED - if (IsYouTubeService(wiz->serviceName)) { + if (IsYouTubeService(autoConfig()->serviceName)) { /* Adjust upper bound to YouTube limits * for resolutions above 1080p */ - if (wiz->baseResolutionCY > 1440) + if (autoConfig()->baseResolutionCY > 1440) bitrate = 51000; - else if (wiz->baseResolutionCY > 1080) + else if (autoConfig()->baseResolutionCY > 1080) bitrate = 18000; } #endif @@ -134,48 +132,48 @@ bool AutoConfigStreamPage::validatePage() obs_data_set_int(settings, "bitrate", bitrate); obs_service_apply_encoder_settings(service, settings, nullptr); - if (wiz->customServer) { + if (autoConfig()->customServer) { QString server = ui->customServer->text().trimmed(); - wiz->server = wiz->serverName = QT_TO_UTF8(server); + autoConfig()->server = autoConfig()->serverName = QT_TO_UTF8(server); } else { - wiz->serverName = QT_TO_UTF8(ui->server->currentText()); - wiz->server = QT_TO_UTF8(ui->server->currentData().toString()); + autoConfig()->serverName = QT_TO_UTF8(ui->server->currentText()); + autoConfig()->server = QT_TO_UTF8(ui->server->currentData().toString()); } - wiz->bandwidthTest = ui->doBandwidthTest->isChecked(); - wiz->startingBitrate = (int)obs_data_get_int(settings, "bitrate"); - wiz->idealBitrate = wiz->startingBitrate; - wiz->regionUS = ui->regionUS->isChecked(); - wiz->regionEU = ui->regionEU->isChecked(); - wiz->regionAsia = ui->regionAsia->isChecked(); - wiz->regionOther = ui->regionOther->isChecked(); - wiz->serviceName = QT_TO_UTF8(ui->service->currentText()); + autoConfig()->bandwidthTest = ui->doBandwidthTest->isChecked(); + autoConfig()->startingBitrate = (int)obs_data_get_int(settings, "bitrate"); + autoConfig()->idealBitrate = autoConfig()->startingBitrate; + autoConfig()->regionUS = ui->regionUS->isChecked(); + autoConfig()->regionEU = ui->regionEU->isChecked(); + autoConfig()->regionAsia = ui->regionAsia->isChecked(); + autoConfig()->regionOther = ui->regionOther->isChecked(); + autoConfig()->serviceName = QT_TO_UTF8(ui->service->currentText()); if (ui->preferHardware) - wiz->preferHardware = ui->preferHardware->isChecked(); - wiz->key = QT_TO_UTF8(ui->key->text()); + autoConfig()->preferHardware = ui->preferHardware->isChecked(); + autoConfig()->key = QT_TO_UTF8(ui->key->text()); - if (!wiz->customServer) { - if (wiz->serviceName == "Twitch") - wiz->service = AutoConfig::Service::Twitch; + if (!autoConfig()->customServer) { + if (autoConfig()->serviceName == "Twitch") + autoConfig()->service = AutoConfig::Service::Twitch; #ifdef YOUTUBE_ENABLED - else if (IsYouTubeService(wiz->serviceName)) - wiz->service = AutoConfig::Service::YouTube; + else if (IsYouTubeService(autoConfig()->serviceName)) + autoConfig()->service = AutoConfig::Service::YouTube; #endif - else if (wiz->serviceName == "Amazon IVS") - wiz->service = AutoConfig::Service::AmazonIVS; + else if (autoConfig()->serviceName == "Amazon IVS") + autoConfig()->service = AutoConfig::Service::AmazonIVS; else - wiz->service = AutoConfig::Service::Other; + autoConfig()->service = AutoConfig::Service::Other; } else { - wiz->service = AutoConfig::Service::Other; + autoConfig()->service = AutoConfig::Service::Other; } - if (wiz->service == AutoConfig::Service::Twitch) { - wiz->testMultitrackVideo = ui->useMultitrackVideo->isChecked(); + if (autoConfig()->service == AutoConfig::Service::Twitch) { + autoConfig()->testMultitrackVideo = ui->useMultitrackVideo->isChecked(); - if (wiz->testMultitrackVideo) { + if (autoConfig()->testMultitrackVideo) { std::vector canvases; canvases.emplace_back(obs_get_main_canvas()); - auto postData = constructGoLivePost(QString::fromStdString(wiz->key), std::nullopt, + auto postData = constructGoLivePost(QString::fromStdString(autoConfig()->key), std::nullopt, std::nullopt, false, canvases); OBSDataAutoRelease service_settings = obs_service_get_settings(service); @@ -197,7 +195,7 @@ bool AutoConfigStreamPage::validatePage() if (pos != address.npos) address.erase(pos); - wiz->serviceConfigServers.push_back({address, address}); + autoConfig()->serviceConfigServers.push_back({address, address}); } int multitrackVideoBitrate = 0; @@ -215,10 +213,10 @@ bool AutoConfigStreamPage::validatePage() } if (multitrackVideoBitrate > 0) { - wiz->startingBitrate = multitrackVideoBitrate; - wiz->idealBitrate = multitrackVideoBitrate; - wiz->multitrackVideo.targetBitrate = multitrackVideoBitrate; - wiz->multitrackVideo.testSuccessful = true; + autoConfig()->startingBitrate = multitrackVideoBitrate; + autoConfig()->idealBitrate = multitrackVideoBitrate; + autoConfig()->multitrackVideo.targetBitrate = multitrackVideoBitrate; + autoConfig()->multitrackVideo.testSuccessful = true; } } catch (const MultitrackVideoError & /*err*/) { // FIXME: do something sensible @@ -226,8 +224,9 @@ bool AutoConfigStreamPage::validatePage() } } - if (wiz->service != AutoConfig::Service::Twitch && wiz->service != AutoConfig::Service::YouTube && - wiz->service != AutoConfig::Service::AmazonIVS && wiz->bandwidthTest) { + if (autoConfig()->service != AutoConfig::Service::Twitch && + autoConfig()->service != AutoConfig::Service::YouTube && + autoConfig()->service != AutoConfig::Service::AmazonIVS && autoConfig()->bandwidthTest) { QMessageBox::StandardButton button; #define WARNING_TEXT(x) QTStr("Basic.AutoConfig.StreamPage.StreamWarning." x) button = OBSMessageBox::question(this, WARNING_TEXT("Title"), WARNING_TEXT("Text")); @@ -253,7 +252,7 @@ void AutoConfigStreamPage::on_show_clicked() void AutoConfigStreamPage::OnOAuthStreamKeyConnected() { - OAuthStreamKey *a = reinterpret_cast(auth.get()); + OAuthStreamKey *a = qobject_cast(auth.get()); if (a) { bool validKey = !a->key().empty(); @@ -279,7 +278,7 @@ void AutoConfigStreamPage::OnOAuthStreamKeyConnected() ui->connectedAccountText->setText(QTStr("Auth.LoadingChannel.Title")); - YoutubeApiWrappers *ytAuth = reinterpret_cast(a); + YoutubeApiWrappers *ytAuth = qobject_cast(a); ChannelDescription cd; if (ytAuth->GetChannelDescription(cd)) { ui->connectedAccountText->setText(cd.title); @@ -393,7 +392,7 @@ void AutoConfigStreamPage::reset_service_ui_fields(std::string &service) { #ifdef YOUTUBE_ENABLED // when account is already connected: - OAuthStreamKey *a = reinterpret_cast(auth.get()); + OAuthStreamKey *a = qobject_cast(auth.get()); if (a && service == a->service() && IsYouTubeService(a->service())) { ui->connectedAccountLabel->setVisible(true); ui->connectedAccountText->setVisible(true); @@ -473,13 +472,14 @@ void AutoConfigStreamPage::ServiceChanged() ui->useMultitrackVideo->setVisible(ertmp_multitrack_video_available); ui->useMultitrackVideo->setText( QTStr("Basic.AutoConfig.StreamPage.UseMultitrackVideo").arg(multitrack_video_name)); - ui->multitrackVideoInfo->setEnabled(wiz->hardwareEncodingAvailable); - ui->useMultitrackVideo->setEnabled(wiz->hardwareEncodingAvailable); + ui->multitrackVideoInfo->setEnabled(autoConfig()->hardwareEncodingAvailable); + ui->useMultitrackVideo->setEnabled(autoConfig()->hardwareEncodingAvailable); reset_service_ui_fields(service); /* Test three closest servers if "Auto" is available for Twitch */ - if ((service == "Twitch" && wiz->twitchAuto) || (service == "Amazon IVS" && wiz->amazonIVSAuto)) + if ((service == "Twitch" && autoConfig()->twitchAuto) || + (service == "Amazon IVS" && autoConfig()->amazonIVSAuto)) regionBased = false; ui->streamkeyPageLayout->removeWidget(ui->serverLabel); @@ -502,7 +502,7 @@ void AutoConfigStreamPage::ServiceChanged() ui->serverLabel->setHidden(testBandwidth); } - wiz->testRegions = regionBased && testBandwidth; + autoConfig()->testRegions = regionBased && testBandwidth; ui->bitrateLabel->setHidden(testBandwidth); ui->bitrate->setHidden(testBandwidth); @@ -691,7 +691,7 @@ void AutoConfigStreamPage::UpdateCompleted() if (custom) { ready = !ui->customServer->text().isEmpty(); } else { - ready = !wiz->testRegions || ui->regionUS->isChecked() || ui->regionEU->isChecked() || + ready = !autoConfig()->testRegions || ui->regionUS->isChecked() || ui->regionEU->isChecked() || ui->regionAsia->isChecked() || ui->regionOther->isChecked(); } } diff --git a/frontend/wizards/AutoConfigStreamPage.hpp b/frontend/wizards/AutoConfigStreamPage.hpp index 89216c461c67d1..166da2df47bc30 100644 --- a/frontend/wizards/AutoConfigStreamPage.hpp +++ b/frontend/wizards/AutoConfigStreamPage.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include class Auth; @@ -24,6 +26,9 @@ class AutoConfigStreamPage : public QWizardPage { void LoadServices(bool showAll); inline bool IsCustomService() const; +protected: + AutoConfig *autoConfig() const { return qobject_cast(wizard()); } + public: AutoConfigStreamPage(QWidget *parent = nullptr); ~AutoConfigStreamPage(); diff --git a/frontend/wizards/AutoConfigTestPage.cpp b/frontend/wizards/AutoConfigTestPage.cpp index c6547ba1b14912..c5a50d702700a4 100644 --- a/frontend/wizards/AutoConfigTestPage.cpp +++ b/frontend/wizards/AutoConfigTestPage.cpp @@ -27,8 +27,6 @@ #define TEST_RESULT_SE TEST_STR("Result.StreamingEncoder") #define TEST_RESULT_RE TEST_STR("Result.RecordingEncoder") -#define wiz reinterpret_cast(wizard()) - using namespace std; void AutoConfigTestPage::StartBandwidthStage() @@ -52,7 +50,7 @@ void AutoConfigTestPage::StartRecordingEncoderStage() void AutoConfigTestPage::GetServers(std::vector &servers) { OBSDataAutoRelease settings = obs_data_create(); - obs_data_set_string(settings, "service", wiz->serviceName.c_str()); + obs_data_set_string(settings, "service", autoConfig()->serviceName.c_str()); obs_properties_t *ppts = obs_get_service_properties("rtmp_common"); obs_property_t *p = obs_properties_get(ppts, "service"); @@ -66,7 +64,7 @@ void AutoConfigTestPage::GetServers(std::vector &servers) const char *name = obs_property_list_item_name(p, i); const char *server = obs_property_list_item_string(p, i); - if (wiz->CanTestServer(name)) { + if (autoConfig()->CanTestServer(name)) { ServerInfo info(name, server); servers.push_back(info); } @@ -117,7 +115,7 @@ void AutoConfigTestPage::TestBandwidthThread() /* -----------------------------------*/ /* create obs objects */ - const char *serverType = wiz->customServer ? "rtmp_custom" : "rtmp_common"; + const char *serverType = autoConfig()->customServer ? "rtmp_custom" : "rtmp_common"; OBSEncoderAutoRelease vencoder = obs_video_encoder_create("obs_x264", "test_x264", nullptr, nullptr); OBSEncoderAutoRelease aencoder = obs_audio_encoder_create("ffmpeg_aac", "test_aac", nullptr, 0, nullptr); @@ -138,19 +136,20 @@ void AutoConfigTestPage::TestBandwidthThread() OBSDataAutoRelease aencoder_settings = obs_data_create(); OBSDataAutoRelease output_settings = obs_data_create(); - std::string key = wiz->key; - if (wiz->service == AutoConfig::Service::Twitch || wiz->service == AutoConfig::Service::AmazonIVS) { + std::string key = autoConfig()->key; + if (autoConfig()->service == AutoConfig::Service::Twitch || + autoConfig()->service == AutoConfig::Service::AmazonIVS) { string_depad_key(key); key += "?bandwidthtest"; - } else if (wiz->serviceName == "Restream.io" || wiz->serviceName == "Restream.io - RTMP") { + } else if (autoConfig()->serviceName == "Restream.io" || autoConfig()->serviceName == "Restream.io - RTMP") { string_depad_key(key); key += "?test=true"; } - obs_data_set_string(service_settings, "service", wiz->serviceName.c_str()); + obs_data_set_string(service_settings, "service", autoConfig()->serviceName.c_str()); obs_data_set_string(service_settings, "key", key.c_str()); - obs_data_set_int(vencoder_settings, "bitrate", wiz->startingBitrate); + obs_data_set_int(vencoder_settings, "bitrate", autoConfig()->startingBitrate); obs_data_set_string(vencoder_settings, "rate_control", "CBR"); obs_data_set_string(vencoder_settings, "preset", "veryfast"); obs_data_set_int(vencoder_settings, "keyint_sec", 2); @@ -168,35 +167,36 @@ void AutoConfigTestPage::TestBandwidthThread() /* determine which servers to test */ std::vector servers; - if (wiz->customServer) - servers.emplace_back(wiz->server.c_str(), wiz->server.c_str()); + if (autoConfig()->customServer) + servers.emplace_back(autoConfig()->server.c_str(), autoConfig()->server.c_str()); else GetServers(servers); /* just use the first server if it only has one alternate server, * or if using Restream or Nimo TV due to their "auto" servers */ - if (servers.size() < 3 || wiz->serviceName.substr(0, 11) == "Restream.io" || wiz->serviceName == "Nimo TV") { + if (servers.size() < 3 || autoConfig()->serviceName.substr(0, 11) == "Restream.io" || + autoConfig()->serviceName == "Nimo TV") { servers.resize(1); - } else if ((wiz->service == AutoConfig::Service::Twitch && wiz->twitchAuto) || - (wiz->service == AutoConfig::Service::AmazonIVS && wiz->amazonIVSAuto)) { + } else if ((autoConfig()->service == AutoConfig::Service::Twitch && autoConfig()->twitchAuto) || + (autoConfig()->service == AutoConfig::Service::AmazonIVS && autoConfig()->amazonIVSAuto)) { /* if using Twitch and "Auto" is available, test 3 closest * server */ servers.erase(servers.begin() + 1); servers.resize(3); - } else if (wiz->service == AutoConfig::Service::YouTube) { + } else if (autoConfig()->service == AutoConfig::Service::YouTube) { /* Only test first set of primary + backup servers */ servers.resize(2); } - if (!wiz->serviceConfigServers.empty()) { - if (wiz->service == AutoConfig::Service::Twitch && wiz->twitchAuto) { + if (!autoConfig()->serviceConfigServers.empty()) { + if (autoConfig()->service == AutoConfig::Service::Twitch && autoConfig()->twitchAuto) { // servers from Twitch service config replace the "auto" entry servers.erase(servers.begin()); } - for (auto it = std::rbegin(wiz->serviceConfigServers); it != std::rend(wiz->serviceConfigServers); - it++) { + for (auto it = std::rbegin(autoConfig()->serviceConfigServers); + it != std::rend(autoConfig()->serviceConfigServers); it++) { auto same_server = std::find_if(std::begin(servers), std::end(servers), [&](const ServerInfo &si) { return si.address == it->address; }); @@ -205,7 +205,7 @@ void AutoConfigTestPage::TestBandwidthThread() servers.emplace(std::begin(servers), it->name.c_str(), it->address.c_str()); } - if (wiz->service == AutoConfig::Service::Twitch && wiz->twitchAuto) { + if (autoConfig()->service == AutoConfig::Service::Twitch && autoConfig()->twitchAuto) { // see above, only test 3 servers // rtmps urls are currently counted as separate servers servers.resize(3); @@ -218,8 +218,8 @@ void AutoConfigTestPage::TestBandwidthThread() obs_service_update(service, service_settings); obs_service_apply_encoder_settings(service, vencoder_settings, aencoder_settings); - if (wiz->multitrackVideo.testSuccessful) { - obs_data_set_int(vencoder_settings, "bitrate", wiz->startingBitrate); + if (autoConfig()->multitrackVideo.testSuccessful) { + obs_data_set_int(vencoder_settings, "bitrate", autoConfig()->startingBitrate); } /* -----------------------------------*/ @@ -382,10 +382,11 @@ void AutoConfigTestPage::TestBandwidthThread() int total_bytes = (int)obs_output_get_total_bytes(output) - start_bytes; uint64_t bitrate = util_mul_div64(total_bytes, 8ULL * 1000000000ULL / 1000ULL, total_time); - if (obs_output_get_frames_dropped(output) || (int)bitrate < (wiz->startingBitrate * 75 / 100)) { + if (obs_output_get_frames_dropped(output) || + (int)bitrate < (autoConfig()->startingBitrate * 75 / 100)) { server.bitrate = (int)bitrate * 70 / 100; } else { - server.bitrate = wiz->startingBitrate; + server.bitrate = autoConfig()->startingBitrate; } server.ms = obs_output_get_connect_time_ms(output); @@ -413,9 +414,9 @@ void AutoConfigTestPage::TestBandwidthThread() } } - wiz->server = std::move(bestServer); - wiz->serverName = std::move(bestServerName); - wiz->idealBitrate = bestBitrate; + autoConfig()->server = std::move(bestServer); + autoConfig()->serverName = std::move(bestServerName); + autoConfig()->idealBitrate = bestBitrate; QMetaObject::invokeMethod(this, "NextStage"); } @@ -493,9 +494,9 @@ bool AutoConfigTestPage::TestSoftwareEncoding() OBSDataAutoRelease vencoder_settings = obs_data_create(); obs_data_set_int(aencoder_settings, "bitrate", 32); - if (wiz->type != AutoConfig::Type::Recording) { + if (autoConfig()->type != AutoConfig::Type::Recording) { obs_data_set_int(vencoder_settings, "keyint_sec", 2); - obs_data_set_int(vencoder_settings, "bitrate", wiz->idealBitrate); + obs_data_set_int(vencoder_settings, "bitrate", autoConfig()->idealBitrate); obs_data_set_string(vencoder_settings, "rate_control", "CBR"); obs_data_set_string(vencoder_settings, "profile", "main"); obs_data_set_string(vencoder_settings, "preset", "veryfast"); @@ -539,8 +540,8 @@ bool AutoConfigTestPage::TestSoftwareEncoding() /* -----------------------------------*/ /* calculate starting resolution */ - int baseCX = wiz->baseResolutionCX; - int baseCY = wiz->baseResolutionCY; + int baseCX = autoConfig()->baseResolutionCX; + int baseCY = autoConfig()->baseResolutionCY; CalcBaseRes(baseCX, baseCY); /* -----------------------------------*/ @@ -585,17 +586,17 @@ bool AutoConfigTestPage::TestSoftwareEncoding() return true; if (!fps_num || !fps_den) { - fps_num = wiz->specificFPSNum; - fps_den = wiz->specificFPSDen; + fps_num = autoConfig()->specificFPSNum; + fps_den = autoConfig()->specificFPSDen; } long double fps = ((long double)fps_num / (long double)fps_den); int cx = int(((long double)baseCX / (long double)baseCY) * (long double)cy); - if (!force && wiz->type != AutoConfig::Type::Recording) { + if (!force && autoConfig()->type != AutoConfig::Type::Recording) { int est = EstimateMinBitrate(cx, cy, fps_num, fps_den); - if (est > wiz->idealBitrate) + if (est > autoConfig()->idealBitrate) return true; } @@ -640,7 +641,7 @@ bool AutoConfigTestPage::TestSoftwareEncoding() return !cancel; }; - if (wiz->specificFPSNum && wiz->specificFPSDen) { + if (autoConfig()->specificFPSNum && autoConfig()->specificFPSDen) { count = 7; if (!testRes(2160, 0, 0, false)) return false; @@ -693,7 +694,7 @@ bool AutoConfigTestPage::TestSoftwareEncoding() int minArea = 960 * 540 + 1000; - if (!wiz->specificFPSNum && wiz->preferHighFPS && results.size() > 1) { + if (!autoConfig()->specificFPSNum && autoConfig()->preferHighFPS && results.size() > 1) { Result &result1 = results[0]; Result &result2 = results[1]; @@ -705,26 +706,26 @@ bool AutoConfigTestPage::TestSoftwareEncoding() } Result result = results.front(); - wiz->idealResolutionCX = result.cx; - wiz->idealResolutionCY = result.cy; - wiz->idealFPSNum = result.fps_num; - wiz->idealFPSDen = result.fps_den; + autoConfig()->idealResolutionCX = result.cx; + autoConfig()->idealResolutionCY = result.cy; + autoConfig()->idealFPSNum = result.fps_num; + autoConfig()->idealFPSDen = result.fps_den; long double fUpperBitrate = EstimateUpperBitrate(result.cx, result.cy, result.fps_num, result.fps_den); int upperBitrate = int(floor(fUpperBitrate / 50.0l) * 50.0l); - if (wiz->streamingEncoder != AutoConfig::Encoder::x264) { + if (autoConfig()->streamingEncoder != AutoConfig::Encoder::x264) { upperBitrate *= 114; upperBitrate /= 100; } - if (wiz->testMultitrackVideo && wiz->multitrackVideo.testSuccessful && - !wiz->multitrackVideo.bitrate.has_value()) - wiz->multitrackVideo.bitrate = wiz->idealBitrate; + if (autoConfig()->testMultitrackVideo && autoConfig()->multitrackVideo.testSuccessful && + !autoConfig()->multitrackVideo.bitrate.has_value()) + autoConfig()->multitrackVideo.bitrate = autoConfig()->idealBitrate; - if (wiz->idealBitrate > upperBitrate) - wiz->idealBitrate = upperBitrate; + if (autoConfig()->idealBitrate > upperBitrate) + autoConfig()->idealBitrate = upperBitrate; softwareTested = true; return true; @@ -732,8 +733,8 @@ bool AutoConfigTestPage::TestSoftwareEncoding() void AutoConfigTestPage::FindIdealHardwareResolution() { - int baseCX = wiz->baseResolutionCX; - int baseCY = wiz->baseResolutionCY; + int baseCX = autoConfig()->baseResolutionCX; + int baseCY = autoConfig()->baseResolutionCY; CalcBaseRes(baseCX, baseCY); vector results; @@ -754,8 +755,8 @@ void AutoConfigTestPage::FindIdealHardwareResolution() return; if (!fps_num || !fps_den) { - fps_num = wiz->specificFPSNum; - fps_den = wiz->specificFPSDen; + fps_num = autoConfig()->specificFPSNum; + fps_den = autoConfig()->specificFPSDen; } long double fps = ((long double)fps_num / (long double)fps_den); @@ -766,7 +767,7 @@ void AutoConfigTestPage::FindIdealHardwareResolution() if (!force && rate > maxDataRate) return; - AutoConfig::Encoder encType = wiz->streamingEncoder; + AutoConfig::Encoder encType = autoConfig()->streamingEncoder; bool nvenc = encType == AutoConfig::Encoder::NVENC; int minBitrate = EstimateMinBitrate(cx, cy, fps_num, fps_den); @@ -778,13 +779,13 @@ void AutoConfigTestPage::FindIdealHardwareResolution() if (!nvenc) minBitrate = minBitrate * 114 / 100; - if (wiz->type == AutoConfig::Type::Recording) + if (autoConfig()->type == AutoConfig::Type::Recording) force = true; - if (force || wiz->idealBitrate >= minBitrate) + if (force || autoConfig()->idealBitrate >= minBitrate) results.emplace_back(cx, cy, fps_num, fps_den); }; - if (wiz->specificFPSNum && wiz->specificFPSDen) { + if (autoConfig()->specificFPSNum && autoConfig()->specificFPSDen) { testRes(2160, 0, 0, false); testRes(1440, 0, 0, false); testRes(1080, 0, 0, false); @@ -811,7 +812,7 @@ void AutoConfigTestPage::FindIdealHardwareResolution() int minArea = 960 * 540 + 1000; - if (!wiz->specificFPSNum && wiz->preferHighFPS && results.size() > 1) { + if (!autoConfig()->specificFPSNum && autoConfig()->preferHighFPS && results.size() > 1) { Result &result1 = results[0]; Result &result2 = results[1]; @@ -823,17 +824,17 @@ void AutoConfigTestPage::FindIdealHardwareResolution() } Result result = results.front(); - wiz->idealResolutionCX = result.cx; - wiz->idealResolutionCY = result.cy; - wiz->idealFPSNum = result.fps_num; - wiz->idealFPSDen = result.fps_den; + autoConfig()->idealResolutionCX = result.cx; + autoConfig()->idealResolutionCY = result.cy; + autoConfig()->idealFPSNum = result.fps_num; + autoConfig()->idealFPSDen = result.fps_den; } void AutoConfigTestPage::TestStreamEncoderThread() { - bool preferHardware = wiz->preferHardware; + bool preferHardware = autoConfig()->preferHardware; if (!softwareTested) { - if (!preferHardware || !wiz->hardwareEncodingAvailable) { + if (!preferHardware || !autoConfig()->hardwareEncodingAvailable) { if (!TestSoftwareEncoding()) { return; } @@ -841,29 +842,29 @@ void AutoConfigTestPage::TestStreamEncoderThread() } if (!softwareTested) { - if (wiz->nvencAvailable) - wiz->streamingEncoder = AutoConfig::Encoder::NVENC; - else if (wiz->qsvAvailable) - wiz->streamingEncoder = AutoConfig::Encoder::QSV; - else if (wiz->appleAvailable) - wiz->streamingEncoder = AutoConfig::Encoder::Apple; + if (autoConfig()->nvencAvailable) + autoConfig()->streamingEncoder = AutoConfig::Encoder::NVENC; + else if (autoConfig()->qsvAvailable) + autoConfig()->streamingEncoder = AutoConfig::Encoder::QSV; + else if (autoConfig()->appleAvailable) + autoConfig()->streamingEncoder = AutoConfig::Encoder::Apple; else - wiz->streamingEncoder = AutoConfig::Encoder::AMD; + autoConfig()->streamingEncoder = AutoConfig::Encoder::AMD; } else { - wiz->streamingEncoder = AutoConfig::Encoder::x264; + autoConfig()->streamingEncoder = AutoConfig::Encoder::x264; } #ifdef __linux__ // On linux CBR rate control is not guaranteed so fallback to x264. - if (wiz->streamingEncoder == AutoConfig::Encoder::QSV) { - wiz->streamingEncoder = AutoConfig::Encoder::x264; + if (autoConfig()->streamingEncoder == AutoConfig::Encoder::QSV) { + autoConfig()->streamingEncoder = AutoConfig::Encoder::x264; if (!TestSoftwareEncoding()) { return; } } #endif - if (preferHardware && !softwareTested && wiz->hardwareEncodingAvailable) + if (preferHardware && !softwareTested && autoConfig()->hardwareEncodingAvailable) FindIdealHardwareResolution(); QMetaObject::invokeMethod(this, "NextStage"); @@ -871,36 +872,36 @@ void AutoConfigTestPage::TestStreamEncoderThread() void AutoConfigTestPage::TestRecordingEncoderThread() { - if (!wiz->hardwareEncodingAvailable && !softwareTested) { + if (!autoConfig()->hardwareEncodingAvailable && !softwareTested) { if (!TestSoftwareEncoding()) { return; } } - if (wiz->type == AutoConfig::Type::Recording && wiz->hardwareEncodingAvailable) + if (autoConfig()->type == AutoConfig::Type::Recording && autoConfig()->hardwareEncodingAvailable) FindIdealHardwareResolution(); - wiz->recordingQuality = AutoConfig::Quality::High; + autoConfig()->recordingQuality = AutoConfig::Quality::High; - bool recordingOnly = wiz->type == AutoConfig::Type::Recording; + bool recordingOnly = autoConfig()->type == AutoConfig::Type::Recording; - if (wiz->hardwareEncodingAvailable) { - if (wiz->nvencAvailable) - wiz->recordingEncoder = AutoConfig::Encoder::NVENC; - else if (wiz->qsvAvailable) - wiz->recordingEncoder = AutoConfig::Encoder::QSV; - else if (wiz->appleAvailable) - wiz->recordingEncoder = AutoConfig::Encoder::Apple; + if (autoConfig()->hardwareEncodingAvailable) { + if (autoConfig()->nvencAvailable) + autoConfig()->recordingEncoder = AutoConfig::Encoder::NVENC; + else if (autoConfig()->qsvAvailable) + autoConfig()->recordingEncoder = AutoConfig::Encoder::QSV; + else if (autoConfig()->appleAvailable) + autoConfig()->recordingEncoder = AutoConfig::Encoder::Apple; else - wiz->recordingEncoder = AutoConfig::Encoder::AMD; + autoConfig()->recordingEncoder = AutoConfig::Encoder::AMD; } else { - wiz->recordingEncoder = AutoConfig::Encoder::x264; + autoConfig()->recordingEncoder = AutoConfig::Encoder::x264; } - if (wiz->recordingEncoder != AutoConfig::Encoder::NVENC) { + if (autoConfig()->recordingEncoder != AutoConfig::Encoder::NVENC) { if (!recordingOnly) { - wiz->recordingEncoder = AutoConfig::Encoder::Stream; - wiz->recordingQuality = AutoConfig::Quality::Stream; + autoConfig()->recordingEncoder = AutoConfig::Encoder::Stream; + autoConfig()->recordingQuality = AutoConfig::Quality::Stream; } } @@ -967,21 +968,21 @@ void AutoConfigTestPage::FinalizeResults() return new QLabel(QTStr(str), this); }; - if (wiz->type == AutoConfig::Type::Streaming) { - const char *serverType = wiz->customServer ? "rtmp_custom" : "rtmp_common"; + if (autoConfig()->type == AutoConfig::Type::Streaming) { + const char *serverType = autoConfig()->customServer ? "rtmp_custom" : "rtmp_common"; OBSServiceAutoRelease service = obs_service_create(serverType, "temp_service", nullptr, nullptr); OBSDataAutoRelease service_settings = obs_data_create(); OBSDataAutoRelease vencoder_settings = obs_data_create(); - if (wiz->testMultitrackVideo && wiz->multitrackVideo.testSuccessful && - !wiz->multitrackVideo.bitrate.has_value()) - wiz->multitrackVideo.bitrate = wiz->idealBitrate; + if (autoConfig()->testMultitrackVideo && autoConfig()->multitrackVideo.testSuccessful && + !autoConfig()->multitrackVideo.bitrate.has_value()) + autoConfig()->multitrackVideo.bitrate = autoConfig()->idealBitrate; - obs_data_set_int(vencoder_settings, "bitrate", wiz->idealBitrate); + obs_data_set_int(vencoder_settings, "bitrate", autoConfig()->idealBitrate); - obs_data_set_string(service_settings, "service", wiz->serviceName.c_str()); + obs_data_set_string(service_settings, "service", autoConfig()->serviceName.c_str()); obs_service_update(service, service_settings); obs_service_apply_encoder_settings(service, vencoder_settings, nullptr); @@ -992,51 +993,53 @@ void AutoConfigTestPage::FinalizeResults() obs_service_get_max_fps(service, &maxFPS); if (res_list) { - set_closest_res(wiz->idealResolutionCX, wiz->idealResolutionCY, res_list, res_count); + set_closest_res(autoConfig()->idealResolutionCX, autoConfig()->idealResolutionCY, res_list, + res_count); } if (maxFPS) { - double idealFPS = (double)wiz->idealFPSNum / (double)wiz->idealFPSDen; + double idealFPS = (double)autoConfig()->idealFPSNum / (double)autoConfig()->idealFPSDen; if (idealFPS > (double)maxFPS) { - wiz->idealFPSNum = maxFPS; - wiz->idealFPSDen = 1; + autoConfig()->idealFPSNum = maxFPS; + autoConfig()->idealFPSDen = 1; } } - wiz->idealBitrate = (int)obs_data_get_int(vencoder_settings, "bitrate"); + autoConfig()->idealBitrate = (int)obs_data_get_int(vencoder_settings, "bitrate"); - if (!wiz->customServer) + if (!autoConfig()->customServer) form->addRow(newLabel("Basic.AutoConfig.StreamPage.Service"), - new QLabel(wiz->serviceName.c_str(), ui->finishPage)); + new QLabel(autoConfig()->serviceName.c_str(), ui->finishPage)); form->addRow(newLabel("Basic.AutoConfig.StreamPage.Server"), - new QLabel(wiz->serverName.c_str(), ui->finishPage)); + new QLabel(autoConfig()->serverName.c_str(), ui->finishPage)); form->addRow(newLabel("Basic.Settings.Stream.MultitrackVideoLabel"), - newLabel(wiz->multitrackVideo.testSuccessful ? "Yes" : "No")); + newLabel(autoConfig()->multitrackVideo.testSuccessful ? "Yes" : "No")); - if (wiz->multitrackVideo.testSuccessful) { + if (autoConfig()->multitrackVideo.testSuccessful) { form->addRow(newLabel("Basic.Settings.Output.VideoBitrate"), newLabel("Automatic")); form->addRow(newLabel(TEST_RESULT_SE), newLabel("Automatic")); form->addRow(newLabel("Basic.AutoConfig.TestPage.Result.StreamingResolution"), newLabel("Automatic")); } else { form->addRow(newLabel("Basic.Settings.Output.VideoBitrate"), - new QLabel(QString::number(wiz->idealBitrate), ui->finishPage)); + new QLabel(QString::number(autoConfig()->idealBitrate), ui->finishPage)); form->addRow(newLabel(TEST_RESULT_SE), - new QLabel(encName(wiz->streamingEncoder), ui->finishPage)); + new QLabel(encName(autoConfig()->streamingEncoder), ui->finishPage)); } } - QString baseRes = - QString("%1x%2").arg(QString::number(wiz->baseResolutionCX), QString::number(wiz->baseResolutionCY)); - QString scaleRes = - QString("%1x%2").arg(QString::number(wiz->idealResolutionCX), QString::number(wiz->idealResolutionCY)); + QString baseRes = QString("%1x%2").arg(QString::number(autoConfig()->baseResolutionCX), + QString::number(autoConfig()->baseResolutionCY)); + QString scaleRes = QString("%1x%2").arg(QString::number(autoConfig()->idealResolutionCX), + QString::number(autoConfig()->idealResolutionCY)); - if (wiz->recordingEncoder != AutoConfig::Encoder::Stream || - wiz->recordingQuality != AutoConfig::Quality::Stream) - form->addRow(newLabel(TEST_RESULT_RE), new QLabel(encName(wiz->recordingEncoder), ui->finishPage)); + if (autoConfig()->recordingEncoder != AutoConfig::Encoder::Stream || + autoConfig()->recordingQuality != AutoConfig::Quality::Stream) + form->addRow(newLabel(TEST_RESULT_RE), + new QLabel(encName(autoConfig()->recordingEncoder), ui->finishPage)); QString recQuality; - switch (wiz->recordingQuality) { + switch (autoConfig()->recordingQuality) { case AutoConfig::Quality::High: recQuality = QTStr(QUALITY_HIGH); break; @@ -1047,9 +1050,9 @@ void AutoConfigTestPage::FinalizeResults() form->addRow(newLabel("Basic.Settings.Output.Simple.RecordingQuality"), new QLabel(recQuality, ui->finishPage)); - long double fps = (long double)wiz->idealFPSNum / (long double)wiz->idealFPSDen; + long double fps = (long double)autoConfig()->idealFPSNum / (long double)autoConfig()->idealFPSDen; - QString fpsStr = (wiz->idealFPSDen > 1) ? QString::number(fps, 'f', 2) : QString::number(fps, 'g', 2); + QString fpsStr = (autoConfig()->idealFPSDen > 1) ? QString::number(fps, 'f', 2) : QString::number(fps, 'g', 2); form->addRow(newLabel("Basic.Settings.Video.BaseResolution"), new QLabel(baseRes, ui->finishPage)); form->addRow(newLabel("Basic.Settings.Video.ScaledResolution"), new QLabel(scaleRes, ui->finishPage)); @@ -1077,9 +1080,9 @@ void AutoConfigTestPage::NextStage() started = true; } - if (wiz->type != AutoConfig::Type::Streaming) { + if (autoConfig()->type != AutoConfig::Type::Streaming) { stage = Stage::StreamEncoder; - } else if (!wiz->bandwidthTest) { + } else if (!autoConfig()->bandwidthTest) { stage = Stage::BandwidthTest; } } @@ -1144,11 +1147,11 @@ AutoConfigTestPage::~AutoConfigTestPage() void AutoConfigTestPage::initializePage() { - if (wiz->type == AutoConfig::Type::VirtualCam) { - wiz->idealResolutionCX = wiz->baseResolutionCX; - wiz->idealResolutionCY = wiz->baseResolutionCY; - wiz->idealFPSNum = 30; - wiz->idealFPSDen = 1; + if (autoConfig()->type == AutoConfig::Type::VirtualCam) { + autoConfig()->idealResolutionCX = autoConfig()->baseResolutionCX; + autoConfig()->idealResolutionCY = autoConfig()->baseResolutionCY; + autoConfig()->idealFPSNum = 30; + autoConfig()->idealFPSDen = 1; stage = Stage::Finished; } else { stage = Stage::Starting; diff --git a/frontend/wizards/AutoConfigTestPage.hpp b/frontend/wizards/AutoConfigTestPage.hpp index 5d2d414a67b571..ccfa23b9426cc4 100644 --- a/frontend/wizards/AutoConfigTestPage.hpp +++ b/frontend/wizards/AutoConfigTestPage.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include #include @@ -61,6 +63,9 @@ class AutoConfigTestPage : public QWizardPage { void GetServers(std::vector &servers); +protected: + AutoConfig *autoConfig() const { return qobject_cast(wizard()); } + public: AutoConfigTestPage(QWidget *parent = nullptr); ~AutoConfigTestPage(); diff --git a/frontend/wizards/AutoConfigVideoPage.cpp b/frontend/wizards/AutoConfigVideoPage.cpp index 69de8e2ecbfa03..ddb53e814c3daf 100644 --- a/frontend/wizards/AutoConfigVideoPage.cpp +++ b/frontend/wizards/AutoConfigVideoPage.cpp @@ -15,8 +15,6 @@ #define FPS_PREFER_HIGH_FPS RES_TEXT("FPS.PreferHighFPS") #define FPS_PREFER_HIGH_RES RES_TEXT("FPS.PreferHighRes") -#define wiz reinterpret_cast(wizard()) - AutoConfigVideoPage::AutoConfigVideoPage(QWidget *parent) : QWizardPage(parent), ui(new Ui_AutoConfigVideoPage) { ui->setupUi(this); @@ -85,44 +83,44 @@ AutoConfigVideoPage::~AutoConfigVideoPage() {} int AutoConfigVideoPage::nextId() const { - return wiz->type == AutoConfig::Type::Recording ? AutoConfig::TestPage : AutoConfig::StreamPage; + return autoConfig()->type == AutoConfig::Type::Recording ? AutoConfig::TestPage : AutoConfig::StreamPage; } bool AutoConfigVideoPage::validatePage() { int encRes = ui->canvasRes->currentData().toInt(); - wiz->baseResolutionCX = encRes >> 16; - wiz->baseResolutionCY = encRes & 0xFFFF; - wiz->fpsType = (AutoConfig::FPSType)ui->fps->currentData().toInt(); + autoConfig()->baseResolutionCX = encRes >> 16; + autoConfig()->baseResolutionCY = encRes & 0xFFFF; + autoConfig()->fpsType = (AutoConfig::FPSType)ui->fps->currentData().toInt(); obs_video_info ovi; obs_get_video_info(&ovi); - switch (wiz->fpsType) { + switch (autoConfig()->fpsType) { case AutoConfig::FPSType::PreferHighFPS: - wiz->specificFPSNum = 0; - wiz->specificFPSDen = 0; - wiz->preferHighFPS = true; + autoConfig()->specificFPSNum = 0; + autoConfig()->specificFPSDen = 0; + autoConfig()->preferHighFPS = true; break; case AutoConfig::FPSType::PreferHighRes: - wiz->specificFPSNum = 0; - wiz->specificFPSDen = 0; - wiz->preferHighFPS = false; + autoConfig()->specificFPSNum = 0; + autoConfig()->specificFPSDen = 0; + autoConfig()->preferHighFPS = false; break; case AutoConfig::FPSType::UseCurrent: - wiz->specificFPSNum = ovi.fps_num; - wiz->specificFPSDen = ovi.fps_den; - wiz->preferHighFPS = false; + autoConfig()->specificFPSNum = ovi.fps_num; + autoConfig()->specificFPSDen = ovi.fps_den; + autoConfig()->preferHighFPS = false; break; case AutoConfig::FPSType::fps30: - wiz->specificFPSNum = 30; - wiz->specificFPSDen = 1; - wiz->preferHighFPS = false; + autoConfig()->specificFPSNum = 30; + autoConfig()->specificFPSDen = 1; + autoConfig()->preferHighFPS = false; break; case AutoConfig::FPSType::fps60: - wiz->specificFPSNum = 60; - wiz->specificFPSDen = 1; - wiz->preferHighFPS = false; + autoConfig()->specificFPSNum = 60; + autoConfig()->specificFPSDen = 1; + autoConfig()->preferHighFPS = false; break; } diff --git a/frontend/wizards/AutoConfigVideoPage.hpp b/frontend/wizards/AutoConfigVideoPage.hpp index b6a441d2c48d5a..1c55263e59a8ee 100644 --- a/frontend/wizards/AutoConfigVideoPage.hpp +++ b/frontend/wizards/AutoConfigVideoPage.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include class Ui_AutoConfigVideoPage; @@ -11,6 +13,9 @@ class AutoConfigVideoPage : public QWizardPage { std::unique_ptr ui; +protected: + AutoConfig *autoConfig() const { return qobject_cast(wizard()); } + public: AutoConfigVideoPage(QWidget *parent = nullptr); ~AutoConfigVideoPage();