--- Auto Audio Source Mute -- -- Mutes selected audio source (if unmuted) obs = obslua bit = require("bit") source_def = {} source_def.id = "Auto_Mute_Source" source_def.output_flags = bit.bor(obs.OBS_SOURCE_CUSTOM_DRAW) muted = false source_ptr = nil source_def.get_name = function() return "Audio Mute/Unmute" end source_def.create = function(settings, source) data = {} sh = obs.obs_source_get_signal_handler(source) obs.signal_handler_connect(sh,"activate",active) --Set Active Callback obs.signal_handler_connect(sh,"deactivate",deactive) --Set Preview Callback source_ptr = source return data end source_def.destroy = function(data) end source_def.update = function (data, settings) local direction = obs.obs_data_get_bool(settings,"dir") local audio_source_name = obs.obs_data_get_string(settings, "audio_prop") local dir = "" if direction then dir = "Unmute: " .. audio_source_name else dir = "Mute: " .. audio_source_name end obs.obs_source_set_name(source_ptr, dir) end source_def.get_properties = function (data) props = obs.obs_properties_create() local source_prop = obs.obs_properties_add_list(props, "audio_prop", "Audio Source", obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING) local sources = obs.obs_enum_sources() if sources ~= nil then local n = {} local source_id = nil for _, source in ipairs(sources) do if bit.band(obs.obs_source_get_output_flags(source),obs.OBS_SOURCE_AUDIO) > 0 then n[#n+1] = obs.obs_source_get_name(source) end end table.sort(n) for _, name in ipairs(n) do obs.obs_property_list_add_string(source_prop, name, name) end end obs.source_list_release(sources) obs.obs_properties_add_bool(props,"dir","Unmute if Muted (Default is Mute if Unmuted): ") obs.obs_properties_add_bool(props,"force","Always Unmute/Mute on Exit: ") return props end function script_description() return "Mutes/Unmutes a Selected Audio Source during the Current Scene. By DCStrato" end function active(cd) local source = obs.calldata_source(cd,"source") local settings = obs.obs_source_get_settings(source) local audio_source_name = obs.obs_data_get_string(settings, "audio_prop") local direction = obs.obs_data_get_bool(settings,"dir") obs.obs_data_release(settings) local audio_source = obs.obs_get_source_by_name(audio_source_name) if audio_source ~= nil then muted = obs.obs_source_muted(audio_source) if direction then if muted then obs.obs_source_set_muted(audio_source,false) -- unmute if muted end else if not muted then obs.obs_source_set_muted(audio_source,true) -- mute if unmuted end end obs.obs_source_release(audio_source) end end function deactive(cd) local source = obs.calldata_source(cd,"source") local settings = obs.obs_source_get_settings(source) local audio_source_name = obs.obs_data_get_string(settings, "audio_prop") local direction = obs.obs_data_get_bool(settings,"dir") local force = obs.obs_data_get_bool(settings,"force") obs.obs_data_release(settings) local audio_source = obs.obs_get_source_by_name(audio_source_name) if audio_source ~= nil then if force then obs.obs_source_set_muted(audio_source,direction) else obs.obs_source_set_muted(audio_source,muted) -- restore prior mute state end obs.obs_source_release(audio_source) end end obs.obs_register_source(source_def)