diff options
author | Gregory Montoir | 2005-08-19 22:12:09 +0000 |
---|---|---|
committer | Gregory Montoir | 2005-08-19 22:12:09 +0000 |
commit | 24265fd3dd1681835f63e3c901158adef1ec5bc5 (patch) | |
tree | 36a28654b271ca5d8f12006f95f4990deaf371f8 /kyra/sound.cpp | |
parent | ed2a18569a68d5be78d5a893d66979eef9fe06cd (diff) | |
download | scummvm-rg350-24265fd3dd1681835f63e3c901158adef1ec5bc5.tar.gz scummvm-rg350-24265fd3dd1681835f63e3c901158adef1ec5bc5.tar.bz2 scummvm-rg350-24265fd3dd1681835f63e3c901158adef1ec5bc5.zip |
some WIP code to start introduction (with glitches) in Kyrandia 1 :
- the decoders have been rewritten due to crashes I encountered with the previous ones in Compression::
- the wsa code loader for v1 have been rewritten too, to handle the same flags as the original
- some cleanup
- this has only been tested with the floppy version
svn-id: r18704
Diffstat (limited to 'kyra/sound.cpp')
-rw-r--r-- | kyra/sound.cpp | 261 |
1 files changed, 130 insertions, 131 deletions
diff --git a/kyra/sound.cpp b/kyra/sound.cpp index 495b5f458e..8448726c75 100644 --- a/kyra/sound.cpp +++ b/kyra/sound.cpp @@ -19,163 +19,162 @@ * */ -#include "kyra/sound.h" +#include "common/stdafx.h" #include "kyra/resource.h" +#include "kyra/sound.h" namespace Kyra { - MusicPlayer::MusicPlayer(MidiDriver* driver, KyraEngine* engine) { - _engine = engine; - _driver = driver; - _passThrough = false; - _isPlaying = _nativeMT32 = false; - - memset(_channel, 0, sizeof(MidiChannel*) * 16); - memset(_channelVolume, 255, sizeof(uint8) * 16); - _volume = 0; - - int ret = open(); - if (ret != MERR_ALREADY_OPEN && ret != 0) { - error("couldn't open midi driver"); - } - } - MusicPlayer::~MusicPlayer() { - _driver->setTimerCallback(NULL, NULL); - close(); - } +MusicPlayer::MusicPlayer(MidiDriver* driver, KyraEngine* engine) { + _engine = engine; + _driver = driver; + _passThrough = false; + _isPlaying = _nativeMT32 = false; - void MusicPlayer::setVolume(int volume) { - if (volume < 0) - volume = 0; - else if (volume > 255) - volume = 255; + memset(_channel, 0, sizeof(MidiChannel*) * 16); + memset(_channelVolume, 255, sizeof(uint8) * 16); + _volume = 0; - if (_volume == volume) - return; - - _volume = volume; - - for (int i = 0; i < 16; ++i) { - if (_channel[i]) { - _channel[i]->volume(_channelVolume[i] * _volume / 255); - } - } + int ret = open(); + if (ret != MERR_ALREADY_OPEN && ret != 0) { + error("couldn't open midi driver"); } - - int MusicPlayer::open() { - // Don't ever call open without first setting the output driver! - if (!_driver) - return 255; - - int ret = _driver->open(); - if (ret) - return ret; - - _driver->setTimerCallback(this, &onTimer); - return 0; +} + +MusicPlayer::~MusicPlayer() { + _driver->setTimerCallback(NULL, NULL); + close(); +} + +void MusicPlayer::setVolume(int volume) { + if (volume < 0) + volume = 0; + else if (volume > 255) + volume = 255; + + if (_volume == volume) + return; + + _volume = volume; + for (int i = 0; i < 16; ++i) { + if (_channel[i]) { + _channel[i]->volume(_channelVolume[i] * _volume / 255); + } } - - void MusicPlayer::close() { - if (_driver) - _driver->close(); - _driver = 0; +} + +int MusicPlayer::open() { + // Don't ever call open without first setting the output driver! + if (!_driver) + return 255; + + int ret = _driver->open(); + if (ret) + return ret; + + _driver->setTimerCallback(this, &onTimer); + return 0; +} + +void MusicPlayer::close() { + if (_driver) + _driver->close(); + _driver = 0; +} + +void MusicPlayer::send(uint32 b) { + if (_passThrough) { + _driver->send(b); + return; } - void MusicPlayer::send(uint32 b) { - if (_passThrough) { - _driver->send(b); - return; - } - - uint8 channel = (byte)(b & 0x0F); - if ((b & 0xFFF0) == 0x07B0) { - // Adjust volume changes by master volume - uint8 volume = (uint8)((b >> 16) & 0x7F); - _channelVolume[channel] = volume; - volume = volume * _volume / 255; - b = (b & 0xFF00FFFF) | (volume << 16); - } else if ((b & 0xF0) == 0xC0 && !_nativeMT32) { - b = (b & 0xFFFF00FF) | MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8; - } else if ((b & 0xFFF0) == 0x007BB0) { - //Only respond to All Notes Off if this channel - //has currently been allocated - if (!_channel[channel]) - return; - } - + uint8 channel = (byte)(b & 0x0F); + if ((b & 0xFFF0) == 0x07B0) { + // Adjust volume changes by master volume + uint8 volume = (uint8)((b >> 16) & 0x7F); + _channelVolume[channel] = volume; + volume = volume * _volume / 255; + b = (b & 0xFF00FFFF) | (volume << 16); + } else if ((b & 0xF0) == 0xC0 && !_nativeMT32) { + b = (b & 0xFFFF00FF) | MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8; + } else if ((b & 0xFFF0) == 0x007BB0) { + //Only respond to All Notes Off if this channel + //has currently been allocated if (!_channel[channel]) - _channel[channel] = (channel == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel(); + return; + } - if (_channel[channel]) - _channel[channel]->send(b); + if (!_channel[channel]) + _channel[channel] = (channel == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel(); + if (_channel[channel]) + _channel[channel]->send(b); +} + +void MusicPlayer::metaEvent(byte type, byte *data, uint16 length) { + switch (type) { + case 0x2F: // End of Track + _parser->jumpToTick(0); + break; + default: + warning("Unhandled meta event: 0x%02x", type); + break; } +} - void MusicPlayer::metaEvent(byte type, byte *data, uint16 length) { - switch (type) { - case 0x2F: // End of Track - _parser->jumpToTick(0); - break; - default: - warning("Unhandled meta event: 0x%02x", type); - break; - } +void MusicPlayer::playMusic(const char* file) { + uint32 size; + uint8 *data = (_engine->resource())->fileData(file, &size); + + if (!data) { + warning("couldn't load '%s'", file); + return; } - void MusicPlayer::playMusic(const char* file) { - uint32 size; - uint8* data = 0; + playMusic(data, size); +} - data = (_engine->resManager())->fileData(file, &size); +void MusicPlayer::playMusic(uint8* data, uint32 size) { + if (_isPlaying) + stopMusic(); - if (!data) { - warning("couldn't load '%s'", file); - return; - } + _parser = MidiParser::createParser_XMIDI(); + assert(_parser); - playMusic(data, size); + if (!_parser->loadMusic(data, size)) { + warning("Error reading track!"); + delete _parser; + _parser = 0; + return; } - void MusicPlayer::playMusic(uint8* data, uint32 size) { - if (_isPlaying) - stopMusic(); + _parser->setTrack(0); + _parser->setMidiDriver(this); + _parser->setTimerRate(getBaseTempo()); - _parser = MidiParser::createParser_XMIDI(); - assert(_parser); + _isPlaying = true; +} - if (!_parser->loadMusic(data, size)) { - warning("Error reading track!"); - delete _parser; - _parser = 0; - return; - } - - _parser->setTrack(0); - _parser->setMidiDriver(this); - _parser->setTimerRate(getBaseTempo()); - - _isPlaying = true; +void MusicPlayer::stopMusic() { + _isPlaying = false; + if (_parser) { + _parser->unloadMusic(); + delete _parser; + _parser = NULL; } +} - void MusicPlayer::stopMusic() { - _isPlaying = false; - if (_parser) { - _parser->unloadMusic(); - delete _parser; - _parser = NULL; - } - } +void MusicPlayer::onTimer(void *refCon) { + MusicPlayer *music = (MusicPlayer *)refCon; + if (music->_isPlaying) + music->_parser->onTimer(); +} - void MusicPlayer::onTimer(void *refCon) { - MusicPlayer *music = (MusicPlayer *)refCon; - if (music->_isPlaying) - music->_parser->onTimer(); +void MusicPlayer::playTrack(uint8 track) { + if (_parser) { + _isPlaying = true; + _parser->setTrack(track); + _parser->jumpToTick(0); } +} - void MusicPlayer::playTrack(uint8 track) { - if (_parser) { - _isPlaying = true; - _parser->setTrack(track); - _parser->jumpToTick(0); - } - } } // end of namespace Kyra |