From 731c2d9c8211226a58f775af5480c3ddc991b333 Mon Sep 17 00:00:00 2001 From: Penwywern Date: Mon, 18 Mar 2024 17:08:42 +0100 Subject: [PATCH] UI: Change advanced audio controls to use audio_active --- UI/adv-audio-control.cpp | 9 ++++++-- UI/adv-audio-control.hpp | 2 ++ UI/window-basic-adv-audio.cpp | 41 ++++++++++++++++++++++++++++------- UI/window-basic-adv-audio.hpp | 3 +++ 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/UI/adv-audio-control.cpp b/UI/adv-audio-control.cpp index cb90e1150..277ac24d4 100644 --- a/UI/adv-audio-control.cpp +++ b/UI/adv-audio-control.cpp @@ -54,6 +54,10 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) activateSignal.Connect(handler, "activate", OBSSourceActivated, this); deactivateSignal.Connect(handler, "deactivate", OBSSourceDeactivated, this); + audioActivateSignal.Connect(handler, "audio_activate", + OBSSourceActivated, this); + audioDeactivateSignal.Connect(handler, "audio_deactivate", + OBSSourceDeactivated, this); volChangedSignal.Connect(handler, "volume", OBSSourceVolumeChanged, this); syncOffsetSignal.Connect(handler, "audio_sync", OBSSourceSyncChanged, @@ -92,7 +96,8 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) SetSourceName(sourceName); nameLabel->setAlignment(Qt::AlignVCenter); - bool isActive = obs_source_active(source); + bool isActive = obs_source_active(source) && + obs_source_audio_active(source); active->setText(isActive ? QTStr("Basic.Stats.Status.Active") : QTStr("Basic.Stats.Status.Inactive")); if (isActive) @@ -369,7 +374,7 @@ static inline void setCheckboxState(QCheckBox *checkbox, bool checked) void OBSAdvAudioCtrl::SourceActiveChanged(bool isActive) { - if (isActive) { + if (isActive && obs_source_audio_active(source)) { active->setText(QTStr("Basic.Stats.Status.Active")); setThemeID(active, "error"); } else { diff --git a/UI/adv-audio-control.hpp b/UI/adv-audio-control.hpp index 196dd2130..ec88f1362 100644 --- a/UI/adv-audio-control.hpp +++ b/UI/adv-audio-control.hpp @@ -53,6 +53,8 @@ private: OBSSignal mixersSignal; OBSSignal activateSignal; OBSSignal deactivateSignal; + OBSSignal audioActivateSignal; + OBSSignal audioDeactivateSignal; OBSSignal balChangedSignal; OBSSignal renameSignal; diff --git a/UI/window-basic-adv-audio.cpp b/UI/window-basic-adv-audio.cpp index 6a8aa0ce2..b2ef201dc 100644 --- a/UI/window-basic-adv-audio.cpp +++ b/UI/window-basic-adv-audio.cpp @@ -12,10 +12,15 @@ Q_DECLARE_METATYPE(OBSSource); OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent) : QDialog(parent), ui(new Ui::OBSAdvAudio), - sourceAddedSignal(obs_get_signal_handler(), "source_activate", + sourceAddedSignal(obs_get_signal_handler(), "source_audio_activate", OBSSourceAdded, this), - sourceRemovedSignal(obs_get_signal_handler(), "source_deactivate", - OBSSourceRemoved, this), + sourceRemovedSignal(obs_get_signal_handler(), + "source_audio_deactivate", OBSSourceRemoved, + this), + sourceActivatedSignal(obs_get_signal_handler(), "source_activate", + OBSSourceActivated, this), + sourceDeactivatedSignal(obs_get_signal_handler(), "source_deactivate", + OBSSourceRemoved, this), showInactive(false) { ui->setupUi(this); @@ -51,7 +56,8 @@ bool OBSBasicAdvAudio::EnumSources(void *param, obs_source_t *source) uint32_t flags = obs_source_get_output_flags(source); if ((flags & OBS_SOURCE_AUDIO) != 0 && - (dialog->showInactive || obs_source_active(source))) + (dialog->showInactive || + (obs_source_active(source) && obs_source_audio_active(source)))) dialog->AddAudioSource(source); return true; @@ -73,6 +79,16 @@ void OBSBasicAdvAudio::OBSSourceRemoved(void *param, calldata_t *calldata) "SourceRemoved", Q_ARG(OBSSource, source)); } +void OBSBasicAdvAudio::OBSSourceActivated(void *param, calldata_t *calldata) +{ + OBSSource source((obs_source_t *)calldata_ptr(calldata, "source")); + + if (obs_source_audio_active(source)) + QMetaObject::invokeMethod( + reinterpret_cast(param), + "SourceAdded", Q_ARG(OBSSource, source)); +} + inline void OBSBasicAdvAudio::AddAudioSource(obs_source_t *source) { for (size_t i = 0; i < controls.size(); i++) { @@ -144,6 +160,8 @@ void OBSBasicAdvAudio::SetShowInactive(bool show) sourceAddedSignal.Disconnect(); sourceRemovedSignal.Disconnect(); + sourceActivatedSignal.Disconnect(); + sourceDeactivatedSignal.Disconnect(); if (showInactive) { sourceAddedSignal.Connect(obs_get_signal_handler(), @@ -158,15 +176,22 @@ void OBSBasicAdvAudio::SetShowInactive(bool show) SetIconsVisible(showVisible); } else { sourceAddedSignal.Connect(obs_get_signal_handler(), - "source_activate", OBSSourceAdded, - this); + "source_audio_activate", + OBSSourceAdded, this); sourceRemovedSignal.Connect(obs_get_signal_handler(), - "source_deactivate", + "source_audio_deactivate", OBSSourceRemoved, this); + sourceActivatedSignal.Connect(obs_get_signal_handler(), + "source_activate", + OBSSourceActivated, this); + sourceDeactivatedSignal.Connect(obs_get_signal_handler(), + "source_deactivate", + OBSSourceRemoved, this); for (size_t i = 0; i < controls.size(); i++) { const auto source = controls[i]->GetSource(); - if (!obs_source_active(source)) { + if (!(obs_source_active(source) && + obs_source_audio_active(source))) { delete controls[i]; controls.erase(controls.begin() + i); i--; diff --git a/UI/window-basic-adv-audio.hpp b/UI/window-basic-adv-audio.hpp index 611448ca9..ab561a2da 100644 --- a/UI/window-basic-adv-audio.hpp +++ b/UI/window-basic-adv-audio.hpp @@ -16,6 +16,8 @@ class OBSBasicAdvAudio : public QDialog { private: OBSSignal sourceAddedSignal; OBSSignal sourceRemovedSignal; + OBSSignal sourceActivatedSignal; + OBSSignal sourceDeactivatedSignal; bool showInactive; bool showVisible; @@ -27,6 +29,7 @@ private: static void OBSSourceAdded(void *param, calldata_t *calldata); static void OBSSourceRemoved(void *param, calldata_t *calldata); + static void OBSSourceActivated(void *param, calldata_t *calldata); std::unique_ptr ui;