aboutsummaryrefslogtreecommitdiff
path: root/engines/saga/music.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/saga/music.cpp')
-rw-r--r--engines/saga/music.cpp33
1 files changed, 16 insertions, 17 deletions
diff --git a/engines/saga/music.cpp b/engines/saga/music.cpp
index 3fa38d30fb..f1cdcbce46 100644
--- a/engines/saga/music.cpp
+++ b/engines/saga/music.cpp
@@ -117,6 +117,7 @@ void MusicDriver::send(uint32 b) {
Music::Music(SagaEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer) {
_currentVolume = 0;
+ _currentMusicBuffer = NULL;
_driver = new MusicDriver();
_digitalMusicContext = _vm->_resource->getContext(GAME_DIGITALMUSICFILE);
@@ -162,11 +163,13 @@ Music::Music(SagaEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer) {
// Just set an XMIDI parser for Mac IHNM for now
_parser = MidiParser::createParser_XMIDI();
} else {
- byte *resourceData;
- size_t resourceSize;
+ ByteArray resourceData;
int resourceId = (_vm->getGameId() == GID_ITE ? 9 : 0);
- _vm->_resource->loadResource(_musicContext, resourceId, resourceData, resourceSize);
- if (!memcmp(resourceData, "FORM", 4)) {
+ _vm->_resource->loadResource(_musicContext, resourceId, resourceData);
+ if (resourceData.size() < 4) {
+ error("Music::Music Unable to load midi resource data");
+ }
+ if (!memcmp(resourceData.getBuffer(), "FORM", 4)) {
_parser = MidiParser::createParser_XMIDI();
// ITE had MT32 mapped instruments
_driver->setGM(_vm->getGameId() != GID_ITE);
@@ -175,14 +178,12 @@ Music::Music(SagaEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer) {
// ITE with standalone MIDI files is General MIDI
_driver->setGM(_vm->getGameId() == GID_ITE);
}
- free(resourceData);
}
-
+
_parser->setMidiDriver(_driver);
_parser->setTimerRate(_driver->getBaseTempo());
_parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1);
- _midiMusicData = NULL;
_digitalMusic = false;
}
@@ -193,8 +194,6 @@ Music::~Music() {
delete _driver;
_parser->setMidiDriver(NULL);
delete _parser;
-
- free(_midiMusicData);
}
void Music::musicVolumeGaugeCallback(void *refCon) {
@@ -254,8 +253,6 @@ bool Music::isPlaying() {
void Music::play(uint32 resourceId, MusicFlags flags) {
Audio::SeekableAudioStream *audioStream = NULL;
- byte *resourceData;
- size_t resourceSize;
uint32 loopStart = 0;
debug(2, "Music::play %d, %d", resourceId, flags);
@@ -388,14 +385,19 @@ void Music::play(uint32 resourceId, MusicFlags flags) {
#endif
return;
} else {
- _vm->_resource->loadResource(_musicContext, resourceId, resourceData, resourceSize);
+ if (_currentMusicBuffer == &_musicBuffer[1]) {
+ _currentMusicBuffer = &_musicBuffer[0];
+ } else {
+ _currentMusicBuffer = &_musicBuffer[1];
+ }
+ _vm->_resource->loadResource(_musicContext, resourceId, *_currentMusicBuffer);
}
- if (resourceSize < 4) {
+ if (_currentMusicBuffer->size() < 4) {
error("Music::play() wrong music resource size");
}
- if (!_parser->loadMusic(resourceData, resourceSize))
+ if (!_parser->loadMusic(_currentMusicBuffer->getBuffer(), _currentMusicBuffer->size()))
error("Music::play() wrong music resource");
_parser->setTrack(0);
@@ -405,9 +407,6 @@ void Music::play(uint32 resourceId, MusicFlags flags) {
// Handle music looping
_parser->property(MidiParser::mpAutoLoop, (flags & MUSIC_LOOP) ? 1 : 0);
-
- free(_midiMusicData);
- _midiMusicData = resourceData;
}
void Music::pause() {