mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-01-29 16:41:58 -05:00
frontend: Update previewed sources in mixer by visibility
This commit is contained in:
@@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user