From 67d2b50a9117c263b8ec4bcbf57c12fe2ec188e7 Mon Sep 17 00:00:00 2001 From: Kasin Sparks Date: Thu, 30 Sep 2021 20:24:58 -0400 Subject: [PATCH] UI: Fix bug with audio balance slider not updating Fixes #4763. --- UI/adv-audio-control.cpp | 16 ++++++++++++++++ UI/adv-audio-control.hpp | 3 +++ docs/sphinx/reference-sources.rst | 4 ++++ libobs/obs-source.c | 16 +++++++++++++--- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/UI/adv-audio-control.cpp b/UI/adv-audio-control.cpp index edba2cc28..5804e1ffc 100644 --- a/UI/adv-audio-control.cpp +++ b/UI/adv-audio-control.cpp @@ -66,6 +66,8 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) this); mixersSignal.Connect(handler, "audio_mixers", OBSSourceMixersChanged, this); + balChangedSignal.Connect(handler, "audio_balance", + OBSSourceBalanceChanged, this); hlayout = new QHBoxLayout(); hlayout->setContentsMargins(0, 0, 0, 0); @@ -351,6 +353,13 @@ void OBSAdvAudioCtrl::OBSSourceMixersChanged(void *param, calldata_t *calldata) Q_ARG(uint32_t, mixers)); } +void OBSAdvAudioCtrl::OBSSourceBalanceChanged(void *param, calldata_t *calldata) +{ + int balance = (float)calldata_float(calldata, "balance") * 100.0f; + QMetaObject::invokeMethod(reinterpret_cast(param), + "SourceBalanceChanged", Q_ARG(int, balance)); +} + /* ------------------------------------------------------------------------- */ /* Qt event queue source callbacks */ @@ -388,6 +397,13 @@ void OBSAdvAudioCtrl::SourceVolumeChanged(float value) volume->blockSignals(false); } +void OBSAdvAudioCtrl::SourceBalanceChanged(int value) +{ + balance->blockSignals(true); + balance->setValue(value); + balance->blockSignals(false); +} + void OBSAdvAudioCtrl::SourceSyncChanged(int64_t offset) { syncOffset->blockSignals(true); diff --git a/UI/adv-audio-control.hpp b/UI/adv-audio-control.hpp index 2de04148f..405ab4309 100644 --- a/UI/adv-audio-control.hpp +++ b/UI/adv-audio-control.hpp @@ -55,6 +55,7 @@ private: OBSSignal mixersSignal; OBSSignal activateSignal; OBSSignal deactivateSignal; + OBSSignal balChangedSignal; static void OBSSourceActivated(void *param, calldata_t *calldata); static void OBSSourceDeactivated(void *param, calldata_t *calldata); @@ -64,6 +65,7 @@ private: static void OBSSourceMonitoringTypeChanged(void *param, calldata_t *calldata); static void OBSSourceMixersChanged(void *param, calldata_t *calldata); + static void OBSSourceBalanceChanged(void *param, calldata_t *calldata); public: OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_); @@ -82,6 +84,7 @@ public slots: void SourceSyncChanged(int64_t offset); void SourceMonitoringTypeChanged(int type); void SourceMixersChanged(uint32_t mixers); + void SourceBalanceChanged(int balance); void volumeChanged(double db); void percentChanged(int percent); diff --git a/docs/sphinx/reference-sources.rst b/docs/sphinx/reference-sources.rst index 243b65d67..794612a7b 100644 --- a/docs/sphinx/reference-sources.rst +++ b/docs/sphinx/reference-sources.rst @@ -578,6 +578,10 @@ Source Signals Called when the audio sync offset has changed. +**audio_balance** (ptr source, in out float balance) + + Called when the audio balance has changed. + **audio_mixers** (ptr source, in out int mixers) Called when the audio mixers have changed. diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 39198e3dd..4ccdfd35a 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -87,6 +87,7 @@ static const char *source_signals[] = { "void update_properties(ptr source)", "void update_flags(ptr source, int flags)", "void audio_sync(ptr source, int out int offset)", + "void audio_balance(ptr source, in out float balance)", "void audio_mixers(ptr source, in out int mixers)", "void audio_monitoring(ptr source, int type)", "void audio_activate(ptr source)", @@ -5134,10 +5135,19 @@ enum speaker_layout obs_source_get_speaker_layout(obs_source_t *source) void obs_source_set_balance_value(obs_source_t *source, float balance) { - if (!obs_source_valid(source, "obs_source_set_balance_value")) - return; + if (obs_source_valid(source, "obs_source_set_balance_value")) { + struct calldata data; + uint8_t stack[128]; - source->balance = balance; + calldata_init_fixed(&data, stack, sizeof(stack)); + calldata_set_ptr(&data, "source", source); + calldata_set_float(&data, "balance", balance); + + signal_handler_signal(source->context.signals, "audio_balance", + &data); + + source->balance = (float)calldata_float(&data, "balance"); + } } float obs_source_get_balance_value(const obs_source_t *source)