@@ -260,6 +260,7 @@ AudioMixer::AudioMixer(QWidget *parent) : QFrame(parent)
260260
261261 updateShowToolbar ();
262262 updatePreviewSources ();
263+ updatePreviewHandlers ();
263264 updateGlobalSources ();
264265
265266 reloadVolumeControls ();
@@ -413,6 +414,10 @@ void AudioMixer::updatePreviewSources()
413414 }
414415
415416 auto getPreviewSources = [this ](obs_scene_t *, obs_sceneitem_t *item) {
417+ if (!obs_sceneitem_visible (item)) {
418+ return true ;
419+ }
420+
416421 obs_source_t *source = obs_sceneitem_get_source (item);
417422 if (!source) {
418423 return true ;
@@ -882,6 +887,7 @@ void AudioMixer::handleFrontendEvent(obs_frontend_event event)
882887 case OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED:
883888 case OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED:
884889 updatePreviewSources ();
890+ updatePreviewHandlers ();
885891 queueLayoutUpdate ();
886892 break ;
887893 case OBS_FRONTEND_EVENT_EXIT:
@@ -892,6 +898,24 @@ void AudioMixer::handleFrontendEvent(obs_frontend_event event)
892898 }
893899}
894900
901+ void AudioMixer::updatePreviewHandlers ()
902+ {
903+ previewSignals.clear ();
904+
905+ bool isStudioMode = obs_frontend_preview_program_mode_active ();
906+ if (isStudioMode) {
907+ OBSSourceAutoRelease previewSource = obs_frontend_get_current_preview_scene ();
908+ if (!previewSource) {
909+ return ;
910+ }
911+
912+ previewSignals.reserve (1 );
913+
914+ previewSignals.emplace_back (obs_source_get_signal_handler (previewSource), " item_visible" ,
915+ AudioMixer::obsSceneItemVisibleChange, this );
916+ }
917+ }
918+
895919void AudioMixer::updateShowInactive ()
896920{
897921 bool settingShowInactive = config_get_bool (App ()->GetUserConfig (), " BasicWindow" , " MixerShowInactive" );
@@ -1029,3 +1053,27 @@ void AudioMixer::obsSourceRename(void *data, calldata_t *)
10291053{
10301054 QMetaObject::invokeMethod (static_cast <AudioMixer *>(data), " queueLayoutUpdate" , Qt::QueuedConnection);
10311055}
1056+
1057+ void AudioMixer::obsSceneItemVisibleChange (void *data, calldata_t *params)
1058+ {
1059+ obs_sceneitem_t *sceneItem = static_cast <obs_sceneitem_t *>(calldata_ptr (params, " item" ));
1060+ if (!sceneItem) {
1061+ return ;
1062+ }
1063+
1064+ obs_source_t *source = obs_sceneitem_get_source (sceneItem);
1065+ if (!source) {
1066+ return ;
1067+ }
1068+
1069+ uint32_t flags = obs_source_get_output_flags (source);
1070+
1071+ if (flags & OBS_SOURCE_AUDIO) {
1072+ QMetaObject::invokeMethod (static_cast <AudioMixer *>(data), " updatePreviewSources" ,
1073+ Qt::QueuedConnection);
1074+
1075+ auto uuidPointer = obs_source_get_uuid (source);
1076+ QMetaObject::invokeMethod (static_cast <AudioMixer *>(data), " updateControlVisibility" ,
1077+ Qt::QueuedConnection, Q_ARG (QString, QString::fromUtf8 (uuidPointer)));
1078+ }
1079+ }
0 commit comments