UI: Fix bug with audio balance slider not updating

Fixes #4763.
This commit is contained in:
Kasin Sparks 2021-09-30 20:24:58 -04:00 committed by Jim
parent 3ccc963e53
commit 67d2b50a91
4 changed files with 36 additions and 3 deletions

View File

@ -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<OBSAdvAudioCtrl *>(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);

View File

@ -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);

View File

@ -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.

View File

@ -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)