diff options
| author | Matthew Stewart | 2018-05-09 16:26:08 -0400 | 
|---|---|---|
| committer | Eugene Sandulenko | 2018-08-09 08:37:30 +0200 | 
| commit | aac4b2e99d4cfa64dfb25bae85012235702ab6fe (patch) | |
| tree | 76cbe6732431fd6cdc31e5ab40f78a2cae4cfd12 | |
| parent | e578aa131f8648355069875b58f1e4fd0044e701 (diff) | |
| download | scummvm-rg350-aac4b2e99d4cfa64dfb25bae85012235702ab6fe.tar.gz scummvm-rg350-aac4b2e99d4cfa64dfb25bae85012235702ab6fe.tar.bz2 scummvm-rg350-aac4b2e99d4cfa64dfb25bae85012235702ab6fe.zip | |
STARTREK: Music/SFX enable and disable functions
| -rw-r--r-- | engines/startrek/graphics.h | 2 | ||||
| -rw-r--r-- | engines/startrek/sound.cpp | 107 | ||||
| -rw-r--r-- | engines/startrek/sound.h | 20 | ||||
| -rw-r--r-- | engines/startrek/startrek.cpp | 26 | ||||
| -rw-r--r-- | engines/startrek/startrek.h | 4 | ||||
| -rw-r--r-- | engines/startrek/text.cpp | 24 | 
6 files changed, 123 insertions, 60 deletions
| diff --git a/engines/startrek/graphics.h b/engines/startrek/graphics.h index b3c84930a7..efcf27d9f7 100644 --- a/engines/startrek/graphics.h +++ b/engines/startrek/graphics.h @@ -147,8 +147,6 @@ public:  	void showOptionsMenu(int x, int y);  	void showSaveMenu();  	void showLoadMenu(); -	void setMusicEnabled(bool enabled); -	void setSfxEnabled(bool enabled);  	void showQuitGamePrompt(int x, int y);  	void showTextConfigurationMenu(bool fromOptionMenu); diff --git a/engines/startrek/sound.cpp b/engines/startrek/sound.cpp index ac23cf620e..2871a88613 100644 --- a/engines/startrek/sound.cpp +++ b/engines/startrek/sound.cpp @@ -17,6 +17,7 @@   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + *   */  #include "startrek/sound.h" @@ -59,7 +60,7 @@ Sound::Sound(StarTrekEngine *vm) : _vm(vm) {  	loadedSoundData = nullptr;  	for (int i=1; i<8; i++) { -		_sfxSlotList.push_back(&_midiSlots[i]); +		_midiSlotList.push_back(&_midiSlots[i]);  	}  	if (!SearchMan.hasFile("voc/speech.mrk")) { @@ -78,37 +79,50 @@ Sound::~Sound() {  } +/** + * Plays a midi track as a sound effect (one of midi slots 1-7) + */  void Sound::playMidiTrack(int track) {  	if (!_vm->_musicEnabled || !_vm->_musicWorking)  		return; -	assert(loadedSoundData != NULL); - -	debugC(6, kDebugSound, "Playing MIDI track %d", track); +	assert(loadedSoundData != nullptr);  	// Check if a midi slot for this track exists already  	for (int i=1; i<8; i++) {  		if (_midiSlots[i].track == track) { +			debugC(6, kDebugSound, "Playing MIDI track %d (slot %d)", track, i);  			_midiSlots[i].midiParser->loadMusic(loadedSoundData, sizeof(loadedSoundData));  			_midiSlots[i].midiParser->setTrack(track);  			// Shift this to the back (most recently used) -			_sfxSlotList.remove(&_midiSlots[i]); -			_sfxSlotList.push_back(&_midiSlots[i]); +			_midiSlotList.remove(&_midiSlots[i]); +			_midiSlotList.push_back(&_midiSlots[i]);  			return;  		}  	}  	// Take the least recently used slot and use that for the sound effect -	MidiPlaybackSlot *slot = _sfxSlotList.front(); -	_sfxSlotList.pop_front(); -	_sfxSlotList.push_back(slot); -	slot->track = track; -	slot->midiParser->loadMusic(loadedSoundData, sizeof(loadedSoundData)); -	slot->midiParser->setTrack(track); +	MidiPlaybackSlot *slot = _midiSlotList.front(); +	_midiSlotList.pop_front(); +	_midiSlotList.push_back(slot); +	playMidiTrackInSlot(slot->slot, track);  } -void Sound::loadMusicFile(const char *baseSoundName) { +void Sound::playMidiTrackInSlot(int slot, int track) { +	assert(loadedSoundData != nullptr); +	debugC(6, kDebugSound, "Playing MIDI track %d (slot %d)", track, slot); + +	clearMidiSlot(slot); + +	if (track != -1) { +		_midiSlots[slot].track = track; +		_midiSlots[slot].midiParser->loadMusic(loadedSoundData, sizeof(loadedSoundData)); +		_midiSlots[slot].midiParser->setTrack(track); +	} +} + +void Sound::loadMusicFile(const Common::String &baseSoundName) {  	clearAllMidiSlots();  	/*  	if (_vm->getPlatform() == Common::kPlatformAmiga) @@ -122,7 +136,20 @@ void Sound::loadMusicFile(const char *baseSoundName) {  	loadPCMusicFile(baseSoundName);  } -void Sound::playSoundEffect(const char *baseSoundName) { +void Sound::playMidiMusicTracks(int startTrack, int loopTrack) { +	if (!_vm->_musicWorking || !_vm->_musicEnabled) +		return; + +	if (loopTrack == -3) +		_loopingMidiTrack = startTrack; +	else if (loopTrack != -2) +		_loopingMidiTrack = loopTrack; + +	if (startTrack != -2 && _vm->_musicEnabled) +		playMidiTrackInSlot(0, startTrack); +} + +void Sound::playVoc(const Common::String &baseSoundName) {  	/*  	if (_vm->getPlatform() == Common::kPlatformAmiga)  		playAmigaSoundEffect(baseSoundName); @@ -130,13 +157,14 @@ void Sound::playSoundEffect(const char *baseSoundName) {  		playMacSoundEffect(baseSoundName);  	else  	*/ -	if (scumm_stricmp(baseSoundName+4, "loop") == 0) -		_loopingAudioName = Common::String(baseSoundName); +	if (baseSoundName.size() == 8 && baseSoundName.hasSuffixIgnoreCase("loop")) +		_loopingAudioName = baseSoundName;  	if (!_vm->_sfxEnabled || !_vm->_sfxWorking)  		return;  	/* +	// This is probably just driver initialization stuff...  	if (word_5113a == 0)  		sub_2aaa3();  	*/ @@ -156,7 +184,7 @@ void Sound::playSoundEffect(const char *baseSoundName) {  		return;  	} -	debugC(3, kDebugSound, "No sound slot to play '%s'", baseSoundName); +	debugC(3, kDebugSound, "No sound slot to play '%s'", baseSoundName.c_str());  }  void Sound::playSpeech(const Common::String &basename) { @@ -196,6 +224,17 @@ void Sound::playSpeech(const Common::String &basename) {  	_playingSpeech = true;  } +/** + * Called when disabling sfx. + */ +void Sound::stopAllVocSounds() { +	stopPlayingSpeech(); + +	for (int i = 0; i < MAX_SFX_PLAYING; i++) { +		_vm->_system->getMixer()->stopHandle(_sfxHandles[i]); +	} +} +  void Sound::stopPlayingSpeech() {  	if (_playingSpeech) {  		debugC(5, kDebugSound, "Canceled speech playback"); @@ -205,8 +244,40 @@ void Sound::stopPlayingSpeech() {  } +void Sound::setMusicEnabled(bool enable) { +	if (!_vm->_musicWorking || _vm->_musicEnabled == enable) +		return; + +	_vm->_musicEnabled = enable; + +	if (enable) +		playMidiMusicTracks(_loopingMidiTrack, _loopingMidiTrack); +	else +		clearMidiSlot(0); +} + +void Sound::setSfxEnabled(bool enable) { +	if (!_vm->_sfxWorking || _vm->_sfxEnabled == enable) +		return; + +	_vm->_sfxEnabled = enable; + +	if (!enable) { +		for (int i = 1; i < 8; i++) +			clearMidiSlot(i); +	} + +	if (!enable) { +		stopAllVocSounds(); +	} +	else if (!_loopingAudioName.empty()) { +		playVoc(_loopingAudioName); +	} +} + +  // XMIDI or SM sound -void Sound::loadPCMusicFile(const char *baseSoundName) { +void Sound::loadPCMusicFile(const Common::String &baseSoundName) {  	Common::String soundName = baseSoundName;  	soundName += '.'; diff --git a/engines/startrek/sound.h b/engines/startrek/sound.h index a9116627d5..2caa1d0010 100644 --- a/engines/startrek/sound.h +++ b/engines/startrek/sound.h @@ -18,9 +18,6 @@   * along with this program; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.   * - * $URL: https://scummvm-startrek.googlecode.com/svn/trunk/sound.h $ - * $Id: sound.h 15 2010-06-27 06:13:42Z clone2727 $ - *   */  #ifndef STARTREK_SOUND_H @@ -41,7 +38,7 @@ namespace StarTrek {  class StarTrekEngine; -const int MAX_LOADED_SFX_FILES = 8; +// Max # of VOC files that can play at once  const int MAX_SFX_PLAYING = 4;  struct MidiPlaybackSlot { @@ -57,24 +54,29 @@ public:  	~Sound();  	void playMidiTrack(int track); - -	void loadMusicFile(const char *baseSoundName); -	void playSoundEffect(const char *baseSoundName); +	void playMidiTrackInSlot(int slot, int track); +	void loadMusicFile(const Common::String &baseSoundName); +	void playMidiMusicTracks(int startTrack, int loopTrack); +	void playVoc(const Common::String &baseSoundName);  	void playSpeech(const Common::String &basename); +	void stopAllVocSounds();  	void stopPlayingSpeech(); +	void setMusicEnabled(bool enable); +	void setSfxEnabled(bool enable);  private:  	StarTrekEngine *_vm;  	Audio::SoundHandle *_soundHandle; -	void loadPCMusicFile(const char *baseSoundName); +	void loadPCMusicFile(const Common::String &baseSoundName);  	void clearMidiSlot(int slot);  	void clearAllMidiSlots();  	// MIDI-Related Variables  	MidiDriver *_midiDriver;  	MidiPlaybackSlot _midiSlots[8]; // 0 is for music; 1-7 are for sfx -	Common::List<MidiPlaybackSlot*> _sfxSlotList; // Sorts midi slots by most recently used +	Common::List<MidiPlaybackSlot*> _midiSlotList; // Sorts midi slots by most recently used +	int _loopingMidiTrack;  	byte *loadedSoundData;  	uint32 _midiDevice;	 diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp index 82df4beac1..40fa8d76da 100644 --- a/engines/startrek/startrek.cpp +++ b/engines/startrek/startrek.cpp @@ -81,7 +81,7 @@ Common::Error StarTrekEngine::run() {  		assert(_macResFork->hasDataFork() && _macResFork->hasResFork());  	} -	initGraphics(320, 200); +	initGraphics(SCREEN_WIDTH, SCREEN_HEIGHT);  	initializeEventsAndMouse(); @@ -199,49 +199,49 @@ void StarTrekEngine::pollSystemEvents() {  void StarTrekEngine::playSoundEffectIndex(int index) {  	switch(index) {  	case 0x04: -		_sound->playSoundEffect("tricorde"); +		_sound->playVoc("tricorde");  		break;  	case 0x05: -		_sound->playSoundEffect("STDOOR1"); +		_sound->playVoc("STDOOR1");  		break;  	case 0x06: -		_sound->playSoundEffect("PHASSHOT"); +		_sound->playVoc("PHASSHOT");  		break;  	case 0x07:  		_sound->playMidiTrack(index);  		break;  	case 0x08: -		_sound->playSoundEffect("TRANSDEM"); +		_sound->playVoc("TRANSDEM");  		break;  	case 0x09: -		_sound->playSoundEffect("TRANSMAT"); +		_sound->playVoc("TRANSMAT");  		break;  	case 0x0a: -		_sound->playSoundEffect("TRANSENE"); +		_sound->playVoc("TRANSENE");  		break;  	case 0x10: // Menu selection sound  		_sound->playMidiTrack(index);  		break;  	case 0x22: -		_sound->playSoundEffect("HAILING"); +		_sound->playVoc("HAILING");  		break;  	case 0x24: -		_sound->playSoundEffect("PHASSHOT"); +		_sound->playVoc("PHASSHOT");  		break;  	case 0x25: -		_sound->playSoundEffect("PHOTSHOT"); +		_sound->playVoc("PHOTSHOT");  		break;  	case 0x26: -		_sound->playSoundEffect("HITSHIEL"); +		_sound->playVoc("HITSHIEL");  		break;  	case 0x27:  		_sound->playMidiTrack(index);  		break;  	case 0x28: -		_sound->playSoundEffect("REDALERT"); +		_sound->playVoc("REDALERT");  		break;  	case 0x29: -		_sound->playSoundEffect("WARP"); +		_sound->playVoc("WARP");  		break;  	default:  	    break; diff --git a/engines/startrek/startrek.h b/engines/startrek/startrek.h index 0453c6af7c..5e81f77a26 100644 --- a/engines/startrek/startrek.h +++ b/engines/startrek/startrek.h @@ -164,11 +164,11 @@ public:  	bool _inQuitGameMenu; -private:  	Graphics *_gfx;  	Sound *_sound; -	Common::MacResManager *_macResFork; +private: +	Common::MacResManager *_macResFork;  	Room *_room;  }; diff --git a/engines/startrek/text.cpp b/engines/startrek/text.cpp index e9c22d4f4c..9f1285b4d6 100644 --- a/engines/startrek/text.cpp +++ b/engines/startrek/text.cpp @@ -816,7 +816,7 @@ void Graphics::loadMenuButtons(String mnuFilename, int xpos, int ypos) {  	SharedPtr<FileStream> stream = _vm->openFile(mnuFilename + ".MNU");  	_activeMenu->menuFile = stream; -	_activeMenu->numButtons = _activeMenu->menuFile->size()/16; +	_activeMenu->numButtons = _activeMenu->menuFile->size() / 16;  	for (int i = 0; i < _activeMenu->numButtons; i++) {  		memset(&_activeMenu->sprites[i], 0, sizeof(Sprite)); @@ -824,9 +824,9 @@ void Graphics::loadMenuButtons(String mnuFilename, int xpos, int ypos) {  		_activeMenu->sprites[i].drawMode = 2;  		char bitmapBasename[11]; -		stream->seek(i*16, SEEK_SET); +		stream->seek(i * 16, SEEK_SET);  		stream->read(bitmapBasename, 10); -		for (int j=0; j<10; j++) { +		for (int j = 0; j < 10; j++) {  			if (bitmapBasename[j] == ' ')  				bitmapBasename[j] = '\0';  		} @@ -840,7 +840,7 @@ void Graphics::loadMenuButtons(String mnuFilename, int xpos, int ypos) {  		_activeMenu->sprites[i].field6 = 8;  	} -	if (_activeMenu->retvals[_activeMenu->numButtons-1] == 0) { +	if (_activeMenu->retvals[_activeMenu->numButtons - 1] == 0) {  		// Set default retvals for buttons  		for (int i = 0; i < _activeMenu->numButtons; i++)  			_activeMenu->retvals[i] = i; @@ -1065,16 +1065,16 @@ void Graphics::showOptionsMenu(int x, int y) {  		showLoadMenu();  		break;  	case 2: // Enable music -		setMusicEnabled(true); +		_vm->_sound->setMusicEnabled(true);  		break;  	case 3: // Disable music -		setMusicEnabled(false); +		_vm->_sound->setMusicEnabled(false);  		break;  	case 4: // Enable sfx -		setSfxEnabled(true); +		_vm->_sound->setSfxEnabled(true);  		break;  	case 5: // Disable sfx -		setSfxEnabled(false); +		_vm->_sound->setSfxEnabled(false);  		break;  	case 6: // Quit  		showQuitGamePrompt(20, 20); @@ -1095,14 +1095,6 @@ void Graphics::showLoadMenu() {  	// TODO  } -void Graphics::setMusicEnabled(bool enabled) { -	// TODO -} - -void Graphics::setSfxEnabled(bool enabled) { -	// TODO -} -  void Graphics::showQuitGamePrompt(int x, int y) {  	const char *options[] = {  		"Quit Game", | 
