--- 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 incallback = false 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 function rename_callback() obs.timer_remove(rename_callback) local sources = obs.obs_enum_sources() if (sources ~= nil) then local t = 0 for _, source in ipairs(sources) do local source_id = obs.obs_source_get_unversioned_id(source) if source_id == "Auto_Mute_Source" then t = t + 1 end end if t>0 then for _, source in ipairs(sources) do local source_id = obs.obs_source_get_unversioned_id(source) if source_id == "Auto_Mute_Source" then local settings = obs.obs_source_get_settings(source) local direction = obs.obs_data_get_bool(settings,"dir") local audio_source_name = obs.obs_data_get_string(settings, "audio_prop") local newname = "" if direction then newname = "(" .. t .. ") Unmute: " .. audio_source_name else newname = "(" .. t .. ") Mute: " .. audio_source_name end t = t - 1 obs.obs_data_release(settings) -- release memory obs.obs_source_set_name(source, newname) end end end end obs.source_list_release(sources) incallback = false end source_def.save = function (data, settings) if not incallback then obs.timer_add(rename_callback, 3000) -- wait long enough for save to complete so callback is only once incallback = true end 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)