aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorKari Salminen2008-08-13 01:02:00 +0000
committerKari Salminen2008-08-13 01:02:00 +0000
commiteeba630cbf48b093bd07d3e8413d6059fddb07df (patch)
treeed6cd2f237cf89f55bf75e762135b601721d418e /engines
parent582104752b337adcc2f51b3fa4842a0b8a5b42db (diff)
downloadscummvm-rg350-eeba630cbf48b093bd07d3e8413d6059fddb07df.tar.gz
scummvm-rg350-eeba630cbf48b093bd07d3e8413d6059fddb07df.tar.bz2
scummvm-rg350-eeba630cbf48b093bd07d3e8413d6059fddb07df.zip
Changed Agi::SoundMgr's sound buffer to a member array of size BUFFER_SIZE. Also added initialization of _playing to false in SoundMgr's constructor. Hopefully helps with the occasional crashes in the sound code when starting the first sound in an AGI game.
svn-id: r33815
Diffstat (limited to 'engines')
-rw-r--r--engines/agi/sound.cpp19
-rw-r--r--engines/agi/sound.h3
2 files changed, 9 insertions, 13 deletions
diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp
index 77f79272f8..69ccc2c218 100644
--- a/engines/agi/sound.cpp
+++ b/engines/agi/sound.cpp
@@ -435,13 +435,9 @@ void IIgsMidiChannel::stopSounds() {
_gsChannels.clear();
}
-static int16 *buffer;
-
int SoundMgr::initSound() {
int r = -1;
- buffer = _sndBuffer = (int16 *)calloc(2, BUFFER_SIZE);
-
_env = false;
switch (_vm->_soundemu) {
@@ -478,7 +474,6 @@ int SoundMgr::initSound() {
void SoundMgr::deinitSound() {
debugC(3, kDebugLevelSound, "()");
_mixer->stopHandle(_soundHandle);
- free(_sndBuffer);
}
void SoundMgr::stopNote(int i) {
@@ -1185,7 +1180,7 @@ bool SoundMgr::loadInstruments() {
return _gsSound.loadWaveFile(waveFsnode->getPath(), *exeInfo) && _gsSound.loadInstrumentHeaders(exeFsnode->getPath(), *exeInfo);
}
-static void fillAudio(void *udata, int16 *stream, uint len) {
+void SoundMgr::fillAudio(void *udata, int16 *stream, uint len) {
SoundMgr *soundMgr = (SoundMgr *)udata;
uint32 p = 0;
static uint32 n = 0, s = 0;
@@ -1193,32 +1188,32 @@ static void fillAudio(void *udata, int16 *stream, uint len) {
len <<= 2;
debugC(5, kDebugLevelSound, "(%p, %p, %d)", (void *)udata, (void *)stream, len);
- memcpy(stream, (uint8 *)buffer + s, p = n);
+ memcpy(stream, ((uint8 *)&_sndBuffer[0]) + s, p = n);
for (n = 0, len -= p; n < len; p += n, len -= n) {
soundMgr->playSound();
n = soundMgr->mixSound() << 1;
if (len < n) {
- memcpy((uint8 *)stream + p, buffer, len);
+ memcpy((uint8 *)stream + p, _sndBuffer, len);
s = len;
n -= s;
return;
} else {
- memcpy((uint8 *)stream + p, buffer, n);
+ memcpy((uint8 *)stream + p, _sndBuffer, n);
}
}
soundMgr->playSound();
n = soundMgr->mixSound() << 1;
- memcpy((uint8 *)stream + p, buffer, s = len);
+ memcpy((uint8 *)stream + p, _sndBuffer, s = len);
n -= s;
}
-SoundMgr::SoundMgr(AgiBase *agi, Audio::Mixer *pMixer) {
+SoundMgr::SoundMgr(AgiBase *agi, Audio::Mixer *pMixer) : _sndBuffer() {
_vm = agi;
_mixer = pMixer;
_sampleRate = pMixer->getOutputRate();
_endflag = -1;
+ _playing = false;
_playingSound = -1;
- _sndBuffer = 0;
_waveform = 0;
}
diff --git a/engines/agi/sound.h b/engines/agi/sound.h
index f1c2782421..9b71ac388e 100644
--- a/engines/agi/sound.h
+++ b/engines/agi/sound.h
@@ -468,10 +468,11 @@ private:
int _playingSound;
uint8 _env;
- int16 *_sndBuffer;
+ int16 _sndBuffer[BUFFER_SIZE];
const int16 *_waveform;
void premixerCall(int16 *buf, uint len);
+ void fillAudio(void *udata, int16 *stream, uint len);
public:
void unloadSound(int);