tSIP: updating settings from Lua

In tSIP 0.1.65 UpdateSettings(jsonText) Lua function was added. It was preceded by rewriting function reading configuration so preceding values would be used consistently as default values. This way argument passed to UpdateSettings function does not need to be complete configuration - partial configuration is accepted and would be preferred way of updating specific settings.

My primary reason for adding method of updating settings from script is particular problem with my setup: EX-03 USB phone is randomly enumerated by Windows 10 either as "USB Phone" or as "2 - USB Phone" at startup. If name under which device is enumerated is not matching configured device name then default device is used and it's pretty startling on the first call after powering on PC.

Following script (used as "on startup" script) searches through input and output devices lists for devices with names containing specified string and selects them in configuration:


RefreshAudioDevicesList()
local name, valid
local id
local moduleName = "winwave"
local needle = "USB Phone"	-- note: JSON-escaping is skipped below

local inputDev = nil
local outputDev = nil

print(string.format("Devices for %s module:\n", moduleName))

print("  Input devices:\n")
id = 0
repeat
	name, valid = GetAudioDevice(moduleName, "in", id)
	if valid == 1 then
		print(string.format("    #%d: %s\n", id, name))
		if string.find(name, needle, 1, true) then
			inputDev = name
			break
		end
	end
	id = id + 1
until valid == 0

print("  Output devices:\n")
id = 0
repeat
	name, valid = GetAudioDevice(moduleName, "out", id)
	if valid == 1 then
		print(string.format("    #%d: %s\n", id, name))
		if string.find(name, needle, 1, true) then
			outputDev = name
			break
		end
	end
	id = id + 1
until valid == 0

if inputDev ~= nil or outputDev ~= nil then
	local config = "{ \"uaConf\" : {"
	if inputDev ~= nil then
		local str = string.format([[
		  "audioCfgAlert" : {
			 "dev" : "%s",
			 "mod" : "%s"
		  },
		  "audioCfgPlay" : {
			 "dev" : "%s",
			 "mod" : "%s"
		  },
		  "audioCfgPlayIntercom" : {
			 "dev" : "%s",
			 "mod" : "%s"
		  },
		  "audioCfgRing" : {
			 "dev" : "%s",
			 "mod" : "%s"
		  }			
			]],
			outputDev, moduleName,
			outputDev, moduleName,
			outputDev, moduleName,
			outputDev, moduleName)
		config = config .. str
	end

	if inputDev ~= nil and outputDev ~= nil then
		config = config .. ","
	end

	if outputDev ~= nil then
		local str = string.format([[
		  "audioCfgSrc" : {
			 "dev" : "%s",
			 "mod" : "%s"
		  }
		]], inputDev, moduleName)
		config = config .. str
	end
	config = config .. "}}"
	
	print(string.format("Updating config:\n%s\n", config))

	local res = UpdateSettings(config)
	if res ~= 0 then
		print("Error updating configuration\n")
	end
end

Combination of external tool like curl, ShellExecute() function, io Lua module and UpdateSettings() function can be also used for provisioning.

Back to howto list.