From 61b85083f515a71ee20813d7c5ef604b2b06dc99 Mon Sep 17 00:00:00 2001
From: "p.kosyh"
Date: Wed, 11 Nov 2009 19:13:37 +0000
Subject: [PATCH] set_sound with channel, undocumented feature ;)
---
src/sdl-instead/game.c | 24 ++++++++++++++++++------
src/sdl-instead/sound.c | 9 +++++++--
src/sdl-instead/sound.h | 4 +++-
stead/stead.lua | 11 ++++++++++-
4 files changed, 38 insertions(+), 10 deletions(-)
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)