diff --git a/src/sdl-instead/game.c b/src/sdl-instead/game.c index da4037b..14da608 100644 --- a/src/sdl-instead/game.c +++ b/src/sdl-instead/game.c @@ -1104,14 +1104,26 @@ void game_sound_player(void) { wav_t w; char *snd; + int chan = -1; + if (!snd_volume_mus(-1)) return; + snd = instead_eval("return get_sound_chan()"); + if (snd) { + chan = atoi(snd); + free(snd); + } + snd = instead_eval("return get_sound()"); - if (!snd) + if (!snd) { + if (chan != -1) { + /* halt channel */ + snd_halt_chan(chan); + } return; - + } do { /* reset sound */ - char *p = instead_eval("set_sound(nil)"); + char *p = instead_eval("set_sound(nil, -1)"); if (p) free(p); } while(0); @@ -1123,7 +1135,7 @@ void game_sound_player(void) free(snd); if (!w) return; - snd_play(w); + snd_play(w, chan); } char *horiz_inv(char *invstr) @@ -1646,7 +1658,7 @@ int game_click(int x, int y, int action, int filter) if (mouse_filter(filter)) return 0; if (opt_click) - snd_play(game_theme.click); + snd_play(game_theme.click, -1); game_cmd(buf); return 1; @@ -1669,7 +1681,7 @@ int game_click(int x, int y, int action, int filter) disable_use(); if (opt_click) - snd_play(game_theme.click); + snd_play(game_theme.click, -1); game_cmd(buf); return 1; diff --git a/src/sdl-instead/sound.c b/src/sdl-instead/sound.c index ffda372..9024949 100644 --- a/src/sdl-instead/sound.c +++ b/src/sdl-instead/sound.c @@ -109,6 +109,11 @@ void snd_free_wav(wav_t w) Mix_FreeChunk((Mix_Chunk*)w); } +void snd_halt_chan(int han) +{ + Mix_HaltChannel(han); +} + Mix_Music *snd_load_mus(const char *fname) { Mix_Music *mus; @@ -183,13 +188,13 @@ void snd_free_mus(mus_t mus) Mix_FreeMusic((Mix_Music*) mus); } -void snd_play(void *chunk) +void snd_play(void *chunk, int channel) { if (!sound_on) return; if (!chunk) return; - Mix_PlayChannel(-1, (Mix_Chunk*)chunk, 0); + Mix_PlayChannel(channel, (Mix_Chunk*)chunk, 0); } void snd_done(void) diff --git a/src/sdl-instead/sound.h b/src/sdl-instead/sound.h index 7405d87..f06d89c 100644 --- a/src/sdl-instead/sound.h +++ b/src/sdl-instead/sound.h @@ -16,7 +16,9 @@ typedef void* mus_t; extern void snd_free_mus(mus_t mus); extern int snd_init(int hz); extern int snd_hz(void); -extern void snd_play(wav_t chunk); +extern void snd_play(wav_t chunk, int channel); +extern void snd_halt_chan(int han); + extern void snd_free_wav(wav_t chunk); extern wav_t snd_load_wav(const char *fname); extern int snd_play_mus(char *music, int ms, int loop); diff --git a/stead/stead.lua b/stead/stead.lua index e25763c..e34b7ee 100644 --- a/stead/stead.lua +++ b/stead/stead.lua @@ -2063,8 +2063,17 @@ function get_sound() return game._sound; end -function set_sound(s) +function get_sound_chan() + return game._sound_channel +end + +function set_sound(s, chan) game._sound = s; + if not tonumber(chan) then + game._sound_channel = -1; + else + game._sound_channel = tonumber(chan); + end end function change_pl(p)