diff --git a/frontend/widgets/AudioMixer.cpp b/frontend/widgets/AudioMixer.cpp index ee5788d9f..59e2f28b0 100644 --- a/frontend/widgets/AudioMixer.cpp +++ b/frontend/widgets/AudioMixer.cpp @@ -260,6 +260,7 @@ AudioMixer::AudioMixer(QWidget *parent) : QFrame(parent) updateShowToolbar(); updatePreviewSources(); + updatePreviewHandlers(); updateGlobalSources(); reloadVolumeControls(); @@ -413,6 +414,10 @@ void AudioMixer::updatePreviewSources() } auto getPreviewSources = [this](obs_scene_t *, obs_sceneitem_t *item) { + if (!obs_sceneitem_visible(item)) { + return true; + } + obs_source_t *source = obs_sceneitem_get_source(item); if (!source) { return true; @@ -882,6 +887,7 @@ void AudioMixer::handleFrontendEvent(obs_frontend_event event) case OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED: case OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED: updatePreviewSources(); + updatePreviewHandlers(); queueLayoutUpdate(); break; case OBS_FRONTEND_EVENT_EXIT: @@ -892,6 +898,24 @@ void AudioMixer::handleFrontendEvent(obs_frontend_event event) } } +void AudioMixer::updatePreviewHandlers() +{ + previewSignals.clear(); + + bool isStudioMode = obs_frontend_preview_program_mode_active(); + if (isStudioMode) { + OBSSourceAutoRelease previewSource = obs_frontend_get_current_preview_scene(); + if (!previewSource) { + return; + } + + previewSignals.reserve(1); + + previewSignals.emplace_back(obs_source_get_signal_handler(previewSource), "item_visible", + AudioMixer::obsSceneItemVisibleChange, this); + } +} + void AudioMixer::updateShowInactive() { bool settingShowInactive = config_get_bool(App()->GetUserConfig(), "BasicWindow", "MixerShowInactive"); @@ -1029,3 +1053,27 @@ void AudioMixer::obsSourceRename(void *data, calldata_t *) { QMetaObject::invokeMethod(static_cast(data), "queueLayoutUpdate", Qt::QueuedConnection); } + +void AudioMixer::obsSceneItemVisibleChange(void *data, calldata_t *params) +{ + obs_sceneitem_t *sceneItem = static_cast(calldata_ptr(params, "item")); + if (!sceneItem) { + return; + } + + obs_source_t *source = obs_sceneitem_get_source(sceneItem); + if (!source) { + return; + } + + uint32_t flags = obs_source_get_output_flags(source); + + if (flags & OBS_SOURCE_AUDIO) { + QMetaObject::invokeMethod(static_cast(data), "updatePreviewSources", + Qt::QueuedConnection); + + auto uuidPointer = obs_source_get_uuid(source); + QMetaObject::invokeMethod(static_cast(data), "updateControlVisibility", + Qt::QueuedConnection, Q_ARG(QString, QString::fromUtf8(uuidPointer))); + } +} diff --git a/frontend/widgets/AudioMixer.hpp b/frontend/widgets/AudioMixer.hpp index d70e114ae..c8f71b380 100644 --- a/frontend/widgets/AudioMixer.hpp +++ b/frontend/widgets/AudioMixer.hpp @@ -56,8 +56,10 @@ public: private: std::vector signalHandlers; + std::vector previewSignals; static void onFrontendEvent(enum obs_frontend_event event, void *data); void handleFrontendEvent(enum obs_frontend_event event); + void updatePreviewHandlers(); std::unordered_map> volumeList; void addControlForUuid(QString uuid); @@ -124,6 +126,7 @@ private: static void obsSourceCreate(void *data, calldata_t *params); static void obsSourceRemove(void *data, calldata_t *params); static void obsSourceRename(void *data, calldata_t *params); + static void obsSceneItemVisibleChange(void *data, calldata_t *params); private slots: void sourceCreated(QString uuid);