소스 검색

libobs: Add API to mute/unmute sources

jp9000 10 년 전
부모
커밋
e31fea66be
4개의 변경된 파일33개의 추가작업 그리고 1개의 파일을 삭제
  1. 1 0
      libobs/obs-internal.h
  2. 24 1
      libobs/obs-source.c
  3. 5 0
      libobs/obs.c
  4. 3 0
      libobs/obs.h

+ 1 - 0
libobs/obs-internal.h

@@ -322,6 +322,7 @@ struct obs_source {
 
 	/* audio */
 	bool                            audio_failed;
+	bool                            muted;
 	struct resample_info            sample_info;
 	audio_resampler_t               *resampler;
 	audio_line_t                    *audio_line;

+ 24 - 1
libobs/obs-source.c

@@ -78,6 +78,7 @@ static const char *source_signals[] = {
 	"void deactivate(ptr source)",
 	"void show(ptr source)",
 	"void hide(ptr source)",
+	"void mute(ptr source, bool muted)",
 	"void enable(ptr source, bool enabled)",
 	"void rename(ptr source, string new_name, string prev_name)",
 	"void volume(ptr source, in out float volume)",
@@ -729,7 +730,7 @@ static void source_output_audio_line(obs_source_t *source,
 		source->present_volume * obs->audio.user_volume *
 		obs->audio.present_volume;
 
-	if (!source->enabled)
+	if (!source->enabled || source->muted)
 		in.volume = 0.0f;
 
 	audio_line_output(source->audio_line, &in);
@@ -2627,3 +2628,25 @@ void obs_source_set_enabled(obs_source_t *source, bool enabled)
 
 	calldata_free(&data);
 }
+
+bool obs_source_muted(const obs_source_t *source)
+{
+	return source ? source->muted : false;
+}
+
+void obs_source_set_muted(obs_source_t *source, bool muted)
+{
+	struct calldata data = {0};
+
+	if (!source)
+		return;
+
+	source->muted = muted;
+
+	calldata_set_ptr(&data, "source", source);
+	calldata_set_bool(&data, "muted", muted);
+
+	signal_handler_signal(source->context.signals, "mute", &data);
+
+	calldata_free(&data);
+}

+ 5 - 0
libobs/obs.c

@@ -1291,6 +1291,9 @@ static obs_source_t *obs_load_source_type(obs_data_t *source_data,
 	obs_source_set_enabled(source,
 			obs_data_get_bool(source_data, "enabled"));
 
+	obs_data_set_default_bool(source_data, "muted", false);
+	obs_source_set_muted(source, obs_data_get_bool(source_data, "muted"));
+
 	if (filters) {
 		size_t count = obs_data_array_count(filters);
 
@@ -1361,6 +1364,7 @@ obs_data_t *obs_save_source(obs_source_t *source)
 	const char *name       = obs_source_get_name(source);
 	const char *id         = obs_source_get_id(source);
 	bool       enabled     = obs_source_enabled(source);
+	bool       muted       = obs_source_muted(source);
 
 	obs_source_save(source);
 
@@ -1372,6 +1376,7 @@ obs_data_t *obs_save_source(obs_source_t *source)
 	obs_data_set_int   (source_data, "flags",    flags);
 	obs_data_set_double(source_data, "volume",   volume);
 	obs_data_set_bool  (source_data, "enabled",  enabled);
+	obs_data_set_bool  (source_data, "muted",    muted);
 
 	pthread_mutex_lock(&source->filter_mutex);
 

+ 3 - 0
libobs/obs.h

@@ -828,6 +828,9 @@ EXPORT obs_source_t *obs_source_get_filter_by_name(obs_source_t *source,
 EXPORT bool obs_source_enabled(const obs_source_t *source);
 EXPORT void obs_source_set_enabled(obs_source_t *source, bool enabled);
 
+EXPORT bool obs_source_muted(const obs_source_t *source);
+EXPORT void obs_source_set_muted(obs_source_t *source, bool muted);
+
 /* ------------------------------------------------------------------------- */
 /* Functions used by sources */