diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index 395cee457..06b765e68 100644 --- a/libobs/obs-internal.h +++ b/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; diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 4cfd496c4..55cea370d 100644 --- a/libobs/obs-source.c +++ b/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); +} diff --git a/libobs/obs.c b/libobs/obs.c index d9d68c01c..ccd8ecd91 100644 --- a/libobs/obs.c +++ b/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); diff --git a/libobs/obs.h b/libobs/obs.h index c2c88600c..d8793d49f 100644 --- a/libobs/obs.h +++ b/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 */