aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction/sound.cpp
diff options
context:
space:
mode:
authorNicola Mettifogo2009-01-06 16:21:23 +0000
committerNicola Mettifogo2009-01-06 16:21:23 +0000
commitfa1d881ad44a515e57b87ba27b325d1eeb4a750b (patch)
tree35183034e8e725b83502983b4c5cf94a5b489fa2 /engines/parallaction/sound.cpp
parentc528f888d0c227bc735a3ba2110ad9708bc1abd8 (diff)
downloadscummvm-rg350-fa1d881ad44a515e57b87ba27b325d1eeb4a750b.tar.gz
scummvm-rg350-fa1d881ad44a515e57b87ba27b325d1eeb4a750b.tar.bz2
scummvm-rg350-fa1d881ad44a515e57b87ba27b325d1eeb4a750b.zip
Implemented pauseEngineIntern, and fixed music volume handling in SoundMan.
svn-id: r35756
Diffstat (limited to 'engines/parallaction/sound.cpp')
-rw-r--r--engines/parallaction/sound.cpp29
1 files changed, 26 insertions, 3 deletions
diff --git a/engines/parallaction/sound.cpp b/engines/parallaction/sound.cpp
index 8c6174a0db..503f8b3303 100644
--- a/engines/parallaction/sound.cpp
+++ b/engines/parallaction/sound.cpp
@@ -49,6 +49,7 @@ public:
void play(Common::SeekableReadStream *stream);
void stop();
+ void pause(bool p);
void updateTimer();
void adjustVolume(int diff);
void setVolume(int volume);
@@ -74,6 +75,7 @@ private:
uint8 *_midiData;
bool _isLooping;
bool _isPlaying;
+ bool _paused;
int _masterVolume;
MidiChannel *_channelsTable[NUM_CHANNELS];
uint8 _channelsVolume[NUM_CHANNELS];
@@ -81,10 +83,12 @@ private:
};
MidiPlayer::MidiPlayer(MidiDriver *driver)
- : _driver(driver), _parser(0), _midiData(0), _isLooping(false), _isPlaying(false), _masterVolume(0) {
+ : _driver(driver), _parser(0), _midiData(0), _isLooping(false), _isPlaying(false), _paused(false), _masterVolume(0) {
assert(_driver);
memset(_channelsTable, 0, sizeof(_channelsTable));
- memset(_channelsVolume, 0, sizeof(_channelsVolume));
+ for (int i = 0; i < NUM_CHANNELS; i++) {
+ _channelsVolume[i] = 127;
+ }
open();
}
@@ -125,7 +129,21 @@ void MidiPlayer::stop() {
_mutex.unlock();
}
+void MidiPlayer::pause(bool p) {
+ _paused = p;
+
+ for (int i = 0; i < NUM_CHANNELS; ++i) {
+ if (_channelsTable[i]) {
+ _channelsTable[i]->volume(_paused ? 0 : _channelsVolume[i] * _masterVolume / 255);
+ }
+ }
+}
+
void MidiPlayer::updateTimer() {
+ if (_paused) {
+ return;
+ }
+
_mutex.lock();
if (_isPlaying) {
_parser->onTimer();
@@ -217,7 +235,6 @@ void MidiPlayer::timerCallback(void *p) {
player->updateTimer();
}
-
DosSoundMan::DosSoundMan(Parallaction *vm, MidiDriver *midiDriver) : SoundMan(vm), _musicData1(0) {
_midiPlayer = new MidiPlayer(midiDriver);
}
@@ -254,12 +271,18 @@ void DosSoundMan::playMusic() {
Common::SeekableReadStream *stream = _vm->_disk->loadMusic(_musicFile);
_midiPlayer->play(stream);
+ _midiPlayer->setVolume(255);
}
void DosSoundMan::stopMusic() {
_midiPlayer->stop();
}
+void DosSoundMan::pause(bool p) {
+ SoundMan::pause(p);
+ _midiPlayer->pause(p);
+}
+
void DosSoundMan::playCharacterMusic(const char *character) {
if (character == NULL) {
return;