From 7e71ef3fc048c31a71694663c1a6ddea07d3c87b Mon Sep 17 00:00:00 2001 From: Warchamp7 Date: Wed, 5 Aug 2026 14:07:54 -0400 Subject: [PATCH] frontend: Mark nested audio sources as previewed --- frontend/widgets/AudioMixer.cpp | 85 ++++++++++++++++++--------------- frontend/widgets/AudioMixer.hpp | 3 ++ 2 files changed, 50 insertions(+), 38 deletions(-) diff --git a/frontend/widgets/AudioMixer.cpp b/frontend/widgets/AudioMixer.cpp index c67d94cfe2f477..ab81eae45531d0 100644 --- a/frontend/widgets/AudioMixer.cpp +++ b/frontend/widgets/AudioMixer.cpp @@ -409,44 +409,7 @@ void AudioMixer::updatePreviewSources() return; } - if (!previewScene) { - return; - } - - 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; - } - - uint32_t flags = obs_source_get_output_flags(source); - if ((flags & OBS_SOURCE_AUDIO) == 0) { - return true; - } - - if (!obs_source_audio_active(source)) { - return true; - } - - auto uuidPointer = obs_source_get_uuid(source); - if (uuidPointer && *uuidPointer) { - previewSources.insert(QString::fromUtf8(uuidPointer)); - } - - return true; - }; - - using getPreviewSources_t = decltype(getPreviewSources); - - auto previewEnum = [](obs_scene_t *scene, obs_sceneitem_t *item, void *data) -> bool { - return (*static_cast(data))(scene, item); - }; - - obs_scene_enum_items(previewScene, previewEnum, &getPreviewSources); + findAudioSourcesInScene(previewScene); } } @@ -752,6 +715,52 @@ void AudioMixer::updateVolumeLayouts() setUpdatesEnabled(true); } +bool AudioMixer::enumPreviewSources(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; + } + + if (obs_source_is_scene(source)) { + findAudioSourcesInScene(obs_scene_from_source(source)); + return true; + } else if (obs_source_is_group(source)) { + findAudioSourcesInScene(obs_group_from_source(source)); + return true; + } + + uint32_t flags = obs_source_get_output_flags(source); + if ((flags & OBS_SOURCE_AUDIO) == 0) { + return true; + } + + if (!obs_source_audio_active(source)) { + return true; + } + + auto uuidPointer = obs_source_get_uuid(source); + if (uuidPointer && *uuidPointer) { + previewSources.insert(QString::fromUtf8(uuidPointer)); + } + + return true; +} + +void AudioMixer::findAudioSourcesInScene(obs_scene_t *scene) +{ + auto getPreviewSources = [](obs_scene_t *scene, obs_sceneitem_t *item, void *data) -> bool { + auto mixer = static_cast(data); + return mixer->enumPreviewSources(scene, item); + }; + + obs_scene_enum_items(scene, getPreviewSources, this); +} + void AudioMixer::mixerContextMenuRequested() { showMixerContextMenu(); diff --git a/frontend/widgets/AudioMixer.hpp b/frontend/widgets/AudioMixer.hpp index abeebe383af783..89d8e363664b40 100644 --- a/frontend/widgets/AudioMixer.hpp +++ b/frontend/widgets/AudioMixer.hpp @@ -116,6 +116,9 @@ class AudioMixer : public QFrame { QTimer updateTimer; void updateVolumeLayouts(); + bool enumPreviewSources(obs_scene_t *scene, obs_sceneitem_t *item); + void findAudioSourcesInScene(obs_scene_t *scene); + // OBS Callbacks static void obsSourceActivated(void *data, calldata_t *params); static void obsSourceDeactivated(void *data, calldata_t *params);