frontend: Update previewed sources in mixer by visibility

This commit is contained in:
Warchamp7
2026-01-27 14:51:18 -05:00
committed by Ryan Foster
parent 84361415ff
commit f53c843ac0
2 changed files with 51 additions and 0 deletions

View File

@@ -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<AudioMixer *>(data), "queueLayoutUpdate", Qt::QueuedConnection);
}
void AudioMixer::obsSceneItemVisibleChange(void *data, calldata_t *params)
{
obs_sceneitem_t *sceneItem = static_cast<obs_sceneitem_t *>(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<AudioMixer *>(data), "updatePreviewSources",
Qt::QueuedConnection);
auto uuidPointer = obs_source_get_uuid(source);
QMetaObject::invokeMethod(static_cast<AudioMixer *>(data), "updateControlVisibility",
Qt::QueuedConnection, Q_ARG(QString, QString::fromUtf8(uuidPointer)));
}
}

View File

@@ -56,8 +56,10 @@ public:
private:
std::vector<OBSSignal> signalHandlers;
std::vector<OBSSignal> previewSignals;
static void onFrontendEvent(enum obs_frontend_event event, void *data);
void handleFrontendEvent(enum obs_frontend_event event);
void updatePreviewHandlers();
std::unordered_map<QString, QPointer<VolumeControl>> 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);