diff options
31 files changed, 3391 insertions, 509 deletions
| diff --git a/engines/tsage/converse.cpp b/engines/tsage/converse.cpp index 5fa36142e7..b475310533 100644 --- a/engines/tsage/converse.cpp +++ b/engines/tsage/converse.cpp @@ -231,7 +231,7 @@ void SequenceManager::signal() {  		case 26:  			v1 = getNextValue();  			v2 = getNextValue(); -			_soundHandler.startSound(v1, v2 ? this : NULL, 127); +			_soundHandler.play(v1, v2 ? this : NULL, 127);  			break;  		case 27: {  			v1 = getNextValue(); diff --git a/engines/tsage/converse.h b/engines/tsage/converse.h index 6876fa41cb..13c490e995 100644 --- a/engines/tsage/converse.h +++ b/engines/tsage/converse.h @@ -25,6 +25,7 @@  #include "tsage/core.h"  #include "tsage/dialogs.h" +#include "tsage/sound.h"  namespace tSage { @@ -50,7 +51,7 @@ public:  	int _objectIndex;  	SceneObject *_sceneObject;  	SceneObject *_objectList[6]; -	SoundHandler _soundHandler; +	ASound _soundHandler;  public:  	SequenceManager(); diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index ed2b03ebc4..4603379c78 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -31,6 +31,7 @@  #include "tsage/scenes.h"  #include "tsage/staticres.h"  #include "tsage/globals.h" +#include "tsage/sound.h"  namespace tSage { @@ -2961,55 +2962,6 @@ int SceneRegions::indexOf(const Common::Point &pt) {  /*--------------------------------------------------------------------------*/ -SoundHandler::SoundHandler() { -	_action = NULL; -	_field280 = -1; -	if (_globals) -		_globals->_sceneListeners.push_back(this); -} - -SoundHandler::~SoundHandler() { -	if (_globals) -		_globals->_sceneListeners.remove(this); -} - -void SoundHandler::dispatch() { -	EventHandler::dispatch(); -	int v = _sound.proc12(); - -	if (v != -1) { -		_field280 = v; -		_sound.proc2(-1); - -		if (_action) -			_action->signal(); -	} - -	if (_field280 != -1) { -		// FIXME: Hardcoded to only flag a sound ended if an action has been set -		if (_action) { -//		if (!_sound.proc3()) { -			_field280 = -1; -			if (_action) { -				_action->signal(); -				_action = NULL; -			} -		} -	} -} - -void SoundHandler::startSound(int soundNum, Action *action, int volume) { -	_action = action; -	_field280 = 0; -	setVolume(volume); -	_sound.startSound(soundNum); - -	warning("TODO: SoundHandler::startSound"); -} - - -/*--------------------------------------------------------------------------*/ -  void SceneItemList::addItems(SceneItem *first, ...) {  	va_list va;  	va_start(va, first); @@ -3490,8 +3442,9 @@ void SceneHandler::postInit(SceneObjectList *OwnerList) {  	_globals->_scenePalette.loadPalette(0);  	_globals->_scenePalette.refresh(); -	// TODO: Bunch of other scene related setup goes here  	_globals->_soundManager.postInit(); +	_globals->_soundManager.buildDriverList(true); +	_globals->_soundManager.installConfigDrivers();  	_globals->_game->start();  } diff --git a/engines/tsage/core.h b/engines/tsage/core.h index 92907addbc..b86e2f63fe 100644 --- a/engines/tsage/core.h +++ b/engines/tsage/core.h @@ -33,7 +33,6 @@  #include "tsage/graphics.h"  #include "tsage/resources.h"  #include "tsage/saveload.h" -#include "tsage/sound.h"  namespace tSage { @@ -719,74 +718,6 @@ public:  /*--------------------------------------------------------------------------*/ -class GameSoundHandler { -public: -	void proc1() { -		warning("TODO: GameSoundHandler::proc1"); -	} -	void proc5(int v) { -		warning("TODO: GameSoundHandler::proc5"); -	} -	void proc11(int v1, int v2, int v3, int v4) { -		warning("TODO: GameSoundHandler::proc11"); -	} -	int proc12() { -		// TODO -		return -1; -	} -	void proc2(int v) { -		// TODO -	} -	int proc3() { -		return 0; -	} -	void setVolume(int volume) { -		warning("TODO GameSoundHandler::setVolume"); -	} -	void startSound(int soundNum) { -		warning("TODO GameSoundHandler::startSound"); -	} -}; - -class SoundHandler : public EventHandler { -public: -	GameSoundHandler _sound; -	Action *_action; -	int _field280; -public: -	SoundHandler(); -	~SoundHandler(); - -	void startSound(int soundNum, Action *action = NULL, int volume = 127); -	void proc1(Action *action) { -		proc11(0, 5, 10, 1, action); -	} -	void proc2(int v) { -		warning("TODO: SoundHandler::proc2"); -	} -	void proc3() { -		warning("TODO: SoundHandler::proc5"); -	} -	void proc4() { -		_sound.proc1(); -	} -	void proc5(int v) { -		_sound.proc5(v); -	} -	void proc11(int v1, int v2, int v3, int v4, Action *action) { -		if (action) -			_action = action; - -		_sound.proc11(v1, v2, v3, v4); -	} -	void setVolume(int volume) { _sound.setVolume(volume); } - -	virtual Common::String getClassName() { return "SoundHandler"; } -	virtual void dispatch(); -}; - -/*--------------------------------------------------------------------------*/ -  class SceneItemList : public SynchronizedList<SceneItem *> {  public:  	void addItems(SceneItem *first, ...); diff --git a/engines/tsage/events.cpp b/engines/tsage/events.cpp index 9df2a7ccd6..50077fecaf 100644 --- a/engines/tsage/events.cpp +++ b/engines/tsage/events.cpp @@ -48,7 +48,9 @@ bool EventsClass::pollEvent() {  		_priorFrameTime = milli;  		++_frameNumber; +		// Update screen and allow the sound manager to process pending sounds  		g_system->updateScreen(); +		SoundManager::_sfSoundServer();  	}  	if (!g_system->getEventManager()->pollEvent(_event)) return false; @@ -297,6 +299,9 @@ void EventsClass::delay(int numFrames) {  		++_frameNumber;  		_priorFrameTime = g_system->getMillis(); + +		// Allow pending sounds to be processed +		SoundManager::_sfSoundServer();  	}  	g_system->updateScreen(); diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index 863f1458b1..b0f6db53c6 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -117,9 +117,9 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface  }  Globals::~Globals() { -	_globals = NULL;  	delete _inventory;  	delete _game; +	_globals = NULL;  }  void Globals::reset() { diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h index 8212387ed1..3635fcc3fa 100644 --- a/engines/tsage/globals.h +++ b/engines/tsage/globals.h @@ -28,6 +28,7 @@  #include "tsage/dialogs.h"  #include "tsage/scenes.h"  #include "tsage/events.h" +#include "tsage/sound.h"  #include "tsage/saveload.h"  namespace tSage { @@ -58,7 +59,7 @@ public:  	SynchronizedList<EventHandler *> _sceneListeners;  	bool _flags[256];  	Player _player; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	InvObjectList *_inventory;  	Region _paneRegions[2];  	int _paneRefreshFlag[2]; diff --git a/engines/tsage/resources.cpp b/engines/tsage/resources.cpp index 676d319ba9..d24c564a1f 100644 --- a/engines/tsage/resources.cpp +++ b/engines/tsage/resources.cpp @@ -66,7 +66,9 @@ uint16 MemoryManager::allocate(uint32 size) {  byte *MemoryManager::allocate2(uint32 size) {  	uint32 idx = allocate(size); -	return lock(idx); +	byte *result = lock(idx); +	Common::set_to(result, result + size, 0); +	return result;  }  byte *MemoryManager::lock(uint32 handle) { diff --git a/engines/tsage/ringworld_demo.cpp b/engines/tsage/ringworld_demo.cpp index de8dbf8c12..4f905d5bec 100644 --- a/engines/tsage/ringworld_demo.cpp +++ b/engines/tsage/ringworld_demo.cpp @@ -101,7 +101,7 @@ void RingworldDemoScene::postInit(SceneObjectList *OwnerList) {  }  void RingworldDemoScene::signal() { -	_soundHandler.startSound(4); +	_soundHandler.play(4);  	_actor1.postInit();  	_actor2.postInit();  	_actor3.postInit(); diff --git a/engines/tsage/ringworld_demo.h b/engines/tsage/ringworld_demo.h index 7492c1e871..3e7431e107 100644 --- a/engines/tsage/ringworld_demo.h +++ b/engines/tsage/ringworld_demo.h @@ -28,6 +28,7 @@  #include "tsage/core.h"  #include "tsage/scenes.h"  #include "tsage/globals.h" +#include "tsage/sound.h"  namespace tSage { @@ -46,7 +47,7 @@ public:  	SequenceManager _sequenceManager;  	SceneObject _actor1, _actor2, _actor3;  	SceneObject _actor4, _actor5, _actor6; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	virtual void postInit(SceneObjectList *OwnerList = NULL);  	virtual void process(Event &event); diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld_logic.cpp index 95c9da9fe7..4c60e5fea9 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld_logic.cpp @@ -1346,7 +1346,7 @@ void RingworldGame::start() {  void RingworldGame::restart() {  	_globals->_scenePalette.clearListeners(); -	_globals->_soundHandler.proc3(); +	_globals->_soundHandler.stop();  	// Reset the flags  	_globals->reset(); diff --git a/engines/tsage/ringworld_scenes1.cpp b/engines/tsage/ringworld_scenes1.cpp index 6960788db3..9f8aedbfc1 100644 --- a/engines/tsage/ringworld_scenes1.cpp +++ b/engines/tsage/ringworld_scenes1.cpp @@ -98,7 +98,7 @@ void Scene10::Action1::signal() {  		scene->_object4.animate(ANIM_MODE_6, this);  		break;  	case 10: -		_globals->_soundHandler.proc1(this); +		_globals->_soundHandler.fadeOut(this);  		break;  	case 11:  		_globals->_scenePalette.clearListeners(); @@ -185,7 +185,7 @@ void Scene10::postInit(SceneObjectList *OwnerList) {  	_globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;  	setAction(&_action1); -	_globals->_soundHandler.startSound(5); +	_globals->_soundHandler.play(5);  }  void Scene10::stripCallback(int v) { @@ -232,7 +232,7 @@ void Scene15::Action1::signal() {  		Common::Point pt(160, 100);  		NpcMover *mover = new NpcMover();  		scene->_object1.addMover(mover, &pt, this); -		scene->_soundHandler.startSound(7); +		scene->_soundHandler.play(7);  		break;  	}  	case 3: @@ -256,7 +256,7 @@ void Scene15::postInit(SceneObjectList *OwnerList) {  	loadScene(15);  	Scene::postInit();  	setZoomPercents(0, 100, 200, 100); -	_globals->_soundHandler.startSound(6); +	_globals->_soundHandler.play(6);  	setAction(&_action1);  } @@ -276,7 +276,7 @@ void Scene20::Action1::signal() {  		scene->_stripManager.start(20, this);  		break;  	case 2: -		_globals->_soundHandler.proc1(this); +		_globals->_soundHandler.fadeOut(this);  		break;  	case 3:  		_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; @@ -341,8 +341,8 @@ void Scene20::Action2::signal() {  		break;  	}  	case 8: -		scene->_sound.proc4(); -		scene->_sound.proc1(this); +		scene->_sound.release(); +		scene->_sound.fadeOut(this);  		break;  	case 9:  		SceneItem::display(0, 0, LIST_END); @@ -400,8 +400,8 @@ void Scene20::Action3::signal() {  		break;  	}  	case 6: -		scene->_sound.startSound(60, this, 127); -		_globals->_soundHandler.proc4(); +		scene->_sound.play(60, this, 127); +		_globals->_soundHandler.release();  		break;  	case 7:  		_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; @@ -450,7 +450,7 @@ void Scene20::Action4::signal() {  		break;  	}  	case 4: { -		scene->_sound.startSound(28); +		scene->_sound.play(28);  		scene->_sceneObject4.postInit();  		scene->_sceneObject4.setVisage(21);  		scene->_sceneObject4.setStrip(3); @@ -463,7 +463,7 @@ void Scene20::Action4::signal() {  		break;  	}  	case 5: { -		scene->_sound.startSound(42); +		scene->_sound.play(42);  		scene->_sceneObject4.remove();  		scene->_SceneObjectExt.setVisage(21);  		scene->_SceneObjectExt.setStrip(1); @@ -487,7 +487,7 @@ void Scene20::Action4::signal() {  		break;  	}  	case 6: { -		scene->_sound.startSound(42); +		scene->_sound.play(42);  		scene->_SceneObjectExt.setStrip(2);  		scene->_SceneObjectExt.animate(ANIM_MODE_2, NULL); @@ -506,7 +506,7 @@ void Scene20::Action4::signal() {  	case 7:  		_globals->_player.setStrip(2);  		_globals->_player.animate(ANIM_MODE_2, NULL); -		scene->_sound.startSound(77, this, 127); +		scene->_sound.play(77, this, 127);  		break;  	case 8:  		_globals->_game->endGame(20, 0); @@ -549,15 +549,15 @@ void Scene20::postInit(SceneObjectList *OwnerList) {  		_SceneObjectExt._moveDiff = Common::Point(10, 10);  		_sceneObject3._moveDiff = Common::Point(10, 10); -		_globals->_soundHandler.startSound(20); -		_sound.startSound(21); -		_sound.proc5(1); +		_globals->_soundHandler.play(20); +		_sound.play(21); +		_sound.holdAt(true);  		setAction(&_action2);  		_sceneBounds = Rect(320, 0, 640, 200);  	} else if (_globals->_sceneManager._previousScene == 60) {  		// Evasion -		_sound.startSound(30); +		_sound.play(30);  		_globals->_player.postInit();  		_globals->_player.setVisage(20);  		_globals->_player.setPosition(Common::Point(588, 79)); @@ -605,7 +605,7 @@ void Scene20::postInit(SceneObjectList *OwnerList) {  		_speakerGameText.setTextPos(Common::Point(350, 20));  		_speakerGameText._textWidth = 260; -		_globals->_soundHandler.startSound(8); +		_globals->_soundHandler.play(8);  		_sceneBounds = Rect(320, 0, 640, 200);  	} @@ -669,7 +669,7 @@ void Scene30::BeamAction::signal() {  	case 2:  		// Hide the beam and lower the player's hand -		scene->_sound.startSound(10, NULL, 127); +		scene->_sound.play(10, NULL, 127);  		_globals->_player.animate(ANIM_MODE_6, this);  		scene->_beam.remove();  		break; @@ -693,14 +693,14 @@ void Scene30::BeamAction::signal() {  	case 4:  		// Open the door -		scene->_sound.startSound(11, NULL, 127); +		scene->_sound.play(11, NULL, 127);  		scene->_door.animate(ANIM_MODE_5, this);  		break;  	case 5:  		// Run the Kzin's talk sequence -		scene->_sound.startSound(13, NULL, 127); -		_globals->_soundHandler.startSound(12, NULL, 127); +		scene->_sound.play(13, NULL, 127); +		_globals->_soundHandler.play(12, NULL, 127);  		scene->_stripManager.start((scene->_sceneMode == 0) ? 30 : 37, this);  		break; @@ -732,7 +732,7 @@ void Scene30::KzinAction::signal() {  		setDelay(1200);  		break;  	case 1: -		_globals->_soundHandler.proc2(0); +		_globals->_soundHandler.fadeOut(NULL);  		_globals->_player.disableControl();  		setAction(&scene->_sequenceManager, _globals->_sceneManager._scene, 31, &scene->_kzin, &scene->_door, NULL);  		break; @@ -772,12 +772,12 @@ void Scene30::RingAction::signal() {  	}  	case 3: -		scene->_sound.startSound(11, NULL, 127); +		scene->_sound.play(11, NULL, 127);  		scene->_door.animate(ANIM_MODE_6, this);  		break;  	case 4: { -		scene->_sound.startSound(13, NULL, 127); +		scene->_sound.play(13, NULL, 127);  		NpcMover *kzinMover = new NpcMover();  		Common::Point pt(354, 5);  		scene->_kzin.addMover(kzinMover, &pt, this); @@ -955,7 +955,7 @@ void Scene40::Action1::signal() {  		scene->_doorway.setVisage(46);  		scene->_doorway.setPosition(Common::Point(305, 61));  		scene->_doorway.animate(ANIM_MODE_5, this); -		scene->_soundHandler.startSound(25); +		scene->_soundHandler.play(25);  		break;  	case 3:  		scene->_doorway.hide(); @@ -976,7 +976,7 @@ void Scene40::Action1::signal() {  		scene->_assassin.setFrame(1);  		scene->_assassin.setPosition(Common::Point(13, 171));  		scene->_assassin.animate(ANIM_MODE_5, this); -		scene->_soundHandler.startSound(25); +		scene->_soundHandler.play(25);  		break;  	case 5:  		scene->_doorway.show(); @@ -1011,7 +1011,7 @@ void Scene40::Action1::signal() {  		break;  	}  	case 10: { -		scene->_soundHandler.startSound(27); +		scene->_soundHandler.play(27);  		Common::Point pt(223, 184);  		NpcMover *mover = new NpcMover();  		scene->_dyingKzin.addMover(mover, &pt, this); @@ -1024,7 +1024,7 @@ void Scene40::Action1::signal() {  		break;  	}  	case 12: { -		_globals->_soundHandler.startSound(26); +		_globals->_soundHandler.play(26);  		_globals->_player._uiEnabled = true;  		scene->_assassin.setVisage(42);  		scene->_assassin.setPosition(Common::Point(4, 191)); @@ -1043,7 +1043,7 @@ void Scene40::Action1::signal() {  		scene->_assassin.setStrip(1);  		scene->_assassin.setFrame(1);  		scene->_assassin.animate(ANIM_MODE_5, this); -		scene->_soundHandler.startSound(28); +		scene->_soundHandler.play(28);  		break;  	case 15:  		_globals->_player.disableControl(); @@ -1057,7 +1057,7 @@ void Scene40::Action1::signal() {  		_globals->_player.animate(ANIM_MODE_5, this);  		break;  	case 16: -		_globals->_soundHandler.startSound(77, this); +		_globals->_soundHandler.play(77, this);  		break;  	case 17:  		_globals->_game->endGame(40, 20); @@ -1083,7 +1083,7 @@ void Scene40::Action2::signal() {  		_globals->_player.animate(ANIM_MODE_5, this);  		break;  	case 2: { -		scene->_soundHandler.startSound(28); +		scene->_soundHandler.play(28);  		scene->_doorway.postInit();  		scene->_doorway.setVisage(16);  		scene->_doorway.setStrip2(6); @@ -1103,7 +1103,7 @@ void Scene40::Action2::signal() {  		scene->_assassin.setVisage(44);  		scene->_assassin._frame = 1;  		scene->_assassin.animate(ANIM_MODE_5, this); -		scene->_soundHandler.startSound(29); +		scene->_soundHandler.play(29);  		RING_INVENTORY._infoDisk._sceneNumber = 40;  		break;  	case 4: @@ -1234,11 +1234,11 @@ void Scene40::Action6::signal() {  		scene->_doorway.setVisage(46);  		scene->_doorway.setPosition(Common::Point(305, 61));  		scene->_doorway.animate(ANIM_MODE_5, this); -		scene->_soundHandler.startSound(25); +		scene->_soundHandler.play(25);  		break;  	}  	case 1: -		scene->_soundHandler.startSound(28); +		scene->_soundHandler.play(28);  		scene->_doorway.setPosition(Common::Point(148, 74));  		scene->_doorway.setFrame(1);  		scene->_doorway.setStrip(2); @@ -1270,7 +1270,7 @@ void Scene40::Action7::signal() {  			scene->_object7.setFrame(15);  		}  		scene->_object7.animate(ANIM_MODE_5, this); -		scene->_soundHandler.startSound(25); +		scene->_soundHandler.play(25);  		break;  	case 2:  		scene->_object7.remove(); @@ -1322,7 +1322,7 @@ void Scene40::Action8::signal() {  		_globals->_player.animate(ANIM_MODE_5, this);  		break;  	case 3: -		_globals->_soundHandler.startSound(77, this); +		_globals->_soundHandler.play(77, this);  		break;  	case 4:  		_globals->_game->endGame(40, 45); @@ -1480,7 +1480,7 @@ void Scene40::postInit(SceneObjectList *OwnerList) {  	_globals->_player.disableControl();  	if (_globals->_sceneManager._previousScene == 20) { -		_globals->_soundHandler.startSound(24); +		_globals->_soundHandler.play(24);  		_globals->_player.setVisage(43);  		_object1.postInit(); @@ -1872,7 +1872,7 @@ void Scene60::Action1::signal() {  		scene->_floppyDrive.setPosition(Common::Point(136, 65));  		scene->_floppyDrive.animate(ANIM_MODE_5, this); -		scene->_soundHandler1.startSound(35); +		scene->_soundHandler1.play(35);  		break;  	case 2:  		scene->_redLights.postInit(); @@ -1893,13 +1893,13 @@ void Scene60::Action1::signal() {  			scene->_message._numFrames = 5;  			_globals->_sceneItems.push_front(&scene->_message); -			scene->_soundHandler2.startSound(38); +			scene->_soundHandler2.play(38);  		}  		_globals->_events.setCursor(CURSOR_USE);  		break;  	case 3: -		scene->_soundHandler2.startSound(37); +		scene->_soundHandler2.play(37);  		scene->loadScene(65);  		scene->_message.remove(); @@ -1968,8 +1968,8 @@ void Scene60::Action1::signal() {  		scene->_floppyDrive.setFrame(scene->_floppyDrive.getFrameCount());  		scene->_floppyDrive.animate(ANIM_MODE_6, this); -		scene->_soundHandler1.startSound(35); -		scene->_soundHandler3.proc3(); +		scene->_soundHandler1.play(35); +		scene->_soundHandler3.stop();  		scene->_masterButton.setFrame(1);  		scene->_masterButton._state = 0; @@ -2019,7 +2019,7 @@ void Scene60::PrevObject::doAction(int action) {  		animate(ANIM_MODE_8, 1, NULL);  		if (scene->_action1.getActionIndex() > 5) { -			scene->_soundHandler3.startSound(36); +			scene->_soundHandler3.play(36);  			scene->_action1.setActionIndex(scene->_action1.getActionIndex() - 2);  			scene->_action1.setDelay(1);  		} @@ -2037,7 +2037,7 @@ void Scene60::NextObject::doAction(int action) {  		animate(ANIM_MODE_8, 1, NULL);  		if (scene->_action1.getActionIndex() < 8) { -			scene->_soundHandler3.startSound(36); +			scene->_soundHandler3.play(36);  			scene->_action1.setDelay(1);  		}  	} else { @@ -2051,7 +2051,7 @@ void Scene60::ExitObject::doAction(int action) {  	if (action == CURSOR_LOOK) {  		SceneItem::display2(60, 18);  	} else if (action == CURSOR_USE) { -		scene->_soundHandler3.startSound(36); +		scene->_soundHandler3.play(36);  		animate(ANIM_MODE_8, 1, NULL);  		scene->_nextButton.remove();  		scene->_prevButton.remove(); @@ -2132,8 +2132,8 @@ void Scene60::ControlObject::doAction(int action) {  		if (_animateMode == ANIM_MODE_NONE)  			SceneItem::display2(60, 14);  		else if (!scene->_slaveButton._state) { -			_globals->_soundHandler.startSound(40); -			_globals->_soundHandler.proc5(1); +			_globals->_soundHandler.play(40); +			_globals->_soundHandler.holdAt(true);  			_globals->_sceneManager.changeScene(20);  		} else {  			scene->_sceneMode = 15; @@ -2153,14 +2153,14 @@ void Scene60::SlaveObject::doAction(int action) {  		if (scene->_masterButton._state)  			scene->_sceneMode = 19;  		else if (_state) { -			scene->_soundHandler3.proc3(); +			scene->_soundHandler3.stop();  			animate(ANIM_MODE_6, NULL);  			_globals->clearFlag(102);  			_globals->clearFlag(!_globals->_stripNum ? 117 : 120);  			_state = 0;  			scene->_sceneMode = 9998;  		} else { -			scene->_soundHandler3.startSound(39); +			scene->_soundHandler3.play(39);  			_globals->setFlag(102);  			_globals->setFlag(!_globals->_stripNum ? 117 : 120);  			animate(ANIM_MODE_5, NULL); @@ -2185,14 +2185,14 @@ void Scene60::MasterObject::doAction(int action) {  		else if (scene->_slaveButton._state)  			scene->_sceneMode = 20;  		else if (_state) { -			scene->_soundHandler3.proc3(); +			scene->_soundHandler3.stop();  			animate(ANIM_MODE_6, NULL);  			_state = 0;  			_globals->clearFlag(103);  			_globals->clearFlag(!_globals->_stripNum ? 116 : 119);  			scene->_sceneMode = 9998;  		} else { -			scene->_soundHandler3.startSound(39); +			scene->_soundHandler3.play(39);  			animate(ANIM_MODE_5, NULL);  			_state = 1;  			_globals->setFlag(103); @@ -2347,7 +2347,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) {  			_redLights.setPosition(Common::Point(199, 186));  			_redLights.animate(ANIM_MODE_8, 0, NULL); -			_soundHandler1.startSound(35); +			_soundHandler1.play(35);  			if (!_globals->getFlag(83)) {  				_message.postInit(); @@ -2359,7 +2359,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) {  				_message._numFrames = 5;  				_globals->_sceneItems.push_front(&_message); -				_soundHandler2.startSound(38); +				_soundHandler2.play(38);  			}  		}  	} else { @@ -2382,7 +2382,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) {  			_redLights.animate(ANIM_MODE_8, 0, NULL);  			_redLights._numFrames = 5; -			_soundHandler1.startSound(35); +			_soundHandler1.play(35);  			if (!_globals->getFlag(83)) {  				_message.postInit(); @@ -2394,7 +2394,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) {  				_message._numFrames = 5;  				_globals->_sceneItems.push_front(&_message); -				_soundHandler2.startSound(38); +				_soundHandler2.play(38);  			}  		}  	} @@ -2462,7 +2462,7 @@ void Scene90::Action1::signal() {  		setDelay(2);  		break;  	case 5: -		scene->_soundHandler2.startSound(58); +		scene->_soundHandler2.play(58);  		if (scene->_stripManager._field2E8 == 220)  			scene->_stripManager.start(91, this, scene); @@ -2477,7 +2477,7 @@ void Scene90::Action1::signal() {  		break;  	case 7:  		scene->_object2.animate(ANIM_MODE_NONE); -		_globals->_soundHandler.startSound(56); +		_globals->_soundHandler.play(56);  		scene->_object3.animate(ANIM_MODE_5, this);  		break;  	case 8: { @@ -2507,8 +2507,8 @@ void Scene90::Action1::signal() {  		break;  	}  	case 11: -		_globals->_soundHandler.startSound(57); -		_globals->_soundHandler.startSound(68); +		_globals->_soundHandler.play(57); +		_globals->_soundHandler.play(68);  		scene->_object3.animate(ANIM_MODE_6, NULL);  		SceneItem::display(90, _globals->getFlag(104) ? 15 : 14, @@ -2556,8 +2556,8 @@ void Scene90::Object2::doAction(int action) {  		scene->_object6.hide();  		scene->_sceneMode = 91; -		scene->_soundHandler1.startSound(59); -		scene->_soundHandler1.proc5(1); +		scene->_soundHandler1.play(59); +		scene->_soundHandler1.holdAt(true);  		scene->setAction(&scene->_sequenceManager, scene, 91, this, &scene->_object6, NULL);  		break;  	case CURSOR_LOOK: @@ -2653,9 +2653,9 @@ void Scene90::postInit(SceneObjectList *OwnerList) {  	_globals->_sceneItems.push_back(&_object3);  	_globals->_player.disableControl(); -	_globals->_soundHandler.startSound(55); -	_soundHandler1.startSound(52); -	_soundHandler1.proc5(1); +	_globals->_soundHandler.play(55); +	_soundHandler1.play(52); +	_soundHandler1.holdAt(true);  	setAction(&_action1); @@ -2670,7 +2670,7 @@ void Scene90::signal() {  	switch (_sceneMode) {  	case 91:  		_sceneMode = 92; -		_globals->_soundHandler.startSound(77, this); +		_globals->_soundHandler.play(77, this);  		break;  	case 92:  		_globals->_scenePalette.clearListeners(); @@ -2713,7 +2713,7 @@ void Scene95::Action1::signal() {  		setDelay(60);  		break;  	case 2: { -		scene->_soundHandler.startSound(66); +		scene->_soundHandler.play(66);  		scene->_object3._numFrames = 5;  		scene->_object3.animate(ANIM_MODE_5, NULL);  		SceneItem::display(0, 0); @@ -2728,7 +2728,7 @@ void Scene95::Action1::signal() {  		break;  	}  	case 3: { -		scene->_soundHandler.startSound(21); +		scene->_soundHandler.play(21);  		Common::Point pt1(235, 72);  		PlayerMover *mover1 = new PlayerMover(); @@ -2768,7 +2768,7 @@ void Scene95::Action1::signal() {  		scene->_object1.setVisage(91);  		scene->_object1.setPosition(Common::Point(-22, 220)); -		scene->_soundHandler.startSound(21); +		scene->_soundHandler.play(21);  		Common::Point pt1(5, 198);  		NpcMover *mover1 = new NpcMover(); @@ -2826,7 +2826,7 @@ void Scene95::postInit(SceneObjectList *OwnerList) {  	_object3.setVisage(96);  	_object3.setPosition(Common::Point(29, 198)); -	_soundHandler.startSound(67); +	_soundHandler.play(67);  	setAction(&_action1);  } @@ -3000,21 +3000,21 @@ void Scene6100::Action5::dispatch() {  				(tempSet.sqrt(zeroSet) < 150.0)) {  			switch (scene->_hitCount++) {  			case 0: -				scene->_soundHandler.startSound(233); +				scene->_soundHandler.play(233);  				scene->showMessage(NULL, 0, NULL);  				if (!_globals->getFlag(76))  					scene->_probe.setAction(&scene->_action1);  				break;  			case 1: -				scene->_soundHandler.startSound(233); +				scene->_soundHandler.play(233);  				scene->showMessage(NULL, 0, NULL);  				if (!_globals->getFlag(76))  					scene->_probe.setAction(&scene->_action2);  				break;  			case 2: -				scene->_soundHandler.startSound(234); +				scene->_soundHandler.play(234);  				scene->showMessage(NULL, 0, NULL);  				if (!_globals->getFlag(76)) @@ -3243,7 +3243,7 @@ void Scene6100::postInit(SceneObjectList *OwnerList) {  	if (!_globals->getFlag(76))  		_probe.setAction(&_action4); -	_globals->_soundHandler.startSound(231); +	_globals->_soundHandler.play(231);  }  void Scene6100::remove() { diff --git a/engines/tsage/ringworld_scenes1.h b/engines/tsage/ringworld_scenes1.h index abd765473c..712a16c612 100644 --- a/engines/tsage/ringworld_scenes1.h +++ b/engines/tsage/ringworld_scenes1.h @@ -30,6 +30,7 @@  #include "tsage/core.h"  #include "tsage/scenes.h"  #include "tsage/globals.h" +#include "tsage/sound.h"  namespace tSage { @@ -65,7 +66,7 @@ class Scene15 : public Scene {  public:  	Action1 _action1;  	SceneObject _object1; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	virtual void postInit(SceneObjectList *OwnerList = NULL);  }; @@ -97,7 +98,7 @@ public:  	Action3 _action3;  	Action4 _action4;  	SceneObject _sceneObject1, _SceneObjectExt, _sceneObject3, _sceneObject4, _sceneObject5; -	SoundHandler _sound; +	ASound _sound;  public:  	Scene20();  	virtual ~Scene20() {} @@ -143,7 +144,7 @@ class Scene30 : public Scene {  	};  public: -	SoundHandler _sound; +	ASound _sound;  	DisplayHotspot _groundHotspot, _wallsHotspot, _courtyardHotspot, _treeHotspot;  	BeamObject _beam;  	DoorObject _door; @@ -232,7 +233,7 @@ public:  	SpeakerQText _speakerQText;  	SpeakerSText _speakerSText;  	SpeakerGameText _speakerGameText; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	Action1 _action1;  	Action2 _action2;  	Action3 _action3; @@ -387,9 +388,9 @@ public:  	SceneObject _redLights;  	Item1 _item1;  	Item _item2, _item3, _item4, _item5, _item6; -	SoundHandler _soundHandler1; -	SoundHandler _soundHandler2; -	SoundHandler _soundHandler3; +	ASound _soundHandler1; +	ASound _soundHandler2; +	ASound _soundHandler3;  	Scene60();  	virtual void postInit(SceneObjectList *OwnerList = NULL); @@ -423,7 +424,7 @@ public:  	DisplayObject _object3, _object4, _object5;  	SceneObject _object6;  	DisplayHotspot _item1, _item2, _item3; -	SoundHandler _soundHandler1, _soundHandler2; +	ASound _soundHandler1, _soundHandler2;  	Scene90(); @@ -441,7 +442,7 @@ class Scene95 : public Scene {  public:  	Action1 _action1;  	SceneObject _object1, _object2, _object3; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	Scene95();  	virtual void postInit(SceneObjectList *OwnerList); @@ -505,7 +506,7 @@ public:  	Action5 _action5;  	GetBoxAction _getBoxAction;  	Action7 _action7; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	Speaker _speaker1;  	SpeakerQR _speakerQR;  	SpeakerSL _speakerSL; diff --git a/engines/tsage/ringworld_scenes10.cpp b/engines/tsage/ringworld_scenes10.cpp index 0b4186531d..ba4060548e 100644 --- a/engines/tsage/ringworld_scenes10.cpp +++ b/engines/tsage/ringworld_scenes10.cpp @@ -151,7 +151,7 @@ void Scene9100::postInit(SceneObjectList *OwnerList) {  	_sceneHotspot5.setup(69, 36, 121, 272, 9100, 45, 46);  	_sceneHotspot6.setup(127, 0, 200, 52, 9100, 47, 48); -	_globals->_soundHandler.startSound(251); +	_globals->_soundHandler.play(251);  	if (_globals->_sceneManager._previousScene == 9150) {  		if (_globals->getFlag(20)) {  			_globals->_player.disableControl(); @@ -236,7 +236,7 @@ void Scene9150::dispatch() {  		} else {  			_globals->_player.disableControl();  			if (_globals->getFlag(11)) { -				_globals->_soundHandler.startSound(286); +				_globals->_soundHandler.play(286);  				_sceneMode = 9153;  			} else {  				_sceneMode = 9156; @@ -270,7 +270,7 @@ void Scene9150::postInit(SceneObjectList *OwnerList) {  	_sceneHotspot8.setup(133, 584, 142, 640, 9150, 57, -1);  	_sceneHotspot10.setup(83, 304, 103, 323, 9150, 58, 59); -	_globals->_soundHandler.startSound(285); +	_globals->_soundHandler.play(285);  	_globals->_player.disableControl();  	if (_globals->getFlag(20)) { @@ -402,7 +402,8 @@ void Scene9200::postInit(SceneObjectList *OwnerList) {  	_object1.animate(ANIM_MODE_2, NULL);  	_object1.setPosition(Common::Point(132, 114));  	_object1.fixPriority(140); -	_soundHandler.startSound(297); +	_soundHandler.play(297); +  	_stripManager.addSpeaker(&_speakerQText);  	_stripManager.addSpeaker(&_speakerGR);  	_stripManager.addSpeaker(&_speakerGText); @@ -479,7 +480,7 @@ void Scene9300::signal() {  		_globals->setFlag(84);  		// No break on purpose  	case 9303: -		_globals->_soundHandler.startSound(295); +		_globals->_soundHandler.play(295);  		_globals->_sceneManager.changeScene(9350);  		break;  	case 9302: @@ -509,7 +510,7 @@ void Scene9300::postInit(SceneObjectList *OwnerList) {  	_globals->_player.changeZoom(-1);  	_object1.postInit();  	_object2.postInit(); -	_globals->_soundHandler.startSound(289); +	_globals->_soundHandler.play(289);  	_hotspot1.setup(35, 142, 76, 212, 9300, 0, 1);  	_hotspot2.setup(28, 90, 81, 143, 9300, 2, 3); @@ -764,7 +765,7 @@ void Scene9400::signal() {  void Scene9400::dispatch() {  	if ((_object1._animateMode == 2) && (_object1._strip == 1) && (_object1._frame == 4)){  		if (_field1032 == 0) { -			_soundHandler.startSound(296); +			_soundHandler.play(296);  			_field1032 = 1;  		}  	} else { @@ -1083,7 +1084,7 @@ void Scene9500::signal() {  	switch (_sceneMode) {  	case 9503:  		_globals->_sceneManager.changeScene(9200); -		_globals->_soundHandler.startSound(295); +		_globals->_soundHandler.play(295);  		break;  	case 9504:  		_globals->_sceneManager.changeScene(9850); @@ -1141,7 +1142,7 @@ void Scene9500::postInit(SceneObjectList *OwnerList) {  	setZoomPercents(110, 75, 200, 150);  	_globals->_player.postInit(); -	_globals->_soundHandler.startSound(305); +	_globals->_soundHandler.play(305);  	_candle.postInit();  	_candle.setVisage(9500); @@ -1249,7 +1250,7 @@ void Scene9700::signal() {  		_globals->_events.setCursor(CURSOR_USE);  		break;  	case 9704: -		_globals->_soundHandler.startSound(323); +		_globals->_soundHandler.play(323);  		_globals->_sceneManager.changeScene(9750);  		break;  	} @@ -1308,7 +1309,7 @@ void Scene9700::postInit(SceneObjectList *OwnerList) {  void Scene9750::signal() {  	switch (_sceneMode ++) {  	case 9751: -		_globals->_soundHandler.proc1(this); +		_globals->_soundHandler.fadeOut(this);  		break;  	case 9752:  		_globals->_sceneManager.changeScene(2100); @@ -1440,7 +1441,7 @@ void Scene9850::Hotspot17::doAction(int action) {  		SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);  	} else {  		if (action == CURSOR_USE) -			scene->_soundHandler.startSound(306); +			scene->_soundHandler.play(306);  		NamedHotspot::doAction(action);  	}  } @@ -1452,7 +1453,7 @@ void Scene9850::Hotspot18::doAction(int action) {  		SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);  	} else {  		if (action == CURSOR_USE) -			scene->_soundHandler.startSound(306); +			scene->_soundHandler.play(306);  		NamedHotspot::doAction(action);  	}  } @@ -1464,7 +1465,7 @@ void Scene9850::Hotspot19::doAction(int action) {  		SceneItem::display(9850, 31, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);  	} else {  		if (action == CURSOR_USE) -			scene->_soundHandler.startSound(313); +			scene->_soundHandler.play(313);  		NamedHotspot::doAction(action);  	}  } @@ -1653,7 +1654,7 @@ void Scene9900::strAction1::signal() {  	switch (_actionIndex++) {  	case 0: -		scene->_soundHandler.startSound(351); +		scene->_soundHandler.play(351);  		_object9.postInit();  		_object9.setVisage(18);  		_object9._frame = 1; @@ -1673,7 +1674,7 @@ void Scene9900::strAction1::signal() {  		_globals->_scenePalette.addFader(&mask2[0], 1, 5, this);  		break;  	case 3: -		_globals->_soundHandler.startSound(377); +		_globals->_soundHandler.play(377);  		setDelay(120);  		break;  	case 4: @@ -1854,7 +1855,7 @@ void Scene9900::signal() {  	switch (_sceneMode){  	case 150: -		_globals->_soundHandler.startSound(380); +		_globals->_soundHandler.play(380);  		_object8.postInit();  		_object8.setVisage(2002);  		_object8.setStrip(1); @@ -1887,7 +1888,7 @@ void Scene9900::signal() {  		setAction(&_sequenceManager, this, 9902, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);  		break;  	case 9904: -		_globals->_soundHandler.startSound(390); +		_globals->_soundHandler.play(390);  		_sceneMode = 9912;  		setAction(&_strAction2, this);  		break; @@ -1918,7 +1919,7 @@ void Scene9900::signal() {  		setAction(&_sequenceManager, this, 9904, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);  		break;  	case 9909: -		_globals->_soundHandler.startSound(375); +		_globals->_soundHandler.play(375);  		_globals->_player.disableControl();  		_sceneMode = 9907;  		setAction(&_sequenceManager, this, 9907, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); @@ -1929,7 +1930,7 @@ void Scene9900::signal() {  		setAction(&_sequenceManager, this, 9911, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);  		break;  	case 9911: -		_globals->_soundHandler.startSound(367); +		_globals->_soundHandler.play(367);  		_globals->_player.disableControl();  		_sceneMode = 9909;  		setAction(&_sequenceManager, this, 9909, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); @@ -2080,7 +2081,7 @@ void Scene9999::postInit(SceneObjectList *OwnerList) {  	else  		_globals->_stripNum = 2121; -	_globals->_soundHandler.startSound(118); +	_globals->_soundHandler.play(118);  } diff --git a/engines/tsage/ringworld_scenes10.h b/engines/tsage/ringworld_scenes10.h index aa41555718..33b16d0014 100644 --- a/engines/tsage/ringworld_scenes10.h +++ b/engines/tsage/ringworld_scenes10.h @@ -129,7 +129,7 @@ public:  	SpeakerGText _speakerGText;  	SpeakerGR _speakerGR;  	SpeakerQText _speakerQText; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SceneHotspot1 _hotspot1;  	NamedHotspot _hotspot2;  	NamedHotspot _hotspot3; @@ -230,7 +230,7 @@ public:  	NamedHotspot _hotspot4;  	NamedHotspot _hotspot5;  	NamedHotspot _hotspot6; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	int _field1032;  	SceneHotspot7 _hotspot7;  	SceneHotspot8 _hotspot8; @@ -424,7 +424,7 @@ public:  	SceneObject _objLever;  	Object6 _objScimitar;  	Object7 _objSword; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	NamedHotspot _hotspot1;  	NamedHotspot _hotspot2;  	NamedHotspot _hotspot3; @@ -482,7 +482,7 @@ class Scene9900 : public Scene {  	};  public: -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SequenceManager _sequenceManager;  	SceneObject _object1;  	SceneObject _object2; diff --git a/engines/tsage/ringworld_scenes2.cpp b/engines/tsage/ringworld_scenes2.cpp index 4378eac724..0154123c3d 100644 --- a/engines/tsage/ringworld_scenes2.cpp +++ b/engines/tsage/ringworld_scenes2.cpp @@ -117,6 +117,7 @@ void Scene1000::Action3::signal() {  			// First time being played, so show the introduction  			ConfMan.setBool(SEEN_INTRO, true);  			ConfMan.flushToDisk(); +  			setDelay(1);  		} else {  			// Prompt user for whether to start play or watch introduction @@ -124,7 +125,7 @@ void Scene1000::Action3::signal() {  			if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) {  				_actionIndex = 20; -				_globals->_soundHandler.proc1(this); +				_globals->_soundHandler.fadeOut(this);  			} else {  				setDelay(1);  			} @@ -214,7 +215,7 @@ void Scene1000::Action3::signal() {  	case 18:  		zoom(false);  		_globals->_scenePalette.clearListeners(); -		_globals->_soundHandler.proc1(this); +		_globals->_soundHandler.fadeOut(this);  		break;  	case 19:  		_globals->_sceneManager.changeScene(10); @@ -267,7 +268,7 @@ void Scene1000::postInit(SceneObjectList *OwnerList) {  		_globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);  		_globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; -		_globals->_soundHandler.startSound(114); +		_globals->_soundHandler.play(114);  	} else if (_globals->_sceneManager._previousScene == 2222) {  		setZoomPercents(150, 10, 180, 100);  		_object1.postInit(); @@ -283,7 +284,7 @@ void Scene1000::postInit(SceneObjectList *OwnerList) {  		setAction(&_action1);  	} else { -		_globals->_soundHandler.startSound(4); +		_globals->_soundHandler.play(4);  		setZoomPercents(0, 10, 30, 100);  		_object3.postInit();  		_object3.setVisage(1050); @@ -429,7 +430,7 @@ void Scene1001::Action1::signal() {  		setDelay(10);  		break;  	case 16: { -		scene->_soundHandler1.startSound(90); +		scene->_soundHandler1.play(90);  		scene->_object6.postInit();  		scene->_object6.setVisage(16); @@ -446,7 +447,7 @@ void Scene1001::Action1::signal() {  		break;  	}  	case 17: { -		scene->_soundHandler1.startSound(90); +		scene->_soundHandler1.play(90);  		scene->_object6.remove();  		scene->_object7.postInit(); @@ -475,7 +476,7 @@ void Scene1001::Action1::signal() {  		setDelay(30);  		break;  	case 19: { -		_globals->_soundHandler.startSound(91); +		_globals->_soundHandler.play(91);  		byte adjustData[4] = {0xff, 0xff, 0xff, 0};  		_globals->_scenePalette.fade(adjustData, false, 0); @@ -496,7 +497,7 @@ void Scene1001::Action1::signal() {  		scene->_object1.animate(ANIM_MODE_5, this);  		break;  	case 22: -		_globals->_soundHandler.startSound(92); +		_globals->_soundHandler.play(92);  		scene->_stripManager.start(111, this);  		break;  	case 23: @@ -526,7 +527,7 @@ void Scene1001::postInit(SceneObjectList *OwnerList) {  	_object3.setStrip2(4);  	_object3.setPosition(Common::Point(61, 177)); -	_globals->_soundHandler.startSound(85); +	_globals->_soundHandler.play(85);  	setAction(&_action1);  } @@ -647,7 +648,7 @@ void Scene1250::postInit(SceneObjectList *OwnerList) {  		setAction(&_action4);  	} else {  		setAction(&_action3); -		_globals->_soundHandler.startSound(114); +		_globals->_soundHandler.play(114);  	}  } @@ -734,7 +735,7 @@ void Scene1400::Action1::signal() {  		_globals->_sceneManager._scrollerRect = Rect(40, 20, 280, 180);  		_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;  		_globals->_stripNum = 1500; -		_globals->_soundHandler.proc3(); +		_globals->_soundHandler.stop();  		_globals->_sceneManager.changeScene(1500);  		break; @@ -779,7 +780,7 @@ void Scene1400::postInit(SceneObjectList *OwnerList) {  	_globals->_sceneOffset.y = (_globals->_sceneManager._scene->_sceneBounds.top / 100) * 100;  	setAction(&_action1); -	_globals->_soundHandler.startSound(118); +	_globals->_soundHandler.play(118);  }  /*-------------------------------------------------------------------------- @@ -842,7 +843,7 @@ void Scene1500::Action1::signal() {  		setDelay(30);  		break;  	case 6: -		scene->_soundHandler.startSound(123); +		scene->_soundHandler.play(123);  		scene->_object1.setStrip2(4);  		scene->_object1.setFrame(1);  		scene->_object1.animate(ANIM_MODE_5, this); @@ -850,13 +851,13 @@ void Scene1500::Action1::signal() {  	case 7:  		scene->_object1.setStrip2(5);  		scene->_object1.animate(ANIM_MODE_2, NULL); -		scene->_soundHandler.startSound(124, this); +		scene->_soundHandler.play(124, this);  		break;  	case 8: -		_globals->_soundHandler.startSound(126, this); +		_globals->_soundHandler.play(126, this);  		break;  	case 9: -		_globals->_soundHandler.startSound(127); +		_globals->_soundHandler.play(127);  		_globals->_sceneManager.changeScene(2000);  		break;  	} @@ -893,7 +894,7 @@ void Scene1500::Action2::signal() {  		break;  	}  	case 3: -		scene->_soundHandler.proc4(); +		scene->_soundHandler.release();  		_globals->_stripNum = 1505;  		_globals->_sceneManager.changeScene(2400);  		break; @@ -907,7 +908,7 @@ void Scene1500::postInit(SceneObjectList *OwnerList) {  	Scene::postInit();  	if ((_globals->_stripNum == 1500) || ((_globals->_stripNum != 1504) && (_globals->_stripNum != 2751))) { -		_globals->_soundHandler.startSound(120); +		_globals->_soundHandler.play(120);  		setZoomPercents(105, 20, 145, 100);  		setAction(&_action1); diff --git a/engines/tsage/ringworld_scenes2.h b/engines/tsage/ringworld_scenes2.h index 7731b45ae8..93a8f04fd4 100644 --- a/engines/tsage/ringworld_scenes2.h +++ b/engines/tsage/ringworld_scenes2.h @@ -72,7 +72,7 @@ public:  	Action1 _action1;  	SceneObject _object1, _object2, _object3, _object4;  	SceneObject _object5, _object6, _object7; -	SoundHandler _soundHandler1, _soundHandler2; +	ASound _soundHandler1, _soundHandler2;  	virtual void postInit(SceneObjectList *OwnerList = NULL);  }; @@ -134,7 +134,7 @@ public:  		virtual void signal();  	};  public: -	SoundHandler _soundHandler; +	ASound _soundHandler;  	Action1 _action1;  	Action2 _action2;  	SceneObject _object1, _object2, _object3; diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index a19f15eca6..5d2732d36c 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -129,11 +129,11 @@ void Scene2000::Action6::signal() {  		setDelay(130);  		break;  	case 1: -		scene->_soundHandler2.startSound(79); +		scene->_soundHandler2.play(79);  		scene->_stripManager.start(2000, this);  		break;  	case 2: -		_globals->_soundHandler.startSound(81); +		_globals->_soundHandler.play(81);  		scene->_object6.postInit();  		scene->_object6.setVisage(2003);  		scene->_object6.setAction(NULL); @@ -148,7 +148,7 @@ void Scene2000::Action6::signal() {  		scene->_object6.animate(ANIM_MODE_6, this);  		break;  	case 5: -		_globals->_soundHandler.startSound(80); +		_globals->_soundHandler.play(80);  		scene->_object6.remove();  		_globals->_sceneManager.changeScene(1001);  		break; @@ -308,12 +308,12 @@ void Scene2000::Action14::signal() {  		setDelay(60);  		break;  	case 3: -		_globals->_soundHandler.startSound(99); +		_globals->_soundHandler.play(99);  		scene->_object8.show();  		scene->_object8.animate(ANIM_MODE_5, this);  		break;  	case 4: -		_globals->_soundHandler.startSound(12); +		_globals->_soundHandler.play(12);  		scene->_object8.setStrip(2);  		scene->_object8.setFrame(1);  		scene->_object9.show(); @@ -324,7 +324,7 @@ void Scene2000::Action14::signal() {  		scene->_stripManager.start(2001, this, scene);  		break;  	case 6: -		_globals->_soundHandler.proc1(0/* was false */); +		_globals->_soundHandler.fadeOut(0/* was false */);  		scene->_object8.setStrip(1);  		scene->_object8.setFrame(scene->_object8.getFrameCount());  		scene->_object8.animate(ANIM_MODE_6, this); @@ -333,7 +333,7 @@ void Scene2000::Action14::signal() {  		scene->_object10.remove();  		break;  	case 7: -		_globals->_soundHandler.startSound(111); +		_globals->_soundHandler.play(111);  		scene->_object8.remove();  		setDelay(5);  		break; @@ -425,11 +425,11 @@ void Scene2000::postInit(SceneObjectList *OwnerList) {  		setAction(&_action13);  		break;  	case 2200: -		_globals->_soundHandler.startSound(111); +		_globals->_soundHandler.play(111);  		setAction(&_action14);  		break;  	case 2222: -		_globals->_soundHandler.startSound(115); +		_globals->_soundHandler.play(115);  		setAction(&_action8);  		break;  	case 3500: @@ -437,12 +437,12 @@ void Scene2000::postInit(SceneObjectList *OwnerList) {  		break;  	default:  		_object6.remove(); -		_globals->_soundHandler.startSound(80); +		_globals->_soundHandler.play(80);  		setAction(&_action6);  		break;  	} -	_soundHandler1.startSound(78); +	_soundHandler1.play(78);  	_globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);  	_globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;  } @@ -502,7 +502,7 @@ void Scene2100::Action1::signal() {  		break;  	}  	case 2: -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_object1.animate(ANIM_MODE_5, this);  		break;  	case 3: { @@ -551,7 +551,7 @@ void Scene2100::Action1::signal() {  			}  		} -		scene->_soundHandler.startSound(161); +		scene->_soundHandler.play(161);  		scene->_area1.restore();  		scene->_area2.restore();  		scene->_area3.restore(); @@ -560,7 +560,7 @@ void Scene2100::Action1::signal() {  		if (_state == 2100) {  			setDelay(1);  		} else { -			scene->_soundHandler.startSound(162); +			scene->_soundHandler.play(162);  			scene->_object1.animate(ANIM_MODE_6, this);  		}  		break; @@ -576,7 +576,7 @@ void Scene2100::Action1::signal() {  		break;  	case 7:  		_globals->_player.fixPriority(-1); -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_object1.animate(ANIM_MODE_6, this);  		break;  	case 8: @@ -776,17 +776,17 @@ void Scene2100::Action9::signal() {  		scene->_stripManager.start(6050, this);  		break;  	case 2: -		scene->_soundHandler.startSound(99); +		scene->_soundHandler.play(99);  		scene->_object4.show();  		scene->_object4.animate(ANIM_MODE_5, this);  		break;  	case 3: -		scene->_soundHandler.startSound(12); +		scene->_soundHandler.play(12);  		scene->_object4.setStrip(2);  		scene->_stripManager.start(6051, this, scene);  		break;  	case 4: -		scene->_soundHandler.proc1(0/* was false */); +		scene->_soundHandler.fadeOut(0/* was false */);  		scene->_object4.setStrip(1);  		scene->_object4.setFrame(scene->_object4.getFrameCount());  		scene->_object4.animate(ANIM_MODE_6, this); @@ -847,7 +847,7 @@ void Scene2100::Action10::signal() {  		break;  	}  	case 5: -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_object1.animate(ANIM_MODE_5, this);  		break;  	case 6: { @@ -880,7 +880,7 @@ void Scene2100::Action10::signal() {  		setDelay(45);  		break;  	case 9: -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_object1.animate(ANIM_MODE_6, this);  		break;  	case 10: @@ -924,7 +924,7 @@ void Scene2100::Action11::signal() {  		break;  	}  	case 3: -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_object1.animate(ANIM_MODE_5, this);  		break;  	case 4: { @@ -945,7 +945,7 @@ void Scene2100::Action11::signal() {  		setDelay(45);  		break;  	case 6: -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_object1.animate(ANIM_MODE_6, this);  		break;  	case 7: @@ -970,7 +970,7 @@ void Scene2100::Action12::signal() {  		scene->_stripManager.start(6000, this);  		break;  	case 2: -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_object1.animate(ANIM_MODE_5, this);  		break;  	case 3: { @@ -984,7 +984,7 @@ void Scene2100::Action12::signal() {  		break;  	}  	case 4: { -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_object1.animate(ANIM_MODE_6, NULL);  		_globals->_player.fixPriority(-1); @@ -1096,7 +1096,7 @@ void Scene2100::Action14::signal() {  		scene->_stripManager.start(6008, this);  		break;  	case 4: -		scene->_soundHandler.startSound(99); +		scene->_soundHandler.play(99);  		scene->_object4.show();  		scene->_object4.animate(ANIM_MODE_5, this);  		break; @@ -1105,7 +1105,7 @@ void Scene2100::Action14::signal() {  		scene->_stripManager.start(6009, this, scene);  		break;  	case 6: -		scene->_soundHandler.proc1(0/* was false */); +		scene->_soundHandler.fadeOut(0/* was false */);  		scene->_object4.setStrip(1);  		scene->_object4.setFrame(scene->_object4.getFrameCount());  		scene->_object4.animate(ANIM_MODE_6, this); @@ -1136,7 +1136,7 @@ void Scene2100::Action14::signal() {  		break;  	}  	case 10: -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_object1.animate(ANIM_MODE_5, this);  		break;  	case 11: { @@ -1151,7 +1151,7 @@ void Scene2100::Action14::signal() {  		break;  	case 13:  		scene->_object3.fixPriority(1); -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_object1.animate(ANIM_MODE_6, this);  		break;  	case 14: @@ -1180,7 +1180,7 @@ void Scene2100::Action15::signal() {  		scene->_object3.fixPriority(1);  		scene->_object3.changeZoom(-1); -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_object1.animate(ANIM_MODE_5, this);  		break;  	case 2: { @@ -1191,7 +1191,7 @@ void Scene2100::Action15::signal() {  		break;  	}  	case 3: { -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_object1.animate(ANIM_MODE_6, this);  		Common::Point pt(272, 140); @@ -1251,7 +1251,7 @@ void Scene2100::Action16::signal() {  		break;  	}  	case 5: -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_object1.animate(ANIM_MODE_5, this);  		break;  	case 6: { @@ -1266,7 +1266,7 @@ void Scene2100::Action16::signal() {  		setDelay(45);  		break;  	case 8: -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_object1.animate(ANIM_MODE_6, this);  		break;  	case 9: @@ -1295,17 +1295,17 @@ void Scene2100::Action17::signal() {  		scene->_stripManager.start(7070, this);  		break;  	case 4: -		scene->_soundHandler.startSound(99); +		scene->_soundHandler.play(99);  		scene->_object4.show();  		scene->_object4.animate(ANIM_MODE_5, this);  		break;  	case 5: -		scene->_soundHandler.startSound(12); +		scene->_soundHandler.play(12);  		scene->_object4.setStrip(2);  		scene->_stripManager.start(7071, this, scene);  		break;  	case 6: -		scene->_soundHandler.proc1(NULL); +		scene->_soundHandler.fadeOut(NULL);  		scene->_object4.setStrip(1);  		scene->_object4.setFrame(scene->_object4.getFrameCount());  		scene->_object4.animate(ANIM_MODE_6, this); @@ -1690,8 +1690,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {  	switch (_globals->_sceneManager._previousScene) {  	case 2120: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  		_object1.fixPriority(-1);  		_globals->_player.fixPriority(-1);  		_globals->_player.setPosition(Common::Point(80, 66)); @@ -1759,8 +1759,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {  		}  		break;  	case 3700: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  		Scene::setZoomPercents(80, 75, 100, 90);  		if (_globals->_sceneObjects->contains(&_object2)) @@ -1778,8 +1778,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {  		setAction(&_sequenceManager, this, 2105, &_object3, NULL);  		break;  	case 4250: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  		_globals->clearFlag(43);  		_globals->_player.setVisage(2104); @@ -1797,8 +1797,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {  		setAction(&_sequenceManager, this, 2107, &_object4, NULL);  		break;  	case 5000: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  		if (_globals->_sceneObjects->contains(&_object2))  			_object2.remove(); @@ -1814,8 +1814,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {  		setAction(&_action5);  		break;  	case 5100: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  		_globals->_player.setVisage(2104);  		_globals->_player.setFrame(1);  		_globals->_player.setPosition(Common::Point(65, 149)); @@ -1833,8 +1833,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {  		setAction(&_action9);  		break;  	case 7000: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  		if (RING_INVENTORY._stasisBox2._sceneNumber == 1) {  			_globals->_player.fixPriority(1); @@ -1861,8 +1861,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {  		}  		break;  	case 7600: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  		if (_globals->_sceneObjects->contains(&_object2))  			_object2.remove(); @@ -1873,8 +1873,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {  		setAction(&_action8);  		break;  	case 8100: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  		_globals->_player.setVisage(2104);  		_globals->_player.setFrame(1); @@ -1886,8 +1886,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {  		setAction(&_sequenceManager, this, 2106, NULL);  		break;  	case 9750: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  		_globals->_player.setVisage(2104);  		_globals->_player.setFrame(1); @@ -1904,8 +1904,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {  		setAction(&_sequenceManager, this, 2103, &_object4, NULL);  		break;  	default: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  		_globals->_player._uiEnabled = true;  		break; @@ -2074,7 +2074,7 @@ void Scene2120::Action1::dispatch() {  			_actionIndex = !_entries[scene->_subjectIndex]._visage ? 4 : 3;  			setDelay(30); -			scene->_soundHandler.startSound(159); +			scene->_soundHandler.play(159);  		}  		// Next Page button handling @@ -2105,7 +2105,7 @@ void Scene2120::Action1::dispatch() {  				setDelay(30);  			} -			scene->_soundHandler.startSound(159); +			scene->_soundHandler.play(159);  		}  		// Previous Page button handling @@ -2132,7 +2132,7 @@ void Scene2120::Action1::dispatch() {  				break;  			} -			scene->_soundHandler.startSound(159); +			scene->_soundHandler.play(159);  		}  		// Exit button handling @@ -2162,7 +2162,7 @@ void Scene2120::Action1::dispatch() {  				setDelay(1);  			} -			scene->_soundHandler.startSound(159); +			scene->_soundHandler.play(159);  		}  	} @@ -2232,7 +2232,7 @@ void Scene2150::Action1::signal() {  		break;  	}  	case 1: -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_hotspot1.animate(ANIM_MODE_5, this);  		break;  	case 2: { @@ -2282,7 +2282,7 @@ void Scene2150::Action1::signal() {  			}  		} -		scene->_soundHandler.startSound(161); +		scene->_soundHandler.play(161);  		scene->_area1.restore();  		scene->_area2.restore();  		scene->_area3.restore(); @@ -2291,7 +2291,7 @@ void Scene2150::Action1::signal() {  		if (_state == 2150) {  			setDelay(1);  		} else { -			scene->_soundHandler.startSound(162); +			scene->_soundHandler.play(162);  			scene->_hotspot1.animate(ANIM_MODE_6, this);  		}  		break; @@ -2306,7 +2306,7 @@ void Scene2150::Action1::signal() {  		}  		break;  	case 6: -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_hotspot1.animate(ANIM_MODE_6, this);  		break;  	case 7: @@ -2333,10 +2333,10 @@ void Scene2150::Action2::signal() {  		_globals->_player.setStrip(8);  		_globals->_player.animate(ANIM_MODE_8, 1, this); -		scene->_soundHandler.startSound(163); +		scene->_soundHandler.play(163);  		break;  	case 2: -		scene->_soundHandler.startSound(164); +		scene->_soundHandler.play(164);  		scene->_hotspot10.animate(ANIM_MODE_5, this);  		break;  	case 3: @@ -2361,7 +2361,7 @@ void Scene2150::Action2::signal() {  		_globals->_player.animate(ANIM_MODE_5, this);  		break;  	case 5: -		scene->_soundHandler.startSound(164); +		scene->_soundHandler.play(164);  		scene->_hotspot10.animate(ANIM_MODE_6, NULL);  		scene->_hotspot14.remove(); @@ -2559,8 +2559,8 @@ void Scene2150::postInit(SceneObjectList *OwnerList) {  	switch (_globals->_sceneManager._previousScene) {  	case 2120: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  		_globals->_player.setPosition(Common::Point(108, 99));  		break;  	case 2200: @@ -2709,7 +2709,7 @@ void Scene2200::Action3::signal() {  	switch (_actionIndex++) {  	case 0: { -		scene->_soundHandler2.startSound(103); +		scene->_soundHandler2.play(103);  		scene->_hotspot4.setStrip(4);  		scene->_hotspot4.animate(ANIM_MODE_NONE, NULL); @@ -2726,7 +2726,7 @@ void Scene2200::Action3::signal() {  		break;  	}  	case 1: -		scene->_soundHandler2.startSound(104); +		scene->_soundHandler2.play(104);  		scene->_hotspot4.setStrip(2);  		scene->_hotspot4.setFrame(2);  		setDelay(120); @@ -2882,7 +2882,7 @@ void Scene2200::Hotspot9::doAction(int action) {  		break;  	case OBJECT_INFODISK:  		if (_globals->_sceneManager._previousScene == 2310) { -			scene->_soundHandler2.startSound(35); +			scene->_soundHandler2.play(35);  			_globals->_player.disableControl();  			scene->setAction(&scene->_action3);  		} @@ -2943,8 +2943,8 @@ void Scene2200::postInit(SceneObjectList *OwnerList) {  		_hotspot8.remove();  		break;  	case 4000: -		_globals->_soundHandler.startSound(100); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(100); +		_globals->_soundHandler.holdAt(true);  		_globals->_player.remove();  		_hotspot5.remove();  		_hotspot8.remove(); @@ -2984,9 +2984,9 @@ void Scene2200::postInit(SceneObjectList *OwnerList) {  		_hotspot4.fixPriority(255);  		_globals->_sceneItems.push_back(&_hotspot4); -		_soundHandler1.startSound(101); -		_soundHandler2.startSound(100); -		_globals->_soundHandler.proc5(true); +		_soundHandler1.play(101); +		_soundHandler2.play(100); +		_globals->_soundHandler.holdAt(true);  		_globals->_sceneItems.push_back(&_hotspot5);  		setAction(&_action2); @@ -3139,7 +3139,7 @@ void Scene2222::postInit(SceneObjectList *OwnerList) {  		setAction(&_action1);  	} -	_soundHandler.startSound(116); +	_soundHandler.play(116);  	_globals->_sceneManager._scene->_sceneBounds.center(_hotspot1._position);  	_globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); @@ -3225,7 +3225,7 @@ void Scene2230::Action2::signal() {  		_globals->_player.animate(ANIM_MODE_5, this);  		break;  	case 3: -		scene->_soundHandler.startSound(157); +		scene->_soundHandler.play(157);  		_globals->_player._moveDiff = Common::Point(1, 1);  		_globals->_player.setAction(&scene->_action4);  		_globals->_player._uiEnabled = true; @@ -3249,7 +3249,7 @@ void Scene2230::Action3::signal() {  		NpcMover *mover = new NpcMover();  		_globals->_player.addMover(mover, &pt, this); -		scene->_soundHandler.proc3(); +		scene->_soundHandler.stop();  		break;  	}  	case 1: @@ -3368,7 +3368,7 @@ void Scene2230::Action7::signal() {  		break;  	}  	case 2: { -		scene->_soundHandler.startSound(158); +		scene->_soundHandler.play(158);  		scene->_hotspot8.setStrip2(2);  		Common::Point pt(scene->_hotspot8._position.x, 97); @@ -3451,7 +3451,7 @@ void Scene2230::Action8::signal() {  		scene->_hotspot2.animate(ANIM_MODE_6, this);  		break;  	case 4: { -		scene->_soundHandler.startSound(158); +		scene->_soundHandler.play(158);  		scene->_hotspot2.remove();  		scene->_hotspot8._frame = 1; @@ -3774,7 +3774,7 @@ void Scene2280::Action1::signal() {  		break;  	}  	case 1: -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_hotspot16.animate(ANIM_MODE_5, this);  		break;  	case 2: { @@ -3789,7 +3789,7 @@ void Scene2280::Action1::signal() {  		break;  	case 4:  		_globals->_player.fixPriority(1); -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_hotspot16.animate(ANIM_MODE_6, this);  		break;  	case 5: @@ -3810,7 +3810,7 @@ void Scene2280::Action2::signal() {  		break;  	}  	case 1: -		scene->_soundHandler.startSound(265); +		scene->_soundHandler.play(265);  		_globals->_player.setVisage(2162);  		_globals->_player._frame = 1; @@ -3830,7 +3830,7 @@ void Scene2280::Action2::signal() {  		scene->_hotspot12.remove();  		break;  	case 4: -		scene->_soundHandler.startSound(266); +		scene->_soundHandler.play(266);  		_globals->_player.setVisage(2170);  		_globals->_player._frame = 1;  		_globals->_player._strip = 4; @@ -3858,7 +3858,7 @@ void Scene2280::Action3::signal() {  		break;  	}  	case 1: -		scene->_soundHandler.startSound(265); +		scene->_soundHandler.play(265);  		_globals->_player.setVisage(2162);  		_globals->_player._frame = 6; @@ -4338,8 +4338,8 @@ void Scene2280::postInit(SceneObjectList *OwnerList) {  		_sceneMode = 2281;  		setAction(&_sequenceManager, this, 2281, &_globals->_player, &_hotspot16, NULL); -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  	}  	_globals->_sceneItems.addItems(&_hotspot13, &_hotspot11, &_hotspot9, &_hotspot14, &_hotspot7, @@ -4390,7 +4390,7 @@ void Scene2300::Action1::signal() {  	}  	case 2: {  		scene->_hotspot8.setAction(&scene->_action4); -		scene->_soundHandler2.startSound(21); +		scene->_soundHandler2.play(21);  		Common::Point pt1(95, scene->_hotspot5._position.y);  		NpcMover *mover1 = new NpcMover(); @@ -4428,7 +4428,7 @@ void Scene2300::Action1::signal() {  		break;  	}  	case 6: -		scene->_soundHandler1.startSound(28); +		scene->_soundHandler1.play(28);  		_globals->_player.disableControl();  		scene->_hotspot2.setVisage(40); @@ -4442,7 +4442,7 @@ void Scene2300::Action1::signal() {  		_globals->_player.animate(ANIM_MODE_5, this);  		break;  	case 7: -		_globals->_soundHandler.startSound(77, this); +		_globals->_soundHandler.play(77, this);  		break;  	case 8:  		_globals->_game->endGame(2300, 0); @@ -4470,7 +4470,7 @@ void Scene2300::Action1::signal() {  		_globals->_player.animate(ANIM_MODE_5, this);  		break;  	case 11: -		scene->_soundHandler1.startSound(28); +		scene->_soundHandler1.play(28);  		scene->_hotspot5._strip = 2;  		scene->_hotspot6._strip = 2; @@ -4487,7 +4487,7 @@ void Scene2300::Action1::signal() {  		_globals->_player.animate(ANIM_MODE_6, this);  		break;  	case 12: -		scene->_soundHandler1.startSound(77); +		scene->_soundHandler1.play(77);  		_globals->_player.setVisage(0);  		_globals->_player.animate(ANIM_MODE_1, NULL);  		_globals->_player.setStrip(4); @@ -4565,8 +4565,8 @@ void Scene2300::Action2::signal() {  		scene->_hotspot2.setFrame(1);  		scene->_hotspot2.animate(ANIM_MODE_5, this); -		scene->_soundHandler1.startSound(28); -		scene->_soundHandler2.startSound(97); +		scene->_soundHandler1.play(28); +		scene->_soundHandler2.play(97);  		break;  	case 7:  		scene->_hotspot7._strip = 2; @@ -4610,8 +4610,8 @@ void Scene2300::Action3::signal() {  		_globals->_player.animate(ANIM_MODE_5, this);  		break;  	case 3: -		scene->_soundHandler1.startSound(97); -		scene->_soundHandler2.startSound(28); +		scene->_soundHandler1.play(97); +		scene->_soundHandler2.play(28);  		scene->_hotspot7._strip = 2;  		scene->_hotspot7._frame = 1; @@ -4623,7 +4623,7 @@ void Scene2300::Action3::signal() {  		_globals->_player.animate(ANIM_MODE_6, NULL);  		break;  	case 4: -		scene->_soundHandler2.startSound(97); +		scene->_soundHandler2.play(97);  		_globals->_player.setVisage(0);  		_globals->_player.animate(ANIM_MODE_1, NULL);  		_globals->_player.setStrip(1); @@ -4645,7 +4645,7 @@ void Scene2300::Action4::signal() {  	switch (_actionIndex++) {  	case 0:  		scene->_hotspot8.animate(ANIM_MODE_5, this); -		scene->_soundHandler1.startSound(11); +		scene->_soundHandler1.play(11);  		break;  	case 1:  		scene->_hotspot9.postInit(); @@ -4655,7 +4655,7 @@ void Scene2300::Action4::signal() {  		scene->_hotspot9.setPosition(Common::Point(273, 199));  		scene->_hotspot9.fixPriority(19);  		scene->_hotspot9.animate(ANIM_MODE_5, this); -		scene->_soundHandler1.startSound(11); +		scene->_soundHandler1.play(11);  		break;  	case 2:  		scene->_hotspot8.remove(); @@ -4666,10 +4666,10 @@ void Scene2300::Action4::signal() {  		scene->_hotspot10.setFrame(4);  		scene->_hotspot10.setPosition(Common::Point(292, 113));  		scene->_hotspot10.animate(ANIM_MODE_5, this); -		scene->_soundHandler1.startSound(11); +		scene->_soundHandler1.play(11);  		break;  	case 3: -		scene->_soundHandler1.startSound(13); +		scene->_soundHandler1.play(13);  		remove();  		break;  	} @@ -4747,7 +4747,7 @@ void Scene2300::postInit(SceneObjectList *OwnerList) {  	_hotspot8.setVisage(2301);  	_hotspot8.setPosition(Common::Point(288, 74)); -	_globals->_soundHandler.startSound(96); +	_globals->_soundHandler.play(96);  	if (_globals->_sceneManager._previousScene == 2000) {  		_hotspot8.remove(); @@ -4778,8 +4778,8 @@ void Scene2300::postInit(SceneObjectList *OwnerList) {  		_hotspot7.setPosition(Common::Point(229, 125));  		_hotspot7._numFrames = 5; -		_soundHandler1.startSound(95); -		_soundHandler2.startSound(96); +		_soundHandler1.play(95); +		_soundHandler2.play(96);  		_globals->_sceneItems.push_back(&_hotspot7);  		setAction(&_action2); @@ -5062,7 +5062,7 @@ void Scene2320::Action2::signal() {  	switch (_actionIndex++) {  	case 0: { -		scene->_soundHandler.startSound(253); +		scene->_soundHandler.play(253);  		scene->_hotspot13.fixPriority(99);  		Common::Point pt(scene->_hotspot13._position.x, 200); @@ -5088,7 +5088,7 @@ void Scene2320::Action3::signal() {  		break;  	}  	case 1: -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_hotspot6.animate(ANIM_MODE_5, this);  		break;  	case 2: { @@ -5137,7 +5137,7 @@ void Scene2320::Action3::signal() {  			}  		} -		scene->_soundHandler.startSound(161); +		scene->_soundHandler.play(161);  		scene->_area1.restore();  		scene->_area2.restore();  		scene->_area3.restore(); @@ -5146,7 +5146,7 @@ void Scene2320::Action3::signal() {  		if (_state == 2320) {  			setDelay(10);  		} else { -			scene->_soundHandler.startSound(162); +			scene->_soundHandler.play(162);  			scene->_hotspot6.animate(ANIM_MODE_6, this);  		}  		break; @@ -5162,7 +5162,7 @@ void Scene2320::Action3::signal() {  		break;  	}  	case 6: -		scene->_soundHandler.startSound(162); +		scene->_soundHandler.play(162);  		scene->_hotspot6.animate(ANIM_MODE_6, this);  		break;  	case 7: @@ -5250,8 +5250,8 @@ void Scene2320::Action4::signal() {  		break;  	case 10:  		if (_globals->getFlag(109)) { -			_globals->_soundHandler.startSound(40); -			_globals->_soundHandler.proc5(true); +			_globals->_soundHandler.play(40); +			_globals->_soundHandler.holdAt(true);  			Common::Point pt(303, 240);  			NpcMover *mover = new NpcMover(); @@ -5311,7 +5311,7 @@ void Scene2320::Action4::signal() {  	}  	case 19: {  		scene->_hotspot16.remove(); -		scene->_soundHandler.startSound(253); +		scene->_soundHandler.play(253);  		scene->_hotspot13.show();  		Common::Point pt(319, 157); @@ -5462,7 +5462,7 @@ void Scene2320::Action7::signal() {  		setDelay(30);  		break;  	case 1: -		_globals->_soundHandler.startSound(162); +		_globals->_soundHandler.play(162);  		scene->_hotspot6.animate(ANIM_MODE_5, this);  		break;  	case 2: @@ -5889,8 +5889,8 @@ void Scene2320::postInit(SceneObjectList *OwnerList) {  	switch (_globals->_sceneManager._previousScene) {  	case 2120: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  		_globals->_player.fixPriority(-1);  		_globals->_player.setPosition(Common::Point(389, 72)); @@ -5907,8 +5907,8 @@ void Scene2320::postInit(SceneObjectList *OwnerList) {  	case 4250:  	case 5000:  	case 7000: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  		if ((_globals->_sceneManager._previousScene == 7000) && !_globals->getFlag(80))  			_globals->setFlag(36); @@ -5924,8 +5924,8 @@ void Scene2320::postInit(SceneObjectList *OwnerList) {  		setAction(&_action6);  		break;  	case 6100: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true);  		_hotspot8.postInit();  		_hotspot8.setVisage(2345); @@ -5936,9 +5936,9 @@ void Scene2320::postInit(SceneObjectList *OwnerList) {  		setAction(&_sequenceManager1, this, 2325, &_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL);  		break;  	case 7600: -		_globals->_soundHandler.startSound(160); -		_globals->_soundHandler.proc5(true); -		_soundHandler.startSound(21); +		_globals->_soundHandler.play(160); +		_globals->_soundHandler.holdAt(true); +		_soundHandler.play(21);  		_globals->_player.setVisage(2323);  		_globals->_player.setStrip(2); @@ -5995,8 +5995,8 @@ void Scene2320::postInit(SceneObjectList *OwnerList) {  			setAction(&_sequenceManager1, this, 2325, &_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL);  			break;  		default: -			_globals->_soundHandler.startSound(160); -			_globals->_soundHandler.proc5(true); +			_globals->_soundHandler.play(160); +			_globals->_soundHandler.holdAt(true);  			_sceneMode = 2321;  			_globals->_player.setStrip(3); @@ -6127,7 +6127,7 @@ void Scene2400::postInit(SceneObjectList *OwnerList) {  	_globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);  	_globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; -	_globals->_soundHandler.startSound(153); +	_globals->_soundHandler.play(153);  }  } // End of namespace tSage diff --git a/engines/tsage/ringworld_scenes3.h b/engines/tsage/ringworld_scenes3.h index cc237a1f91..711360c190 100644 --- a/engines/tsage/ringworld_scenes3.h +++ b/engines/tsage/ringworld_scenes3.h @@ -114,7 +114,7 @@ public:  	Action14 _action14;  	SceneObject _object1, _object2, _object3, _object4, _object5;  	SceneObject _object6, _object7, _object8, _object9, _object10; -	SoundHandler _soundHandler1, _soundHandler2; +	ASound _soundHandler1, _soundHandler2;  	virtual void postInit(SceneObjectList *OwnerList = NULL);  	virtual void stripCallback(int v); @@ -232,7 +232,7 @@ class Scene2100 : public Scene {  	};  public:  	SequenceManager _sequenceManager; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SpeakerMText _speakerMText;  	SpeakerMR _speakerMR;  	SpeakerQL _speakerQL; @@ -311,7 +311,7 @@ class Scene2120 : public Scene {  	};  public: -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SceneObject _topicArrowHotspot, _arrowHotspot, _visageHotspot;  	SceneObject _subjectButton, _nextPageButton, _previousPageButton, _exitButton;  	Action1 _action1; @@ -359,7 +359,7 @@ class Scene2150 : public Scene {  		virtual void doAction(int action);  	};  public: -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SequenceManager _sequenceManager;  	SpeakerGameText _speakerGameText; @@ -440,7 +440,7 @@ public:  	DisplayHotspot _hotspot10;  	SceneObject _hotspot2, _hotspot4;  	SceneObject _hotspot6, _hotspot7, _hotspot8; -	SoundHandler _soundHandler1, _soundHandler2; +	ASound _soundHandler1, _soundHandler2;  	Scene2200();  	virtual void postInit(SceneObjectList *OwnerList = NULL); @@ -462,7 +462,7 @@ class Scene2222 : public Scene {  	};  public: -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SpeakerSText _speakerSText;  	SpeakerMText _speakerMText;  	SpeakerQText _speakerQText; @@ -552,7 +552,7 @@ class Scene2230 : public Scene {  		virtual void doAction(int action);  	};  public: -	SoundHandler _soundHandler; +	ASound _soundHandler;  	Action1 _action1;  	Action2 _action2;  	Action3 _action3; @@ -652,7 +652,7 @@ class Scene2280 : public Scene {  	};  public: -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SequenceManager _sequenceManager;  	Rect _exitRect;  	Action1 _action1; @@ -712,7 +712,7 @@ class Scene2300 : public Scene {  		virtual void doAction(int action);  	};  public: -	SoundHandler _soundHandler1, _soundHandler2; +	ASound _soundHandler1, _soundHandler2;  	SpeakerSL _speakerSL;  	SpeakerMText _speakerMText;  	SpeakerQText _speakerQText; @@ -834,7 +834,7 @@ class Scene2320 : public Scene {  		virtual void doAction(int action);  	};  public: -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SequenceManager _sequenceManager1, _sequenceManager2;  	SpeakerMText _speakerMText;  	SpeakerMR _speakerMR; diff --git a/engines/tsage/ringworld_scenes4.cpp b/engines/tsage/ringworld_scenes4.cpp index 883da9b5b1..838769e4af 100644 --- a/engines/tsage/ringworld_scenes4.cpp +++ b/engines/tsage/ringworld_scenes4.cpp @@ -178,7 +178,7 @@ void Scene3700::Action1::signal() {  		setDelay(90);  		break;  	case 3: -		scene->_soundHandler.startSound(196); +		scene->_soundHandler.play(196);  		scene->_viewer.hide();  		scene->_hotspot1.postInit(); @@ -190,7 +190,7 @@ void Scene3700::Action1::signal() {  		setDelay(90);  		break;  	case 4: -		scene->_soundHandler.startSound(197); +		scene->_soundHandler.play(197);  		scene->_hotspot1.hide();  		scene->_hotspot2.postInit(); @@ -202,7 +202,7 @@ void Scene3700::Action1::signal() {  		setDelay(30);  		break;  	case 5: -		scene->_soundHandler.startSound(198); +		scene->_soundHandler.play(198);  		scene->_hotspot2.hide();  		scene->_hotspot1.show();  		setDelay(90); @@ -244,7 +244,7 @@ void Scene3700::postInit(tSage::SceneObjectList *OwnerList) {  	_viewer.setPosition(Common::Point(195, 83));  	setAction(&_action1); -	_globals->_soundHandler.startSound(195); +	_globals->_soundHandler.play(195);  }  } // End of namespace tSage diff --git a/engines/tsage/ringworld_scenes4.h b/engines/tsage/ringworld_scenes4.h index 389c67b83a..0b575d02d3 100644 --- a/engines/tsage/ringworld_scenes4.h +++ b/engines/tsage/ringworld_scenes4.h @@ -82,7 +82,7 @@ public:  	SpeakerSText _speakerSText;  	SpeakerMText _speakerMText;  	SpeakerMR _speakerMR; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	virtual void postInit(SceneObjectList *OwnerList = NULL);  }; diff --git a/engines/tsage/ringworld_scenes5.cpp b/engines/tsage/ringworld_scenes5.cpp index 8b95e40abe..c884f9f6e4 100644 --- a/engines/tsage/ringworld_scenes5.cpp +++ b/engines/tsage/ringworld_scenes5.cpp @@ -102,7 +102,7 @@ void Scene4000::Action1::signal() {  		ADD_MOVER_NULL(scene->_hotspot5, -40, 86);  		break;  	case 5: -		_globals->_soundHandler.startSound(155); +		_globals->_soundHandler.play(155);  		_globals->setFlag(43);  		_globals->setFlag(114);  		scene->_stripManager.start(4430, this); @@ -354,14 +354,14 @@ void Scene4000::Action8::signal() {  		setDelay(60);  		break;  	case 3: -		_globals->_soundHandler.startSound(170); +		_globals->_soundHandler.play(170);  		scene->_smoke2.setVisage(4000);  		scene->_smoke2.setStrip(6);  		scene->_smoke2.animate(ANIM_MODE_2, NULL);  		setDelay(60);  		break;  	case 4: -		_globals->_soundHandler.startSound(77, this); +		_globals->_soundHandler.play(77, this);  		break;  	case 5:  		_globals->_game->endGame(4000, 15); @@ -429,7 +429,7 @@ void Scene4000::Action11::signal() {  		scene->_olo.animate(ANIM_MODE_1, NULL);  		break;  	case 5: -		scene->_soundHandler1.proc3(); +		scene->_soundHandler1.stop();  		scene->_forceField.remove();  		ADD_MOVER(_globals->_player, 340, 163); @@ -494,12 +494,12 @@ void Scene4000::Action13::signal() {  		setDelay(3);  		break;  	case 1: -		scene->_soundHandler2.startSound(151); -		scene->_soundHandler2.proc5(true); +		scene->_soundHandler2.play(151); +		scene->_soundHandler2.holdAt(true);  		ADD_MOVER(scene->_lander, -30, 70);  		break;  	case 2: -		scene->_soundHandler2.proc4(); +		scene->_soundHandler2.release();  		_globals->_sceneManager.changeScene(4010);  		break;  	} @@ -867,7 +867,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {  	_theTech.setPosition(Common::Point(281, 176));  	if (_globals->getFlag(34)) { -		_soundHandler1.startSound(156); +		_soundHandler1.play(156);  		_forceField.postInit();  		_forceField.setVisage(4000); @@ -900,7 +900,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {  	switch (_globals->_sceneManager._previousScene) {  	case 2320: -		_globals->_soundHandler.startSound(155); +		_globals->_soundHandler.play(155);  		if (RING_INVENTORY._ale._sceneNumber == 1) {  			_guardRock.postInit(); @@ -962,7 +962,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {  		}  		if (_globals->_stripNum == 4025) { -			_soundHandler1.startSound(182); +			_soundHandler1.play(182);  			_forceField.remove();  			_hotspot5.postInit(); @@ -1043,7 +1043,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {  		break;  	case 4050: -		_globals->_soundHandler.startSound(155); +		_globals->_soundHandler.play(155);  		_globals->_player.disableControl();  		if (_globals->_stripNum == 4050) { @@ -1080,7 +1080,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {  		break;  	default: -		_globals->_soundHandler.startSound(155); +		_globals->_soundHandler.play(155);  		_lander.postInit();  		_lander.setVisage(4002); @@ -1104,7 +1104,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {  			RING_INVENTORY._ladder._sceneNumber = 4100;  			RING_INVENTORY._rope._sceneNumber = 4150; -			_soundHandler1.startSound(156); +			_soundHandler1.play(156);  			_forceField.postInit();  			_forceField.setVisage(4000); @@ -1243,8 +1243,8 @@ void Scene4000::dispatch() {  		if ((RING_INVENTORY._peg._sceneNumber == 1) && _globals->getFlag(34) &&  				_globals->getFlag(37) && !_globals->getFlag(40)) {  			_globals->_player.disableControl(); -			_soundHandler1.startSound(177); -			_globals->_soundHandler.startSound(178); +			_soundHandler1.play(177); +			_globals->_soundHandler.play(178);  			setAction(&_action1);  		} @@ -1892,7 +1892,7 @@ void Scene4045::postInit(SceneObjectList *OwnerList) {  	_olloFace.fixPriority(152);  	if(_globals->_sceneManager._previousScene == 4050) { -		_globals->_soundHandler.startSound(155); +		_globals->_soundHandler.play(155);  		_globals->_player.setPosition(Common::Point(72, 128));  		_globals->_player.enableControl(); @@ -2273,7 +2273,7 @@ void Scene4050::postInit(SceneObjectList *OwnerList) {  			_globals->_player.setStrip(2);  			setAction(&_action2); -			_globals->_soundHandler.startSound(175); +			_globals->_soundHandler.play(175);  		} else {  			// Without the rope  			_globals->_player.setVisage(5315); @@ -2284,7 +2284,7 @@ void Scene4050::postInit(SceneObjectList *OwnerList) {  			_globals->_player.animate(ANIM_MODE_2, NULL);  			setAction(&_action4); -			_globals->_soundHandler.startSound(176); +			_globals->_soundHandler.play(176);  		}  		break;  	case 4045: @@ -2298,7 +2298,7 @@ void Scene4050::postInit(SceneObjectList *OwnerList) {  		_globals->_player.setObjectWrapper(new SceneObjectWrapper());  		_globals->_player.setPosition(Common::Point(193, 193)); -		_globals->_soundHandler.startSound(175); +		_globals->_soundHandler.play(175);  		break;  	default:  		break; @@ -2717,7 +2717,7 @@ void Scene4100::postInit(SceneObjectList *OwnerList) {  		&_hotspot11, &_hotspot9, &_hotspot7, &_hotspot10, &_hotspot8, &_hotspot14, NULL);  	if (_globals->_sceneManager._previousScene == 4150) { -		_globals->_soundHandler.startSound(155); +		_globals->_soundHandler.play(155);  		if (!_globals->getFlag(42)) {  			_hotspot1.setVisage(4104); @@ -3095,8 +3095,8 @@ void Scene4150::postInit(SceneObjectList *OwnerList) {  		&_hotspot10, &_hotspot9, &_hotspot8, &_hotspot7, &_hotspot6, &_hotspot2,  		&_hotspot5, NULL); -	_globals->_soundHandler.startSound(165); -	_soundHandler.startSound(311); +	_globals->_soundHandler.play(165); +	_soundHandler.play(311);  }  void Scene4150::signal() { @@ -3110,8 +3110,8 @@ void Scene4150::dispatch() {  	Scene::dispatch();  	if (!_action && (_globals->_player._position.x >= 316)) { -		_globals->_soundHandler.proc1(NULL); -		_soundHandler.proc1(NULL); +		_globals->_soundHandler.fadeOut(NULL); +		_soundHandler.fadeOut(NULL);  		_globals->_player.disableControl();  		_sceneMode = 4152;  		setAction(&_sequenceManager, this, 4152, &_globals->_player, NULL); @@ -3414,7 +3414,7 @@ void Scene4250::Hotspot6::doAction(int action) {  		SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 20 : 3);  		break;  	case OBJECT_HELMET: -		_globals->_soundHandler.startSound(354); +		_globals->_soundHandler.play(354);  		_globals->_player.disableControl();  		RING_INVENTORY._helmet._sceneNumber = 4250; @@ -3443,7 +3443,7 @@ void Scene4250::Hotspot6::doAction(int action) {  		break;  	case OBJECT_NULLIFIER:  		if (RING_INVENTORY._helmet._sceneNumber == 4250) { -			_globals->_soundHandler.startSound(353); +			_globals->_soundHandler.play(353);  			_globals->_player.disableControl();  			RING_INVENTORY._helmet._sceneNumber = 1; @@ -3650,7 +3650,7 @@ void Scene4250::postInit(tSage::SceneObjectList *OwnerList) {  	_hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));  	_globals->_sceneItems.push_back(&_hotspot7); -	_globals->_soundHandler.startSound(185); +	_globals->_soundHandler.play(185);  }  void Scene4250::signal() { @@ -3683,7 +3683,7 @@ void Scene4250::signal() {  		_globals->_player.enableControl();  		break;  	case 4259: -		_globals->_soundHandler.startSound(360); +		_globals->_soundHandler.play(360);  		_globals->_sceneManager.changeScene(9900);  		break;  	case 4261: @@ -3751,36 +3751,36 @@ void Scene4300::Action1::signal() {  		_globals->setFlag(56);  		_globals->_scenePalette.addRotation(240, 254, -1);  		scene->_hotspot7.animate(ANIM_MODE_6, this); -		_globals->_soundHandler.startSound(164); +		_globals->_soundHandler.play(164);  		break;  	case 1: -		_globals->_soundHandler.startSound(340); -		scene->_soundHandler1.startSound(341); +		_globals->_soundHandler.play(340); +		scene->_soundHandler1.play(341);  		scene->_hotspot1.remove();  		setDelay(3);  		break;  	case 2: -		scene->_soundHandler1.startSound(341); +		scene->_soundHandler1.play(341);  		scene->_hotspot2.remove();  		setDelay(6);  		break;  	case 3: -		scene->_soundHandler1.startSound(341); +		scene->_soundHandler1.play(341);  		scene->_hotspot3.remove();  		setDelay(6);  		break;  	case 4: -		scene->_soundHandler1.startSound(341); +		scene->_soundHandler1.play(341);  		scene->_hotspot4.remove();  		setDelay(12);  		break;  	case 5: -		scene->_soundHandler1.startSound(341); +		scene->_soundHandler1.play(341);  		scene->_hotspot5.remove();  		setDelay(12);  		break;  	case 6: -		scene->_soundHandler1.startSound(341); +		scene->_soundHandler1.play(341);  		scene->_hotspot6.remove();  		setDelay(60);  		break; @@ -3793,7 +3793,7 @@ void Scene4300::Action1::signal() {  		scene->_stripManager.start(8015, this, scene);  		break;  	case 9: -		_globals->_soundHandler.startSound(350); +		_globals->_soundHandler.play(350);  		_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;  		_globals->_events.setCursor(CURSOR_USE);  		_globals->_player.enableControl(); @@ -3916,7 +3916,7 @@ void Scene4300::Hotspot10::doAction(int action) {  void Scene4300::Hotspot15::signal() {  	Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; -	scene->_soundHandler2.startSound(345); +	scene->_soundHandler2.play(345);  	_strip = (_globals->_randomSource.getRandomNumber(6) < 2) ? 2 : 1;  	if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) || @@ -3982,7 +3982,7 @@ void Scene4300::Hotspot17::doAction(int action) {  		SceneItem::display2(4300, 26);  		break;  	case OBJECT_STASIS_BOX2: -		scene->_soundHandler1.startSound(352); +		scene->_soundHandler1.play(352);  		_globals->_events.setCursor(CURSOR_USE);  		scene->_sceneMode = 4303; @@ -4241,11 +4241,11 @@ void Scene4301::Action1::signal() {  	switch (_actionIndex++) {  	case 0: -		scene->_soundHandler.startSound(164); +		scene->_soundHandler.play(164);  		scene->_hotspot1.animate(ANIM_MODE_5, this);  		break;  	case 1: -		_globals->_soundHandler.startSound(335); +		_globals->_soundHandler.play(335);  		_globals->_events.setCursor(CURSOR_USE);  		scene->_hotspot2.postInit(); @@ -4270,7 +4270,7 @@ void Scene4301::Action1::signal() {  	case 10:  		// Puzzle: Wrong code   		_globals->_events.setCursor(CURSOR_NONE); -		scene->_soundHandler.startSound(337); +		scene->_soundHandler.play(337);  		if (scene->_hotspot3._flags & OBJFLAG_HIDE)  			scene->_hotspot3.show();  		else @@ -4285,7 +4285,7 @@ void Scene4301::Action1::signal() {  		for (_state = 0; _state < 6; ++_state)  			_buttonList[_state].remove(); -		scene->_soundHandler.startSound(338); +		scene->_soundHandler.play(338);  		scene->_hotspot3.hide();  		_actionIndex = 2; @@ -4295,7 +4295,7 @@ void Scene4301::Action1::signal() {  	case 20:  		// Puzzle: Correct code  		_globals->_player.disableControl(); -		scene->_soundHandler.startSound(339); +		scene->_soundHandler.play(339);  		scene->_hotspot3._frame = 3;  		if (scene->_hotspot3._flags & OBJFLAG_HIDE)  			scene->_hotspot3.show(); @@ -4329,7 +4329,7 @@ void Scene4301::Action1::process(Event &event) {  	if ((event.eventType == EVENT_BUTTON_DOWN) && buttonsRect.contains(event.mousePos)) {  		event.handled = true; -		scene->_soundHandler.startSound(336); +		scene->_soundHandler.play(336);  		int buttonIndex = ((event.mousePos.y - buttonsRect.top) / 33) * 3 +  			((event.mousePos.x - buttonsRect.left) / 33); diff --git a/engines/tsage/ringworld_scenes5.h b/engines/tsage/ringworld_scenes5.h index a2991c7283..c3ae9f4aa9 100644 --- a/engines/tsage/ringworld_scenes5.h +++ b/engines/tsage/ringworld_scenes5.h @@ -134,7 +134,7 @@ class Scene4000 : public Scene {  	};  public:  	SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; -	SoundHandler _soundHandler1, _soundHandler2; +	ASound _soundHandler1, _soundHandler2;  	SpeakerQR _speakerQR;  	SpeakerML _speakerML;  	SpeakerMR _speakerMR; @@ -471,7 +471,7 @@ class Scene4150 : public Scene {  public:  	SequenceManager _sequenceManager; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SpeakerQText _speakerQText;  	SpeakerQR _speakerQR;  	SpeakerCDL _speakerCDL; @@ -541,7 +541,7 @@ class Scene4250 : public Scene {  public:  	SequenceManager _sequenceManager; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SpeakerSR _speakerSR;  	SpeakerSL _speakerSL;  	SpeakerSText _speakerSText; @@ -613,7 +613,7 @@ class Scene4300 : public Scene {  		virtual void doAction(int action);  	};  public: -	SoundHandler _soundHandler1, _soundHandler2; +	ASound _soundHandler1, _soundHandler2;  	SequenceManager _sequenceManager;  	GfxButton _gfxButton;  	SpeakerQText _speakerQText; @@ -672,7 +672,7 @@ class Scene4301 : public Scene {  public:  	Common::List<int> _list1;  	SequenceManager _sequenceManager; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	Action1 _action1;  	SceneObject _hotspot1, _hotspot2, _hotspot3;  	Hotspot4 _hotspot4; diff --git a/engines/tsage/ringworld_scenes6.cpp b/engines/tsage/ringworld_scenes6.cpp index 9e5766d656..68c184196c 100644 --- a/engines/tsage/ringworld_scenes6.cpp +++ b/engines/tsage/ringworld_scenes6.cpp @@ -41,8 +41,8 @@ void Scene5000::Action1::signal() {  		setDelay(10);  		break;  	case 1: -		scene->_soundHandler.startSound(190); -		scene->_soundHandler.proc5(true); +		scene->_soundHandler.play(190); +		scene->_soundHandler.holdAt(true);  		ADD_MOVER(scene->_hotspot1, 283, 12);  		break;  	case 2: @@ -55,7 +55,7 @@ void Scene5000::Action1::signal() {  		setDelay(15);  		break;  	case 4: -		scene->_soundHandler.proc4(); +		scene->_soundHandler.release();  		ADD_MOVER(scene->_hotspot1, 233, 80);  		break;  	case 5: @@ -561,7 +561,7 @@ void Scene5000::postInit(SceneObjectList *OwnerList) {  		break;  	} -	_globals->_soundHandler.startSound(190); +	_globals->_soundHandler.play(190);  }  void Scene5000::signal() { @@ -639,7 +639,7 @@ void Scene5100::Action1::signal() {  		}  		break;  	case 4: -		scene->_soundHandler.startSound(206); +		scene->_soundHandler.play(206);  		scene->_hotspot5.postInit();  		scene->_hotspot5.setVisage(5362); @@ -740,7 +740,7 @@ void Scene5100::Action3::signal() {  		_globals->_player.animate(ANIM_MODE_5, this);  		break;  	case 2: -		scene->_soundHandler.startSound(28); +		scene->_soundHandler.play(28);  		if (static_cast<SceneObject *>(_owner)->_position.x < _globals->_player._position.x) {  			scene->_hotspot2.setVisage(5130);  			scene->_hotspot2._strip = 1; @@ -786,7 +786,7 @@ void Scene5100::Action4::signal() {  	switch (_actionIndex++) {  	case 0: {  		_globals->_player.disableControl(); -		scene->_soundHandler.startSound(208); +		scene->_soundHandler.play(208);  		SceneItem::display2(5100, 15);  		ObjectMover3 *mover = new ObjectMover3(); @@ -1289,7 +1289,7 @@ void Scene5100::postInit(SceneObjectList *OwnerList) {  	_globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position);  	loadScene(5100); -	_globals->_soundHandler.startSound(205); +	_globals->_soundHandler.play(205);  }  void Scene5100::signal() { @@ -1385,7 +1385,7 @@ void Scene5100::dispatch() {  		_globals->_player.disableControl();  		_globals->_player.addMover(NULL); -		_soundHandler.startSound(207); +		_soundHandler.play(207);  		_sceneMode = 5103;  		setAction(&_sequenceManager, this, (_globals->_player._position.x >= 966) ? 5104 : 5103,  				&_globals->_player, &_hotspot15, NULL); @@ -1396,7 +1396,7 @@ void Scene5100::dispatch() {  			(_globals->_sceneManager._previousScene != 5200) && (_sceneMode != 5150)) {  		setAction(NULL);  		_sceneMode = 5150; -		_soundHandler.startSound(208); +		_soundHandler.play(208);  		if (RING_INVENTORY._vial._sceneNumber == 5100) {  			_globals->_player.addMover(NULL); @@ -1471,7 +1471,7 @@ void Scene5200::Action2::signal() {  		_globals->_player.animate(ANIM_MODE_4, 3, 1, this);  		break;  	case 2: -		scene->_soundHandler.proc3(); +		scene->_soundHandler.stop();  		scene->_hotspot14.remove();  		RING_INVENTORY._stasisBox._sceneNumber = 1; @@ -1486,7 +1486,7 @@ void Scene5200::Action2::signal() {  		ADD_MOVER(scene->_hotspot8, 141, 77);  		break;  	case 4: -		scene->_soundHandler.startSound(303); +		scene->_soundHandler.play(303);  		scene->_hotspot8._strip = 2;  		scene->_hotspot8._frame = 1; @@ -1523,7 +1523,7 @@ void Scene5200::Action4::signal() {  		setDelay(120);  		break;  	case 1: -		_globals->_soundHandler.startSound(209); +		_globals->_soundHandler.play(209);  		scene->_stripManager.start(5202, this, scene);  		break;  	case 2: @@ -1622,8 +1622,8 @@ void Scene5200::postInit(SceneObjectList *OwnerList) {  	_speakerQText._textPos.x = 20;  	if (RING_INVENTORY._stasisBox._sceneNumber == 5200) { -		_soundHandler.startSound(216); -		_soundHandler.proc5(true); +		_soundHandler.play(216); +		_soundHandler.holdAt(true);  		_hotspot14.postInit();  		_hotspot14.setVisage(5202); @@ -1643,7 +1643,7 @@ void Scene5200::postInit(SceneObjectList *OwnerList) {  		// Happens when the player enters the throne room via the secret passage,  		// after talking with the bat. No NPCs are around and the player can  		// obtain the stasis box. -		_globals->_soundHandler.startSound(205); +		_globals->_soundHandler.play(205);  		_globals->_player.disableControl();  		_globals->_player.postInit(); @@ -2131,7 +2131,7 @@ void Scene5300::postInit(SceneObjectList *OwnerList) {  	_hotspot8._sceneRegionId = 8;  	_globals->_sceneItems.addItems(&_hotspot8, &_hotspot2, &_hotspot6, &_hotspot3, &_hotspot7, NULL); -	_globals->_soundHandler.startSound(212); +	_globals->_soundHandler.play(212);  }  void Scene5300::signal() { @@ -2141,7 +2141,7 @@ void Scene5300::signal() {  		_globals->_sceneManager.changeScene(5100);  		break;  	case 5307: -		_soundHandler.proc1(NULL); +		_soundHandler.fadeOut(NULL);  	// No break on purpose  	case 5302:  	case 5308: diff --git a/engines/tsage/ringworld_scenes6.h b/engines/tsage/ringworld_scenes6.h index 6ac73d4bff..2e99f5ab87 100644 --- a/engines/tsage/ringworld_scenes6.h +++ b/engines/tsage/ringworld_scenes6.h @@ -75,7 +75,7 @@ class Scene5000 : public Scene {  	};  public:  	SequenceManager _sequenceManager; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SpeakerSText _speakerSText;  	SpeakerQText _speakerQText;  	Action1 _action1; @@ -163,7 +163,7 @@ class Scene5100 : public Scene {  	};  public:  	SequenceManager _sequenceManager; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SpeakerMText _speakerMText;  	SpeakerQText _speakerQText;  	SpeakerSText _speakerSText; @@ -226,7 +226,7 @@ class Scene5200 : public Scene {  		virtual void doAction(int action);  	};  public: -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SpeakerFLL _speakerFLL;  	SpeakerFLText _speakerFLText;  	SpeakerQL _speakerQL; @@ -291,7 +291,7 @@ class Scene5300 : public Scene {  		virtual void doAction(int action);  	};  public: -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SequenceManager _sequenceManager;  	SpeakerQR _speakerQR;  	SpeakerQL _speakerQL; diff --git a/engines/tsage/ringworld_scenes8.cpp b/engines/tsage/ringworld_scenes8.cpp index 934c7494fa..2b329b958a 100644 --- a/engines/tsage/ringworld_scenes8.cpp +++ b/engines/tsage/ringworld_scenes8.cpp @@ -60,7 +60,7 @@ void Scene7000::Action1::signal() {  		setAction(&scene->_action6, this);  		break;  	case 2: -		scene->_soundHandler.startSound(252); +		scene->_soundHandler.play(252);  		scene->_object8.remove();  		scene->_object1.postInit();  		scene->_object1.setVisage(7003); @@ -184,7 +184,7 @@ void Scene7000::Action4::signal() {  		setDelay(300);  		break;  	case 2: -		_globals->_soundHandler.startSound(252); +		_globals->_soundHandler.play(252);  		scene->_object1.show();  		scene->_object1.setStrip(3);  		scene->_object1.setFrame(1); @@ -214,7 +214,7 @@ void Scene7000::Action5::signal() {  	}  	case 1:  		_globals->_player.checkAngle(&scene->_object1); -		_globals->_soundHandler.startSound(252); +		_globals->_soundHandler.play(252);  		scene->_object1.setStrip(2);  		scene->_stripManager.start(7015, this);  		break; @@ -546,7 +546,7 @@ void Scene7000::postInit(SceneObjectList *OwnerList) {  		_object1.animate(ANIM_MODE_8, 0, NULL);  		_globals->_sceneItems.push_back(&_object1);  	} -	_soundHandler.startSound(251); +	_soundHandler.play(251);  	if (_globals->_sceneManager._previousScene == 2100) {  		if (_globals->getFlag(72)) {  			_globals->_player.postInit(); @@ -565,7 +565,7 @@ void Scene7000::postInit(SceneObjectList *OwnerList) {  				setAction(&_action1);  			}  		} else { -			_globals->_soundHandler.startSound(250); +			_globals->_soundHandler.play(250);  			_globals->setFlag(72);  			_object3.postInit(); @@ -611,9 +611,9 @@ void Scene7000::postInit(SceneObjectList *OwnerList) {  		_object3.setVisage(5001);  		_object3.setStrip2(1);  		_object3.setPosition(Common::Point(307, 0)); -		_soundHandler.startSound(151); -		_soundHandler.proc5(1); -		_globals->_soundHandler.startSound(250); +		_soundHandler.play(151); +		_soundHandler.holdAt(true); +		_globals->_soundHandler.play(250);  		setAction(&_action3);  	} @@ -1135,9 +1135,9 @@ void Scene7100::postInit(SceneObjectList *OwnerList) {  	_object1.setPosition(Common::Point(100, 100));  	setAction(&_action11); -	_soundHandler1.startSound(270); -	_soundHandler2.startSound(275); -	_globals->_soundHandler.startSound(270); +	_soundHandler1.play(270); +	_soundHandler2.play(275); +	_globals->_soundHandler.play(270);  }  /*--------------------------------------------------------------------------   * Scene 7200 - Underwater: Entering the cave @@ -1302,7 +1302,7 @@ void Scene7200::postInit(SceneObjectList *OwnerList) {  	_swimmer.setPosition(Common::Point(-8, 16));  	setAction(&_action1); -	_soundHandler.startSound(271); +	_soundHandler.play(271);  }  /*-------------------------------------------------------------------------- @@ -1344,7 +1344,7 @@ void Scene7300::Action1::signal() {  		break;  	case 7:  		setDelay(3); -		_globals->_soundHandler.proc1(NULL); +		_globals->_soundHandler.fadeOut(NULL);  		break;  	case 8:  		_globals->_sceneManager.changeScene(2280); @@ -1497,7 +1497,7 @@ void Scene7300::postInit(SceneObjectList *OwnerList) {  	_object8._numFrames = 2;  	setAction(&_action1); -	_globals->_soundHandler.startSound(272); +	_globals->_soundHandler.play(272);  }  /*-------------------------------------------------------------------------- @@ -1601,8 +1601,8 @@ void Scene7600::postInit(SceneObjectList *OwnerList) {  	}  	_sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y);  	loadScene(7600); -	_soundHandler2.startSound(255); -	_soundHandler1.startSound(251); +	_soundHandler2.play(255); +	_soundHandler1.play(251);  }  /*-------------------------------------------------------------------------- @@ -1665,7 +1665,7 @@ void Scene7700::Action3::signal() {  		setDelay(60);  		// No break on purpose!  	case 2: -		scene->_soundHandler.startSound(260); +		scene->_soundHandler.play(260);  		scene->_object8.setVisage(7703);  		scene->_object8.setPosition(Common::Point(177, 97));  		scene->_object8.setStrip2(3); @@ -1874,7 +1874,7 @@ void Scene7700::SceneHotspot8::doAction(int action) {  		break;  	case CURSOR_USE:  		scene->_sceneMode = 7709; -		scene->_soundHandler.startSound(259); +		scene->_soundHandler.play(259);  		scene->_object15.setFrame(scene->_object15.getFrameCount());  		scene->_object15.animate(ANIM_MODE_6, scene);  		if ((scene->_field977 == 2) && (scene->_field97B == 0)) { @@ -1900,7 +1900,7 @@ void Scene7700::SceneHotspot9::doAction(int action) {  		break;  	case CURSOR_USE:  		scene->_sceneMode = 7709; -		scene->_soundHandler.startSound(259); +		scene->_soundHandler.play(259);  		scene->_object15.setFrame(1);  		scene->_object15.animate(ANIM_MODE_5, scene);  		if (scene->_field977 > 2) { @@ -2034,7 +2034,7 @@ void Scene7700::Object7::doAction(int action) {  		break;  	case OBJECT_STUNNER:  		if (!_globals->getFlag(78)) { -			_globals->_soundHandler.proc3(); +			_globals->_soundHandler.stop();  			_globals->setFlag(78);  			setAction(NULL);  			_globals->_player.disableControl(); @@ -2124,7 +2124,8 @@ void Scene7700::Object9::doAction(int action) {  					_globals->_sceneItems.push_front(&scene->_object10);  					scene->_object10.fixPriority(240);  				} -				scene->_soundHandler.startSound(262); + +				scene->_soundHandler.play(262);  				scene->_object14.animate(ANIM_MODE_5, NULL);  			}  			_globals->_events.setCursor(CURSOR_WALK); @@ -2222,7 +2223,7 @@ void Scene7700::signal() {  		}  		break;  	case 7702: -		_soundHandler.proc1(0); +		_soundHandler.fadeOut(0);  		_globals->_sceneManager.changeScene(7600);  		break;  	case 7703: @@ -2233,7 +2234,7 @@ void Scene7700::signal() {  		_globals->_player.enableControl();  		break;  	case 7704: -		_globals->_soundHandler.startSound(256); +		_globals->_soundHandler.play(256);  		_prof.setStrip2(4);  		_prof.setFrame2(1);  		_prof.setPosition(Common::Point(159, 87)); @@ -2520,7 +2521,7 @@ void Scene7700::postInit(SceneObjectList *OwnerList) {  	_sceneMode = 7701;  	setAction(&_sequenceManager, this, 7701, &_globals->_player, NULL); -	_soundHandler.startSound(256); +	_soundHandler.play(256);  }  Scene7700::Scene7700() { diff --git a/engines/tsage/ringworld_scenes8.h b/engines/tsage/ringworld_scenes8.h index 8b183e895f..fe9560d9d8 100644 --- a/engines/tsage/ringworld_scenes8.h +++ b/engines/tsage/ringworld_scenes8.h @@ -94,7 +94,7 @@ class Scene7000 : public Scene {  	};  public: -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SequenceManager _sequenceManager;  	SpeakerSKText _speakerSKText;  	SpeakerSKL _speakerSKL; @@ -165,8 +165,8 @@ class Scene7100 : public Scene {  	};  public: -	SoundHandler _soundHandler1; -	SoundHandler _soundHandler2; +	ASound _soundHandler1; +	ASound _soundHandler2;  	SceneObject _object1;  	SceneObject _object2;  	SceneObject _object3; @@ -230,7 +230,7 @@ public:  	SceneObject _object7;  	SceneObject _object8;  	SceneObject _object9; -	SoundHandler _soundHandler; +	ASound _soundHandler;  	virtual void postInit(SceneObjectList *OwnerList = NULL);  }; @@ -296,8 +296,8 @@ public:  	SceneObject _object4;  	SceneObject _object5;  	SceneObject _object6; -	SoundHandler _soundHandler1; -	SoundHandler _soundHandler2; +	ASound _soundHandler1; +	ASound _soundHandler2;  	virtual void postInit(SceneObjectList *OwnerList = NULL);  }; @@ -409,7 +409,7 @@ class Scene7700 : public Scene {  		virtual void doAction(int action);  	};  public: -	SoundHandler _soundHandler; +	ASound _soundHandler;  	SequenceManager _sequenceManager;  	GfxButton _gfxButton;  	SpeakerEText _speakerEText; diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index defec1cebd..4494656d46 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -20,21 +20,471 @@   *   */ +#include "common/config-manager.h"  #include "tsage/core.h"  #include "tsage/globals.h"  #include "tsage/debugger.h"  #include "tsage/graphics.h" +#include "tsage/tsage.h"  namespace tSage { +static SoundManager *_soundManager = NULL; + +/*--------------------------------------------------------------------------*/ + +SoundManager::SoundManager() { +	_soundManager = this; +	__sndmgrReady = false; +	_ourSndResVersion = 0x102; +	_ourDrvResVersion = 0x10A; + +	for (int i = 0; i < SOUND_ARR_SIZE; ++i) +		_voiceTypeStructPtrs[i] = NULL; + +	_groupsAvail = 0; +	_masterVol = 127; +	_serverSuspendedCount = 0; +	_serverDisabledCount = 0; +	_suspendedCount = 0; +	_driversDetected = false; +	_needToRethink = false; + +	_soTimeIndexFlag = false; +} + +SoundManager::~SoundManager() { +	if (__sndmgrReady) { +		for (Common::List<Sound *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) +			(*i)->stop(); +		for (Common::List<SoundDriver *>::iterator i = _installedDrivers.begin(); i != _installedDrivers.end(); ) { +			SoundDriver *driver = *i; +			++i; +			delete driver; +		} +		_sfTerminate(); +	} + +	_soundManager = NULL; +} +  void SoundManager::postInit() { -	_saver->addSaveNotifier(&SoundManager::saveNotifier); -	_saver->addLoadNotifier(&SoundManager::loadNotifier); -	_saver->addListener(this); +	if (!__sndmgrReady) { +		_saver->addSaveNotifier(&SoundManager::saveNotifier); +		_saver->addLoadNotifier(&SoundManager::loadNotifier); +		_saver->addListener(this); +		__sndmgrReady = true; +	} +} + +/** + * Loops through all the loaded sounds, and stops any that have been flagged for stopping + */ +void SoundManager::dispatch() { +	Common::List<Sound *>::iterator i = _soundList.begin(); +	while (i != _soundList.end()) { +		Sound *sound = *i; +		++i; + +		// If the sound is flagged for stopping, then stop it +		if (sound->_stoppedAsynchronously) { +			sound->stop(); +		} +	} +} + +void SoundManager::syncSounds() { +	bool mute = false; +	if (ConfMan.hasKey("mute")) +		mute = ConfMan.getBool("mute"); + +	bool music_mute = mute; +	bool sfx_mute = mute; + +	if (!mute) { +		music_mute = ConfMan.getBool("music_mute"); +		sfx_mute = ConfMan.getBool("sfx_mute"); +	} + +	// Get the new music and sfx volumes +	int musicVolume = music_mute ? 0 : MIN(255, ConfMan.getInt("music_volume")); +	int sfxVolume = sfx_mute ? 0 : MIN(255, ConfMan.getInt("sfx_volume")); + +	warning("Set volume music=%d sfx=%d", musicVolume, sfxVolume); +	this->setMasterVol(musicVolume / 2); +} + +Common::List<SoundDriverEntry> &SoundManager::buildDriverList(bool detectFlag) { +	assert(__sndmgrReady); +	_availableDrivers.clear(); + +	// Build up a list of available drivers. Currently we only implement an Adlib driver +	SoundDriverEntry sd; +	sd.driverNum = ADLIB_DRIVER_NUM; +	sd.status = detectFlag ? SNDSTATUS_DETECTED : SNDSTATUS_SKIPPED; +	sd.field2 = 0; +	sd.field6 = 15000; +	sd.shortDescription = "Adlib or SoundBlaster"; +	sd.longDescription = "3812fm"; +	_availableDrivers.push_back(sd); + +	_driversDetected = true; +	return _availableDrivers; +} + +void SoundManager::installConfigDrivers() { +	installDriver(ADLIB_DRIVER_NUM); +} + +Common::List<SoundDriverEntry> &SoundManager::getDriverList(bool detectFlag) { +	if (detectFlag) +		return _availableDrivers; +	else +		return buildDriverList(false); +} + +void SoundManager::dumpDriverList() { +	_availableDrivers.clear(); +} + +void SoundManager::disableSoundServer() { +	++_serverDisabledCount; +} + +void SoundManager::enableSoundServer() { +	if (_serverDisabledCount > 0) +		--_serverDisabledCount; +} + +void SoundManager::suspendSoundServer() { +	++_serverSuspendedCount; +} + +void SoundManager::restartSoundServer() { +	if (_serverSuspendedCount > 0) +		--_serverSuspendedCount; +} + +/** + * Install the specified driver number + */ +void SoundManager::installDriver(int driverNum) { +	// If driver is already installed, no need to install it +	if (isInstalled(driverNum)) +		return; + +	// Instantiate the sound driver +	SoundDriver *driver = instantiateDriver(driverNum); +	if (!driver) +		return; + +	assert((_ourDrvResVersion >= driver->_minVersion) && (_ourDrvResVersion <= driver->_maxVersion)); + +	// Mute any loaded sounds +	disableSoundServer(); +	for (Common::List<Sound *>::iterator i = _playList.begin(); i != _playList.end(); ++i) +		(*i)->mute(true); + +	// Install the driver +	if (!_sfInstallDriver(driver)) +		error("Sound driver initialization failed"); + +	switch (driverNum) { +	case ROLAND_DRIVER_NUM: +	case ADLIB_DRIVER_NUM: { +		// Handle loading bank infomation +		byte *bankData = _resourceManager->getResource(RES_BANK, driverNum, 0, true); +		if (bankData) { +			// Install the patch bank data +			_sfInstallPatchBank(driver, bankData); +			DEALLOCATE(bankData); +		} else { +			// Could not locate patch bank data, so unload the driver +			_sfUnInstallDriver(driver); + +			// Unmute currently active sounds +			for (Common::List<Sound *>::iterator i = _playList.begin(); i != _playList.end(); ++i) +				(*i)->mute(false); +	 +			enableSoundServer(); +		} +		break; +	} +	} +} + +/** + * Instantiate a driver class for the specified driver number + */ +SoundDriver *SoundManager::instantiateDriver(int driverNum) { +	assert(driverNum == ADLIB_DRIVER_NUM); +	return new AdlibSoundDriver(); +} + +/** + * Uninstall the specified driver + */ +void SoundManager::unInstallDriver(int driverNum) { +	Common::List<SoundDriver *>::const_iterator i; +	for (i = _installedDrivers.begin(); i != _installedDrivers.end(); ++i) { +		if ((*i)->_driverResID == driverNum) { +			// Found driver to remove + +			// Mute any loaded sounds +			disableSoundServer(); +			for (Common::List<Sound *>::iterator i = _playList.begin(); i != _playList.end(); ++i) +				(*i)->mute(true); + +			// Uninstall the driver +			_sfUnInstallDriver(*i); + +			// Re-orient all the loaded sounds  +			for (Common::List<Sound *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) +				(*i)->orientAfterDriverChange(); + +			// Unmute currently active sounds +			for (Common::List<Sound *>::iterator i = _playList.begin(); i != _playList.end(); ++i) +				(*i)->mute(false); +	 +			enableSoundServer(); +		} +	} +} + +/** + * Returns true if a specified driver number is currently installed + */ +bool SoundManager::isInstalled(int driverNum) const { +	Common::List<SoundDriver *>::const_iterator i; +	for (i = _installedDrivers.begin(); i != _installedDrivers.end(); ++i) { +		if ((*i)->_driverResID == driverNum) +			return true; +	} + +	return false; +} + +void SoundManager::setMasterVol(int volume) { +	_sfSetMasterVol(volume); +} + +int SoundManager::getMasterVol() const { +	return _masterVol; +} + +void SoundManager::loadSound(int soundNum, bool showErrors) { +	// This method preloaded the data associated with a given sound, so is now redundant +} + +void SoundManager::unloadSound(int soundNum) { +	// This method signalled the resource manager to unload the data for a sound, and is now redundant  } +int SoundManager::determineGroup(const byte *soundData) { +	return _sfDetermineGroup(soundData); +} + +void SoundManager::checkResVersion(const byte *soundData) { +	int maxVersion = READ_LE_UINT16(soundData + 4); +	int minVersion = READ_LE_UINT16(soundData + 6); + +	if (_soundManager->_ourSndResVersion < minVersion) +		error("Attempt to play/prime sound resource that is too new"); +	if (_soundManager->_ourSndResVersion > maxVersion) +		error("Attempt to play/prime sound resource that is too old"); +} + +int SoundManager::extractPriority(const byte *soundData) { +	return READ_LE_UINT16(soundData + 12); +} + +int SoundManager::extractLoop(const byte *soundData) { +	return READ_LE_UINT16(soundData + 14); +} + +void SoundManager::extractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum) { +	_sfExtractTrackInfo(trackInfo, soundData, groupNum); +} + +void SoundManager::addToSoundList(Sound *sound) { +	if (!contains(_soundList, sound)) +		_soundList.push_back(sound); +} + +void SoundManager::removeFromSoundList(Sound *sound) { +	_soundList.remove(sound); +} + +void SoundManager::addToPlayList(Sound *sound) { +	_sfAddToPlayList(sound); +} + +void SoundManager::removeFromPlayList(Sound *sound) { +	_sfRemoveFromPlayList(sound); +} + +bool SoundManager::isOnPlayList(Sound *sound) { +	return _sfIsOnPlayList(sound); +} + +void SoundManager::updateSoundVol(Sound *sound) { +	_sfUpdateVolume(sound); +} + +void SoundManager::updateSoundPri(Sound *sound) { +	_sfUpdatePriority(sound); +} + +void SoundManager::updateSoundLoop(Sound *sound) { +	_sfUpdateLoop(sound); +} + +void SoundManager::rethinkVoiceTypes() { +	_sfRethinkVoiceTypes(); +} + +void SoundManager::_sfSoundServer() { +	if (!sfManager()._serverDisabledCount && !sfManager()._serverSuspendedCount) +		return; + +	if (sfManager()._needToRethink) { +		_sfRethinkVoiceTypes(); +		sfManager()._needToRethink = false; +	} else { +		_sfDereferenceAll(); +	} + +	// Handle any fading if necessary +	do { +		_sfProcessFading(); +	} while (sfManager()._serverSuspendedCount > 0); + +	// Poll all sound drivers in case they need it +	for (Common::List<SoundDriver *>::iterator i = sfManager()._installedDrivers.begin();  +				i != sfManager()._installedDrivers.end(); ++i) { +		(*i)->poll(); +	} +} + +void SoundManager::_sfProcessFading() { +	// Loop through processing active sounds +	bool removeFlag = false; +	Common::List<Sound *>::iterator i = sfManager()._playList.begin(); +	while (i != sfManager()._playList.end()) { +		Sound *s = *i; +		++i; + +		if (!s->_pausedCount) +			removeFlag = s->_soServiceTracks(); +		if (removeFlag) { +			_sfDoRemoveFromPlayList(s); +			s->_stoppedAsynchronously = true; +			sfManager()._needToRethink = true; +		} + +		if (s->_fadeDest != -1) { +			if (s->_fadeCounter != 0) +				--s->_fadeCounter; +			else { +				if (s->_volume >= s->_fadeDest) { +					if ((s->_fadeDest - s->_volume) > s->_fadeSteps) +						s->_volume += s->_fadeSteps; +					else +						s->_volume = s->_fadeDest; +				} else { +					if (s->_fadeDest > s->_fadeSteps) +						s->_volume -= s->_fadeSteps; +					else +						s->_volume = s->_fadeDest; +				} + +				_sfDoUpdateVolume(s); +				if (s->_volume != s->_fadeDest) +					s->_fadeCounter = s->_fadeTicks; +				else { +					s->_fadeDest = -1; +					if (s->_stopAfterFadeFlag) { +						_sfDoRemoveFromPlayList(s); +						s->_stoppedAsynchronously = true; +						sfManager()._needToRethink = true; +					} +				} +			} +		} +	} + +	// Loop through the voiceType list +	for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { +		VoiceTypeStruct *vtStruct = sfManager()._voiceTypeStructPtrs[voiceIndex]; +		if (!vtStruct) +			continue; + +		if (vtStruct->_voiceType == VOICETYPE_1) { +			for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { +				if (vtStruct->_entries[idx]._type1._field6 >= -1) +					++vtStruct->_entries[idx]._type1._field6; +			} +		} +	} +} + +void SoundManager::_sfUpdateVoiceStructs() { +	for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { +		VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; +		if (!vs) +			continue; + +		if (vs->_voiceType == VOICETYPE_0) { +			for (uint idx = 0; idx < vs->_entries.size(); ++idx) { +				VoiceStructEntry &vse = vs->_entries[idx]; + +				vse._type0._sound = vse._type0._sound2; +				vse._type0._channelNum = vse._type0._channelNum2; +				vse._type0._priority = vse._type0._priority2; +				vse._type0._fieldA = vse._type0._field12; +			} +		} else { +			vs->_field3 = vs->_numVoices; + +			for (uint idx = 0; idx < vs->_entries.size(); ++idx) { +				VoiceStructEntry &vse = vs->_entries[idx]; + +				vse._type1._sound = vse._type1._sound2; +				vse._type1._channelNum = vse._type1._channelNum2; +				vse._type1._priority = vse._type1._priority2; +			} +		} +	} +} + +void SoundManager::_sfUpdateVoiceStructs2() { +	for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { +		VoiceTypeStruct *vtStruct = sfManager()._voiceTypeStructPtrs[voiceIndex]; +		if (!vtStruct) +			continue; + +		for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { + +			if (vtStruct->_voiceType == VOICETYPE_0) { +				VoiceStructEntryType0 &vse = vtStruct->_entries[idx]._type0; +				vse._sound2 = vse._sound; +				vse._channelNum2 = vse._channelNum; +				vse._priority2 = vse._priority; +				vse._field12 = vse._fieldA; +			} else { +				VoiceStructEntryType1 &vse = vtStruct->_entries[idx]._type1; +				vse._sound2 = vse._sound; +				vse._channelNum2 = vse._channelNum; +				vse._priority2 = vse._priority; +			} +		} +	}	 +} + +/*--------------------------------------------------------------------------*/ +  void SoundManager::saveNotifier(bool postFlag) { -	_globals->_soundManager.saveNotifierProc(postFlag); +	_soundManager->saveNotifierProc(postFlag);  }  void SoundManager::saveNotifierProc(bool postFlag) { @@ -42,7 +492,7 @@ void SoundManager::saveNotifierProc(bool postFlag) {  }  void SoundManager::loadNotifier(bool postFlag) { -	_globals->_soundManager.loadNotifierProc(postFlag); +	_soundManager->loadNotifierProc(postFlag);  }  void SoundManager::loadNotifierProc(bool postFlag) { @@ -51,7 +501,2139 @@ void SoundManager::loadNotifierProc(bool postFlag) {  void SoundManager::listenerSynchronize(Serializer &s) {  	s.validate("SoundManager"); -	warning("TODO: SoundManager listenerSynchronize"); +	warning("TODO: SoundManager listenerSynchronise"); +} + +/*--------------------------------------------------------------------------*/ + +SoundManager &SoundManager::sfManager() { +	assert(_soundManager); +	return *_soundManager; +} + +int SoundManager::_sfDetermineGroup(const byte *soundData) { +	const byte *p = soundData + READ_LE_UINT16(soundData + 8); +	uint32 v; +	while ((v = READ_LE_UINT32(p)) != 0) { +		if ((v & _soundManager->_groupsAvail) == v) +			return v; + +		p += 6 + (READ_LE_UINT16(p + 4) * 4); +	} + +	return 0; +} + +void SoundManager::_sfAddToPlayList(Sound *sound) { +	++sfManager()._serverSuspendedCount; +	_sfDoAddToPlayList(sound); +	sound->_stoppedAsynchronously = false; +	_sfRethinkVoiceTypes(); +	--sfManager()._serverSuspendedCount; +} +	 +void SoundManager::_sfRemoveFromPlayList(Sound *sound) { +	++sfManager()._serverSuspendedCount; +	if (_sfDoRemoveFromPlayList(sound)) +		_sfRethinkVoiceTypes(); +	--sfManager()._serverSuspendedCount; +} + +bool SoundManager::_sfIsOnPlayList(Sound *sound) { +	++_soundManager->_serverSuspendedCount;  +	bool result = contains(_soundManager->_playList, sound); +	--_soundManager->_serverSuspendedCount; + +	return result; +} + +void SoundManager::_sfRethinkSoundDrivers() { +	// Free any existing entries +	for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) { +		if (sfManager()._voiceTypeStructPtrs[idx]) { +			delete sfManager()._voiceTypeStructPtrs[idx]; +			sfManager()._voiceTypeStructPtrs[idx] = NULL; +		} +	} + +	for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) { +		byte flag = 0xff; +		int total = 0; + +		// Loop through the sound drivers +		for (Common::List<SoundDriver *>::iterator i = sfManager()._installedDrivers.begin(); +				i != sfManager()._installedDrivers.end(); ++i) { +			// Process the group data for each sound driver +			SoundDriver *driver = *i; +			const byte *groupData = driver->_groupOffset->pData; + +			while (*groupData != 0xff) { +				byte byteVal = *groupData++; + +				if (byteVal == idx) { +					byte byteVal2 = *groupData++; +					if (flag == 0xff) +						flag = byteVal2; +					else { +						assert(flag == byteVal2); +					} + +					if (!flag) { +						while (*groupData++ != 0xff) +							++total; +					} else { +						total += *groupData; +						groupData += 2; +					} +				} else if (*groupData++ == 0) { +					while (*groupData != 0xff) +						++groupData; +					++groupData; +				} else { +					groupData += 2; +				} +			} +		} + +		if (total) { +			VoiceTypeStruct *vs = new VoiceTypeStruct(); +			sfManager()._voiceTypeStructPtrs[idx] = vs; + +			if (!flag) { +				vs->_voiceType = VOICETYPE_0; +			} else { +				vs->_voiceType = VOICETYPE_1; +			} + +			vs->_total = vs->_numVoices = total; +			vs->_field3 = 0; + +			for (Common::List<SoundDriver *>::iterator i = sfManager()._installedDrivers.begin(); +							i != sfManager()._installedDrivers.end(); ++i) { +				// Process the group data for each sound driver +				SoundDriver *driver = *i; +				const byte *groupData = driver->_groupOffset->pData; + +				while (*groupData != 0xff) { +					byte byteVal = *groupData++; +				 +					if (byteVal == idx) { +						++groupData; + +						if (!flag) { +							while ((byteVal = *groupData++) != 0xff) { +								VoiceStructEntry ve; +								memset(&ve, 0, sizeof(VoiceStructEntry)); + +								ve._field1 = (byteVal & 0x80) ? 0 : 1; +								ve._driver = driver; +								ve._type0._sound = NULL; +								ve._type0._channelNum = 0; +								ve._type0._priority = 0; +								ve._type0._fieldA = 0; + +								vs->_entries.push_back(ve); +							} +						} else { +							byteVal = *groupData; +							groupData += 2; + +							for (int idx = 0; idx < byteVal; ++idx) { +								VoiceStructEntry ve; +								memset(&ve, 0, sizeof(VoiceStructEntry)); + +								ve._voiceNum = idx; +								ve._driver = driver; +								ve._type1._field4 = -1; +								ve._type1._field5 = 0; +								ve._type1._field6 = 0; +								ve._type1._sound = NULL; +								ve._type1._channelNum = 0; +								ve._type1._priority = 0; + +								vs->_entries.push_back(ve); +							} +						} +					} else { +						if (*groupData++ != 0) { +							while (*groupData != 0xff) +								++groupData; +						} else { +							groupData += 2; +						} +					} +				} +			}				 +		} +	} +} + +void SoundManager::_sfRethinkVoiceTypes() { +	++sfManager()._serverSuspendedCount; +	_sfDereferenceAll(); + +	// Pre-processing +	for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { +		VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; +		if (!vs) +			continue; + +		if (vs->_voiceType == VOICETYPE_0) { +			for (uint idx = 0; idx < vs->_entries.size(); ++idx) { +				VoiceStructEntry &vse = vs->_entries[idx]; +				vse._type0._sound3 = vse._type0._sound; +				vse._type0._channelNum3 = vse._type0._channelNum; +				vse._type0._priority3 = vse._type0._priority; +				vse._type0._field1A = vse._type0._fieldA; +				vse._type0._sound = NULL; +				vse._type0._channelNum = 0; +				vse._type0._priority = 0; +				vse._type0._fieldA = 0; +				vse._type0._sound2 = NULL; +				vse._type0._channelNum2 = 0; +				vse._type0._priority2 = 0; +				vse._type0._field12 = 0; +			} +		} else { +			for (uint idx = 0; idx < vs->_entries.size(); ++idx) { +				VoiceStructEntry &vse = vs->_entries[idx]; +				vse._type1._sound3 = vse._type1._sound; +				vse._type1._channelNum3 = vse._type1._channelNum; +				vse._type1._priority3 = vse._type1._priority; +				vse._type1._sound = NULL; +				vse._type1._channelNum = 0; +				vse._type1._priority = 0; +				vse._type1._sound2 = NULL; +				vse._type1._channelNum2 = 0; +				vse._type1._priority2 = 0; +			} + +			// Reset the number of voices available +			vs->_numVoices = vs->_total; +		} +	} + +	// Main processing loop +	int priorityOffset = 0; +	for (Common::List<Sound *>::iterator i = sfManager()._playList.begin(); i != sfManager()._playList.end(); ++i, priorityOffset += 16) { +		Sound *sound = *i; +		if ((sound->_mutedCount != 0) || (sound->_pausedCount != 0)) +			continue; + +		_sfUpdateVoiceStructs(); +		Common::set_to(sound->_chWork, sound->_chWork + SOUND_ARR_SIZE, false); + +		for (;;) { +			// Scan for sub priority +			int foundIndex = -1, foundPriority = 0; +			for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) { +				if (!(sound->_chFlags[idx] & 0x8000) & !sound->_chWork[idx]) { +					int subPriority = sound->_chSubPriority[idx]; +					if (subPriority) +						subPriority = 16 - subPriority + priorityOffset; + +					if (foundIndex != -1) { +						if (subPriority < foundPriority) { +							foundIndex = idx; +							foundPriority = subPriority; +						} +					} else { +						foundIndex = idx; +						foundPriority = subPriority; +					} +				} +			} +			if (foundIndex == -1) +				break; + +			int chNumVoices = sound->_chNumVoices[foundIndex]; +			sound->_chWork[foundIndex] = true; + +			VoiceTypeStruct *vtStruct = sfManager()._voiceTypeStructPtrs[sound->_chVoiceType[foundIndex]]; +			if (!vtStruct) { +				if (foundPriority) +					continue; + +				_sfUpdateVoiceStructs2(); +				break; +			} + +			if (vtStruct->_voiceType != VOICETYPE_0) { +				// Type 1 +				int numVoices = vtStruct->_numVoices; +				 +				if (numVoices >= chNumVoices) { +					int channelCount = chNumVoices, idx = 0; +					while (channelCount > 0) { +						if (!vtStruct->_entries[idx]._type1._sound2) { +							vtStruct->_entries[idx]._type1._sound2 = sound; +							vtStruct->_entries[idx]._type1._channelNum2 = foundIndex; +							vtStruct->_entries[idx]._type1._priority2 = foundPriority; +							--channelCount; +						} +						++idx; +					} + +					vtStruct->_numVoices -= chNumVoices; +					continue; +				} else if (!foundPriority) { +					do { +						int maxPriority = 0; +						for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) +							maxPriority = MAX(maxPriority, vtStruct->_entries[idx]._type1._priority2); + +						if (!maxPriority) { +							_sfUpdateVoiceStructs2(); +							break; +						} + +						for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { +							if (vtStruct->_entries[idx]._type1._priority2 == maxPriority) { +								vtStruct->_entries[idx]._type1._sound2 = NULL; +								vtStruct->_entries[idx]._type1._channelNum2 = 0; +								vtStruct->_entries[idx]._type1._priority2 = 0; +								++numVoices; +							} +						} +					} while (chNumVoices > numVoices); + +					int voicesCtr = chNumVoices; +					for (uint idx = 0; (idx < vtStruct->_entries.size()) && (voicesCtr > 0); ++idx) { +						if (!vtStruct->_entries[idx]._type1._sound2) { +							vtStruct->_entries[idx]._type1._sound2 = sound; +							vtStruct->_entries[idx]._type1._channelNum2 = foundIndex; +							vtStruct->_entries[idx]._type1._priority2 = foundPriority; +							--voicesCtr; +						} +					} + +					numVoices -= chNumVoices; +					vtStruct->_numVoices = numVoices; +					continue; +				} else if (!numVoices) { +					break; +				} +				continue; +			} else { +				// Type 0 +				if (sound->_isEmpty) { +					uint idx = 0; +					while ((idx < vtStruct->_entries.size()) &&  +							(vtStruct->_entries[idx]._voiceNum == foundIndex)) +						++idx; +					if (idx == vtStruct->_entries.size()) +						continue; +				} + +				int flagsVal = sound->_chFlags[foundIndex] & 3; +				if (flagsVal != 1) { +					// All modes except mode 1 (loc_23EDF) +					int entryIndex = -1, maxVoiceNum = 0; +					 +					for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { +						if (!vtStruct->_entries[idx]._type0._sound2 && (vtStruct->_entries[idx]._field1 != 0) && +								(vtStruct->_entries[idx]._voiceNum > maxVoiceNum)) { +							maxVoiceNum = vtStruct->_entries[idx]._voiceNum; +							entryIndex = idx; +						} +					} + +					if (entryIndex != -1) { +						vtStruct->_entries[entryIndex]._type0._sound2 = sound; +						vtStruct->_entries[entryIndex]._type0._channelNum2 = foundIndex; +						vtStruct->_entries[entryIndex]._type0._priority2 = foundPriority; +						vtStruct->_entries[entryIndex]._type0._field12 = 0; +						continue; +					} +					 +					if (foundPriority != 0) +						continue; + +					int maxPriority = 0; +					entryIndex = -1; +					for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { +						if ((vtStruct->_entries[idx]._field1 != 0) && +								(vtStruct->_entries[idx]._type0._priority2 > maxVoiceNum)) { +							maxPriority = vtStruct->_entries[idx]._type0._priority2; +							entryIndex = idx; +						} +					} + +					if (entryIndex != -1) { +						vtStruct->_entries[entryIndex]._type0._sound2 = sound; +						vtStruct->_entries[entryIndex]._type0._channelNum2 = foundIndex; +						vtStruct->_entries[entryIndex]._type0._priority2 = foundPriority; +						vtStruct->_entries[entryIndex]._type0._field12 = 0; +						continue; +					} + +					_sfUpdateVoiceStructs2(); +					break; +				} else { +					// Channel mode 1 handling (loc_23FAC) +				 +					bool foundMatch = false; +					int entryIndex = -1; +					for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { +						if (vtStruct->_entries[idx]._voiceNum == foundIndex) { +							foundIndex = true; +							if (!vtStruct->_entries[idx]._type0._sound2) { +								entryIndex = idx; +								break; +							} +						} +					} + +					if (entryIndex != -1) { +						vtStruct->_entries[entryIndex]._type0._sound2 = sound; +						vtStruct->_entries[entryIndex]._type0._channelNum2 = foundIndex; +						vtStruct->_entries[entryIndex]._type0._priority2 = foundPriority; +						vtStruct->_entries[entryIndex]._type0._field12 = 0; +						continue; +					} +					 +					if (!foundMatch) { +						if (foundPriority) +							continue; +						if (entryIndex == -1) { +							_sfUpdateVoiceStructs2(); +							break; +						}  +					} + +					// Find the entry with the highest priority +					int maxPriority = 0; +					foundMatch = false; +					entryIndex = -1; +					for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { +						if (vtStruct->_entries[idx]._voiceNum != foundIndex) +							continue; +						if (!vtStruct->_entries[idx]._type0._field12) { +							foundMatch = true; +							break; +						} + +						if (vtStruct->_entries[idx]._type0._priority2 > maxPriority) { +							maxPriority = vtStruct->_entries[idx]._type0._priority2; +							entryIndex = -1; +						} +					} +					 +					if (!foundMatch) { +						if (foundPriority) +							continue; + +						if (entryIndex != -1) { +							vtStruct->_entries[entryIndex]._type0._sound2 = sound; +							vtStruct->_entries[entryIndex]._type0._channelNum2 = foundIndex; +							vtStruct->_entries[entryIndex]._type0._priority2 = foundPriority; +							vtStruct->_entries[entryIndex]._type0._field12 = 1; +							continue; +						} + +						_sfUpdateVoiceStructs2(); +						break; +					} + +					// Found a match (loc_24061) +					maxPriority = 0; +					int maxVoiceNum = 0; +					int priorityIndex = -1, voiceIndex = -1; + +					for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { +						if (vtStruct->_entries[idx]._field1) { +							if (!vtStruct->_entries[idx]._type0._sound2) { +								if (vtStruct->_entries[idx]._voiceNum > maxVoiceNum) { +									maxVoiceNum = vtStruct->_entries[idx]._voiceNum; +									voiceIndex = idx; +								} +							} else { +								if (vtStruct->_entries[idx]._type0._priority2 > maxPriority) { +									maxPriority = vtStruct->_entries[idx]._type0._priority2; +									priorityIndex = idx; +								} +							} +						} +					} + +					if (voiceIndex != -1) { +						VoiceStructEntryType0 &vteSrc = vtStruct->_entries[foundIndex]._type0; +						VoiceStructEntryType0 &vteDest = vtStruct->_entries[voiceIndex]._type0; + +						vteDest._sound2 = vteSrc._sound2; +						vteDest._channelNum2 = vteSrc._channelNum2; +						vteDest._priority2 = vteSrc._priority2; +						 +						vteSrc._sound2 = sound; +						vteSrc._channelNum2 = foundIndex; +						vteSrc._priority2 = foundPriority; +						vteSrc._field12 = 1; +						continue;											 +					} + +					if (!foundPriority) +						continue; +					if (priorityIndex == -1) { +						_sfUpdateVoiceStructs2(); +						break; +					} + +					VoiceStructEntryType0 &vteSrc = vtStruct->_entries[foundIndex]._type0; +					VoiceStructEntryType0 &vteDest = vtStruct->_entries[priorityIndex]._type0; + +					if (priorityIndex != foundIndex) { +						vteDest._sound2 = vteSrc._sound2; +						vteDest._channelNum2 = vteSrc._channelNum2; +						vteDest._priority2 = vteSrc._priority2; +						vteDest._field12 = vteSrc._field12; +					} + +					vteSrc._sound2 = sound; +					vteSrc._channelNum2 = foundIndex; +					vteSrc._priority2 = foundPriority; +					vteSrc._field12 = 1; +					continue; +				} +			} +		} +	} + +	// Post-processing +	for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { +		VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; +		if (!vs) +			continue; + +		if (vs->_voiceType == VOICETYPE_0) { +			// Type 0 +			for (uint idx = 0; idx < vs->_entries.size(); ++idx) { +				VoiceStructEntryType0 &vse = vs->_entries[idx]._type0; +				SoundDriver *driver = vs->_entries[idx]._driver; +				assert(driver); + +				if (vse._field12) { +					int total = 0; +					vse._sound = vse._sound2; +					if (vse._sound3 != vse._sound) +						++total; + +					vse._channelNum = vse._channelNum2; +					if (vse._channelNum3 != vse._channelNum) +						++total; + +					vse._priority = vse._priority2; +					vse._fieldA = 1; +					vse._sound2 = NULL; + +					if (total) { +						driver->proc24(vse._channelNum, idx, vse._sound, 123, 0); +						driver->proc24(vse._channelNum, idx, vse._sound, 1, vse._sound->_chModulation[vse._channelNum]); +						driver->proc24(vse._channelNum, idx, vse._sound, 7,  +							vse._sound->_chVolume[vse._channelNum] * vse._sound->_volume / 127); +						driver->proc24(vse._channelNum, idx, vse._sound, 10, vse._sound->_chPan[vse._channelNum]); +						driver->proc24(vse._channelNum, idx, vse._sound, 64, vse._sound->_chDamper[vse._channelNum]); + +						driver->setProgram(vse._channelNum, vse._sound->_chProgram[vse._channelNum]); +						driver->setPitchBlend(vse._channelNum, vse._sound->_chPitchBlend[vse._channelNum]); + +						vse._sound3 = NULL; +					} +				} else { +					vse._sound = NULL; +					vse._channelNum = 0; +					vse._priority = 0; +					vse._fieldA = 0; +				} +			} + +			for (uint idx = 0; idx < vs->_entries.size(); ++idx) { +				VoiceStructEntryType0 &vse = vs->_entries[idx]._type0; +				Sound *sound = vse._sound2; +				int channelNum = vse._channelNum2; + +				if (!sound) +					continue; + +				for (uint entryIndex = 0; entryIndex < vs->_entries.size(); ++entryIndex) { +					if ((vs->_entries[entryIndex]._type0._sound3 != sound) || +						(vs->_entries[entryIndex]._type0._channelNum3 != channelNum)) { +						// Found match +						vs->_entries[entryIndex]._type0._sound = sound; +						vs->_entries[entryIndex]._type0._channelNum = channelNum; +						vs->_entries[entryIndex]._type0._priority = vse._priority2; +						vs->_entries[entryIndex]._type0._fieldA = 0; +						vse._sound2 = NULL; +						break; +					} +				} +			} + +			for (uint idx = 0; idx < vs->_entries.size(); ++idx) { +				VoiceStructEntryType0 &vse = vs->_entries[idx]._type0; +				Sound *sound = vse._sound2; +				if (!sound) +					continue; + +				int voiceNum = 0, foundIndex = -1; +				for (uint entryIndex = 0; entryIndex < vs->_entries.size(); ++entryIndex) { +					if ((vs->_entries[entryIndex]._field1) && !vs->_entries[entryIndex]._type0._sound) { +						int tempVoice = vs->_entries[entryIndex]._voiceNum; + +						if (voiceNum <= tempVoice) { +							voiceNum = tempVoice; +							foundIndex = entryIndex; +						} +					} +				} +				assert(foundIndex != -1); + +				VoiceStructEntryType0 &vseFound = vs->_entries[foundIndex]._type0; + +				vseFound._sound = vse._sound2; +				vseFound._channelNum = vse._channelNum2; +				vseFound._priority = vse._priority2; +				vseFound._fieldA = 0; + +				SoundDriver *driver = vs->_entries[foundIndex]._driver; +				assert(driver); + +				driver->proc24(vseFound._channelNum, voiceIndex, vseFound._sound, 123, 0); +				driver->proc24(vseFound._channelNum, voiceIndex, vseFound._sound, +					1, vseFound._sound->_chModulation[vseFound._channelNum]); +				driver->proc24(vseFound._channelNum, voiceIndex, vseFound._sound, +					7, vseFound._sound->_chVolume[vseFound._channelNum] * vseFound._sound->_volume / 127); +				driver->proc24(vseFound._channelNum, voiceIndex, vseFound._sound,  +					10, vseFound._sound->_chPan[vseFound._channelNum]); +				driver->setProgram(vseFound._channelNum, vseFound._sound->_chProgram[vseFound._channelNum]); +				driver->setPitchBlend(vseFound._channelNum, vseFound._sound->_chPitchBlend[vseFound._channelNum]); +			} + +			// Final loop +			for (uint idx = 0; idx < vs->_entries.size(); ++idx) { +				VoiceStructEntryType0 &vse = vs->_entries[idx]._type0; + +				if (!vse._sound && (vse._sound3)) { +					SoundDriver *driver = vs->_entries[idx]._driver; +					assert(driver); +					driver->proc24(vs->_entries[idx]._voiceNum, voiceIndex, vse._sound3, 123, 0); +				} +			} + +		} else { +			// Type 1 +			for (uint idx = 0; idx < vs->_entries.size(); ++idx) { +				VoiceStructEntry &vse = vs->_entries[idx]; +				vse._type1._sound = NULL; +				vse._type1._channelNum = 0; +				vse._type1._priority = 0; +			} + +			for (uint idx = 0; idx < vs->_entries.size(); ++idx) { +				VoiceStructEntryType1 &vse = vs->_entries[idx]._type1; +				Sound *sound = vse._sound2; +				int channelNum = vse._channelNum2; + +				if (!sound) +					continue; + +				for (uint entryIndex = 0; entryIndex < vs->_entries.size(); ++entryIndex) { +					VoiceStructEntryType1 &vse2 = vs->_entries[entryIndex]._type1; +					if (!vse2._sound && (vse2._sound3 == sound) && (vse2._channelNum3 == channelNum)) { +						vse2._sound = sound; +						vse2._channelNum = channelNum; +						vse._channelNum = vse2._channelNum2; +						vse._priority = vse2._priority2; +						vse._sound2 = NULL; +						break; +					} +				} +			} + +			uint idx2 = 0; +			for (uint idx = 0; idx < vs->_entries.size(); ++idx) { +				VoiceStructEntryType1 &vse = vs->_entries[idx]._type1; +				Sound *sound = vse._sound2; +				if (!sound) +					continue; + +				while (vs->_entries[idx2]._type1._sound) +					++idx2; + +				VoiceStructEntryType1 &vse2 = vs->_entries[idx2]._type1; +				vse2._sound = vse._sound2; +				vse2._channelNum = vse._channelNum2; +				vse2._priority = vse._priority2; +				vse._field4 = -1; +				vse2._field5 = 0; +				vse2._field6 = 0; + +				SoundDriver *driver = vs->_entries[idx2]._driver; +				assert(driver); + +				driver->updateVoice(vs->_entries[idx2]._voiceNum); +				driver->proc38(vs->_entries[idx2]._voiceNum, 1, vse2._sound->_chModulation[vse2._channelNum]); +				driver->proc38(vs->_entries[idx2]._voiceNum, 7,  +					vse2._sound->_chVolume[vse2._channelNum] * vse2._sound->_volume / 127); +				driver->proc38(vs->_entries[idx2]._voiceNum, 10, vse2._sound->_chPan[vse2._channelNum]); +				driver->setPitch(vs->_entries[idx2]._voiceNum, vse2._sound->_chPitchBlend[vse2._channelNum]); +			} + +			for (uint idx = 0; idx < vs->_entries.size(); ++idx) { +				VoiceStructEntryType1 &vse = vs->_entries[idx]._type1; + +				if (!vse._sound && (vse._sound3)) { +					vse._field4 = -1; +					vse._field5 = 0; +					vse._field6 = 0; + +					SoundDriver *driver = vs->_entries[idx]._driver; +					assert(driver); +					driver->updateVoice(voiceIndex); +				} +			} +		} +	} + +	--sfManager()._serverSuspendedCount; +} + +void SoundManager::_sfUpdateVolume(Sound *sound) { +	_sfDereferenceAll(); +	_sfDoUpdateVolume(sound); +} + +void SoundManager::_sfDereferenceAll() { +	// Orignal used handles for both the driver list and voiceStructPtrs list. This method then refreshed  +	// pointer lists based on the handles. Since in ScummVM we're just using pointers directly, this +	// method doesn't need any implementation +} + +void SoundManager::_sfUpdatePriority(Sound *sound) { +	++_soundManager->_serverSuspendedCount;  + +	int tempPriority = (sound->_fixedPriority == 255) ? sound->_sndResPriority : sound->_priority; +	if (sound->_priority != tempPriority) { +		sound->_priority = tempPriority; +		if (_sfDoRemoveFromPlayList(sound)) { +			_sfDoAddToPlayList(sound); +			_sfRethinkVoiceTypes(); +		} +	} + +	--_soundManager->_serverSuspendedCount; +} + +void SoundManager::_sfUpdateLoop(Sound *sound) { +	if (sound->_fixedLoop) +		sound->_loop = sound->_sndResLoop; +	else +		sound->_loop = sound->_fixedLoop; +} + +void SoundManager::_sfSetMasterVol(int volume) { +	if (volume > 127) +		volume = 127; + +	if (volume != _soundManager->_masterVol) { +		_soundManager->_masterVol = volume; + +		for (Common::List<SoundDriver *>::iterator i = _soundManager->_installedDrivers.begin();  +				i != _soundManager->_installedDrivers.end(); ++i) { +			(*i)->setMasterVolume(volume); +		} +	} +} + +void SoundManager::_sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum) { +	trackInfo->_numTracks = 0; + +	const byte *p = soundData + READ_LE_UINT16(soundData + 8); +	uint32 v; +	while ((v = READ_LE_UINT32(p)) != 0) { +		if ((v == 0x80000000) || (v == (uint)groupNum)) { +			// Found group to process +			int count = READ_LE_UINT16(p + 4); +			p += 6; + +			for (int idx = 0; idx < count; ++idx) { +				if (trackInfo->_numTracks == 16) { +					trackInfo->_numTracks = -1; +					return; +				} + +				trackInfo->_chunks[trackInfo->_numTracks] = READ_LE_UINT16(p); +				trackInfo->_voiceTypes[trackInfo->_numTracks] = READ_LE_UINT16(p + 2); +				++trackInfo->_numTracks; +				p += 4; +			} +		} else { +			// Not correct group, so move to next one +			p += 6 + (READ_LE_UINT16(p + 4) * 4); +		} +	} +} + +void SoundManager::_sfTerminate() { + +} + +void SoundManager::_sfExtractGroupMask() { +	uint32 mask = 0; + +	for (Common::List<SoundDriver *>::iterator i = sfManager()._installedDrivers.begin();  +				i != sfManager()._installedDrivers.end(); ++i)  +		mask |= (*i)->_groupMask; + +	_soundManager->_groupsAvail = mask; +} + +bool SoundManager::_sfInstallDriver(SoundDriver *driver) { +	if (!driver->open()) +		return false; +	 +	sfManager()._installedDrivers.push_back(driver); +	driver->_groupOffset = driver->getGroupData(); +	driver->_groupMask =  READ_LE_UINT32(driver->_groupOffset); + +	_sfExtractGroupMask(); +	_sfRethinkSoundDrivers(); +	driver->setMasterVolume(sfManager()._masterVol); + +	return true; +} + +void SoundManager::_sfUnInstallDriver(SoundDriver *driver) { +	sfManager()._installedDrivers.remove(driver); +	delete driver; + +	_sfExtractGroupMask(); +	_sfRethinkSoundDrivers(); +} + +void SoundManager::_sfInstallPatchBank(SoundDriver *driver, const byte *bankData) { +	driver->installPatch(bankData, _vm->_memoryManager.getSize(bankData)); +} + +/** + * Adds the specified sound in the playing sound list, inserting in order of priority + */ +void SoundManager::_sfDoAddToPlayList(Sound *sound) { +	++sfManager()._serverSuspendedCount; + +	Common::List<Sound *>::iterator i = sfManager()._playList.begin(); +	while ((i != sfManager()._playList.end()) && (sound->_priority > (*i)->_priority)) +		++i; + +	sfManager()._playList.insert(i, sound); +	--sfManager()._serverSuspendedCount; +} + +/** + * Removes the specified sound from the play list + */ +bool SoundManager::_sfDoRemoveFromPlayList(Sound *sound) { +	++sfManager()._serverSuspendedCount; + +	bool result = false; +	for (Common::List<Sound *>::iterator i = sfManager()._playList.begin(); i != sfManager()._playList.end(); ++i) { +		if (*i == sound) { +			result = true; +			sfManager()._playList.erase(i); +			break; +		} +	} +	 +	--sfManager()._serverSuspendedCount; +	return result; +} + +void SoundManager::_sfDoUpdateVolume(Sound *sound) { +	++_soundManager->_serverSuspendedCount;  + +	for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { +		VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; +		if (!vs) +			continue; + +		for (uint idx = 0; idx < vs->_entries.size(); ++idx) { +			VoiceStructEntry &vse = vs->_entries[idx]; +			SoundDriver *driver = vse._driver; + +			if (vs->_voiceType == VOICETYPE_0) { +				if (!vse._type0._sound) { +					int vol = sound->_volume * sound->_chVolume[vse._type0._channelNum] / 127; +					driver->proc24(voiceIndex, vse._voiceNum, sound, 7, vol); +				} +			} else { +				if (!vse._type1._sound) { +					int vol = sound->_volume * sound->_chVolume[vse._type1._channelNum] / 127; +					driver->setVolume1(voiceIndex, vse._voiceNum, 7, vol); +				} +			} +		} +	} +	 +	--_soundManager->_serverSuspendedCount; +} + +/*--------------------------------------------------------------------------*/ + +Sound::Sound() { +	_stoppedAsynchronously = false; +	_soundResID = 0; +	_group = 0; +	_sndResPriority = 0; +	_fixedPriority = -1; +	_sndResLoop = true; +	_fixedLoop = true; +	_priority = 0; +	_volume = 127; +	_loop = false; +	_pausedCount = 0; +	_mutedCount = 0; +	_hold = 0xff; +	_cueValue = -1; +	_fadeDest = -1; +	_fadeSteps = 0; +	_fadeTicks = 0; +	_fadeCounter = 0; +	_stopAfterFadeFlag = false; +	_timer = 0; +	_loopTimer = 0; +	_trackInfo._numTracks = 0; +	_primed = false; +	_isEmpty = false; +	_remoteReceiver = NULL; + +	 +	memset(_chProgram, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_chModulation, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_chVolume, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_chPan, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_chDamper, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_chPitchBlend, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_chVoiceType, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_chNumVoices, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_chSubPriority, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_chFlags, 0, SOUND_ARR_SIZE * sizeof(int)); +	Common::set_to(_chWork, _chWork + SOUND_ARR_SIZE, false); +	memset(_channelData, 0, SOUND_ARR_SIZE * sizeof(byte *)); +	memset(_trkChannel, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_trkState, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_trkLoopState, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_trkIndex, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_trkLoopIndex, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_trkRest, 0, SOUND_ARR_SIZE * sizeof(int)); +	memset(_trkLoopRest, 0, SOUND_ARR_SIZE * sizeof(int)); +} + +Sound::~Sound() { +	stop(); +} + +void Sound::play(int soundNum) { +	prime(soundNum); +	_soundManager->addToPlayList(this); +} + +void Sound::stop() { +	_unPrime(); +} + +void Sound::prime(int soundResID) { +	if (_soundResID != -1) { +		stop(); +		_prime(soundResID, false); +	} +} + +void Sound::unPrime() { +	stop(); +} + +void Sound::_prime(int soundResID, bool queueFlag) { +	if (_primed) +		unPrime(); + +	if (_soundResID != -1) { +		// Sound number specified +		_isEmpty = false; +		_remoteReceiver = NULL; +		byte *soundData = _resourceManager->getResource(RES_SOUND, soundResID, 0); +		_soundManager->checkResVersion(soundData); +		_group = _soundManager->determineGroup(soundData); +		_sndResPriority = _soundManager->extractPriority(soundData); +		_sndResLoop = _soundManager->extractLoop(soundData); +		_soundManager->extractTrackInfo(&_trackInfo, soundData, _group); + +		for (int idx = 0; idx < _trackInfo._numTracks; ++idx) { +			_channelData[idx] = _resourceManager->getResource(RES_SOUND, soundResID, _trackInfo._chunks[idx]); +		} + +		DEALLOCATE(soundData); +	} else { +		// No sound specified +		_isEmpty = true; +		_group = 0; +		_sndResPriority = 0; +		_sndResLoop = 0; +		_trackInfo._numTracks = 0; +		_channelData[0] = ALLOCATE(200); +		_remoteReceiver = ALLOCATE(200); +	} + +	_soPrimeSound(queueFlag); +	if (queueFlag) +		_soundManager->addToSoundList(this); + +	_primed = true; +} + +void Sound::_unPrime() { +	if (_primed) { +		if (_isEmpty) { +			DEALLOCATE(_channelData[0]); +			DEALLOCATE(_remoteReceiver); +			_remoteReceiver = NULL; +		} else { +			for (int idx = 0; idx < _trackInfo._numTracks; ++idx) { +				DEALLOCATE(_channelData[idx]); +			} +		} + +		_trackInfo._numTracks = 0; +		if (_soundManager) +			_soundManager->removeFromSoundList(this); + +		_primed = false; +		_stoppedAsynchronously = false; +	} +} + +void Sound::orientAfterDriverChange() { +	if (!_isEmpty) { +		int timeIndex = getTimeIndex(); + +		for (int idx = 0; idx < _trackInfo._numTracks; ++idx) +			DEALLOCATE(_channelData[idx]); +		 +		_trackInfo._numTracks = 0; +		_primed = false; +		_prime(_soundResID, true); +		setTimeIndex(timeIndex); +	} +} + +void Sound::orientAfterRestore() { +	if (_isEmpty) { +		int timeIndex = getTimeIndex(); +		_primed = false; +		_prime(_soundResID, true); +		setTimeIndex(timeIndex); +	} +} + +void Sound::go() { +	if (!_primed) +		error("Attempt to execute Sound::go() on an unprimed Sound"); + +	_soundManager->addToPlayList(this); +} + +void Sound::halt(void) { +	_soundManager->removeFromPlayList(this); +} + +int Sound::getSoundNum() const { +	return _soundResID; +} + +bool Sound::isPlaying() { +	return _soundManager->isOnPlayList(this); +} + +bool Sound::isPrimed() const { +	return _primed; +} + +bool Sound::isPaused() const { +	return _pausedCount != 0; +} + +bool Sound::isMuted() const { +	return _mutedCount != 0; +} + +void Sound::pause(bool flag) { +	_soundManager->suspendSoundServer(); + +	if (flag) +		++_pausedCount; +	else if (_pausedCount > 0) +		--_pausedCount; + +	_soundManager->rethinkVoiceTypes(); +	_soundManager->restartSoundServer(); +} + +void Sound::mute(bool flag) { +	_soundManager->suspendSoundServer(); + +	if (flag) +		++_mutedCount; +	else if (_mutedCount > 0) +		--_mutedCount; + +	_soundManager->rethinkVoiceTypes(); +	_soundManager->restartSoundServer(); +} + +void Sound::fade(int fadeDest, int fadeTicks, int fadeSteps, bool stopAfterFadeFlag) { +	_soundManager->suspendSoundServer(); + +	if (fadeDest > 127) +		fadeDest = 127; +	if (fadeTicks > 127) +		fadeTicks = 127; +	if (fadeSteps > 255) +		fadeSteps = 255; + +	_fadeDest = fadeDest; +	_fadeTicks = fadeTicks; +	_fadeSteps = fadeSteps; +	_fadeCounter = 0; +	_stopAfterFadeFlag = stopAfterFadeFlag; + +	_soundManager->restartSoundServer(); +} + +void Sound::setTimeIndex(uint32 timeIndex) { +	if (_primed) { +		mute(true); +		_soSetTimeIndex(timeIndex); +		mute(false); +	} +} + +uint32 Sound::getTimeIndex() const { +	return _timer; +} + +int Sound::getCueValue() const { +	return _cueValue; +} + +void Sound::setCueValue(int cueValue) { +	_cueValue = cueValue; +} + +void Sound::setVol(int volume) { +	if (volume > 127) +		volume = 127; + +	if (_volume != volume) { +		_volume = volume; +		if (isPlaying()) +			_soundManager->updateSoundVol(this); +	} +} + +int Sound::getVol() const { +	return _volume; +} + +void Sound::setPri(int priority) { +	if (priority > 127) +		priority = 127; +	_fixedPriority = priority; +	_soundManager->updateSoundPri(this); +} + +void Sound::setLoop(bool flag) { +	_fixedLoop = flag; +	_soundManager->updateSoundLoop(this); +} + +int Sound::getPri() const { +	return _priority; +} + +bool Sound::getLoop() { +	return _loop; +} + +void Sound::holdAt(int amount) { +	if (amount > 127) +		amount = 127; +	_hold = amount; +} + +void Sound::release() { +	_hold = -1; +} + +void Sound::_soPrimeSound(bool queueFlag) { +	if (!queueFlag) { +		_priority = (_fixedPriority != -1) ? _fixedPriority : _sndResPriority; +		_loop = !_fixedLoop ? _fixedLoop : _sndResLoop; +		_pausedCount = 0; +		_mutedCount = 0; +		_hold = -1; +		_cueValue = -1; +		_fadeDest = -1; +		_fadeSteps = 0; +		_fadeTicks = 0; +		_fadeCounter = 0; +		_stopAfterFadeFlag = false; +	} + +	_timer = 0; +	_loopTimer = 0; +	_soPrimeChannelData(); +} + +void Sound::_soSetTimeIndex(uint timeIndex) { +	++_soundManager->_serverDisabledCount; + +	if (timeIndex != _timer) { +		_soundManager->_soTimeIndexFlag = true; +		_timer = 0; +		_loopTimer = 0; +		_soPrimeChannelData(); + +		while (timeIndex > 0) { +			if (_soServiceTracks()) { +				SoundManager::_sfDoRemoveFromPlayList(this); +				_stoppedAsynchronously = true; +				_soundManager->_needToRethink = true; +				break; +			} +		} + +		_soundManager->_soTimeIndexFlag = false; +	} + +	--_soundManager->_serverDisabledCount; +} + +bool Sound::_soServiceTracks() { +	if (_isEmpty) { +		_soRemoteReceive(); +		return false; +	}  +	 +	bool flag = true; +	for (int trackCtr = 0; trackCtr < _trackInfo._numTracks; ++trackCtr) { +		int mode = *_channelData[trackCtr]; + +		if (mode == 0) { +			_soServiceTrackType0(trackCtr, _channelData[trackCtr]); +		} else if (mode == 1) { +			_soServiceTrackType1(trackCtr, _channelData[trackCtr]); +		} else { +			error("Unknown sound mode encountered"); +		} + +		if (_trkState[trackCtr]) +			flag = false; +	} + +	++_timer; +	if (!flag) +		return false; +	else if ((_loop > 0) && (--_loop == 0)) +		return true; +	else { +		for (int trackCtr = 0; trackCtr < _trackInfo._numTracks; ++trackCtr) { +			_trkState[trackCtr] = _trkLoopState[trackCtr]; +			_trkRest[trackCtr] = _trkLoopRest[trackCtr]; +			_trkIndex[trackCtr] = _trkLoopIndex[trackCtr]; +		} + +		_timer = _loopTimer; +		return false; +	} +} + +void Sound::_soPrimeChannelData() { +	if (_isEmpty) { +		for (int idx = 0; idx < 16; ++idx) { +			_chProgram[idx] = 0; +			_chModulation[idx] = 0; +			_chVolume[idx] = 127; +			_chPan[idx] = 64; +			_chDamper[idx] = 0; +			_chVoiceType[idx] = VOICETYPE_0; +			_chNumVoices[idx] = 0; +			_chSubPriority[idx] = 0; +			_chPitchBlend[idx] = 0x2000; +			_chFlags[idx] = 1; +		} + +		_trkChannel[0] = 0; +		_trkState[0] = 1; +		_trkLoopState[0] = 1; +		_trkIndex[0] = 0; +		_trkLoopIndex[0] = 0; +	} else { +		for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) +			_chFlags[idx] = 0x8000; + +		for (int idx = 0; idx < _trackInfo._numTracks; ++idx) { +			byte *d = _channelData[idx]; +			int mode = *d;  +			int channelNum = (int8)*(d + 1); + +			_trkChannel[idx] = channelNum; +			assert((channelNum >= -1) && (channelNum < 16)); +			 +			if (channelNum >= 0) { +				_chProgram[channelNum] = *(d + 10); +				_chModulation[channelNum] = 0; +				_chVolume[channelNum] = *(d + 11); +				_chPan[channelNum] = *(d + 12); +				_chDamper[channelNum] = 0; +				_chVoiceType[channelNum] = _trackInfo._voiceTypes[idx]; +				_chNumVoices[channelNum] = *(d + 6); +				_chSubPriority[channelNum] = *(d + 7); +				_chPitchBlend[channelNum] = 0x2000; +				_chFlags[channelNum] = READ_LE_UINT16(d + 8); +			} + +			if (mode == 0) { +				_trkState[idx] = 1; +				_trkLoopState[idx] = 1; +				_trkIndex[idx] = 14; +				_trkLoopIndex[idx] = 14; +				_trkRest[idx] = 0; +				_trkLoopRest[idx] = 0; +			} else if (mode == 1) { +				_trkState[idx] = 1; +				_trkLoopState[idx] = 1; +				_trkIndex[idx] = 0; +				_trkLoopIndex[idx] = 0; +				_trkRest[idx] = 0; +				_trkLoopRest[idx] = 0; +			} else { +				error("Unknown sound mode encountered"); +			} +		} +	} +} + +void Sound::_soRemoteReceive() { +	error("_soRemoteReceive not implemented"); +} + +void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { +	if (_trkRest[trackIndex]) { +		--_trkRest[trackIndex]; +		return; +	} +	if (!_trkState[trackIndex]) +		return; + +	int channelNum = _trkChannel[trackIndex]; +	assert((channelNum >= 0) && (channelNum < SOUND_ARR_SIZE)); +	int chFlags = (channelNum == -1) ? 0 : _chFlags[channelNum]; +	int voiceNum = -1; +	SoundDriver *driver = NULL; +	 +	VoiceTypeStruct *vtStruct; +	VoiceType voiceType = VOICETYPE_0, chVoiceType = VOICETYPE_0; + +	if ((channelNum == -1) || _soundManager->_soTimeIndexFlag) { +		vtStruct = NULL; +		voiceType = VOICETYPE_0; +	} else { +		chVoiceType = (VoiceType)_chVoiceType[channelNum]; +		vtStruct = _soundManager->_voiceTypeStructPtrs[(int)chVoiceType]; + +		if (vtStruct) { +			voiceType = vtStruct->_voiceType; +			if (voiceType == VOICETYPE_0) { +				for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { +					if (!vtStruct->_entries[idx]._type0._sound &&  +							(vtStruct->_entries[idx]._type0._channelNum != channelNum)) { +						voiceNum = vtStruct->_entries[idx]._voiceNum; +						driver = vtStruct->_entries[idx]._driver; +						break; +					} +				} +			} +		} +	} + +	const byte *pData = channelData + _trkIndex[trackIndex]; + +	for (;;) { +		byte v = *pData++;  +		if (!(v & 0x80)) { +			// Area #1 +			if (!_soundManager->_soTimeIndexFlag) { +				// Only do processing if fast forwarding to a given time index +				if (channelNum != -1) { +					if (voiceType == VOICETYPE_1) { +						_soUpdateDamper(vtStruct, channelNum, chVoiceType, v); +					} else if (voiceNum != -1) { +						assert(driver); +						driver->proc18(voiceNum, chVoiceType); +					} +				} +			}		 +		} else if (!(v & 0x40)) { +			// Area #2 +			if (!_soundManager->_soTimeIndexFlag) { +				// Only do processing if fast forwarding to a given time index +				byte b = *pData++; +				v <<= 1; +				if (b & 0x80) +					v |= 1; + +				b &= 0x7f; + +				if (channelNum != -1) { +					if (voiceType == VOICETYPE_1) { +						// TODO: sub_25E32/sub_25DD8 +						if (chFlags & 0x10) +							_soProc42(vtStruct, channelNum, chVoiceType, v); +						else +							_soProc32(vtStruct, channelNum, chVoiceType, v, b); +					} else if (voiceNum != -1) { +						assert(driver); +						driver->proc20(voiceNum, chVoiceType); +					} +				} +			} else { +				++pData; +			} +		} else if (!(v & 0x20)) { +			// Area #3 +			v &= 0x1f; + +			// Gather up an extended number +			int trkRest = v; +			while ((*pData & 0xE0) == 0xC0) { +				byte b = *pData++; +				trkRest = (trkRest << 5) | (b & 0x1f); +			} + +			_trkRest[trackIndex] = trkRest - 1; +			_trkIndex[trackIndex] = pData - channelData; +			return; +		} else if (!(v & 0x10)) { +			// Area #4 +			v = (v & 0xf) << 1; +			 +			byte b = *pData++; +			if (b & 0x80) +				v |= 1; +			b &= 0x7f; + +			assert(v < 4); +			int cmdList[32] = { 1, 7, 10, 64 }; +			int cmdVal = cmdList[v]; + +			if (channelNum == -1) { +				if (_soDoUpdateTracks(cmdVal, b)) +					return; +			} else { +				_soDoTrackCommand(_trkChannel[trackIndex], cmdVal, b); + +				if (!_soundManager->_soTimeIndexFlag) { +					if (cmdVal == 7) +						b = static_cast<byte>(_volume * (int)b / 127); + +					if (voiceType != VOICETYPE_0) { +						_soProc38(vtStruct, channelNum, chVoiceType, cmdVal, b); +					} else if (voiceNum != -1) { +						assert(driver); +						driver->proc24(voiceNum, chVoiceType, this, cmdVal, b); +					} +				} +			} +		} else if (!(v & 0x8)) { +			// Area #5 +			if (!_soundManager->_soTimeIndexFlag) { +				// Only do processing if fast forwarding to a given time index +				int cx = READ_LE_UINT16(pData); +				pData += 2; + +				if (channelNum != -1) { +					assert(driver); +					driver->proc22(voiceNum, chVoiceType, cx); +				} +			} else { +				pData += 2; +			} +		} else if (!(v & 0x4)) { +			// Area #6 +			int cmd = *pData++; +			int value = *pData++; + +			if (channelNum != -1) { +				_soDoTrackCommand(_trkChannel[trackIndex], cmd, value); + +				if (!_soundManager->_soTimeIndexFlag) { +					if (voiceType != VOICETYPE_0) { +						_soProc38(vtStruct, channelNum, chVoiceType, cmd, value); +					} else if (voiceNum != -1) { +						assert(driver); +						driver->proc24(voiceNum, chVoiceType, this, cmd, value); +					} +				} +			} else if (_soDoUpdateTracks(cmd, value)) { +				return; +			} +		} else if (!(v & 0x2)) { +			// Area #7 +			if (!_soundManager->_soTimeIndexFlag) { +				int pitchBlend = READ_BE_UINT16(pData); +				pData += 2; + +				if (channelNum != -1) { +					int channel = _trkChannel[trackIndex]; +					_chPitchBlend[channel] = pitchBlend; + +					if (voiceType != VOICETYPE_0) { +						_soProc40(vtStruct, channelNum, pitchBlend); +					} else if (voiceNum != -1) { +						assert(driver); +						driver->setPitchBlend(channel, pitchBlend); +					} +				} +			} else { +				pData += 2; +			} +		} else if (!(v & 0x1)) { +			// Area #8 +			int program = *pData++; + +			if (channelNum != -1) { +				int channel = _trkChannel[trackIndex]; +				_chProgram[channel] = program; + +				if (!_soundManager->_soTimeIndexFlag) { +					if ((voiceType == VOICETYPE_0) && (voiceNum != -1)) { +						assert(driver); +						driver->setProgram(voiceNum, program); +					} +				} +			} else { +				_soSetTrackPos(trackIndex, pData - channelData, program);  +			} + +		} else { +			// Area #9 +			byte b = *pData++; + +			if (b & 0x80) { +				_trkState[trackIndex] = 0; +				_trkIndex[trackIndex] = pData - channelData; +				return; +			} + +			if (!_soundManager->_soTimeIndexFlag) { +				if ((channelNum != -1) && (voiceType == VOICETYPE_0) && (voiceNum != -1)) { +					assert(driver); +					driver->setVolume1(voiceNum, chVoiceType, 0, b); +				} + +			} +		} +	} +} + +void Sound::_soUpdateDamper(VoiceTypeStruct *voiceType, int channelNum, VoiceType mode, int v0) { +	bool hasDamper = _chDamper[channelNum] != 0; + +	for (uint idx = 0; idx < voiceType->_entries.size(); ++idx) { +		VoiceStructEntryType1 &vte = voiceType->_entries[idx]._type1; + +		if ((vte._field4 == v0) && (vte._channelNum == channelNum) && (vte._sound == this)) { +			if (hasDamper) +				vte._field5 = 1; +			else { +				SoundDriver *driver = voiceType->_entries[idx]._driver; +				assert(driver); + +				vte._field4 = -1; +				vte._field5 = 0; +				driver->updateVoice(voiceType->_entries[idx]._voiceNum); +			} +			return; +		} +	} +} + +void Sound::_soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0, int v1) { +	int entryIndex = _soFindSound(vtStruct, channelNum); +	if (entryIndex != -1) { +		SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; +		assert(driver); + +		vtStruct->_entries[entryIndex]._type1._field6 = 0; +		vtStruct->_entries[entryIndex]._type1._field4 = v0; +		vtStruct->_entries[entryIndex]._type1._field5 = 0; + +		driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, _chProgram[channelNum], v0, v1); +	} +} + +void Sound::_soProc42(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0) { +	for (int trackCtr = 0; trackCtr < _trackInfo._numTracks; ++trackCtr) { +		const byte *instrument = _channelData[trackCtr]; +		if ((*(instrument + 13) == v0) && (*instrument == 1)) { +			int entryIndex = _soFindSound(vtStruct, channelNum); + +			if (entryIndex != -1) { +				SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; +				assert(driver); + +				vtStruct->_entries[entryIndex]._type1._field6 = 0; +				vtStruct->_entries[entryIndex]._type1._field4 = v0; +				vtStruct->_entries[entryIndex]._type1._field5 = 0; + +				driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, -1, v0, 0x7F); +				driver->proc42(vtStruct->_entries[entryIndex]._voiceNum, voiceType, 0); +			} +			break; +		} +	} +} + +void Sound::_soProc38(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int cmd, int value) { +	if (cmd == 64) { +		if (value == 0) { +			for (uint entryIndex = 0; entryIndex < vtStruct->_entries.size(); ++entryIndex) { +				VoiceStructEntryType1 &vte = vtStruct->_entries[entryIndex]._type1; + +				if ((vte._sound == this) && (vte._channelNum == channelNum) && (vte._field5 != 0)) { +					SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; +					assert(driver); + +					vte._field4 = -1; +					vte._field5 = 0; +					driver->updateVoice(vtStruct->_entries[entryIndex]._voiceNum); +				} +			} +		} +	} else if (cmd == 75) { +		_soundManager->_needToRethink = true; +	} else { +		for (uint entryIndex = 0; entryIndex < vtStruct->_entries.size(); ++entryIndex) { +			VoiceStructEntry &vte = vtStruct->_entries[entryIndex]; + +			if ((vte._type1._sound == this) && (vte._type1._channelNum == channelNum)) { +				SoundDriver *driver = vte._driver; +				assert(driver); + +				driver->proc38(vte._voiceNum, cmd, value); +			} +		} +	} +} + +void Sound::_soProc40(VoiceTypeStruct *vtStruct, int channelNum, int pitchBlend) { +	for (uint entryIndex = 0; entryIndex < vtStruct->_entries.size(); ++entryIndex) { +		VoiceStructEntryType1 &vte = vtStruct->_entries[entryIndex]._type1; + +		if ((vte._sound == this) && (vte._channelNum == channelNum)) { +			SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; +			assert(driver); + +			driver->setPitch(vtStruct->_entries[entryIndex]._voiceNum, pitchBlend); +		} +	} +} + +void Sound::_soDoTrackCommand(int channelNum, int command, int value) { +	switch (command) { +	case 1: +		_chModulation[channelNum] = value; +		break; +	case 7: +		_chVolume[channelNum] = value; +		break; +	case 10: +		_chPan[channelNum] = value; +		break; +	case 64: +		_chDamper[channelNum] = value; +		break; +	case 75: +		_chNumVoices[channelNum] = value; +		break; +	} +} + +bool Sound::_soDoUpdateTracks(int command, int value) { +	if ((command == 76) || (_hold != value)) +		return false; +	 +	for (int trackIndex = 0; trackIndex < _trackInfo._numTracks; ++trackIndex) { +		_trkState[trackIndex] = _trkLoopState[trackIndex]; +		_trkRest[trackIndex] = _trkLoopRest[trackIndex]; +		_trkIndex[trackIndex] = _trkLoopIndex[trackIndex]; +	} + +	_timer = _loopTimer; +	return true; +} + +void Sound::_soSetTrackPos(int trackIndex, int trackPos, int cueValue) { +	_trkIndex[trackIndex] = trackPos; +	if (cueValue == 127) { +		if (!_soundManager->_soTimeIndexFlag) +			_cueValue = cueValue; +	} else { +		for (int idx = 0; idx < _trackInfo._numTracks; ++idx) { +			_trkLoopState[idx] = _trkState[idx]; +			_trkLoopRest[idx] = _trkRest[idx]; +			_trkLoopIndex[idx] = _trkIndex[idx]; +		} + +		_loopTimer = _timer; +	} +} + +void Sound::_soServiceTrackType1(int trackIndex, const byte *channelData) { +	if (_soundManager->_soTimeIndexFlag || !_trkState[trackIndex]) +		return; + +	int channel = _trkChannel[trackIndex]; +	if (channel == -1) +		_trkState[trackIndex] = 0; +	else { +		int voiceType = _chVoiceType[channel]; +		VoiceTypeStruct *vtStruct = _soundManager->_voiceTypeStructPtrs[voiceType]; + +		if (!vtStruct) +			_trkState[trackIndex] = 0; +		else { +			if (vtStruct->_voiceType != VOICETYPE_0) { +				if (_trkState[trackIndex] == 1) { +					int entryIndex = _soFindSound(vtStruct, *(channelData + 1)); +					if (entryIndex != -1) { +						SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; +						assert(driver); + +						vtStruct->_entries[entryIndex]._type1._field6 = 0; +						vtStruct->_entries[entryIndex]._type1._field4 = *(channelData + 1); +						vtStruct->_entries[entryIndex]._type1._field5 = 0; + +						driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, -1, *(channelData + 1), 0x7f);  +					} +				} else { + +				} +			} +		} +	} +} + +int Sound::_soFindSound(VoiceTypeStruct *vtStruct, int channelNum) { +	int entryIndex = -1, entry2Index = -1; +	int v6 = 0, v8 = 0; + +	for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { +		VoiceStructEntryType1 &vte = vtStruct->_entries[idx]._type1; +		if ((vte._channelNum == channelNum) && (vte._sound == this)) { +			int v = vte._field6; +			if (vte._field4 != -1) { +				if (v8 <= v) { +					v8 = v; +					entry2Index = idx; +				} +			} else { +				if (v6 <= v) { +					v6 = v; +					entryIndex = idx; +				} +			} +		} +	} + +	if (entryIndex != -1) +		return entryIndex; +	else if ((entryIndex == -1) && (entry2Index == -1)) +		return -1; +	else { +		SoundDriver *driver = vtStruct->_entries[entry2Index]._driver; +		assert(driver); +		driver->updateVoice(vtStruct->_entries[entry2Index]._voiceNum); + +		return entry2Index; +	} +} + +/*--------------------------------------------------------------------------*/ + +ASound::ASound(): EventHandler() { +	_action = NULL; +	_cueValue = -1; +} + +void ASound::synchronize(Serializer &s) { +	EventHandler::synchronize(s); + +	SYNC_POINTER(_action); +	s.syncAsByte(_cueValue); +} + +void ASound::dispatch() { +	EventHandler::dispatch(); + +	int cueValue = _sound.getCueValue(); +	if (cueValue != -1) { +		_cueValue = cueValue; +		_sound.setCueValue(-1); + +		if (_action) +			_action->signal(); +	} + +	if (_cueValue != -1) { +		if (!_sound.isPrimed()) { +			_cueValue = -1; +			if (_action) { +				_action->signal(); +				_action = NULL; +			} +		} +	} +} + +void ASound::play(int soundNum, Action *action, int volume) { +	_action = action; +	_cueValue = 0; +	 +	setVol(volume); +	_sound.play(soundNum); +} + +void ASound::stop() { +	_sound.stop(); +	_action = NULL; +} + +void ASound::prime(int soundResID, Action *action) { +	_action = action; +	_cueValue = 0; +	_sound.prime(soundResID); +} + +void ASound::unPrime() { +	_sound.unPrime(); +	_action = NULL; +} + +void ASound::fade(int v1, int v2, int v3, int v4, Action *action) { +	if (action) +		_action = action; + +	_sound.fade(v1, v2, v3, v4); +} + + +/*--------------------------------------------------------------------------*/ + +SoundDriver::SoundDriver() { +	_driverResID = 0; +	_minVersion = _maxVersion = 0; +	_groupMask = 0; +} + +/*--------------------------------------------------------------------------*/ + +const byte adlib_group_data[] = { 1, 1, 9, 1, 0xff }; + +const byte v440B0[9] = { 0, 1, 2, 6, 7, 8, 12, 13, 14 }; + +const byte v440B9[9] = { 3, 4, 5, 9, 10, 11, 15, 16, 17 }; + +const byte v440C2[18] = {  +	0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21 +}; + +const byte v44134[64] = { +	0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, +	33, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, +	46, 47, 47, 48, 49, 50, 50, 51, 52, 52, 53, 54, 54, 55,  +	56, 56, 57, 57, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, +	61, 62, 62, 62, 62, 63, 63, 63 +}; + +const int v440D4[48] = { +	343, 348, 353, 358, 363, 369, 374, 379, 385, 391, 396, +	402, 408, 414, 420, 426, 432, 438, 445, 451, 458, 465, +	471, 478, 485, 492, 499, 507, 514, 521, 529, 537, 544, +	552, 560, 569, 577, 585, 594, 602, 611, 620, 629, 638, +	647, 657, 666, 676 +}; + +AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { +	_minVersion = 0x102; +	_maxVersion = 0x10A; +	_masterVolume = 0; + +	_groupData.groupMask = 9; +	_groupData.v1 = 0x46; +	_groupData.v2 = 0; +	_groupData.pData = &adlib_group_data[0]; + +	_mixer = _vm->_mixer; +	_sampleRate = _mixer->getOutputRate(); +	_opl = makeAdLibOPL(_sampleRate); + +	Common::set_to(_channelVoiced, _channelVoiced + ADLIB_CHANNEL_COUNT, false); +	memset(_channelVolume, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); +	memset(_v4405E, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); +	memset(_v44067, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); +	memset(_v44070, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); +	memset(_v44079, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); +	memset(_v44082, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); +	_v44082[ADLIB_CHANNEL_COUNT] = 0x90; +	Common::set_to(_pitchBlend, _pitchBlend + ADLIB_CHANNEL_COUNT, 0x2000); +	memset(_v4409E, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); +	_patchData = NULL; +} + +AdlibSoundDriver::~AdlibSoundDriver() { +	DEALLOCATE(_patchData); +	OPLDestroy(_opl); +} + +bool AdlibSoundDriver::open() { +	write(1, 0x20); +	if (!reset()) +		return false; + +	write(8, 0); +	for (int idx = 0x20; idx < 0xF6; ++idx) +		write(idx, 0); + +	write(0xBD, 0); +	return true; +} + +void AdlibSoundDriver::close() { +	for (int idx = 0xB0; idx < 0xB8; ++idx) +		write(idx, _portContents[idx] & 0xDF); +	for (int idx = 0x40; idx < 0x55; ++idx) +		write(idx, 0x3F); +	reset(); +} + +bool AdlibSoundDriver::reset() { +	write(1, 0x20); +	write(4, 0x80); + +	write(2, 1); +	write(4, 1); + +	return true; +} + +const GroupData *AdlibSoundDriver::getGroupData() { +	return &_groupData; +} + +void AdlibSoundDriver::installPatch(const byte *data, int size) { +	byte *patchData = ALLOCATE(size); +	Common::copy(data, data + size, patchData); +	_patchData = patchData; +} + +int AdlibSoundDriver::setMasterVolume(int volume) { +	int oldVolume = _masterVolume; +	_masterVolume = volume; + +	for (int channelNum = 0; channelNum < ADLIB_CHANNEL_COUNT; ++channelNum) +		updateChannelVolume(channelNum); + +	return oldVolume; +} + +void AdlibSoundDriver::proc32(int channel, int program, int v0, int v1) { +	if (program == -1) +		return; + +	int offset = READ_LE_UINT16(_patchData + program * 2); +	if (offset) { +		const byte *dataP = _patchData + offset; + +		for (int offset = 2, id = 0; id != READ_LE_UINT16(dataP); offset += 30, ++id) { +			if ((dataP[offset] <= v0) && (dataP[offset + 1] >= v0)) { +				if (dataP[offset + 2] != 0xff) +					v0 = dataP[offset + 2]; + +				_v4409E[channel] = dataP + offset - _patchData; + +				// Set sustain/release +				int portNum = v440C2[v440B0[channel]] + 0x80; +				write(portNum, (_portContents[portNum] & 0xF0) | 0xF); + +				portNum = v440C2[v440B9[channel]] + 0x80; +				write(portNum, (_portContents[portNum] & 0xF0) | 0xF); + +				if (_channelVoiced[channel]) +					clearVoice(channel); + +				_v44067[channel] = v0; +				_v4405E[channel] = v1; + +				updateChannel(channel); +				setFrequency(channel); +				updateChannelVolume(channel); +				setVoice(channel); +				break; +			} +		} +	} +} + +void AdlibSoundDriver::updateVoice(int channel) { +	if (_channelVoiced[channel]) +		clearVoice(channel); +} + +void AdlibSoundDriver::proc38(int channel, int cmd, int value) { +	if (cmd == 7) { +		// Set channel volume +		_channelVolume[channel] = value; +		updateChannelVolume(channel); +	} +} + +void AdlibSoundDriver::setPitch(int channel, int pitchBlend) { +	_pitchBlend[channel] = pitchBlend; +	setFrequency(channel); +} + +void AdlibSoundDriver::write(byte reg, byte value) { +	_portContents[reg] = value; +	OPLWriteReg(_opl, reg, value); +} + +void AdlibSoundDriver::updateChannelVolume(int channelNum) { +	int volume = (_masterVolume * _channelVolume[channelNum] / 127 * _v4405E[channelNum] / 127) / 2; +	int level2 = 63 - v44134[volume * _v44079[channelNum] / 63]; +	int level1 = !_v44082[channelNum] ? 63 - _v44070[channelNum] : +		63 - v44134[volume * _v44070[channelNum] / 63]; + +	int portNum = v440C2[v440B0[channelNum]] + 0x40;  +	write(portNum, (_portContents[portNum] & 0x80) | level1); + +	portNum = v440C2[v440B9[channelNum]] + 0x40; +	write(portNum, (_portContents[portNum] & 0x80) | level2); +} + +void AdlibSoundDriver::setVoice(int channel) { +	int portNum = 0xB0 + channel; +	write(portNum, _portContents[portNum] | 0x20); +	_channelVoiced[channel] = true; +} + +void AdlibSoundDriver::clearVoice(int channel) { +	write(0xB0 + channel, _portContents[0xB0 + channel] & ~0x20); +	_channelVoiced[channel] = false; +} + +void AdlibSoundDriver::updateChannel(int channel) { +	const byte *dataP = _patchData + _v4409E[channel]; +	int portOffset = v440C2[v440B0[channel]]; + +	int portNum = portOffset + 0x20; +	int portValue = 0; +	if (*(dataP + 4)) +		portValue |= 0x80; +	if (*(dataP + 5)) +		portValue |= 0x40; +	if (*(dataP + 8)) +		portValue |= 0x20; +	if (*(dataP + 6)) +		portValue |= 0x10; +	portValue |= *(dataP + 7); +	write(portNum, portValue); + +	portValue = (_portContents[0x40 + portOffset] & 0x3F) | (*(dataP + 9) << 6); +	write(0x40 + portOffset, portValue); + +	_v44070[channel] = 63 - *(dataP + 10); +	write(0x60 + portOffset, *(dataP + 12) | (*(dataP + 11) << 4)); +	write(0x80 + portOffset, *(dataP + 14) | (*(dataP + 13) << 4)); +	write(0xE0 + portOffset, (_portContents[0xE0 + portOffset] & 0xFC) | *(dataP + 15)); + +	portOffset = v440C2[v440B9[channel]]; +	portNum = portOffset + 0x20; +	portValue = 0; +	if (*(dataP + 17)) +		portValue |= 0x80; +	if (*(dataP + 18)) +		portValue |= 0x40; +	if (*(dataP + 21)) +		portValue |= 0x20; +	if (*(dataP + 19)) +		portValue |= 0x10; +	portValue |= *(dataP + 20); +	write(portNum, portValue); + +	write(0x40 + portOffset, (_portContents[0x40 + portOffset] & 0x3f) | (*(dataP + 22) << 6)); +	_v44079[channel] = 0x3F - *(dataP + 23); +	write(0x60 + portOffset, *(dataP + 25) | (*(dataP + 24) << 4)); +	write(0x80 + portOffset, *(dataP + 27) | (*(dataP + 26) << 4)); +	write(0xE0 + portOffset, (_portContents[0xE0 + portOffset] & 0xFC) | *(dataP + 28)); + +	write(0xC0 + channel, (_portContents[0xC0 + channel] & 0xF0)  +		| (*(dataP + 16) << 1) | *(dataP + 3)); + +	_v44082[channel] = *(dataP + 3); +} + +void AdlibSoundDriver::setFrequency(int channel) { +	int offset, ch; + +	int v = _pitchBlend[channel]; +	if (v == 0x2000) { +		offset = 0; +		ch = _v44067[channel]; +	} else if (v > 0x2000) { +		ch = _v44067[channel]; +		v -= 0x2000; +		if (v == 0x1fff) +			v = 0x2000; +		 +		offset = (v / 170) & 3; +		ch += (v / 170) >> 2; + +		if (ch >= 128) +			ch = 127; +	} else { +		ch = _v44067[channel]; +		int tempVal = (0x2000 - v) / 170; +		int tempVal2 = 4 - (tempVal & 3); + +		if (tempVal2 == 4) +			offset = 0; +		else { +			offset = tempVal2; +			--ch; +		} + +		ch -= tempVal >> 2; +		if (ch < 0) +			ch = 0; +	} + +	int var2 = ch / 12; +	if (var2) +		--var2; + +	int dataWord = v440D4[((ch % 12) << 2) + offset]; +	write(0xA0 + channel, dataWord & 0xff); +	write(0xB0 + channel, (_portContents[0xB0 + channel] & 0xE0) |  +		((dataWord >> 8) & 3) | (var2 << 2));  }  } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 03ae77b703..4bef27d2c9 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -24,21 +24,409 @@  #define TSAGE_SOUND_H  #include "common/scummsys.h" +#include "audio/audiostream.h" +#include "audio/fmopl.h" +#include "audio/mixer.h" +#include "common/list.h"  #include "tsage/saveload.h" +#include "tsage/core.h"  namespace tSage { +class Sound; + +#define SOUND_ARR_SIZE 16 +#define ROLAND_DRIVER_NUM 2 +#define ADLIB_DRIVER_NUM 3 + +struct trackInfoStruct { +	int _numTracks; +	int _chunks[SOUND_ARR_SIZE]; +	int _voiceTypes[SOUND_ARR_SIZE]; +}; + +enum SoundDriverStatus {SNDSTATUS_FAILED = 0, SNDSTATUS_DETECTED = 1, SNDSTATUS_SKIPPED = 2}; +enum VoiceType {VOICETYPE_0 = 0, VOICETYPE_1 = 1}; + +class SoundDriverEntry { +public: +	int driverNum; +	SoundDriverStatus status; +	int field2, field6; +	Common::String shortDescription; +	Common::String longDescription; +}; + +struct GroupData { +	uint32 groupMask; +	byte v1; +	byte v2; +	const byte *pData; +}; + +class SoundDriver { +public: +	Common::String _shortDescription, _longDescription; +	int _minVersion, _maxVersion; +	// The following fields were originally held in separate arrays in the SoundManager class +	uint32 _groupMask; +	const GroupData *_groupOffset; +	int _driverResID; +public: +	SoundDriver(); + +	const Common::String &getShortDriverDescription() { return _shortDescription; } +	const Common::String &getLongDriverDescription() { return _longDescription; } + +	virtual bool open() { return true; }						// Method #0 +	virtual void close() {}										// Method #1 +	virtual bool reset() { return true; }						// Method #2 +	virtual const GroupData *getGroupData() { return NULL; }	// Method #3 +	virtual void installPatch(const byte *data, int size) {}	// Method #4 +	virtual void poll() {}										// Method #5 +	virtual void proc12() {}									// Method #6 +	virtual int setMasterVolume(int volume) { return 0; }		// Method #7 +	virtual void proc16() {}									// Method #8 +	virtual void proc18(int al, VoiceType voiceType) {}			// Method #9 +	virtual void proc20(int al, VoiceType voiceType) {}			// Method #10 +	virtual void proc22(int al, VoiceType voiceType, int v3) {}	// Method #11 +	virtual void proc24(int channel, int voiceIndex, Sound *sound, int v1, int v2) {} +	virtual void setProgram(int channel, int program) {}			// Method #13 +	virtual void setVolume1(int channel, int v2, int v3, int volume) {} +	virtual void setPitchBlend(int channel, int pitchBlend) {}		// Method #15 +	virtual void proc32(int channel, int program, int v0, int v1) {}// Method #16 +	virtual void updateVoice(int channel) {}						// Method #17 +	virtual void proc36() {}										// Method #18 +	virtual void proc38(int channel, int cmd, int value) {}			// Method #19 +	virtual void setPitch(int channel, int pitchBlend) {}			// Method #20 +	virtual void proc42(int channel, int v0, int v1) {}				// Method #21 +}; + +struct VoiceStructEntryType0 { +	Sound *_sound; +	int _channelNum; +	int _priority; +	int _fieldA; +	Sound *_sound2; +	int _channelNum2; +	int _priority2; +	int _field12; +	Sound *_sound3; +	int _channelNum3; +	int _priority3; +	int _field1A; +	int _field1B; +}; + +struct VoiceStructEntryType1 { +	int _field4; +	int _field5; +	int _field6; +	Sound *_sound; +	int _channelNum; +	int _priority; +	Sound *_sound2; +	int _channelNum2; +	int _priority2; +	Sound *_sound3; +	int _channelNum3; +	int _priority3; +}; + +struct VoiceStructEntry { +	int _voiceNum; +	int _field1; +	SoundDriver *_driver; + +	VoiceStructEntryType0 _type0; +	VoiceStructEntryType1 _type1; +}; + +class VoiceTypeStruct { +public: +	VoiceType _voiceType; +	int _total; +	int _numVoices; +	int _field3; + +	Common::Array<VoiceStructEntry> _entries; +}; +  class SoundManager : public SaveListener { +private: +	SoundDriver *instantiateDriver(int driverNum); +public: +	bool __sndmgrReady; +	int _ourSndResVersion, _ourDrvResVersion; +	Common::List<Sound *> _playList; +	Common::List<SoundDriver *> _installedDrivers; +	VoiceTypeStruct *_voiceTypeStructPtrs[SOUND_ARR_SIZE]; +	uint32 _groupsAvail; +	int _masterVol; +	int _serverDisabledCount; +	int _serverSuspendedCount; +	int _suspendedCount; +	bool _driversDetected; +	Common::List<Sound *> _soundList; +	Common::List<SoundDriverEntry> _availableDrivers; +	bool _needToRethink; +	// Misc flags +	bool _soTimeIndexFlag;  public: -	void dispatch() {} +	SoundManager(); +	~SoundManager(); + +	void dispatch();  	virtual void listenerSynchronize(Serializer &s);  	virtual void postInit(); +	void syncSounds(); -	void proc2() {}  	static void saveNotifier(bool postFlag);  	void saveNotifierProc(bool postFlag);  	static void loadNotifier(bool postFlag);  	void loadNotifierProc(bool postFlag); + +	void installConfigDrivers(); +	Common::List<SoundDriverEntry> &buildDriverList(bool detectFlag); +	Common::List<SoundDriverEntry> &getDriverList(bool detectFlag); +	void dumpDriverList(); +	void installDriver(int driverNum); +	bool isInstalled(int driverNum) const; +	void unInstallDriver(int driverNum); +	void disableSoundServer(); +	void enableSoundServer(); +	void suspendSoundServer(); +	void restartSoundServer(); +	void checkResVersion(const byte *soundData); +	int determineGroup(const byte *soundData); +	int extractPriority(const byte *soundData); +	int extractLoop(const byte *soundData); +	bool isOnPlayList(Sound *sound); +	void extractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum); +	void addToSoundList(Sound *sound); +	void removeFromSoundList(Sound *sound); +	void addToPlayList(Sound *sound); +	void removeFromPlayList(Sound *sound); +	void rethinkVoiceTypes(); +	void updateSoundVol(Sound *sound); +	void updateSoundPri(Sound *sound); +	void updateSoundLoop(Sound *sound); +	void setMasterVol(int volume); +	int getMasterVol() const; +	void loadSound(int soundNum, bool showErrors); +	void unloadSound(int soundNum); + +	// _sf methods +	static SoundManager &sfManager(); +	static void _sfTerminate(); +	static int _sfDetermineGroup(const byte *soundData); +	static void _sfAddToPlayList(Sound *sound); +	static void _sfRemoveFromPlayList(Sound *sound); +	static bool _sfIsOnPlayList(Sound *sound); +	static void _sfRethinkSoundDrivers(); +	static void _sfRethinkVoiceTypes(); +	static void _sfUpdateVolume(Sound *sound); +	static void _sfDereferenceAll(); +	static void _sfUpdatePriority(Sound *sound); +	static void _sfUpdateLoop(Sound *sound); +	static void _sfSetMasterVol(int volume); +	static void _sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum); +	static void _sfExtractGroupMask(); +	static bool _sfInstallDriver(SoundDriver *driver); +	static void _sfUnInstallDriver(SoundDriver *driver); +	static void _sfInstallPatchBank(SoundDriver *driver, const byte *bankData); +	static void _sfDoAddToPlayList(Sound *sound); +	static bool _sfDoRemoveFromPlayList(Sound *sound); +	static void _sfDoUpdateVolume(Sound *sound); +	static void _sfSoundServer(); +	static void _sfProcessFading(); +	static void _sfUpdateVoiceStructs(); +	static void _sfUpdateVoiceStructs2(); +}; + +class Sound: public EventHandler { +private: +	void _prime(int soundResID, bool queueFlag); +	void _unPrime(); +	void orientAfterRestore(); +public: +	bool _stoppedAsynchronously; +	int _soundResID; +	int _group; +	int _sndResPriority; +	int _fixedPriority; +	bool _sndResLoop; +	bool _fixedLoop; +	int _priority; +	int _volume; +	int _loop; +	int _pausedCount; +	int _mutedCount; +	int _hold; +	int _cueValue; +	int _fadeDest; +	int _fadeSteps; +	int _fadeTicks; +	int _fadeCounter; +	bool _stopAfterFadeFlag; +	uint _timer; +	int _loopTimer; +	int _chProgram[SOUND_ARR_SIZE]; +	int _chModulation[SOUND_ARR_SIZE]; +	int _chVolume[SOUND_ARR_SIZE]; +	int _chPan[SOUND_ARR_SIZE]; +	int _chDamper[SOUND_ARR_SIZE]; +	int _chPitchBlend[SOUND_ARR_SIZE]; +	int _chVoiceType[SOUND_ARR_SIZE]; +	int _chNumVoices[SOUND_ARR_SIZE]; +	int _chSubPriority[SOUND_ARR_SIZE]; +	int _chFlags[SOUND_ARR_SIZE]; +	bool _chWork[SOUND_ARR_SIZE]; +	trackInfoStruct _trackInfo; +	byte *_channelData[SOUND_ARR_SIZE]; +	int _trkChannel[SOUND_ARR_SIZE]; +	int _trkState[SOUND_ARR_SIZE]; +	int _trkLoopState[SOUND_ARR_SIZE]; +	int _trkIndex[SOUND_ARR_SIZE]; +	int _trkLoopIndex[SOUND_ARR_SIZE]; +	int _trkRest[SOUND_ARR_SIZE]; +	int _trkLoopRest[SOUND_ARR_SIZE]; + +	bool _primed; +	bool _isEmpty; +	byte *_remoteReceiver; +public: +	Sound(); +	~Sound(); + +	void play(int soundResID); +	void stop(); +	void prime(int soundResID); +	void unPrime(); +	void go(); +	void halt(void); +	bool isPlaying(); +	int getSoundNum() const; +	bool isPrimed() const; +	bool isPaused() const; +	bool isMuted() const; +	void pause(bool flag); +	void mute(bool flag); +	void fade(int fadeDest, int fadeTicks, int fadeSteps, bool stopAfterFadeFlag); +	void setTimeIndex(uint32 timeIndex); +	uint32 getTimeIndex() const; +	int getCueValue() const; +	void setCueValue(int cueValue); +	void setVol(int volume); +	int getVol() const; +	void setPri(int priority); +	void setLoop(bool flag); +	int getPri() const; +	bool getLoop(); +	void holdAt(int amount); +	void release(); +	void orientAfterDriverChange(); + +	// _so methods +	void _soPrimeSound(bool queueFlag); +	void _soSetTimeIndex(uint timeIndex); +	bool _soServiceTracks(); +	void _soPrimeChannelData(); +	void _soRemoteReceive(); +	void _soServiceTrackType0(int trackIndex, const byte *channelData); +	void _soUpdateDamper(VoiceTypeStruct *voiceType, int channelNum, VoiceType mode, int v0); +	void _soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0, int v1); +	void _soProc42(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0); +	void _soProc38(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int cmd, int value); +	void _soProc40(VoiceTypeStruct *vtStruct, int channelNum, int pitchBlend); +	void _soDoTrackCommand(int channelNum, int command, int value); +	bool _soDoUpdateTracks(int command, int value); +	void _soSetTrackPos(int trackIndex, int trackPos, int cueValue); + +	void _soServiceTrackType1(int trackIndex, const byte *channelData); +	int _soFindSound(VoiceTypeStruct *vtStruct, int channelNum); +}; + +class ASound: public EventHandler { +public: +	Sound _sound; +	Action *_action; +	int _cueValue; + +	ASound(); +	virtual void synchronize(Serializer &s); +	virtual void dispatch(); + +	void play(int soundNum, Action *action = NULL, int volume = 127); +	void stop(); +	void prime(int soundNum, Action *action = NULL); +	void unPrime(); +	void go() { _sound.go(); } +	void hault(void) { _sound.halt(); } +	bool isPlaying() { return _sound.isPlaying(); } +	int getSoundNum() const { return _sound.getSoundNum(); } +	bool isPaused() const { return _sound.isPaused(); } +	bool isMuted() const { return _sound.isMuted(); } +	void pause(bool flag) { _sound.pause(flag); } +	void mute(bool flag) { _sound.mute(flag); } +	void fadeIn() { fade(127, 5, 10, 0, NULL); } +	void fadeOut(Action *action) { fade(0, 5, 10, 1, action); } +	void fade(int v1, int v2, int v3, int v4, Action *action);  +	void setTimeIndex(uint32 timeIndex) { _sound.setTimeIndex(timeIndex); } +	uint32 getTimeIndex() const { return _sound.getTimeIndex(); } +	void setPri(int v) { _sound.setPri(v); } +	void setLoop(bool flag) { _sound.setLoop(flag); } +	int getPri() const { return _sound.getPri(); } +	bool getLoop() { return _sound.getLoop(); } +	void setVol(int volume) { _sound.setVol(volume); } +	int getVol() const { return _sound.getVol(); } +	void holdAt(int v) { _sound.holdAt(v); } +	void release() { _sound.release(); } +}; + +#define ADLIB_CHANNEL_COUNT 9 + +class AdlibSoundDriver: public SoundDriver { +private: +	GroupData _groupData; +	Audio::Mixer *_mixer; +	FM_OPL *_opl; +	int _sampleRate; +	byte _portContents[256]; +	const byte *_patchData; +	int _masterVolume; + +	bool _channelVoiced[ADLIB_CHANNEL_COUNT]; +	int _channelVolume[ADLIB_CHANNEL_COUNT]; +	int _v4405E[ADLIB_CHANNEL_COUNT]; +	int _v44067[ADLIB_CHANNEL_COUNT]; +	int _v44070[ADLIB_CHANNEL_COUNT]; +	int _v44079[ADLIB_CHANNEL_COUNT]; +	int _v44082[ADLIB_CHANNEL_COUNT + 1]; +	int _pitchBlend[ADLIB_CHANNEL_COUNT]; +	int _v4409E[ADLIB_CHANNEL_COUNT]; + + +	void write(byte reg, byte value); +	void updateChannelVolume(int channel); +	void setVoice(int channel); +	void clearVoice(int channel); +	void updateChannel(int channel); +	void setFrequency(int channel); +public: +	AdlibSoundDriver(); +	~AdlibSoundDriver(); + +	virtual bool open(); +	virtual void close(); +	virtual bool reset(); +	virtual const GroupData *getGroupData(); +	virtual void installPatch(const byte *data, int size); +	virtual int setMasterVolume(int volume); +	virtual void proc32(int channel, int program, int v0, int v1); +	virtual void updateVoice(int channel); +	virtual void proc38(int channel, int cmd, int value); +	virtual void setPitch(int channel, int pitchBlend);  };  } // End of namespace tSage diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp index 50ce0ce4be..41f3d58897 100644 --- a/engines/tsage/tsage.cpp +++ b/engines/tsage/tsage.cpp @@ -81,12 +81,17 @@ void TSageEngine::initialize() {  	_globals = new Globals();  	_globals->gfxManager().setDefaults(); + +	// Setup sound settings +	syncSoundSettings();  }  void TSageEngine::deinitialize() {  	delete _globals;  	delete _resourceManager;  	delete _saver; +	_resourceManager = NULL; +	_saver = NULL;  }  Common::Error TSageEngine::run() { @@ -136,4 +141,10 @@ Common::String TSageEngine::generateSaveName(int slot) {  	return Common::String::format("%s.%03d", _targetName.c_str(), slot);  } +void TSageEngine::syncSoundSettings() { +	Engine::syncSoundSettings(); + +	_globals->_soundManager.syncSounds(); +} +  } // End of namespace tSage diff --git a/engines/tsage/tsage.h b/engines/tsage/tsage.h index 5db45f24ab..f004c7f625 100644 --- a/engines/tsage/tsage.h +++ b/engines/tsage/tsage.h @@ -51,7 +51,9 @@ enum {  };  enum { -	kRingDebugScripts = 1 << 0 +	kRingDebugScripts = 1 << 0, +	ktSageSound = 1 << 1, +	ktSageCore = 1 << 2  };  struct tSageGameDescription; @@ -83,6 +85,7 @@ public:  	virtual bool canSaveGameStateCurrently();  	virtual Common::Error loadGameState(int slot);  	virtual Common::Error saveGameState(int slot, const Common::String &desc); +	virtual void syncSoundSettings();  	Common::String generateSaveName(int slot);  	void initialize(); | 
