diff options
Diffstat (limited to 'engines/saga/music.cpp')
-rw-r--r-- | engines/saga/music.cpp | 33 |
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() { |