aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudvig Strigeus2001-11-09 19:08:47 +0000
committerLudvig Strigeus2001-11-09 19:08:47 +0000
commited84e102f7be81a55a046c4032c0296ec277b1d4 (patch)
tree0dc2effa4b2db1b76179ba9e23c5286ed458eadd
parent2d4bd6d7a04ad8d7289218e7b4a0372afec9dac6 (diff)
downloadscummvm-rg350-ed84e102f7be81a55a046c4032c0296ec277b1d4.tar.gz
scummvm-rg350-ed84e102f7be81a55a046c4032c0296ec277b1d4.tar.bz2
scummvm-rg350-ed84e102f7be81a55a046c4032c0296ec277b1d4.zip
warning message if no sfx channel available
svn-id: r3479
-rw-r--r--sdl.cpp7
-rw-r--r--windows.cpp73
2 files changed, 63 insertions, 17 deletions
diff --git a/sdl.cpp b/sdl.cpp
index 86734039c4..479f75665e 100644
--- a/sdl.cpp
+++ b/sdl.cpp
@@ -499,7 +499,7 @@ MixerChannel *find_channel() {
if (!mc->_sfx_sound)
return mc;
}
- return mc;
+ return NULL;
}
@@ -514,6 +514,11 @@ bool isSfxFinished() {
void playSfxSound(void *sound, uint32 size, uint rate) {
MixerChannel *mc = find_channel();
+ if (!mc) {
+ warning("No mixer channel available");
+ return;
+ }
+
mc->_sfx_sound = sound;
mc->_sfx_pos = 0;
mc->_sfx_fp_speed = (1<<16) * rate / 22050;
diff --git a/windows.cpp b/windows.cpp
index c9f6bb15e0..c4d3b8822f 100644
--- a/windows.cpp
+++ b/windows.cpp
@@ -818,35 +818,63 @@ void blitToScreen(Scumm *s, byte *src,int x, int y, int w, int h) {
#define BUFFER_SIZE (8192)
#define BITS_PER_SAMPLE 16
-static void *_sfx_sound;
-static uint32 _sfx_pos;
-static uint32 _sfx_size;
+struct MixerChannel {
+ void *_sfx_sound;
+ uint32 _sfx_pos;
+ uint32 _sfx_size;
+ uint32 _sfx_fp_speed;
+ uint32 _sfx_fp_pos;
+
+ void mix(int16 *data, uint32 len);
+ void clear();
+};
+
+#define NUM_MIXER 4
+
+static MixerChannel mixer_channel[NUM_MIXER];
+
+MixerChannel *find_channel() {
+ int i;
+ MixerChannel *mc = mixer_channel;
+ for(i=0; i<NUM_MIXER; i++,mc++) {
+ if (!mc->_sfx_sound)
+ return mc;
+ }
+ return NULL;
+}
-static uint32 _sfx_fp_speed;
-static uint32 _sfx_fp_pos;
bool isSfxFinished() {
- return _sfx_size == 0;
+ int i;
+ for(i=0; i<NUM_MIXER; i++)
+ if (mixer_channel[i]._sfx_sound)
+ return false;
+ return true;
}
void playSfxSound(void *sound, uint32 size, uint rate) {
- if (_sfx_sound) {
- free(_sfx_sound);
+ MixerChannel *mc = find_channel();
+
+ if (!mc) {
+ warning("No mixer channel available");
+ return;
}
- _sfx_sound = sound;
- _sfx_pos = 0;
- _sfx_fp_speed = (1<<16) * rate / 22050;
- _sfx_fp_pos = 0;
+
+ mc->_sfx_sound = sound;
+ mc->_sfx_pos = 0;
+ mc->_sfx_fp_speed = (1<<16) * rate / 22050;
+ mc->_sfx_fp_pos = 0;
+
while (size&0xFFFF0000) size>>=1, rate>>=1;
- _sfx_size = size * 22050 / rate;
+ mc->_sfx_size = size * 22050 / rate;
}
-void mix_sound(int16 *data, uint32 len) {
+void MixerChannel::mix(int16 *data, uint32 len) {
int8 *s;
int i;
uint32 fp_pos, fp_speed;
- if (!_sfx_size)
+ if (!_sfx_sound)
return;
if (len > _sfx_size)
len = _sfx_size;
@@ -866,6 +894,14 @@ void mix_sound(int16 *data, uint32 len) {
_sfx_pos = s - (int8*)_sfx_sound;
_sfx_fp_speed = fp_speed;
_sfx_fp_pos = fp_pos;
+
+ if (!_sfx_size)
+ clear();
+}
+
+void MixerChannel::clear() {
+ free(_sfx_sound);
+ _sfx_sound = NULL;
}
int clock;
@@ -898,12 +934,16 @@ void drawMouse(Scumm *s, int x, int y, int w, int h, byte *buf, bool visible) {
}
void fill_buffer(int16 *buf, int len) {
+ int i;
#if defined(USE_IMUSE)
sound.generate_samples(buf,len);
#else
memset(buf, 0, len*2);
#endif
- mix_sound(buf,len);
+ for(i=NUM_MIXER-1; i>=0;i--) {
+ mixer_channel[i].mix((int16*)buf, len);
+ }
+
}
void WndMan::prepare_header(WAVEHDR *wh, int i) {
@@ -983,6 +1023,7 @@ int main(int argc, char* argv[]) {
tmp = 5;
} else {
tmp = delta = scumm.scummLoop(delta);
+
tmp += tmp>>1;
if (scumm._fastMode)