aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenrik "Henke37" Andersson2019-10-10 03:20:49 +0200
committerEugene Sandulenko2019-10-11 18:10:46 +0200
commit89b20bbb86608a6b61b56b13e9c35757bc5c4158 (patch)
treed8deac7b81a9d3e4cd83402725dfe8b3b1235cc0
parent5b401519ebebe22360473a738c805a551114fa6a (diff)
downloadscummvm-rg350-89b20bbb86608a6b61b56b13e9c35757bc5c4158.tar.gz
scummvm-rg350-89b20bbb86608a6b61b56b13e9c35757bc5c4158.tar.bz2
scummvm-rg350-89b20bbb86608a6b61b56b13e9c35757bc5c4158.zip
HDB: Factor out the song code into the Song class, avoiding a lot of duplicate code.
-rw-r--r--engines/hdb/sound.cpp337
-rw-r--r--engines/hdb/sound.h29
2 files changed, 158 insertions, 208 deletions
diff --git a/engines/hdb/sound.cpp b/engines/hdb/sound.cpp
index 4579212937..5edde1127c 100644
--- a/engines/hdb/sound.cpp
+++ b/engines/hdb/sound.cpp
@@ -1422,8 +1422,6 @@ void Sound::test() {
}
void Sound::init() {
- _song1.playing = _song2.playing = false;
-
//
// init sound caching system
//
@@ -1465,21 +1463,6 @@ void Sound::loadSaveFile(Common::InSaveFile *in) {
}
}
-void Sound::setMusicVolume(int volume) {
- _musicVolume = volume;
- if (_song1.playing) {
- if (_song1.fadingIn)
- _song1.fadeInVol = volume;
- if (!_song1.fadingOut)
- g_hdb->_mixer->setChannelVolume(_song1.handle, volume);
- }
- if (_song2.playing) {
- if (_song2.fadingIn)
- _song2.fadeInVol = volume;
- if (!_song2.fadingOut)
- g_hdb->_mixer->setChannelVolume(_song2.handle, volume);
- }
-}
void Sound::playSound(int index) {
if (index > _numSounds || !_sfxVolume)
@@ -1708,6 +1691,16 @@ void Sound::playVoice(int index, int actor) {
return;
}
+void Sound::setMusicVolume(int volume) {
+ _musicVolume = volume;
+ if (_song1.isPlaying()) {
+ _song1.setVolume(volume);
+ }
+ if (_song2.isPlaying()) {
+ _song2.setVolume(volume);
+ }
+}
+
void Sound::startMusic(SoundType song) {
g_hdb->_menu->saveSong(song);
@@ -1728,22 +1721,18 @@ void Sound::fadeInMusic(SoundType song, int ramp) {
}
void Sound::fadeOutMusic(int ramp) {
- if (_song1.playing) {
- _song1.fadeOutRamp = ramp;
- _song1.fadingOut = true;
- _song1.fadeOutVol = _musicVolume;
- } else if (_song2.playing) {
- _song2.fadeOutRamp = ramp;
- _song2.fadingOut = true;
- _song2.fadeOutVol = _musicVolume;
+ if (_song1.isPlaying()) {
+ _song1.fadeOut(ramp);
+ } else if (_song2.isPlaying()) {
+ _song2.fadeOut(ramp);
}
}
bool Sound::songPlaying(SoundType song) {
- if (_song1.playing && _song1.song == song)
+ if (_song1.isPlaying() && _song1.getSong() == song)
return true;
- if (_song2.playing && _song2.song == song)
+ if (_song2.isPlaying() && _song2.getSong() == song)
return true;
return false;
@@ -1754,209 +1743,163 @@ void Sound::stopChannel(int channel) {
}
void Sound::stopMusic() {
- if (_song1.playing) {
- _song1.playing = false;
- g_hdb->_mixer->stopHandle(_song1.handle);
+ if (_song1.isPlaying()) {
+ _song1.stop();
}
- if (_song2.playing) {
- _song2.playing = false;
- g_hdb->_mixer->stopHandle(_song2.handle);
+ if (_song2.isPlaying()) {
+ _song2.stop();
}
}
void Sound::beginMusic(SoundType song, bool fadeIn, int ramp) {
- Common::String songName(soundList[song].name);
+ if (!_song1.isPlaying()) {
+ // Start fading out SONG2 if its playing
+ if (_song2.isPlaying()) {
+ _song2.fadeOut(ramp);
+ }
+
+ _song1.playSong(song, fadeIn, ramp);
+ }
+ else if (!_song2.isPlaying()) {
+ // Start fading out SONG1 if its playing
+ if (_song1.isPlaying()) {
+ _song1.fadeOut(ramp);
+ }
+ _song2.playSong(song, fadeIn, ramp);
+ }
+}
+
+bool Song::isPlaying() const {
+ return _playing;
+}
+
+SoundType Song::getSong() const {
+ return _song;
+}
+
+void Song::fadeOut(int ramp) {
+ fadeOutRamp = ramp;
+ fadingOut = true;
+ fadeOutVol = g_hdb->_sound->_musicVolume;
+}
+
+void Song::stop() {
+ _playing = false;
+ g_hdb->_mixer->stopHandle(handle);
+}
+
+void Song::playSong(SoundType song, bool fadeIn, int ramp) {
+ this->_song = song;
+ this->_playing = true;
+
+ Common::String fileName = getFileName(song);
+ Audio::AudioStream* musicStream = createStream(fileName);
+
+ int initialVolume;
+
+ if (fadeIn) {
+ fadeInRamp = ramp;
+ fadingIn = true;
+ fadeInVol = 0;
+ initialVolume=0;
+ } else {
+ initialVolume=g_hdb->_sound->_musicVolume;
+ }
+
+ g_hdb->_mixer->playStream(
+ Audio::Mixer::kMusicSoundType,
+ &handle,
+ musicStream,
+ -1,
+ initialVolume,
+ 0,
+ DisposeAfterUse::YES,
+ false,
+ false
+ );
+}
+
+Common::String Song::getFileName(SoundType song) {
+ Common::String fileName(soundList[song].name);
if (g_hdb->getPlatform() == Common::kPlatformLinux) {
- songName.replace(songName.begin() + songName.size() - 4, songName.end(), ".ogg");
+ fileName.replace(fileName.begin() + fileName.size() - 4, fileName.end(), ".ogg");
}
if (g_hdb->isPPC()) {
switch (song) {
case SONG_JEEBIES:
- songName = "jeebies.mp3";
+ fileName = "jeebies.mp3";
break;
case SONG_VIBRACIOUS:
- songName = "vibracious.mp3";
+ fileName = "vibracious.mp3";
break;
case SONG_ARETHERE:
- songName = "are_we_there_yet.mp3";
+ fileName = "are_we_there_yet.mp3";
break;
default:
break;
}
}
- if (!_song1.playing) {
- // Start fading out SONG2 if its playing
- if (_song2.playing) {
- _song2.fadeOutRamp = ramp;
- _song2.fadingOut = true;
- _song2.fadeOutVol = _musicVolume;
- }
-
- // Load up the song
+ return fileName;
+}
- Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(songName);
- if (stream == nullptr)
- return;
+Audio::AudioStream* Song::createStream(Common::String fileName) {
+ Common::SeekableReadStream* stream = SearchMan.createReadStreamForMember(fileName);
+ if (stream == nullptr)
+ return nullptr;
- if (g_hdb->getPlatform() != Common::kPlatformLinux) {
+ if (g_hdb->getPlatform() != Common::kPlatformLinux) {
#ifdef USE_MAD
- Audio::SeekableAudioStream *audioStream = Audio::makeMP3Stream(stream, DisposeAfterUse::YES);
- Audio::AudioStream *loopingStream = new Audio::LoopingAudioStream(audioStream, 0, DisposeAfterUse::YES);
-
- g_hdb->_mixer->setChannelVolume(_song1.handle, _musicVolume);
-
- // do we need to fade-in this song?
- if (fadeIn) {
- _song1.fadeInRamp = ramp;
- _song1.fadingIn = true;
- _song1.fadeInVol = 0;
- g_hdb->_mixer->setChannelVolume(_song1.handle, 0);
- }
-
- g_hdb->_mixer->playStream(
- Audio::Mixer::kMusicSoundType,
- &_song1.handle,
- loopingStream,
- -1,
- Audio::Mixer::kMaxChannelVolume,
- 0,
- DisposeAfterUse::YES,
- false,
- false
- );
- _song1.playing = true;
+ Audio::SeekableAudioStream* audioStream = Audio::makeMP3Stream(stream, DisposeAfterUse::YES);
+ return new Audio::LoopingAudioStream(audioStream, 0, DisposeAfterUse::YES);
#endif
- } else {
+ } else {
#ifdef USE_VORBIS
- Audio::SeekableAudioStream *audioStream = Audio::makeVorbisStream(stream, DisposeAfterUse::YES);
- Audio::AudioStream *loopingStream = new Audio::LoopingAudioStream(audioStream, 0, DisposeAfterUse::YES);
-
- g_hdb->_mixer->setChannelVolume(_song1.handle, _musicVolume);
-
- // do we need to fade-in this song?
- if (fadeIn) {
- _song1.fadeInRamp = ramp;
- _song1.fadingIn = true;
- _song1.fadeInVol = 0;
- g_hdb->_mixer->setChannelVolume(_song1.handle, 0);
- }
-
- g_hdb->_mixer->playStream(
- Audio::Mixer::kMusicSoundType,
- &_song1.handle,
- loopingStream,
- -1,
- Audio::Mixer::kMaxChannelVolume,
- 0,
- DisposeAfterUse::YES,
- false,
- false
- );
- _song1.playing = true;
+ Audio::SeekableAudioStream* audioStream = Audio::makeVorbisStream(stream, DisposeAfterUse::YES);
+ return new Audio::LoopingAudioStream(audioStream, 0, DisposeAfterUse::YES);
#endif
- }
- } else if (!_song2.playing) {
- // Start fading out SONG1 if its playing
- if (_song1.playing) {
- _song1.fadeOutRamp = ramp;
- _song1.fadingOut = true;
- _song1.fadeOutVol = _musicVolume;
- }
-
- // Load up the song
-
- Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(songName);
- if (stream == nullptr)
- return;
+ }
+}
- if (g_hdb->getPlatform() != Common::kPlatformLinux) {
-#ifdef USE_MAD
+void Song::setVolume(int volume) {
+ if (fadingIn)
+ fadeInVol = volume;
+ if (!fadingOut)
+ g_hdb->_mixer->setChannelVolume(handle, volume);
+}
- Audio::SeekableAudioStream *audioStream = Audio::makeMP3Stream(stream, DisposeAfterUse::YES);
- Audio::AudioStream *loopingStream = new Audio::LoopingAudioStream(audioStream, 0, DisposeAfterUse::YES);
-
- g_hdb->_mixer->setChannelVolume(_song2.handle, _musicVolume);
-
- // do we need to fade-in this song?
- if (fadeIn) {
- _song2.fadeInRamp = ramp;
- _song2.fadingIn = true;
- _song2.fadeInVol = 0;
- g_hdb->_mixer->setChannelVolume(_song2.handle, 0);
- }
-
- g_hdb->_mixer->playStream(
- Audio::Mixer::kMusicSoundType,
- &_song2.handle,
- loopingStream,
- -1,
- Audio::Mixer::kMaxChannelVolume,
- 0,
- DisposeAfterUse::YES,
- false,
- false
- );
- _song2.playing = true;
-#endif
- } else {
-#ifdef USE_VORBIS
- Audio::SeekableAudioStream *audioStream = Audio::makeVorbisStream(stream, DisposeAfterUse::YES);
- Audio::AudioStream *loopingStream = new Audio::LoopingAudioStream(audioStream, 0, DisposeAfterUse::YES);
-
- g_hdb->_mixer->setChannelVolume(_song2.handle, _musicVolume);
-
- // do we need to fade-in this song?
- if (fadeIn) {
- _song2.fadeInRamp = ramp;
- _song2.fadingIn = true;
- _song2.fadeInVol = 0;
- g_hdb->_mixer->setChannelVolume(_song2.handle, 0);
- }
-
- g_hdb->_mixer->playStream(
- Audio::Mixer::kMusicSoundType,
- &_song2.handle,
- loopingStream,
- -1,
- Audio::Mixer::kMaxChannelVolume,
- 0,
- DisposeAfterUse::YES,
- false,
- false
- );
- _song2.playing = true;
-#endif
- }
+void Song::update() {
+ if (fadingOut) {
+ fadeOutVol = 0;
+ _playing = false;
+ g_hdb->_mixer->stopHandle(handle);
+ }
+ else if (fadingIn) {
+ fadeInVol = g_hdb->_sound->_musicVolume;
+ fadingIn = false;
}
}
void Sound::updateMusic() {
-
- if (_song1.playing) {
- if (_song1.fadingOut) {
- _song1.fadeOutVol = 0;
- _song1.playing = false;
- g_hdb->_mixer->stopHandle(_song1.handle);
- } else if (_song1.fadingIn) {
- _song1.fadeInVol = _musicVolume;
- _song1.fadingIn = false;
- }
+ if (_song1.isPlaying()) {
+ _song1.update();
}
- if (_song2.playing) {
- if (_song2.fadingOut) {
- _song2.fadeOutVol = 0;
- _song2.playing = false;
- g_hdb->_mixer->stopHandle(_song2.handle);
- } else if (_song2.fadingIn) {
- _song2.fadeInVol = _musicVolume;
- _song2.fadingIn = false;
- }
+ if (_song2.isPlaying()) {
+ _song2.update();
}
+}
+SoundType Sound::whatSongIsPlaying() {
+ if (_song1.isPlaying())
+ return _song1.getSong();
+
+ if (_song2.isPlaying())
+ return _song2.getSong();
+
+ return SONG_NONE;
}
int Sound::registerSound(const char *name) {
@@ -1995,16 +1938,6 @@ int Sound::getSNDIndex(const char *name) {
return 0;
}
-SoundType Sound::whatSongIsPlaying() {
- if (_song1.playing)
- return _song1.song;
-
- if (_song2.playing)
- return _song2.song;
-
- return SONG_NONE;
-}
-
void Sound::markSoundCacheFreeable() {
for (int i = 0; i < kMaxSounds; i++) {
if (_soundCache[i].loaded == SNDMEM_LOADED)
diff --git a/engines/hdb/sound.h b/engines/hdb/sound.h
index 8cf687d3d6..accdbff8fd 100644
--- a/engines/hdb/sound.h
+++ b/engines/hdb/sound.h
@@ -1457,10 +1457,31 @@ struct SoundCache {
};
struct Song {
- bool playing;
- SoundType song;
+
+ Song() : _playing(false), _song(SONG_NONE),
+ fadingOut(false), fadeOutVol(0), fadeOutRamp(0),
+ fadingIn(false), fadeInVol(0), fadeInRamp(0) {}
+
+ void playSong(SoundType song, bool fadeIn, int ramp);
+ void fadeOut(int ramp);
+ void stop();
+
+ bool isPlaying() const;
+ SoundType getSong() const;
+
+ void setVolume(int volume);
+
+ void update();
+
+private:
+ static Common::String Song::getFileName(SoundType song);
+ Audio::AudioStream* Song::createStream(Common::String fileName);
+
Audio::SoundHandle handle;
+ bool _playing;
+ SoundType _song;
+
bool fadingOut;
int fadeOutVol;
int fadeOutRamp;
@@ -1468,10 +1489,6 @@ struct Song {
bool fadingIn;
int fadeInVol;
int fadeInRamp;
-
- Song() : playing(false), song(SONG_NONE),
- fadingOut(false), fadeOutVol(0), fadeOutRamp(0),
- fadingIn(false), fadeInVol(0), fadeInRamp(0) {}
};
class Sound {