tSIP: signaling BLF change with audio

Lua "on BLF (dialog-info) change" playing sound when contact(s) state changed to early or confirmed.

function play()
	-- Playing sound asynchronously
	-- note: more powerful (sound device selection) option is using sox tool + ShellExecute
	-- (http://tomeko.net/software/SIPclient/howto/sox.php,
	-- http://tomeko.net/software/SIPclient/howto/local_dtmfs.php)

	local winapi = require("tsip_winapi")

	-- let's use path relative to exe location
	local filename = GetExeName()
	local index = string.find(filename:reverse(), "\\")
	local dir = string.sub(filename, 1, -index)
	local audio_file = dir .. "pluck.wav"

	-- PlaySound is identical to WinAPI function with same name
	local SND_FILENAME = tonumber(0x00020000)
	local SND_ASYNC = tonumber(0x0001)
	winapi.PlaySound(audio_file, 0, SND_FILENAME | SND_ASYNC)
end


local execSourceType = GetExecSourceType()	-- 7 = BLF state change
if execSourceType ~= 7 then
	print("Unexpected context for BLF state script!\n")
	return
end
local contactId = GetExecSourceId()			-- contact id in this context

local number, state = GetBlfState(contactId)

--[[
for state value:
enum dialog_info_status {
	DIALOG_INFO_UNKNOWN = 0,		///< not subscribed / subscription failed
	DIALOG_INFO_TERMINATED,
	DIALOG_INFO_EARLY,
	DIALOG_INFO_CONFIRMED
};
If contactId is out of range (e.g. there is no subscription) then value = -1 is returned.
This is unexpected in script running on event though.
]]

-- number might be used to limit contacts for which audio is played
-- or to assign different audio files to different contacts
-- print(string.format("on_blf_state: number %s state = %d\n", number, state))

if state == 2 or state == 3 then	-- early + confirmed states
	-- let's limit play() frequency
	local currentTime = os.time()
	print ("currentTime: " .. currentTime .. "\n")
	local variableName = "OnBlfStatePlaTime"
	local prevTime, prevTimeIsSet = GetVariable(variableName)
	if prevTimeIsSet ~= 0 then
		print(string.format("prevTime = %s\n", prevTime))
		prevTime = tonumber(prevTime)
		if currentTime - prevTime < 2 then
			-- skip playing
			print("Skipping playing - 2 seconds not passed\n")
			return
		else
			print(string.format("delta = %d\n", currentTime - prevTime))
		end
	else
		print("prevTime not set\n")
	end

	SetVariable(variableName, currentTime)
	play()
end

Back to howto list.