Skip to content

Commit

Permalink
better sound handling when changing sets
Browse files Browse the repository at this point in the history
  • Loading branch information
tenplus1 committed Jun 15, 2020
1 parent d5ff07a commit 11eff94
Showing 1 changed file with 60 additions and 67 deletions.
127 changes: 60 additions & 67 deletions init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -199,88 +199,81 @@ minetest.register_globalstep(function(dtime)

ok = true -- everything starts off ok

-- check set exists
if set_name ~= nil and not sound_sets[set_name] then
-- stop current sound if another set active or gain changed
if playing[player_name]
and playing[player_name].handler then

print("[ambience] sound set doesn't exist:", set_name)
if playing[player_name].set ~= set_name
or (playing[player_name].set == set_name
and playing[player_name].gain ~= MORE_GAIN) then

ok = false -- don't continue, set missing
--print ("-- change stop", set_name, playing[player_name].old_handler)

minetest.sound_stop(playing[player_name].old_handler)

playing[player_name].set = nil
playing[player_name].handler = nil
playing[player_name].gain = nil
else
ok = false -- sound set still playing, skip new sound
end
end

-- are we ok and have a set name
if ok and set_name then
-- set random chance and reset seed
chance = random(1, 1000)

-- stop current sound if another set active or gain changed
if playing[player_name]
and playing[player_name].handler then
math.randomseed(tod + chance)

if playing[player_name].sound ~= set_name
or (playing[player_name].sound == set_name
and playing[player_name].gain ~= MORE_GAIN) then
--print ("-- change stop")
minetest.sound_stop(playing[player_name].handler)
-- if chance is lower than set frequency then select set
if ok and set_name and chance < sound_sets[set_name].frequency then

playing[player_name].sound = nil
playing[player_name].handler = nil
playing[player_name].gain = nil
else
ok = false -- sound set still playing, skip new sound
end
end
-- choose random sound from set
number = random(#sound_sets[set_name].sounds)
ambience = sound_sets[set_name].sounds[number]

-- play sound
handler = minetest.sound_play(ambience.name, {
to_player = player_name,
gain = ((ambience.gain or 0.3) + (MORE_GAIN or 0)) * SOUNDVOLUME,
pitch = ambience.pitch or 1.0
}, ambience.ephemeral)

-- set random chance and reset seed
chance = random(1, 1000)
--print ("playing... " .. ambience.name .. " (" .. chance .. " < "
-- .. sound_sets[set_name].frequency .. ") @ ", MORE_GAIN)

math.randomseed(tod + chance)
-- only continue if sound playing returns handler
if handler then

-- if chance is lower than set frequency then select set
if ok and chance < sound_sets[set_name].frequency then
--print("-- current handler", handler)

-- choose random sound from set selected
number = random(1, #sound_sets[set_name].sounds)
ambience = sound_sets[set_name].sounds[number]
-- set what player is currently listening to
playing[player_name] = playing[player_name] or {}
playing[player_name].handler = handler
playing[player_name].set = set_name
playing[player_name].gain = MORE_GAIN
playing[player_name].old_handler = handler

-- play sound
handler = minetest.sound_play(ambience.name, {
to_player = player_name,
gain = ((ambience.gain or 0.3) + (MORE_GAIN or 0)) * SOUNDVOLUME
}, ambience.ephemeral)
-- set timer to stop sound
minetest.after(ambience.length, function()

-- only continue if sound is playing
if handler then
-- make sure we are stopping same sound we started
if playing[player_name]
and playing[player_name].handler
and playing[player_name].set == set_name
and handler == playing[player_name].old_handler then

--print ("playing... " .. ambience.name .. " (" .. chance .. " < "
-- .. sound_sets[set_name].frequency .. ") @ ", MORE_GAIN)
--print("-- timed stop", set_name, handler)

-- set what player is currently listening to
playing[player_name] = playing[player_name] or {}
playing[player_name].handler = handler
playing[player_name].sound = set_name
playing[player_name].gain = MORE_GAIN
playing[player_name].old_handler = handler

-- set timer to stop sound
minetest.after(ambience.length, function(args)

local player_name = args[2]

-- make sure we are stopping same sound we started
if playing[player_name]
and playing[player_name].handler
and playing[player_name].sound == set_name
and handler == playing[player_name].old_handler then
--print("-- timed stop")
minetest.sound_stop(playing[player_name].handler)

-- reset player variables
playing[player_name].sound = nil
playing[player_name].handler = nil
playing[player_name].gain = nil
playing[player_name].old_handler = handler
end

end, {ambience, player_name})
end
--minetest.sound_stop(playing[player_name].handler)
minetest.sound_stop(playing[player_name].old_handler)

-- reset player variables and backup handler
playing[player_name].set = nil
playing[player_name].handler = nil
playing[player_name].gain = nil
playing[player_name].old_handler = handler
end
end)
end
end
end
Expand Down

0 comments on commit 11eff94

Please sign in to comment.