Просмотр исходного кода

UI: Fix bug with audio balance slider not updating

Fixes #4763.
Kasin Sparks 4 лет назад
Родитель
Сommit
67d2b50a91
4 измененных файлов с 36 добавлено и 3 удалено
  1. 16 0
      UI/adv-audio-control.cpp
  2. 3 0
      UI/adv-audio-control.hpp
  3. 4 0
      docs/sphinx/reference-sources.rst
  4. 13 3
      libobs/obs-source.c

+ 16 - 0
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<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);

+ 3 - 0
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);

+ 4 - 0
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.

+ 13 - 3
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)