aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorMax Horn2007-02-28 14:48:26 +0000
committerMax Horn2007-02-28 14:48:26 +0000
commit8c8abca6f80fc63b5c11fa43319cdf56b4845660 (patch)
treeec031a874e67c92d3640824c2ee9816b5b6cab90 /engines
parentdea688d0f5303e552bff8ff22798719d92ed53c1 (diff)
downloadscummvm-rg350-8c8abca6f80fc63b5c11fa43319cdf56b4845660.tar.gz
scummvm-rg350-8c8abca6f80fc63b5c11fa43319cdf56b4845660.tar.bz2
scummvm-rg350-8c8abca6f80fc63b5c11fa43319cdf56b4845660.zip
Changed the AppendableAudioStream code to use a queue of buffers, instead of a fixed size wrap-around memory buffer (this reduces memory usage in some cases by 500-700k, while actually being more flexible)
svn-id: r25909
Diffstat (limited to 'engines')
-rw-r--r--engines/kyra/vqa.cpp33
-rw-r--r--engines/scumm/imuse_digi/dimuse.cpp9
-rw-r--r--engines/scumm/imuse_digi/dimuse_sndmgr.cpp4
-rw-r--r--engines/scumm/imuse_digi/dimuse_track.cpp6
-rw-r--r--engines/scumm/smush/smush_mixer.cpp10
-rw-r--r--engines/scumm/smush/smush_player.cpp8
-rw-r--r--engines/sword1/sound.cpp6
7 files changed, 40 insertions, 36 deletions
diff --git a/engines/kyra/vqa.cpp b/engines/kyra/vqa.cpp
index 3660bcf217..603b67221b 100644
--- a/engines/kyra/vqa.cpp
+++ b/engines/kyra/vqa.cpp
@@ -268,8 +268,8 @@ bool VQAMovie::open(const char *filename) {
_numPartialCodeBooks = 0;
if (_header.flags & 1) {
- // A 2-second buffer ought to be enough
- _stream = Audio::makeAppendableAudioStream(_header.freq, Audio::Mixer::FLAG_UNSIGNED, 2 * _header.freq * _header.channels);
+ // TODO/FIXME: Shouldn't we set FLAG_STEREO if _header.channels == 2 (wonders Fingolfin)
+ _stream = Audio::makeAppendableAudioStream(_header.freq, Audio::Mixer::FLAG_UNSIGNED);
} else {
_stream = NULL;
}
@@ -399,9 +399,10 @@ void VQAMovie::displayFrame(uint frameNum) {
switch (tag) {
case MKID_BE('SND0'): // Uncompressed sound
foundSound = true;
- inbuf = (byte *)allocBuffer(0, size);
+ inbuf = new byte[size];
_file.read(inbuf, size);
- _stream->append(inbuf, size);
+ assert(_stream);
+ _stream->queueBuffer(inbuf, size);
break;
case MKID_BE('SND1'): // Compressed sound, almost like AUD
@@ -409,15 +410,18 @@ void VQAMovie::displayFrame(uint frameNum) {
outsize = _file.readUint16LE();
insize = _file.readUint16LE();
- inbuf = (byte *)allocBuffer(0, insize);
+ inbuf = new byte[insize];
_file.read(inbuf, insize);
if (insize == outsize) {
- _stream->append(inbuf, insize);
+ assert(_stream);
+ _stream->queueBuffer(inbuf, insize);
} else {
- outbuf = (byte *)allocBuffer(1, outsize);
+ outbuf = new byte[outsize];
decodeSND1(inbuf, insize, outbuf, outsize);
- _stream->append(outbuf, outsize);
+ assert(_stream);
+ _stream->queueBuffer(outbuf, outsize);
+ delete[] inbuf;
}
break;
@@ -589,24 +593,25 @@ void VQAMovie::play() {
switch (tag) {
case MKID_BE('SND0'): // Uncompressed sound
- inbuf = (byte *)allocBuffer(0, size);
+ inbuf = new byte[size];
_file.read(inbuf, size);
- _stream->append(inbuf, size);
+ _stream->queueBuffer(inbuf, size);
break;
case MKID_BE('SND1'): // Compressed sound
outsize = _file.readUint16LE();
insize = _file.readUint16LE();
- inbuf = (byte *)allocBuffer(0, insize);
+ inbuf = new byte[insize];
_file.read(inbuf, insize);
if (insize == outsize) {
- _stream->append(inbuf, insize);
+ _stream->queueBuffer(inbuf, insize);
} else {
- outbuf = (byte *)allocBuffer(1, outsize);
+ outbuf = new byte[outsize];
decodeSND1(inbuf, insize, outbuf, outsize);
- _stream->append(outbuf, outsize);
+ _stream->queueBuffer(outbuf, outsize);
+ delete[] inbuf;
}
break;
diff --git a/engines/scumm/imuse_digi/dimuse.cpp b/engines/scumm/imuse_digi/dimuse.cpp
index 7e70268b12..c249dd57a9 100644
--- a/engines/scumm/imuse_digi/dimuse.cpp
+++ b/engines/scumm/imuse_digi/dimuse.cpp
@@ -188,9 +188,8 @@ void IMuseDigital::saveOrLoad(Serializer *ser) {
track->mixerFlags |= Audio::Mixer::FLAG_LITTLE_ENDIAN;
#endif
- int32 streamBufferSize = track->iteration;
track->stream2 = NULL;
- track->stream = Audio::makeAppendableAudioStream(freq, track->mixerFlags, streamBufferSize);
+ track->stream = Audio::makeAppendableAudioStream(freq, track->mixerFlags);
const int pan = (track->pan != 64) ? 2 * track->pan - 127 : 0;
const int vol = track->vol / 1000;
@@ -324,10 +323,10 @@ void IMuseDigital::callback() {
if (_mixer->isReady()) {
_mixer->setChannelVolume(track->handle, vol);
_mixer->setChannelBalance(track->handle, pan);
- track->stream->append(data, result);
+ track->stream->queueBuffer(data, result);
track->regionOffset += result;
- }
- free(data);
+ } else
+ delete[] data;
if (_sound->isEndOfRegion(track->soundHandle, track->curRegion)) {
switchToNextRegion(track);
diff --git a/engines/scumm/imuse_digi/dimuse_sndmgr.cpp b/engines/scumm/imuse_digi/dimuse_sndmgr.cpp
index 2b88f37b17..5c7fa5b613 100644
--- a/engines/scumm/imuse_digi/dimuse_sndmgr.cpp
+++ b/engines/scumm/imuse_digi/dimuse_sndmgr.cpp
@@ -583,11 +583,11 @@ int32 ImuseDigiSndMgr::getDataFromRegion(soundStruct *soundHandle, int region, b
if ((soundHandle->bundle) && (!soundHandle->compressed)) {
size = soundHandle->bundle->decompressSampleByCurIndex(start + offset, size, buf, header_size, header_outside);
} else if (soundHandle->resPtr) {
- *buf = (byte *)malloc(size);
+ *buf = new byte[size];
assert(*buf);
memcpy(*buf, soundHandle->resPtr + start + offset + header_size, size);
} else if ((soundHandle->bundle) && (soundHandle->compressed)) {
- *buf = (byte *)malloc(size);
+ *buf = new byte[size];
assert(*buf);
char fileName[24];
sprintf(fileName, "%s_reg%03d", soundHandle->name, region);
diff --git a/engines/scumm/imuse_digi/dimuse_track.cpp b/engines/scumm/imuse_digi/dimuse_track.cpp
index 37ae22f47f..6acb2a0318 100644
--- a/engines/scumm/imuse_digi/dimuse_track.cpp
+++ b/engines/scumm/imuse_digi/dimuse_track.cpp
@@ -176,9 +176,8 @@ void IMuseDigital::startSound(int soundId, const char *soundName, int soundType,
type = Audio::Mixer::kMusicSoundType;
// setup 1 second stream wrapped buffer
- int32 streamBufferSize = track->iteration;
track->stream2 = NULL;
- track->stream = Audio::makeAppendableAudioStream(freq, track->mixerFlags, streamBufferSize);
+ track->stream = Audio::makeAppendableAudioStream(freq, track->mixerFlags);
_mixer->playInputStream(type, &track->handle, track->stream, -1, vol, pan, false);
track->started = true;
}
@@ -356,8 +355,7 @@ IMuseDigital::Track *IMuseDigital::cloneToFadeOutTrack(Track *track, int fadeDel
type = Audio::Mixer::kMusicSoundType;
// setup 1 second stream wrapped buffer
- int32 streamBufferSize = fadeTrack->iteration;
- fadeTrack->stream = Audio::makeAppendableAudioStream(_sound->getFreq(fadeTrack->soundHandle), fadeTrack->mixerFlags, streamBufferSize);
+ fadeTrack->stream = Audio::makeAppendableAudioStream(_sound->getFreq(fadeTrack->soundHandle), fadeTrack->mixerFlags);
_mixer->playInputStream(type, &fadeTrack->handle, fadeTrack->stream, -1, fadeTrack->vol / 1000, fadeTrack->pan, false);
fadeTrack->started = true;
fadeTrack->used = true;
diff --git a/engines/scumm/smush/smush_mixer.cpp b/engines/scumm/smush/smush_mixer.cpp
index 9e6631a365..e29a921224 100644
--- a/engines/scumm/smush/smush_mixer.cpp
+++ b/engines/scumm/smush/smush_mixer.cpp
@@ -105,6 +105,7 @@ bool SmushMixer::handleFrame() {
_channels[i].chan->getParameters(stereo, is_16bit, vol, pan);
+ // Grab the audio data from the channel
int32 size = _channels[i].chan->getAvailableSoundDataSize();
byte *data = _channels[i].chan->getSoundData();
@@ -116,15 +117,16 @@ bool SmushMixer::handleFrame() {
}
if (_mixer->isReady()) {
+ // Stream the data
if (!_channels[i].stream) {
- _channels[i].stream = Audio::makeAppendableAudioStream(_channels[i].chan->getRate(), flags, 500000);
+ _channels[i].stream = Audio::makeAppendableAudioStream(_channels[i].chan->getRate(), flags);
_mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_channels[i].handle, _channels[i].stream);
}
_mixer->setChannelVolume(_channels[i].handle, vol);
_mixer->setChannelBalance(_channels[i].handle, pan);
- _channels[i].stream->append(data, size);
- }
- delete[] data;
+ _channels[i].stream->queueBuffer(data, size); // The stream will free the buffer for us
+ } else
+ delete[] data;
}
}
}
diff --git a/engines/scumm/smush/smush_player.cpp b/engines/scumm/smush/smush_player.cpp
index d4b3352be4..3310415f30 100644
--- a/engines/scumm/smush/smush_player.cpp
+++ b/engines/scumm/smush/smush_player.cpp
@@ -462,7 +462,7 @@ void SmushPlayer::handleIACT(Chunk &b) {
c->checkParameters(index, nbframes, size, track_flags, unknown);
c->appendData(b, bsize);
} else {
- byte output_data[4096];
+ // TODO: Move this code into another SmushChannel subclass?
byte *src = (byte *)malloc(bsize);
b.read(src, bsize);
byte *d_src = src;
@@ -477,6 +477,8 @@ void SmushPlayer::handleIACT(Chunk &b) {
_IACTpos += bsize;
bsize = 0;
} else {
+ byte *output_data = new byte[4096];
+
memcpy(_IACToutput + _IACTpos, d_src, len);
byte *dst = output_data;
byte *d_src2 = _IACToutput;
@@ -507,10 +509,10 @@ void SmushPlayer::handleIACT(Chunk &b) {
} while (--count);
if (!_IACTstream) {
- _IACTstream = Audio::makeAppendableAudioStream(22050, Audio::Mixer::FLAG_STEREO | Audio::Mixer::FLAG_16BITS, 900000);
+ _IACTstream = Audio::makeAppendableAudioStream(22050, Audio::Mixer::FLAG_STEREO | Audio::Mixer::FLAG_16BITS);
_vm->_mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_IACTchannel, _IACTstream);
}
- _IACTstream->append(output_data, 0x1000);
+ _IACTstream->queueBuffer(output_data, 0x1000);
bsize -= len;
d_src += len;
diff --git a/engines/sword1/sound.cpp b/engines/sword1/sound.cpp
index fd0a37003e..6c255cb4ce 100644
--- a/engines/sword1/sound.cpp
+++ b/engines/sword1/sound.cpp
@@ -382,10 +382,8 @@ void Sound::initCowSystem(void) {
}
void Sound::closeCowSystem(void) {
- if (_cowFile.isOpen())
- _cowFile.close();
- if (_cowHeader)
- free(_cowHeader);
+ _cowFile.close();
+ free(_cowHeader);
_cowHeader = NULL;
_currentCowFile = 0;
}