aboutsummaryrefslogtreecommitdiff
path: root/kyra/sound.cpp
diff options
context:
space:
mode:
authorGregory Montoir2005-08-19 22:12:09 +0000
committerGregory Montoir2005-08-19 22:12:09 +0000
commit24265fd3dd1681835f63e3c901158adef1ec5bc5 (patch)
tree36a28654b271ca5d8f12006f95f4990deaf371f8 /kyra/sound.cpp
parented2a18569a68d5be78d5a893d66979eef9fe06cd (diff)
downloadscummvm-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.cpp261
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