Fix music player's sound management

If an operating music player was disconnected from the electrical network
or destroyed, it used to leave the music playing forever.  There was
also a glitch upon starting playing, as the music was started by the
form handler but then stopped when the run function realised it wasn't
receiving any power, because it hadn't demanded any yet.
This commit is contained in:
Zefram 2014-08-14 15:04:42 +01:00
parent 049129d9b8
commit 1d0687556a

@ -76,6 +76,15 @@ local run = function(pos, node)
meta:set_int("LV_EU_demand", demand) meta:set_int("LV_EU_demand", demand)
end end
local function stop_player(pos, node)
local pos_hash = minetest.hash_node_position(pos)
local music_handle = music_handles[pos_hash]
if music_handle then
minetest.sound_stop(music_handle)
music_handles[pos_hash] = nil
end
end
minetest.register_node("technic:music_player", { minetest.register_node("technic:music_player", {
description = S("%s Music Player"):format("LV"), description = S("%s Music Player"):format("LV"),
tiles = {"technic_music_player_top.png", "technic_machine_bottom.png", "technic_music_player_side.png", tiles = {"technic_music_player_top.png", "technic_machine_bottom.png", "technic_music_player_side.png",
@ -91,8 +100,6 @@ minetest.register_node("technic:music_player", {
end, end,
on_receive_fields = function(pos, formanme, fields, sender) on_receive_fields = function(pos, formanme, fields, sender)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local pos_hash = minetest.hash_node_position(pos)
local music_handle = music_handles[pos_hash]
local current_track = meta:get_int("current_track") local current_track = meta:get_int("current_track")
if fields.track1 then current_track = 1 end if fields.track1 then current_track = 1 end
if fields.track2 then current_track = 2 end if fields.track2 then current_track = 2 end
@ -120,22 +127,14 @@ minetest.register_node("technic:music_player", {
"button[6,4;1,2;stop;Stop]".. "button[6,4;1,2;stop;Stop]"..
"label[4,0;"..S("Current track %s") "label[4,0;"..S("Current track %s")
:format(current_track).."]") :format(current_track).."]")
if fields.play then if fields.play or fields.stop then
if music_handle then stop_player(pos)
minetest.sound_stop(music_handle) meta:set_int("active", fields.play and 1 or 0)
end end
music_handle = play_track(pos, current_track)
meta:set_int("active", 1)
end
if fields.stop then
meta:set_int("active", 0)
if music_handle then
minetest.sound_stop(music_handle)
end
end
music_handles[pos_hash] = music_handle
end, end,
on_destruct = stop_player,
technic_run = run, technic_run = run,
technic_on_disable = stop_player,
}) })
technic.register_machine("LV", "technic:music_player", technic.receiver) technic.register_machine("LV", "technic:music_player", technic.receiver)