From 34fe545dc7f619a40cffa207b8660ecb0c027c1f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 27 Apr 2011 21:23:47 +1000 Subject: TSAGE: Created stub classes for ASound and Sound, and reworked engine to use proper named methods --- engines/tsage/converse.cpp | 2 +- engines/tsage/converse.h | 3 +- engines/tsage/core.cpp | 46 ++----- engines/tsage/core.h | 69 ---------- engines/tsage/globals.h | 3 +- engines/tsage/ringworld_demo.cpp | 2 +- engines/tsage/ringworld_demo.h | 3 +- engines/tsage/ringworld_logic.cpp | 2 +- engines/tsage/ringworld_scenes1.cpp | 148 ++++++++++---------- engines/tsage/ringworld_scenes1.h | 21 +-- engines/tsage/ringworld_scenes10.cpp | 42 +++--- engines/tsage/ringworld_scenes10.h | 8 +- engines/tsage/ringworld_scenes2.cpp | 36 ++--- engines/tsage/ringworld_scenes2.h | 4 +- engines/tsage/ringworld_scenes3.cpp | 252 +++++++++++++++++------------------ engines/tsage/ringworld_scenes3.h | 20 +-- engines/tsage/ringworld_scenes4.cpp | 8 +- engines/tsage/ringworld_scenes4.h | 2 +- engines/tsage/ringworld_scenes5.cpp | 88 ++++++------ engines/tsage/ringworld_scenes5.h | 10 +- engines/tsage/ringworld_scenes6.cpp | 36 ++--- engines/tsage/ringworld_scenes6.h | 8 +- engines/tsage/ringworld_scenes8.cpp | 48 +++---- engines/tsage/ringworld_scenes8.h | 14 +- engines/tsage/sound.cpp | 91 +++++++++++++ engines/tsage/sound.h | 43 ++++++ 26 files changed, 524 insertions(+), 485 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/converse.cpp b/engines/tsage/converse.cpp index 7183266cf4..5c6050a363 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 fd2abcd872..12fde5819c 100644 --- a/engines/tsage/converse.h +++ b/engines/tsage/converse.h @@ -28,6 +28,7 @@ #include "tsage/core.h" #include "tsage/dialogs.h" +#include "tsage/sound.h" namespace tSage { @@ -53,7 +54,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 e56cadb68a..36e2961aca 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -32,6 +32,7 @@ #include "tsage/scenes.h" #include "tsage/staticres.h" #include "tsage/globals.h" +#include "tsage/sound.h" namespace tSage { @@ -2911,53 +2912,22 @@ int SceneRegions::indexOf(const Common::Point &pt) { /*--------------------------------------------------------------------------*/ -SoundHandler::SoundHandler() { +ASound::ASound() { _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(); - } +void ASound::synchronise(Serialiser &s) { + EventHandler::synchronise(s); - 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; - } - } - } + SYNC_POINTER(_action); + s.syncAsSint16LE(_field280); } -void SoundHandler::startSound(int soundNum, Action *action, int volume) { - _action = action; - _field280 = 0; - setVolume(volume); - _sound.startSound(soundNum); - - warning("TODO: SoundHandler::startSound"); +void ASound::dispatch() { + } - /*--------------------------------------------------------------------------*/ void SceneItemList::addItems(SceneItem *first, ...) { diff --git a/engines/tsage/core.h b/engines/tsage/core.h index e1ff95dcdd..38ca269c9c 100644 --- a/engines/tsage/core.h +++ b/engines/tsage/core.h @@ -36,7 +36,6 @@ #include "tsage/graphics.h" #include "tsage/resources.h" #include "tsage/saveload.h" -#include "tsage/sound.h" namespace tSage { @@ -720,74 +719,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 SynchronisedList { public: void addItems(SceneItem *first, ...); diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h index 9e9ddd58d7..49aaf595c5 100644 --- a/engines/tsage/globals.h +++ b/engines/tsage/globals.h @@ -31,6 +31,7 @@ #include "tsage/dialogs.h" #include "tsage/scenes.h" #include "tsage/events.h" +#include "tsage/sound.h" #include "tsage/saveload.h" namespace tSage { @@ -60,7 +61,7 @@ public: SynchronisedList _sceneListeners; bool _flags[256]; Player _player; - SoundHandler _soundHandler; + ASound _soundHandler; InvObjectList *_inventory; Region _paneRegions[2]; int _paneRefreshFlag[2]; diff --git a/engines/tsage/ringworld_demo.cpp b/engines/tsage/ringworld_demo.cpp index 29438c0347..77aabe9e1f 100644 --- a/engines/tsage/ringworld_demo.cpp +++ b/engines/tsage/ringworld_demo.cpp @@ -40,7 +40,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 63ffe56555..2653cd621c 100644 --- a/engines/tsage/ringworld_demo.h +++ b/engines/tsage/ringworld_demo.h @@ -31,6 +31,7 @@ #include "tsage/core.h" #include "tsage/scenes.h" #include "tsage/globals.h" +#include "tsage/sound.h" namespace tSage { @@ -40,7 +41,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 0a2220c690..a2691beca3 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld_logic.cpp @@ -1323,7 +1323,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 fd51670fb8..b5c0d7a893 100644 --- a/engines/tsage/ringworld_scenes1.cpp +++ b/engines/tsage/ringworld_scenes1.cpp @@ -101,7 +101,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(); @@ -188,7 +188,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) { @@ -235,7 +235,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: @@ -259,7 +259,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); } @@ -279,7 +279,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; @@ -344,8 +344,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); @@ -403,8 +403,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; @@ -453,7 +453,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); @@ -466,7 +466,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); @@ -490,7 +490,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); @@ -509,7 +509,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); @@ -552,15 +552,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)); @@ -608,7 +608,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); } @@ -672,7 +672,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; @@ -696,14 +696,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; @@ -735,7 +735,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; @@ -775,12 +775,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); @@ -958,7 +958,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(); @@ -979,7 +979,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(); @@ -1014,7 +1014,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); @@ -1027,7 +1027,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)); @@ -1046,7 +1046,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(); @@ -1060,7 +1060,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); @@ -1086,7 +1086,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); @@ -1106,7 +1106,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: @@ -1237,11 +1237,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); @@ -1273,7 +1273,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(); @@ -1325,7 +1325,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); @@ -1483,7 +1483,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,14 +3000,14 @@ void Scene6100::Action5::dispatch() { (tempSet.sqrt(floatSet) < 150.0)) { switch (scene->_hitCount++) { case 1: - scene->_soundHandler.startSound(233); + scene->_soundHandler.play(233); scene->showMessage(0, NULL, 0); if (!_globals->getFlag(76)) scene->_object5.setAction(&scene->_action2); case 2: - scene->_soundHandler.startSound(234); + scene->_soundHandler.play(234); scene->showMessage(0, NULL, 0); if (!_globals->getFlag(76)) @@ -3016,7 +3016,7 @@ void Scene6100::Action5::dispatch() { break; default: - scene->_soundHandler.startSound(233); + scene->_soundHandler.play(233); scene->showMessage(0, NULL, 0); if (!_globals->getFlag(76)) @@ -3216,7 +3216,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 be6d8e6337..81efe28f53 100644 --- a/engines/tsage/ringworld_scenes1.h +++ b/engines/tsage/ringworld_scenes1.h @@ -33,6 +33,7 @@ #include "tsage/core.h" #include "tsage/scenes.h" #include "tsage/globals.h" +#include "tsage/sound.h" namespace tSage { @@ -68,7 +69,7 @@ class Scene15 : public Scene { public: Action1 _action1; SceneObject _object1; - SoundHandler _soundHandler; + ASound _soundHandler; virtual void postInit(SceneObjectList *OwnerList = NULL); }; @@ -100,7 +101,7 @@ public: Action3 _action3; Action4 _action4; SceneObject _sceneObject1, _SceneObjectExt, _sceneObject3, _sceneObject4, _sceneObject5; - SoundHandler _sound; + ASound _sound; public: Scene20(); virtual ~Scene20() {} @@ -146,7 +147,7 @@ class Scene30 : public Scene { }; public: - SoundHandler _sound; + ASound _sound; DisplayHotspot _groundHotspot, _wallsHotspot, _courtyardHotspot, _treeHotspot; BeamObject _beam; DoorObject _door; @@ -235,7 +236,7 @@ public: SpeakerQText _speakerQText; SpeakerSText _speakerSText; SpeakerGameText _speakerGameText; - SoundHandler _soundHandler; + ASound _soundHandler; Action1 _action1; Action2 _action2; Action3 _action3; @@ -390,9 +391,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); @@ -426,7 +427,7 @@ public: DisplayObject _object3, _object4, _object5; SceneObject _object6; DisplayHotspot _item1, _item2, _item3; - SoundHandler _soundHandler1, _soundHandler2; + ASound _soundHandler1, _soundHandler2; Scene90(); @@ -445,7 +446,7 @@ public: Action1 _action1; int _field326; SceneObject _object1, _object2, _object3; - SoundHandler _soundHandler; + ASound _soundHandler; Scene95(); virtual void postInit(SceneObjectList *OwnerList); @@ -507,7 +508,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 045ea71586..dd5f7fecca 100644 --- a/engines/tsage/ringworld_scenes10.cpp +++ b/engines/tsage/ringworld_scenes10.cpp @@ -155,7 +155,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(); @@ -240,7 +240,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; @@ -274,7 +274,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)) { @@ -406,7 +406,7 @@ void Scene9200::postInit(SceneObjectList *OwnerList) { _object1.animate(ANIM_MODE_2, 0); _object1.setPosition(Common::Point(132, 114), 0); _object1.setPriority2(140); - _soundHandler.startSound(297); + _soundHandler.play(297); _stripManager.addSpeaker(&_speakerQText); _stripManager.addSpeaker(&_speakerGR); _stripManager.addSpeaker(&_speakerGText); @@ -479,7 +479,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 +509,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); @@ -763,7 +763,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 { @@ -1072,7 +1072,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); @@ -1128,7 +1128,7 @@ void Scene9500::postInit(SceneObjectList *OwnerList) { setZoomPercents(110, 75, 200, 150); _globals->_player.postInit(); - _globals->_soundHandler.startSound(305); + _globals->_soundHandler.play(305); _candle.postInit(0); _candle.setVisage(9500); @@ -1236,7 +1236,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; } @@ -1294,7 +1294,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); @@ -1426,7 +1426,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); } } @@ -1438,7 +1438,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); } } @@ -1450,7 +1450,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); } } @@ -1639,7 +1639,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; @@ -1658,7 +1658,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: @@ -1829,7 +1829,7 @@ void Scene9900::signal() { switch (_sceneMode){ case 150: - _globals->_soundHandler.startSound(380); + _globals->_soundHandler.play(380); _object8.postInit(0); _object8.setVisage(2002); _object8.setStrip(1); @@ -1862,7 +1862,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; @@ -1893,7 +1893,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); @@ -1904,7 +1904,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); @@ -2055,7 +2055,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 2f5ce0f825..43f0938439 100644 --- a/engines/tsage/ringworld_scenes10.h +++ b/engines/tsage/ringworld_scenes10.h @@ -132,7 +132,7 @@ public: SpeakerGText _speakerGText; SpeakerGR _speakerGR; SpeakerQText _speakerQText; - SoundHandler _soundHandler; + ASound _soundHandler; SceneHotspot1 _hotspot1; NamedHotspot _hotspot2; NamedHotspot _hotspot3; @@ -233,7 +233,7 @@ public: NamedHotspot _hotspot4; NamedHotspot _hotspot5; NamedHotspot _hotspot6; - SoundHandler _soundHandler; + ASound _soundHandler; int _field1032; SceneHotspot7 _hotspot7; SceneHotspot8 _hotspot8; @@ -426,7 +426,7 @@ public: SceneObject _objLever; Object6 _objScimitar; Object7 _objSword; - SoundHandler _soundHandler; + ASound _soundHandler; NamedHotspot _hotspot1; NamedHotspot _hotspot2; NamedHotspot _hotspot3; @@ -483,7 +483,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 3e3686e2d5..746d0df676 100644 --- a/engines/tsage/ringworld_scenes2.cpp +++ b/engines/tsage/ringworld_scenes2.cpp @@ -123,7 +123,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); } @@ -212,7 +212,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); @@ -265,7 +265,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(); @@ -281,7 +281,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); @@ -427,7 +427,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); @@ -444,7 +444,7 @@ void Scene1001::Action1::signal() { break; } case 17: { - scene->_soundHandler1.startSound(90); + scene->_soundHandler1.play(90); scene->_object6.remove(); scene->_object7.postInit(); @@ -473,7 +473,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, true, 0); @@ -493,7 +493,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: @@ -523,7 +523,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); } @@ -644,7 +644,7 @@ void Scene1250::postInit(SceneObjectList *OwnerList) { setAction(&_action4); } else { setAction(&_action3); - _globals->_soundHandler.startSound(114); + _globals->_soundHandler.play(114); } } @@ -731,7 +731,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; @@ -776,7 +776,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); } /*-------------------------------------------------------------------------- @@ -839,7 +839,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); @@ -847,13 +847,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; } @@ -890,7 +890,7 @@ void Scene1500::Action2::signal() { break; } case 3: - scene->_soundHandler.proc4(); + scene->_soundHandler.release(); _globals->_stripNum = 1505; _globals->_sceneManager.changeScene(2400); break; @@ -904,7 +904,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 75843d3570..9c781a94d6 100644 --- a/engines/tsage/ringworld_scenes2.h +++ b/engines/tsage/ringworld_scenes2.h @@ -75,7 +75,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); }; @@ -137,7 +137,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 4ed2d98662..296eebe653 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -132,11 +132,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); @@ -151,7 +151,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; @@ -311,12 +311,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(); @@ -327,7 +327,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); @@ -336,7 +336,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; @@ -428,11 +428,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: @@ -440,12 +440,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; } @@ -505,7 +505,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: { @@ -554,7 +554,7 @@ void Scene2100::Action1::signal() { } } - scene->_soundHandler.startSound(161); + scene->_soundHandler.play(161); scene->_area1.restore(); scene->_area2.restore(); scene->_area3.restore(); @@ -563,7 +563,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; @@ -579,7 +579,7 @@ void Scene2100::Action1::signal() { break; case 7: _globals->_player.setPriority2(-1); - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_6, this); break; case 8: @@ -777,17 +777,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); @@ -848,7 +848,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: { @@ -881,7 +881,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.setPriority2(-1); @@ -1094,7 +1094,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; @@ -1103,7 +1103,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); @@ -1134,7 +1134,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: { @@ -1148,7 +1148,7 @@ void Scene2100::Action14::signal() { setDelay(30); case 13: scene->_object3.setPriority2(1); - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_6, this); break; case 14: @@ -1177,7 +1177,7 @@ void Scene2100::Action15::signal() { scene->_object3.setPriority2(1); scene->_object3.changeZoom(-1); - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_5, this); break; case 2: { @@ -1188,7 +1188,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); @@ -1248,7 +1248,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: { @@ -1263,7 +1263,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: @@ -1292,17 +1292,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); @@ -1676,8 +1676,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.setPriority2(-1); _globals->_player.setPriority2(-1); _globals->_player.setPosition(Common::Point(80, 66)); @@ -1744,8 +1744,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)) @@ -1763,8 +1763,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); @@ -1782,8 +1782,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(); @@ -1799,8 +1799,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)); @@ -1818,8 +1818,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.setPriority2(1); @@ -1846,8 +1846,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(); @@ -1858,8 +1858,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); @@ -1871,8 +1871,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); @@ -1889,8 +1889,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; @@ -2053,7 +2053,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 @@ -2084,7 +2084,7 @@ void Scene2120::Action1::dispatch() { setDelay(30); } - scene->_soundHandler.startSound(159); + scene->_soundHandler.play(159); } // Previous Page button handling @@ -2111,7 +2111,7 @@ void Scene2120::Action1::dispatch() { break; } - scene->_soundHandler.startSound(159); + scene->_soundHandler.play(159); } // Exit button handling @@ -2141,7 +2141,7 @@ void Scene2120::Action1::dispatch() { setDelay(1); } - scene->_soundHandler.startSound(159); + scene->_soundHandler.play(159); } } @@ -2209,7 +2209,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: { @@ -2259,7 +2259,7 @@ void Scene2150::Action1::signal() { } } - scene->_soundHandler.startSound(161); + scene->_soundHandler.play(161); scene->_area1.restore(); scene->_area2.restore(); scene->_area3.restore(); @@ -2268,7 +2268,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; @@ -2283,7 +2283,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: @@ -2310,10 +2310,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: @@ -2338,7 +2338,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(); @@ -2537,8 +2537,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: @@ -2687,7 +2687,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); @@ -2704,7 +2704,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); @@ -2860,7 +2860,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); } @@ -2921,8 +2921,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(); @@ -2962,9 +2962,9 @@ void Scene2200::postInit(SceneObjectList *OwnerList) { _hotspot4.setPriority2(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); @@ -3117,7 +3117,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); @@ -3203,7 +3203,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; @@ -3227,7 +3227,7 @@ void Scene2230::Action3::signal() { NpcMover *mover = new NpcMover(); _globals->_player.addMover(mover, &pt, this); - scene->_soundHandler.proc3(); + scene->_soundHandler.stop(); break; } case 1: @@ -3346,7 +3346,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); @@ -3429,7 +3429,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; @@ -3752,7 +3752,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: { @@ -3767,7 +3767,7 @@ void Scene2280::Action1::signal() { break; case 4: _globals->_player.setPriority2(1); - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_hotspot16.animate(ANIM_MODE_6, this); break; case 5: @@ -3788,7 +3788,7 @@ void Scene2280::Action2::signal() { break; } case 1: - scene->_soundHandler.startSound(265); + scene->_soundHandler.play(265); _globals->_player.setVisage(2162); _globals->_player._frame = 1; @@ -3808,7 +3808,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; @@ -3836,7 +3836,7 @@ void Scene2280::Action3::signal() { break; } case 1: - scene->_soundHandler.startSound(265); + scene->_soundHandler.play(265); _globals->_player.setVisage(2162); _globals->_player._frame = 6; @@ -4316,8 +4316,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, @@ -4367,7 +4367,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(); @@ -4405,7 +4405,7 @@ void Scene2300::Action1::signal() { break; } case 6: - scene->_soundHandler1.startSound(28); + scene->_soundHandler1.play(28); _globals->_player.disableControl(); scene->_hotspot2.setVisage(40); @@ -4419,7 +4419,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); @@ -4446,7 +4446,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; @@ -4463,7 +4463,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); @@ -4540,8 +4540,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; @@ -4584,8 +4584,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; @@ -4597,7 +4597,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); @@ -4618,7 +4618,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(); @@ -4628,7 +4628,7 @@ void Scene2300::Action4::signal() { scene->_hotspot9.setPosition(Common::Point(273, 199)); scene->_hotspot9.setPriority2(19); scene->_hotspot9.animate(ANIM_MODE_5, this); - scene->_soundHandler1.startSound(11); + scene->_soundHandler1.play(11); break; case 2: scene->_hotspot8.remove(); @@ -4639,10 +4639,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; } @@ -4718,7 +4718,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(); @@ -4749,8 +4749,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); @@ -5032,7 +5032,7 @@ void Scene2320::Action2::signal() { switch (_actionIndex++) { case 0: { - scene->_soundHandler.startSound(253); + scene->_soundHandler.play(253); scene->_hotspot13.setPriority2(99); Common::Point pt(scene->_hotspot13._position.x, 200); @@ -5058,7 +5058,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: { @@ -5107,7 +5107,7 @@ void Scene2320::Action3::signal() { } } - scene->_soundHandler.startSound(161); + scene->_soundHandler.play(161); scene->_area1.restore(); scene->_area2.restore(); scene->_area3.restore(); @@ -5116,7 +5116,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; @@ -5132,7 +5132,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: @@ -5217,8 +5217,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(); @@ -5277,7 +5277,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); @@ -5428,7 +5428,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: @@ -5857,8 +5857,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.setPriority2(-1); _globals->_player.setPosition(Common::Point(389, 72)); @@ -5875,8 +5875,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); @@ -5892,8 +5892,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); @@ -5904,9 +5904,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); @@ -5963,8 +5963,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); @@ -6095,7 +6095,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 2cbe8de65b..8cb8374361 100644 --- a/engines/tsage/ringworld_scenes3.h +++ b/engines/tsage/ringworld_scenes3.h @@ -117,7 +117,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); @@ -235,7 +235,7 @@ class Scene2100 : public Scene { }; public: SequenceManager _sequenceManager; - SoundHandler _soundHandler; + ASound _soundHandler; SpeakerMText _speakerMText; SpeakerMR _speakerMR; SpeakerQL _speakerQL; @@ -313,7 +313,7 @@ class Scene2120 : public Scene { }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SceneObject _topicArrowHotspot, _arrowHotspot, _visageHotspot; SceneObject _subjectButton, _nextPageButton, _previousPageButton, _exitButton; Action1 _action1; @@ -360,7 +360,7 @@ class Scene2150 : public Scene { virtual void doAction(int action); }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SequenceManager _sequenceManager; SpeakerGameText _speakerGameText; @@ -441,7 +441,7 @@ public: DisplayHotspot _hotspot10; SceneObject _hotspot2, _hotspot4; SceneObject _hotspot6, _hotspot7, _hotspot8; - SoundHandler _soundHandler1, _soundHandler2; + ASound _soundHandler1, _soundHandler2; Scene2200(); virtual void postInit(SceneObjectList *OwnerList = NULL); @@ -463,7 +463,7 @@ class Scene2222 : public Scene { }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SpeakerSText _speakerSText; SpeakerMText _speakerMText; SpeakerQText _speakerQText; @@ -553,7 +553,7 @@ class Scene2230 : public Scene { virtual void doAction(int action); }; public: - SoundHandler _soundHandler; + ASound _soundHandler; Action1 _action1; Action2 _action2; Action3 _action3; @@ -653,7 +653,7 @@ class Scene2280 : public Scene { }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SequenceManager _sequenceManager; Rect _exitRect; Action1 _action1; @@ -713,7 +713,7 @@ class Scene2300 : public Scene { virtual void doAction(int action); }; public: - SoundHandler _soundHandler1, _soundHandler2; + ASound _soundHandler1, _soundHandler2; SpeakerSL _speakerSL; SpeakerMText _speakerMText; SpeakerQText _speakerQText; @@ -835,7 +835,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 89feb223a1..f8338f24cd 100644 --- a/engines/tsage/ringworld_scenes4.cpp +++ b/engines/tsage/ringworld_scenes4.cpp @@ -181,7 +181,7 @@ void Scene3700::Action1::signal() { setDelay(90); break; case 3: - scene->_soundHandler.startSound(196); + scene->_soundHandler.play(196); scene->_viewer.hide(); scene->_hotspot1.postInit(); @@ -193,7 +193,7 @@ void Scene3700::Action1::signal() { setDelay(90); break; case 4: - scene->_soundHandler.startSound(197); + scene->_soundHandler.play(197); scene->_hotspot1.hide(); scene->_hotspot2.postInit(); @@ -205,7 +205,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); @@ -247,7 +247,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 f5dac297fc..ab9c5011be 100644 --- a/engines/tsage/ringworld_scenes4.h +++ b/engines/tsage/ringworld_scenes4.h @@ -85,7 +85,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 910a35e492..d7a4e770f0 100644 --- a/engines/tsage/ringworld_scenes5.cpp +++ b/engines/tsage/ringworld_scenes5.cpp @@ -105,7 +105,7 @@ void Scene4000::Action1::signal() { ADD_MOVER(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); @@ -349,14 +349,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); @@ -422,7 +422,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); @@ -485,12 +485,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; } @@ -856,7 +856,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); @@ -889,7 +889,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(); @@ -951,7 +951,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { } if (_globals->_stripNum == 4025) { - _soundHandler1.startSound(182); + _soundHandler1.play(182); _forceField.remove(); _hotspot5.postInit(); @@ -1029,7 +1029,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { break; case 4050: - _globals->_soundHandler.startSound(155); + _globals->_soundHandler.play(155); _globals->_player.disableControl(); if (_globals->_stripNum == 4050) { @@ -1066,7 +1066,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { break; default: - _globals->_soundHandler.startSound(155); + _globals->_soundHandler.play(155); _lander.postInit(); _lander.setVisage(4002); @@ -1090,7 +1090,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); @@ -1229,8 +1229,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); } @@ -1873,7 +1873,7 @@ void Scene4045::postInit(SceneObjectList *OwnerList) { _olloFace.setPriority2(152); if(_globals->_sceneManager._previousScene == 4050) { - _globals->_soundHandler.startSound(155); + _globals->_soundHandler.play(155); _globals->_player.setPosition(Common::Point(72, 128)); _globals->_player.enableControl(); @@ -2247,7 +2247,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); @@ -2258,7 +2258,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: @@ -2272,7 +2272,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; @@ -2691,7 +2691,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); @@ -3065,8 +3065,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() { @@ -3080,7 +3080,7 @@ void Scene4150::dispatch() { Scene::dispatch(); if (!_action && (_globals->_player._position.x >= 316)) { - _globals->_soundHandler.proc1(NULL); + _globals->_soundHandler.fadeOut(NULL); _globals->_player.disableControl(); _sceneMode = 4152; setAction(&_sequenceManager, this, 4152, &_globals->_player, NULL); @@ -3382,7 +3382,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; @@ -3410,7 +3410,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; @@ -3618,7 +3618,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() { @@ -3654,7 +3654,7 @@ void Scene4250::signal() { case 4263: break; case 4259: - _globals->_soundHandler.startSound(360); + _globals->_soundHandler.play(360); _globals->_sceneManager.changeScene(9900); break; case 4261: @@ -3717,36 +3717,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; @@ -3759,7 +3759,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(); @@ -3881,7 +3881,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) || @@ -3947,7 +3947,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; @@ -4206,11 +4206,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(); @@ -4234,7 +4234,7 @@ void Scene4301::Action1::signal() { break; case 10: _globals->_events.setCursor(CURSOR_NONE); - scene->_soundHandler.startSound(337); + scene->_soundHandler.play(337); if (scene->_hotspot3._flags & OBJFLAG_HIDE) scene->_hotspot3.show(); else @@ -4249,7 +4249,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; @@ -4258,7 +4258,7 @@ void Scene4301::Action1::signal() { break; case 20: _globals->_player.disableControl(); - scene->_soundHandler.startSound(339); + scene->_soundHandler.play(339); scene->_hotspot3._frame = 3; if (scene->_hotspot3._flags & OBJFLAG_HIDE) scene->_hotspot3.show(); @@ -4291,7 +4291,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 e3d1ae08b5..2353b843c6 100644 --- a/engines/tsage/ringworld_scenes5.h +++ b/engines/tsage/ringworld_scenes5.h @@ -137,7 +137,7 @@ class Scene4000 : public Scene { }; public: SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; - SoundHandler _soundHandler1, _soundHandler2; + ASound _soundHandler1, _soundHandler2; SpeakerQR _speakerQR; SpeakerML _speakerML; SpeakerMR _speakerMR; @@ -473,7 +473,7 @@ class Scene4150 : public Scene { public: SequenceManager _sequenceManager; - SoundHandler _soundHandler; + ASound _soundHandler; SpeakerQText _speakerQText; SpeakerQR _speakerQR; SpeakerCDL _speakerCDL; @@ -543,7 +543,7 @@ class Scene4250 : public Scene { public: SequenceManager _sequenceManager; - SoundHandler _soundHandler; + ASound _soundHandler; SpeakerSR _speakerSR; SpeakerSL _speakerSL; SpeakerSText _speakerSText; @@ -615,7 +615,7 @@ class Scene4300 : public Scene { virtual void doAction(int action); }; public: - SoundHandler _soundHandler1, _soundHandler2; + ASound _soundHandler1, _soundHandler2; SequenceManager _sequenceManager; GfxButton _gfxButton; SpeakerQText _speakerQText; @@ -674,7 +674,7 @@ class Scene4301 : public Scene { public: Common::List _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 6bb2605de5..a7bcc00cbb 100644 --- a/engines/tsage/ringworld_scenes6.cpp +++ b/engines/tsage/ringworld_scenes6.cpp @@ -44,8 +44,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: @@ -58,7 +58,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: @@ -563,7 +563,7 @@ void Scene5000::postInit(SceneObjectList *OwnerList) { break; } - _globals->_soundHandler.startSound(190); + _globals->_soundHandler.play(190); } void Scene5000::signal() { @@ -640,7 +640,7 @@ void Scene5100::Action1::signal() { } break; case 4: - scene->_soundHandler.startSound(206); + scene->_soundHandler.play(206); scene->_hotspot5.postInit(); scene->_hotspot5.setVisage(5362); @@ -739,7 +739,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(_owner)->_position.x < _globals->_player._position.x) { scene->_hotspot2.setVisage(5130); scene->_hotspot2._strip = 1; @@ -785,7 +785,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(); @@ -1282,7 +1282,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() { @@ -1377,7 +1377,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); @@ -1389,7 +1389,7 @@ void Scene5100::dispatch() { (_globals->_sceneManager._previousScene != 5150)) { setAction(NULL); _sceneMode = 5150; - _soundHandler.startSound(208); + _soundHandler.play(208); if (RING_INVENTORY._vial._sceneNumber == 5100) { _globals->_player.addMover(NULL); @@ -1462,7 +1462,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; @@ -1477,7 +1477,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; @@ -1513,7 +1513,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: @@ -1615,8 +1615,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); @@ -1633,7 +1633,7 @@ void Scene5200::postInit(SceneObjectList *OwnerList) { } if (_globals->_stripNum == 1111) { - _globals->_soundHandler.startSound(205); + _globals->_soundHandler.play(205); _globals->_player.disableControl(); _globals->_player.postInit(); @@ -2107,7 +2107,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() { @@ -2153,7 +2153,7 @@ void Scene5300::signal() { _sceneMode = 5302; break; case 5307: - _soundHandler.proc1(NULL); + _soundHandler.fadeOut(NULL); break; case 5309: _hotspot5.remove(); diff --git a/engines/tsage/ringworld_scenes6.h b/engines/tsage/ringworld_scenes6.h index 272aea4fe9..db0217315d 100644 --- a/engines/tsage/ringworld_scenes6.h +++ b/engines/tsage/ringworld_scenes6.h @@ -78,7 +78,7 @@ class Scene5000 : public Scene { }; public: SequenceManager _sequenceManager; - SoundHandler _soundHandler; + ASound _soundHandler; SpeakerSText _speakerSText; SpeakerQText _speakerQText; Action1 _action1; @@ -166,7 +166,7 @@ class Scene5100 : public Scene { }; public: SequenceManager _sequenceManager; - SoundHandler _soundHandler; + ASound _soundHandler; SpeakerMText _speakerMText; SpeakerQText _speakerQText; SpeakerSText _speakerSText; @@ -229,7 +229,7 @@ class Scene5200 : public Scene { virtual void doAction(int action); }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SpeakerFLL _speakerFLL; SpeakerFLText _speakerFLText; SpeakerQL _speakerQL; @@ -294,7 +294,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 0891f64597..7c0a05468f 100644 --- a/engines/tsage/ringworld_scenes8.cpp +++ b/engines/tsage/ringworld_scenes8.cpp @@ -48,7 +48,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); @@ -169,7 +169,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); @@ -199,7 +199,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; @@ -532,7 +532,7 @@ void Scene7000::postInit(SceneObjectList *OwnerList) { _object1.animate(ANIM_MODE_8, 0, 0); _globals->_sceneItems.addItems(&_object1, 0); } - _soundHandler.startSound(251); + _soundHandler.play(251); if (_globals->_sceneManager._previousScene == 2100) { if (_globals->getFlag(72)) { _globals->_player.postInit(); @@ -550,7 +550,7 @@ void Scene7000::postInit(SceneObjectList *OwnerList) { setAction(&_action1); } } else { - _globals->_soundHandler.startSound(250); + _globals->_soundHandler.play(250); _globals->setFlag(72); _object3.postInit(); @@ -597,9 +597,9 @@ void Scene7000::postInit(SceneObjectList *OwnerList) { _object3.setVisage(5001); _object3.setStrip2(1); _object3.setPosition(Common::Point(307, 0), 0); - _soundHandler.startSound(151); - _soundHandler.proc5(1); - _globals->_soundHandler.startSound(250); + _soundHandler.play(151); + _soundHandler.holdAt(true); + _globals->_soundHandler.play(250); setAction(&_action3); } } @@ -1114,9 +1114,9 @@ void Scene7100::postInit(SceneObjectList *OwnerList) { _object1.setPosition(Common::Point(100, 100), 0); setAction(&_action11); - _soundHandler1.startSound(270); - _soundHandler2.startSound(275); - _globals->_soundHandler.startSound(270); + _soundHandler1.play(270); + _soundHandler2.play(275); + _globals->_soundHandler.play(270); } /*-------------------------------------------------------------------------- * Scene 7200 @@ -1281,7 +1281,7 @@ void Scene7200::postInit(SceneObjectList *OwnerList) { _swimmer.setPosition(Common::Point(-8, 16), 0); setAction(&_action1); - _soundHandler.startSound(271); + _soundHandler.play(271); } /*-------------------------------------------------------------------------- @@ -1323,7 +1323,7 @@ void Scene7300::Action1::signal() { break; case 7: setDelay(3); - _globals->_soundHandler.proc1(0); + _globals->_soundHandler.fadeOut(0); break; case 8: _globals->_sceneManager.changeScene(2280); @@ -1476,7 +1476,7 @@ void Scene7300::postInit(SceneObjectList *OwnerList) { _object8._numFrames = 2; setAction(&_action1); - _globals->_soundHandler.startSound(272); + _globals->_soundHandler.play(272); } /*-------------------------------------------------------------------------- @@ -1580,8 +1580,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); } /*-------------------------------------------------------------------------- @@ -1644,7 +1644,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), 0); scene->_object8.setStrip2(3); @@ -1853,7 +1853,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)) { @@ -1879,7 +1879,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) { @@ -2013,7 +2013,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(0); _globals->_player.disableControl(); @@ -2102,7 +2102,7 @@ void Scene7700::Object9::doAction(int action) { _globals->_sceneItems.push_front(&scene->_object10); scene->_object10.setPriority2(240); } - scene->_soundHandler.startSound(262); + scene->_soundHandler.play(262); scene->_object14.animate(ANIM_MODE_5, 0); } _globals->_events.setCursor(CURSOR_WALK); @@ -2198,7 +2198,7 @@ void Scene7700::signal() { } break; case 7702: - _soundHandler.proc1(0); + _soundHandler.fadeOut(0); _globals->_sceneManager.changeScene(7600); break; case 7703: @@ -2209,7 +2209,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), 0); @@ -2493,7 +2493,7 @@ void Scene7700::postInit(SceneObjectList *OwnerList) { _sceneMode = 7701; setAction(&_sequenceManager, this, 7701, &_globals->_player, 0); - _soundHandler.startSound(256); + _soundHandler.play(256); } Scene7700::Scene7700() { diff --git a/engines/tsage/ringworld_scenes8.h b/engines/tsage/ringworld_scenes8.h index 0c39920614..90b8d293ef 100644 --- a/engines/tsage/ringworld_scenes8.h +++ b/engines/tsage/ringworld_scenes8.h @@ -100,7 +100,7 @@ class Scene7000 : public Scene { }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SequenceManager _sequenceManager; SpeakerSKText _speakerSKText; SpeakerSKL _speakerSKL; @@ -171,8 +171,8 @@ class Scene7100 : public Scene { }; public: - SoundHandler _soundHandler1; - SoundHandler _soundHandler2; + ASound _soundHandler1; + ASound _soundHandler2; SceneObject _object1; SceneObject _object2; SceneObject _object3; @@ -236,7 +236,7 @@ public: SceneObject _object7; SceneObject _object8; SceneObject _object9; - SoundHandler _soundHandler; + ASound _soundHandler; virtual void postInit(SceneObjectList *OwnerList = NULL); }; @@ -302,8 +302,8 @@ public: SceneObject _object4; SceneObject _object5; SceneObject _object6; - SoundHandler _soundHandler1; - SoundHandler _soundHandler2; + ASound _soundHandler1; + ASound _soundHandler2; virtual void postInit(SceneObjectList *OwnerList = NULL); }; @@ -415,7 +415,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 7c8325d53e..cdb7470c58 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -59,4 +59,95 @@ void SoundManager::listenerSynchronise(Serialiser &s) { warning("TODO: SoundManager listenerSynchronise"); } +/*--------------------------------------------------------------------------*/ + +void ASound::play(int soundNum, Action *action, int volume) { + +} + +void ASound::stop() { + +} + +void ASound::prime(int v, Action *action) { + +} + +void ASound::unPrime() { + +} + +void ASound::go() { + +} + +void ASound::hault(void) { +} + +int ASound::getSoundNum() const { return 0; } +bool ASound::isPlaying() const { return false; } +bool ASound::isPaused() const { return false; } +bool ASound::isMuted() const { return false; } + +void ASound::pause() { + +} + +void ASound::mute() { + +} + +void ASound::fadeIn() { + +} + +void ASound::fadeOut(EventHandler *evtHandler) { + +} + +void ASound::fade(int v1, int v2, int v3, int v4, EventHandler *evtHandler) { + +} + +void ASound::setTimeIndex(uint32 timeIndex) { + +} + +uint32 ASound::getTimeIndex() const { + return 0; +} + +void ASound::setPri(int v) { + +} + +void ASound::setLoop(bool flag) { + +} + +int ASound::getPri() const { + return 0; +} + +bool ASound::getLoop() { + return false; +} + +void ASound::setVolume(int volume) { + +} + +int ASound::getVol() const { + return 0; +} + +void ASound::holdAt(int v) { + +} + +void ASound::release() { + +} + + } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index a495344038..a1843545a9 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -28,6 +28,7 @@ #include "common/scummsys.h" #include "tsage/saveload.h" +#include "tsage/core.h" namespace tSage { @@ -44,6 +45,48 @@ public: void loadNotifierProc(bool postFlag); }; +class Sound: public EventHandler { +public: + +}; + +class ASound: public Sound { +public: + Sound _sound; + Action *_action; + int _field280; + + ASound(); + virtual void synchronise(Serialiser &s); + virtual void dispatch(); + + void play(int soundNum, Action *action = NULL, int volume = 127); + void stop(); + void prime(int v, Action *action = NULL); + void unPrime(); + void go(); + void hault(void); + int getSoundNum() const; + bool isPlaying() const; + bool isPaused() const; + bool isMuted() const; + void pause(); + void mute(); + void fadeIn(); + void fadeOut(EventHandler *evtHandler); + void fade(int v1, int v2, int v3, int v4, EventHandler *evtHandler); + void setTimeIndex(uint32 timeIndex); + uint32 getTimeIndex() const; + void setPri(int v); + void setLoop(bool flag); + int getPri() const; + bool getLoop(); + void setVolume(int volume); + int getVol() const; + void holdAt(int v); + void release(); +}; + } // End of namespace tSage #endif -- cgit v1.2.3 From 52ff20148eeb0455ed1548bf7bd7563a82dd016f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 27 Apr 2011 22:22:20 +1000 Subject: TSAGE: Implemented the code for the ASound class --- engines/tsage/core.cpp | 18 ------ engines/tsage/sound.cpp | 156 +++++++++++++++++++++++++++++++++++++++--------- engines/tsage/sound.h | 67 +++++++++++++++------ 3 files changed, 175 insertions(+), 66 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 36e2961aca..2b8256ebd2 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -2912,24 +2912,6 @@ int SceneRegions::indexOf(const Common::Point &pt) { /*--------------------------------------------------------------------------*/ -ASound::ASound() { - _action = NULL; - _field280 = -1; -} - -void ASound::synchronise(Serialiser &s) { - EventHandler::synchronise(s); - - SYNC_POINTER(_action); - s.syncAsSint16LE(_field280); -} - -void ASound::dispatch() { - -} - -/*--------------------------------------------------------------------------*/ - void SceneItemList::addItems(SceneItem *first, ...) { va_list va; va_start(va, first); diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index cdb7470c58..793409d123 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -61,93 +61,191 @@ void SoundManager::listenerSynchronise(Serialiser &s) { /*--------------------------------------------------------------------------*/ -void ASound::play(int soundNum, Action *action, int volume) { - +void Sound::play(int soundNum, int volume) { + } -void ASound::stop() { +void Sound::stop() { } -void ASound::prime(int v, Action *action) { +void Sound::prime(int soundNum) { } -void ASound::unPrime() { +void Sound::prime(int soundNum, int v2) { + +} + +void Sound::_unPrime() { } -void ASound::go() { +void Sound::unPrime() { } -void ASound::hault(void) { +void Sound::go() { + } -int ASound::getSoundNum() const { return 0; } -bool ASound::isPlaying() const { return false; } -bool ASound::isPaused() const { return false; } -bool ASound::isMuted() const { return false; } +void Sound::halt(void) { -void ASound::pause() { +} +int Sound::getSoundNum() const { + return 0; } -void ASound::mute() { +bool Sound::isPlaying() const { + return false; +} +bool Sound::isPrimed() const { + return false; } -void ASound::fadeIn() { +bool Sound::isPaused() const { + return false; +} +bool Sound::isMuted() const { + return false; } -void ASound::fadeOut(EventHandler *evtHandler) { +void Sound::pause() { } -void ASound::fade(int v1, int v2, int v3, int v4, EventHandler *evtHandler) { +void Sound::mute() { } -void ASound::setTimeIndex(uint32 timeIndex) { +void Sound::fadeIn() { } -uint32 ASound::getTimeIndex() const { - return 0; +void Sound::fadeOut(EventHandler *evtHandler) { + } -void ASound::setPri(int v) { +void Sound::fade(int v1, int v2, int v3, int v4) { } -void ASound::setLoop(bool flag) { +void Sound::setTimeIndex(uint32 timeIndex) { } -int ASound::getPri() const { - return 0; +uint32 Sound::getTimeIndex() const { + return 0; +} + +bool Sound::getCueValue() const { + return false; } -bool ASound::getLoop() { - return false; +void Sound::setCueValue(bool flag) { + } -void ASound::setVolume(int volume) { +void Sound::setVol(int volume) { } -int ASound::getVol() const { +int Sound::getVol() const { return 0; } -void ASound::holdAt(int v) { +void Sound::setPri(int v) { + +} + +void Sound::setLoop(bool flag) { } -void ASound::release() { +int Sound::getPri() const { + return 0; +} +bool Sound::getLoop() { + return false; } +void Sound::holdAt(int v) { + +} + +void Sound::release() { + +} + + +/*--------------------------------------------------------------------------*/ + +ASound::ASound(): EventHandler() { + _action = NULL; + _cueFlag = false; +} + +void ASound::synchronise(Serialiser &s) { + EventHandler::synchronise(s); + SYNC_POINTER(_action); + s.syncAsByte(_cueFlag); +} + +void ASound::dispatch() { + EventHandler::dispatch(); + + if (!_sound.getCueValue()) { + _cueFlag = false; + _sound.setCueValue(true); + + if (_action) + _action->signal(); + } + + if (!_cueFlag) { + if (!_sound.isPrimed()) { + _cueFlag = true; + if (_action) { + _action->signal(); + _action = NULL; + } + } + } +} + +void ASound::play(int soundNum, Action *action, int volume) { + _action = action; + _cueFlag = false; + + setVol(volume); + _sound.play(soundNum); +} + +void ASound::stop() { + _sound.stop(); + _action = NULL; +} + +void ASound::prime(int soundNum, Action *action) { + _action = action; + _cueFlag = false; + _sound.prime(soundNum); +} + +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); +} } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index a1843545a9..a029c9a81c 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -47,46 +47,75 @@ public: class Sound: public EventHandler { public: - -}; - -class ASound: public Sound { -public: - Sound _sound; - Action *_action; - int _field280; - - ASound(); - virtual void synchronise(Serialiser &s); - virtual void dispatch(); - - void play(int soundNum, Action *action = NULL, int volume = 127); + void play(int soundNum, int volume = 127); void stop(); - void prime(int v, Action *action = NULL); + void prime(int soundNum); + void prime(int soundNum, int v2); + void _unPrime(); void unPrime(); void go(); - void hault(void); + void halt(void); int getSoundNum() const; bool isPlaying() const; + bool isPrimed() const; bool isPaused() const; bool isMuted() const; void pause(); void mute(); void fadeIn(); void fadeOut(EventHandler *evtHandler); - void fade(int v1, int v2, int v3, int v4, EventHandler *evtHandler); + void fade(int v1, int v2, int v3, int v4); void setTimeIndex(uint32 timeIndex); uint32 getTimeIndex() const; + bool getCueValue() const; + void setCueValue(bool flag); + void setVol(int volume); + int getVol() const; void setPri(int v); void setLoop(bool flag); int getPri() const; bool getLoop(); - void setVolume(int volume); - int getVol() const; void holdAt(int v); void release(); }; +class ASound: public EventHandler { +public: + Sound _sound; + Action *_action; + bool _cueFlag; + + ASound(); + virtual void synchronise(Serialiser &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(); } + int getSoundNum() const { return _sound.getSoundNum(); } + bool isPlaying() const { return _sound.isPlaying(); } + bool isPaused() const { return _sound.isPaused(); } + bool isMuted() const { return _sound.isMuted(); } + void pause() { _sound.pause(); } + void mute() { _sound.mute(); } + 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(); } +}; + } // End of namespace tSage #endif -- cgit v1.2.3 From 660d3858755750ca2d71694ab15cd170e1c42446 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 29 Apr 2011 20:19:37 +1000 Subject: TSAGE: Added fields for the Sound class --- engines/tsage/sound.h | 52 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index a029c9a81c..7a21b9df3f 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -45,13 +45,61 @@ public: void loadNotifierProc(bool postFlag); }; +#define SOUND_ARR_SIZE 16 + +struct trackInfoStruct { + int count; + int rlbList[32]; + uint32 handleList[75]; +}; + class Sound: public EventHandler { +private: + void _prime(int soundNum, int v2); + void _unPrime(); +public: + int _field6; + int _soundNum; + int _fieldA; + int _fieldE; + int _priority2; + int _field10; + bool _loopFlag2; + int _priority; + int _volume; + bool _loopFlag; + int _pauseCtr; + int _muteCtr; + int _holdAt; + bool _cueValue; + int _field1E; + int _field1F; + int _field20; + int _field21; + int _field22; + uint _timeIndex; + int _field26; + int _field28[SOUND_ARR_SIZE]; + int _field38[SOUND_ARR_SIZE]; + int _field48[SOUND_ARR_SIZE]; + int _field58[SOUND_ARR_SIZE]; + int _field68[SOUND_ARR_SIZE]; + int _field78[SOUND_ARR_SIZE]; + int _field98[SOUND_ARR_SIZE]; + int _fieldA8[SOUND_ARR_SIZE]; + int _fieldB8[SOUND_ARR_SIZE]; + int _fieldC8[SOUND_ARR_SIZE]; + int _fieldE8[SOUND_ARR_SIZE]; + trackInfoStruct _trackInfo; + int _field266; + int _field268; + bool _primed; + int _field26C; + int _field26E; public: void play(int soundNum, int volume = 127); void stop(); void prime(int soundNum); - void prime(int soundNum, int v2); - void _unPrime(); void unPrime(); void go(); void halt(void); -- cgit v1.2.3 From 57612224ca76c34832599a13938b99fd68bff7bf Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 1 May 2011 15:23:30 +1000 Subject: TSAGE: Implemented the methods of the Sound class --- engines/tsage/sound.cpp | 352 +++++++++++++++++++++++++++++++++++++++++++----- engines/tsage/sound.h | 106 +++++++++++---- 2 files changed, 395 insertions(+), 63 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 793409d123..0db43506ea 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -29,6 +29,7 @@ #include "tsage/globals.h" #include "tsage/debugger.h" #include "tsage/graphics.h" +#include "tsage/tsage.h" namespace tSage { @@ -61,127 +62,406 @@ void SoundManager::listenerSynchronise(Serialiser &s) { /*--------------------------------------------------------------------------*/ -void Sound::play(int soundNum, int volume) { +void SoundManager::checkResVersion(const byte *soundData) { + int minVersion = READ_LE_UINT16(soundData + 4); + int maxVersion = READ_LE_UINT16(soundData + 6); + if (_globals->_soundManager._minVersion >= maxVersion) + error("Attempt to play/prime sound resource that is too new"); + if (_globals->_soundManager._minVersion > minVersion) + error("Attempt to play/prime sound resource that is too old"); } -void Sound::stop() { +int SoundManager::determineGroup(const byte *soundData) { + return _sfDetermineGroup(soundData); +} + +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::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::extractTrackInfo(trackInfoStruct *data, const byte *soundData, int groupNum) { + +} + +void SoundManager::suspendSoundServer() { + ++_globals->_soundManager._suspendCtr; +} + +void SoundManager::rethinkVoiceTypes() { + _sfRethinkVoiceTypes(); +} + +void SoundManager::restartSoundServer() { + if (_globals->_soundManager._suspendCtr > 0) + --_globals->_soundManager._suspendCtr; +} + +void SoundManager::updateSoundVol(Sound *sound) { + _sfUpdateVolume(sound); +} + +void SoundManager::updateSoundPri(Sound *sound) { + _sfUpdatePriority(sound); +} + +void SoundManager::updateSoundLoop(Sound *sound) { + _sfUpdateLoop(sound); +} + +/*--------------------------------------------------------------------------*/ + +void SoundManager::_soSetTimeIndex(int timeIndex) { + warning("TODO: _soSetTimeIndex"); +} + +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 & _globals->_soundManager._groupMask) == v) + return v; + + p = soundData + 6 + (READ_LE_UINT16(p + 4) * 4); + } + + return 0; +} + +void SoundManager::_sfAddToPlayList(Sound*soundData) { + +} + +void SoundManager::_sfRemoveFromPlayList(Sound *sound) { + +} + +bool SoundManager::_sfIsOnPlayList(Sound *sound) { + ++_globals->_soundManager._suspendCtr; + bool result = contains(_globals->_soundManager._playList, sound); + --_globals->_soundManager._suspendCtr; + + return result; +} + +void SoundManager::_sfRethinkVoiceTypes() { + +} + +void SoundManager::_sfUpdateVolume(Sound *sound) { + _sfDereferenceAll(); + sub_233EE(sound); +} + +void SoundManager::_sfDereferenceAll() { + +} + +void SoundManager::sub_233EE(Sound *sound) { + +} + +void SoundManager::_sfUpdatePriority(Sound *sound) { + +} + +void SoundManager::_sfUpdateLoop(Sound *sound) { } +/*--------------------------------------------------------------------------*/ + +Sound::Sound() { + _field6 = 0; + _soundNum = 0; + _groupNum = 0; + _soundPriority = 0; + _priority2 = -1; + _loop = true; + _loopFlag2 = true; + _priority = 0; + _volume = 127; + _loopFlag = false; + _pauseCtr = 0; + _muteCtr = 0; + _holdAt = false; + _cueValue = -1; + _volume1 = -1; + _field1F = 0; + _volume2 = 0; + _field21 = 0; + _field22 = 0; + _timeIndex = 0; + _field26 = 0; + _trackInfo.count = 0; + _primed = false; + _field26C = 0; + _field26E = NULL; +} + +void Sound::play(int soundNum) { + prime(soundNum); + _globals->_soundManager.addToPlayList(this); +} + +void Sound::stop() { + _globals->_soundManager.removeFromPlayList(this); + _unPrime(); +} + void Sound::prime(int soundNum) { + if (_soundNum != -1) { + stop(); + _prime(soundNum, false); + } +} +void Sound::unPrime() { + stop(); } -void Sound::prime(int soundNum, int v2) { +void Sound::_prime(int soundNum, bool queFlag) { + if (_primed) + unPrime(); + + if (_soundNum != -1) { + // Sound number specified + _field26E = NULL; + byte *soundData = _resourceManager->getResource(RES_SOUND, soundNum, 0); + _globals->_soundManager.checkResVersion(soundData); + _groupNum = _globals->_soundManager.determineGroup(soundData); + _soundPriority = _globals->_soundManager.extractPriority(soundData); + _loop = _globals->_soundManager.extractLoop(soundData); + _globals->_soundManager.extractTrackInfo(&_trackInfo, soundData, _groupNum); + + for (int idx = 0; idx < _trackInfo.count; ++idx) { + _trackInfo.handleList[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo.rlbList[idx]); + } + + DEALLOCATE(soundData); + } else { + // No sound specified + _groupNum = 0; + _soundPriority = 0; + _loop = 0; + _trackInfo.count = 0; + _trackInfo.handleList[0] = ALLOCATE(200); + _field26E = ALLOCATE(200); + } + + if (queFlag) + _globals->_soundManager.addToSoundList(this); + _primed = true; } void Sound::_unPrime() { + if (_primed) { + if (_field26C) { + DEALLOCATE(_trackInfo.handleList[0]); + DEALLOCATE(_field26E); + _field26E = NULL; + } else { + for (int idx = 0; idx < _trackInfo.count; ++idx) { + DEALLOCATE(_trackInfo.handleList[idx]); + } + } + _trackInfo.count = 0; + _globals->_soundManager.removeFromSoundList(this); + + _primed = false; + _field6 = 0; + } } -void Sound::unPrime() { +void Sound::orientAfterDriverChange() { + if (!_field26C) { + int timeIndex = getTimeIndex(); + + for (int idx = 0; idx < _trackInfo.count; ++idx) + DEALLOCATE(_trackInfo.handleList[idx]); + + _trackInfo.count = 0; + _primed = false; + _prime(_soundNum, true); + setTimeIndex(timeIndex); + } +} +void Sound::orientAfterRestore() { + if (_field26C) { + int timeIndex = getTimeIndex(); + _primed = false; + _prime(_soundNum, true); + setTimeIndex(timeIndex); + } } void Sound::go() { + if (!_primed) + error("Attempt to execute Sound::go() on an unprimed Sound"); + _globals->_soundManager.addToPlayList(this); } void Sound::halt(void) { - + _globals->_soundManager.removeFromPlayList(this); } int Sound::getSoundNum() const { - return 0; + return _soundNum; } -bool Sound::isPlaying() const { - return false; +bool Sound::isPlaying() { + return _globals->_soundManager.isOnPlayList(this); } bool Sound::isPrimed() const { - return false; + return _primed; } bool Sound::isPaused() const { - return false; + return _pauseCtr != 0; } bool Sound::isMuted() const { - return false; + return _muteCtr != 0; } -void Sound::pause() { +void Sound::pause(bool flag) { + _globals->_soundManager.suspendSoundServer(); -} - -void Sound::mute() { + if (flag) + ++_pauseCtr; + else if (_pauseCtr > 0) + --_pauseCtr; + _globals->_soundManager.rethinkVoiceTypes(); + _globals->_soundManager.restartSoundServer(); } -void Sound::fadeIn() { +void Sound::mute(bool flag) { + _globals->_soundManager.suspendSoundServer(); + + if (flag) + ++_muteCtr; + else if (_muteCtr > 0) + --_muteCtr; + _globals->_soundManager.rethinkVoiceTypes(); + _globals->_soundManager.restartSoundServer(); } -void Sound::fadeOut(EventHandler *evtHandler) { +void Sound::fade(int volume1, int volume2, int v3, int v4) { + _globals->_soundManager.suspendSoundServer(); -} + if (volume1 > 127) + volume1 = 127; + if (volume2 > 127) + volume2 = 127; + if (v3 > 255) + v3 = 255; -void Sound::fade(int v1, int v2, int v3, int v4) { + _volume1 = volume1; + _volume2 = volume2; + _field1F = v3; + _field21 = 0; + _field22 = v4; + _globals->_soundManager.restartSoundServer(); } void Sound::setTimeIndex(uint32 timeIndex) { - + if (_primed) { + mute(true); + SoundManager::_soSetTimeIndex(timeIndex); + mute(false); + } } uint32 Sound::getTimeIndex() const { - return 0; + return _timeIndex; } -bool Sound::getCueValue() const { - return false; +int Sound::getCueValue() const { + return _cueValue; } -void Sound::setCueValue(bool flag) { - +void Sound::setCueValue(int cueValue) { + _cueValue = cueValue; } void Sound::setVol(int volume) { + if (volume > 127) + volume = 127; + if (_volume != volume) { + _volume = volume; + if (isPlaying()) + _globals->_soundManager.updateSoundVol(this); + } } int Sound::getVol() const { - return 0; + return _volume; } -void Sound::setPri(int v) { - +void Sound::setPri(int priority) { + if (priority > 127) + priority = 127; + _priority2 = priority; + _globals->_soundManager.updateSoundPri(this); } void Sound::setLoop(bool flag) { - + _loopFlag2 = flag; + _globals->_soundManager.updateSoundLoop(this); } int Sound::getPri() const { - return 0; + return _priority; } bool Sound::getLoop() { - return false; + return _loopFlag; } -void Sound::holdAt(int v) { - +void Sound::holdAt(int amount) { + if (amount > 127) + amount = 127; + _holdAt = amount; } void Sound::release() { - + _holdAt = -1; } - /*--------------------------------------------------------------------------*/ ASound::ASound(): EventHandler() { @@ -200,7 +480,7 @@ void ASound::dispatch() { if (!_sound.getCueValue()) { _cueFlag = false; - _sound.setCueValue(true); + _sound.setCueValue(1); if (_action) _action->signal(); diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 7a21b9df3f..20edd70292 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -27,12 +27,37 @@ #define TSAGE_SOUND_H #include "common/scummsys.h" +#include "common/list.h" #include "tsage/saveload.h" #include "tsage/core.h" namespace tSage { +class Sound; + +struct trackInfoStruct { + int count; + int rlbList[32]; + byte *handleList[75]; +}; + class SoundManager : public SaveListener { +public: + int _minVersion, _maxVersion; + Common::List _playList; + void *driverList2[16]; + int _field89[16]; + int _fieldA9[16]; + int _fieldE9[16]; + int _field109[16]; + uint32 _groupMask; + int volume; + int _disableCtr; + int _suspendCtr; + int _field153; + Common::List _soundList; + Common::List _driverList; + int _field16D; public: void dispatch() {} virtual void listenerSynchronise(Serialiser &s); @@ -43,27 +68,54 @@ public: void saveNotifierProc(bool postFlag); static void loadNotifier(bool postFlag); void loadNotifierProc(bool postFlag); -}; -#define SOUND_ARR_SIZE 16 + void checkResVersion(const byte *soundData); + int determineGroup(const byte *soundData); + int extractPriority(const byte *soundData); + int extractLoop(const byte *soundData); + void addToSoundList(Sound *sound); + void removeFromSoundList(Sound *sound); + void addToPlayList(Sound *sound); + void removeFromPlayList(Sound *sound); + bool isOnPlayList(Sound *sound); + void extractTrackInfo(trackInfoStruct *data, const byte *soundData, int groupNum); + void suspendSoundServer(); + void rethinkVoiceTypes(); + void restartSoundServer(); + void updateSoundVol(Sound *sound); + void updateSoundPri(Sound *sound); + void updateSoundLoop(Sound *sound); + + // _so methods + static void _soSetTimeIndex(int timeIndex); + static int _sfDetermineGroup(const byte *soundData); + static void _sfAddToPlayList(Sound *sound); + static void _sfRemoveFromPlayList(Sound *sound); + static bool _sfIsOnPlayList(Sound *sound); + static void _sfRethinkVoiceTypes(); + static void _sfUpdateVolume(Sound *sound); + static void _sfDereferenceAll(); + static void sub_233EE(Sound *sound); + static void _sfUpdatePriority(Sound *sound); + static void _sfUpdateLoop(Sound *sound); -struct trackInfoStruct { - int count; - int rlbList[32]; - uint32 handleList[75]; }; +#define SOUND_ARR_SIZE 16 + class Sound: public EventHandler { private: - void _prime(int soundNum, int v2); + void _prime(int soundNum, bool queFlag); void _unPrime(); + void orientAfterDriverChange(); + void orientAfterRestore(); public: int _field6; int _soundNum; - int _fieldA; - int _fieldE; + int _groupNum; + int _soundPriority; int _priority2; - int _field10; + int _loop; bool _loopFlag2; int _priority; int _volume; @@ -71,10 +123,10 @@ public: int _pauseCtr; int _muteCtr; int _holdAt; - bool _cueValue; - int _field1E; + int _cueValue; + int _volume1; int _field1F; - int _field20; + int _volume2; int _field21; int _field22; uint _timeIndex; @@ -95,35 +147,35 @@ public: int _field268; bool _primed; int _field26C; - int _field26E; + byte *_field26E; public: - void play(int soundNum, int volume = 127); + Sound(); + + void play(int soundNum); void stop(); void prime(int soundNum); void unPrime(); void go(); void halt(void); + bool isPlaying(); int getSoundNum() const; - bool isPlaying() const; bool isPrimed() const; bool isPaused() const; bool isMuted() const; - void pause(); - void mute(); - void fadeIn(); - void fadeOut(EventHandler *evtHandler); + void pause(bool flag); + void mute(bool flag); void fade(int v1, int v2, int v3, int v4); void setTimeIndex(uint32 timeIndex); uint32 getTimeIndex() const; - bool getCueValue() const; - void setCueValue(bool flag); + int getCueValue() const; + void setCueValue(int cueValue); void setVol(int volume); int getVol() const; - void setPri(int v); + void setPri(int priority); void setLoop(bool flag); int getPri() const; bool getLoop(); - void holdAt(int v); + void holdAt(int amount); void release(); }; @@ -143,12 +195,12 @@ public: void unPrime(); void go() { _sound.go(); } void hault(void) { _sound.halt(); } + bool isPlaying() { return _sound.isPlaying(); } int getSoundNum() const { return _sound.getSoundNum(); } - bool isPlaying() const { return _sound.isPlaying(); } bool isPaused() const { return _sound.isPaused(); } bool isMuted() const { return _sound.isMuted(); } - void pause() { _sound.pause(); } - void mute() { _sound.mute(); } + 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); -- cgit v1.2.3 From bc3469eef29b95fcdd002ba7d64b6f041d52ea77 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 1 May 2011 19:28:30 +1000 Subject: TSAGE: Implemented a lot of the SoundManager methods --- engines/tsage/sound.cpp | 168 ++++++++++++++++++++++++++++++++++++++++-------- engines/tsage/sound.h | 60 +++++++++++++---- 2 files changed, 187 insertions(+), 41 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 0db43506ea..834395e7da 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -33,10 +33,39 @@ namespace tSage { +SoundManager::SoundManager() { + __sndmgrReady = false; + _minVersion = 0x102; + _maxVersion = 0x10A; + + for (int i = 0; i < 16; ++i) + _field109[i] = 0; + + _groupMask = 0; + _volume = 127; + _suspendCtr = 0; + _disableCtr = 0; + _field153 = 0; + _field16D = 0; +} + +SoundManager::~SoundManager() { + if (__sndmgrReady) { + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) + (*i)->stop(); + for (Common::List::iterator i = _installedDrivers.begin(); i != _installedDrivers.end(); ++i) + unInstallDriver(*i); + _sfTerminate(); + } +} + 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; + } } void SoundManager::saveNotifier(bool postFlag) { @@ -60,8 +89,6 @@ void SoundManager::listenerSynchronise(Serialiser &s) { warning("TODO: SoundManager listenerSynchronise"); } -/*--------------------------------------------------------------------------*/ - void SoundManager::checkResVersion(const byte *soundData) { int minVersion = READ_LE_UINT16(soundData + 4); int maxVersion = READ_LE_UINT16(soundData + 6); @@ -72,6 +99,57 @@ void SoundManager::checkResVersion(const byte *soundData) { error("Attempt to play/prime sound resource that is too old"); } +/*--------------------------------------------------------------------------*/ + +void SoundManager::suspendSoundServer() { + ++_globals->_soundManager._suspendCtr; +} + + +void SoundManager::restartSoundServer() { + if (_globals->_soundManager._suspendCtr > 0) + --_globals->_soundManager._suspendCtr; +} + +void SoundManager::unInstallDriver(SoundDriver *driver) { + +} + +Common::List &SoundManager::buildDriverList(bool flag) { + assert(__sndmgrReady); + _driverList.clear(); + + warning("TODO: SoundManager::buildDriverList"); + return _driverList; +} + +Common::List &SoundManager::getDriverList(bool flag) { + if (flag) + return _driverList; + else + return buildDriverList(false); +} + +void SoundManager::dumpDriverList() { + _driverList.clear(); +} + +void SoundManager::setMasterVol(int volume) { + _sfSetMasterVol(volume); +} + +int SoundManager::getMasterVol() const { + return _volume; +} + +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); } @@ -84,6 +162,10 @@ 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); @@ -105,23 +187,6 @@ bool SoundManager::isOnPlayList(Sound *sound) { return _sfIsOnPlayList(sound); } -void SoundManager::extractTrackInfo(trackInfoStruct *data, const byte *soundData, int groupNum) { - -} - -void SoundManager::suspendSoundServer() { - ++_globals->_soundManager._suspendCtr; -} - -void SoundManager::rethinkVoiceTypes() { - _sfRethinkVoiceTypes(); -} - -void SoundManager::restartSoundServer() { - if (_globals->_soundManager._suspendCtr > 0) - --_globals->_soundManager._suspendCtr; -} - void SoundManager::updateSoundVol(Sound *sound) { _sfUpdateVolume(sound); } @@ -134,6 +199,10 @@ void SoundManager::updateSoundLoop(Sound *sound) { _sfUpdateLoop(sound); } +void SoundManager::rethinkVoiceTypes() { + _sfRethinkVoiceTypes(); +} + /*--------------------------------------------------------------------------*/ void SoundManager::_soSetTimeIndex(int timeIndex) { @@ -194,6 +263,51 @@ void SoundManager::_sfUpdateLoop(Sound *sound) { } +void SoundManager::_sfSetMasterVol(int volume) { + if (volume > 127) + volume = 127; + + if (volume != _globals->_soundManager._volume) { + _globals->_soundManager._volume = volume; + + for (Common::List::iterator i = _globals->_soundManager._installedDrivers.begin(); + i != _globals->_soundManager._installedDrivers.end(); ++i) { + (*i)->setVolume(volume); + } + } +} + +void SoundManager::_sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum) { + trackInfo->count = 0; + + const byte *p = soundData + READ_LE_UINT16(soundData + 8); + uint32 v; + while ((v = READ_LE_UINT32(p)) != 0) { + while ((v == 0x80000000) || (v == (uint)groupNum)) { + int count = READ_LE_UINT16(p + 4); + p += 6; + + for (int idx = 0; idx < count; ++idx) { + if (trackInfo->count == 16) { + trackInfo->count = -1; + return; + } + + trackInfo->rlbList[trackInfo->count] = READ_LE_UINT16(p); + trackInfo->arr2[trackInfo->count] = READ_LE_UINT16(p + 2); + ++trackInfo->count; + p += 4; + } + } + + p = soundData + 6 + (READ_LE_UINT16(p + 4) * 4); + } +} + +void SoundManager::_sfTerminate() { + +} + /*--------------------------------------------------------------------------*/ Sound::Sound() { @@ -260,7 +374,7 @@ void Sound::_prime(int soundNum, bool queFlag) { _globals->_soundManager.extractTrackInfo(&_trackInfo, soundData, _groupNum); for (int idx = 0; idx < _trackInfo.count; ++idx) { - _trackInfo.handleList[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo.rlbList[idx]); + _handleList[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo.rlbList[idx]); } DEALLOCATE(soundData); @@ -270,7 +384,7 @@ void Sound::_prime(int soundNum, bool queFlag) { _soundPriority = 0; _loop = 0; _trackInfo.count = 0; - _trackInfo.handleList[0] = ALLOCATE(200); + _handleList[0] = ALLOCATE(200); _field26E = ALLOCATE(200); } @@ -283,12 +397,12 @@ void Sound::_prime(int soundNum, bool queFlag) { void Sound::_unPrime() { if (_primed) { if (_field26C) { - DEALLOCATE(_trackInfo.handleList[0]); + DEALLOCATE(_handleList[0]); DEALLOCATE(_field26E); _field26E = NULL; } else { for (int idx = 0; idx < _trackInfo.count; ++idx) { - DEALLOCATE(_trackInfo.handleList[idx]); + DEALLOCATE(_handleList[idx]); } } @@ -305,7 +419,7 @@ void Sound::orientAfterDriverChange() { int timeIndex = getTimeIndex(); for (int idx = 0; idx < _trackInfo.count; ++idx) - DEALLOCATE(_trackInfo.handleList[idx]); + DEALLOCATE(_handleList[idx]); _trackInfo.count = 0; _primed = false; diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 20edd70292..b175da71c5 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -35,58 +35,90 @@ namespace tSage { class Sound; +#define SOUND_ARR_SIZE 16 + struct trackInfoStruct { int count; - int rlbList[32]; - byte *handleList[75]; + int rlbList[SOUND_ARR_SIZE]; + int arr2[SOUND_ARR_SIZE]; +}; + +class SoundDriverEntry { +public: + +}; + +class SoundDriver { +private: + Common::String _shortDescription, _longDescription; +public: + const Common::String &getShortDriverDescription() { return _shortDescription; } + const Common::String &getLongDriverDescription() { return _longDescription; } + + virtual void setVolume(int volume) = 0; }; class SoundManager : public SaveListener { +private: + void unInstallDriver(SoundDriver *driver); public: + bool __sndmgrReady; int _minVersion, _maxVersion; Common::List _playList; - void *driverList2[16]; - int _field89[16]; - int _fieldA9[16]; - int _fieldE9[16]; int _field109[16]; uint32 _groupMask; - int volume; + int _volume; int _disableCtr; int _suspendCtr; int _field153; Common::List _soundList; - Common::List _driverList; + Common::List _driverList; + + Common::List _installedDrivers; + int _field89[16]; + int _fieldA9[16]; + int _fieldE9[16]; + int _field16D; public: + SoundManager(); + ~SoundManager(); + void dispatch() {} virtual void listenerSynchronise(Serialiser &s); virtual void postInit(); - void proc2() {} static void saveNotifier(bool postFlag); void saveNotifierProc(bool postFlag); static void loadNotifier(bool postFlag); void loadNotifierProc(bool postFlag); + Common::List &buildDriverList(bool flag); + Common::List &getDriverList(bool flag); + void dumpDriverList(); 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); - bool isOnPlayList(Sound *sound); - void extractTrackInfo(trackInfoStruct *data, const byte *soundData, int groupNum); void suspendSoundServer(); void rethinkVoiceTypes(); void restartSoundServer(); 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); // _so methods + static void _sfTerminate(); static void _soSetTimeIndex(int timeIndex); static int _sfDetermineGroup(const byte *soundData); static void _sfAddToPlayList(Sound *sound); @@ -98,11 +130,10 @@ public: static void sub_233EE(Sound *sound); 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); }; -#define SOUND_ARR_SIZE 16 - class Sound: public EventHandler { private: void _prime(int soundNum, bool queFlag); @@ -143,6 +174,7 @@ public: int _fieldC8[SOUND_ARR_SIZE]; int _fieldE8[SOUND_ARR_SIZE]; trackInfoStruct _trackInfo; + byte *_handleList[75]; int _field266; int _field268; bool _primed; -- cgit v1.2.3 From 765a82dd9699bb952803c9941b5f942a82c16c7c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 2 May 2011 21:30:20 +1000 Subject: TSAGE: Bugfixes for extracting sound data properties --- engines/tsage/sound.cpp | 26 +++++++++++++++++++------- engines/tsage/sound.h | 9 +++++---- 2 files changed, 24 insertions(+), 11 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 834395e7da..a8dcb5cd07 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -38,8 +38,12 @@ SoundManager::SoundManager() { _minVersion = 0x102; _maxVersion = 0x10A; - for (int i = 0; i < 16; ++i) + for (int i = 0; i < SOUND_ARR_SIZE; ++i) { + _field89[i] = 0; + _groupList[i] = 0; + _fieldE9[i] = 0; _field109[i] = 0; + } _groupMask = 0; _volume = 127; @@ -90,12 +94,12 @@ void SoundManager::listenerSynchronise(Serialiser &s) { } void SoundManager::checkResVersion(const byte *soundData) { - int minVersion = READ_LE_UINT16(soundData + 4); - int maxVersion = READ_LE_UINT16(soundData + 6); + int maxVersion = READ_LE_UINT16(soundData + 4); + int minVersion = READ_LE_UINT16(soundData + 6); - if (_globals->_soundManager._minVersion >= maxVersion) + if (_globals->_soundManager._minVersion < minVersion) error("Attempt to play/prime sound resource that is too new"); - if (_globals->_soundManager._minVersion > minVersion) + if (_globals->_soundManager._minVersion > maxVersion) error("Attempt to play/prime sound resource that is too old"); } @@ -216,7 +220,7 @@ int SoundManager::_sfDetermineGroup(const byte *soundData) { if ((v & _globals->_soundManager._groupMask) == v) return v; - p = soundData + 6 + (READ_LE_UINT16(p + 4) * 4); + p += 6 + (READ_LE_UINT16(p + 4) * 4); } return 0; @@ -300,7 +304,7 @@ void SoundManager::_sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *s } } - p = soundData + 6 + (READ_LE_UINT16(p + 4) * 4); + p += 6 + (READ_LE_UINT16(p + 4) * 4); } } @@ -308,6 +312,14 @@ void SoundManager::_sfTerminate() { } +void SoundManager::_sfExtractGroupMask() { + uint32 mask = 0; + for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) + mask |= _globals->_soundManager._groupList[idx]; + + _globals->_soundManager._groupMask = mask; +} + /*--------------------------------------------------------------------------*/ Sound::Sound() { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index b175da71c5..0da04d3044 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -65,7 +65,7 @@ public: bool __sndmgrReady; int _minVersion, _maxVersion; Common::List _playList; - int _field109[16]; + int _field109[SOUND_ARR_SIZE]; uint32 _groupMask; int _volume; int _disableCtr; @@ -75,9 +75,9 @@ public: Common::List _driverList; Common::List _installedDrivers; - int _field89[16]; - int _fieldA9[16]; - int _fieldE9[16]; + int _field89[SOUND_ARR_SIZE]; + uint16 _groupList[SOUND_ARR_SIZE]; + int _fieldE9[SOUND_ARR_SIZE]; int _field16D; public: @@ -132,6 +132,7 @@ public: static void _sfUpdateLoop(Sound *sound); static void _sfSetMasterVol(int volume); static void _sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum); + static void _sfExtractGroupMask(); }; class Sound: public EventHandler { -- cgit v1.2.3 From c470d1e6d2977622530ae53f1620e813849720c9 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 4 May 2011 23:13:15 +1000 Subject: TSAGE: Implemented more SoundManager methods --- engines/tsage/core.cpp | 3 +- engines/tsage/sound.cpp | 216 ++++++++++++++++++++++++++++++++++++++---------- engines/tsage/sound.h | 47 ++++++++--- 3 files changed, 211 insertions(+), 55 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 2b8256ebd2..490845a9ca 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -3389,8 +3389,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/sound.cpp b/engines/tsage/sound.cpp index a8dcb5cd07..2b7a2c686d 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -50,15 +50,18 @@ SoundManager::SoundManager() { _suspendCtr = 0; _disableCtr = 0; _field153 = 0; - _field16D = 0; + _driversDetected = false; } SoundManager::~SoundManager() { if (__sndmgrReady) { for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) (*i)->stop(); - for (Common::List::iterator i = _installedDrivers.begin(); i != _installedDrivers.end(); ++i) - unInstallDriver(*i); + for (Common::List::iterator i = _installedDrivers.begin(); i != _installedDrivers.end(); ) { + int driverNum = (*i)->_driverNum; + ++i; + unInstallDriver(driverNum); + } _sfTerminate(); } } @@ -72,70 +75,154 @@ void SoundManager::postInit() { } } -void SoundManager::saveNotifier(bool postFlag) { - _globals->_soundManager.saveNotifierProc(postFlag); -} +Common::List &SoundManager::buildDriverList(bool detectFlag) { + assert(__sndmgrReady); + _availableDrivers.clear(); -void SoundManager::saveNotifierProc(bool postFlag) { - warning("TODO: SoundManager::saveNotifierProc"); -} + // 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); -void SoundManager::loadNotifier(bool postFlag) { - _globals->_soundManager.loadNotifierProc(postFlag); + _driversDetected = true; + return _availableDrivers; } -void SoundManager::loadNotifierProc(bool postFlag) { - warning("TODO: SoundManager::loadNotifierProc"); +void SoundManager::installConfigDrivers() { + } -void SoundManager::listenerSynchronise(Serialiser &s) { - s.validate("SoundManager"); - warning("TODO: SoundManager listenerSynchronise"); +Common::List &SoundManager::getDriverList(bool detectFlag) { + if (detectFlag) + return _availableDrivers; + else + return buildDriverList(false); } -void SoundManager::checkResVersion(const byte *soundData) { - int maxVersion = READ_LE_UINT16(soundData + 4); - int minVersion = READ_LE_UINT16(soundData + 6); +void SoundManager::dumpDriverList() { + _availableDrivers.clear(); +} - if (_globals->_soundManager._minVersion < minVersion) - error("Attempt to play/prime sound resource that is too new"); - if (_globals->_soundManager._minVersion > maxVersion) - error("Attempt to play/prime sound resource that is too old"); +void SoundManager::disableSoundServer() { + ++_disableCtr; } -/*--------------------------------------------------------------------------*/ +void SoundManager::enableSoundServer() { + if (_disableCtr > 0) + --_disableCtr; +} void SoundManager::suspendSoundServer() { - ++_globals->_soundManager._suspendCtr; + ++_suspendCtr; } - void SoundManager::restartSoundServer() { - if (_globals->_soundManager._suspendCtr > 0) - --_globals->_soundManager._suspendCtr; + if (_suspendCtr > 0) + --_suspendCtr; } -void SoundManager::unInstallDriver(SoundDriver *driver) { +/** + * 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((_maxVersion >= driver->_minVersion) && (_maxVersion <= driver->_maxVersion)); + + // Mute any loaded sounds + disableSoundServer(); + for (Common::List::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, ROLAND_DRIVER_NUM, 0, true); + if (bankData) { + // Install the patch bank data + _sfInstallPatchBank(bankData); + DEALLOCATE(bankData); + } else { + // Could not locate patch bank data, so unload the driver + _sfUnInstallDriver(driver); + + // Unmute currently active sounds + for (Common::List::iterator i = _playList.begin(); i != _playList.end(); ++i) + (*i)->mute(false); + enableSoundServer(); + } + break; + } + } } -Common::List &SoundManager::buildDriverList(bool flag) { - assert(__sndmgrReady); - _driverList.clear(); - - warning("TODO: SoundManager::buildDriverList"); - return _driverList; +/** + * Instantiate a driver class for the specified driver number + */ +SoundDriver *SoundManager::instantiateDriver(int driverNum) { + assert(driverNum == ADLIB_DRIVER_NUM); + return new AdlibSoundDriver(); } -Common::List &SoundManager::getDriverList(bool flag) { - if (flag) - return _driverList; - else - return buildDriverList(false); +/** + * Uninstall the specified driver + */ +void SoundManager::unInstallDriver(int driverNum) { + Common::List::const_iterator i; + for (i = _installedDrivers.begin(); i != _installedDrivers.end(); ++i) { + if ((*i)->_driverNum == driverNum) { + // Found driver to remove + + // Mute any loaded sounds + disableSoundServer(); + for (Common::List::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::iterator i = _soundList.begin(); i != _soundList.end(); ++i) + (*i)->orientAfterDriverChange(); + + // Unmute currently active sounds + for (Common::List::iterator i = _playList.begin(); i != _playList.end(); ++i) + (*i)->mute(false); + + enableSoundServer(); + } + } } -void SoundManager::dumpDriverList() { - _driverList.clear(); +/** + * Returns true if a specified driver number is currently installed + */ +bool SoundManager::isInstalled(int driverNum) const { + Common::List::const_iterator i; + for (i = _installedDrivers.begin(); i != _installedDrivers.end(); ++i) { + if ((*i)->_driverNum == driverNum) + return true; + } + + return false; } void SoundManager::setMasterVol(int volume) { @@ -158,6 +245,16 @@ 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 (_globals->_soundManager._minVersion < minVersion) + error("Attempt to play/prime sound resource that is too new"); + if (_globals->_soundManager._minVersion > maxVersion) + error("Attempt to play/prime sound resource that is too old"); +} + int SoundManager::extractPriority(const byte *soundData) { return READ_LE_UINT16(soundData + 12); } @@ -209,6 +306,29 @@ void SoundManager::rethinkVoiceTypes() { /*--------------------------------------------------------------------------*/ +void SoundManager::saveNotifier(bool postFlag) { + _globals->_soundManager.saveNotifierProc(postFlag); +} + +void SoundManager::saveNotifierProc(bool postFlag) { + warning("TODO: SoundManager::saveNotifierProc"); +} + +void SoundManager::loadNotifier(bool postFlag) { + _globals->_soundManager.loadNotifierProc(postFlag); +} + +void SoundManager::loadNotifierProc(bool postFlag) { + warning("TODO: SoundManager::loadNotifierProc"); +} + +void SoundManager::listenerSynchronise(Serialiser &s) { + s.validate("SoundManager"); + warning("TODO: SoundManager listenerSynchronise"); +} + +/*--------------------------------------------------------------------------*/ + void SoundManager::_soSetTimeIndex(int timeIndex) { warning("TODO: _soSetTimeIndex"); } @@ -320,6 +440,18 @@ void SoundManager::_sfExtractGroupMask() { _globals->_soundManager._groupMask = mask; } +bool SoundManager::_sfInstallDriver(SoundDriver *driver) { + return false; +} + +void SoundManager::_sfUnInstallDriver(SoundDriver *driver) { + +} + +void SoundManager::_sfInstallPatchBank(const byte *bankData) { + +} + /*--------------------------------------------------------------------------*/ Sound::Sound() { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 0da04d3044..40388d1055 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -36,6 +36,8 @@ namespace tSage { class Sound; #define SOUND_ARR_SIZE 16 +#define ROLAND_DRIVER_NUM 2 +#define ADLIB_DRIVER_NUM 3 struct trackInfoStruct { int count; @@ -43,14 +45,22 @@ struct trackInfoStruct { int arr2[SOUND_ARR_SIZE]; }; +enum SoundDriverStatus {SNDSTATUS_FAILED = 0, SNDSTATUS_DETECTED = 1, SNDSTATUS_SKIPPED = 2}; + class SoundDriverEntry { public: - + int driverNum; + SoundDriverStatus status; + int field2, field6; + Common::String shortDescription; + Common::String longDescription; }; class SoundDriver { -private: +public: Common::String _shortDescription, _longDescription; + int _driverNum; + int _minVersion, _maxVersion; public: const Common::String &getShortDriverDescription() { return _shortDescription; } const Common::String &getLongDriverDescription() { return _longDescription; } @@ -60,7 +70,7 @@ public: class SoundManager : public SaveListener { private: - void unInstallDriver(SoundDriver *driver); + SoundDriver *instantiateDriver(int driverNum); public: bool __sndmgrReady; int _minVersion, _maxVersion; @@ -71,15 +81,13 @@ public: int _disableCtr; int _suspendCtr; int _field153; + bool _driversDetected; Common::List _soundList; - Common::List _driverList; - + Common::List _availableDrivers; Common::List _installedDrivers; int _field89[SOUND_ARR_SIZE]; uint16 _groupList[SOUND_ARR_SIZE]; int _fieldE9[SOUND_ARR_SIZE]; - - int _field16D; public: SoundManager(); ~SoundManager(); @@ -93,9 +101,17 @@ public: static void loadNotifier(bool postFlag); void loadNotifierProc(bool postFlag); - Common::List &buildDriverList(bool flag); - Common::List &getDriverList(bool flag); + void installConfigDrivers(); + Common::List &buildDriverList(bool detectFlag); + Common::List &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); @@ -106,9 +122,7 @@ public: void removeFromSoundList(Sound *sound); void addToPlayList(Sound *sound); void removeFromPlayList(Sound *sound); - void suspendSoundServer(); void rethinkVoiceTypes(); - void restartSoundServer(); void updateSoundVol(Sound *sound); void updateSoundPri(Sound *sound); void updateSoundLoop(Sound *sound); @@ -133,13 +147,15 @@ public: 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(const byte *bankData); }; class Sound: public EventHandler { private: void _prime(int soundNum, bool queFlag); void _unPrime(); - void orientAfterDriverChange(); void orientAfterRestore(); public: int _field6; @@ -210,6 +226,8 @@ public: bool getLoop(); void holdAt(int amount); void release(); + + void orientAfterDriverChange(); }; class ASound: public EventHandler { @@ -249,6 +267,11 @@ public: void release() { _sound.release(); } }; +class AdlibSoundDriver: public SoundDriver { +public: + void setVolume(int volume) {} +}; + } // End of namespace tSage #endif -- cgit v1.2.3 From 43dbf9ff56b932f0f0b8fe09361af87c64a68d16 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 7 May 2011 14:13:52 +1000 Subject: TSAGE: Implemented more _sf methods --- engines/tsage/sound.cpp | 92 +++++++++++++++++++++++++++++++++++++++++++------ engines/tsage/sound.h | 7 +++- 2 files changed, 87 insertions(+), 12 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 2b7a2c686d..39ebf07221 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -94,7 +94,7 @@ Common::List &SoundManager::buildDriverList(bool detectFlag) { } void SoundManager::installConfigDrivers() { - + installDriver(ADLIB_DRIVER_NUM); } Common::List &SoundManager::getDriverList(bool detectFlag) { @@ -329,6 +329,10 @@ void SoundManager::listenerSynchronise(Serialiser &s) { /*--------------------------------------------------------------------------*/ +SoundManager &SoundManager::sfManager() { + return _globals->_soundManager; +} + void SoundManager::_soSetTimeIndex(int timeIndex) { warning("TODO: _soSetTimeIndex"); } @@ -346,12 +350,19 @@ int SoundManager::_sfDetermineGroup(const byte *soundData) { return 0; } -void SoundManager::_sfAddToPlayList(Sound*soundData) { - +void SoundManager::_sfAddToPlayList(Sound *sound) { + ++sfManager()._suspendCtr; + _sfDoAddToPlayList(sound); + sound->_field6 = 0; + _sfRethinkVoiceTypes(); + --sfManager()._suspendCtr; } void SoundManager::_sfRemoveFromPlayList(Sound *sound) { - + ++sfManager()._suspendCtr; + if (_sfDoRemoveFromPlayList(sound)) + _sfRethinkVoiceTypes(); + --sfManager()._suspendCtr; } bool SoundManager::_sfIsOnPlayList(Sound *sound) { @@ -368,23 +379,35 @@ void SoundManager::_sfRethinkVoiceTypes() { void SoundManager::_sfUpdateVolume(Sound *sound) { _sfDereferenceAll(); - sub_233EE(sound); + _sfDoUpdateVolume(sound); } void SoundManager::_sfDereferenceAll() { - -} - -void SoundManager::sub_233EE(Sound *sound) { - + // 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) { + ++_globals->_soundManager._suspendCtr; + int tempPriority = (sound->_priority2 == 255) ? sound->_soundPriority : sound->_priority; + if (sound->_priority != tempPriority) { + sound->_priority = tempPriority; + if (_sfDoRemoveFromPlayList(sound)) { + _sfDoAddToPlayList(sound); + _sfRethinkVoiceTypes(); + } + } + + --_globals->_soundManager._suspendCtr; } void SoundManager::_sfUpdateLoop(Sound *sound) { - + if (sound->_loopFlag2) + sound->_loopFlag = sound->_loop; + else + sound->_loopFlag = sound->_loopFlag2; } void SoundManager::_sfSetMasterVol(int volume) { @@ -452,6 +475,53 @@ void SoundManager::_sfInstallPatchBank(const byte *bankData) { } +/** + * Adds the specified sound in the playing sound list, inserting in order of priority + */ +void SoundManager::_sfDoAddToPlayList(Sound *sound) { + ++sfManager()._suspendCtr; + + Common::List::iterator i = sfManager()._playList.begin(); + while ((i != sfManager()._playList.end()) && (sound->_priority > (*i)->_priority)) + ++i; + + sfManager()._playList.insert(i, sound); + --sfManager()._suspendCtr; +} + +/** + * Removes the specified sound from the play list + */ +bool SoundManager::_sfDoRemoveFromPlayList(Sound *sound) { + ++sfManager()._suspendCtr; + + bool result = false; + for (Common::List::iterator i = sfManager()._playList.begin(); i != sfManager()._playList.end(); ++i) { + if (*i == sound) { + result = true; + sfManager()._playList.erase(i); + break; + } + } + + --sfManager()._suspendCtr; + return result; +} + +void SoundManager::_sfDoUpdateVolume(Sound *sound) { + ++_globals->_soundManager._suspendCtr; + + for (int idx = 0; idx < 16; ++idx) { + Sound *snd = sfManager()._voiceStructPtrs[idx]; + if (!snd) + continue; + + // TODO: More stuff + } + + --_globals->_soundManager._suspendCtr; +} + /*--------------------------------------------------------------------------*/ Sound::Sound() { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 40388d1055..6f86a930c0 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -88,6 +88,7 @@ public: int _field89[SOUND_ARR_SIZE]; uint16 _groupList[SOUND_ARR_SIZE]; int _fieldE9[SOUND_ARR_SIZE]; + Sound *_voiceStructPtrs[SOUND_ARR_SIZE]; public: SoundManager(); ~SoundManager(); @@ -132,6 +133,7 @@ public: void unloadSound(int soundNum); // _so methods + static SoundManager &sfManager(); static void _sfTerminate(); static void _soSetTimeIndex(int timeIndex); static int _sfDetermineGroup(const byte *soundData); @@ -141,7 +143,6 @@ public: static void _sfRethinkVoiceTypes(); static void _sfUpdateVolume(Sound *sound); static void _sfDereferenceAll(); - static void sub_233EE(Sound *sound); static void _sfUpdatePriority(Sound *sound); static void _sfUpdateLoop(Sound *sound); static void _sfSetMasterVol(int volume); @@ -150,6 +151,9 @@ public: static bool _sfInstallDriver(SoundDriver *driver); static void _sfUnInstallDriver(SoundDriver *driver); static void _sfInstallPatchBank(const byte *bankData); + static void _sfDoAddToPlayList(Sound *sound); + static bool _sfDoRemoveFromPlayList(Sound *sound); + static void _sfDoUpdateVolume(Sound *sound); }; class Sound: public EventHandler { @@ -158,6 +162,7 @@ private: void _unPrime(); void orientAfterRestore(); public: + int _field0; int _field6; int _soundNum; int _groupNum; -- cgit v1.2.3 From 5b61092584042df494b871cfeb054a64933c2664 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 12 May 2011 23:09:48 +1000 Subject: TSAGE: More code for installing sound drivers --- engines/tsage/sound.cpp | 57 +++++++++++++++++++++++++++++++++++++------------ engines/tsage/sound.h | 27 ++++++++++++++++------- 2 files changed, 62 insertions(+), 22 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 39ebf07221..b47d95f36e 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -49,7 +49,7 @@ SoundManager::SoundManager() { _volume = 127; _suspendCtr = 0; _disableCtr = 0; - _field153 = 0; + _suspendedCount = 0; _driversDetected = false; } @@ -157,7 +157,7 @@ void SoundManager::installDriver(int driverNum) { byte *bankData = _resourceManager->getResource(RES_BANK, ROLAND_DRIVER_NUM, 0, true); if (bankData) { // Install the patch bank data - _sfInstallPatchBank(bankData); + _sfInstallPatchBank(driver, bankData); DEALLOCATE(bankData); } else { // Could not locate patch bank data, so unload the driver @@ -373,6 +373,10 @@ bool SoundManager::_sfIsOnPlayList(Sound *sound) { return result; } +void SoundManager::_sfRethinkSoundDrivers() { + +} + void SoundManager::_sfRethinkVoiceTypes() { } @@ -464,15 +468,29 @@ void SoundManager::_sfExtractGroupMask() { } bool SoundManager::_sfInstallDriver(SoundDriver *driver) { - return false; + if (!driver->open()) + return false; + + sfManager()._installedDrivers.push_back(driver); + uint32 *maskList = driver->getGroupMaskList(); + driver->_groupMask = *maskList; + + _sfExtractGroupMask(); + _sfRethinkSoundDrivers(); + driver->setVolume(sfManager()._volume); + + return true; } void SoundManager::_sfUnInstallDriver(SoundDriver *driver) { + sfManager()._installedDrivers.remove(driver); + _sfExtractGroupMask(); + _sfRethinkSoundDrivers(); } -void SoundManager::_sfInstallPatchBank(const byte *bankData) { - +void SoundManager::_sfInstallPatchBank(SoundDriver *driver, const byte *bankData) { + driver->installPatchBank(bankData); } /** @@ -540,10 +558,10 @@ Sound::Sound() { _holdAt = false; _cueValue = -1; _volume1 = -1; - _field1F = 0; + _volume3 = 0; _volume2 = 0; - _field21 = 0; - _field22 = 0; + _volume5 = 0; + _volume4 = 0; _timeIndex = 0; _field26 = 0; _trackInfo.count = 0; @@ -706,21 +724,21 @@ void Sound::mute(bool flag) { _globals->_soundManager.restartSoundServer(); } -void Sound::fade(int volume1, int volume2, int v3, int v4) { +void Sound::fade(int volume1, int volume2, int volume3, int volume4) { _globals->_soundManager.suspendSoundServer(); if (volume1 > 127) volume1 = 127; if (volume2 > 127) volume2 = 127; - if (v3 > 255) - v3 = 255; + if (volume3 > 255) + volume3 = 255; _volume1 = volume1; _volume2 = volume2; - _field1F = v3; - _field21 = 0; - _field22 = v4; + _volume3 = volume3; + _volume5 = 0; + _volume4 = volume4; _globals->_soundManager.restartSoundServer(); } @@ -856,4 +874,15 @@ void ASound::fade(int v1, int v2, int v3, int v4, Action *action) { _sound.fade(v1, v2, v3, v4); } + +/*--------------------------------------------------------------------------*/ + +SoundDriver::SoundDriver() { + _driverNum = 0; + _minVersion = _maxVersion = 0; + _groupMaskList = NULL; + + _groupMask = 0; +} + } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 6f86a930c0..a42f9b8c3a 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -61,11 +61,20 @@ public: Common::String _shortDescription, _longDescription; int _driverNum; int _minVersion, _maxVersion; + uint32 *_groupMaskList; + // The following fields were originally held in separate arrays in the SoundManager class + uint32 _groupMask; public: + SoundDriver(); + const Common::String &getShortDriverDescription() { return _shortDescription; } const Common::String &getLongDriverDescription() { return _longDescription; } - virtual void setVolume(int volume) = 0; + virtual bool open() { return true; } + virtual void close() {} + virtual uint32 *getGroupMaskList() const { return _groupMaskList; } + virtual void setVolume(int volume) {} + virtual void installPatchBank(const byte *data) {} }; class SoundManager : public SaveListener { @@ -80,7 +89,7 @@ public: int _volume; int _disableCtr; int _suspendCtr; - int _field153; + int _suspendedCount; bool _driversDetected; Common::List _soundList; Common::List _availableDrivers; @@ -140,6 +149,7 @@ public: 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(); @@ -150,7 +160,7 @@ public: static void _sfExtractGroupMask(); static bool _sfInstallDriver(SoundDriver *driver); static void _sfUnInstallDriver(SoundDriver *driver); - static void _sfInstallPatchBank(const byte *bankData); + static void _sfInstallPatchBank(SoundDriver *driver, const byte *bankData); static void _sfDoAddToPlayList(Sound *sound); static bool _sfDoRemoveFromPlayList(Sound *sound); static void _sfDoUpdateVolume(Sound *sound); @@ -178,10 +188,10 @@ public: int _holdAt; int _cueValue; int _volume1; - int _field1F; + int _volume3; int _volume2; - int _field21; - int _field22; + int _volume5; + int _volume4; uint _timeIndex; int _field26; int _field28[SOUND_ARR_SIZE]; @@ -218,7 +228,7 @@ public: bool isMuted() const; void pause(bool flag); void mute(bool flag); - void fade(int v1, int v2, int v3, int v4); + void fade(int volume1, int volume2, int volume3, int v4); void setTimeIndex(uint32 timeIndex); uint32 getTimeIndex() const; int getCueValue() const; @@ -274,7 +284,8 @@ public: class AdlibSoundDriver: public SoundDriver { public: - void setVolume(int volume) {} + virtual void setVolume(int volume) {} + virtual void installPatchBank(const byte *data) {} }; } // End of namespace tSage -- cgit v1.2.3 From 687d033d28f9d85b29f1f0edfcfb1751e1a92031 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 18 May 2011 20:32:40 +1000 Subject: TSAGE: Further sound driver installation logic --- engines/tsage/sound.cpp | 237 +++++++++++++++++++++++++++++++++++++++++++----- engines/tsage/sound.h | 51 +++++++++-- engines/tsage/tsage.cpp | 9 ++ engines/tsage/tsage.h | 5 +- 4 files changed, 274 insertions(+), 28 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index b47d95f36e..270325e284 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -43,6 +43,7 @@ SoundManager::SoundManager() { _groupList[i] = 0; _fieldE9[i] = 0; _field109[i] = 0; + _voiceStructPtrs[i] = NULL; } _groupMask = 0; @@ -51,6 +52,7 @@ SoundManager::SoundManager() { _disableCtr = 0; _suspendedCount = 0; _driversDetected = false; + _needToRethink = false; } SoundManager::~SoundManager() { @@ -58,9 +60,9 @@ SoundManager::~SoundManager() { for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) (*i)->stop(); for (Common::List::iterator i = _installedDrivers.begin(); i != _installedDrivers.end(); ) { - int driverNum = (*i)->_driverNum; + SoundDriver *driver = *i; ++i; - unInstallDriver(driverNum); + delete driver; } _sfTerminate(); } @@ -75,6 +77,43 @@ void SoundManager::postInit() { } } +/** + * Loops through all the loaded sounds, and stops any that have been flagged for stopping + */ +void SoundManager::dispatch() { + Common::List::iterator i = _soundList.begin(); + while (i != _soundList.end()) { + Sound *sound = *i; + ++i; + + // If the sound is flagged for stopping, then stop it + if (sound->_stopFlag) { + 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 &SoundManager::buildDriverList(bool detectFlag) { assert(__sndmgrReady); _availableDrivers.clear(); @@ -94,7 +133,9 @@ Common::List &SoundManager::buildDriverList(bool detectFlag) { } void SoundManager::installConfigDrivers() { +#ifdef TSAGE_SOUND installDriver(ADLIB_DRIVER_NUM); +#endif } Common::List &SoundManager::getDriverList(bool detectFlag) { @@ -304,6 +345,34 @@ void SoundManager::rethinkVoiceTypes() { _sfRethinkVoiceTypes(); } +void SoundManager::_sfSoundServer() { + if (!sfManager()._disableCtr && !sfManager()._suspendCtr) + return; + + if (sfManager()._needToRethink) { + _sfRethinkVoiceTypes(); + sfManager()._needToRethink = false; + } else { + _sfDereferenceAll(); + } + + // Handle any fading if necessary + do { + _sfProcessFading(); + } while (sfManager()._suspendCtr > 0); + sfManager()._suspendCtr = 0; + + // Poll all sound drivers in case they need it + for (Common::List::iterator i = sfManager()._installedDrivers.begin(); + i != sfManager()._installedDrivers.end(); ++i) { + (*i)->poll(); + } +} + +void SoundManager::_sfProcessFading() { + //TODO +} + /*--------------------------------------------------------------------------*/ void SoundManager::saveNotifier(bool postFlag) { @@ -353,7 +422,7 @@ int SoundManager::_sfDetermineGroup(const byte *soundData) { void SoundManager::_sfAddToPlayList(Sound *sound) { ++sfManager()._suspendCtr; _sfDoAddToPlayList(sound); - sound->_field6 = 0; + sound->_stopFlag = false; _sfRethinkVoiceTypes(); --sfManager()._suspendCtr; } @@ -374,7 +443,121 @@ bool SoundManager::_sfIsOnPlayList(Sound *sound) { } void SoundManager::_sfRethinkSoundDrivers() { - + // Free any existing entries + for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) { + if (sfManager()._voiceStructPtrs[idx]) { + delete sfManager()._voiceStructPtrs[idx]; + sfManager()._voiceStructPtrs[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::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) { + int dataSize = !flag ? total * 28 + 30 : total * 26 + 30; + debugC(9, ktSageSound, "data Size = %d\n", dataSize); + + VoiceStruct *vs = new VoiceStruct(); + sfManager()._voiceStructPtrs[idx] = vs; + + if (!flag) { + vs->_field0 = 0; + vs->_field1 = total; +// offset = 2; + } else { + vs->_field0 = 1; + vs->_field1 = vs->_field2 = total; +// offset = 4; + } + + for (Common::List::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) { + if (!flag) { + while ((byteVal = *groupData++) != 0xff) { + VoiceStructEntry ve; + ve._field1 = (byteVal & 0x80) ? 0 : 1; + ve._driver = driver; + ve._field4 = 0; + ve._field6 = 0; + ve._field8 = 0; + ve._field9 = 0; + ve._fieldA = 0; + + vs->_entries.push_back(ve); + } + } else { + byteVal = *groupData; + groupData += 2; + + for (int idx = 0; idx < byteVal; ++idx) { + VoiceStructEntry ve; + ve._field0 = idx; + ve._driver = driver; + ve._field4 = 0xff; + ve._field6 = 0; + ve._field8 = 0; + ve._fieldA = 0; + ve._fieldC = 0; + ve._fieldD = 0; + + vs->_entries.push_back(ve); + } + } + } else { + if (*groupData++ != 0) { + while (*groupData != 0xff) + ++groupData; + } + } + } + } + } + } } void SoundManager::_sfRethinkVoiceTypes() { @@ -472,8 +655,8 @@ bool SoundManager::_sfInstallDriver(SoundDriver *driver) { return false; sfManager()._installedDrivers.push_back(driver); - uint32 *maskList = driver->getGroupMaskList(); - driver->_groupMask = *maskList; + driver->_groupOffset = driver->getGroupData(); + driver->_groupMask = READ_LE_UINT32(driver->_groupOffset); _sfExtractGroupMask(); _sfRethinkSoundDrivers(); @@ -484,6 +667,7 @@ bool SoundManager::_sfInstallDriver(SoundDriver *driver) { void SoundManager::_sfUnInstallDriver(SoundDriver *driver) { sfManager()._installedDrivers.remove(driver); + delete driver; _sfExtractGroupMask(); _sfRethinkSoundDrivers(); @@ -530,10 +714,11 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { ++_globals->_soundManager._suspendCtr; for (int idx = 0; idx < 16; ++idx) { + /* Sound *snd = sfManager()._voiceStructPtrs[idx]; if (!snd) continue; - +*/ // TODO: More stuff } @@ -543,7 +728,7 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { /*--------------------------------------------------------------------------*/ Sound::Sound() { - _field6 = 0; + _stopFlag = false; _soundNum = 0; _groupNum = 0; _soundPriority = 0; @@ -555,7 +740,7 @@ Sound::Sound() { _loopFlag = false; _pauseCtr = 0; _muteCtr = 0; - _holdAt = false; + _holdAt = 0xff; _cueValue = -1; _volume1 = -1; _volume3 = 0; @@ -642,7 +827,7 @@ void Sound::_unPrime() { _globals->_soundManager.removeFromSoundList(this); _primed = false; - _field6 = 0; + _stopFlag = false; } } @@ -812,29 +997,30 @@ void Sound::release() { ASound::ASound(): EventHandler() { _action = NULL; - _cueFlag = false; + _cueValue = -1; } void ASound::synchronise(Serialiser &s) { EventHandler::synchronise(s); SYNC_POINTER(_action); - s.syncAsByte(_cueFlag); + s.syncAsByte(_cueValue); } void ASound::dispatch() { EventHandler::dispatch(); - if (!_sound.getCueValue()) { - _cueFlag = false; - _sound.setCueValue(1); + int cueValue = _sound.getCueValue(); + if (cueValue != -1) { + _cueValue = cueValue; + _sound.setCueValue(-1); if (_action) _action->signal(); } - if (!_cueFlag) { + if (_cueValue != -1) { if (!_sound.isPrimed()) { - _cueFlag = true; + _cueValue = -1; if (_action) { _action->signal(); _action = NULL; @@ -845,7 +1031,7 @@ void ASound::dispatch() { void ASound::play(int soundNum, Action *action, int volume) { _action = action; - _cueFlag = false; + _cueValue = 0; setVol(volume); _sound.play(soundNum); @@ -858,7 +1044,7 @@ void ASound::stop() { void ASound::prime(int soundNum, Action *action) { _action = action; - _cueFlag = false; + _cueValue = 0; _sound.prime(soundNum); } @@ -880,9 +1066,18 @@ void ASound::fade(int v1, int v2, int v3, int v4, Action *action) { SoundDriver::SoundDriver() { _driverNum = 0; _minVersion = _maxVersion = 0; - _groupMaskList = NULL; - _groupMask = 0; } +/*--------------------------------------------------------------------------*/ + +const byte adlib_group_data[] = { 1, 1, 9, 1, 0xff }; + +AdlibSoundDriver::AdlibSoundDriver() { + _groupData.groupMask = 1; + _groupData.v1 = 0x46; + _groupData.v2 = 0; + _groupData.pData = &adlib_group_data[0]; +} + } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index a42f9b8c3a..aaaaf5842d 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -56,14 +56,21 @@ public: Common::String longDescription; }; +struct GroupData { + uint32 groupMask; + byte v1; + byte v2; + const byte *pData; +}; + class SoundDriver { public: Common::String _shortDescription, _longDescription; int _driverNum; int _minVersion, _maxVersion; - uint32 *_groupMaskList; // The following fields were originally held in separate arrays in the SoundManager class uint32 _groupMask; + const GroupData *_groupOffset; public: SoundDriver(); @@ -72,9 +79,32 @@ public: virtual bool open() { return true; } virtual void close() {} - virtual uint32 *getGroupMaskList() const { return _groupMaskList; } + virtual const GroupData *getGroupData() = 0; virtual void setVolume(int volume) {} virtual void installPatchBank(const byte *data) {} + virtual void poll() {} +}; + +struct VoiceStructEntry { + int _field0; + int _field1; + SoundDriver *_driver; + int _field4; + int _field6; + int _field8; + int _field9; + int _fieldA; + int _fieldC; + int _fieldD; +}; + +class VoiceStruct { +public: + int _field0; + int _field1; + int _field2; + + Common::Array _entries; }; class SoundManager : public SaveListener { @@ -97,14 +127,16 @@ public: int _field89[SOUND_ARR_SIZE]; uint16 _groupList[SOUND_ARR_SIZE]; int _fieldE9[SOUND_ARR_SIZE]; - Sound *_voiceStructPtrs[SOUND_ARR_SIZE]; + VoiceStruct *_voiceStructPtrs[SOUND_ARR_SIZE]; + bool _needToRethink; public: SoundManager(); ~SoundManager(); - void dispatch() {} + void dispatch(); virtual void listenerSynchronise(Serialiser &s); virtual void postInit(); + void syncSounds(); static void saveNotifier(bool postFlag); void saveNotifierProc(bool postFlag); @@ -164,6 +196,8 @@ public: static void _sfDoAddToPlayList(Sound *sound); static bool _sfDoRemoveFromPlayList(Sound *sound); static void _sfDoUpdateVolume(Sound *sound); + static void _sfSoundServer(); + static void _sfProcessFading(); }; class Sound: public EventHandler { @@ -173,7 +207,7 @@ private: void orientAfterRestore(); public: int _field0; - int _field6; + bool _stopFlag; int _soundNum; int _groupNum; int _soundPriority; @@ -249,7 +283,7 @@ class ASound: public EventHandler { public: Sound _sound; Action *_action; - bool _cueFlag; + int _cueValue; ASound(); virtual void synchronise(Serialiser &s); @@ -283,9 +317,14 @@ public: }; class AdlibSoundDriver: public SoundDriver { +private: + GroupData _groupData; public: + AdlibSoundDriver(); + virtual void setVolume(int volume) {} virtual void installPatchBank(const byte *data) {} + virtual const GroupData *getGroupData() { return &_groupData; } }; } // End of namespace tSage diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp index 16756f59fa..05aea8eeb5 100644 --- a/engines/tsage/tsage.cpp +++ b/engines/tsage/tsage.cpp @@ -82,6 +82,9 @@ void TSageEngine::initialise() { _globals = new Globals(); _globals->gfxManager().setDefaults(); + + // Setup sound settings + syncSoundSettings(); } void TSageEngine::deinitialise() { @@ -139,4 +142,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 06c66d8f42..5903527701 100644 --- a/engines/tsage/tsage.h +++ b/engines/tsage/tsage.h @@ -55,7 +55,9 @@ enum { }; enum { - kRingDebugScripts = 1 << 0 + kRingDebugScripts = 1 << 0, + ktSageSound = 1 << 1, + ktSageCore = 1 << 2 }; struct tSageGameDescription; @@ -87,6 +89,7 @@ public: virtual bool canSaveGameStateCurrently(); virtual Common::Error loadGameState(int slot); virtual Common::Error saveGameState(int slot, const char *desc); + virtual void syncSoundSettings(); Common::String generateSaveName(int slot); void initialise(); -- cgit v1.2.3 From d52e69d82c650ab711668835da178a0f04e9e5f3 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 24 May 2011 20:07:41 +1000 Subject: TSAGE: Added some extra code for volume control and start on rethinking voice types --- engines/tsage/sound.cpp | 113 ++++++++++++++++++++++++++++++++++++++++++------ engines/tsage/sound.h | 21 ++++++++- 2 files changed, 119 insertions(+), 15 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 270325e284..878710b0f8 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -373,6 +373,29 @@ void SoundManager::_sfProcessFading() { //TODO } +void SoundManager::_sfUpdateVoiceStructs() { + for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { + VoiceStruct *vs = sfManager()._voiceStructPtrs[voiceIndex]; + + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + + if (vs->_voiceType == VOICETYPE_0) { + vse._field4 = vse._fieldC; + vse._field6 = vse._fieldE; + vse._field8 = vse._field10; + vse._field9 = vse._field11; + vse._fieldA = vse._field12; + } else { + vse._field8 = vse._fieldE; + vse._fieldA = vse._field10; + vse._fieldC = vse._field12; + vse._fieldD = vse._field13; + } + } + } +} + /*--------------------------------------------------------------------------*/ void SoundManager::saveNotifier(bool postFlag) { @@ -498,13 +521,11 @@ void SoundManager::_sfRethinkSoundDrivers() { sfManager()._voiceStructPtrs[idx] = vs; if (!flag) { - vs->_field0 = 0; + vs->_voiceType = VOICETYPE_0; vs->_field1 = total; -// offset = 2; } else { - vs->_field0 = 1; + vs->_voiceType = VOICETYPE_1; vs->_field1 = vs->_field2 = total; -// offset = 4; } for (Common::List::iterator i = sfManager()._installedDrivers.begin(); @@ -561,7 +582,56 @@ void SoundManager::_sfRethinkSoundDrivers() { } void SoundManager::_sfRethinkVoiceTypes() { - + ++sfManager()._suspendCtr; + _sfDereferenceAll(); + + for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { + VoiceStruct *vs = sfManager()._voiceStructPtrs[voiceIndex]; + if (!vs) + continue; + + if (vs->_voiceType == VOICETYPE_0) { + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + vse._field14 = vse._field4; + vse._field16 = vse._field6; + vse._field18 = vse._field8; + vse._field19 = vse._field9; + vse._field1A = vse._fieldA; + vse._field4 = 0; + vse._field6 = 0; + vse._field8 = 0; + vse._field9 = 0; + vse._fieldA = 0; + vse._fieldC = 0; + vse._fieldE = 0; + vse._field10 = 0; + vse._field11 = 0; + vse._field12 = 0; + } + } else { + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + vse._field14 = vse._field8; + vse._field16 = vse._fieldA; + vse._field18 = vse._fieldC; + vse._field19 = vse._fieldD; + vse._field8 = 0; + vse._fieldA = 0; + vse._fieldC = 0; + vse._fieldD = 0; + vse._fieldE = 0; + vse._field10 = 0; + vse._field12 = 0; + } + } + } + + int var2 = 0; + for (Common::List::iterator playIterator = sfManager()._playList.begin(); + playIterator != sfManager()._playList.end(); ++playIterator) { + + } } void SoundManager::_sfUpdateVolume(Sound *sound) { @@ -606,7 +676,7 @@ void SoundManager::_sfSetMasterVol(int volume) { for (Common::List::iterator i = _globals->_soundManager._installedDrivers.begin(); i != _globals->_soundManager._installedDrivers.end(); ++i) { - (*i)->setVolume(volume); + (*i)->setMasterVolume(volume); } } } @@ -660,7 +730,7 @@ bool SoundManager::_sfInstallDriver(SoundDriver *driver) { _sfExtractGroupMask(); _sfRethinkSoundDrivers(); - driver->setVolume(sfManager()._volume); + driver->setMasterVolume(sfManager()._volume); return true; } @@ -713,13 +783,27 @@ bool SoundManager::_sfDoRemoveFromPlayList(Sound *sound) { void SoundManager::_sfDoUpdateVolume(Sound *sound) { ++_globals->_soundManager._suspendCtr; - for (int idx = 0; idx < 16; ++idx) { - /* - Sound *snd = sfManager()._voiceStructPtrs[idx]; - if (!snd) + for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { + VoiceStruct *vs = sfManager()._voiceStructPtrs[voiceIndex]; + if (!vs) continue; -*/ - // TODO: More stuff + + 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._field4 && !vse._field6) { + int vol = sound->_volume * sound->_field48[vse._field8] / 127; + driver->setVolume0(voiceIndex, vse._field0, 7, vol); + } + } else { + if (!vse._field8 && !vse._fieldA) { + int vol = sound->_volume * sound->_field48[vse._fieldC] / 127; + driver->setVolume1(voiceIndex, vse._field0, 7, vol); + } + } + } } --_globals->_soundManager._suspendCtr; @@ -1074,6 +1158,9 @@ SoundDriver::SoundDriver() { const byte adlib_group_data[] = { 1, 1, 9, 1, 0xff }; AdlibSoundDriver::AdlibSoundDriver() { + _minVersion = 0x102; + + _groupData.groupMask = 1; _groupData.v1 = 0x46; _groupData.v2 = 0; diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index aaaaf5842d..29fafe79ba 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -80,8 +80,10 @@ public: virtual bool open() { return true; } virtual void close() {} virtual const GroupData *getGroupData() = 0; - virtual void setVolume(int volume) {} + virtual void setMasterVolume(int volume) {} virtual void installPatchBank(const byte *data) {} + virtual void setVolume0(int channel, int v2, int v3, int volume) {} + virtual void setVolume1(int channel, int v2, int v3, int volume) {} virtual void poll() {} }; @@ -96,11 +98,25 @@ struct VoiceStructEntry { int _fieldA; int _fieldC; int _fieldD; + int _fieldE; + int _field10; + int _field11; + int _field12; + int _field13; + int _field14; + int _field16; + int _field18; + int _field19; + + int _field1A; + int _field1B; }; +enum VoiceType {VOICETYPE_0 = 0, VOICETYPE_1 = 1}; + class VoiceStruct { public: - int _field0; + VoiceType _voiceType; int _field1; int _field2; @@ -198,6 +214,7 @@ public: static void _sfDoUpdateVolume(Sound *sound); static void _sfSoundServer(); static void _sfProcessFading(); + static void _sfUpdateVoiceStructs(); }; class Sound: public EventHandler { -- cgit v1.2.3 From 16666ec40c5425db1d8ae957c546d02a12f52c7d Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 27 Apr 2011 21:23:47 +1000 Subject: TSAGE: Created stub classes for ASound and Sound, and reworked engine to use proper named methods --- engines/tsage/converse.cpp | 2 +- engines/tsage/converse.h | 3 +- engines/tsage/core.cpp | 46 ++----- engines/tsage/core.h | 69 ---------- engines/tsage/globals.h | 3 +- engines/tsage/graphics.cpp | 2 +- engines/tsage/ringworld_demo.cpp | 2 +- engines/tsage/ringworld_demo.h | 3 +- engines/tsage/ringworld_logic.cpp | 2 +- engines/tsage/ringworld_scenes1.cpp | 148 ++++++++++---------- engines/tsage/ringworld_scenes1.h | 21 +-- engines/tsage/ringworld_scenes10.cpp | 43 +++--- engines/tsage/ringworld_scenes10.h | 8 +- engines/tsage/ringworld_scenes2.cpp | 37 ++--- engines/tsage/ringworld_scenes2.h | 4 +- engines/tsage/ringworld_scenes3.cpp | 252 +++++++++++++++++------------------ engines/tsage/ringworld_scenes3.h | 20 +-- engines/tsage/ringworld_scenes4.cpp | 8 +- engines/tsage/ringworld_scenes4.h | 2 +- engines/tsage/ringworld_scenes5.cpp | 88 ++++++------ engines/tsage/ringworld_scenes5.h | 10 +- engines/tsage/ringworld_scenes6.cpp | 36 ++--- engines/tsage/ringworld_scenes6.h | 8 +- engines/tsage/ringworld_scenes8.cpp | 50 +++---- engines/tsage/ringworld_scenes8.h | 14 +- engines/tsage/sound.cpp | 91 +++++++++++++ engines/tsage/sound.h | 43 ++++++ 27 files changed, 529 insertions(+), 486 deletions(-) (limited to 'engines/tsage') 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 7534abdec7..4cbe70f0e3 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -30,6 +30,7 @@ #include "tsage/scenes.h" #include "tsage/staticres.h" #include "tsage/globals.h" +#include "tsage/sound.h" namespace tSage { @@ -2944,53 +2945,22 @@ int SceneRegions::indexOf(const Common::Point &pt) { /*--------------------------------------------------------------------------*/ -SoundHandler::SoundHandler() { +ASound::ASound() { _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(); - } +void ASound::synchronize(Serializer &s) { + EventHandler::synchronize(s); - 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; - } - } - } + SYNC_POINTER(_action); + s.syncAsSint16LE(_field280); } -void SoundHandler::startSound(int soundNum, Action *action, int volume) { - _action = action; - _field280 = 0; - setVolume(volume); - _sound.startSound(soundNum); - - warning("TODO: SoundHandler::startSound"); +void ASound::dispatch() { + } - /*--------------------------------------------------------------------------*/ void SceneItemList::addItems(SceneItem *first, ...) { diff --git a/engines/tsage/core.h b/engines/tsage/core.h index 71130e5b0b..6c30c4fe19 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 { public: void addItems(SceneItem *first, ...); diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h index 6b3df587b6..fb1f3657b4 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 { @@ -57,7 +58,7 @@ public: SynchronizedList _sceneListeners; bool _flags[256]; Player _player; - SoundHandler _soundHandler; + ASound _soundHandler; InvObjectList *_inventory; Region _paneRegions[2]; int _paneRefreshFlag[2]; diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp index a212c5dd77..29262447f2 100644 --- a/engines/tsage/graphics.cpp +++ b/engines/tsage/graphics.cpp @@ -207,7 +207,7 @@ void Rect::expandPanes() { } /** - * Serialises the given rect + * Serializes the given rect */ void Rect::synchronize(Serializer &s) { s.syncAsSint16LE(left); diff --git a/engines/tsage/ringworld_demo.cpp b/engines/tsage/ringworld_demo.cpp index 3ad414fa20..4d3b527ac7 100644 --- a/engines/tsage/ringworld_demo.cpp +++ b/engines/tsage/ringworld_demo.cpp @@ -111,7 +111,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 2141fcce5a..022e706f36 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld_logic.cpp @@ -1342,7 +1342,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 b6daadbef7..9d261ac074 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,7 +3000,7 @@ void Scene6100::Action5::dispatch() { (tempSet.sqrt(zeroSet) < 150.0)) { switch (scene->_hitCount++) { case 1: - scene->_soundHandler.startSound(233); + scene->_soundHandler.play(233); scene->showMessage(NULL, 0, NULL); if (!_globals->getFlag(76)) @@ -3008,7 +3008,7 @@ void Scene6100::Action5::dispatch() { break; case 2: - scene->_soundHandler.startSound(234); + scene->_soundHandler.play(234); scene->showMessage(NULL, 0, NULL); if (!_globals->getFlag(76)) @@ -3017,7 +3017,7 @@ void Scene6100::Action5::dispatch() { break; default: - scene->_soundHandler.startSound(233); + scene->_soundHandler.play(233); scene->showMessage(NULL, 0, NULL); if (!_globals->getFlag(76)) @@ -3217,7 +3217,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 554b261f2c..07c89aff25 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); @@ -503,7 +504,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 f8844ec486..368992628f 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 9931d89ad4..f1aedc84cf 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: @@ -775,17 +775,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); @@ -846,7 +846,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: { @@ -879,7 +879,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: @@ -923,7 +923,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: { @@ -944,7 +944,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: @@ -969,7 +969,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: { @@ -983,7 +983,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); @@ -1095,7 +1095,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; @@ -1104,7 +1104,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); @@ -1135,7 +1135,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: { @@ -1150,7 +1150,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: @@ -1179,7 +1179,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: { @@ -1190,7 +1190,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); @@ -1250,7 +1250,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: { @@ -1265,7 +1265,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: @@ -1294,17 +1294,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); @@ -1687,8 +1687,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)); @@ -1755,8 +1755,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)) @@ -1774,8 +1774,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); @@ -1793,8 +1793,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(); @@ -1810,8 +1810,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)); @@ -1829,8 +1829,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); @@ -1857,8 +1857,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(); @@ -1869,8 +1869,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); @@ -1882,8 +1882,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); @@ -1900,8 +1900,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; @@ -2070,7 +2070,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 @@ -2101,7 +2101,7 @@ void Scene2120::Action1::dispatch() { setDelay(30); } - scene->_soundHandler.startSound(159); + scene->_soundHandler.play(159); } // Previous Page button handling @@ -2128,7 +2128,7 @@ void Scene2120::Action1::dispatch() { break; } - scene->_soundHandler.startSound(159); + scene->_soundHandler.play(159); } // Exit button handling @@ -2158,7 +2158,7 @@ void Scene2120::Action1::dispatch() { setDelay(1); } - scene->_soundHandler.startSound(159); + scene->_soundHandler.play(159); } } @@ -2228,7 +2228,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: { @@ -2278,7 +2278,7 @@ void Scene2150::Action1::signal() { } } - scene->_soundHandler.startSound(161); + scene->_soundHandler.play(161); scene->_area1.restore(); scene->_area2.restore(); scene->_area3.restore(); @@ -2287,7 +2287,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; @@ -2302,7 +2302,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: @@ -2329,10 +2329,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: @@ -2357,7 +2357,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(); @@ -2555,8 +2555,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: @@ -2705,7 +2705,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); @@ -2722,7 +2722,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); @@ -2878,7 +2878,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); } @@ -2939,8 +2939,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(); @@ -2980,9 +2980,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); @@ -3135,7 +3135,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); @@ -3221,7 +3221,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; @@ -3245,7 +3245,7 @@ void Scene2230::Action3::signal() { NpcMover *mover = new NpcMover(); _globals->_player.addMover(mover, &pt, this); - scene->_soundHandler.proc3(); + scene->_soundHandler.stop(); break; } case 1: @@ -3364,7 +3364,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); @@ -3447,7 +3447,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; @@ -3770,7 +3770,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: { @@ -3785,7 +3785,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: @@ -3806,7 +3806,7 @@ void Scene2280::Action2::signal() { break; } case 1: - scene->_soundHandler.startSound(265); + scene->_soundHandler.play(265); _globals->_player.setVisage(2162); _globals->_player._frame = 1; @@ -3826,7 +3826,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; @@ -3854,7 +3854,7 @@ void Scene2280::Action3::signal() { break; } case 1: - scene->_soundHandler.startSound(265); + scene->_soundHandler.play(265); _globals->_player.setVisage(2162); _globals->_player._frame = 6; @@ -4334,8 +4334,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, @@ -4385,7 +4385,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(); @@ -4423,7 +4423,7 @@ void Scene2300::Action1::signal() { break; } case 6: - scene->_soundHandler1.startSound(28); + scene->_soundHandler1.play(28); _globals->_player.disableControl(); scene->_hotspot2.setVisage(40); @@ -4437,7 +4437,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); @@ -4464,7 +4464,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; @@ -4481,7 +4481,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); @@ -4558,8 +4558,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; @@ -4602,8 +4602,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; @@ -4615,7 +4615,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); @@ -4636,7 +4636,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(); @@ -4646,7 +4646,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(); @@ -4657,10 +4657,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; } @@ -4736,7 +4736,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(); @@ -4767,8 +4767,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); @@ -5051,7 +5051,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); @@ -5077,7 +5077,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: { @@ -5126,7 +5126,7 @@ void Scene2320::Action3::signal() { } } - scene->_soundHandler.startSound(161); + scene->_soundHandler.play(161); scene->_area1.restore(); scene->_area2.restore(); scene->_area3.restore(); @@ -5135,7 +5135,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; @@ -5151,7 +5151,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: @@ -5236,8 +5236,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(); @@ -5296,7 +5296,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); @@ -5447,7 +5447,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: @@ -5872,8 +5872,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)); @@ -5890,8 +5890,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); @@ -5907,8 +5907,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); @@ -5919,9 +5919,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); @@ -5978,8 +5978,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); @@ -6110,7 +6110,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 3c3b90db56..6699ec5d1e 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 fc7362c380..cdd0236cf8 100644 --- a/engines/tsage/ringworld_scenes5.cpp +++ b/engines/tsage/ringworld_scenes5.cpp @@ -101,7 +101,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); @@ -345,14 +345,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); @@ -418,7 +418,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); @@ -481,12 +481,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; } @@ -851,7 +851,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); @@ -884,7 +884,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(); @@ -946,7 +946,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { } if (_globals->_stripNum == 4025) { - _soundHandler1.startSound(182); + _soundHandler1.play(182); _forceField.remove(); _hotspot5.postInit(); @@ -1024,7 +1024,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { break; case 4050: - _globals->_soundHandler.startSound(155); + _globals->_soundHandler.play(155); _globals->_player.disableControl(); if (_globals->_stripNum == 4050) { @@ -1061,7 +1061,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { break; default: - _globals->_soundHandler.startSound(155); + _globals->_soundHandler.play(155); _lander.postInit(); _lander.setVisage(4002); @@ -1085,7 +1085,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); @@ -1224,8 +1224,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); } @@ -1873,7 +1873,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(); @@ -2254,7 +2254,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); @@ -2265,7 +2265,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: @@ -2279,7 +2279,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; @@ -2698,7 +2698,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); @@ -3072,8 +3072,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() { @@ -3087,7 +3087,7 @@ void Scene4150::dispatch() { Scene::dispatch(); if (!_action && (_globals->_player._position.x >= 316)) { - _globals->_soundHandler.proc1(NULL); + _globals->_soundHandler.fadeOut(NULL); _globals->_player.disableControl(); _sceneMode = 4152; setAction(&_sequenceManager, this, 4152, &_globals->_player, NULL); @@ -3390,7 +3390,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; @@ -3419,7 +3419,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; @@ -3626,7 +3626,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() { @@ -3659,7 +3659,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: @@ -3727,36 +3727,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; @@ -3769,7 +3769,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(); @@ -3892,7 +3892,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) || @@ -3958,7 +3958,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; @@ -4217,11 +4217,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(); @@ -4246,7 +4246,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 @@ -4261,7 +4261,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; @@ -4271,7 +4271,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(); @@ -4305,7 +4305,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 _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 958c0ef9e2..edcd638dd7 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() { @@ -638,7 +638,7 @@ void Scene5100::Action1::signal() { } break; case 4: - scene->_soundHandler.startSound(206); + scene->_soundHandler.play(206); scene->_hotspot5.postInit(); scene->_hotspot5.setVisage(5362); @@ -737,7 +737,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(_owner)->_position.x < _globals->_player._position.x) { scene->_hotspot2.setVisage(5130); scene->_hotspot2._strip = 1; @@ -783,7 +783,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(); @@ -1284,7 +1284,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() { @@ -1380,7 +1380,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); @@ -1391,7 +1391,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); @@ -1466,7 +1466,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; @@ -1481,7 +1481,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; @@ -1518,7 +1518,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: @@ -1617,8 +1617,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); @@ -1638,7 +1638,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(); @@ -2116,7 +2116,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() { @@ -2126,7 +2126,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 05306fb450..f37a9346a7 100644 --- a/engines/tsage/ringworld_scenes8.cpp +++ b/engines/tsage/ringworld_scenes8.cpp @@ -59,7 +59,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); @@ -182,7 +182,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); @@ -212,7 +212,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; @@ -542,7 +542,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(); @@ -561,7 +561,7 @@ void Scene7000::postInit(SceneObjectList *OwnerList) { setAction(&_action1); } } else { - _globals->_soundHandler.startSound(250); + _globals->_soundHandler.play(250); _globals->setFlag(72); _object3.postInit(); @@ -607,9 +607,10 @@ 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); } @@ -1131,9 +1132,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 @@ -1298,7 +1299,7 @@ void Scene7200::postInit(SceneObjectList *OwnerList) { _swimmer.setPosition(Common::Point(-8, 16)); setAction(&_action1); - _soundHandler.startSound(271); + _soundHandler.play(271); } /*-------------------------------------------------------------------------- @@ -1340,7 +1341,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); @@ -1493,7 +1494,7 @@ void Scene7300::postInit(SceneObjectList *OwnerList) { _object8._numFrames = 2; setAction(&_action1); - _globals->_soundHandler.startSound(272); + _globals->_soundHandler.play(272); } /*-------------------------------------------------------------------------- @@ -1597,8 +1598,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); } /*-------------------------------------------------------------------------- @@ -1661,7 +1662,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); @@ -1870,7 +1871,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)) { @@ -1896,7 +1897,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) { @@ -2030,7 +2031,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(); @@ -2120,7 +2121,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); @@ -2218,7 +2220,7 @@ void Scene7700::signal() { } break; case 7702: - _soundHandler.proc1(0); + _soundHandler.fadeOut(0); _globals->_sceneManager.changeScene(7600); break; case 7703: @@ -2229,7 +2231,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)); @@ -2516,7 +2518,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..912bbacadd 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -54,4 +54,95 @@ void SoundManager::listenerSynchronize(Serializer &s) { warning("TODO: SoundManager listenerSynchronize"); } +/*--------------------------------------------------------------------------*/ + +void ASound::play(int soundNum, Action *action, int volume) { + +} + +void ASound::stop() { + +} + +void ASound::prime(int v, Action *action) { + +} + +void ASound::unPrime() { + +} + +void ASound::go() { + +} + +void ASound::hault(void) { +} + +int ASound::getSoundNum() const { return 0; } +bool ASound::isPlaying() const { return false; } +bool ASound::isPaused() const { return false; } +bool ASound::isMuted() const { return false; } + +void ASound::pause() { + +} + +void ASound::mute() { + +} + +void ASound::fadeIn() { + +} + +void ASound::fadeOut(EventHandler *evtHandler) { + +} + +void ASound::fade(int v1, int v2, int v3, int v4, EventHandler *evtHandler) { + +} + +void ASound::setTimeIndex(uint32 timeIndex) { + +} + +uint32 ASound::getTimeIndex() const { + return 0; +} + +void ASound::setPri(int v) { + +} + +void ASound::setLoop(bool flag) { + +} + +int ASound::getPri() const { + return 0; +} + +bool ASound::getLoop() { + return false; +} + +void ASound::setVolume(int volume) { + +} + +int ASound::getVol() const { + return 0; +} + +void ASound::holdAt(int v) { + +} + +void ASound::release() { + +} + + } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 03ae77b703..d1099fabcc 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -25,6 +25,7 @@ #include "common/scummsys.h" #include "tsage/saveload.h" +#include "tsage/core.h" namespace tSage { @@ -41,6 +42,48 @@ public: void loadNotifierProc(bool postFlag); }; +class Sound: public EventHandler { +public: + +}; + +class ASound: public Sound { +public: + Sound _sound; + Action *_action; + int _field280; + + ASound(); + virtual void synchronize(Serializer &s); + virtual void dispatch(); + + void play(int soundNum, Action *action = NULL, int volume = 127); + void stop(); + void prime(int v, Action *action = NULL); + void unPrime(); + void go(); + void hault(void); + int getSoundNum() const; + bool isPlaying() const; + bool isPaused() const; + bool isMuted() const; + void pause(); + void mute(); + void fadeIn(); + void fadeOut(EventHandler *evtHandler); + void fade(int v1, int v2, int v3, int v4, EventHandler *evtHandler); + void setTimeIndex(uint32 timeIndex); + uint32 getTimeIndex() const; + void setPri(int v); + void setLoop(bool flag); + int getPri() const; + bool getLoop(); + void setVolume(int volume); + int getVol() const; + void holdAt(int v); + void release(); +}; + } // End of namespace tSage #endif -- cgit v1.2.3 From 120a648e68a35790ee92682d4dfddc0c216b53ef Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 27 Apr 2011 22:22:20 +1000 Subject: TSAGE: Implemented the code for the ASound class --- engines/tsage/core.cpp | 18 ------ engines/tsage/sound.cpp | 156 +++++++++++++++++++++++++++++++++++++++--------- engines/tsage/sound.h | 67 +++++++++++++++------ 3 files changed, 175 insertions(+), 66 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 4cbe70f0e3..873bbc56a5 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -2945,24 +2945,6 @@ int SceneRegions::indexOf(const Common::Point &pt) { /*--------------------------------------------------------------------------*/ -ASound::ASound() { - _action = NULL; - _field280 = -1; -} - -void ASound::synchronize(Serializer &s) { - EventHandler::synchronize(s); - - SYNC_POINTER(_action); - s.syncAsSint16LE(_field280); -} - -void ASound::dispatch() { - -} - -/*--------------------------------------------------------------------------*/ - void SceneItemList::addItems(SceneItem *first, ...) { va_list va; va_start(va, first); diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 912bbacadd..c628cf4d31 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -56,93 +56,191 @@ void SoundManager::listenerSynchronize(Serializer &s) { /*--------------------------------------------------------------------------*/ -void ASound::play(int soundNum, Action *action, int volume) { - +void Sound::play(int soundNum, int volume) { + } -void ASound::stop() { +void Sound::stop() { } -void ASound::prime(int v, Action *action) { +void Sound::prime(int soundNum) { } -void ASound::unPrime() { +void Sound::prime(int soundNum, int v2) { + +} + +void Sound::_unPrime() { } -void ASound::go() { +void Sound::unPrime() { } -void ASound::hault(void) { +void Sound::go() { + } -int ASound::getSoundNum() const { return 0; } -bool ASound::isPlaying() const { return false; } -bool ASound::isPaused() const { return false; } -bool ASound::isMuted() const { return false; } +void Sound::halt(void) { -void ASound::pause() { +} +int Sound::getSoundNum() const { + return 0; } -void ASound::mute() { +bool Sound::isPlaying() const { + return false; +} +bool Sound::isPrimed() const { + return false; } -void ASound::fadeIn() { +bool Sound::isPaused() const { + return false; +} +bool Sound::isMuted() const { + return false; } -void ASound::fadeOut(EventHandler *evtHandler) { +void Sound::pause() { } -void ASound::fade(int v1, int v2, int v3, int v4, EventHandler *evtHandler) { +void Sound::mute() { } -void ASound::setTimeIndex(uint32 timeIndex) { +void Sound::fadeIn() { } -uint32 ASound::getTimeIndex() const { - return 0; +void Sound::fadeOut(EventHandler *evtHandler) { + } -void ASound::setPri(int v) { +void Sound::fade(int v1, int v2, int v3, int v4) { } -void ASound::setLoop(bool flag) { +void Sound::setTimeIndex(uint32 timeIndex) { } -int ASound::getPri() const { - return 0; +uint32 Sound::getTimeIndex() const { + return 0; +} + +bool Sound::getCueValue() const { + return false; } -bool ASound::getLoop() { - return false; +void Sound::setCueValue(bool flag) { + } -void ASound::setVolume(int volume) { +void Sound::setVol(int volume) { } -int ASound::getVol() const { +int Sound::getVol() const { return 0; } -void ASound::holdAt(int v) { +void Sound::setPri(int v) { + +} + +void Sound::setLoop(bool flag) { } -void ASound::release() { +int Sound::getPri() const { + return 0; +} +bool Sound::getLoop() { + return false; } +void Sound::holdAt(int v) { + +} + +void Sound::release() { + +} + + +/*--------------------------------------------------------------------------*/ + +ASound::ASound(): EventHandler() { + _action = NULL; + _cueFlag = false; +} + +void ASound::synchronize(Serializer &s) { + EventHandler::synchronize(s); + SYNC_POINTER(_action); + s.syncAsByte(_cueFlag); +} + +void ASound::dispatch() { + EventHandler::dispatch(); + + if (!_sound.getCueValue()) { + _cueFlag = false; + _sound.setCueValue(true); + + if (_action) + _action->signal(); + } + + if (!_cueFlag) { + if (!_sound.isPrimed()) { + _cueFlag = true; + if (_action) { + _action->signal(); + _action = NULL; + } + } + } +} + +void ASound::play(int soundNum, Action *action, int volume) { + _action = action; + _cueFlag = false; + + setVol(volume); + _sound.play(soundNum); +} + +void ASound::stop() { + _sound.stop(); + _action = NULL; +} + +void ASound::prime(int soundNum, Action *action) { + _action = action; + _cueFlag = false; + _sound.prime(soundNum); +} + +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); +} } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index d1099fabcc..2155a935cd 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -44,46 +44,75 @@ public: class Sound: public EventHandler { public: - -}; - -class ASound: public Sound { -public: - Sound _sound; - Action *_action; - int _field280; - - ASound(); - virtual void synchronize(Serializer &s); - virtual void dispatch(); - - void play(int soundNum, Action *action = NULL, int volume = 127); + void play(int soundNum, int volume = 127); void stop(); - void prime(int v, Action *action = NULL); + void prime(int soundNum); + void prime(int soundNum, int v2); + void _unPrime(); void unPrime(); void go(); - void hault(void); + void halt(void); int getSoundNum() const; bool isPlaying() const; + bool isPrimed() const; bool isPaused() const; bool isMuted() const; void pause(); void mute(); void fadeIn(); void fadeOut(EventHandler *evtHandler); - void fade(int v1, int v2, int v3, int v4, EventHandler *evtHandler); + void fade(int v1, int v2, int v3, int v4); void setTimeIndex(uint32 timeIndex); uint32 getTimeIndex() const; + bool getCueValue() const; + void setCueValue(bool flag); + void setVol(int volume); + int getVol() const; void setPri(int v); void setLoop(bool flag); int getPri() const; bool getLoop(); - void setVolume(int volume); - int getVol() const; void holdAt(int v); void release(); }; +class ASound: public EventHandler { +public: + Sound _sound; + Action *_action; + bool _cueFlag; + + 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(); } + int getSoundNum() const { return _sound.getSoundNum(); } + bool isPlaying() const { return _sound.isPlaying(); } + bool isPaused() const { return _sound.isPaused(); } + bool isMuted() const { return _sound.isMuted(); } + void pause() { _sound.pause(); } + void mute() { _sound.mute(); } + 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(); } +}; + } // End of namespace tSage #endif -- cgit v1.2.3 From c1dea849039d3df944c619df93f5a3423816101b Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 29 Apr 2011 20:19:37 +1000 Subject: TSAGE: Added fields for the Sound class --- engines/tsage/sound.h | 52 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 2155a935cd..1797da2b79 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -42,13 +42,61 @@ public: void loadNotifierProc(bool postFlag); }; +#define SOUND_ARR_SIZE 16 + +struct trackInfoStruct { + int count; + int rlbList[32]; + uint32 handleList[75]; +}; + class Sound: public EventHandler { +private: + void _prime(int soundNum, int v2); + void _unPrime(); +public: + int _field6; + int _soundNum; + int _fieldA; + int _fieldE; + int _priority2; + int _field10; + bool _loopFlag2; + int _priority; + int _volume; + bool _loopFlag; + int _pauseCtr; + int _muteCtr; + int _holdAt; + bool _cueValue; + int _field1E; + int _field1F; + int _field20; + int _field21; + int _field22; + uint _timeIndex; + int _field26; + int _field28[SOUND_ARR_SIZE]; + int _field38[SOUND_ARR_SIZE]; + int _field48[SOUND_ARR_SIZE]; + int _field58[SOUND_ARR_SIZE]; + int _field68[SOUND_ARR_SIZE]; + int _field78[SOUND_ARR_SIZE]; + int _field98[SOUND_ARR_SIZE]; + int _fieldA8[SOUND_ARR_SIZE]; + int _fieldB8[SOUND_ARR_SIZE]; + int _fieldC8[SOUND_ARR_SIZE]; + int _fieldE8[SOUND_ARR_SIZE]; + trackInfoStruct _trackInfo; + int _field266; + int _field268; + bool _primed; + int _field26C; + int _field26E; public: void play(int soundNum, int volume = 127); void stop(); void prime(int soundNum); - void prime(int soundNum, int v2); - void _unPrime(); void unPrime(); void go(); void halt(void); -- cgit v1.2.3 From 22bab4ef954640d78c75cbc2aef11571b24550ac Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 1 May 2011 15:23:30 +1000 Subject: TSAGE: Implemented the methods of the Sound class --- engines/tsage/sound.cpp | 352 +++++++++++++++++++++++++++++++++++++++++++----- engines/tsage/sound.h | 106 +++++++++++---- 2 files changed, 395 insertions(+), 63 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index c628cf4d31..fab6377647 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -24,6 +24,7 @@ #include "tsage/globals.h" #include "tsage/debugger.h" #include "tsage/graphics.h" +#include "tsage/tsage.h" namespace tSage { @@ -56,127 +57,406 @@ void SoundManager::listenerSynchronize(Serializer &s) { /*--------------------------------------------------------------------------*/ -void Sound::play(int soundNum, int volume) { +void SoundManager::checkResVersion(const byte *soundData) { + int minVersion = READ_LE_UINT16(soundData + 4); + int maxVersion = READ_LE_UINT16(soundData + 6); + if (_globals->_soundManager._minVersion >= maxVersion) + error("Attempt to play/prime sound resource that is too new"); + if (_globals->_soundManager._minVersion > minVersion) + error("Attempt to play/prime sound resource that is too old"); } -void Sound::stop() { +int SoundManager::determineGroup(const byte *soundData) { + return _sfDetermineGroup(soundData); +} + +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::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::extractTrackInfo(trackInfoStruct *data, const byte *soundData, int groupNum) { + +} + +void SoundManager::suspendSoundServer() { + ++_globals->_soundManager._suspendCtr; +} + +void SoundManager::rethinkVoiceTypes() { + _sfRethinkVoiceTypes(); +} + +void SoundManager::restartSoundServer() { + if (_globals->_soundManager._suspendCtr > 0) + --_globals->_soundManager._suspendCtr; +} + +void SoundManager::updateSoundVol(Sound *sound) { + _sfUpdateVolume(sound); +} + +void SoundManager::updateSoundPri(Sound *sound) { + _sfUpdatePriority(sound); +} + +void SoundManager::updateSoundLoop(Sound *sound) { + _sfUpdateLoop(sound); +} + +/*--------------------------------------------------------------------------*/ + +void SoundManager::_soSetTimeIndex(int timeIndex) { + warning("TODO: _soSetTimeIndex"); +} + +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 & _globals->_soundManager._groupMask) == v) + return v; + + p = soundData + 6 + (READ_LE_UINT16(p + 4) * 4); + } + + return 0; +} + +void SoundManager::_sfAddToPlayList(Sound*soundData) { + +} + +void SoundManager::_sfRemoveFromPlayList(Sound *sound) { + +} + +bool SoundManager::_sfIsOnPlayList(Sound *sound) { + ++_globals->_soundManager._suspendCtr; + bool result = contains(_globals->_soundManager._playList, sound); + --_globals->_soundManager._suspendCtr; + + return result; +} + +void SoundManager::_sfRethinkVoiceTypes() { + +} + +void SoundManager::_sfUpdateVolume(Sound *sound) { + _sfDereferenceAll(); + sub_233EE(sound); +} + +void SoundManager::_sfDereferenceAll() { + +} + +void SoundManager::sub_233EE(Sound *sound) { + +} + +void SoundManager::_sfUpdatePriority(Sound *sound) { + +} + +void SoundManager::_sfUpdateLoop(Sound *sound) { } +/*--------------------------------------------------------------------------*/ + +Sound::Sound() { + _field6 = 0; + _soundNum = 0; + _groupNum = 0; + _soundPriority = 0; + _priority2 = -1; + _loop = true; + _loopFlag2 = true; + _priority = 0; + _volume = 127; + _loopFlag = false; + _pauseCtr = 0; + _muteCtr = 0; + _holdAt = false; + _cueValue = -1; + _volume1 = -1; + _field1F = 0; + _volume2 = 0; + _field21 = 0; + _field22 = 0; + _timeIndex = 0; + _field26 = 0; + _trackInfo.count = 0; + _primed = false; + _field26C = 0; + _field26E = NULL; +} + +void Sound::play(int soundNum) { + prime(soundNum); + _globals->_soundManager.addToPlayList(this); +} + +void Sound::stop() { + _globals->_soundManager.removeFromPlayList(this); + _unPrime(); +} + void Sound::prime(int soundNum) { + if (_soundNum != -1) { + stop(); + _prime(soundNum, false); + } +} +void Sound::unPrime() { + stop(); } -void Sound::prime(int soundNum, int v2) { +void Sound::_prime(int soundNum, bool queFlag) { + if (_primed) + unPrime(); + + if (_soundNum != -1) { + // Sound number specified + _field26E = NULL; + byte *soundData = _resourceManager->getResource(RES_SOUND, soundNum, 0); + _globals->_soundManager.checkResVersion(soundData); + _groupNum = _globals->_soundManager.determineGroup(soundData); + _soundPriority = _globals->_soundManager.extractPriority(soundData); + _loop = _globals->_soundManager.extractLoop(soundData); + _globals->_soundManager.extractTrackInfo(&_trackInfo, soundData, _groupNum); + + for (int idx = 0; idx < _trackInfo.count; ++idx) { + _trackInfo.handleList[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo.rlbList[idx]); + } + + DEALLOCATE(soundData); + } else { + // No sound specified + _groupNum = 0; + _soundPriority = 0; + _loop = 0; + _trackInfo.count = 0; + _trackInfo.handleList[0] = ALLOCATE(200); + _field26E = ALLOCATE(200); + } + + if (queFlag) + _globals->_soundManager.addToSoundList(this); + _primed = true; } void Sound::_unPrime() { + if (_primed) { + if (_field26C) { + DEALLOCATE(_trackInfo.handleList[0]); + DEALLOCATE(_field26E); + _field26E = NULL; + } else { + for (int idx = 0; idx < _trackInfo.count; ++idx) { + DEALLOCATE(_trackInfo.handleList[idx]); + } + } + _trackInfo.count = 0; + _globals->_soundManager.removeFromSoundList(this); + + _primed = false; + _field6 = 0; + } } -void Sound::unPrime() { +void Sound::orientAfterDriverChange() { + if (!_field26C) { + int timeIndex = getTimeIndex(); + + for (int idx = 0; idx < _trackInfo.count; ++idx) + DEALLOCATE(_trackInfo.handleList[idx]); + + _trackInfo.count = 0; + _primed = false; + _prime(_soundNum, true); + setTimeIndex(timeIndex); + } +} +void Sound::orientAfterRestore() { + if (_field26C) { + int timeIndex = getTimeIndex(); + _primed = false; + _prime(_soundNum, true); + setTimeIndex(timeIndex); + } } void Sound::go() { + if (!_primed) + error("Attempt to execute Sound::go() on an unprimed Sound"); + _globals->_soundManager.addToPlayList(this); } void Sound::halt(void) { - + _globals->_soundManager.removeFromPlayList(this); } int Sound::getSoundNum() const { - return 0; + return _soundNum; } -bool Sound::isPlaying() const { - return false; +bool Sound::isPlaying() { + return _globals->_soundManager.isOnPlayList(this); } bool Sound::isPrimed() const { - return false; + return _primed; } bool Sound::isPaused() const { - return false; + return _pauseCtr != 0; } bool Sound::isMuted() const { - return false; + return _muteCtr != 0; } -void Sound::pause() { +void Sound::pause(bool flag) { + _globals->_soundManager.suspendSoundServer(); -} - -void Sound::mute() { + if (flag) + ++_pauseCtr; + else if (_pauseCtr > 0) + --_pauseCtr; + _globals->_soundManager.rethinkVoiceTypes(); + _globals->_soundManager.restartSoundServer(); } -void Sound::fadeIn() { +void Sound::mute(bool flag) { + _globals->_soundManager.suspendSoundServer(); + + if (flag) + ++_muteCtr; + else if (_muteCtr > 0) + --_muteCtr; + _globals->_soundManager.rethinkVoiceTypes(); + _globals->_soundManager.restartSoundServer(); } -void Sound::fadeOut(EventHandler *evtHandler) { +void Sound::fade(int volume1, int volume2, int v3, int v4) { + _globals->_soundManager.suspendSoundServer(); -} + if (volume1 > 127) + volume1 = 127; + if (volume2 > 127) + volume2 = 127; + if (v3 > 255) + v3 = 255; -void Sound::fade(int v1, int v2, int v3, int v4) { + _volume1 = volume1; + _volume2 = volume2; + _field1F = v3; + _field21 = 0; + _field22 = v4; + _globals->_soundManager.restartSoundServer(); } void Sound::setTimeIndex(uint32 timeIndex) { - + if (_primed) { + mute(true); + SoundManager::_soSetTimeIndex(timeIndex); + mute(false); + } } uint32 Sound::getTimeIndex() const { - return 0; + return _timeIndex; } -bool Sound::getCueValue() const { - return false; +int Sound::getCueValue() const { + return _cueValue; } -void Sound::setCueValue(bool flag) { - +void Sound::setCueValue(int cueValue) { + _cueValue = cueValue; } void Sound::setVol(int volume) { + if (volume > 127) + volume = 127; + if (_volume != volume) { + _volume = volume; + if (isPlaying()) + _globals->_soundManager.updateSoundVol(this); + } } int Sound::getVol() const { - return 0; + return _volume; } -void Sound::setPri(int v) { - +void Sound::setPri(int priority) { + if (priority > 127) + priority = 127; + _priority2 = priority; + _globals->_soundManager.updateSoundPri(this); } void Sound::setLoop(bool flag) { - + _loopFlag2 = flag; + _globals->_soundManager.updateSoundLoop(this); } int Sound::getPri() const { - return 0; + return _priority; } bool Sound::getLoop() { - return false; + return _loopFlag; } -void Sound::holdAt(int v) { - +void Sound::holdAt(int amount) { + if (amount > 127) + amount = 127; + _holdAt = amount; } void Sound::release() { - + _holdAt = -1; } - /*--------------------------------------------------------------------------*/ ASound::ASound(): EventHandler() { @@ -195,7 +475,7 @@ void ASound::dispatch() { if (!_sound.getCueValue()) { _cueFlag = false; - _sound.setCueValue(true); + _sound.setCueValue(1); if (_action) _action->signal(); diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 1797da2b79..4529ec89f1 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -24,12 +24,37 @@ #define TSAGE_SOUND_H #include "common/scummsys.h" +#include "common/list.h" #include "tsage/saveload.h" #include "tsage/core.h" namespace tSage { +class Sound; + +struct trackInfoStruct { + int count; + int rlbList[32]; + byte *handleList[75]; +}; + class SoundManager : public SaveListener { +public: + int _minVersion, _maxVersion; + Common::List _playList; + void *driverList2[16]; + int _field89[16]; + int _fieldA9[16]; + int _fieldE9[16]; + int _field109[16]; + uint32 _groupMask; + int volume; + int _disableCtr; + int _suspendCtr; + int _field153; + Common::List _soundList; + Common::List _driverList; + int _field16D; public: void dispatch() {} virtual void listenerSynchronize(Serializer &s); @@ -40,27 +65,54 @@ public: void saveNotifierProc(bool postFlag); static void loadNotifier(bool postFlag); void loadNotifierProc(bool postFlag); -}; -#define SOUND_ARR_SIZE 16 + void checkResVersion(const byte *soundData); + int determineGroup(const byte *soundData); + int extractPriority(const byte *soundData); + int extractLoop(const byte *soundData); + void addToSoundList(Sound *sound); + void removeFromSoundList(Sound *sound); + void addToPlayList(Sound *sound); + void removeFromPlayList(Sound *sound); + bool isOnPlayList(Sound *sound); + void extractTrackInfo(trackInfoStruct *data, const byte *soundData, int groupNum); + void suspendSoundServer(); + void rethinkVoiceTypes(); + void restartSoundServer(); + void updateSoundVol(Sound *sound); + void updateSoundPri(Sound *sound); + void updateSoundLoop(Sound *sound); + + // _so methods + static void _soSetTimeIndex(int timeIndex); + static int _sfDetermineGroup(const byte *soundData); + static void _sfAddToPlayList(Sound *sound); + static void _sfRemoveFromPlayList(Sound *sound); + static bool _sfIsOnPlayList(Sound *sound); + static void _sfRethinkVoiceTypes(); + static void _sfUpdateVolume(Sound *sound); + static void _sfDereferenceAll(); + static void sub_233EE(Sound *sound); + static void _sfUpdatePriority(Sound *sound); + static void _sfUpdateLoop(Sound *sound); -struct trackInfoStruct { - int count; - int rlbList[32]; - uint32 handleList[75]; }; +#define SOUND_ARR_SIZE 16 + class Sound: public EventHandler { private: - void _prime(int soundNum, int v2); + void _prime(int soundNum, bool queFlag); void _unPrime(); + void orientAfterDriverChange(); + void orientAfterRestore(); public: int _field6; int _soundNum; - int _fieldA; - int _fieldE; + int _groupNum; + int _soundPriority; int _priority2; - int _field10; + int _loop; bool _loopFlag2; int _priority; int _volume; @@ -68,10 +120,10 @@ public: int _pauseCtr; int _muteCtr; int _holdAt; - bool _cueValue; - int _field1E; + int _cueValue; + int _volume1; int _field1F; - int _field20; + int _volume2; int _field21; int _field22; uint _timeIndex; @@ -92,35 +144,35 @@ public: int _field268; bool _primed; int _field26C; - int _field26E; + byte *_field26E; public: - void play(int soundNum, int volume = 127); + Sound(); + + void play(int soundNum); void stop(); void prime(int soundNum); void unPrime(); void go(); void halt(void); + bool isPlaying(); int getSoundNum() const; - bool isPlaying() const; bool isPrimed() const; bool isPaused() const; bool isMuted() const; - void pause(); - void mute(); - void fadeIn(); - void fadeOut(EventHandler *evtHandler); + void pause(bool flag); + void mute(bool flag); void fade(int v1, int v2, int v3, int v4); void setTimeIndex(uint32 timeIndex); uint32 getTimeIndex() const; - bool getCueValue() const; - void setCueValue(bool flag); + int getCueValue() const; + void setCueValue(int cueValue); void setVol(int volume); int getVol() const; - void setPri(int v); + void setPri(int priority); void setLoop(bool flag); int getPri() const; bool getLoop(); - void holdAt(int v); + void holdAt(int amount); void release(); }; @@ -140,12 +192,12 @@ public: void unPrime(); void go() { _sound.go(); } void hault(void) { _sound.halt(); } + bool isPlaying() { return _sound.isPlaying(); } int getSoundNum() const { return _sound.getSoundNum(); } - bool isPlaying() const { return _sound.isPlaying(); } bool isPaused() const { return _sound.isPaused(); } bool isMuted() const { return _sound.isMuted(); } - void pause() { _sound.pause(); } - void mute() { _sound.mute(); } + 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); -- cgit v1.2.3 From 941fc4b1d53b25c4655771594476d855fbaa2a15 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 1 May 2011 19:28:30 +1000 Subject: TSAGE: Implemented a lot of the SoundManager methods --- engines/tsage/sound.cpp | 168 ++++++++++++++++++++++++++++++++++++++++-------- engines/tsage/sound.h | 60 +++++++++++++---- 2 files changed, 187 insertions(+), 41 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index fab6377647..ccc64726ae 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -28,10 +28,39 @@ namespace tSage { +SoundManager::SoundManager() { + __sndmgrReady = false; + _minVersion = 0x102; + _maxVersion = 0x10A; + + for (int i = 0; i < 16; ++i) + _field109[i] = 0; + + _groupMask = 0; + _volume = 127; + _suspendCtr = 0; + _disableCtr = 0; + _field153 = 0; + _field16D = 0; +} + +SoundManager::~SoundManager() { + if (__sndmgrReady) { + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) + (*i)->stop(); + for (Common::List::iterator i = _installedDrivers.begin(); i != _installedDrivers.end(); ++i) + unInstallDriver(*i); + _sfTerminate(); + } +} + 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; + } } void SoundManager::saveNotifier(bool postFlag) { @@ -55,8 +84,6 @@ void SoundManager::listenerSynchronize(Serializer &s) { warning("TODO: SoundManager listenerSynchronize"); } -/*--------------------------------------------------------------------------*/ - void SoundManager::checkResVersion(const byte *soundData) { int minVersion = READ_LE_UINT16(soundData + 4); int maxVersion = READ_LE_UINT16(soundData + 6); @@ -67,6 +94,57 @@ void SoundManager::checkResVersion(const byte *soundData) { error("Attempt to play/prime sound resource that is too old"); } +/*--------------------------------------------------------------------------*/ + +void SoundManager::suspendSoundServer() { + ++_globals->_soundManager._suspendCtr; +} + + +void SoundManager::restartSoundServer() { + if (_globals->_soundManager._suspendCtr > 0) + --_globals->_soundManager._suspendCtr; +} + +void SoundManager::unInstallDriver(SoundDriver *driver) { + +} + +Common::List &SoundManager::buildDriverList(bool flag) { + assert(__sndmgrReady); + _driverList.clear(); + + warning("TODO: SoundManager::buildDriverList"); + return _driverList; +} + +Common::List &SoundManager::getDriverList(bool flag) { + if (flag) + return _driverList; + else + return buildDriverList(false); +} + +void SoundManager::dumpDriverList() { + _driverList.clear(); +} + +void SoundManager::setMasterVol(int volume) { + _sfSetMasterVol(volume); +} + +int SoundManager::getMasterVol() const { + return _volume; +} + +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); } @@ -79,6 +157,10 @@ 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); @@ -100,23 +182,6 @@ bool SoundManager::isOnPlayList(Sound *sound) { return _sfIsOnPlayList(sound); } -void SoundManager::extractTrackInfo(trackInfoStruct *data, const byte *soundData, int groupNum) { - -} - -void SoundManager::suspendSoundServer() { - ++_globals->_soundManager._suspendCtr; -} - -void SoundManager::rethinkVoiceTypes() { - _sfRethinkVoiceTypes(); -} - -void SoundManager::restartSoundServer() { - if (_globals->_soundManager._suspendCtr > 0) - --_globals->_soundManager._suspendCtr; -} - void SoundManager::updateSoundVol(Sound *sound) { _sfUpdateVolume(sound); } @@ -129,6 +194,10 @@ void SoundManager::updateSoundLoop(Sound *sound) { _sfUpdateLoop(sound); } +void SoundManager::rethinkVoiceTypes() { + _sfRethinkVoiceTypes(); +} + /*--------------------------------------------------------------------------*/ void SoundManager::_soSetTimeIndex(int timeIndex) { @@ -189,6 +258,51 @@ void SoundManager::_sfUpdateLoop(Sound *sound) { } +void SoundManager::_sfSetMasterVol(int volume) { + if (volume > 127) + volume = 127; + + if (volume != _globals->_soundManager._volume) { + _globals->_soundManager._volume = volume; + + for (Common::List::iterator i = _globals->_soundManager._installedDrivers.begin(); + i != _globals->_soundManager._installedDrivers.end(); ++i) { + (*i)->setVolume(volume); + } + } +} + +void SoundManager::_sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum) { + trackInfo->count = 0; + + const byte *p = soundData + READ_LE_UINT16(soundData + 8); + uint32 v; + while ((v = READ_LE_UINT32(p)) != 0) { + while ((v == 0x80000000) || (v == (uint)groupNum)) { + int count = READ_LE_UINT16(p + 4); + p += 6; + + for (int idx = 0; idx < count; ++idx) { + if (trackInfo->count == 16) { + trackInfo->count = -1; + return; + } + + trackInfo->rlbList[trackInfo->count] = READ_LE_UINT16(p); + trackInfo->arr2[trackInfo->count] = READ_LE_UINT16(p + 2); + ++trackInfo->count; + p += 4; + } + } + + p = soundData + 6 + (READ_LE_UINT16(p + 4) * 4); + } +} + +void SoundManager::_sfTerminate() { + +} + /*--------------------------------------------------------------------------*/ Sound::Sound() { @@ -255,7 +369,7 @@ void Sound::_prime(int soundNum, bool queFlag) { _globals->_soundManager.extractTrackInfo(&_trackInfo, soundData, _groupNum); for (int idx = 0; idx < _trackInfo.count; ++idx) { - _trackInfo.handleList[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo.rlbList[idx]); + _handleList[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo.rlbList[idx]); } DEALLOCATE(soundData); @@ -265,7 +379,7 @@ void Sound::_prime(int soundNum, bool queFlag) { _soundPriority = 0; _loop = 0; _trackInfo.count = 0; - _trackInfo.handleList[0] = ALLOCATE(200); + _handleList[0] = ALLOCATE(200); _field26E = ALLOCATE(200); } @@ -278,12 +392,12 @@ void Sound::_prime(int soundNum, bool queFlag) { void Sound::_unPrime() { if (_primed) { if (_field26C) { - DEALLOCATE(_trackInfo.handleList[0]); + DEALLOCATE(_handleList[0]); DEALLOCATE(_field26E); _field26E = NULL; } else { for (int idx = 0; idx < _trackInfo.count; ++idx) { - DEALLOCATE(_trackInfo.handleList[idx]); + DEALLOCATE(_handleList[idx]); } } @@ -300,7 +414,7 @@ void Sound::orientAfterDriverChange() { int timeIndex = getTimeIndex(); for (int idx = 0; idx < _trackInfo.count; ++idx) - DEALLOCATE(_trackInfo.handleList[idx]); + DEALLOCATE(_handleList[idx]); _trackInfo.count = 0; _primed = false; diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 4529ec89f1..fb9a0c3f89 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -32,58 +32,90 @@ namespace tSage { class Sound; +#define SOUND_ARR_SIZE 16 + struct trackInfoStruct { int count; - int rlbList[32]; - byte *handleList[75]; + int rlbList[SOUND_ARR_SIZE]; + int arr2[SOUND_ARR_SIZE]; +}; + +class SoundDriverEntry { +public: + +}; + +class SoundDriver { +private: + Common::String _shortDescription, _longDescription; +public: + const Common::String &getShortDriverDescription() { return _shortDescription; } + const Common::String &getLongDriverDescription() { return _longDescription; } + + virtual void setVolume(int volume) = 0; }; class SoundManager : public SaveListener { +private: + void unInstallDriver(SoundDriver *driver); public: + bool __sndmgrReady; int _minVersion, _maxVersion; Common::List _playList; - void *driverList2[16]; - int _field89[16]; - int _fieldA9[16]; - int _fieldE9[16]; int _field109[16]; uint32 _groupMask; - int volume; + int _volume; int _disableCtr; int _suspendCtr; int _field153; Common::List _soundList; - Common::List _driverList; + Common::List _driverList; + + Common::List _installedDrivers; + int _field89[16]; + int _fieldA9[16]; + int _fieldE9[16]; + int _field16D; public: + SoundManager(); + ~SoundManager(); + void dispatch() {} virtual void listenerSynchronize(Serializer &s); virtual void postInit(); - void proc2() {} static void saveNotifier(bool postFlag); void saveNotifierProc(bool postFlag); static void loadNotifier(bool postFlag); void loadNotifierProc(bool postFlag); + Common::List &buildDriverList(bool flag); + Common::List &getDriverList(bool flag); + void dumpDriverList(); 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); - bool isOnPlayList(Sound *sound); - void extractTrackInfo(trackInfoStruct *data, const byte *soundData, int groupNum); void suspendSoundServer(); void rethinkVoiceTypes(); void restartSoundServer(); 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); // _so methods + static void _sfTerminate(); static void _soSetTimeIndex(int timeIndex); static int _sfDetermineGroup(const byte *soundData); static void _sfAddToPlayList(Sound *sound); @@ -95,11 +127,10 @@ public: static void sub_233EE(Sound *sound); 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); }; -#define SOUND_ARR_SIZE 16 - class Sound: public EventHandler { private: void _prime(int soundNum, bool queFlag); @@ -140,6 +171,7 @@ public: int _fieldC8[SOUND_ARR_SIZE]; int _fieldE8[SOUND_ARR_SIZE]; trackInfoStruct _trackInfo; + byte *_handleList[75]; int _field266; int _field268; bool _primed; -- cgit v1.2.3 From c5cbfc4ac21c285ee02876daf603031f0ed4c830 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 2 May 2011 21:30:20 +1000 Subject: TSAGE: Bugfixes for extracting sound data properties --- engines/tsage/sound.cpp | 26 +++++++++++++++++++------- engines/tsage/sound.h | 9 +++++---- 2 files changed, 24 insertions(+), 11 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index ccc64726ae..73ce7a1f53 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -33,8 +33,12 @@ SoundManager::SoundManager() { _minVersion = 0x102; _maxVersion = 0x10A; - for (int i = 0; i < 16; ++i) + for (int i = 0; i < SOUND_ARR_SIZE; ++i) { + _field89[i] = 0; + _groupList[i] = 0; + _fieldE9[i] = 0; _field109[i] = 0; + } _groupMask = 0; _volume = 127; @@ -85,12 +89,12 @@ void SoundManager::listenerSynchronize(Serializer &s) { } void SoundManager::checkResVersion(const byte *soundData) { - int minVersion = READ_LE_UINT16(soundData + 4); - int maxVersion = READ_LE_UINT16(soundData + 6); + int maxVersion = READ_LE_UINT16(soundData + 4); + int minVersion = READ_LE_UINT16(soundData + 6); - if (_globals->_soundManager._minVersion >= maxVersion) + if (_globals->_soundManager._minVersion < minVersion) error("Attempt to play/prime sound resource that is too new"); - if (_globals->_soundManager._minVersion > minVersion) + if (_globals->_soundManager._minVersion > maxVersion) error("Attempt to play/prime sound resource that is too old"); } @@ -211,7 +215,7 @@ int SoundManager::_sfDetermineGroup(const byte *soundData) { if ((v & _globals->_soundManager._groupMask) == v) return v; - p = soundData + 6 + (READ_LE_UINT16(p + 4) * 4); + p += 6 + (READ_LE_UINT16(p + 4) * 4); } return 0; @@ -295,7 +299,7 @@ void SoundManager::_sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *s } } - p = soundData + 6 + (READ_LE_UINT16(p + 4) * 4); + p += 6 + (READ_LE_UINT16(p + 4) * 4); } } @@ -303,6 +307,14 @@ void SoundManager::_sfTerminate() { } +void SoundManager::_sfExtractGroupMask() { + uint32 mask = 0; + for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) + mask |= _globals->_soundManager._groupList[idx]; + + _globals->_soundManager._groupMask = mask; +} + /*--------------------------------------------------------------------------*/ Sound::Sound() { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index fb9a0c3f89..2cc5dec61e 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -62,7 +62,7 @@ public: bool __sndmgrReady; int _minVersion, _maxVersion; Common::List _playList; - int _field109[16]; + int _field109[SOUND_ARR_SIZE]; uint32 _groupMask; int _volume; int _disableCtr; @@ -72,9 +72,9 @@ public: Common::List _driverList; Common::List _installedDrivers; - int _field89[16]; - int _fieldA9[16]; - int _fieldE9[16]; + int _field89[SOUND_ARR_SIZE]; + uint16 _groupList[SOUND_ARR_SIZE]; + int _fieldE9[SOUND_ARR_SIZE]; int _field16D; public: @@ -129,6 +129,7 @@ public: static void _sfUpdateLoop(Sound *sound); static void _sfSetMasterVol(int volume); static void _sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum); + static void _sfExtractGroupMask(); }; class Sound: public EventHandler { -- cgit v1.2.3 From 1d866e57491bbc703d13a406e09336b732212c2b Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 4 May 2011 23:13:15 +1000 Subject: TSAGE: Implemented more SoundManager methods --- engines/tsage/core.cpp | 3 +- engines/tsage/sound.cpp | 216 ++++++++++++++++++++++++++++++++++++++---------- engines/tsage/sound.h | 47 ++++++++--- 3 files changed, 211 insertions(+), 55 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 873bbc56a5..41ee021432 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -3425,8 +3425,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/sound.cpp b/engines/tsage/sound.cpp index 73ce7a1f53..e08885a51a 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -45,15 +45,18 @@ SoundManager::SoundManager() { _suspendCtr = 0; _disableCtr = 0; _field153 = 0; - _field16D = 0; + _driversDetected = false; } SoundManager::~SoundManager() { if (__sndmgrReady) { for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) (*i)->stop(); - for (Common::List::iterator i = _installedDrivers.begin(); i != _installedDrivers.end(); ++i) - unInstallDriver(*i); + for (Common::List::iterator i = _installedDrivers.begin(); i != _installedDrivers.end(); ) { + int driverNum = (*i)->_driverNum; + ++i; + unInstallDriver(driverNum); + } _sfTerminate(); } } @@ -67,70 +70,154 @@ void SoundManager::postInit() { } } -void SoundManager::saveNotifier(bool postFlag) { - _globals->_soundManager.saveNotifierProc(postFlag); -} +Common::List &SoundManager::buildDriverList(bool detectFlag) { + assert(__sndmgrReady); + _availableDrivers.clear(); -void SoundManager::saveNotifierProc(bool postFlag) { - warning("TODO: SoundManager::saveNotifierProc"); -} + // 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); -void SoundManager::loadNotifier(bool postFlag) { - _globals->_soundManager.loadNotifierProc(postFlag); + _driversDetected = true; + return _availableDrivers; } -void SoundManager::loadNotifierProc(bool postFlag) { - warning("TODO: SoundManager::loadNotifierProc"); +void SoundManager::installConfigDrivers() { + } -void SoundManager::listenerSynchronize(Serializer &s) { - s.validate("SoundManager"); - warning("TODO: SoundManager listenerSynchronize"); +Common::List &SoundManager::getDriverList(bool detectFlag) { + if (detectFlag) + return _availableDrivers; + else + return buildDriverList(false); } -void SoundManager::checkResVersion(const byte *soundData) { - int maxVersion = READ_LE_UINT16(soundData + 4); - int minVersion = READ_LE_UINT16(soundData + 6); +void SoundManager::dumpDriverList() { + _availableDrivers.clear(); +} - if (_globals->_soundManager._minVersion < minVersion) - error("Attempt to play/prime sound resource that is too new"); - if (_globals->_soundManager._minVersion > maxVersion) - error("Attempt to play/prime sound resource that is too old"); +void SoundManager::disableSoundServer() { + ++_disableCtr; } -/*--------------------------------------------------------------------------*/ +void SoundManager::enableSoundServer() { + if (_disableCtr > 0) + --_disableCtr; +} void SoundManager::suspendSoundServer() { - ++_globals->_soundManager._suspendCtr; + ++_suspendCtr; } - void SoundManager::restartSoundServer() { - if (_globals->_soundManager._suspendCtr > 0) - --_globals->_soundManager._suspendCtr; + if (_suspendCtr > 0) + --_suspendCtr; } -void SoundManager::unInstallDriver(SoundDriver *driver) { +/** + * 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((_maxVersion >= driver->_minVersion) && (_maxVersion <= driver->_maxVersion)); + + // Mute any loaded sounds + disableSoundServer(); + for (Common::List::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, ROLAND_DRIVER_NUM, 0, true); + if (bankData) { + // Install the patch bank data + _sfInstallPatchBank(bankData); + DEALLOCATE(bankData); + } else { + // Could not locate patch bank data, so unload the driver + _sfUnInstallDriver(driver); + + // Unmute currently active sounds + for (Common::List::iterator i = _playList.begin(); i != _playList.end(); ++i) + (*i)->mute(false); + enableSoundServer(); + } + break; + } + } } -Common::List &SoundManager::buildDriverList(bool flag) { - assert(__sndmgrReady); - _driverList.clear(); - - warning("TODO: SoundManager::buildDriverList"); - return _driverList; +/** + * Instantiate a driver class for the specified driver number + */ +SoundDriver *SoundManager::instantiateDriver(int driverNum) { + assert(driverNum == ADLIB_DRIVER_NUM); + return new AdlibSoundDriver(); } -Common::List &SoundManager::getDriverList(bool flag) { - if (flag) - return _driverList; - else - return buildDriverList(false); +/** + * Uninstall the specified driver + */ +void SoundManager::unInstallDriver(int driverNum) { + Common::List::const_iterator i; + for (i = _installedDrivers.begin(); i != _installedDrivers.end(); ++i) { + if ((*i)->_driverNum == driverNum) { + // Found driver to remove + + // Mute any loaded sounds + disableSoundServer(); + for (Common::List::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::iterator i = _soundList.begin(); i != _soundList.end(); ++i) + (*i)->orientAfterDriverChange(); + + // Unmute currently active sounds + for (Common::List::iterator i = _playList.begin(); i != _playList.end(); ++i) + (*i)->mute(false); + + enableSoundServer(); + } + } } -void SoundManager::dumpDriverList() { - _driverList.clear(); +/** + * Returns true if a specified driver number is currently installed + */ +bool SoundManager::isInstalled(int driverNum) const { + Common::List::const_iterator i; + for (i = _installedDrivers.begin(); i != _installedDrivers.end(); ++i) { + if ((*i)->_driverNum == driverNum) + return true; + } + + return false; } void SoundManager::setMasterVol(int volume) { @@ -153,6 +240,16 @@ 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 (_globals->_soundManager._minVersion < minVersion) + error("Attempt to play/prime sound resource that is too new"); + if (_globals->_soundManager._minVersion > maxVersion) + error("Attempt to play/prime sound resource that is too old"); +} + int SoundManager::extractPriority(const byte *soundData) { return READ_LE_UINT16(soundData + 12); } @@ -204,6 +301,29 @@ void SoundManager::rethinkVoiceTypes() { /*--------------------------------------------------------------------------*/ +void SoundManager::saveNotifier(bool postFlag) { + _globals->_soundManager.saveNotifierProc(postFlag); +} + +void SoundManager::saveNotifierProc(bool postFlag) { + warning("TODO: SoundManager::saveNotifierProc"); +} + +void SoundManager::loadNotifier(bool postFlag) { + _globals->_soundManager.loadNotifierProc(postFlag); +} + +void SoundManager::loadNotifierProc(bool postFlag) { + warning("TODO: SoundManager::loadNotifierProc"); +} + +void SoundManager::listenerSynchronize(Serializer &s) { + s.validate("SoundManager"); + warning("TODO: SoundManager listenerSynchronise"); +} + +/*--------------------------------------------------------------------------*/ + void SoundManager::_soSetTimeIndex(int timeIndex) { warning("TODO: _soSetTimeIndex"); } @@ -315,6 +435,18 @@ void SoundManager::_sfExtractGroupMask() { _globals->_soundManager._groupMask = mask; } +bool SoundManager::_sfInstallDriver(SoundDriver *driver) { + return false; +} + +void SoundManager::_sfUnInstallDriver(SoundDriver *driver) { + +} + +void SoundManager::_sfInstallPatchBank(const byte *bankData) { + +} + /*--------------------------------------------------------------------------*/ Sound::Sound() { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 2cc5dec61e..f52edc121b 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -33,6 +33,8 @@ namespace tSage { class Sound; #define SOUND_ARR_SIZE 16 +#define ROLAND_DRIVER_NUM 2 +#define ADLIB_DRIVER_NUM 3 struct trackInfoStruct { int count; @@ -40,14 +42,22 @@ struct trackInfoStruct { int arr2[SOUND_ARR_SIZE]; }; +enum SoundDriverStatus {SNDSTATUS_FAILED = 0, SNDSTATUS_DETECTED = 1, SNDSTATUS_SKIPPED = 2}; + class SoundDriverEntry { public: - + int driverNum; + SoundDriverStatus status; + int field2, field6; + Common::String shortDescription; + Common::String longDescription; }; class SoundDriver { -private: +public: Common::String _shortDescription, _longDescription; + int _driverNum; + int _minVersion, _maxVersion; public: const Common::String &getShortDriverDescription() { return _shortDescription; } const Common::String &getLongDriverDescription() { return _longDescription; } @@ -57,7 +67,7 @@ public: class SoundManager : public SaveListener { private: - void unInstallDriver(SoundDriver *driver); + SoundDriver *instantiateDriver(int driverNum); public: bool __sndmgrReady; int _minVersion, _maxVersion; @@ -68,15 +78,13 @@ public: int _disableCtr; int _suspendCtr; int _field153; + bool _driversDetected; Common::List _soundList; - Common::List _driverList; - + Common::List _availableDrivers; Common::List _installedDrivers; int _field89[SOUND_ARR_SIZE]; uint16 _groupList[SOUND_ARR_SIZE]; int _fieldE9[SOUND_ARR_SIZE]; - - int _field16D; public: SoundManager(); ~SoundManager(); @@ -90,9 +98,17 @@ public: static void loadNotifier(bool postFlag); void loadNotifierProc(bool postFlag); - Common::List &buildDriverList(bool flag); - Common::List &getDriverList(bool flag); + void installConfigDrivers(); + Common::List &buildDriverList(bool detectFlag); + Common::List &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); @@ -103,9 +119,7 @@ public: void removeFromSoundList(Sound *sound); void addToPlayList(Sound *sound); void removeFromPlayList(Sound *sound); - void suspendSoundServer(); void rethinkVoiceTypes(); - void restartSoundServer(); void updateSoundVol(Sound *sound); void updateSoundPri(Sound *sound); void updateSoundLoop(Sound *sound); @@ -130,13 +144,15 @@ public: 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(const byte *bankData); }; class Sound: public EventHandler { private: void _prime(int soundNum, bool queFlag); void _unPrime(); - void orientAfterDriverChange(); void orientAfterRestore(); public: int _field6; @@ -207,6 +223,8 @@ public: bool getLoop(); void holdAt(int amount); void release(); + + void orientAfterDriverChange(); }; class ASound: public EventHandler { @@ -246,6 +264,11 @@ public: void release() { _sound.release(); } }; +class AdlibSoundDriver: public SoundDriver { +public: + void setVolume(int volume) {} +}; + } // End of namespace tSage #endif -- cgit v1.2.3 From 3457253f03cd5a57281735360fc600f0fe831298 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 7 May 2011 14:13:52 +1000 Subject: TSAGE: Implemented more _sf methods --- engines/tsage/sound.cpp | 92 +++++++++++++++++++++++++++++++++++++++++++------ engines/tsage/sound.h | 7 +++- 2 files changed, 87 insertions(+), 12 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index e08885a51a..062fb6dda8 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -89,7 +89,7 @@ Common::List &SoundManager::buildDriverList(bool detectFlag) { } void SoundManager::installConfigDrivers() { - + installDriver(ADLIB_DRIVER_NUM); } Common::List &SoundManager::getDriverList(bool detectFlag) { @@ -324,6 +324,10 @@ void SoundManager::listenerSynchronize(Serializer &s) { /*--------------------------------------------------------------------------*/ +SoundManager &SoundManager::sfManager() { + return _globals->_soundManager; +} + void SoundManager::_soSetTimeIndex(int timeIndex) { warning("TODO: _soSetTimeIndex"); } @@ -341,12 +345,19 @@ int SoundManager::_sfDetermineGroup(const byte *soundData) { return 0; } -void SoundManager::_sfAddToPlayList(Sound*soundData) { - +void SoundManager::_sfAddToPlayList(Sound *sound) { + ++sfManager()._suspendCtr; + _sfDoAddToPlayList(sound); + sound->_field6 = 0; + _sfRethinkVoiceTypes(); + --sfManager()._suspendCtr; } void SoundManager::_sfRemoveFromPlayList(Sound *sound) { - + ++sfManager()._suspendCtr; + if (_sfDoRemoveFromPlayList(sound)) + _sfRethinkVoiceTypes(); + --sfManager()._suspendCtr; } bool SoundManager::_sfIsOnPlayList(Sound *sound) { @@ -363,23 +374,35 @@ void SoundManager::_sfRethinkVoiceTypes() { void SoundManager::_sfUpdateVolume(Sound *sound) { _sfDereferenceAll(); - sub_233EE(sound); + _sfDoUpdateVolume(sound); } void SoundManager::_sfDereferenceAll() { - -} - -void SoundManager::sub_233EE(Sound *sound) { - + // 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) { + ++_globals->_soundManager._suspendCtr; + int tempPriority = (sound->_priority2 == 255) ? sound->_soundPriority : sound->_priority; + if (sound->_priority != tempPriority) { + sound->_priority = tempPriority; + if (_sfDoRemoveFromPlayList(sound)) { + _sfDoAddToPlayList(sound); + _sfRethinkVoiceTypes(); + } + } + + --_globals->_soundManager._suspendCtr; } void SoundManager::_sfUpdateLoop(Sound *sound) { - + if (sound->_loopFlag2) + sound->_loopFlag = sound->_loop; + else + sound->_loopFlag = sound->_loopFlag2; } void SoundManager::_sfSetMasterVol(int volume) { @@ -447,6 +470,53 @@ void SoundManager::_sfInstallPatchBank(const byte *bankData) { } +/** + * Adds the specified sound in the playing sound list, inserting in order of priority + */ +void SoundManager::_sfDoAddToPlayList(Sound *sound) { + ++sfManager()._suspendCtr; + + Common::List::iterator i = sfManager()._playList.begin(); + while ((i != sfManager()._playList.end()) && (sound->_priority > (*i)->_priority)) + ++i; + + sfManager()._playList.insert(i, sound); + --sfManager()._suspendCtr; +} + +/** + * Removes the specified sound from the play list + */ +bool SoundManager::_sfDoRemoveFromPlayList(Sound *sound) { + ++sfManager()._suspendCtr; + + bool result = false; + for (Common::List::iterator i = sfManager()._playList.begin(); i != sfManager()._playList.end(); ++i) { + if (*i == sound) { + result = true; + sfManager()._playList.erase(i); + break; + } + } + + --sfManager()._suspendCtr; + return result; +} + +void SoundManager::_sfDoUpdateVolume(Sound *sound) { + ++_globals->_soundManager._suspendCtr; + + for (int idx = 0; idx < 16; ++idx) { + Sound *snd = sfManager()._voiceStructPtrs[idx]; + if (!snd) + continue; + + // TODO: More stuff + } + + --_globals->_soundManager._suspendCtr; +} + /*--------------------------------------------------------------------------*/ Sound::Sound() { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index f52edc121b..26c26817a5 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -85,6 +85,7 @@ public: int _field89[SOUND_ARR_SIZE]; uint16 _groupList[SOUND_ARR_SIZE]; int _fieldE9[SOUND_ARR_SIZE]; + Sound *_voiceStructPtrs[SOUND_ARR_SIZE]; public: SoundManager(); ~SoundManager(); @@ -129,6 +130,7 @@ public: void unloadSound(int soundNum); // _so methods + static SoundManager &sfManager(); static void _sfTerminate(); static void _soSetTimeIndex(int timeIndex); static int _sfDetermineGroup(const byte *soundData); @@ -138,7 +140,6 @@ public: static void _sfRethinkVoiceTypes(); static void _sfUpdateVolume(Sound *sound); static void _sfDereferenceAll(); - static void sub_233EE(Sound *sound); static void _sfUpdatePriority(Sound *sound); static void _sfUpdateLoop(Sound *sound); static void _sfSetMasterVol(int volume); @@ -147,6 +148,9 @@ public: static bool _sfInstallDriver(SoundDriver *driver); static void _sfUnInstallDriver(SoundDriver *driver); static void _sfInstallPatchBank(const byte *bankData); + static void _sfDoAddToPlayList(Sound *sound); + static bool _sfDoRemoveFromPlayList(Sound *sound); + static void _sfDoUpdateVolume(Sound *sound); }; class Sound: public EventHandler { @@ -155,6 +159,7 @@ private: void _unPrime(); void orientAfterRestore(); public: + int _field0; int _field6; int _soundNum; int _groupNum; -- cgit v1.2.3 From b3fb2b5db8aa73703dc86fdcd06be0d7d0c1b0b6 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 12 May 2011 23:09:48 +1000 Subject: TSAGE: More code for installing sound drivers --- engines/tsage/sound.cpp | 57 +++++++++++++++++++++++++++++++++++++------------ engines/tsage/sound.h | 27 ++++++++++++++++------- 2 files changed, 62 insertions(+), 22 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 062fb6dda8..6082537766 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -44,7 +44,7 @@ SoundManager::SoundManager() { _volume = 127; _suspendCtr = 0; _disableCtr = 0; - _field153 = 0; + _suspendedCount = 0; _driversDetected = false; } @@ -152,7 +152,7 @@ void SoundManager::installDriver(int driverNum) { byte *bankData = _resourceManager->getResource(RES_BANK, ROLAND_DRIVER_NUM, 0, true); if (bankData) { // Install the patch bank data - _sfInstallPatchBank(bankData); + _sfInstallPatchBank(driver, bankData); DEALLOCATE(bankData); } else { // Could not locate patch bank data, so unload the driver @@ -368,6 +368,10 @@ bool SoundManager::_sfIsOnPlayList(Sound *sound) { return result; } +void SoundManager::_sfRethinkSoundDrivers() { + +} + void SoundManager::_sfRethinkVoiceTypes() { } @@ -459,15 +463,29 @@ void SoundManager::_sfExtractGroupMask() { } bool SoundManager::_sfInstallDriver(SoundDriver *driver) { - return false; + if (!driver->open()) + return false; + + sfManager()._installedDrivers.push_back(driver); + uint32 *maskList = driver->getGroupMaskList(); + driver->_groupMask = *maskList; + + _sfExtractGroupMask(); + _sfRethinkSoundDrivers(); + driver->setVolume(sfManager()._volume); + + return true; } void SoundManager::_sfUnInstallDriver(SoundDriver *driver) { + sfManager()._installedDrivers.remove(driver); + _sfExtractGroupMask(); + _sfRethinkSoundDrivers(); } -void SoundManager::_sfInstallPatchBank(const byte *bankData) { - +void SoundManager::_sfInstallPatchBank(SoundDriver *driver, const byte *bankData) { + driver->installPatchBank(bankData); } /** @@ -535,10 +553,10 @@ Sound::Sound() { _holdAt = false; _cueValue = -1; _volume1 = -1; - _field1F = 0; + _volume3 = 0; _volume2 = 0; - _field21 = 0; - _field22 = 0; + _volume5 = 0; + _volume4 = 0; _timeIndex = 0; _field26 = 0; _trackInfo.count = 0; @@ -701,21 +719,21 @@ void Sound::mute(bool flag) { _globals->_soundManager.restartSoundServer(); } -void Sound::fade(int volume1, int volume2, int v3, int v4) { +void Sound::fade(int volume1, int volume2, int volume3, int volume4) { _globals->_soundManager.suspendSoundServer(); if (volume1 > 127) volume1 = 127; if (volume2 > 127) volume2 = 127; - if (v3 > 255) - v3 = 255; + if (volume3 > 255) + volume3 = 255; _volume1 = volume1; _volume2 = volume2; - _field1F = v3; - _field21 = 0; - _field22 = v4; + _volume3 = volume3; + _volume5 = 0; + _volume4 = volume4; _globals->_soundManager.restartSoundServer(); } @@ -851,4 +869,15 @@ void ASound::fade(int v1, int v2, int v3, int v4, Action *action) { _sound.fade(v1, v2, v3, v4); } + +/*--------------------------------------------------------------------------*/ + +SoundDriver::SoundDriver() { + _driverNum = 0; + _minVersion = _maxVersion = 0; + _groupMaskList = NULL; + + _groupMask = 0; +} + } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 26c26817a5..22132bc6ca 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -58,11 +58,20 @@ public: Common::String _shortDescription, _longDescription; int _driverNum; int _minVersion, _maxVersion; + uint32 *_groupMaskList; + // The following fields were originally held in separate arrays in the SoundManager class + uint32 _groupMask; public: + SoundDriver(); + const Common::String &getShortDriverDescription() { return _shortDescription; } const Common::String &getLongDriverDescription() { return _longDescription; } - virtual void setVolume(int volume) = 0; + virtual bool open() { return true; } + virtual void close() {} + virtual uint32 *getGroupMaskList() const { return _groupMaskList; } + virtual void setVolume(int volume) {} + virtual void installPatchBank(const byte *data) {} }; class SoundManager : public SaveListener { @@ -77,7 +86,7 @@ public: int _volume; int _disableCtr; int _suspendCtr; - int _field153; + int _suspendedCount; bool _driversDetected; Common::List _soundList; Common::List _availableDrivers; @@ -137,6 +146,7 @@ public: 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(); @@ -147,7 +157,7 @@ public: static void _sfExtractGroupMask(); static bool _sfInstallDriver(SoundDriver *driver); static void _sfUnInstallDriver(SoundDriver *driver); - static void _sfInstallPatchBank(const byte *bankData); + static void _sfInstallPatchBank(SoundDriver *driver, const byte *bankData); static void _sfDoAddToPlayList(Sound *sound); static bool _sfDoRemoveFromPlayList(Sound *sound); static void _sfDoUpdateVolume(Sound *sound); @@ -175,10 +185,10 @@ public: int _holdAt; int _cueValue; int _volume1; - int _field1F; + int _volume3; int _volume2; - int _field21; - int _field22; + int _volume5; + int _volume4; uint _timeIndex; int _field26; int _field28[SOUND_ARR_SIZE]; @@ -215,7 +225,7 @@ public: bool isMuted() const; void pause(bool flag); void mute(bool flag); - void fade(int v1, int v2, int v3, int v4); + void fade(int volume1, int volume2, int volume3, int v4); void setTimeIndex(uint32 timeIndex); uint32 getTimeIndex() const; int getCueValue() const; @@ -271,7 +281,8 @@ public: class AdlibSoundDriver: public SoundDriver { public: - void setVolume(int volume) {} + virtual void setVolume(int volume) {} + virtual void installPatchBank(const byte *data) {} }; } // End of namespace tSage -- cgit v1.2.3 From 52fbf6709aaa84574d96b98aedc99b1c611da1e6 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 18 May 2011 20:32:40 +1000 Subject: TSAGE: Further sound driver installation logic --- engines/tsage/sound.cpp | 238 +++++++++++++++++++++++++++++++++++++++++++----- engines/tsage/sound.h | 51 +++++++++-- engines/tsage/tsage.cpp | 9 ++ engines/tsage/tsage.h | 5 +- 4 files changed, 275 insertions(+), 28 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 6082537766..73355a69e3 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -20,6 +20,7 @@ * */ +#include "common/config-manager.h" #include "tsage/core.h" #include "tsage/globals.h" #include "tsage/debugger.h" @@ -38,6 +39,7 @@ SoundManager::SoundManager() { _groupList[i] = 0; _fieldE9[i] = 0; _field109[i] = 0; + _voiceStructPtrs[i] = NULL; } _groupMask = 0; @@ -46,6 +48,7 @@ SoundManager::SoundManager() { _disableCtr = 0; _suspendedCount = 0; _driversDetected = false; + _needToRethink = false; } SoundManager::~SoundManager() { @@ -53,9 +56,9 @@ SoundManager::~SoundManager() { for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) (*i)->stop(); for (Common::List::iterator i = _installedDrivers.begin(); i != _installedDrivers.end(); ) { - int driverNum = (*i)->_driverNum; + SoundDriver *driver = *i; ++i; - unInstallDriver(driverNum); + delete driver; } _sfTerminate(); } @@ -70,6 +73,43 @@ void SoundManager::postInit() { } } +/** + * Loops through all the loaded sounds, and stops any that have been flagged for stopping + */ +void SoundManager::dispatch() { + Common::List::iterator i = _soundList.begin(); + while (i != _soundList.end()) { + Sound *sound = *i; + ++i; + + // If the sound is flagged for stopping, then stop it + if (sound->_stopFlag) { + 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 &SoundManager::buildDriverList(bool detectFlag) { assert(__sndmgrReady); _availableDrivers.clear(); @@ -89,7 +129,9 @@ Common::List &SoundManager::buildDriverList(bool detectFlag) { } void SoundManager::installConfigDrivers() { +#ifdef TSAGE_SOUND installDriver(ADLIB_DRIVER_NUM); +#endif } Common::List &SoundManager::getDriverList(bool detectFlag) { @@ -299,6 +341,34 @@ void SoundManager::rethinkVoiceTypes() { _sfRethinkVoiceTypes(); } +void SoundManager::_sfSoundServer() { + if (!sfManager()._disableCtr && !sfManager()._suspendCtr) + return; + + if (sfManager()._needToRethink) { + _sfRethinkVoiceTypes(); + sfManager()._needToRethink = false; + } else { + _sfDereferenceAll(); + } + + // Handle any fading if necessary + do { + _sfProcessFading(); + } while (sfManager()._suspendCtr > 0); + sfManager()._suspendCtr = 0; + + // Poll all sound drivers in case they need it + for (Common::List::iterator i = sfManager()._installedDrivers.begin(); + i != sfManager()._installedDrivers.end(); ++i) { + (*i)->poll(); + } +} + +void SoundManager::_sfProcessFading() { + //TODO +} + /*--------------------------------------------------------------------------*/ void SoundManager::saveNotifier(bool postFlag) { @@ -348,7 +418,7 @@ int SoundManager::_sfDetermineGroup(const byte *soundData) { void SoundManager::_sfAddToPlayList(Sound *sound) { ++sfManager()._suspendCtr; _sfDoAddToPlayList(sound); - sound->_field6 = 0; + sound->_stopFlag = false; _sfRethinkVoiceTypes(); --sfManager()._suspendCtr; } @@ -369,7 +439,121 @@ bool SoundManager::_sfIsOnPlayList(Sound *sound) { } void SoundManager::_sfRethinkSoundDrivers() { - + // Free any existing entries + for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) { + if (sfManager()._voiceStructPtrs[idx]) { + delete sfManager()._voiceStructPtrs[idx]; + sfManager()._voiceStructPtrs[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::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) { + int dataSize = !flag ? total * 28 + 30 : total * 26 + 30; + debugC(9, ktSageSound, "data Size = %d\n", dataSize); + + VoiceStruct *vs = new VoiceStruct(); + sfManager()._voiceStructPtrs[idx] = vs; + + if (!flag) { + vs->_field0 = 0; + vs->_field1 = total; +// offset = 2; + } else { + vs->_field0 = 1; + vs->_field1 = vs->_field2 = total; +// offset = 4; + } + + for (Common::List::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) { + if (!flag) { + while ((byteVal = *groupData++) != 0xff) { + VoiceStructEntry ve; + ve._field1 = (byteVal & 0x80) ? 0 : 1; + ve._driver = driver; + ve._field4 = 0; + ve._field6 = 0; + ve._field8 = 0; + ve._field9 = 0; + ve._fieldA = 0; + + vs->_entries.push_back(ve); + } + } else { + byteVal = *groupData; + groupData += 2; + + for (int idx = 0; idx < byteVal; ++idx) { + VoiceStructEntry ve; + ve._field0 = idx; + ve._driver = driver; + ve._field4 = 0xff; + ve._field6 = 0; + ve._field8 = 0; + ve._fieldA = 0; + ve._fieldC = 0; + ve._fieldD = 0; + + vs->_entries.push_back(ve); + } + } + } else { + if (*groupData++ != 0) { + while (*groupData != 0xff) + ++groupData; + } + } + } + } + } + } } void SoundManager::_sfRethinkVoiceTypes() { @@ -467,8 +651,8 @@ bool SoundManager::_sfInstallDriver(SoundDriver *driver) { return false; sfManager()._installedDrivers.push_back(driver); - uint32 *maskList = driver->getGroupMaskList(); - driver->_groupMask = *maskList; + driver->_groupOffset = driver->getGroupData(); + driver->_groupMask = READ_LE_UINT32(driver->_groupOffset); _sfExtractGroupMask(); _sfRethinkSoundDrivers(); @@ -479,6 +663,7 @@ bool SoundManager::_sfInstallDriver(SoundDriver *driver) { void SoundManager::_sfUnInstallDriver(SoundDriver *driver) { sfManager()._installedDrivers.remove(driver); + delete driver; _sfExtractGroupMask(); _sfRethinkSoundDrivers(); @@ -525,10 +710,11 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { ++_globals->_soundManager._suspendCtr; for (int idx = 0; idx < 16; ++idx) { + /* Sound *snd = sfManager()._voiceStructPtrs[idx]; if (!snd) continue; - +*/ // TODO: More stuff } @@ -538,7 +724,7 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { /*--------------------------------------------------------------------------*/ Sound::Sound() { - _field6 = 0; + _stopFlag = false; _soundNum = 0; _groupNum = 0; _soundPriority = 0; @@ -550,7 +736,7 @@ Sound::Sound() { _loopFlag = false; _pauseCtr = 0; _muteCtr = 0; - _holdAt = false; + _holdAt = 0xff; _cueValue = -1; _volume1 = -1; _volume3 = 0; @@ -637,7 +823,7 @@ void Sound::_unPrime() { _globals->_soundManager.removeFromSoundList(this); _primed = false; - _field6 = 0; + _stopFlag = false; } } @@ -807,29 +993,30 @@ void Sound::release() { ASound::ASound(): EventHandler() { _action = NULL; - _cueFlag = false; + _cueValue = -1; } void ASound::synchronize(Serializer &s) { EventHandler::synchronize(s); SYNC_POINTER(_action); - s.syncAsByte(_cueFlag); + s.syncAsByte(_cueValue); } void ASound::dispatch() { EventHandler::dispatch(); - if (!_sound.getCueValue()) { - _cueFlag = false; - _sound.setCueValue(1); + int cueValue = _sound.getCueValue(); + if (cueValue != -1) { + _cueValue = cueValue; + _sound.setCueValue(-1); if (_action) _action->signal(); } - if (!_cueFlag) { + if (_cueValue != -1) { if (!_sound.isPrimed()) { - _cueFlag = true; + _cueValue = -1; if (_action) { _action->signal(); _action = NULL; @@ -840,7 +1027,7 @@ void ASound::dispatch() { void ASound::play(int soundNum, Action *action, int volume) { _action = action; - _cueFlag = false; + _cueValue = 0; setVol(volume); _sound.play(soundNum); @@ -853,7 +1040,7 @@ void ASound::stop() { void ASound::prime(int soundNum, Action *action) { _action = action; - _cueFlag = false; + _cueValue = 0; _sound.prime(soundNum); } @@ -875,9 +1062,18 @@ void ASound::fade(int v1, int v2, int v3, int v4, Action *action) { SoundDriver::SoundDriver() { _driverNum = 0; _minVersion = _maxVersion = 0; - _groupMaskList = NULL; - _groupMask = 0; } +/*--------------------------------------------------------------------------*/ + +const byte adlib_group_data[] = { 1, 1, 9, 1, 0xff }; + +AdlibSoundDriver::AdlibSoundDriver() { + _groupData.groupMask = 1; + _groupData.v1 = 0x46; + _groupData.v2 = 0; + _groupData.pData = &adlib_group_data[0]; +} + } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 22132bc6ca..591d0e1e07 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -53,14 +53,21 @@ public: Common::String longDescription; }; +struct GroupData { + uint32 groupMask; + byte v1; + byte v2; + const byte *pData; +}; + class SoundDriver { public: Common::String _shortDescription, _longDescription; int _driverNum; int _minVersion, _maxVersion; - uint32 *_groupMaskList; // The following fields were originally held in separate arrays in the SoundManager class uint32 _groupMask; + const GroupData *_groupOffset; public: SoundDriver(); @@ -69,9 +76,32 @@ public: virtual bool open() { return true; } virtual void close() {} - virtual uint32 *getGroupMaskList() const { return _groupMaskList; } + virtual const GroupData *getGroupData() = 0; virtual void setVolume(int volume) {} virtual void installPatchBank(const byte *data) {} + virtual void poll() {} +}; + +struct VoiceStructEntry { + int _field0; + int _field1; + SoundDriver *_driver; + int _field4; + int _field6; + int _field8; + int _field9; + int _fieldA; + int _fieldC; + int _fieldD; +}; + +class VoiceStruct { +public: + int _field0; + int _field1; + int _field2; + + Common::Array _entries; }; class SoundManager : public SaveListener { @@ -94,14 +124,16 @@ public: int _field89[SOUND_ARR_SIZE]; uint16 _groupList[SOUND_ARR_SIZE]; int _fieldE9[SOUND_ARR_SIZE]; - Sound *_voiceStructPtrs[SOUND_ARR_SIZE]; + VoiceStruct *_voiceStructPtrs[SOUND_ARR_SIZE]; + bool _needToRethink; public: SoundManager(); ~SoundManager(); - void dispatch() {} + void dispatch(); virtual void listenerSynchronize(Serializer &s); virtual void postInit(); + void syncSounds(); static void saveNotifier(bool postFlag); void saveNotifierProc(bool postFlag); @@ -161,6 +193,8 @@ public: static void _sfDoAddToPlayList(Sound *sound); static bool _sfDoRemoveFromPlayList(Sound *sound); static void _sfDoUpdateVolume(Sound *sound); + static void _sfSoundServer(); + static void _sfProcessFading(); }; class Sound: public EventHandler { @@ -170,7 +204,7 @@ private: void orientAfterRestore(); public: int _field0; - int _field6; + bool _stopFlag; int _soundNum; int _groupNum; int _soundPriority; @@ -246,7 +280,7 @@ class ASound: public EventHandler { public: Sound _sound; Action *_action; - bool _cueFlag; + int _cueValue; ASound(); virtual void synchronize(Serializer &s); @@ -280,9 +314,14 @@ public: }; class AdlibSoundDriver: public SoundDriver { +private: + GroupData _groupData; public: + AdlibSoundDriver(); + virtual void setVolume(int volume) {} virtual void installPatchBank(const byte *data) {} + virtual const GroupData *getGroupData() { return &_groupData; } }; } // End of namespace tSage diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp index 4f55ecfb83..68d477aa0b 100644 --- a/engines/tsage/tsage.cpp +++ b/engines/tsage/tsage.cpp @@ -81,6 +81,9 @@ void TSageEngine::initialise() { _globals = new Globals(); _globals->gfxManager().setDefaults(); + + // Setup sound settings + syncSoundSettings(); } void TSageEngine::deinitialise() { @@ -136,4 +139,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 2228212510..3138179442 100644 --- a/engines/tsage/tsage.h +++ b/engines/tsage/tsage.h @@ -52,7 +52,9 @@ enum { }; enum { - kRingDebugScripts = 1 << 0 + kRingDebugScripts = 1 << 0, + ktSageSound = 1 << 1, + ktSageCore = 1 << 2 }; struct tSageGameDescription; @@ -84,6 +86,7 @@ public: virtual bool canSaveGameStateCurrently(); virtual Common::Error loadGameState(int slot); virtual Common::Error saveGameState(int slot, const char *desc); + virtual void syncSoundSettings(); Common::String generateSaveName(int slot); void initialise(); -- cgit v1.2.3 From a4f3907bb1c8cc7d9a861f0901135e8a8d9846b0 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 24 May 2011 20:07:41 +1000 Subject: TSAGE: Added some extra code for volume control and start on rethinking voice types --- engines/tsage/sound.cpp | 113 ++++++++++++++++++++++++++++++++++++++++++------ engines/tsage/sound.h | 21 ++++++++- 2 files changed, 119 insertions(+), 15 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 73355a69e3..3db5759f6f 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -369,6 +369,29 @@ void SoundManager::_sfProcessFading() { //TODO } +void SoundManager::_sfUpdateVoiceStructs() { + for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { + VoiceStruct *vs = sfManager()._voiceStructPtrs[voiceIndex]; + + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + + if (vs->_voiceType == VOICETYPE_0) { + vse._field4 = vse._fieldC; + vse._field6 = vse._fieldE; + vse._field8 = vse._field10; + vse._field9 = vse._field11; + vse._fieldA = vse._field12; + } else { + vse._field8 = vse._fieldE; + vse._fieldA = vse._field10; + vse._fieldC = vse._field12; + vse._fieldD = vse._field13; + } + } + } +} + /*--------------------------------------------------------------------------*/ void SoundManager::saveNotifier(bool postFlag) { @@ -494,13 +517,11 @@ void SoundManager::_sfRethinkSoundDrivers() { sfManager()._voiceStructPtrs[idx] = vs; if (!flag) { - vs->_field0 = 0; + vs->_voiceType = VOICETYPE_0; vs->_field1 = total; -// offset = 2; } else { - vs->_field0 = 1; + vs->_voiceType = VOICETYPE_1; vs->_field1 = vs->_field2 = total; -// offset = 4; } for (Common::List::iterator i = sfManager()._installedDrivers.begin(); @@ -557,7 +578,56 @@ void SoundManager::_sfRethinkSoundDrivers() { } void SoundManager::_sfRethinkVoiceTypes() { - + ++sfManager()._suspendCtr; + _sfDereferenceAll(); + + for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { + VoiceStruct *vs = sfManager()._voiceStructPtrs[voiceIndex]; + if (!vs) + continue; + + if (vs->_voiceType == VOICETYPE_0) { + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + vse._field14 = vse._field4; + vse._field16 = vse._field6; + vse._field18 = vse._field8; + vse._field19 = vse._field9; + vse._field1A = vse._fieldA; + vse._field4 = 0; + vse._field6 = 0; + vse._field8 = 0; + vse._field9 = 0; + vse._fieldA = 0; + vse._fieldC = 0; + vse._fieldE = 0; + vse._field10 = 0; + vse._field11 = 0; + vse._field12 = 0; + } + } else { + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + vse._field14 = vse._field8; + vse._field16 = vse._fieldA; + vse._field18 = vse._fieldC; + vse._field19 = vse._fieldD; + vse._field8 = 0; + vse._fieldA = 0; + vse._fieldC = 0; + vse._fieldD = 0; + vse._fieldE = 0; + vse._field10 = 0; + vse._field12 = 0; + } + } + } + + int var2 = 0; + for (Common::List::iterator playIterator = sfManager()._playList.begin(); + playIterator != sfManager()._playList.end(); ++playIterator) { + + } } void SoundManager::_sfUpdateVolume(Sound *sound) { @@ -602,7 +672,7 @@ void SoundManager::_sfSetMasterVol(int volume) { for (Common::List::iterator i = _globals->_soundManager._installedDrivers.begin(); i != _globals->_soundManager._installedDrivers.end(); ++i) { - (*i)->setVolume(volume); + (*i)->setMasterVolume(volume); } } } @@ -656,7 +726,7 @@ bool SoundManager::_sfInstallDriver(SoundDriver *driver) { _sfExtractGroupMask(); _sfRethinkSoundDrivers(); - driver->setVolume(sfManager()._volume); + driver->setMasterVolume(sfManager()._volume); return true; } @@ -709,13 +779,27 @@ bool SoundManager::_sfDoRemoveFromPlayList(Sound *sound) { void SoundManager::_sfDoUpdateVolume(Sound *sound) { ++_globals->_soundManager._suspendCtr; - for (int idx = 0; idx < 16; ++idx) { - /* - Sound *snd = sfManager()._voiceStructPtrs[idx]; - if (!snd) + for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { + VoiceStruct *vs = sfManager()._voiceStructPtrs[voiceIndex]; + if (!vs) continue; -*/ - // TODO: More stuff + + 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._field4 && !vse._field6) { + int vol = sound->_volume * sound->_field48[vse._field8] / 127; + driver->setVolume0(voiceIndex, vse._field0, 7, vol); + } + } else { + if (!vse._field8 && !vse._fieldA) { + int vol = sound->_volume * sound->_field48[vse._fieldC] / 127; + driver->setVolume1(voiceIndex, vse._field0, 7, vol); + } + } + } } --_globals->_soundManager._suspendCtr; @@ -1070,6 +1154,9 @@ SoundDriver::SoundDriver() { const byte adlib_group_data[] = { 1, 1, 9, 1, 0xff }; AdlibSoundDriver::AdlibSoundDriver() { + _minVersion = 0x102; + + _groupData.groupMask = 1; _groupData.v1 = 0x46; _groupData.v2 = 0; diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 591d0e1e07..145282c499 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -77,8 +77,10 @@ public: virtual bool open() { return true; } virtual void close() {} virtual const GroupData *getGroupData() = 0; - virtual void setVolume(int volume) {} + virtual void setMasterVolume(int volume) {} virtual void installPatchBank(const byte *data) {} + virtual void setVolume0(int channel, int v2, int v3, int volume) {} + virtual void setVolume1(int channel, int v2, int v3, int volume) {} virtual void poll() {} }; @@ -93,11 +95,25 @@ struct VoiceStructEntry { int _fieldA; int _fieldC; int _fieldD; + int _fieldE; + int _field10; + int _field11; + int _field12; + int _field13; + int _field14; + int _field16; + int _field18; + int _field19; + + int _field1A; + int _field1B; }; +enum VoiceType {VOICETYPE_0 = 0, VOICETYPE_1 = 1}; + class VoiceStruct { public: - int _field0; + VoiceType _voiceType; int _field1; int _field2; @@ -195,6 +211,7 @@ public: static void _sfDoUpdateVolume(Sound *sound); static void _sfSoundServer(); static void _sfProcessFading(); + static void _sfUpdateVoiceStructs(); }; class Sound: public EventHandler { -- cgit v1.2.3 From 1d190139125bd5ed0af43213c779a71b3b0615f5 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 26 May 2011 20:30:30 +1000 Subject: TSAGE: Updated the separation of fields from the Sound class to the trackInfoStruct structure --- engines/tsage/resources.cpp | 4 +++- engines/tsage/sound.cpp | 46 +++++++++++++++++++++++---------------------- engines/tsage/sound.h | 20 +++++++++++++------- 3 files changed, 40 insertions(+), 30 deletions(-) (limited to 'engines/tsage') 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/sound.cpp b/engines/tsage/sound.cpp index 329a1ea321..c66b428950 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -678,7 +678,7 @@ void SoundManager::_sfSetMasterVol(int volume) { } void SoundManager::_sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum) { - trackInfo->count = 0; + trackInfo->_count = 0; const byte *p = soundData + READ_LE_UINT16(soundData + 8); uint32 v; @@ -688,14 +688,14 @@ void SoundManager::_sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *s p += 6; for (int idx = 0; idx < count; ++idx) { - if (trackInfo->count == 16) { - trackInfo->count = -1; + if (trackInfo->_count == 16) { + trackInfo->_count = -1; return; } - trackInfo->rlbList[trackInfo->count] = READ_LE_UINT16(p); - trackInfo->arr2[trackInfo->count] = READ_LE_UINT16(p + 2); - ++trackInfo->count; + trackInfo->_rlbList[trackInfo->_count] = READ_LE_UINT16(p); + trackInfo->_arr2[trackInfo->_count] = READ_LE_UINT16(p + 2); + ++trackInfo->_count; p += 4; } } @@ -829,9 +829,9 @@ Sound::Sound() { _volume4 = 0; _timeIndex = 0; _field26 = 0; - _trackInfo.count = 0; + _trackInfo._count = 0; _primed = false; - _field26C = 0; + _isEmpty = false; _field26E = NULL; } @@ -862,6 +862,7 @@ void Sound::_prime(int soundNum, bool queFlag) { if (_soundNum != -1) { // Sound number specified + _isEmpty = false; _field26E = NULL; byte *soundData = _resourceManager->getResource(RES_SOUND, soundNum, 0); _globals->_soundManager.checkResVersion(soundData); @@ -870,18 +871,19 @@ void Sound::_prime(int soundNum, bool queFlag) { _loop = _globals->_soundManager.extractLoop(soundData); _globals->_soundManager.extractTrackInfo(&_trackInfo, soundData, _groupNum); - for (int idx = 0; idx < _trackInfo.count; ++idx) { - _handleList[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo.rlbList[idx]); + for (int idx = 0; idx < _trackInfo._count; ++idx) { + _trackInfo._handleList[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo._rlbList[idx]); } DEALLOCATE(soundData); } else { // No sound specified + _isEmpty = true; _groupNum = 0; _soundPriority = 0; _loop = 0; - _trackInfo.count = 0; - _handleList[0] = ALLOCATE(200); + _trackInfo._count = 0; + _trackInfo._handleList[0] = ALLOCATE(200); _field26E = ALLOCATE(200); } @@ -893,17 +895,17 @@ void Sound::_prime(int soundNum, bool queFlag) { void Sound::_unPrime() { if (_primed) { - if (_field26C) { - DEALLOCATE(_handleList[0]); + if (_isEmpty) { + DEALLOCATE(_trackInfo._handleList[0]); DEALLOCATE(_field26E); _field26E = NULL; } else { - for (int idx = 0; idx < _trackInfo.count; ++idx) { - DEALLOCATE(_handleList[idx]); + for (int idx = 0; idx < _trackInfo._count; ++idx) { + DEALLOCATE(_trackInfo._handleList[idx]); } } - _trackInfo.count = 0; + _trackInfo._count = 0; _globals->_soundManager.removeFromSoundList(this); _primed = false; @@ -912,13 +914,13 @@ void Sound::_unPrime() { } void Sound::orientAfterDriverChange() { - if (!_field26C) { + if (!_isEmpty) { int timeIndex = getTimeIndex(); - for (int idx = 0; idx < _trackInfo.count; ++idx) - DEALLOCATE(_handleList[idx]); + for (int idx = 0; idx < _trackInfo._count; ++idx) + DEALLOCATE(_trackInfo._handleList[idx]); - _trackInfo.count = 0; + _trackInfo._count = 0; _primed = false; _prime(_soundNum, true); setTimeIndex(timeIndex); @@ -926,7 +928,7 @@ void Sound::orientAfterDriverChange() { } void Sound::orientAfterRestore() { - if (_field26C) { + if (_isEmpty) { int timeIndex = getTimeIndex(); _primed = false; _prime(_soundNum, true); diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 145282c499..0f361e00bd 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -37,9 +37,18 @@ class Sound; #define ADLIB_DRIVER_NUM 3 struct trackInfoStruct { - int count; - int rlbList[SOUND_ARR_SIZE]; - int arr2[SOUND_ARR_SIZE]; + int _count; + int _rlbList[SOUND_ARR_SIZE]; + int _arr2[SOUND_ARR_SIZE]; + byte *_handleList[SOUND_ARR_SIZE]; + int field82[SOUND_ARR_SIZE]; + int field92[SOUND_ARR_SIZE]; + int fielda2[SOUND_ARR_SIZE]; + int fieldb2[SOUND_ARR_SIZE]; + int fieldf2[SOUND_ARR_SIZE]; + int field132[SOUND_ARR_SIZE]; + int field152[SOUND_ARR_SIZE]; + }; enum SoundDriverStatus {SNDSTATUS_FAILED = 0, SNDSTATUS_DETECTED = 1, SNDSTATUS_SKIPPED = 2}; @@ -254,11 +263,8 @@ public: int _fieldC8[SOUND_ARR_SIZE]; int _fieldE8[SOUND_ARR_SIZE]; trackInfoStruct _trackInfo; - byte *_handleList[75]; - int _field266; - int _field268; bool _primed; - int _field26C; + bool _isEmpty; byte *_field26E; public: Sound(); -- cgit v1.2.3 From fd4c55850d0afd40be779169c917bdbf34ba7959 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 27 May 2011 20:55:09 +1000 Subject: TSAGE: Bugfixes for sound de-initialisation --- engines/tsage/globals.cpp | 1 - engines/tsage/sound.cpp | 9 ++++++--- engines/tsage/sound.h | 3 ++- engines/tsage/tsage.cpp | 3 +++ 4 files changed, 11 insertions(+), 5 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index e38fb21237..910fd033d0 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -101,7 +101,6 @@ Globals::Globals() : } Globals::~Globals() { - _globals = NULL; delete _inventory; delete _game; } diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index c66b428950..b6b434e279 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -129,9 +129,7 @@ Common::List &SoundManager::buildDriverList(bool detectFlag) { } void SoundManager::installConfigDrivers() { -#ifdef TSAGE_SOUND installDriver(ADLIB_DRIVER_NUM); -#endif } Common::List &SoundManager::getDriverList(bool detectFlag) { @@ -623,7 +621,7 @@ void SoundManager::_sfRethinkVoiceTypes() { } } - int var2 = 0; +// int var2 = 0; for (Common::List::iterator playIterator = sfManager()._playList.begin(); playIterator != sfManager()._playList.end(); ++playIterator) { @@ -835,6 +833,10 @@ Sound::Sound() { _field26E = NULL; } +Sound::~Sound() { + stop(); +} + void Sound::play(int soundNum) { prime(soundNum); _globals->_soundManager.addToPlayList(this); @@ -1158,6 +1160,7 @@ const byte adlib_group_data[] = { 1, 1, 9, 1, 0xff }; AdlibSoundDriver::AdlibSoundDriver() { _minVersion = 0x102; + _maxVersion = 0x10A; _groupData.groupMask = 1; diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 0f361e00bd..eebb549a76 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -257,7 +257,7 @@ public: int _field58[SOUND_ARR_SIZE]; int _field68[SOUND_ARR_SIZE]; int _field78[SOUND_ARR_SIZE]; - int _field98[SOUND_ARR_SIZE]; + int _voiceStructIndex[SOUND_ARR_SIZE]; int _fieldA8[SOUND_ARR_SIZE]; int _fieldB8[SOUND_ARR_SIZE]; int _fieldC8[SOUND_ARR_SIZE]; @@ -268,6 +268,7 @@ public: byte *_field26E; public: Sound(); + ~Sound(); void play(int soundNum); void stop(); diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp index 68d477aa0b..99708d617b 100644 --- a/engines/tsage/tsage.cpp +++ b/engines/tsage/tsage.cpp @@ -90,6 +90,9 @@ void TSageEngine::deinitialise() { delete _globals; delete _resourceManager; delete _saver; + _globals = NULL; + _resourceManager = NULL; + _saver = NULL; } Common::Error TSageEngine::run() { -- cgit v1.2.3 From 815c1537b74f3ff34e7fd395fa88093389a0b95a Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 27 May 2011 21:19:06 +1000 Subject: TSAGE: Tweaks to the destructor sequence to fix crashes --- engines/tsage/globals.cpp | 1 + engines/tsage/sound.cpp | 91 +++++++++++++++++++++++++---------------------- engines/tsage/tsage.cpp | 1 - 3 files changed, 50 insertions(+), 43 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index 910fd033d0..39a974173b 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -103,6 +103,7 @@ Globals::Globals() : Globals::~Globals() { delete _inventory; delete _game; + _globals = NULL; } void Globals::reset() { diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index b6b434e279..389086a97d 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -29,7 +29,12 @@ namespace tSage { +static SoundManager *_soundManager = NULL; + +/*--------------------------------------------------------------------------*/ + SoundManager::SoundManager() { + _soundManager = this; __sndmgrReady = false; _minVersion = 0x102; _maxVersion = 0x10A; @@ -62,6 +67,8 @@ SoundManager::~SoundManager() { } _sfTerminate(); } + + _soundManager = NULL; } void SoundManager::postInit() { @@ -284,9 +291,9 @@ void SoundManager::checkResVersion(const byte *soundData) { int maxVersion = READ_LE_UINT16(soundData + 4); int minVersion = READ_LE_UINT16(soundData + 6); - if (_globals->_soundManager._minVersion < minVersion) + if (_soundManager->_minVersion < minVersion) error("Attempt to play/prime sound resource that is too new"); - if (_globals->_soundManager._minVersion > maxVersion) + if (_soundManager->_minVersion > maxVersion) error("Attempt to play/prime sound resource that is too old"); } @@ -393,7 +400,7 @@ void SoundManager::_sfUpdateVoiceStructs() { /*--------------------------------------------------------------------------*/ void SoundManager::saveNotifier(bool postFlag) { - _globals->_soundManager.saveNotifierProc(postFlag); + _soundManager->saveNotifierProc(postFlag); } void SoundManager::saveNotifierProc(bool postFlag) { @@ -401,7 +408,7 @@ void SoundManager::saveNotifierProc(bool postFlag) { } void SoundManager::loadNotifier(bool postFlag) { - _globals->_soundManager.loadNotifierProc(postFlag); + _soundManager->loadNotifierProc(postFlag); } void SoundManager::loadNotifierProc(bool postFlag) { @@ -416,7 +423,7 @@ void SoundManager::listenerSynchronize(Serializer &s) { /*--------------------------------------------------------------------------*/ SoundManager &SoundManager::sfManager() { - return _globals->_soundManager; + return *_soundManager; } void SoundManager::_soSetTimeIndex(int timeIndex) { @@ -427,7 +434,7 @@ 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 & _globals->_soundManager._groupMask) == v) + if ((v & _soundManager->_groupMask) == v) return v; p += 6 + (READ_LE_UINT16(p + 4) * 4); @@ -452,9 +459,9 @@ void SoundManager::_sfRemoveFromPlayList(Sound *sound) { } bool SoundManager::_sfIsOnPlayList(Sound *sound) { - ++_globals->_soundManager._suspendCtr; - bool result = contains(_globals->_soundManager._playList, sound); - --_globals->_soundManager._suspendCtr; + ++_soundManager->_suspendCtr; + bool result = contains(_soundManager->_playList, sound); + --_soundManager->_suspendCtr; return result; } @@ -640,7 +647,7 @@ void SoundManager::_sfDereferenceAll() { } void SoundManager::_sfUpdatePriority(Sound *sound) { - ++_globals->_soundManager._suspendCtr; + ++_soundManager->_suspendCtr; int tempPriority = (sound->_priority2 == 255) ? sound->_soundPriority : sound->_priority; if (sound->_priority != tempPriority) { @@ -651,7 +658,7 @@ void SoundManager::_sfUpdatePriority(Sound *sound) { } } - --_globals->_soundManager._suspendCtr; + --_soundManager->_suspendCtr; } void SoundManager::_sfUpdateLoop(Sound *sound) { @@ -665,11 +672,11 @@ void SoundManager::_sfSetMasterVol(int volume) { if (volume > 127) volume = 127; - if (volume != _globals->_soundManager._volume) { - _globals->_soundManager._volume = volume; + if (volume != _soundManager->_volume) { + _soundManager->_volume = volume; - for (Common::List::iterator i = _globals->_soundManager._installedDrivers.begin(); - i != _globals->_soundManager._installedDrivers.end(); ++i) { + for (Common::List::iterator i = _soundManager->_installedDrivers.begin(); + i != _soundManager->_installedDrivers.end(); ++i) { (*i)->setMasterVolume(volume); } } @@ -709,9 +716,9 @@ void SoundManager::_sfTerminate() { void SoundManager::_sfExtractGroupMask() { uint32 mask = 0; for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) - mask |= _globals->_soundManager._groupList[idx]; + mask |= _soundManager->_groupList[idx]; - _globals->_soundManager._groupMask = mask; + _soundManager->_groupMask = mask; } bool SoundManager::_sfInstallDriver(SoundDriver *driver) { @@ -775,7 +782,7 @@ bool SoundManager::_sfDoRemoveFromPlayList(Sound *sound) { } void SoundManager::_sfDoUpdateVolume(Sound *sound) { - ++_globals->_soundManager._suspendCtr; + ++_soundManager->_suspendCtr; for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { VoiceStruct *vs = sfManager()._voiceStructPtrs[voiceIndex]; @@ -800,7 +807,7 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { } } - --_globals->_soundManager._suspendCtr; + --_soundManager->_suspendCtr; } /*--------------------------------------------------------------------------*/ @@ -839,11 +846,11 @@ Sound::~Sound() { void Sound::play(int soundNum) { prime(soundNum); - _globals->_soundManager.addToPlayList(this); + _soundManager->addToPlayList(this); } void Sound::stop() { - _globals->_soundManager.removeFromPlayList(this); + _soundManager->removeFromPlayList(this); _unPrime(); } @@ -867,11 +874,11 @@ void Sound::_prime(int soundNum, bool queFlag) { _isEmpty = false; _field26E = NULL; byte *soundData = _resourceManager->getResource(RES_SOUND, soundNum, 0); - _globals->_soundManager.checkResVersion(soundData); - _groupNum = _globals->_soundManager.determineGroup(soundData); - _soundPriority = _globals->_soundManager.extractPriority(soundData); - _loop = _globals->_soundManager.extractLoop(soundData); - _globals->_soundManager.extractTrackInfo(&_trackInfo, soundData, _groupNum); + _soundManager->checkResVersion(soundData); + _groupNum = _soundManager->determineGroup(soundData); + _soundPriority = _soundManager->extractPriority(soundData); + _loop = _soundManager->extractLoop(soundData); + _soundManager->extractTrackInfo(&_trackInfo, soundData, _groupNum); for (int idx = 0; idx < _trackInfo._count; ++idx) { _trackInfo._handleList[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo._rlbList[idx]); @@ -890,7 +897,7 @@ void Sound::_prime(int soundNum, bool queFlag) { } if (queFlag) - _globals->_soundManager.addToSoundList(this); + _soundManager->addToSoundList(this); _primed = true; } @@ -908,7 +915,7 @@ void Sound::_unPrime() { } _trackInfo._count = 0; - _globals->_soundManager.removeFromSoundList(this); + _soundManager->removeFromSoundList(this); _primed = false; _stopFlag = false; @@ -942,11 +949,11 @@ void Sound::go() { if (!_primed) error("Attempt to execute Sound::go() on an unprimed Sound"); - _globals->_soundManager.addToPlayList(this); + _soundManager->addToPlayList(this); } void Sound::halt(void) { - _globals->_soundManager.removeFromPlayList(this); + _soundManager->removeFromPlayList(this); } int Sound::getSoundNum() const { @@ -954,7 +961,7 @@ int Sound::getSoundNum() const { } bool Sound::isPlaying() { - return _globals->_soundManager.isOnPlayList(this); + return _soundManager->isOnPlayList(this); } bool Sound::isPrimed() const { @@ -970,31 +977,31 @@ bool Sound::isMuted() const { } void Sound::pause(bool flag) { - _globals->_soundManager.suspendSoundServer(); + _soundManager->suspendSoundServer(); if (flag) ++_pauseCtr; else if (_pauseCtr > 0) --_pauseCtr; - _globals->_soundManager.rethinkVoiceTypes(); - _globals->_soundManager.restartSoundServer(); + _soundManager->rethinkVoiceTypes(); + _soundManager->restartSoundServer(); } void Sound::mute(bool flag) { - _globals->_soundManager.suspendSoundServer(); + _soundManager->suspendSoundServer(); if (flag) ++_muteCtr; else if (_muteCtr > 0) --_muteCtr; - _globals->_soundManager.rethinkVoiceTypes(); - _globals->_soundManager.restartSoundServer(); + _soundManager->rethinkVoiceTypes(); + _soundManager->restartSoundServer(); } void Sound::fade(int volume1, int volume2, int volume3, int volume4) { - _globals->_soundManager.suspendSoundServer(); + _soundManager->suspendSoundServer(); if (volume1 > 127) volume1 = 127; @@ -1009,7 +1016,7 @@ void Sound::fade(int volume1, int volume2, int volume3, int volume4) { _volume5 = 0; _volume4 = volume4; - _globals->_soundManager.restartSoundServer(); + _soundManager->restartSoundServer(); } void Sound::setTimeIndex(uint32 timeIndex) { @@ -1039,7 +1046,7 @@ void Sound::setVol(int volume) { if (_volume != volume) { _volume = volume; if (isPlaying()) - _globals->_soundManager.updateSoundVol(this); + _soundManager->updateSoundVol(this); } } @@ -1051,12 +1058,12 @@ void Sound::setPri(int priority) { if (priority > 127) priority = 127; _priority2 = priority; - _globals->_soundManager.updateSoundPri(this); + _soundManager->updateSoundPri(this); } void Sound::setLoop(bool flag) { _loopFlag2 = flag; - _globals->_soundManager.updateSoundLoop(this); + _soundManager->updateSoundLoop(this); } int Sound::getPri() const { diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp index 99708d617b..cb39f66618 100644 --- a/engines/tsage/tsage.cpp +++ b/engines/tsage/tsage.cpp @@ -90,7 +90,6 @@ void TSageEngine::deinitialise() { delete _globals; delete _resourceManager; delete _saver; - _globals = NULL; _resourceManager = NULL; _saver = NULL; } -- cgit v1.2.3 From 339f60bb8fbb260b2952194fb9b771e41ca40f2c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 28 May 2011 09:07:30 +1000 Subject: TSAGE: Fix usage of trackInfo count field --- engines/tsage/sound.cpp | 26 +++++++++++++------------- engines/tsage/sound.h | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 389086a97d..50cb76b6ba 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -683,7 +683,7 @@ void SoundManager::_sfSetMasterVol(int volume) { } void SoundManager::_sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum) { - trackInfo->_count = 0; + trackInfo->_maxTrack = 0; const byte *p = soundData + READ_LE_UINT16(soundData + 8); uint32 v; @@ -693,14 +693,14 @@ void SoundManager::_sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *s p += 6; for (int idx = 0; idx < count; ++idx) { - if (trackInfo->_count == 16) { - trackInfo->_count = -1; + if (trackInfo->_maxTrack == 16) { + trackInfo->_maxTrack = -1; return; } - trackInfo->_rlbList[trackInfo->_count] = READ_LE_UINT16(p); - trackInfo->_arr2[trackInfo->_count] = READ_LE_UINT16(p + 2); - ++trackInfo->_count; + trackInfo->_rlbList[trackInfo->_maxTrack] = READ_LE_UINT16(p); + trackInfo->_arr2[trackInfo->_maxTrack] = READ_LE_UINT16(p + 2); + ++trackInfo->_maxTrack; p += 4; } } @@ -834,7 +834,7 @@ Sound::Sound() { _volume4 = 0; _timeIndex = 0; _field26 = 0; - _trackInfo._count = 0; + _trackInfo._maxTrack = 0; _primed = false; _isEmpty = false; _field26E = NULL; @@ -880,7 +880,7 @@ void Sound::_prime(int soundNum, bool queFlag) { _loop = _soundManager->extractLoop(soundData); _soundManager->extractTrackInfo(&_trackInfo, soundData, _groupNum); - for (int idx = 0; idx < _trackInfo._count; ++idx) { + for (int idx = 0; idx <= _trackInfo._maxTrack; ++idx) { _trackInfo._handleList[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo._rlbList[idx]); } @@ -891,7 +891,7 @@ void Sound::_prime(int soundNum, bool queFlag) { _groupNum = 0; _soundPriority = 0; _loop = 0; - _trackInfo._count = 0; + _trackInfo._maxTrack = 0; _trackInfo._handleList[0] = ALLOCATE(200); _field26E = ALLOCATE(200); } @@ -909,12 +909,12 @@ void Sound::_unPrime() { DEALLOCATE(_field26E); _field26E = NULL; } else { - for (int idx = 0; idx < _trackInfo._count; ++idx) { + for (int idx = 0; idx <= _trackInfo._maxTrack; ++idx) { DEALLOCATE(_trackInfo._handleList[idx]); } } - _trackInfo._count = 0; + _trackInfo._maxTrack = 0; _soundManager->removeFromSoundList(this); _primed = false; @@ -926,10 +926,10 @@ void Sound::orientAfterDriverChange() { if (!_isEmpty) { int timeIndex = getTimeIndex(); - for (int idx = 0; idx < _trackInfo._count; ++idx) + for (int idx = 0; idx <= _trackInfo._maxTrack; ++idx) DEALLOCATE(_trackInfo._handleList[idx]); - _trackInfo._count = 0; + _trackInfo._maxTrack = 0; _primed = false; _prime(_soundNum, true); setTimeIndex(timeIndex); diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index eebb549a76..8670eca64e 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -37,7 +37,7 @@ class Sound; #define ADLIB_DRIVER_NUM 3 struct trackInfoStruct { - int _count; + int _maxTrack; int _rlbList[SOUND_ARR_SIZE]; int _arr2[SOUND_ARR_SIZE]; byte *_handleList[SOUND_ARR_SIZE]; -- cgit v1.2.3 From 93f92a72dcb311bdfc5be7ccc891f10b2b4d6881 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 28 May 2011 10:09:14 +1000 Subject: TSAGE: Partly reverted trackInfo changes, and fixed extract process --- engines/tsage/sound.cpp | 44 ++++++++++++++++++++++++-------------------- engines/tsage/sound.h | 2 +- 2 files changed, 25 insertions(+), 21 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 50cb76b6ba..9ed4041148 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -683,29 +683,31 @@ void SoundManager::_sfSetMasterVol(int volume) { } void SoundManager::_sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum) { - trackInfo->_maxTrack = 0; + trackInfo->_count = 0; const byte *p = soundData + READ_LE_UINT16(soundData + 8); uint32 v; while ((v = READ_LE_UINT32(p)) != 0) { - while ((v == 0x80000000) || (v == (uint)groupNum)) { + 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->_maxTrack == 16) { - trackInfo->_maxTrack = -1; + if (trackInfo->_count == 16) { + trackInfo->_count = -1; return; } - trackInfo->_rlbList[trackInfo->_maxTrack] = READ_LE_UINT16(p); - trackInfo->_arr2[trackInfo->_maxTrack] = READ_LE_UINT16(p + 2); - ++trackInfo->_maxTrack; + trackInfo->_rlbList[trackInfo->_count] = READ_LE_UINT16(p); + trackInfo->_arr2[trackInfo->_count] = READ_LE_UINT16(p + 2); + ++trackInfo->_count; p += 4; - } + } + } else { + // Not correct group, so move to next one + p += 6 + (READ_LE_UINT16(p + 4) * 4); } - - p += 6 + (READ_LE_UINT16(p + 4) * 4); } } @@ -715,8 +717,10 @@ void SoundManager::_sfTerminate() { void SoundManager::_sfExtractGroupMask() { uint32 mask = 0; - for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) - mask |= _soundManager->_groupList[idx]; + + for (Common::List::iterator i = sfManager()._installedDrivers.begin(); + i != sfManager()._installedDrivers.end(); ++i) + mask |= (*i)->_groupMask; _soundManager->_groupMask = mask; } @@ -834,7 +838,7 @@ Sound::Sound() { _volume4 = 0; _timeIndex = 0; _field26 = 0; - _trackInfo._maxTrack = 0; + _trackInfo._count = 0; _primed = false; _isEmpty = false; _field26E = NULL; @@ -880,7 +884,7 @@ void Sound::_prime(int soundNum, bool queFlag) { _loop = _soundManager->extractLoop(soundData); _soundManager->extractTrackInfo(&_trackInfo, soundData, _groupNum); - for (int idx = 0; idx <= _trackInfo._maxTrack; ++idx) { + for (int idx = 0; idx < _trackInfo._count; ++idx) { _trackInfo._handleList[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo._rlbList[idx]); } @@ -891,7 +895,7 @@ void Sound::_prime(int soundNum, bool queFlag) { _groupNum = 0; _soundPriority = 0; _loop = 0; - _trackInfo._maxTrack = 0; + _trackInfo._count = 0; _trackInfo._handleList[0] = ALLOCATE(200); _field26E = ALLOCATE(200); } @@ -909,12 +913,12 @@ void Sound::_unPrime() { DEALLOCATE(_field26E); _field26E = NULL; } else { - for (int idx = 0; idx <= _trackInfo._maxTrack; ++idx) { + for (int idx = 0; idx < _trackInfo._count; ++idx) { DEALLOCATE(_trackInfo._handleList[idx]); } } - _trackInfo._maxTrack = 0; + _trackInfo._count = 0; _soundManager->removeFromSoundList(this); _primed = false; @@ -926,10 +930,10 @@ void Sound::orientAfterDriverChange() { if (!_isEmpty) { int timeIndex = getTimeIndex(); - for (int idx = 0; idx <= _trackInfo._maxTrack; ++idx) + for (int idx = 0; idx < _trackInfo._count; ++idx) DEALLOCATE(_trackInfo._handleList[idx]); - _trackInfo._maxTrack = 0; + _trackInfo._count = 0; _primed = false; _prime(_soundNum, true); setTimeIndex(timeIndex); @@ -1170,7 +1174,7 @@ AdlibSoundDriver::AdlibSoundDriver() { _maxVersion = 0x10A; - _groupData.groupMask = 1; + _groupData.groupMask = 9; _groupData.v1 = 0x46; _groupData.v2 = 0; _groupData.pData = &adlib_group_data[0]; diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 8670eca64e..eebb549a76 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -37,7 +37,7 @@ class Sound; #define ADLIB_DRIVER_NUM 3 struct trackInfoStruct { - int _maxTrack; + int _count; int _rlbList[SOUND_ARR_SIZE]; int _arr2[SOUND_ARR_SIZE]; byte *_handleList[SOUND_ARR_SIZE]; -- cgit v1.2.3 From 12464b101fc92f0f148f59e906829c568280a455 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 1 Jun 2011 21:02:00 +1000 Subject: TSAGE: Added sound driver classes copied from CRUISE engine --- engines/tsage/sound.cpp | 659 ++++++++++++++++++++++++++++++++++++++++++++---- engines/tsage/sound.h | 175 ++++++++++++- 2 files changed, 787 insertions(+), 47 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 9ed4041148..ac77edd7d9 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -586,53 +586,41 @@ void SoundManager::_sfRethinkVoiceTypes() { ++sfManager()._suspendCtr; _sfDereferenceAll(); - for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { - VoiceStruct *vs = sfManager()._voiceStructPtrs[voiceIndex]; - if (!vs) - continue; - - if (vs->_voiceType == VOICETYPE_0) { - for (uint idx = 0; idx < vs->_entries.size(); ++idx) { - VoiceStructEntry &vse = vs->_entries[idx]; - vse._field14 = vse._field4; - vse._field16 = vse._field6; - vse._field18 = vse._field8; - vse._field19 = vse._field9; - vse._field1A = vse._fieldA; - vse._field4 = 0; - vse._field6 = 0; - vse._field8 = 0; - vse._field9 = 0; - vse._fieldA = 0; - vse._fieldC = 0; - vse._fieldE = 0; - vse._field10 = 0; - vse._field11 = 0; - vse._field12 = 0; - } - } else { - for (uint idx = 0; idx < vs->_entries.size(); ++idx) { - VoiceStructEntry &vse = vs->_entries[idx]; - vse._field14 = vse._field8; - vse._field16 = vse._fieldA; - vse._field18 = vse._fieldC; - vse._field19 = vse._fieldD; - vse._field8 = 0; - vse._fieldA = 0; - vse._fieldC = 0; - vse._fieldD = 0; - vse._fieldE = 0; - vse._field10 = 0; - vse._field12 = 0; - } + // Check for any active sound currently playing + for (Common::List::iterator playIterator = sfManager()._playList.begin(); + playIterator != sfManager()._playList.end(); ++playIterator) { + Sound *sound = *playIterator; + if (sound->getCueValue() >= 0) { + // Currently playing sound + // TODO: Figure out how to determine when raw playback has ended + return; } } -// int var2 = 0; + // No currently playing sound, so look for any queued sounds to play for (Common::List::iterator playIterator = sfManager()._playList.begin(); playIterator != sfManager()._playList.end(); ++playIterator) { + Sound *sound = *playIterator; + if (sound->getCueValue() == -1) { + // Found a sound to start playing + + // Get the first sound driver + assert(sfManager()._installedDrivers.size() > 0); + SoundDriver *driver = *sfManager()._installedDrivers.begin(); + + // Start each channel of the sound + for (int channelNum = 0; channelNum < sound->_trackInfo._count; ++channelNum) { + const byte *data = sound->_trackInfo._channelData[channelNum]; + int dataSize = _vm->_memoryManager.getSize(data); + + driver->play(data, dataSize, channelNum, sfManager()._volume); + } + sound->_cueValue = 0; + return; + } } + } void SoundManager::_sfUpdateVolume(Sound *sound) { @@ -885,7 +873,7 @@ void Sound::_prime(int soundNum, bool queFlag) { _soundManager->extractTrackInfo(&_trackInfo, soundData, _groupNum); for (int idx = 0; idx < _trackInfo._count; ++idx) { - _trackInfo._handleList[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo._rlbList[idx]); + _trackInfo._channelData[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo._rlbList[idx]); } DEALLOCATE(soundData); @@ -896,7 +884,7 @@ void Sound::_prime(int soundNum, bool queFlag) { _soundPriority = 0; _loop = 0; _trackInfo._count = 0; - _trackInfo._handleList[0] = ALLOCATE(200); + _trackInfo._channelData[0] = ALLOCATE(200); _field26E = ALLOCATE(200); } @@ -909,12 +897,12 @@ void Sound::_prime(int soundNum, bool queFlag) { void Sound::_unPrime() { if (_primed) { if (_isEmpty) { - DEALLOCATE(_trackInfo._handleList[0]); + DEALLOCATE(_trackInfo._channelData[0]); DEALLOCATE(_field26E); _field26E = NULL; } else { for (int idx = 0; idx < _trackInfo._count; ++idx) { - DEALLOCATE(_trackInfo._handleList[idx]); + DEALLOCATE(_trackInfo._channelData[idx]); } } @@ -931,7 +919,7 @@ void Sound::orientAfterDriverChange() { int timeIndex = getTimeIndex(); for (int idx = 0; idx < _trackInfo._count; ++idx) - DEALLOCATE(_trackInfo._handleList[idx]); + DEALLOCATE(_trackInfo._channelData[idx]); _trackInfo._count = 0; _primed = false; @@ -1167,17 +1155,596 @@ SoundDriver::SoundDriver() { /*--------------------------------------------------------------------------*/ +const int PCSoundDriver::_noteTable[] = { + 0xEEE, 0xE17, 0xD4D, 0xC8C, 0xBD9, 0xB2F, 0xA8E, 0x9F7, + 0x967, 0x8E0, 0x861, 0x7E8, 0x777, 0x70B, 0x6A6, 0x647, + 0x5EC, 0x597, 0x547, 0x4FB, 0x4B3, 0x470, 0x430, 0x3F4, + 0x3BB, 0x385, 0x353, 0x323, 0x2F6, 0x2CB, 0x2A3, 0x27D, + 0x259, 0x238, 0x218, 0x1FA, 0x1DD, 0x1C2, 0x1A9, 0x191, + 0x17B, 0x165, 0x151, 0x13E, 0x12C, 0x11C, 0x10C, 0x0FD, + 0x0EE, 0x0E1, 0x0D4, 0x0C8, 0x0BD, 0x0B2, 0x0A8, 0x09F, + 0x096, 0x08E, 0x086, 0x07E, 0x077, 0x070, 0x06A, 0x064, + 0x05E, 0x059, 0x054, 0x04F, 0x04B, 0x047, 0x043, 0x03F, + 0x03B, 0x038, 0x035, 0x032, 0x02F, 0x02C, 0x02A, 0x027, + 0x025, 0x023, 0x021, 0x01F, 0x01D, 0x01C, 0x01A, 0x019, + 0x017, 0x016, 0x015, 0x013, 0x012, 0x011, 0x010, 0x00F +}; + +const int PCSoundDriver::_noteTableCount = ARRAYSIZE(_noteTable); + +void PCSoundDriver::setUpdateCallback(UpdateCallback upCb, void *ref) { + _upCb = upCb; + _upRef = ref; +} + +void PCSoundDriver::findNote(int freq, int *note, int *oct) const { + *note = _noteTableCount - 1; + for (int i = 0; i < _noteTableCount; ++i) { + if (_noteTable[i] <= freq) { + *note = i; + break; + } + } + + *oct = *note / 12; + *note %= 12; +} + +void PCSoundDriver::resetChannel(int channel) { + stopChannel(channel); + stopAll(); +} + +void PCSoundDriver::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 + _musicVolume = music_mute ? 0 : MIN(255, ConfMan.getInt("music_volume")); + _sfxVolume = sfx_mute ? 0 : MIN(255, ConfMan.getInt("sfx_volume")); +} + +/*--------------------------------------------------------------------------*/ + +const int AdlibDriverBase::_freqTable[] = { + 0x157, 0x16C, 0x181, 0x198, 0x1B1, 0x1CB, + 0x1E6, 0x203, 0x222, 0x243, 0x266, 0x28A +}; + +const int AdlibDriverBase::_freqTableCount = ARRAYSIZE(_freqTable); + +const int AdlibDriverBase::_operatorsTable[] = { + 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21 +}; + +const int AdlibDriverBase::_operatorsTableCount = ARRAYSIZE(_operatorsTable); + +const int AdlibDriverBase::_voiceOperatorsTable[] = { + 0, 3, 1, 4, 2, 5, 6, 9, 7, 10, 8, 11, 12, 15, 16, 16, 14, 14, 17, 17, 13, 13 +}; + +const int AdlibDriverBase::_voiceOperatorsTableCount = ARRAYSIZE(_voiceOperatorsTable); + + +AdlibDriverBase::AdlibDriverBase(Audio::Mixer *mixer) + : _mixer(mixer) { + _sampleRate = _mixer->getOutputRate(); + _opl = makeAdLibOPL(_sampleRate); + + for (int i = 0; i < 5; ++i) { + _channelsVolumeTable[i].original = 0; + _channelsVolumeTable[i].adjusted = 0; + } + memset(_instrumentsTable, 0, sizeof(_instrumentsTable)); + initCard(); + _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); + + _musicVolume = ConfMan.getBool("music_mute") ? 0 : MIN(255, ConfMan.getInt("music_volume")); + _sfxVolume = ConfMan.getBool("sfx_mute") ? 0 : MIN(255, ConfMan.getInt("sfx_volume")); +} + +AdlibDriverBase::~AdlibDriverBase() { + _mixer->stopHandle(_soundHandle); + OPLDestroy(_opl); +} + +void AdlibDriverBase::syncSounds() { + PCSoundDriver::syncSounds(); + + // Force all instruments to reload on the next playing point + for (int i = 0; i < 5; ++i) { + adjustVolume(i, _channelsVolumeTable[i].original); + AdLibSoundInstrument *ins = &_instrumentsTable[i]; + setupInstrument(ins, i); + } +} + +void AdlibDriverBase::adjustVolume(int channel, int volume) { + _channelsVolumeTable[channel].original = volume; + + if (volume > 80) { + volume = 80; + } else if (volume < 0) { + volume = 0; + } + volume += volume / 4; + if (volume > 127) { + volume = 127; + } + + int volAdjust = (channel == 4) ? _sfxVolume : _musicVolume; + volume = (volume * volAdjust) / 128; + + if (volume > 127) + volume = 127; + + _channelsVolumeTable[channel].adjusted = volume; +} + +void AdlibDriverBase::setupChannel(int channel, const byte *data, int instrument, int volume) { + assert(channel < 5); + if (data) { + adjustVolume(channel, volume); + setupInstrument(data, channel); + } +} + +void AdlibDriverBase::stopChannel(int channel) { + assert(channel < 5); + AdLibSoundInstrument *ins = &_instrumentsTable[channel]; + if (ins->mode != 0 && ins->channel == 6) { + channel = 6; + } + if (ins->mode == 0 || channel == 6) { + OPLWriteReg(_opl, 0xB0 | channel, 0); + } + if (ins->mode != 0) { + _vibrato &= ~(1 << (10 - ins->channel)); + OPLWriteReg(_opl, 0xBD, _vibrato); + } +} + +void AdlibDriverBase::stopAll() { + int i; + for (i = 0; i < 18; ++i) { + OPLWriteReg(_opl, 0x40 | _operatorsTable[i], 63); + } + for (i = 0; i < 9; ++i) { + OPLWriteReg(_opl, 0xB0 | i, 0); + } + OPLWriteReg(_opl, 0xBD, 0); +} + +int AdlibDriverBase::readBuffer(int16 *buffer, const int numSamples) { + update(buffer, numSamples); + return numSamples; +} + +void AdlibDriverBase::initCard() { + _vibrato = 0x20; + OPLWriteReg(_opl, 0xBD, _vibrato); + OPLWriteReg(_opl, 0x08, 0x40); + + static const int oplRegs[] = { 0x40, 0x60, 0x80, 0x20, 0xE0 }; + + for (int i = 0; i < 9; ++i) { + OPLWriteReg(_opl, 0xB0 | i, 0); + } + for (int i = 0; i < 9; ++i) { + OPLWriteReg(_opl, 0xC0 | i, 0); + } + + for (int j = 0; j < 5; j++) { + for (int i = 0; i < 18; ++i) { + OPLWriteReg(_opl, oplRegs[j] | _operatorsTable[i], 0); + } + } + + OPLWriteReg(_opl, 1, 0x20); + OPLWriteReg(_opl, 1, 0); +} + +void AdlibDriverBase::update(int16 *buf, int len) { + static int samplesLeft = 0; + while (len != 0) { + int count = samplesLeft; + if (count > len) { + count = len; + } + samplesLeft -= count; + len -= count; + YM3812UpdateOne(_opl, buf, count); + if (samplesLeft == 0) { + if (_upCb) { + (*_upCb)(_upRef); + } + samplesLeft = _sampleRate / 50; + } + buf += count; + } +} + +void AdlibDriverBase::setupInstrument(const byte *data, int channel) { + AdLibSoundInstrument *ins = &_instrumentsTable[channel]; + loadInstrument(data, ins); + + setupInstrument(ins, channel); +} + +void AdlibDriverBase::setupInstrument(const AdLibSoundInstrument *ins, int channel) { + int mod, car, tmp; + const AdLibRegisterSoundInstrument *reg; + + if (ins->mode != 0) { + mod = _operatorsTable[_voiceOperatorsTable[2 * ins->channel + 0]]; + car = _operatorsTable[_voiceOperatorsTable[2 * ins->channel + 1]]; + } else { + mod = _operatorsTable[_voiceOperatorsTable[2 * channel + 0]]; + car = _operatorsTable[_voiceOperatorsTable[2 * channel + 1]]; + } + + if (ins->mode == 0 || ins->channel == 6) { + reg = &ins->regMod; + OPLWriteReg(_opl, 0x20 | mod, reg->vibrato); + if (reg->freqMod) { + tmp = reg->outputLevel & 0x3F; + } else { + tmp = (63 - (reg->outputLevel & 0x3F)) * _channelsVolumeTable[channel].adjusted; + tmp = 63 - (2 * tmp + 127) / (2 * 127); + } + OPLWriteReg(_opl, 0x40 | mod, tmp | (reg->keyScaling << 6)); + OPLWriteReg(_opl, 0x60 | mod, reg->attackDecay); + OPLWriteReg(_opl, 0x80 | mod, reg->sustainRelease); + if (ins->mode != 0) { + OPLWriteReg(_opl, 0xC0 | ins->channel, reg->feedbackStrength); + } else { + OPLWriteReg(_opl, 0xC0 | channel, reg->feedbackStrength); + } + OPLWriteReg(_opl, 0xE0 | mod, ins->waveSelectMod); + } + + reg = &ins->regCar; + OPLWriteReg(_opl, 0x20 | car, reg->vibrato); + tmp = (63 - (reg->outputLevel & 0x3F)) * _channelsVolumeTable[channel].adjusted; + tmp = 63 - (2 * tmp + 127) / (2 * 127); + OPLWriteReg(_opl, 0x40 | car, tmp | (reg->keyScaling << 6)); + OPLWriteReg(_opl, 0x60 | car, reg->attackDecay); + OPLWriteReg(_opl, 0x80 | car, reg->sustainRelease); + OPLWriteReg(_opl, 0xE0 | car, ins->waveSelectCar); +} + +void AdlibDriverBase::loadRegisterInstrument(const byte *data, AdLibRegisterSoundInstrument *reg) { + reg->vibrato = 0; + if (READ_LE_UINT16(data + 18)) { // amplitude vibrato + reg->vibrato |= 0x80; + } + if (READ_LE_UINT16(data + 20)) { // frequency vibrato + reg->vibrato |= 0x40; + } + if (READ_LE_UINT16(data + 10)) { // sustaining sound + reg->vibrato |= 0x20; + } + if (READ_LE_UINT16(data + 22)) { // envelope scaling + reg->vibrato |= 0x10; + } + reg->vibrato |= READ_LE_UINT16(data + 2) & 0xF; // frequency multiplier + + reg->attackDecay = READ_LE_UINT16(data + 6) << 4; // attack rate + reg->attackDecay |= READ_LE_UINT16(data + 12) & 0xF; // decay rate + + reg->sustainRelease = READ_LE_UINT16(data + 8) << 4; // sustain level + reg->sustainRelease |= READ_LE_UINT16(data + 14) & 0xF; // release rate + + reg->feedbackStrength = READ_LE_UINT16(data + 4) << 1; // feedback + if (READ_LE_UINT16(data + 24) == 0) { // frequency modulation + reg->feedbackStrength |= 1; + } + + reg->keyScaling = READ_LE_UINT16(data); + reg->outputLevel = READ_LE_UINT16(data + 16); + reg->freqMod = READ_LE_UINT16(data + 24); +} + +/*--------------------------------------------------------------------------*/ + +void AdlibSoundDriverADL::loadInstrument(const byte *data, AdLibSoundInstrument *asi) { + asi->mode = *data++; + asi->channel = *data++; + asi->waveSelectMod = *data++ & 3; + asi->waveSelectCar = *data++ & 3; + asi->amDepth = *data++; + ++data; + loadRegisterInstrument(data, &asi->regMod); data += 26; + loadRegisterInstrument(data, &asi->regCar); data += 26; +} + +void AdlibSoundDriverADL::setChannelFrequency(int channel, int frequency) { + assert(channel < 5); + AdLibSoundInstrument *ins = &_instrumentsTable[channel]; + if (ins->mode != 0) { + channel = ins->channel; + if (channel == 9) { + channel = 8; + } else if (channel == 10) { + channel = 7; + } + } + int freq, note, oct; + findNote(frequency, ¬e, &oct); + + note += oct * 12; + if (ins->amDepth) { + note = ins->amDepth; + } + if (note < 0) { + note = 0; + } + + freq = _freqTable[note % 12]; + OPLWriteReg(_opl, 0xA0 | channel, freq); + freq = ((note / 12) << 2) | ((freq & 0x300) >> 8); + if (ins->mode == 0) { + freq |= 0x20; + } + OPLWriteReg(_opl, 0xB0 | channel, freq); + if (ins->mode != 0) { + _vibrato |= 1 << (10 - channel); + OPLWriteReg(_opl, 0xBD, _vibrato); + } +} + +void AdlibSoundDriverADL::playSample(const byte *data, int size, int channel, int volume) { + adjustVolume(channel, 127); + + setupInstrument(data, channel); + AdLibSoundInstrument *ins = &_instrumentsTable[channel]; + if (ins->mode != 0 && ins->channel == 6) { + OPLWriteReg(_opl, 0xB0 | channel, 0); + } + if (ins->mode != 0) { + _vibrato &= ~(1 << (10 - ins->channel)); + OPLWriteReg(_opl, 0xBD, _vibrato); + } + if (ins->mode != 0) { + channel = ins->channel; + if (channel == 9) { + channel = 8; + } else if (channel == 10) { + channel = 7; + } + } + uint16 note = 48; + if (ins->amDepth) { + note = ins->amDepth; + } + int freq = _freqTable[note % 12]; + OPLWriteReg(_opl, 0xA0 | channel, freq); + freq = ((note / 12) << 2) | ((freq & 0x300) >> 8); + if (ins->mode == 0) { + freq |= 0x20; + } + OPLWriteReg(_opl, 0xB0 | channel, freq); + if (ins->mode != 0) { + _vibrato |= 1 << (10 - channel); + OPLWriteReg(_opl, 0xBD, _vibrato); + } +} + +/*--------------------------------------------------------------------------*/ + +PCSoundFxPlayer::PCSoundFxPlayer(PCSoundDriver *driver) + : _playing(false), _songPlayed(false), _driver(driver) { + memset(_instrumentsData, 0, sizeof(_instrumentsData)); + _sfxData = NULL; + _fadeOutCounter = 0; + _driver->setUpdateCallback(updateCallback, this); +} + +PCSoundFxPlayer::~PCSoundFxPlayer() { + _driver->setUpdateCallback(NULL, NULL); + stop(); +} + +bool PCSoundFxPlayer::load(const char *song) { + /* + debug(9, "PCSoundFxPlayer::load('%s')", song); + + // stop (w/ fade out) the previous song + while (_fadeOutCounter != 0 && _fadeOutCounter < 100) { + g_system->delayMillis(50); + } + _fadeOutCounter = 0; + + if (_playing) { + stop(); + } + + strcpy(_musicName, song); + _songPlayed = false; + _looping = false; + _sfxData = readBundleSoundFile(song); + if (!_sfxData) { + warning("Unable to load soundfx module '%s'", song); + return 0; + } + + for (int i = 0; i < NUM_INSTRUMENTS; ++i) { + _instrumentsData[i] = NULL; + + char instrument[64]; + memset(instrument, 0, 64); // Clear the data first + memcpy(instrument, _sfxData + 20 + i * 30, 12); + instrument[63] = '\0'; + + if (strlen(instrument) != 0) { + char *dot = strrchr(instrument, '.'); + if (dot) { + *dot = '\0'; + } + strcat(instrument, _driver->getInstrumentExtension()); + _instrumentsData[i] = readBundleSoundFile(instrument); + if (!_instrumentsData[i]) { + warning("Unable to load soundfx instrument '%s'", instrument); + } + } + } + */ + return 1; +} + +void PCSoundFxPlayer::play() { + debug(9, "PCSoundFxPlayer::play()"); + if (_sfxData) { + for (int i = 0; i < NUM_CHANNELS; ++i) { + _instrumentsChannelTable[i] = -1; + } + _currentPos = 0; + _currentOrder = 0; +// _numOrders = _sfxData[470]; + _eventsDelay = 5; // TODO: What to do with this? + _updateTicksCounter = 0; + _playing = true; + } +} + +void PCSoundFxPlayer::stop() { + if (_playing || _fadeOutCounter != 0) { + _fadeOutCounter = 0; + _playing = false; + for (int i = 0; i < NUM_CHANNELS; ++i) { + _driver->stopChannel(i); + } + _driver->stopAll(); + } + unload(); +} + +void PCSoundFxPlayer::fadeOut() { + if (_playing) { + _fadeOutCounter = 1; + _playing = false; + } +} + +void PCSoundFxPlayer::updateCallback(void *ref) { + ((PCSoundFxPlayer *)ref)->update(); +} + +void PCSoundFxPlayer::update() { + if (_playing || (_fadeOutCounter != 0 && _fadeOutCounter < 100)) { + ++_updateTicksCounter; + if (_updateTicksCounter > _eventsDelay) { + handleEvents(); + _updateTicksCounter = 0; + } + } +} + +void PCSoundFxPlayer::handleEvents() { + const byte *patternData = _sfxData + 600 + 1800; + const byte *orderTable = _sfxData + 472; + uint16 patternNum = orderTable[_currentOrder] * 1024; + + for (int i = 0; i < 4; ++i) { + handlePattern(i, patternData + patternNum + _currentPos); + patternData += 4; + } + + if (_fadeOutCounter != 0 && _fadeOutCounter < 100) { + _fadeOutCounter += 2; + } + if (_fadeOutCounter >= 100) { + stop(); + return; + } + + _currentPos += 16; + if (_currentPos >= 1024) { + _currentPos = 0; + ++_currentOrder; + if (_currentOrder == _numOrders) { + _currentOrder = 0; + } + } + debug(7, "_currentOrder=%d/%d _currentPos=%d", _currentOrder, _numOrders, _currentPos); +} + +void PCSoundFxPlayer::handlePattern(int channel, const byte *patternData) { + int instrument = patternData[2] >> 4; + if (instrument != 0) { + --instrument; + if (_instrumentsChannelTable[channel] != instrument || _fadeOutCounter != 0) { + _instrumentsChannelTable[channel] = instrument; + const int volume = _sfxData[instrument] - _fadeOutCounter; + _driver->setupChannel(channel, _instrumentsData[instrument], instrument, volume); + } + } + int16 freq = (int16)READ_BE_UINT16(patternData); + if (freq > 0) { + _driver->stopChannel(channel); + _driver->setChannelFrequency(channel, freq); + } +} + +void PCSoundFxPlayer::unload() { + for (int i = 0; i < NUM_INSTRUMENTS; ++i) { + free(_instrumentsData[i]); + _instrumentsData[i] = NULL; + } + free(_sfxData); + _sfxData = NULL; + _songPlayed = true; +} + +void PCSoundFxPlayer::doSync(Common::Serializer &s) { + s.syncBytes((byte *)_musicName, 33); + uint16 v = (uint16)songLoaded(); + s.syncAsSint16LE(v); + + if (s.isLoading() && v) { + load(_musicName); + + for (int i = 0; i < NUM_CHANNELS; ++i) { + _instrumentsChannelTable[i] = -1; + } + + _numOrders = _sfxData[470]; + _eventsDelay = (244 - _sfxData[471]) * 100 / 1060; + _updateTicksCounter = 0; + } + + s.syncAsSint16LE(_songPlayed); + s.syncAsSint16LE(_looping); + s.syncAsSint16LE(_currentPos); + s.syncAsSint16LE(_currentOrder); + s.syncAsSint16LE(_playing); +} + +/*--------------------------------------------------------------------------*/ + const byte adlib_group_data[] = { 1, 1, 9, 1, 0xff }; AdlibSoundDriver::AdlibSoundDriver() { _minVersion = 0x102; _maxVersion = 0x10A; - _groupData.groupMask = 9; _groupData.v1 = 0x46; _groupData.v2 = 0; _groupData.pData = &adlib_group_data[0]; + + _mixer = _vm->_mixer; + _soundDriver = new AdlibSoundDriverADL(_mixer); + _player = new PCSoundFxPlayer(_soundDriver); } } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index eebb549a76..7ad4da5755 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -24,6 +24,9 @@ #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" @@ -40,7 +43,7 @@ struct trackInfoStruct { int _count; int _rlbList[SOUND_ARR_SIZE]; int _arr2[SOUND_ARR_SIZE]; - byte *_handleList[SOUND_ARR_SIZE]; + byte *_channelData[SOUND_ARR_SIZE]; int field82[SOUND_ARR_SIZE]; int field92[SOUND_ARR_SIZE]; int fielda2[SOUND_ARR_SIZE]; @@ -90,6 +93,7 @@ public: virtual void installPatchBank(const byte *data) {} virtual void setVolume0(int channel, int v2, int v3, int volume) {} virtual void setVolume1(int channel, int v2, int v3, int volume) {} + virtual void play(const byte *data, int size, int channel, int volume) {} virtual void poll() {} }; @@ -337,15 +341,184 @@ public: void release() { _sound.release(); } }; +/*-------------------------------------------------------------------------- + * Adlib related classes + *-------------------------------------------------------------------------- + */ + +struct AdLibRegisterSoundInstrument { + uint8 vibrato; + uint8 attackDecay; + uint8 sustainRelease; + uint8 feedbackStrength; + uint8 keyScaling; + uint8 outputLevel; + uint8 freqMod; +}; + +struct AdLibSoundInstrument { + byte mode; + byte channel; + AdLibRegisterSoundInstrument regMod; + AdLibRegisterSoundInstrument regCar; + byte waveSelectMod; + byte waveSelectCar; + byte amDepth; +}; + +struct VolumeEntry { + int original; + int adjusted; +}; + +class PCSoundDriver { +public: + typedef void (*UpdateCallback)(void *); + + PCSoundDriver() { _upCb = NULL, _upRef = NULL, _musicVolume = 0, _sfxVolume = 0; } + virtual ~PCSoundDriver() {} + + virtual void setupChannel(int channel, const byte *data, int instrument, int volume) = 0; + virtual void setChannelFrequency(int channel, int frequency) = 0; + virtual void stopChannel(int channel) = 0; + virtual void playSample(const byte *data, int size, int channel, int volume) = 0; + virtual void stopAll() = 0; + virtual const char *getInstrumentExtension() const { return ""; } + virtual void syncSounds(); + + void setUpdateCallback(UpdateCallback upCb, void *ref); + void resetChannel(int channel); + void findNote(int freq, int *note, int *oct) const; +protected: + UpdateCallback _upCb; + void *_upRef; + uint8 _musicVolume; + uint8 _sfxVolume; + + static const int _noteTable[]; + static const int _noteTableCount; +}; + +class AdlibDriverBase : public PCSoundDriver, Audio::AudioStream { +public: + AdlibDriverBase(Audio::Mixer *mixer); + virtual ~AdlibDriverBase(); + + // PCSoundDriver interface + virtual void setupChannel(int channel, const byte *data, int instrument, int volume); + virtual void stopChannel(int channel); + virtual void stopAll(); + + // AudioStream interface + virtual int readBuffer(int16 *buffer, const int numSamples); + virtual bool isStereo() const { return false; } + virtual bool endOfData() const { return false; } + virtual int getRate() const { return _sampleRate; } + + void initCard(); + void update(int16 *buf, int len); + void setupInstrument(const byte *data, int channel); + void setupInstrument(const AdLibSoundInstrument *ins, int channel); + void loadRegisterInstrument(const byte *data, AdLibRegisterSoundInstrument *reg); + virtual void loadInstrument(const byte *data, AdLibSoundInstrument *asi) = 0; + virtual void syncSounds(); + + void adjustVolume(int channel, int volume); + +protected: + FM_OPL *_opl; + int _sampleRate; + Audio::Mixer *_mixer; + Audio::SoundHandle _soundHandle; + + byte _vibrato; + VolumeEntry _channelsVolumeTable[10]; + AdLibSoundInstrument _instrumentsTable[10]; + + static const int _freqTable[]; + static const int _freqTableCount; + static const int _operatorsTable[]; + static const int _operatorsTableCount; + static const int _voiceOperatorsTable[]; + static const int _voiceOperatorsTableCount; +}; + +class AdlibSoundDriverADL : public AdlibDriverBase { +public: + AdlibSoundDriverADL(Audio::Mixer *mixer) : AdlibDriverBase(mixer) {} + virtual const char *getInstrumentExtension() const { return ".ADL"; } + virtual void loadInstrument(const byte *data, AdLibSoundInstrument *asi); + virtual void setChannelFrequency(int channel, int frequency); + virtual void playSample(const byte *data, int size, int channel, int volume); +}; + +class PCSoundFxPlayer { +private: + enum { + NUM_INSTRUMENTS = 15, + NUM_CHANNELS = 4 + }; + + void update(); + void handleEvents(); + void handlePattern(int channel, const byte *patternData); + + char _musicName[33]; + bool _playing; + bool _songPlayed; + int _currentPos; + int _currentOrder; + int _numOrders; + int _eventsDelay; + bool _looping; + int _fadeOutCounter; + int _updateTicksCounter; + int _instrumentsChannelTable[NUM_CHANNELS]; + byte *_sfxData; + byte *_instrumentsData[NUM_INSTRUMENTS]; + PCSoundDriver *_driver; + +public: + PCSoundFxPlayer(PCSoundDriver *driver); + ~PCSoundFxPlayer(); + + bool load(const char *song); + void play(); + void stop(); + void unload(); + void fadeOut(); + void doSync(Common::Serializer &s); + + static void updateCallback(void *ref); + + bool songLoaded() const { return _sfxData != NULL; } + bool songPlayed() const { return _songPlayed; } + bool playing() const { return _playing; } + uint8 numOrders() const { assert(_sfxData); return _sfxData[470]; } + void setNumOrders(uint8 v) { assert(_sfxData); _sfxData[470] = v; } + void setPattern(int offset, uint8 value) { assert(_sfxData); _sfxData[472 + offset] = value; } + const char *musicName() { return _musicName; } + + // Note: Original game never actually uses looping variable. Songs are hardcoded to loop + bool looping() const { return _looping; } + void setLooping(bool v) { _looping = v; } +}; + class AdlibSoundDriver: public SoundDriver { private: GroupData _groupData; + Audio::Mixer *_mixer; + PCSoundDriver *_soundDriver; + PCSoundFxPlayer *_player; public: AdlibSoundDriver(); virtual void setVolume(int volume) {} virtual void installPatchBank(const byte *data) {} virtual const GroupData *getGroupData() { return &_groupData; } + virtual void play(const byte *data, int size, int channel, int volume) { + _soundDriver->playSample(data, size, channel, volume); + } }; } // End of namespace tSage -- cgit v1.2.3 From b855a87d708b292df2813c0f676fd411a1021d81 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 5 Jun 2011 08:42:26 +1000 Subject: TSAGE: Removed CRUISE sound code that didn't work --- engines/tsage/sound.cpp | 612 ------------------------------------------------ engines/tsage/sound.h | 170 +------------- 2 files changed, 1 insertion(+), 781 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index ac77edd7d9..e3d746ecd6 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -586,40 +586,6 @@ void SoundManager::_sfRethinkVoiceTypes() { ++sfManager()._suspendCtr; _sfDereferenceAll(); - // Check for any active sound currently playing - for (Common::List::iterator playIterator = sfManager()._playList.begin(); - playIterator != sfManager()._playList.end(); ++playIterator) { - Sound *sound = *playIterator; - if (sound->getCueValue() >= 0) { - // Currently playing sound - // TODO: Figure out how to determine when raw playback has ended - return; - } - } - - // No currently playing sound, so look for any queued sounds to play - for (Common::List::iterator playIterator = sfManager()._playList.begin(); - playIterator != sfManager()._playList.end(); ++playIterator) { - Sound *sound = *playIterator; - if (sound->getCueValue() == -1) { - // Found a sound to start playing - - // Get the first sound driver - assert(sfManager()._installedDrivers.size() > 0); - SoundDriver *driver = *sfManager()._installedDrivers.begin(); - - // Start each channel of the sound - for (int channelNum = 0; channelNum < sound->_trackInfo._count; ++channelNum) { - const byte *data = sound->_trackInfo._channelData[channelNum]; - int dataSize = _vm->_memoryManager.getSize(data); - - driver->play(data, dataSize, channelNum, sfManager()._volume); - } - - sound->_cueValue = 0; - return; - } - } } @@ -1155,582 +1121,6 @@ SoundDriver::SoundDriver() { /*--------------------------------------------------------------------------*/ -const int PCSoundDriver::_noteTable[] = { - 0xEEE, 0xE17, 0xD4D, 0xC8C, 0xBD9, 0xB2F, 0xA8E, 0x9F7, - 0x967, 0x8E0, 0x861, 0x7E8, 0x777, 0x70B, 0x6A6, 0x647, - 0x5EC, 0x597, 0x547, 0x4FB, 0x4B3, 0x470, 0x430, 0x3F4, - 0x3BB, 0x385, 0x353, 0x323, 0x2F6, 0x2CB, 0x2A3, 0x27D, - 0x259, 0x238, 0x218, 0x1FA, 0x1DD, 0x1C2, 0x1A9, 0x191, - 0x17B, 0x165, 0x151, 0x13E, 0x12C, 0x11C, 0x10C, 0x0FD, - 0x0EE, 0x0E1, 0x0D4, 0x0C8, 0x0BD, 0x0B2, 0x0A8, 0x09F, - 0x096, 0x08E, 0x086, 0x07E, 0x077, 0x070, 0x06A, 0x064, - 0x05E, 0x059, 0x054, 0x04F, 0x04B, 0x047, 0x043, 0x03F, - 0x03B, 0x038, 0x035, 0x032, 0x02F, 0x02C, 0x02A, 0x027, - 0x025, 0x023, 0x021, 0x01F, 0x01D, 0x01C, 0x01A, 0x019, - 0x017, 0x016, 0x015, 0x013, 0x012, 0x011, 0x010, 0x00F -}; - -const int PCSoundDriver::_noteTableCount = ARRAYSIZE(_noteTable); - -void PCSoundDriver::setUpdateCallback(UpdateCallback upCb, void *ref) { - _upCb = upCb; - _upRef = ref; -} - -void PCSoundDriver::findNote(int freq, int *note, int *oct) const { - *note = _noteTableCount - 1; - for (int i = 0; i < _noteTableCount; ++i) { - if (_noteTable[i] <= freq) { - *note = i; - break; - } - } - - *oct = *note / 12; - *note %= 12; -} - -void PCSoundDriver::resetChannel(int channel) { - stopChannel(channel); - stopAll(); -} - -void PCSoundDriver::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 - _musicVolume = music_mute ? 0 : MIN(255, ConfMan.getInt("music_volume")); - _sfxVolume = sfx_mute ? 0 : MIN(255, ConfMan.getInt("sfx_volume")); -} - -/*--------------------------------------------------------------------------*/ - -const int AdlibDriverBase::_freqTable[] = { - 0x157, 0x16C, 0x181, 0x198, 0x1B1, 0x1CB, - 0x1E6, 0x203, 0x222, 0x243, 0x266, 0x28A -}; - -const int AdlibDriverBase::_freqTableCount = ARRAYSIZE(_freqTable); - -const int AdlibDriverBase::_operatorsTable[] = { - 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21 -}; - -const int AdlibDriverBase::_operatorsTableCount = ARRAYSIZE(_operatorsTable); - -const int AdlibDriverBase::_voiceOperatorsTable[] = { - 0, 3, 1, 4, 2, 5, 6, 9, 7, 10, 8, 11, 12, 15, 16, 16, 14, 14, 17, 17, 13, 13 -}; - -const int AdlibDriverBase::_voiceOperatorsTableCount = ARRAYSIZE(_voiceOperatorsTable); - - -AdlibDriverBase::AdlibDriverBase(Audio::Mixer *mixer) - : _mixer(mixer) { - _sampleRate = _mixer->getOutputRate(); - _opl = makeAdLibOPL(_sampleRate); - - for (int i = 0; i < 5; ++i) { - _channelsVolumeTable[i].original = 0; - _channelsVolumeTable[i].adjusted = 0; - } - memset(_instrumentsTable, 0, sizeof(_instrumentsTable)); - initCard(); - _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); - - _musicVolume = ConfMan.getBool("music_mute") ? 0 : MIN(255, ConfMan.getInt("music_volume")); - _sfxVolume = ConfMan.getBool("sfx_mute") ? 0 : MIN(255, ConfMan.getInt("sfx_volume")); -} - -AdlibDriverBase::~AdlibDriverBase() { - _mixer->stopHandle(_soundHandle); - OPLDestroy(_opl); -} - -void AdlibDriverBase::syncSounds() { - PCSoundDriver::syncSounds(); - - // Force all instruments to reload on the next playing point - for (int i = 0; i < 5; ++i) { - adjustVolume(i, _channelsVolumeTable[i].original); - AdLibSoundInstrument *ins = &_instrumentsTable[i]; - setupInstrument(ins, i); - } -} - -void AdlibDriverBase::adjustVolume(int channel, int volume) { - _channelsVolumeTable[channel].original = volume; - - if (volume > 80) { - volume = 80; - } else if (volume < 0) { - volume = 0; - } - volume += volume / 4; - if (volume > 127) { - volume = 127; - } - - int volAdjust = (channel == 4) ? _sfxVolume : _musicVolume; - volume = (volume * volAdjust) / 128; - - if (volume > 127) - volume = 127; - - _channelsVolumeTable[channel].adjusted = volume; -} - -void AdlibDriverBase::setupChannel(int channel, const byte *data, int instrument, int volume) { - assert(channel < 5); - if (data) { - adjustVolume(channel, volume); - setupInstrument(data, channel); - } -} - -void AdlibDriverBase::stopChannel(int channel) { - assert(channel < 5); - AdLibSoundInstrument *ins = &_instrumentsTable[channel]; - if (ins->mode != 0 && ins->channel == 6) { - channel = 6; - } - if (ins->mode == 0 || channel == 6) { - OPLWriteReg(_opl, 0xB0 | channel, 0); - } - if (ins->mode != 0) { - _vibrato &= ~(1 << (10 - ins->channel)); - OPLWriteReg(_opl, 0xBD, _vibrato); - } -} - -void AdlibDriverBase::stopAll() { - int i; - for (i = 0; i < 18; ++i) { - OPLWriteReg(_opl, 0x40 | _operatorsTable[i], 63); - } - for (i = 0; i < 9; ++i) { - OPLWriteReg(_opl, 0xB0 | i, 0); - } - OPLWriteReg(_opl, 0xBD, 0); -} - -int AdlibDriverBase::readBuffer(int16 *buffer, const int numSamples) { - update(buffer, numSamples); - return numSamples; -} - -void AdlibDriverBase::initCard() { - _vibrato = 0x20; - OPLWriteReg(_opl, 0xBD, _vibrato); - OPLWriteReg(_opl, 0x08, 0x40); - - static const int oplRegs[] = { 0x40, 0x60, 0x80, 0x20, 0xE0 }; - - for (int i = 0; i < 9; ++i) { - OPLWriteReg(_opl, 0xB0 | i, 0); - } - for (int i = 0; i < 9; ++i) { - OPLWriteReg(_opl, 0xC0 | i, 0); - } - - for (int j = 0; j < 5; j++) { - for (int i = 0; i < 18; ++i) { - OPLWriteReg(_opl, oplRegs[j] | _operatorsTable[i], 0); - } - } - - OPLWriteReg(_opl, 1, 0x20); - OPLWriteReg(_opl, 1, 0); -} - -void AdlibDriverBase::update(int16 *buf, int len) { - static int samplesLeft = 0; - while (len != 0) { - int count = samplesLeft; - if (count > len) { - count = len; - } - samplesLeft -= count; - len -= count; - YM3812UpdateOne(_opl, buf, count); - if (samplesLeft == 0) { - if (_upCb) { - (*_upCb)(_upRef); - } - samplesLeft = _sampleRate / 50; - } - buf += count; - } -} - -void AdlibDriverBase::setupInstrument(const byte *data, int channel) { - AdLibSoundInstrument *ins = &_instrumentsTable[channel]; - loadInstrument(data, ins); - - setupInstrument(ins, channel); -} - -void AdlibDriverBase::setupInstrument(const AdLibSoundInstrument *ins, int channel) { - int mod, car, tmp; - const AdLibRegisterSoundInstrument *reg; - - if (ins->mode != 0) { - mod = _operatorsTable[_voiceOperatorsTable[2 * ins->channel + 0]]; - car = _operatorsTable[_voiceOperatorsTable[2 * ins->channel + 1]]; - } else { - mod = _operatorsTable[_voiceOperatorsTable[2 * channel + 0]]; - car = _operatorsTable[_voiceOperatorsTable[2 * channel + 1]]; - } - - if (ins->mode == 0 || ins->channel == 6) { - reg = &ins->regMod; - OPLWriteReg(_opl, 0x20 | mod, reg->vibrato); - if (reg->freqMod) { - tmp = reg->outputLevel & 0x3F; - } else { - tmp = (63 - (reg->outputLevel & 0x3F)) * _channelsVolumeTable[channel].adjusted; - tmp = 63 - (2 * tmp + 127) / (2 * 127); - } - OPLWriteReg(_opl, 0x40 | mod, tmp | (reg->keyScaling << 6)); - OPLWriteReg(_opl, 0x60 | mod, reg->attackDecay); - OPLWriteReg(_opl, 0x80 | mod, reg->sustainRelease); - if (ins->mode != 0) { - OPLWriteReg(_opl, 0xC0 | ins->channel, reg->feedbackStrength); - } else { - OPLWriteReg(_opl, 0xC0 | channel, reg->feedbackStrength); - } - OPLWriteReg(_opl, 0xE0 | mod, ins->waveSelectMod); - } - - reg = &ins->regCar; - OPLWriteReg(_opl, 0x20 | car, reg->vibrato); - tmp = (63 - (reg->outputLevel & 0x3F)) * _channelsVolumeTable[channel].adjusted; - tmp = 63 - (2 * tmp + 127) / (2 * 127); - OPLWriteReg(_opl, 0x40 | car, tmp | (reg->keyScaling << 6)); - OPLWriteReg(_opl, 0x60 | car, reg->attackDecay); - OPLWriteReg(_opl, 0x80 | car, reg->sustainRelease); - OPLWriteReg(_opl, 0xE0 | car, ins->waveSelectCar); -} - -void AdlibDriverBase::loadRegisterInstrument(const byte *data, AdLibRegisterSoundInstrument *reg) { - reg->vibrato = 0; - if (READ_LE_UINT16(data + 18)) { // amplitude vibrato - reg->vibrato |= 0x80; - } - if (READ_LE_UINT16(data + 20)) { // frequency vibrato - reg->vibrato |= 0x40; - } - if (READ_LE_UINT16(data + 10)) { // sustaining sound - reg->vibrato |= 0x20; - } - if (READ_LE_UINT16(data + 22)) { // envelope scaling - reg->vibrato |= 0x10; - } - reg->vibrato |= READ_LE_UINT16(data + 2) & 0xF; // frequency multiplier - - reg->attackDecay = READ_LE_UINT16(data + 6) << 4; // attack rate - reg->attackDecay |= READ_LE_UINT16(data + 12) & 0xF; // decay rate - - reg->sustainRelease = READ_LE_UINT16(data + 8) << 4; // sustain level - reg->sustainRelease |= READ_LE_UINT16(data + 14) & 0xF; // release rate - - reg->feedbackStrength = READ_LE_UINT16(data + 4) << 1; // feedback - if (READ_LE_UINT16(data + 24) == 0) { // frequency modulation - reg->feedbackStrength |= 1; - } - - reg->keyScaling = READ_LE_UINT16(data); - reg->outputLevel = READ_LE_UINT16(data + 16); - reg->freqMod = READ_LE_UINT16(data + 24); -} - -/*--------------------------------------------------------------------------*/ - -void AdlibSoundDriverADL::loadInstrument(const byte *data, AdLibSoundInstrument *asi) { - asi->mode = *data++; - asi->channel = *data++; - asi->waveSelectMod = *data++ & 3; - asi->waveSelectCar = *data++ & 3; - asi->amDepth = *data++; - ++data; - loadRegisterInstrument(data, &asi->regMod); data += 26; - loadRegisterInstrument(data, &asi->regCar); data += 26; -} - -void AdlibSoundDriverADL::setChannelFrequency(int channel, int frequency) { - assert(channel < 5); - AdLibSoundInstrument *ins = &_instrumentsTable[channel]; - if (ins->mode != 0) { - channel = ins->channel; - if (channel == 9) { - channel = 8; - } else if (channel == 10) { - channel = 7; - } - } - int freq, note, oct; - findNote(frequency, ¬e, &oct); - - note += oct * 12; - if (ins->amDepth) { - note = ins->amDepth; - } - if (note < 0) { - note = 0; - } - - freq = _freqTable[note % 12]; - OPLWriteReg(_opl, 0xA0 | channel, freq); - freq = ((note / 12) << 2) | ((freq & 0x300) >> 8); - if (ins->mode == 0) { - freq |= 0x20; - } - OPLWriteReg(_opl, 0xB0 | channel, freq); - if (ins->mode != 0) { - _vibrato |= 1 << (10 - channel); - OPLWriteReg(_opl, 0xBD, _vibrato); - } -} - -void AdlibSoundDriverADL::playSample(const byte *data, int size, int channel, int volume) { - adjustVolume(channel, 127); - - setupInstrument(data, channel); - AdLibSoundInstrument *ins = &_instrumentsTable[channel]; - if (ins->mode != 0 && ins->channel == 6) { - OPLWriteReg(_opl, 0xB0 | channel, 0); - } - if (ins->mode != 0) { - _vibrato &= ~(1 << (10 - ins->channel)); - OPLWriteReg(_opl, 0xBD, _vibrato); - } - if (ins->mode != 0) { - channel = ins->channel; - if (channel == 9) { - channel = 8; - } else if (channel == 10) { - channel = 7; - } - } - uint16 note = 48; - if (ins->amDepth) { - note = ins->amDepth; - } - int freq = _freqTable[note % 12]; - OPLWriteReg(_opl, 0xA0 | channel, freq); - freq = ((note / 12) << 2) | ((freq & 0x300) >> 8); - if (ins->mode == 0) { - freq |= 0x20; - } - OPLWriteReg(_opl, 0xB0 | channel, freq); - if (ins->mode != 0) { - _vibrato |= 1 << (10 - channel); - OPLWriteReg(_opl, 0xBD, _vibrato); - } -} - -/*--------------------------------------------------------------------------*/ - -PCSoundFxPlayer::PCSoundFxPlayer(PCSoundDriver *driver) - : _playing(false), _songPlayed(false), _driver(driver) { - memset(_instrumentsData, 0, sizeof(_instrumentsData)); - _sfxData = NULL; - _fadeOutCounter = 0; - _driver->setUpdateCallback(updateCallback, this); -} - -PCSoundFxPlayer::~PCSoundFxPlayer() { - _driver->setUpdateCallback(NULL, NULL); - stop(); -} - -bool PCSoundFxPlayer::load(const char *song) { - /* - debug(9, "PCSoundFxPlayer::load('%s')", song); - - // stop (w/ fade out) the previous song - while (_fadeOutCounter != 0 && _fadeOutCounter < 100) { - g_system->delayMillis(50); - } - _fadeOutCounter = 0; - - if (_playing) { - stop(); - } - - strcpy(_musicName, song); - _songPlayed = false; - _looping = false; - _sfxData = readBundleSoundFile(song); - if (!_sfxData) { - warning("Unable to load soundfx module '%s'", song); - return 0; - } - - for (int i = 0; i < NUM_INSTRUMENTS; ++i) { - _instrumentsData[i] = NULL; - - char instrument[64]; - memset(instrument, 0, 64); // Clear the data first - memcpy(instrument, _sfxData + 20 + i * 30, 12); - instrument[63] = '\0'; - - if (strlen(instrument) != 0) { - char *dot = strrchr(instrument, '.'); - if (dot) { - *dot = '\0'; - } - strcat(instrument, _driver->getInstrumentExtension()); - _instrumentsData[i] = readBundleSoundFile(instrument); - if (!_instrumentsData[i]) { - warning("Unable to load soundfx instrument '%s'", instrument); - } - } - } - */ - return 1; -} - -void PCSoundFxPlayer::play() { - debug(9, "PCSoundFxPlayer::play()"); - if (_sfxData) { - for (int i = 0; i < NUM_CHANNELS; ++i) { - _instrumentsChannelTable[i] = -1; - } - _currentPos = 0; - _currentOrder = 0; -// _numOrders = _sfxData[470]; - _eventsDelay = 5; // TODO: What to do with this? - _updateTicksCounter = 0; - _playing = true; - } -} - -void PCSoundFxPlayer::stop() { - if (_playing || _fadeOutCounter != 0) { - _fadeOutCounter = 0; - _playing = false; - for (int i = 0; i < NUM_CHANNELS; ++i) { - _driver->stopChannel(i); - } - _driver->stopAll(); - } - unload(); -} - -void PCSoundFxPlayer::fadeOut() { - if (_playing) { - _fadeOutCounter = 1; - _playing = false; - } -} - -void PCSoundFxPlayer::updateCallback(void *ref) { - ((PCSoundFxPlayer *)ref)->update(); -} - -void PCSoundFxPlayer::update() { - if (_playing || (_fadeOutCounter != 0 && _fadeOutCounter < 100)) { - ++_updateTicksCounter; - if (_updateTicksCounter > _eventsDelay) { - handleEvents(); - _updateTicksCounter = 0; - } - } -} - -void PCSoundFxPlayer::handleEvents() { - const byte *patternData = _sfxData + 600 + 1800; - const byte *orderTable = _sfxData + 472; - uint16 patternNum = orderTable[_currentOrder] * 1024; - - for (int i = 0; i < 4; ++i) { - handlePattern(i, patternData + patternNum + _currentPos); - patternData += 4; - } - - if (_fadeOutCounter != 0 && _fadeOutCounter < 100) { - _fadeOutCounter += 2; - } - if (_fadeOutCounter >= 100) { - stop(); - return; - } - - _currentPos += 16; - if (_currentPos >= 1024) { - _currentPos = 0; - ++_currentOrder; - if (_currentOrder == _numOrders) { - _currentOrder = 0; - } - } - debug(7, "_currentOrder=%d/%d _currentPos=%d", _currentOrder, _numOrders, _currentPos); -} - -void PCSoundFxPlayer::handlePattern(int channel, const byte *patternData) { - int instrument = patternData[2] >> 4; - if (instrument != 0) { - --instrument; - if (_instrumentsChannelTable[channel] != instrument || _fadeOutCounter != 0) { - _instrumentsChannelTable[channel] = instrument; - const int volume = _sfxData[instrument] - _fadeOutCounter; - _driver->setupChannel(channel, _instrumentsData[instrument], instrument, volume); - } - } - int16 freq = (int16)READ_BE_UINT16(patternData); - if (freq > 0) { - _driver->stopChannel(channel); - _driver->setChannelFrequency(channel, freq); - } -} - -void PCSoundFxPlayer::unload() { - for (int i = 0; i < NUM_INSTRUMENTS; ++i) { - free(_instrumentsData[i]); - _instrumentsData[i] = NULL; - } - free(_sfxData); - _sfxData = NULL; - _songPlayed = true; -} - -void PCSoundFxPlayer::doSync(Common::Serializer &s) { - s.syncBytes((byte *)_musicName, 33); - uint16 v = (uint16)songLoaded(); - s.syncAsSint16LE(v); - - if (s.isLoading() && v) { - load(_musicName); - - for (int i = 0; i < NUM_CHANNELS; ++i) { - _instrumentsChannelTable[i] = -1; - } - - _numOrders = _sfxData[470]; - _eventsDelay = (244 - _sfxData[471]) * 100 / 1060; - _updateTicksCounter = 0; - } - - s.syncAsSint16LE(_songPlayed); - s.syncAsSint16LE(_looping); - s.syncAsSint16LE(_currentPos); - s.syncAsSint16LE(_currentOrder); - s.syncAsSint16LE(_playing); -} - -/*--------------------------------------------------------------------------*/ - const byte adlib_group_data[] = { 1, 1, 9, 1, 0xff }; AdlibSoundDriver::AdlibSoundDriver() { @@ -1743,8 +1133,6 @@ AdlibSoundDriver::AdlibSoundDriver() { _groupData.pData = &adlib_group_data[0]; _mixer = _vm->_mixer; - _soundDriver = new AdlibSoundDriverADL(_mixer); - _player = new PCSoundFxPlayer(_soundDriver); } } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 7ad4da5755..e0c550562c 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -44,7 +44,7 @@ struct trackInfoStruct { int _rlbList[SOUND_ARR_SIZE]; int _arr2[SOUND_ARR_SIZE]; byte *_channelData[SOUND_ARR_SIZE]; - int field82[SOUND_ARR_SIZE]; + int _channelNum[SOUND_ARR_SIZE]; int field92[SOUND_ARR_SIZE]; int fielda2[SOUND_ARR_SIZE]; int fieldb2[SOUND_ARR_SIZE]; @@ -341,184 +341,16 @@ public: void release() { _sound.release(); } }; -/*-------------------------------------------------------------------------- - * Adlib related classes - *-------------------------------------------------------------------------- - */ - -struct AdLibRegisterSoundInstrument { - uint8 vibrato; - uint8 attackDecay; - uint8 sustainRelease; - uint8 feedbackStrength; - uint8 keyScaling; - uint8 outputLevel; - uint8 freqMod; -}; - -struct AdLibSoundInstrument { - byte mode; - byte channel; - AdLibRegisterSoundInstrument regMod; - AdLibRegisterSoundInstrument regCar; - byte waveSelectMod; - byte waveSelectCar; - byte amDepth; -}; - -struct VolumeEntry { - int original; - int adjusted; -}; - -class PCSoundDriver { -public: - typedef void (*UpdateCallback)(void *); - - PCSoundDriver() { _upCb = NULL, _upRef = NULL, _musicVolume = 0, _sfxVolume = 0; } - virtual ~PCSoundDriver() {} - - virtual void setupChannel(int channel, const byte *data, int instrument, int volume) = 0; - virtual void setChannelFrequency(int channel, int frequency) = 0; - virtual void stopChannel(int channel) = 0; - virtual void playSample(const byte *data, int size, int channel, int volume) = 0; - virtual void stopAll() = 0; - virtual const char *getInstrumentExtension() const { return ""; } - virtual void syncSounds(); - - void setUpdateCallback(UpdateCallback upCb, void *ref); - void resetChannel(int channel); - void findNote(int freq, int *note, int *oct) const; -protected: - UpdateCallback _upCb; - void *_upRef; - uint8 _musicVolume; - uint8 _sfxVolume; - - static const int _noteTable[]; - static const int _noteTableCount; -}; - -class AdlibDriverBase : public PCSoundDriver, Audio::AudioStream { -public: - AdlibDriverBase(Audio::Mixer *mixer); - virtual ~AdlibDriverBase(); - - // PCSoundDriver interface - virtual void setupChannel(int channel, const byte *data, int instrument, int volume); - virtual void stopChannel(int channel); - virtual void stopAll(); - - // AudioStream interface - virtual int readBuffer(int16 *buffer, const int numSamples); - virtual bool isStereo() const { return false; } - virtual bool endOfData() const { return false; } - virtual int getRate() const { return _sampleRate; } - - void initCard(); - void update(int16 *buf, int len); - void setupInstrument(const byte *data, int channel); - void setupInstrument(const AdLibSoundInstrument *ins, int channel); - void loadRegisterInstrument(const byte *data, AdLibRegisterSoundInstrument *reg); - virtual void loadInstrument(const byte *data, AdLibSoundInstrument *asi) = 0; - virtual void syncSounds(); - - void adjustVolume(int channel, int volume); - -protected: - FM_OPL *_opl; - int _sampleRate; - Audio::Mixer *_mixer; - Audio::SoundHandle _soundHandle; - - byte _vibrato; - VolumeEntry _channelsVolumeTable[10]; - AdLibSoundInstrument _instrumentsTable[10]; - - static const int _freqTable[]; - static const int _freqTableCount; - static const int _operatorsTable[]; - static const int _operatorsTableCount; - static const int _voiceOperatorsTable[]; - static const int _voiceOperatorsTableCount; -}; - -class AdlibSoundDriverADL : public AdlibDriverBase { -public: - AdlibSoundDriverADL(Audio::Mixer *mixer) : AdlibDriverBase(mixer) {} - virtual const char *getInstrumentExtension() const { return ".ADL"; } - virtual void loadInstrument(const byte *data, AdLibSoundInstrument *asi); - virtual void setChannelFrequency(int channel, int frequency); - virtual void playSample(const byte *data, int size, int channel, int volume); -}; - -class PCSoundFxPlayer { -private: - enum { - NUM_INSTRUMENTS = 15, - NUM_CHANNELS = 4 - }; - - void update(); - void handleEvents(); - void handlePattern(int channel, const byte *patternData); - - char _musicName[33]; - bool _playing; - bool _songPlayed; - int _currentPos; - int _currentOrder; - int _numOrders; - int _eventsDelay; - bool _looping; - int _fadeOutCounter; - int _updateTicksCounter; - int _instrumentsChannelTable[NUM_CHANNELS]; - byte *_sfxData; - byte *_instrumentsData[NUM_INSTRUMENTS]; - PCSoundDriver *_driver; - -public: - PCSoundFxPlayer(PCSoundDriver *driver); - ~PCSoundFxPlayer(); - - bool load(const char *song); - void play(); - void stop(); - void unload(); - void fadeOut(); - void doSync(Common::Serializer &s); - - static void updateCallback(void *ref); - - bool songLoaded() const { return _sfxData != NULL; } - bool songPlayed() const { return _songPlayed; } - bool playing() const { return _playing; } - uint8 numOrders() const { assert(_sfxData); return _sfxData[470]; } - void setNumOrders(uint8 v) { assert(_sfxData); _sfxData[470] = v; } - void setPattern(int offset, uint8 value) { assert(_sfxData); _sfxData[472 + offset] = value; } - const char *musicName() { return _musicName; } - - // Note: Original game never actually uses looping variable. Songs are hardcoded to loop - bool looping() const { return _looping; } - void setLooping(bool v) { _looping = v; } -}; - class AdlibSoundDriver: public SoundDriver { private: GroupData _groupData; Audio::Mixer *_mixer; - PCSoundDriver *_soundDriver; - PCSoundFxPlayer *_player; public: AdlibSoundDriver(); virtual void setVolume(int volume) {} virtual void installPatchBank(const byte *data) {} virtual const GroupData *getGroupData() { return &_groupData; } - virtual void play(const byte *data, int size, int channel, int volume) { - _soundDriver->playSample(data, size, channel, volume); - } }; } // End of namespace tSage -- cgit v1.2.3 From 239e9886d682fd9bd83f09d4b16686d2dea08824 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 5 Jun 2011 09:16:56 +1000 Subject: TSAGE: Renamed Sound class fields to match Protostar debug info --- engines/tsage/sound.cpp | 188 ++++++++++++++++++++++++------------------------ engines/tsage/sound.h | 92 ++++++++++++------------ 2 files changed, 140 insertions(+), 140 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index e3d746ecd6..8456321bd8 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -90,7 +90,7 @@ void SoundManager::dispatch() { ++i; // If the sound is flagged for stopping, then stop it - if (sound->_stopFlag) { + if (sound->_stoppedAsynchronously) { sound->stop(); } } @@ -446,7 +446,7 @@ int SoundManager::_sfDetermineGroup(const byte *soundData) { void SoundManager::_sfAddToPlayList(Sound *sound) { ++sfManager()._suspendCtr; _sfDoAddToPlayList(sound); - sound->_stopFlag = false; + sound->_stoppedAsynchronously = false; _sfRethinkVoiceTypes(); --sfManager()._suspendCtr; } @@ -603,7 +603,7 @@ void SoundManager::_sfDereferenceAll() { void SoundManager::_sfUpdatePriority(Sound *sound) { ++_soundManager->_suspendCtr; - int tempPriority = (sound->_priority2 == 255) ? sound->_soundPriority : sound->_priority; + int tempPriority = (sound->_fixedPriority == 255) ? sound->_sndResPriority : sound->_priority; if (sound->_priority != tempPriority) { sound->_priority = tempPriority; if (_sfDoRemoveFromPlayList(sound)) { @@ -616,10 +616,10 @@ void SoundManager::_sfUpdatePriority(Sound *sound) { } void SoundManager::_sfUpdateLoop(Sound *sound) { - if (sound->_loopFlag2) - sound->_loopFlag = sound->_loop; + if (sound->_fixedLoop) + sound->_loop = sound->_sndResLoop; else - sound->_loopFlag = sound->_loopFlag2; + sound->_loop = sound->_fixedLoop; } void SoundManager::_sfSetMasterVol(int volume) { @@ -637,7 +637,7 @@ void SoundManager::_sfSetMasterVol(int volume) { } void SoundManager::_sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum) { - trackInfo->_count = 0; + trackInfo->_numTracks = 0; const byte *p = soundData + READ_LE_UINT16(soundData + 8); uint32 v; @@ -648,14 +648,14 @@ void SoundManager::_sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *s p += 6; for (int idx = 0; idx < count; ++idx) { - if (trackInfo->_count == 16) { - trackInfo->_count = -1; + if (trackInfo->_numTracks == 16) { + trackInfo->_numTracks = -1; return; } - trackInfo->_rlbList[trackInfo->_count] = READ_LE_UINT16(p); - trackInfo->_arr2[trackInfo->_count] = READ_LE_UINT16(p + 2); - ++trackInfo->_count; + trackInfo->_chunks[trackInfo->_numTracks] = READ_LE_UINT16(p); + trackInfo->_voiceTypes[trackInfo->_numTracks] = READ_LE_UINT16(p + 2); + ++trackInfo->_numTracks; p += 4; } } else { @@ -753,12 +753,12 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { if (vs->_voiceType == VOICETYPE_0) { if (!vse._field4 && !vse._field6) { - int vol = sound->_volume * sound->_field48[vse._field8] / 127; + int vol = sound->_volume * sound->_chVolume[vse._field8] / 127; driver->setVolume0(voiceIndex, vse._field0, 7, vol); } } else { if (!vse._field8 && !vse._fieldA) { - int vol = sound->_volume * sound->_field48[vse._fieldC] / 127; + int vol = sound->_volume * sound->_chVolume[vse._fieldC] / 127; driver->setVolume1(voiceIndex, vse._field0, 7, vol); } } @@ -771,31 +771,31 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { /*--------------------------------------------------------------------------*/ Sound::Sound() { - _stopFlag = false; - _soundNum = 0; - _groupNum = 0; - _soundPriority = 0; - _priority2 = -1; - _loop = true; - _loopFlag2 = true; + _stoppedAsynchronously = false; + _soundResID = 0; + _group = 0; + _sndResPriority = 0; + _fixedPriority = -1; + _sndResLoop = true; + _fixedLoop = true; _priority = 0; _volume = 127; - _loopFlag = false; - _pauseCtr = 0; - _muteCtr = 0; - _holdAt = 0xff; + _loop = false; + _pausedCount = 0; + _mutedCount = 0; + _hold = 0xff; _cueValue = -1; - _volume1 = -1; - _volume3 = 0; - _volume2 = 0; - _volume5 = 0; - _volume4 = 0; - _timeIndex = 0; - _field26 = 0; - _trackInfo._count = 0; + _fadeDest = -1; + _fadeSteps = 0; + _fadeTicks = 0; + _fadeCounter = 0; + _stopAfterFadeFlag = false; + _timer = 0; + _loopTimer = 0; + _trackInfo._numTracks = 0; _primed = false; _isEmpty = false; - _field26E = NULL; + _remoteReceiver = NULL; } Sound::~Sound() { @@ -812,10 +812,10 @@ void Sound::stop() { _unPrime(); } -void Sound::prime(int soundNum) { - if (_soundNum != -1) { +void Sound::prime(int soundResID) { + if (_soundResID != -1) { stop(); - _prime(soundNum, false); + _prime(soundResID, false); } } @@ -823,35 +823,35 @@ void Sound::unPrime() { stop(); } -void Sound::_prime(int soundNum, bool queFlag) { +void Sound::_prime(int soundResID, bool queFlag) { if (_primed) unPrime(); - if (_soundNum != -1) { + if (_soundResID != -1) { // Sound number specified _isEmpty = false; - _field26E = NULL; - byte *soundData = _resourceManager->getResource(RES_SOUND, soundNum, 0); + _remoteReceiver = NULL; + byte *soundData = _resourceManager->getResource(RES_SOUND, soundResID, 0); _soundManager->checkResVersion(soundData); - _groupNum = _soundManager->determineGroup(soundData); - _soundPriority = _soundManager->extractPriority(soundData); - _loop = _soundManager->extractLoop(soundData); - _soundManager->extractTrackInfo(&_trackInfo, soundData, _groupNum); + _group = _soundManager->determineGroup(soundData); + _sndResPriority = _soundManager->extractPriority(soundData); + _sndResLoop = _soundManager->extractLoop(soundData); + _soundManager->extractTrackInfo(&_trackInfo, soundData, _group); - for (int idx = 0; idx < _trackInfo._count; ++idx) { - _trackInfo._channelData[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo._rlbList[idx]); + 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; - _groupNum = 0; - _soundPriority = 0; - _loop = 0; - _trackInfo._count = 0; - _trackInfo._channelData[0] = ALLOCATE(200); - _field26E = ALLOCATE(200); + _group = 0; + _sndResPriority = 0; + _sndResLoop = 0; + _trackInfo._numTracks = 0; + _channelData[0] = ALLOCATE(200); + _remoteReceiver = ALLOCATE(200); } if (queFlag) @@ -863,20 +863,20 @@ void Sound::_prime(int soundNum, bool queFlag) { void Sound::_unPrime() { if (_primed) { if (_isEmpty) { - DEALLOCATE(_trackInfo._channelData[0]); - DEALLOCATE(_field26E); - _field26E = NULL; + DEALLOCATE(_channelData[0]); + DEALLOCATE(_remoteReceiver); + _remoteReceiver = NULL; } else { - for (int idx = 0; idx < _trackInfo._count; ++idx) { - DEALLOCATE(_trackInfo._channelData[idx]); + for (int idx = 0; idx < _trackInfo._numTracks; ++idx) { + DEALLOCATE(_channelData[idx]); } } - _trackInfo._count = 0; + _trackInfo._numTracks = 0; _soundManager->removeFromSoundList(this); _primed = false; - _stopFlag = false; + _stoppedAsynchronously = false; } } @@ -884,12 +884,12 @@ void Sound::orientAfterDriverChange() { if (!_isEmpty) { int timeIndex = getTimeIndex(); - for (int idx = 0; idx < _trackInfo._count; ++idx) - DEALLOCATE(_trackInfo._channelData[idx]); + for (int idx = 0; idx < _trackInfo._numTracks; ++idx) + DEALLOCATE(_channelData[idx]); - _trackInfo._count = 0; + _trackInfo._numTracks = 0; _primed = false; - _prime(_soundNum, true); + _prime(_soundResID, true); setTimeIndex(timeIndex); } } @@ -898,7 +898,7 @@ void Sound::orientAfterRestore() { if (_isEmpty) { int timeIndex = getTimeIndex(); _primed = false; - _prime(_soundNum, true); + _prime(_soundResID, true); setTimeIndex(timeIndex); } } @@ -915,7 +915,7 @@ void Sound::halt(void) { } int Sound::getSoundNum() const { - return _soundNum; + return _soundResID; } bool Sound::isPlaying() { @@ -927,20 +927,20 @@ bool Sound::isPrimed() const { } bool Sound::isPaused() const { - return _pauseCtr != 0; + return _pausedCount != 0; } bool Sound::isMuted() const { - return _muteCtr != 0; + return _mutedCount != 0; } void Sound::pause(bool flag) { _soundManager->suspendSoundServer(); if (flag) - ++_pauseCtr; - else if (_pauseCtr > 0) - --_pauseCtr; + ++_pausedCount; + else if (_pausedCount > 0) + --_pausedCount; _soundManager->rethinkVoiceTypes(); _soundManager->restartSoundServer(); @@ -950,29 +950,29 @@ void Sound::mute(bool flag) { _soundManager->suspendSoundServer(); if (flag) - ++_muteCtr; - else if (_muteCtr > 0) - --_muteCtr; + ++_mutedCount; + else if (_mutedCount > 0) + --_mutedCount; _soundManager->rethinkVoiceTypes(); _soundManager->restartSoundServer(); } -void Sound::fade(int volume1, int volume2, int volume3, int volume4) { +void Sound::fade(int fadeDest, int fadeTicks, int fadeSteps, bool stopAfterFadeFlag) { _soundManager->suspendSoundServer(); - if (volume1 > 127) - volume1 = 127; - if (volume2 > 127) - volume2 = 127; - if (volume3 > 255) - volume3 = 255; + if (fadeDest > 127) + fadeDest = 127; + if (fadeTicks > 127) + fadeTicks = 127; + if (fadeSteps > 255) + fadeSteps = 255; - _volume1 = volume1; - _volume2 = volume2; - _volume3 = volume3; - _volume5 = 0; - _volume4 = volume4; + _fadeDest = fadeDest; + _fadeTicks = fadeTicks; + _fadeSteps = fadeSteps; + _fadeCounter = 0; + _stopAfterFadeFlag = stopAfterFadeFlag; _soundManager->restartSoundServer(); } @@ -986,7 +986,7 @@ void Sound::setTimeIndex(uint32 timeIndex) { } uint32 Sound::getTimeIndex() const { - return _timeIndex; + return _timer; } int Sound::getCueValue() const { @@ -1015,12 +1015,12 @@ int Sound::getVol() const { void Sound::setPri(int priority) { if (priority > 127) priority = 127; - _priority2 = priority; + _fixedPriority = priority; _soundManager->updateSoundPri(this); } void Sound::setLoop(bool flag) { - _loopFlag2 = flag; + _fixedLoop = flag; _soundManager->updateSoundLoop(this); } @@ -1029,17 +1029,17 @@ int Sound::getPri() const { } bool Sound::getLoop() { - return _loopFlag; + return _loop; } void Sound::holdAt(int amount) { if (amount > 127) amount = 127; - _holdAt = amount; + _hold = amount; } void Sound::release() { - _holdAt = -1; + _hold = -1; } /*--------------------------------------------------------------------------*/ @@ -1092,10 +1092,10 @@ void ASound::stop() { _action = NULL; } -void ASound::prime(int soundNum, Action *action) { +void ASound::prime(int soundResID, Action *action) { _action = action; _cueValue = 0; - _sound.prime(soundNum); + _sound.prime(soundResID); } void ASound::unPrime() { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index e0c550562c..9f7ea34e93 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -40,18 +40,9 @@ class Sound; #define ADLIB_DRIVER_NUM 3 struct trackInfoStruct { - int _count; - int _rlbList[SOUND_ARR_SIZE]; - int _arr2[SOUND_ARR_SIZE]; - byte *_channelData[SOUND_ARR_SIZE]; - int _channelNum[SOUND_ARR_SIZE]; - int field92[SOUND_ARR_SIZE]; - int fielda2[SOUND_ARR_SIZE]; - int fieldb2[SOUND_ARR_SIZE]; - int fieldf2[SOUND_ARR_SIZE]; - int field132[SOUND_ARR_SIZE]; - int field152[SOUND_ARR_SIZE]; - + int _numTracks; + int _chunks[SOUND_ARR_SIZE]; + int _voiceTypes[SOUND_ARR_SIZE]; }; enum SoundDriverStatus {SNDSTATUS_FAILED = 0, SNDSTATUS_DETECTED = 1, SNDSTATUS_SKIPPED = 2}; @@ -229,54 +220,63 @@ public: class Sound: public EventHandler { private: - void _prime(int soundNum, bool queFlag); + void _prime(int soundResID, bool queFlag); void _unPrime(); void orientAfterRestore(); public: int _field0; - bool _stopFlag; - int _soundNum; - int _groupNum; - int _soundPriority; - int _priority2; - int _loop; - bool _loopFlag2; + bool _stoppedAsynchronously; + int _soundResID; + int _group; + int _sndResPriority; + int _fixedPriority; + int _sndResLoop; + bool _fixedLoop; int _priority; int _volume; - bool _loopFlag; - int _pauseCtr; - int _muteCtr; - int _holdAt; + bool _loop; + int _pausedCount; + int _mutedCount; + int _hold; int _cueValue; - int _volume1; - int _volume3; - int _volume2; - int _volume5; - int _volume4; - uint _timeIndex; - int _field26; - int _field28[SOUND_ARR_SIZE]; - int _field38[SOUND_ARR_SIZE]; - int _field48[SOUND_ARR_SIZE]; - int _field58[SOUND_ARR_SIZE]; - int _field68[SOUND_ARR_SIZE]; - int _field78[SOUND_ARR_SIZE]; - int _voiceStructIndex[SOUND_ARR_SIZE]; - int _fieldA8[SOUND_ARR_SIZE]; - int _fieldB8[SOUND_ARR_SIZE]; - int _fieldC8[SOUND_ARR_SIZE]; - int _fieldE8[SOUND_ARR_SIZE]; + 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]; + int _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 *_field26E; + byte *_remoteReceiver; public: Sound(); ~Sound(); - void play(int soundNum); + void play(int soundResID); void stop(); - void prime(int soundNum); + void prime(int soundResID); void unPrime(); void go(); void halt(void); @@ -287,7 +287,7 @@ public: bool isMuted() const; void pause(bool flag); void mute(bool flag); - void fade(int volume1, int volume2, int volume3, int v4); + void fade(int fadeDest, int fadeTicks, int fadeSteps, bool stopAfterFadeFlag); void setTimeIndex(uint32 timeIndex); uint32 getTimeIndex() const; int getCueValue() const; -- cgit v1.2.3 From ce7c00f509346bdecffac5f4e84a9c27ff45d8d1 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 5 Jun 2011 09:44:48 +1000 Subject: TSAGE: Changed SoundManager fields to match Protostar debug info --- engines/tsage/sound.cpp | 91 +++++++++++++++++++++++-------------------------- engines/tsage/sound.h | 20 +++++------ 2 files changed, 51 insertions(+), 60 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 8456321bd8..64ac602be7 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -36,21 +36,16 @@ static SoundManager *_soundManager = NULL; SoundManager::SoundManager() { _soundManager = this; __sndmgrReady = false; - _minVersion = 0x102; - _maxVersion = 0x10A; + _ourSndResVersion = 0x102; + _ourDrvResVersion = 0x10A; - for (int i = 0; i < SOUND_ARR_SIZE; ++i) { - _field89[i] = 0; - _groupList[i] = 0; - _fieldE9[i] = 0; - _field109[i] = 0; + for (int i = 0; i < SOUND_ARR_SIZE; ++i) _voiceStructPtrs[i] = NULL; - } - _groupMask = 0; - _volume = 127; - _suspendCtr = 0; - _disableCtr = 0; + _groupsAvail = 0; + _masterVol = 127; + _serverSuspendedCount = 0; + _serverDisabledCount = 0; _suspendedCount = 0; _driversDetected = false; _needToRethink = false; @@ -151,21 +146,21 @@ void SoundManager::dumpDriverList() { } void SoundManager::disableSoundServer() { - ++_disableCtr; + ++_serverDisabledCount; } void SoundManager::enableSoundServer() { - if (_disableCtr > 0) - --_disableCtr; + if (_serverDisabledCount > 0) + --_serverDisabledCount; } void SoundManager::suspendSoundServer() { - ++_suspendCtr; + ++_serverSuspendedCount; } void SoundManager::restartSoundServer() { - if (_suspendCtr > 0) - --_suspendCtr; + if (_serverSuspendedCount > 0) + --_serverSuspendedCount; } /** @@ -181,7 +176,7 @@ void SoundManager::installDriver(int driverNum) { if (!driver) return; - assert((_maxVersion >= driver->_minVersion) && (_maxVersion <= driver->_maxVersion)); + assert((_ourDrvResVersion >= driver->_minVersion) && (_ourDrvResVersion <= driver->_maxVersion)); // Mute any loaded sounds disableSoundServer(); @@ -230,7 +225,7 @@ SoundDriver *SoundManager::instantiateDriver(int driverNum) { void SoundManager::unInstallDriver(int driverNum) { Common::List::const_iterator i; for (i = _installedDrivers.begin(); i != _installedDrivers.end(); ++i) { - if ((*i)->_driverNum == driverNum) { + if ((*i)->_driverResID == driverNum) { // Found driver to remove // Mute any loaded sounds @@ -260,7 +255,7 @@ void SoundManager::unInstallDriver(int driverNum) { bool SoundManager::isInstalled(int driverNum) const { Common::List::const_iterator i; for (i = _installedDrivers.begin(); i != _installedDrivers.end(); ++i) { - if ((*i)->_driverNum == driverNum) + if ((*i)->_driverResID == driverNum) return true; } @@ -272,7 +267,7 @@ void SoundManager::setMasterVol(int volume) { } int SoundManager::getMasterVol() const { - return _volume; + return _masterVol; } void SoundManager::loadSound(int soundNum, bool showErrors) { @@ -291,9 +286,9 @@ void SoundManager::checkResVersion(const byte *soundData) { int maxVersion = READ_LE_UINT16(soundData + 4); int minVersion = READ_LE_UINT16(soundData + 6); - if (_soundManager->_minVersion < minVersion) + if (_soundManager->_ourSndResVersion < minVersion) error("Attempt to play/prime sound resource that is too new"); - if (_soundManager->_minVersion > maxVersion) + if (_soundManager->_ourSndResVersion > maxVersion) error("Attempt to play/prime sound resource that is too old"); } @@ -347,7 +342,7 @@ void SoundManager::rethinkVoiceTypes() { } void SoundManager::_sfSoundServer() { - if (!sfManager()._disableCtr && !sfManager()._suspendCtr) + if (!sfManager()._serverDisabledCount && !sfManager()._serverSuspendedCount) return; if (sfManager()._needToRethink) { @@ -360,8 +355,8 @@ void SoundManager::_sfSoundServer() { // Handle any fading if necessary do { _sfProcessFading(); - } while (sfManager()._suspendCtr > 0); - sfManager()._suspendCtr = 0; + } while (sfManager()._serverSuspendedCount > 0); + sfManager()._serverSuspendedCount = 0; // Poll all sound drivers in case they need it for (Common::List::iterator i = sfManager()._installedDrivers.begin(); @@ -434,7 +429,7 @@ 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->_groupMask) == v) + if ((v & _soundManager->_groupsAvail) == v) return v; p += 6 + (READ_LE_UINT16(p + 4) * 4); @@ -444,24 +439,24 @@ int SoundManager::_sfDetermineGroup(const byte *soundData) { } void SoundManager::_sfAddToPlayList(Sound *sound) { - ++sfManager()._suspendCtr; + ++sfManager()._serverSuspendedCount; _sfDoAddToPlayList(sound); sound->_stoppedAsynchronously = false; _sfRethinkVoiceTypes(); - --sfManager()._suspendCtr; + --sfManager()._serverSuspendedCount; } void SoundManager::_sfRemoveFromPlayList(Sound *sound) { - ++sfManager()._suspendCtr; + ++sfManager()._serverSuspendedCount; if (_sfDoRemoveFromPlayList(sound)) _sfRethinkVoiceTypes(); - --sfManager()._suspendCtr; + --sfManager()._serverSuspendedCount; } bool SoundManager::_sfIsOnPlayList(Sound *sound) { - ++_soundManager->_suspendCtr; + ++_soundManager->_serverSuspendedCount; bool result = contains(_soundManager->_playList, sound); - --_soundManager->_suspendCtr; + --_soundManager->_serverSuspendedCount; return result; } @@ -583,7 +578,7 @@ void SoundManager::_sfRethinkSoundDrivers() { } void SoundManager::_sfRethinkVoiceTypes() { - ++sfManager()._suspendCtr; + ++sfManager()._serverSuspendedCount; _sfDereferenceAll(); @@ -601,7 +596,7 @@ void SoundManager::_sfDereferenceAll() { } void SoundManager::_sfUpdatePriority(Sound *sound) { - ++_soundManager->_suspendCtr; + ++_soundManager->_serverSuspendedCount; int tempPriority = (sound->_fixedPriority == 255) ? sound->_sndResPriority : sound->_priority; if (sound->_priority != tempPriority) { @@ -612,7 +607,7 @@ void SoundManager::_sfUpdatePriority(Sound *sound) { } } - --_soundManager->_suspendCtr; + --_soundManager->_serverSuspendedCount; } void SoundManager::_sfUpdateLoop(Sound *sound) { @@ -626,8 +621,8 @@ void SoundManager::_sfSetMasterVol(int volume) { if (volume > 127) volume = 127; - if (volume != _soundManager->_volume) { - _soundManager->_volume = volume; + if (volume != _soundManager->_masterVol) { + _soundManager->_masterVol = volume; for (Common::List::iterator i = _soundManager->_installedDrivers.begin(); i != _soundManager->_installedDrivers.end(); ++i) { @@ -676,7 +671,7 @@ void SoundManager::_sfExtractGroupMask() { i != sfManager()._installedDrivers.end(); ++i) mask |= (*i)->_groupMask; - _soundManager->_groupMask = mask; + _soundManager->_groupsAvail = mask; } bool SoundManager::_sfInstallDriver(SoundDriver *driver) { @@ -689,7 +684,7 @@ bool SoundManager::_sfInstallDriver(SoundDriver *driver) { _sfExtractGroupMask(); _sfRethinkSoundDrivers(); - driver->setMasterVolume(sfManager()._volume); + driver->setMasterVolume(sfManager()._masterVol); return true; } @@ -710,21 +705,21 @@ void SoundManager::_sfInstallPatchBank(SoundDriver *driver, const byte *bankData * Adds the specified sound in the playing sound list, inserting in order of priority */ void SoundManager::_sfDoAddToPlayList(Sound *sound) { - ++sfManager()._suspendCtr; + ++sfManager()._serverSuspendedCount; Common::List::iterator i = sfManager()._playList.begin(); while ((i != sfManager()._playList.end()) && (sound->_priority > (*i)->_priority)) ++i; sfManager()._playList.insert(i, sound); - --sfManager()._suspendCtr; + --sfManager()._serverSuspendedCount; } /** * Removes the specified sound from the play list */ bool SoundManager::_sfDoRemoveFromPlayList(Sound *sound) { - ++sfManager()._suspendCtr; + ++sfManager()._serverSuspendedCount; bool result = false; for (Common::List::iterator i = sfManager()._playList.begin(); i != sfManager()._playList.end(); ++i) { @@ -735,12 +730,12 @@ bool SoundManager::_sfDoRemoveFromPlayList(Sound *sound) { } } - --sfManager()._suspendCtr; + --sfManager()._serverSuspendedCount; return result; } void SoundManager::_sfDoUpdateVolume(Sound *sound) { - ++_soundManager->_suspendCtr; + ++_soundManager->_serverSuspendedCount; for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { VoiceStruct *vs = sfManager()._voiceStructPtrs[voiceIndex]; @@ -765,7 +760,7 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { } } - --_soundManager->_suspendCtr; + --_soundManager->_serverSuspendedCount; } /*--------------------------------------------------------------------------*/ @@ -1114,7 +1109,7 @@ void ASound::fade(int v1, int v2, int v3, int v4, Action *action) { /*--------------------------------------------------------------------------*/ SoundDriver::SoundDriver() { - _driverNum = 0; + _driverResID = 0; _minVersion = _maxVersion = 0; _groupMask = 0; } diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 9f7ea34e93..9765059489 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -66,11 +66,11 @@ struct GroupData { class SoundDriver { public: Common::String _shortDescription, _longDescription; - int _driverNum; 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(); @@ -129,22 +129,18 @@ private: SoundDriver *instantiateDriver(int driverNum); public: bool __sndmgrReady; - int _minVersion, _maxVersion; + int _ourSndResVersion, _ourDrvResVersion; Common::List _playList; - int _field109[SOUND_ARR_SIZE]; - uint32 _groupMask; - int _volume; - int _disableCtr; - int _suspendCtr; + Common::List _installedDrivers; + VoiceStruct *_voiceStructPtrs[SOUND_ARR_SIZE]; + uint32 _groupsAvail; + int _masterVol; + int _serverDisabledCount; + int _serverSuspendedCount; int _suspendedCount; bool _driversDetected; Common::List _soundList; Common::List _availableDrivers; - Common::List _installedDrivers; - int _field89[SOUND_ARR_SIZE]; - uint16 _groupList[SOUND_ARR_SIZE]; - int _fieldE9[SOUND_ARR_SIZE]; - VoiceStruct *_voiceStructPtrs[SOUND_ARR_SIZE]; bool _needToRethink; public: SoundManager(); -- cgit v1.2.3 From 054555f78e7e81c3da31be39cb4bd583c1124d6f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 5 Jun 2011 22:39:05 +1000 Subject: TSAGE: Implemented the _soServiceTrackType0 method --- engines/tsage/sound.cpp | 543 ++++++++++++++++++++++++++++++++++++++++++++---- engines/tsage/sound.h | 73 +++++-- 2 files changed, 559 insertions(+), 57 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 64ac602be7..625c687320 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -40,7 +40,7 @@ SoundManager::SoundManager() { _ourDrvResVersion = 0x10A; for (int i = 0; i < SOUND_ARR_SIZE; ++i) - _voiceStructPtrs[i] = NULL; + _voiceTypeStructPtrs[i] = NULL; _groupsAvail = 0; _masterVol = 127; @@ -49,6 +49,8 @@ SoundManager::SoundManager() { _suspendedCount = 0; _driversDetected = false; _needToRethink = false; + + _soTimeIndexFlag = false; } SoundManager::~SoundManager() { @@ -371,22 +373,21 @@ void SoundManager::_sfProcessFading() { void SoundManager::_sfUpdateVoiceStructs() { for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { - VoiceStruct *vs = sfManager()._voiceStructPtrs[voiceIndex]; + VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; for (uint idx = 0; idx < vs->_entries.size(); ++idx) { VoiceStructEntry &vse = vs->_entries[idx]; if (vs->_voiceType == VOICETYPE_0) { - vse._field4 = vse._fieldC; - vse._field6 = vse._fieldE; - vse._field8 = vse._field10; - vse._field9 = vse._field11; - vse._fieldA = vse._field12; + vse._type0._sound = vse._type0._sound2; + vse._type0._channelNum = vse._type0._channelNum2; + vse._type0._field9 = vse._type0._field11; + vse._type0._fieldA = vse._type0._field12; } else { - vse._field8 = vse._fieldE; - vse._fieldA = vse._field10; - vse._fieldC = vse._field12; - vse._fieldD = vse._field13; + vse._type1._field8 = vse._type1._fieldE; + vse._type1._fieldA = vse._type1._field10; + vse._type1._fieldC = vse._type1._field12; + vse._type1._fieldD = vse._type1._field13; } } } @@ -421,10 +422,6 @@ SoundManager &SoundManager::sfManager() { return *_soundManager; } -void SoundManager::_soSetTimeIndex(int timeIndex) { - warning("TODO: _soSetTimeIndex"); -} - int SoundManager::_sfDetermineGroup(const byte *soundData) { const byte *p = soundData + READ_LE_UINT16(soundData + 8); uint32 v; @@ -464,9 +461,9 @@ bool SoundManager::_sfIsOnPlayList(Sound *sound) { void SoundManager::_sfRethinkSoundDrivers() { // Free any existing entries for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) { - if (sfManager()._voiceStructPtrs[idx]) { - delete sfManager()._voiceStructPtrs[idx]; - sfManager()._voiceStructPtrs[idx] = NULL; + if (sfManager()._voiceTypeStructPtrs[idx]) { + delete sfManager()._voiceTypeStructPtrs[idx]; + sfManager()._voiceTypeStructPtrs[idx] = NULL; } } @@ -513,8 +510,8 @@ void SoundManager::_sfRethinkSoundDrivers() { int dataSize = !flag ? total * 28 + 30 : total * 26 + 30; debugC(9, ktSageSound, "data Size = %d\n", dataSize); - VoiceStruct *vs = new VoiceStruct(); - sfManager()._voiceStructPtrs[idx] = vs; + VoiceTypeStruct *vs = new VoiceTypeStruct(); + sfManager()._voiceTypeStructPtrs[idx] = vs; if (!flag) { vs->_voiceType = VOICETYPE_0; @@ -539,11 +536,10 @@ void SoundManager::_sfRethinkSoundDrivers() { VoiceStructEntry ve; ve._field1 = (byteVal & 0x80) ? 0 : 1; ve._driver = driver; - ve._field4 = 0; - ve._field6 = 0; - ve._field8 = 0; - ve._field9 = 0; - ve._fieldA = 0; + ve._type0._sound = NULL; + ve._type0._channelNum = 0; + ve._type0._field9 = 0; + ve._type0._fieldA = 0; vs->_entries.push_back(ve); } @@ -555,12 +551,13 @@ void SoundManager::_sfRethinkSoundDrivers() { VoiceStructEntry ve; ve._field0 = idx; ve._driver = driver; - ve._field4 = 0xff; - ve._field6 = 0; - ve._field8 = 0; - ve._fieldA = 0; - ve._fieldC = 0; - ve._fieldD = 0; + ve._type1._field4 = 0xff; + ve._type1._field5 = 0; + ve._type1._field6 = 0; + ve._type1._field8 = 0; + ve._type1._fieldA = 0; + ve._type1._fieldC = 0; + ve._type1._fieldD = 0; vs->_entries.push_back(ve); } @@ -581,7 +578,75 @@ 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._field19 = vse._type0._field9; + vse._type0._field1A = vse._type0._fieldA; + vse._type0._sound = NULL; + vse._type0._channelNum = 0; + vse._type0._field9 = 0; + vse._type0._fieldA = 0; + vse._type0._sound2 = NULL; + vse._type0._channelNum2 = 0; + vse._type0._field11 = 0; + vse._type0._field12 = 0; + } + } else { + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + vse._type1._field14 = vse._type1._field8; + vse._type1._field16 = vse._type1._fieldA; + vse._type1._field18 = vse._type1._fieldC; + vse._type1._field19 = vse._type1._fieldD; + vse._type1._field8 = 0; + vse._type1._fieldA = 0; + vse._type1._fieldC = 0; + vse._type1._fieldD = 0; + vse._type1._fieldE = 0; + vse._type1._field10 = 0; + vse._type1._field12 = 0; + } + } + } + + // 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 + } else { + // Type 1 + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + vse._type1._field8 = 0; + vse._type1._fieldA = 0; + vse._type1._fieldC = 0; + vse._type1._fieldD = 0; + } + + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + if (vse._type1._fieldE | vse._type1._field10) { + //dx = vse._field10; + //ax = vse._fieldE; + //si = 0; + } + } + } + } } void SoundManager::_sfUpdateVolume(Sound *sound) { @@ -738,7 +803,7 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { ++_soundManager->_serverSuspendedCount; for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { - VoiceStruct *vs = sfManager()._voiceStructPtrs[voiceIndex]; + VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; if (!vs) continue; @@ -747,13 +812,13 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { SoundDriver *driver = vse._driver; if (vs->_voiceType == VOICETYPE_0) { - if (!vse._field4 && !vse._field6) { - int vol = sound->_volume * sound->_chVolume[vse._field8] / 127; + if (!vse._type0._sound) { + int vol = sound->_volume * sound->_chVolume[vse._type0._channelNum] / 127; driver->setVolume0(voiceIndex, vse._field0, 7, vol); } } else { - if (!vse._field8 && !vse._fieldA) { - int vol = sound->_volume * sound->_chVolume[vse._fieldC] / 127; + if (!vse._type1._field8 && !vse._type1._fieldA) { + int vol = sound->_volume * sound->_chVolume[vse._type1._fieldC] / 127; driver->setVolume1(voiceIndex, vse._field0, 7, vol); } } @@ -818,7 +883,7 @@ void Sound::unPrime() { stop(); } -void Sound::_prime(int soundResID, bool queFlag) { +void Sound::_prime(int soundResID, bool queueFlag) { if (_primed) unPrime(); @@ -849,7 +914,8 @@ void Sound::_prime(int soundResID, bool queFlag) { _remoteReceiver = ALLOCATE(200); } - if (queFlag) + _soPrimeSound(queueFlag); + if (queueFlag) _soundManager->addToSoundList(this); _primed = true; @@ -975,7 +1041,7 @@ void Sound::fade(int fadeDest, int fadeTicks, int fadeSteps, bool stopAfterFadeF void Sound::setTimeIndex(uint32 timeIndex) { if (_primed) { mute(true); - SoundManager::_soSetTimeIndex(timeIndex); + _soSetTimeIndex(timeIndex); mute(false); } } @@ -1037,6 +1103,405 @@ 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::_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); + assert((channelNum >= 0) && (channelNum < 16)); + + _chProgram[idx] = *(d + 10); + _chModulation[idx] = 0; + _chVolume[idx] = *(d + 11); + _chPan[idx] = *(d + 12); + _chDamper[idx] = 0; + _chVoiceType[idx] = _trackInfo._voiceTypes[idx]; + _chNumVoices[idx] = *(d + 6); + _chSubPriority[idx] = *(d + 7); + _chPitchBlend[idx] = 0x2000; + _chFlags[idx] = 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::_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) { + assert("TODO: Service empty sound"); + return 0; + } + + 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; + } + + 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::_soServiceTrackType0(int trackIndex, const byte *channelData) { + if (_trkRest[trackIndex]) { + --_trkRest[trackIndex]; + return; + } + if (!_trkState[trackIndex]) + return; + + int channelNum = _trkChannel[trackIndex]; + int chFlags = (channelNum == -1) ? 0 : _chFlags[channelNum]; + int var1A = -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[channelNum]; + + 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)) { + var1A = vtStruct->_entries[idx]._field0; + 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) { + // TODO: sub_25D49 + error("TODO"); + } else if (var1A != -1) { + assert(driver); + driver->proc18(var1A, 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) + error("TODO: sub_25E32"); + else + error("TODO: sub_25DD8"); + } else if (var1A != -1) { + assert(driver); + driver->proc20(var1A, 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; + _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 (voiceType != VOICETYPE_0) { + error("sub_25F0E"); + } else if (var1A != -1) { + assert(driver); + driver->setVolume0(var1A, chVoiceType, 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(var1A, 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) { + error("sub_25F0E"); + } else if (var1A != -1) { + assert(driver); + driver->setVolume0(var1A, chVoiceType, cmd, value); + } + } + } else if (_soDoUpdateTracks(cmd, value)) { + return; + } + } else if (!(v & 0x2)) { + // Area #7 + if (!_soundManager->_soTimeIndexFlag) { + int pitchBlend = READ_LE_UINT16(pData); + pData += 2; + + if (channelNum != -1) { + int channel = _trkChannel[trackIndex]; + _chPitchBlend[channel] = pitchBlend; + + if (voiceType != VOICETYPE_0) { + error("sub_25FD0"); + } else if (var1A != -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) && (var1A != -1)) { + assert(driver); + driver->setProgram(var1A, program); + } + } + } else { + error("sub_260C3"); + } + + } 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) && (var1A != -1)) { + assert(driver); + driver->setVolume1(var1A, chVoiceType, 0, b); + } + + } + } + } +} + +void Sound::_soServiceTrackType1(int trackIndex, const byte *channelData) { + +} + +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; +} + /*--------------------------------------------------------------------------*/ ASound::ASound(): EventHandler() { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 9765059489..1b5ee04f05 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -46,6 +46,7 @@ struct trackInfoStruct { }; enum SoundDriverStatus {SNDSTATUS_FAILED = 0, SNDSTATUS_DETECTED = 1, SNDSTATUS_SKIPPED = 2}; +enum VoiceType {VOICETYPE_0 = 0, VOICETYPE_1 = 1}; class SoundDriverEntry { public: @@ -80,19 +81,40 @@ public: virtual bool open() { return true; } virtual void close() {} virtual const GroupData *getGroupData() = 0; - virtual void setMasterVolume(int volume) {} virtual void installPatchBank(const byte *data) {} + virtual void poll() {} + virtual void setMasterVolume(int volume) {} + virtual void proc18(int al, VoiceType voiceType) {} + virtual void proc20(int al, VoiceType voiceType) {} + virtual void proc22(int al, VoiceType voiceType, int v3) {} virtual void setVolume0(int channel, int v2, int v3, int volume) {} + virtual void setProgram(int channel, int program) {} virtual void setVolume1(int channel, int v2, int v3, int volume) {} + virtual void setPitchBlend(int channel, int pitchBlend) {} virtual void play(const byte *data, int size, int channel, int volume) {} - virtual void poll() {} }; -struct VoiceStructEntry { - int _field0; - int _field1; - SoundDriver *_driver; +struct VoiceStructEntryType0 { + Sound *_sound; + int _channelNum; + int _field9; + int _fieldA; + Sound *_sound2; + int _channelNum2; + int _field11; + int _field12; + int _field13; + Sound *_sound3; + int _field16; + int _channelNum3; + int _field19; + int _field1A; + int _field1B; +}; + +struct VoiceStructEntryType1 { int _field4; + int _field5; int _field6; int _field8; int _field9; @@ -108,18 +130,23 @@ struct VoiceStructEntry { int _field16; int _field18; int _field19; - - int _field1A; - int _field1B; }; -enum VoiceType {VOICETYPE_0 = 0, VOICETYPE_1 = 1}; +struct VoiceStructEntry { + int _field0; + int _field1; + SoundDriver *_driver; + + VoiceStructEntryType0 _type0; + VoiceStructEntryType1 _type1; +}; -class VoiceStruct { +class VoiceTypeStruct { public: VoiceType _voiceType; int _field1; int _field2; + int _field3; Common::Array _entries; }; @@ -132,7 +159,7 @@ public: int _ourSndResVersion, _ourDrvResVersion; Common::List _playList; Common::List _installedDrivers; - VoiceStruct *_voiceStructPtrs[SOUND_ARR_SIZE]; + VoiceTypeStruct *_voiceTypeStructPtrs[SOUND_ARR_SIZE]; uint32 _groupsAvail; int _masterVol; int _serverDisabledCount; @@ -142,6 +169,8 @@ public: Common::List _soundList; Common::List _availableDrivers; bool _needToRethink; + // Misc flags + bool _soTimeIndexFlag; public: SoundManager(); ~SoundManager(); @@ -186,10 +215,9 @@ public: void loadSound(int soundNum, bool showErrors); void unloadSound(int soundNum); - // _so methods + // _sf methods static SoundManager &sfManager(); static void _sfTerminate(); - static void _soSetTimeIndex(int timeIndex); static int _sfDetermineGroup(const byte *soundData); static void _sfAddToPlayList(Sound *sound); static void _sfRemoveFromPlayList(Sound *sound); @@ -216,7 +244,7 @@ public: class Sound: public EventHandler { private: - void _prime(int soundResID, bool queFlag); + void _prime(int soundResID, bool queueFlag); void _unPrime(); void orientAfterRestore(); public: @@ -226,11 +254,11 @@ public: int _group; int _sndResPriority; int _fixedPriority; - int _sndResLoop; + bool _sndResLoop; bool _fixedLoop; int _priority; int _volume; - bool _loop; + int _loop; int _pausedCount; int _mutedCount; int _hold; @@ -296,8 +324,17 @@ public: bool getLoop(); void holdAt(int amount); void release(); - void orientAfterDriverChange(); + + // _so methods + void _soPrimeSound(bool queueFlag); + void _soSetTimeIndex(uint timeIndex); + void _soPrimeChannelData(); + bool _soServiceTracks(); + void _soServiceTrackType0(int trackIndex, const byte *channelData); + void _soServiceTrackType1(int trackIndex, const byte *channelData); + void _soDoTrackCommand(int channelNum, int command, int value); + bool _soDoUpdateTracks(int command, int value); }; class ASound: public EventHandler { -- cgit v1.2.3 From 1923c0d0a94947ad6efc5af78476b61fa026c163 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 6 Jun 2011 22:15:03 +1000 Subject: TSAGE: Started implementing support methods for track servicing --- engines/tsage/sound.cpp | 298 +++++++++++++++++++++++++++++++----------------- engines/tsage/sound.h | 26 ++--- 2 files changed, 204 insertions(+), 120 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 625c687320..db1532253a 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -368,7 +368,63 @@ void SoundManager::_sfSoundServer() { } void SoundManager::_sfProcessFading() { - //TODO + // Loop through processing active sounds + bool removeFlag = false; + Common::List::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 != 255) { + 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 &voiceType = *sfManager()._voiceTypeStructPtrs[voiceIndex]; + + if (voiceType._voiceType == VOICETYPE_1) { + for (uint idx = 0; idx < voiceType._entries.size(); ++idx) { + if (voiceType._entries[idx]._type1._field6 >= -1) + ++voiceType._entries[idx]._type1._field6; + } + } + } } void SoundManager::_sfUpdateVoiceStructs() { @@ -384,9 +440,8 @@ void SoundManager::_sfUpdateVoiceStructs() { vse._type0._field9 = vse._type0._field11; vse._type0._fieldA = vse._type0._field12; } else { - vse._type1._field8 = vse._type1._fieldE; - vse._type1._fieldA = vse._type1._field10; - vse._type1._fieldC = vse._type1._field12; + vse._type1._sound = vse._type1._sound2; + vse._type1._channelNum = vse._type1._channelNum2; vse._type1._fieldD = vse._type1._field13; } } @@ -549,14 +604,13 @@ void SoundManager::_sfRethinkSoundDrivers() { for (int idx = 0; idx < byteVal; ++idx) { VoiceStructEntry ve; - ve._field0 = idx; + ve._voiceNum = idx; ve._driver = driver; ve._type1._field4 = 0xff; ve._type1._field5 = 0; ve._type1._field6 = 0; - ve._type1._field8 = 0; - ve._type1._fieldA = 0; - ve._type1._fieldC = 0; + ve._type1._sound = NULL; + ve._type1._channelNum = 0; ve._type1._fieldD = 0; vs->_entries.push_back(ve); @@ -603,21 +657,18 @@ void SoundManager::_sfRethinkVoiceTypes() { } else { for (uint idx = 0; idx < vs->_entries.size(); ++idx) { VoiceStructEntry &vse = vs->_entries[idx]; - vse._type1._field14 = vse._type1._field8; - vse._type1._field16 = vse._type1._fieldA; - vse._type1._field18 = vse._type1._fieldC; + vse._type1._sound3 = vse._type1._sound; + vse._type1._channelNum3 = vse._type1._channelNum; vse._type1._field19 = vse._type1._fieldD; - vse._type1._field8 = 0; - vse._type1._fieldA = 0; - vse._type1._fieldC = 0; + vse._type1._sound = NULL; + vse._type1._channelNum = 0; vse._type1._fieldD = 0; - vse._type1._fieldE = 0; - vse._type1._field10 = 0; - vse._type1._field12 = 0; + vse._type1._sound2 = NULL; + vse._type1._channelNum2 = 0; } } } - +//TODO: Lots of this method // Post-processing for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; @@ -631,17 +682,15 @@ void SoundManager::_sfRethinkVoiceTypes() { // Type 1 for (uint idx = 0; idx < vs->_entries.size(); ++idx) { VoiceStructEntry &vse = vs->_entries[idx]; - vse._type1._field8 = 0; - vse._type1._fieldA = 0; - vse._type1._fieldC = 0; + vse._type1._sound = NULL; + vse._type1._channelNum = 0; vse._type1._fieldD = 0; } for (uint idx = 0; idx < vs->_entries.size(); ++idx) { VoiceStructEntry &vse = vs->_entries[idx]; - if (vse._type1._fieldE | vse._type1._field10) { - //dx = vse._field10; - //ax = vse._fieldE; + if (vse._type1._sound2) { + //dx/ax = vse._sound2; //si = 0; } } @@ -814,12 +863,12 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { if (vs->_voiceType == VOICETYPE_0) { if (!vse._type0._sound) { int vol = sound->_volume * sound->_chVolume[vse._type0._channelNum] / 127; - driver->setVolume0(voiceIndex, vse._field0, 7, vol); + driver->setVolume0(voiceIndex, vse._voiceNum, 7, vol); } } else { - if (!vse._type1._field8 && !vse._type1._fieldA) { - int vol = sound->_volume * sound->_chVolume[vse._type1._fieldC] / 127; - driver->setVolume1(voiceIndex, vse._field0, 7, vol); + if (!vse._type1._sound) { + int vol = sound->_volume * sound->_chVolume[vse._type1._channelNum] / 127; + driver->setVolume1(voiceIndex, vse._voiceNum, 7, vol); } } } @@ -1124,6 +1173,68 @@ void Sound::_soPrimeSound(bool queueFlag) { _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; + } + + 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) { @@ -1186,66 +1297,8 @@ void Sound::_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) { - assert("TODO: Service empty sound"); - return 0; - } - - 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; - } - - 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::_soRemoteReceive() { + error("_soRemoteReceive not implemented"); } void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { @@ -1258,7 +1311,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { int channelNum = _trkChannel[trackIndex]; int chFlags = (channelNum == -1) ? 0 : _chFlags[channelNum]; - int var1A = -1; + int voiceNum = -1; SoundDriver *driver = NULL; VoiceTypeStruct *vtStruct; @@ -1277,7 +1330,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { if (!vtStruct->_entries[idx]._type0._sound && (vtStruct->_entries[idx]._type0._channelNum != channelNum)) { - var1A = vtStruct->_entries[idx]._field0; + voiceNum = vtStruct->_entries[idx]._voiceNum; driver = vtStruct->_entries[idx]._driver; break; } @@ -1296,11 +1349,10 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { // Only do processing if fast forwarding to a given time index if (channelNum != -1) { if (voiceType == VOICETYPE_1) { - // TODO: sub_25D49 - error("TODO"); - } else if (var1A != -1) { + _soUpdateDamper(vtStruct, channelNum, chVoiceType, v); + } else if (voiceNum != -1) { assert(driver); - driver->proc18(var1A, chVoiceType); + driver->proc18(voiceNum, chVoiceType); } } } @@ -1322,9 +1374,9 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { error("TODO: sub_25E32"); else error("TODO: sub_25DD8"); - } else if (var1A != -1) { + } else if (voiceNum != -1) { assert(driver); - driver->proc20(var1A, chVoiceType); + driver->proc20(voiceNum, chVoiceType); } } } else { @@ -1366,9 +1418,9 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { if (!_soundManager->_soTimeIndexFlag) { if (voiceType != VOICETYPE_0) { error("sub_25F0E"); - } else if (var1A != -1) { + } else if (voiceNum != -1) { assert(driver); - driver->setVolume0(var1A, chVoiceType, cmdVal, b); + driver->setVolume0(voiceNum, chVoiceType, cmdVal, b); } } } @@ -1381,7 +1433,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { if (channelNum != -1) { assert(driver); - driver->proc22(var1A, chVoiceType, cx); + driver->proc22(voiceNum, chVoiceType, cx); } } else { pData += 2; @@ -1397,9 +1449,9 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { if (!_soundManager->_soTimeIndexFlag) { if (voiceType != VOICETYPE_0) { error("sub_25F0E"); - } else if (var1A != -1) { + } else if (voiceNum != -1) { assert(driver); - driver->setVolume0(var1A, chVoiceType, cmd, value); + driver->setVolume0(voiceNum, chVoiceType, cmd, value); } } } else if (_soDoUpdateTracks(cmd, value)) { @@ -1417,7 +1469,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { if (voiceType != VOICETYPE_0) { error("sub_25FD0"); - } else if (var1A != -1) { + } else if (voiceNum != -1) { assert(driver); driver->setPitchBlend(channel, pitchBlend); } @@ -1434,9 +1486,9 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { _chProgram[channel] = program; if (!_soundManager->_soTimeIndexFlag) { - if ((voiceType == VOICETYPE_0) && (var1A != -1)) { + if ((voiceType == VOICETYPE_0) && (voiceNum != -1)) { assert(driver); - driver->setProgram(var1A, program); + driver->setProgram(voiceNum, program); } } } else { @@ -1454,9 +1506,9 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { } if (!_soundManager->_soTimeIndexFlag) { - if ((channelNum != -1) && (voiceType == VOICETYPE_0) && (var1A != -1)) { + if ((channelNum != -1) && (voiceType == VOICETYPE_0) && (voiceNum != -1)) { assert(driver); - driver->setVolume1(var1A, chVoiceType, 0, b); + driver->setVolume1(voiceNum, chVoiceType, 0, b); } } @@ -1464,8 +1516,42 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { } } +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); + } + } + } +} + 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 { + VoiceTypeStruct *voiceType = _soundManager->_voiceTypeStructPtrs[_chVoiceType[channel]]; + if (!voiceType) + _trkState[trackIndex] = 0; + else { + + } + } } void Sound::_soDoTrackCommand(int channelNum, int command, int value) { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 1b5ee04f05..1158ce3c87 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -91,7 +91,7 @@ public: virtual void setProgram(int channel, int program) {} virtual void setVolume1(int channel, int v2, int v3, int volume) {} virtual void setPitchBlend(int channel, int pitchBlend) {} - virtual void play(const byte *data, int size, int channel, int volume) {} + virtual void updateVoice(int voiceNum) {} }; struct VoiceStructEntryType0 { @@ -116,24 +116,19 @@ struct VoiceStructEntryType1 { int _field4; int _field5; int _field6; - int _field8; - int _field9; - int _fieldA; - int _fieldC; + Sound *_sound; + int _channelNum; int _fieldD; - int _fieldE; - int _field10; - int _field11; - int _field12; + Sound *_sound2; + int _channelNum2; int _field13; - int _field14; - int _field16; - int _field18; + Sound *_sound3; + int _channelNum3; int _field19; }; struct VoiceStructEntry { - int _field0; + int _voiceNum; int _field1; SoundDriver *_driver; @@ -329,9 +324,12 @@ public: // _so methods void _soPrimeSound(bool queueFlag); void _soSetTimeIndex(uint timeIndex); - void _soPrimeChannelData(); bool _soServiceTracks(); + void _soPrimeChannelData(); + void _soRemoteReceive(); void _soServiceTrackType0(int trackIndex, const byte *channelData); + void _soUpdateDamper(VoiceTypeStruct *voiceType, int channelNum, VoiceType mode, int v0); + void _soServiceTrackType1(int trackIndex, const byte *channelData); void _soDoTrackCommand(int channelNum, int command, int value); bool _soDoUpdateTracks(int command, int value); -- cgit v1.2.3 From 4b35006abad97c709f25028c00c3e7770e8426e7 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 7 Jun 2011 21:48:53 +1000 Subject: TSAGE: Implemented the rest of the support methods for _soServiceTrackType0 --- engines/tsage/sound.cpp | 170 ++++++++++++++++++++++++++++++++++++++++++------ engines/tsage/sound.h | 14 +++- 2 files changed, 163 insertions(+), 21 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index db1532253a..c5ede4695f 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -1152,7 +1152,6 @@ void Sound::release() { _hold = -1; } - void Sound::_soPrimeSound(bool queueFlag) { if (!queueFlag) { _priority = (_fixedPriority != -1) ? _fixedPriority : _sndResPriority; @@ -1371,9 +1370,9 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { if (voiceType == VOICETYPE_1) { // TODO: sub_25E32/sub_25DD8 if (chFlags & 0x10) - error("TODO: sub_25E32"); + _soProc42(vtStruct, channelNum, chVoiceType, v); else - error("TODO: sub_25DD8"); + _soProc32(vtStruct, channelNum, chVoiceType, v); } else if (voiceNum != -1) { assert(driver); driver->proc20(voiceNum, chVoiceType); @@ -1417,7 +1416,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { if (!_soundManager->_soTimeIndexFlag) { if (voiceType != VOICETYPE_0) { - error("sub_25F0E"); + _soProc38(vtStruct, channelNum, chVoiceType, cmdVal, v); } else if (voiceNum != -1) { assert(driver); driver->setVolume0(voiceNum, chVoiceType, cmdVal, b); @@ -1448,7 +1447,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { if (!_soundManager->_soTimeIndexFlag) { if (voiceType != VOICETYPE_0) { - error("sub_25F0E"); + _soProc38(vtStruct, channelNum, chVoiceType, cmd, value); } else if (voiceNum != -1) { assert(driver); driver->setVolume0(voiceNum, chVoiceType, cmd, value); @@ -1468,7 +1467,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { _chPitchBlend[channel] = pitchBlend; if (voiceType != VOICETYPE_0) { - error("sub_25FD0"); + _soProc40(vtStruct, channelNum); } else if (voiceNum != -1) { assert(driver); driver->setPitchBlend(channel, pitchBlend); @@ -1492,7 +1491,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { } } } else { - error("sub_260C3"); + _soSetTrackPos(trackIndex, pData - channelData, program); } } else { @@ -1537,19 +1536,84 @@ void Sound::_soUpdateDamper(VoiceTypeStruct *voiceType, int channelNum, VoiceTyp } } -void Sound::_soServiceTrackType1(int trackIndex, const byte *channelData) { - if (_soundManager->_soTimeIndexFlag || !_trkState[trackIndex]) - return; +void Sound::_soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0) { + int entryIndex = _soFindSound(vtStruct, channelNum); + if (entryIndex != -1) { + SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; + assert(driver); - int channel = _trkChannel[trackIndex]; - if (channel == -1) - _trkState[trackIndex] = 0; - else { - VoiceTypeStruct *voiceType = _soundManager->_voiceTypeStructPtrs[_chVoiceType[channel]]; - if (!voiceType) - _trkState[trackIndex] = 0; - else { - + 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]); + } +} + +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, voiceType, + _channelData[trackCtr], this, 0x7f, 0xff, 0xE); + 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) { + VoiceStructEntryType1 &vte = vtStruct->_entries[entryIndex]._type1; + + if ((vte._sound == this) && (vte._channelNum == channelNum)) { + SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; + assert(driver); + + driver->proc38(vtStruct->_entries[entryIndex]._voiceNum); + } + } + } +} + +void Sound::_soProc40(VoiceTypeStruct *vtStruct, int channelNum) { + 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->proc40(vtStruct->_entries[entryIndex]._voiceNum); } } } @@ -1588,6 +1652,74 @@ bool Sound::_soDoUpdateTracks(int command, int value) { 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 { + VoiceTypeStruct *voiceType = _soundManager->_voiceTypeStructPtrs[_chVoiceType[channel]]; + if (!voiceType) + _trkState[trackIndex] = 0; + 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() { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 1158ce3c87..65f13a1650 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -91,6 +91,10 @@ public: virtual void setProgram(int channel, int program) {} virtual void setVolume1(int channel, int v2, int v3, int volume) {} virtual void setPitchBlend(int channel, int pitchBlend) {} + virtual void proc32(int voiceNum, int program, ...) {} // TODO: Determine params + virtual void proc38(int voiceNum) {} + virtual void proc40(int voiceNum) {} + virtual void proc42(int voiceNum, ...) {} // TODO: Determine params virtual void updateVoice(int voiceNum) {} }; @@ -329,10 +333,16 @@ public: void _soRemoteReceive(); void _soServiceTrackType0(int trackIndex, const byte *channelData); void _soUpdateDamper(VoiceTypeStruct *voiceType, int channelNum, VoiceType mode, int v0); - - void _soServiceTrackType1(int trackIndex, const byte *channelData); + void _soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0); + 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); 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 { -- cgit v1.2.3 From 6c1178aecaa94d5f6828339eee36fffec5486e73 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 7 Jun 2011 22:22:11 +1000 Subject: TSAGE: Completed implementing _so methods --- engines/tsage/sound.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index c5ede4695f..69d2656baa 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -1676,11 +1676,30 @@ void Sound::_soServiceTrackType1(int trackIndex, const byte *channelData) { if (channel == -1) _trkState[trackIndex] = 0; else { - VoiceTypeStruct *voiceType = _soundManager->_voiceTypeStructPtrs[_chVoiceType[channel]]; - if (!voiceType) + 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, voiceType, + _channelData[trackIndex], this, 0x7f, 0xff, 0xE); + } + } else { + + } + } } } } -- cgit v1.2.3 From 8e9e25c786c8100a9a5a5955b7153e0b6e27c8eb Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 8 Jun 2011 21:23:25 +1000 Subject: TSAGE: Finished implementing voice type 0 post-processing for _sfRethinkVoiceTypes --- engines/tsage/sound.cpp | 119 ++++++++++++++++++++++++++++++++++++++++++++++-- engines/tsage/sound.h | 4 +- 2 files changed, 117 insertions(+), 6 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 69d2656baa..62f8787ace 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -669,6 +669,7 @@ void SoundManager::_sfRethinkVoiceTypes() { } } //TODO: Lots of this method + // Post-processing for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; @@ -677,6 +678,118 @@ void SoundManager::_sfRethinkVoiceTypes() { 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._field9 = vse._field11; + 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._field9 = 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._field9 = vse._field11; + 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._field9 = vse._field11; + 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 @@ -863,7 +976,7 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { if (vs->_voiceType == VOICETYPE_0) { if (!vse._type0._sound) { int vol = sound->_volume * sound->_chVolume[vse._type0._channelNum] / 127; - driver->setVolume0(voiceIndex, vse._voiceNum, 7, vol); + driver->proc24(voiceIndex, vse._voiceNum, sound, 7, vol); } } else { if (!vse._type1._sound) { @@ -1419,7 +1532,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { _soProc38(vtStruct, channelNum, chVoiceType, cmdVal, v); } else if (voiceNum != -1) { assert(driver); - driver->setVolume0(voiceNum, chVoiceType, cmdVal, b); + driver->proc24(voiceNum, chVoiceType, this, cmdVal, b); } } } @@ -1450,7 +1563,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { _soProc38(vtStruct, channelNum, chVoiceType, cmd, value); } else if (voiceNum != -1) { assert(driver); - driver->setVolume0(voiceNum, chVoiceType, cmd, value); + driver->proc24(voiceNum, chVoiceType, this, cmd, value); } } } else if (_soDoUpdateTracks(cmd, value)) { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 65f13a1650..30e2233f77 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -87,7 +87,7 @@ public: virtual void proc18(int al, VoiceType voiceType) {} virtual void proc20(int al, VoiceType voiceType) {} virtual void proc22(int al, VoiceType voiceType, int v3) {} - virtual void setVolume0(int channel, int v2, int v3, int volume) {} + virtual void proc24(int channel, int voiceIndex, Sound *sound, int v1, int v2) {} virtual void setProgram(int channel, int program) {} virtual void setVolume1(int channel, int v2, int v3, int volume) {} virtual void setPitchBlend(int channel, int pitchBlend) {} @@ -107,9 +107,7 @@ struct VoiceStructEntryType0 { int _channelNum2; int _field11; int _field12; - int _field13; Sound *_sound3; - int _field16; int _channelNum3; int _field19; int _field1A; -- cgit v1.2.3 From b0372e42100012d8a9e6ab949940c960ced7fee5 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 8 Jun 2011 23:23:57 +1000 Subject: TSAGE: Finished implementing voice type 1 post processing for _sfRethinkVoiceTypes --- engines/tsage/sound.cpp | 72 +++++++++++++++++++++++++++++++++++++++++++------ engines/tsage/sound.h | 6 ++--- 2 files changed, 67 insertions(+), 11 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 62f8787ace..ff8b87eb83 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -801,10 +801,66 @@ void SoundManager::_sfRethinkVoiceTypes() { } for (uint idx = 0; idx < vs->_entries.size(); ++idx) { - VoiceStructEntry &vse = vs->_entries[idx]; - if (vse._type1._sound2) { - //dx/ax = vse._sound2; - //si = 0; + 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 && (vse._sound3 == sound) && (vse._channelNum3 == channelNum)) { + vse2._sound = sound; + vse2._channelNum = channelNum; + vse._channelNum = vse2._channelNum2; + vse._fieldD = vse2._field13; + 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 = sound; + vse2._channelNum = vse._channelNum; + vse2._fieldD = vse._field13; + 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->proc40(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); } } } @@ -1580,7 +1636,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { _chPitchBlend[channel] = pitchBlend; if (voiceType != VOICETYPE_0) { - _soProc40(vtStruct, channelNum); + _soProc40(vtStruct, channelNum, pitchBlend); } else if (voiceNum != -1) { assert(driver); driver->setPitchBlend(channel, pitchBlend); @@ -1712,13 +1768,13 @@ void Sound::_soProc38(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voice SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; assert(driver); - driver->proc38(vtStruct->_entries[entryIndex]._voiceNum); + driver->proc38(vtStruct->_entries[entryIndex]._voiceNum, cmd, value); } } } } -void Sound::_soProc40(VoiceTypeStruct *vtStruct, int channelNum) { +void Sound::_soProc40(VoiceTypeStruct *vtStruct, int channelNum, int pitchBlend) { for (uint entryIndex = 0; entryIndex < vtStruct->_entries.size(); ++entryIndex) { VoiceStructEntryType1 &vte = vtStruct->_entries[entryIndex]._type1; @@ -1726,7 +1782,7 @@ void Sound::_soProc40(VoiceTypeStruct *vtStruct, int channelNum) { SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; assert(driver); - driver->proc40(vtStruct->_entries[entryIndex]._voiceNum); + driver->proc40(vtStruct->_entries[entryIndex]._voiceNum, pitchBlend); } } } diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 30e2233f77..2f634a9a21 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -92,8 +92,8 @@ public: virtual void setVolume1(int channel, int v2, int v3, int volume) {} virtual void setPitchBlend(int channel, int pitchBlend) {} virtual void proc32(int voiceNum, int program, ...) {} // TODO: Determine params - virtual void proc38(int voiceNum) {} - virtual void proc40(int voiceNum) {} + virtual void proc38(int voiceNum, int cmd, int value) {} + virtual void proc40(int voiceNum, int pitchBlend) {} virtual void proc42(int voiceNum, ...) {} // TODO: Determine params virtual void updateVoice(int voiceNum) {} }; @@ -334,7 +334,7 @@ public: void _soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0); 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); + 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); -- cgit v1.2.3 From 8795871ba1dec3620ecd76008ba2cd8811c6642a Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 9 Jun 2011 22:50:00 +1000 Subject: TSAGE: Started work on main area of _sfRethinkVoiceTypes --- engines/tsage/sound.cpp | 162 +++++++++++++++++++++++++++++++++++++++++++++--- engines/tsage/sound.h | 9 +-- 2 files changed, 158 insertions(+), 13 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index ff8b87eb83..d7a8741c77 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -442,12 +442,34 @@ void SoundManager::_sfUpdateVoiceStructs() { } else { vse._type1._sound = vse._type1._sound2; vse._type1._channelNum = vse._type1._channelNum2; - vse._type1._fieldD = vse._type1._field13; + vse._type1._priority = vse._type1._priority2; } } } } +void SoundManager::_sfUpdateVoiceStructs2() { + for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { + VoiceTypeStruct *vtStruct = sfManager()._voiceTypeStructPtrs[voiceIndex]; + + 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._field11 = vse._field9; + 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) { @@ -573,7 +595,7 @@ void SoundManager::_sfRethinkSoundDrivers() { vs->_field1 = total; } else { vs->_voiceType = VOICETYPE_1; - vs->_field1 = vs->_field2 = total; + vs->_field1 = vs->_numVoices = total; } for (Common::List::iterator i = sfManager()._installedDrivers.begin(); @@ -611,7 +633,7 @@ void SoundManager::_sfRethinkSoundDrivers() { ve._type1._field6 = 0; ve._type1._sound = NULL; ve._type1._channelNum = 0; - ve._type1._fieldD = 0; + ve._type1._priority = 0; vs->_entries.push_back(ve); } @@ -659,16 +681,138 @@ void SoundManager::_sfRethinkVoiceTypes() { VoiceStructEntry &vse = vs->_entries[idx]; vse._type1._sound3 = vse._type1._sound; vse._type1._channelNum3 = vse._type1._channelNum; - vse._type1._field19 = vse._type1._fieldD; + vse._type1._priority3 = vse._type1._priority; vse._type1._sound = NULL; vse._type1._channelNum = 0; - vse._type1._fieldD = 0; + vse._type1._priority = 0; vse._type1._sound2 = NULL; vse._type1._channelNum2 = 0; } } } -//TODO: Lots of this method + + // Main processing loop + int priorityOffset = 0; + for (Common::List::iterator i = sfManager()._playList.begin(); i != sfManager()._playList.end(); ++i, priorityOffset += 16) { + Sound *sound = *i; + if ((sound->_mutedCount != 0) || (sound->_pausedCount != 0)) + continue; + + _sfUpdateVoiceStructs(); + for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) + sound->_chWork[idx] = 0; + + 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] = 1; + + 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 = numVoices; + 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 = numVoices; + 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 = idx; + 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) { + //int entryIndex = -1; + for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { + + } + } + } + } + } // Post-processing for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { @@ -797,7 +941,7 @@ void SoundManager::_sfRethinkVoiceTypes() { VoiceStructEntry &vse = vs->_entries[idx]; vse._type1._sound = NULL; vse._type1._channelNum = 0; - vse._type1._fieldD = 0; + vse._type1._priority = 0; } for (uint idx = 0; idx < vs->_entries.size(); ++idx) { @@ -814,7 +958,7 @@ void SoundManager::_sfRethinkVoiceTypes() { vse2._sound = sound; vse2._channelNum = channelNum; vse._channelNum = vse2._channelNum2; - vse._fieldD = vse2._field13; + vse._priority = vse2._priority2; vse._sound2 = NULL; break; } @@ -834,7 +978,7 @@ void SoundManager::_sfRethinkVoiceTypes() { VoiceStructEntryType1 &vse2 = vs->_entries[idx2]._type1; vse2._sound = sound; vse2._channelNum = vse._channelNum; - vse2._fieldD = vse._field13; + vse2._priority = vse._priority2; vse._field4 = -1; vse2._field5 = 0; vse2._field6 = 0; diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 2f634a9a21..8115d034a1 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -120,13 +120,13 @@ struct VoiceStructEntryType1 { int _field6; Sound *_sound; int _channelNum; - int _fieldD; + int _priority; Sound *_sound2; int _channelNum2; - int _field13; + int _priority2; Sound *_sound3; int _channelNum3; - int _field19; + int _priority3; }; struct VoiceStructEntry { @@ -142,7 +142,7 @@ class VoiceTypeStruct { public: VoiceType _voiceType; int _field1; - int _field2; + int _numVoices; int _field3; Common::Array _entries; @@ -237,6 +237,7 @@ public: static void _sfSoundServer(); static void _sfProcessFading(); static void _sfUpdateVoiceStructs(); + static void _sfUpdateVoiceStructs2(); }; class Sound: public EventHandler { -- cgit v1.2.3 From dc1c9224abb9b2ac1e79e8512d98ceba2436a889 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 10 Jun 2011 23:17:12 +1000 Subject: TSAGE: Finished implementing _sfRethinkVoiceTypes --- engines/tsage/sound.cpp | 188 ++++++++++++++++++++++++++++++++++++++++++++---- engines/tsage/sound.h | 6 +- 2 files changed, 178 insertions(+), 16 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index d7a8741c77..ac7217a753 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -437,7 +437,7 @@ void SoundManager::_sfUpdateVoiceStructs() { if (vs->_voiceType == VOICETYPE_0) { vse._type0._sound = vse._type0._sound2; vse._type0._channelNum = vse._type0._channelNum2; - vse._type0._field9 = vse._type0._field11; + vse._type0._priority = vse._type0._priority2; vse._type0._fieldA = vse._type0._field12; } else { vse._type1._sound = vse._type1._sound2; @@ -458,7 +458,7 @@ void SoundManager::_sfUpdateVoiceStructs2() { VoiceStructEntryType0 &vse = vtStruct->_entries[idx]._type0; vse._sound2 = vse._sound; vse._channelNum2 = vse._channelNum; - vse._field11 = vse._field9; + vse._priority2 = vse._priority; vse._field12 = vse._fieldA; } else { VoiceStructEntryType1 &vse = vtStruct->_entries[idx]._type1; @@ -615,7 +615,7 @@ void SoundManager::_sfRethinkSoundDrivers() { ve._driver = driver; ve._type0._sound = NULL; ve._type0._channelNum = 0; - ve._type0._field9 = 0; + ve._type0._priority = 0; ve._type0._fieldA = 0; vs->_entries.push_back(ve); @@ -665,15 +665,15 @@ void SoundManager::_sfRethinkVoiceTypes() { VoiceStructEntry &vse = vs->_entries[idx]; vse._type0._sound3 = vse._type0._sound; vse._type0._channelNum3 = vse._type0._channelNum; - vse._type0._field19 = vse._type0._field9; + vse._type0._priority3 = vse._type0._priority; vse._type0._field1A = vse._type0._fieldA; vse._type0._sound = NULL; vse._type0._channelNum = 0; - vse._type0._field9 = 0; + vse._type0._priority = 0; vse._type0._fieldA = 0; vse._type0._sound2 = NULL; vse._type0._channelNum2 = 0; - vse._type0._field11 = 0; + vse._type0._priority2 = 0; vse._type0._field12 = 0; } } else { @@ -804,11 +804,173 @@ void SoundManager::_sfRethinkVoiceTypes() { } int flagsVal = sound->_chFlags[foundIndex] & 3; - if (flagsVal == 1) { - //int entryIndex = -1; + 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; } } } @@ -837,7 +999,7 @@ void SoundManager::_sfRethinkVoiceTypes() { if (vse._channelNum3 != vse._channelNum) ++total; - vse._field9 = vse._field11; + vse._priority = vse._priority2; vse._fieldA = 1; vse._sound2 = NULL; @@ -857,7 +1019,7 @@ void SoundManager::_sfRethinkVoiceTypes() { } else { vse._sound = NULL; vse._channelNum = 0; - vse._field9 = 0; + vse._priority = 0; vse._fieldA = 0; } } @@ -876,7 +1038,7 @@ void SoundManager::_sfRethinkVoiceTypes() { // Found match vs->_entries[entryIndex]._type0._sound = sound; vs->_entries[entryIndex]._type0._channelNum = channelNum; - vs->_entries[entryIndex]._type0._field9 = vse._field11; + vs->_entries[entryIndex]._type0._priority = vse._priority2; vs->_entries[entryIndex]._type0._fieldA = 0; vse._sound2 = NULL; break; @@ -907,7 +1069,7 @@ void SoundManager::_sfRethinkVoiceTypes() { vseFound._sound = vse._sound2; vseFound._channelNum = vse._channelNum2; - vseFound._field9 = vse._field11; + vseFound._priority = vse._priority2; vseFound._fieldA = 0; SoundDriver *driver = vs->_entries[foundIndex]._driver; diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 8115d034a1..1dc40b2e4c 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -101,15 +101,15 @@ public: struct VoiceStructEntryType0 { Sound *_sound; int _channelNum; - int _field9; + int _priority; int _fieldA; Sound *_sound2; int _channelNum2; - int _field11; + int _priority2; int _field12; Sound *_sound3; int _channelNum3; - int _field19; + int _priority3; int _field1A; int _field1B; }; -- cgit v1.2.3 From 34fd272841c0dc80e3de2dd66b671eb84fe78aba Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 13 Jun 2011 16:31:35 +1000 Subject: TSAGE: Completed initial implementation of _sfRethinkVoiceTypes --- engines/tsage/sound.cpp | 326 ++++++++++++++++++++++++++++++++++++++++++++---- engines/tsage/sound.h | 81 ++++++++---- 2 files changed, 361 insertions(+), 46 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index ac7217a753..1976013946 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -358,7 +358,6 @@ void SoundManager::_sfSoundServer() { do { _sfProcessFading(); } while (sfManager()._serverSuspendedCount > 0); - sfManager()._serverSuspendedCount = 0; // Poll all sound drivers in case they need it for (Common::List::iterator i = sfManager()._installedDrivers.begin(); @@ -416,12 +415,14 @@ void SoundManager::_sfProcessFading() { // Loop through the voiceType list for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { - VoiceTypeStruct &voiceType = *sfManager()._voiceTypeStructPtrs[voiceIndex]; + VoiceTypeStruct *vtStruct = sfManager()._voiceTypeStructPtrs[voiceIndex]; + if (!vtStruct) + continue; - if (voiceType._voiceType == VOICETYPE_1) { - for (uint idx = 0; idx < voiceType._entries.size(); ++idx) { - if (voiceType._entries[idx]._type1._field6 >= -1) - ++voiceType._entries[idx]._type1._field6; + 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; } } } @@ -430,6 +431,8 @@ void SoundManager::_sfProcessFading() { void SoundManager::_sfUpdateVoiceStructs() { 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]; @@ -496,6 +499,7 @@ void SoundManager::listenerSynchronize(Serializer &s) { /*--------------------------------------------------------------------------*/ SoundManager &SoundManager::sfManager() { + assert(_soundManager); return *_soundManager; } @@ -584,18 +588,15 @@ void SoundManager::_sfRethinkSoundDrivers() { } if (total) { - int dataSize = !flag ? total * 28 + 30 : total * 26 + 30; - debugC(9, ktSageSound, "data Size = %d\n", dataSize); - VoiceTypeStruct *vs = new VoiceTypeStruct(); sfManager()._voiceTypeStructPtrs[idx] = vs; if (!flag) { vs->_voiceType = VOICETYPE_0; - vs->_field1 = total; + vs->_total = total; } else { vs->_voiceType = VOICETYPE_1; - vs->_field1 = vs->_numVoices = total; + vs->_total = vs->_numVoices = total; } for (Common::List::iterator i = sfManager()._installedDrivers.begin(); @@ -608,6 +609,8 @@ void SoundManager::_sfRethinkSoundDrivers() { byte byteVal = *groupData++; if (byteVal == idx) { + ++groupData; + if (!flag) { while ((byteVal = *groupData++) != 0xff) { VoiceStructEntry ve; @@ -628,7 +631,7 @@ void SoundManager::_sfRethinkSoundDrivers() { VoiceStructEntry ve; ve._voiceNum = idx; ve._driver = driver; - ve._type1._field4 = 0xff; + ve._type1._field4 = -1; ve._type1._field5 = 0; ve._type1._field6 = 0; ve._type1._sound = NULL; @@ -642,6 +645,8 @@ void SoundManager::_sfRethinkSoundDrivers() { if (*groupData++ != 0) { while (*groupData != 0xff) ++groupData; + } else { + groupData += 2; } } } @@ -1171,6 +1176,8 @@ void SoundManager::_sfRethinkVoiceTypes() { } } } + + --sfManager()._serverSuspendedCount; } void SoundManager::_sfUpdateVolume(Sound *sound) { @@ -1287,7 +1294,7 @@ void SoundManager::_sfUnInstallDriver(SoundDriver *driver) { } void SoundManager::_sfInstallPatchBank(SoundDriver *driver, const byte *bankData) { - driver->installPatchBank(bankData); + driver->installPatch(bankData); } /** @@ -1392,7 +1399,6 @@ void Sound::play(int soundNum) { } void Sound::stop() { - _soundManager->removeFromPlayList(this); _unPrime(); } @@ -1458,7 +1464,8 @@ void Sound::_unPrime() { } _trackInfo._numTracks = 0; - _soundManager->removeFromSoundList(this); + if (_soundManager) + _soundManager->removeFromSoundList(this); _primed = false; _stoppedAsynchronously = false; @@ -1738,7 +1745,8 @@ void Sound::_soPrimeChannelData() { int mode = *d; int channelNum = (int8)*(d + 1); assert((channelNum >= 0) && (channelNum < 16)); - + + _trkChannel[idx] = channelNum; _chProgram[idx] = *(d + 10); _chModulation[idx] = 0; _chVolume[idx] = *(d + 11); @@ -1784,6 +1792,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { 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; @@ -1847,7 +1856,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { if (chFlags & 0x10) _soProc42(vtStruct, channelNum, chVoiceType, v); else - _soProc32(vtStruct, channelNum, chVoiceType, v); + _soProc32(vtStruct, channelNum, chVoiceType, v, b); } else if (voiceNum != -1) { assert(driver); driver->proc20(voiceNum, chVoiceType); @@ -2011,7 +2020,7 @@ void Sound::_soUpdateDamper(VoiceTypeStruct *voiceType, int channelNum, VoiceTyp } } -void Sound::_soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0) { +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; @@ -2021,7 +2030,7 @@ void Sound::_soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voice vtStruct->_entries[entryIndex]._type1._field4 = v0; vtStruct->_entries[entryIndex]._type1._field5 = 0; - driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, _chProgram[channelNum]); + driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, _chProgram[channelNum], v0, v1); } } @@ -2039,8 +2048,7 @@ void Sound::_soProc42(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voice vtStruct->_entries[entryIndex]._type1._field4 = v0; vtStruct->_entries[entryIndex]._type1._field5 = 0; - driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, voiceType, - _channelData[trackCtr], this, 0x7f, 0xff, 0xE); + driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, -1, v0, 0x7F); driver->proc42(vtStruct->_entries[entryIndex]._voiceNum, voiceType, 0); } break; @@ -2168,8 +2176,7 @@ void Sound::_soServiceTrackType1(int trackIndex, const byte *channelData) { vtStruct->_entries[entryIndex]._type1._field4 = *(channelData + 1); vtStruct->_entries[entryIndex]._type1._field5 = 0; - driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, voiceType, - _channelData[trackIndex], this, 0x7f, 0xff, 0xE); + driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, -1, *(channelData + 1), 0x7f); } } else { @@ -2295,9 +2302,34 @@ SoundDriver::SoundDriver() { const byte adlib_group_data[] = { 1, 1, 9, 1, 0xff }; -AdlibSoundDriver::AdlibSoundDriver() { +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; @@ -2305,6 +2337,252 @@ AdlibSoundDriver::AdlibSoundDriver() { _groupData.pData = &adlib_group_data[0]; _mixer = _vm->_mixer; + _sampleRate = _mixer->getOutputRate(); + _opl = makeAdLibOPL(_sampleRate); + + memset(_channelVoiced, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); + 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(_v4408C, _v4408C + ADLIB_CHANNEL_COUNT, 0x2000); + memset(_v4409E, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); +} + +AdlibSoundDriver::~AdlibSoundDriver() { + DEALLOCATE(_patchData); +} + +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); +/* + * code fragment originally part of testing Adlib timer speed + write(2, 1); + write(4, 1); +*/ + return true; +} + +const GroupData *AdlibSoundDriver::getGroupData() { + return &_groupData; +} + +void AdlibSoundDriver::installPatch(const byte *data) { + _patchData = data; +} + +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]; + + // 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::proc40(int channel, int pitchBlend) { + _v4408C[channel] = pitchBlend; + setFrequency(channel); +} + +void AdlibSoundDriver::write(byte reg, byte value) { +static int num = 0; +debug("%d [%x]=%x", ++num, reg, value);//***DEBUG**** + _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)); + + 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] = *(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 + portOffset, (_portContents[0xE0 + portOffset] & 0xF0) + | (*(dataP + 16) << 1) | *(dataP + 3)); + + _v44082[channel] = *(dataP + 3); +} + +void AdlibSoundDriver::setFrequency(int channel) { + int offset, ch; + + int v = _v4408C[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 >= 128) + 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 1dc40b2e4c..fec065e0d2 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -78,24 +78,28 @@ public: const Common::String &getShortDriverDescription() { return _shortDescription; } const Common::String &getLongDriverDescription() { return _longDescription; } - virtual bool open() { return true; } - virtual void close() {} - virtual const GroupData *getGroupData() = 0; - virtual void installPatchBank(const byte *data) {} - virtual void poll() {} - virtual void setMasterVolume(int volume) {} - virtual void proc18(int al, VoiceType voiceType) {} - virtual void proc20(int al, VoiceType voiceType) {} - virtual void proc22(int al, VoiceType voiceType, int v3) {} + 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) {} // 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) {} + 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) {} - virtual void proc32(int voiceNum, int program, ...) {} // TODO: Determine params - virtual void proc38(int voiceNum, int cmd, int value) {} - virtual void proc40(int voiceNum, int pitchBlend) {} - virtual void proc42(int voiceNum, ...) {} // TODO: Determine params - virtual void updateVoice(int voiceNum) {} + 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 proc40(int channel, int pitchBlend) {} // Method #20 + virtual void proc42(int channel, int v0, int v1) {} // Method #21 }; struct VoiceStructEntryType0 { @@ -141,7 +145,7 @@ struct VoiceStructEntry { class VoiceTypeStruct { public: VoiceType _voiceType; - int _field1; + int _total; int _numVoices; int _field3; @@ -332,7 +336,7 @@ public: 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); + 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); @@ -381,16 +385,49 @@ public: 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 _v4408C[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(); - - virtual void setVolume(int volume) {} - virtual void installPatchBank(const byte *data) {} - virtual const GroupData *getGroupData() { return &_groupData; } + ~AdlibSoundDriver(); + + virtual bool open(); + virtual void close(); + virtual bool reset(); + virtual const GroupData *getGroupData(); + virtual void installPatch(const byte *data); + 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); + void proc40(int channel, int pitchBlend); }; } // End of namespace tSage -- cgit v1.2.3 From 57bae5ecd6086e024303227446af5d2c115be1fc Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 13 Jun 2011 17:50:36 +1000 Subject: TSAGE: Bugfixes for priming channel data --- engines/tsage/sound.cpp | 72 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 18 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 1976013946..30efc49e5b 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -434,15 +434,21 @@ void SoundManager::_sfUpdateVoiceStructs() { if (!vs) continue; - for (uint idx = 0; idx < vs->_entries.size(); ++idx) { - VoiceStructEntry &vse = vs->_entries[idx]; + if (vs->_voiceType == VOICETYPE_0) { + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; - if (vs->_voiceType == VOICETYPE_0) { 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 { + } + } 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; @@ -593,12 +599,13 @@ void SoundManager::_sfRethinkSoundDrivers() { if (!flag) { vs->_voiceType = VOICETYPE_0; - vs->_total = total; } else { vs->_voiceType = VOICETYPE_1; - vs->_total = vs->_numVoices = total; } + vs->_total = vs->_numVoices = total; + vs->_field3 = 0; + for (Common::List::iterator i = sfManager()._installedDrivers.begin(); i != sfManager()._installedDrivers.end(); ++i) { // Process the group data for each sound driver @@ -614,6 +621,8 @@ void SoundManager::_sfRethinkSoundDrivers() { 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; @@ -629,6 +638,8 @@ void SoundManager::_sfRethinkSoundDrivers() { for (int idx = 0; idx < byteVal; ++idx) { VoiceStructEntry ve; + memset(&ve, 0, sizeof(VoiceStructEntry)); + ve._voiceNum = idx; ve._driver = driver; ve._type1._field4 = -1; @@ -692,6 +703,7 @@ void SoundManager::_sfRethinkVoiceTypes() { vse._type1._priority = 0; vse._type1._sound2 = NULL; vse._type1._channelNum2 = 0; + vse._type1._priority2 = 0; } } } @@ -1387,6 +1399,27 @@ Sound::Sound() { _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)); + memset(_chWork, 0, SOUND_ARR_SIZE * sizeof(int)); + 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() { @@ -1744,19 +1777,22 @@ void Sound::_soPrimeChannelData() { byte *d = _channelData[idx]; int mode = *d; int channelNum = (int8)*(d + 1); - assert((channelNum >= 0) && (channelNum < 16)); - + _trkChannel[idx] = channelNum; - _chProgram[idx] = *(d + 10); - _chModulation[idx] = 0; - _chVolume[idx] = *(d + 11); - _chPan[idx] = *(d + 12); - _chDamper[idx] = 0; - _chVoiceType[idx] = _trackInfo._voiceTypes[idx]; - _chNumVoices[idx] = *(d + 6); - _chSubPriority[idx] = *(d + 7); - _chPitchBlend[idx] = 0x2000; - _chFlags[idx] = READ_LE_UINT16(d + 8); + 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; -- cgit v1.2.3 From 8ed74c61f640c368fa9ef59addbb78a8b1f97fac Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 14 Jun 2011 21:27:54 +1000 Subject: TSAGE: Bugfixes for sound channel updates --- engines/tsage/events.cpp | 5 +++++ engines/tsage/sound.cpp | 35 ++++++++++++++++++++--------------- engines/tsage/sound.h | 8 ++++---- 3 files changed, 29 insertions(+), 19 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/events.cpp b/engines/tsage/events.cpp index e889c56c4d..6149ce301d 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/sound.cpp b/engines/tsage/sound.cpp index 30efc49e5b..878d27edba 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -460,6 +460,8 @@ void SoundManager::_sfUpdateVoiceStructs() { 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) { @@ -716,8 +718,7 @@ void SoundManager::_sfRethinkVoiceTypes() { continue; _sfUpdateVoiceStructs(); - for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) - sound->_chWork[idx] = 0; + Common::set_to(sound->_chWork, sound->_chWork + SOUND_ARR_SIZE, false); for (;;) { // Scan for sub priority @@ -743,7 +744,7 @@ void SoundManager::_sfRethinkVoiceTypes() { break; int chNumVoices = sound->_chNumVoices[foundIndex]; - sound->_chWork[foundIndex] = 1; + sound->_chWork[foundIndex] = true; VoiceTypeStruct *vtStruct = sfManager()._voiceTypeStructPtrs[sound->_chVoiceType[foundIndex]]; if (!vtStruct) { @@ -770,7 +771,7 @@ void SoundManager::_sfRethinkVoiceTypes() { ++idx; } - vtStruct->_numVoices = numVoices; + vtStruct->_numVoices -= chNumVoices; continue; } else if (!foundPriority) { do { @@ -1133,7 +1134,7 @@ void SoundManager::_sfRethinkVoiceTypes() { for (uint entryIndex = 0; entryIndex < vs->_entries.size(); ++entryIndex) { VoiceStructEntryType1 &vse2 = vs->_entries[entryIndex]._type1; - if (!vse2._sound && (vse._sound3 == sound) && (vse._channelNum3 == channelNum)) { + if (!vse2._sound && (vse2._sound3 == sound) && (vse2._channelNum3 == channelNum)) { vse2._sound = sound; vse2._channelNum = channelNum; vse._channelNum = vse2._channelNum2; @@ -1170,7 +1171,7 @@ void SoundManager::_sfRethinkVoiceTypes() { 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->proc40(vs->_entries[idx2]._voiceNum, vse2._sound->_chPitchBlend[vse2._channelNum]); + driver->setPitch(vs->_entries[idx2]._voiceNum, vse2._sound->_chPitchBlend[vse2._channelNum]); } for (uint idx = 0; idx < vs->_entries.size(); ++idx) { @@ -1411,7 +1412,7 @@ Sound::Sound() { memset(_chNumVoices, 0, SOUND_ARR_SIZE * sizeof(int)); memset(_chSubPriority, 0, SOUND_ARR_SIZE * sizeof(int)); memset(_chFlags, 0, SOUND_ARR_SIZE * sizeof(int)); - memset(_chWork, 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)); @@ -1733,6 +1734,7 @@ bool Sound::_soServiceTracks() { flag = false; } + ++_timer; if (!flag) return false; else if ((_loop > 0) && (--_loop == 0)) @@ -1841,7 +1843,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { voiceType = VOICETYPE_0; } else { chVoiceType = (VoiceType)_chVoiceType[channelNum]; - vtStruct = _soundManager->_voiceTypeStructPtrs[channelNum]; + vtStruct = _soundManager->_voiceTypeStructPtrs[(int)chVoiceType]; if (vtStruct) { voiceType = vtStruct->_voiceType; @@ -1912,7 +1914,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { trkRest = (trkRest << 5) | (b & 0x1f); } - _trkRest[trackIndex] = trkRest; + _trkRest[trackIndex] = trkRest - 1; _trkIndex[trackIndex] = pData - channelData; return; } else if (!(v & 0x10)) { @@ -1935,6 +1937,9 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { _soDoTrackCommand(_trkChannel[trackIndex], cmdVal, b); if (!_soundManager->_soTimeIndexFlag) { + if (cmdVal == 7) + b = static_cast(_volume * (int)b / 127); + if (voiceType != VOICETYPE_0) { _soProc38(vtStruct, channelNum, chVoiceType, cmdVal, v); } else if (voiceNum != -1) { @@ -1979,7 +1984,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { } else if (!(v & 0x2)) { // Area #7 if (!_soundManager->_soTimeIndexFlag) { - int pitchBlend = READ_LE_UINT16(pData); + int pitchBlend = READ_BE_UINT16(pData); pData += 2; if (channelNum != -1) { @@ -2132,7 +2137,7 @@ void Sound::_soProc40(VoiceTypeStruct *vtStruct, int channelNum, int pitchBlend) SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; assert(driver); - driver->proc40(vtStruct->_entries[entryIndex]._voiceNum, pitchBlend); + driver->setPitch(vtStruct->_entries[entryIndex]._voiceNum, pitchBlend); } } } @@ -2384,7 +2389,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { memset(_v44079, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); memset(_v44082, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); _v44082[ADLIB_CHANNEL_COUNT] = 0x90; - Common::set_to(_v4408C, _v4408C + ADLIB_CHANNEL_COUNT, 0x2000); + Common::set_to(_pitchBlend, _pitchBlend + ADLIB_CHANNEL_COUNT, 0x2000); memset(_v4409E, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); } @@ -2491,8 +2496,8 @@ void AdlibSoundDriver::proc38(int channel, int cmd, int value) { } } -void AdlibSoundDriver::proc40(int channel, int pitchBlend) { - _v4408C[channel] = pitchBlend; +void AdlibSoundDriver::setPitch(int channel, int pitchBlend) { + _pitchBlend[channel] = pitchBlend; setFrequency(channel); } @@ -2579,7 +2584,7 @@ void AdlibSoundDriver::updateChannel(int channel) { void AdlibSoundDriver::setFrequency(int channel) { int offset, ch; - int v = _v4408C[channel]; + int v = _pitchBlend[channel]; if (v == 0x2000) { offset = 0; ch = _v44067[channel]; diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index fec065e0d2..77208c16e4 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -98,7 +98,7 @@ public: 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 proc40(int channel, int pitchBlend) {} // Method #20 + virtual void setPitch(int channel, int pitchBlend) {} // Method #20 virtual void proc42(int channel, int v0, int v1) {} // Method #21 }; @@ -282,7 +282,7 @@ public: int _chNumVoices[SOUND_ARR_SIZE]; int _chSubPriority[SOUND_ARR_SIZE]; int _chFlags[SOUND_ARR_SIZE]; - int _chWork[SOUND_ARR_SIZE]; + bool _chWork[SOUND_ARR_SIZE]; trackInfoStruct _trackInfo; byte *_channelData[SOUND_ARR_SIZE]; int _trkChannel[SOUND_ARR_SIZE]; @@ -404,7 +404,7 @@ private: int _v44070[ADLIB_CHANNEL_COUNT]; int _v44079[ADLIB_CHANNEL_COUNT]; int _v44082[ADLIB_CHANNEL_COUNT + 1]; - int _v4408C[ADLIB_CHANNEL_COUNT]; + int _pitchBlend[ADLIB_CHANNEL_COUNT]; int _v4409E[ADLIB_CHANNEL_COUNT]; @@ -427,7 +427,7 @@ public: 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); - void proc40(int channel, int pitchBlend); + virtual void setPitch(int channel, int pitchBlend); }; } // End of namespace tSage -- cgit v1.2.3 From f47b25810a3e49adb0d95af5e3ec074e02606c54 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 14 Jun 2011 23:02:25 +1000 Subject: TSAGE: Fix channel field copy in _sfRethinkVoiceTypes --- engines/tsage/sound.cpp | 18 +++++++++--------- engines/tsage/sound.h | 1 - 2 files changed, 9 insertions(+), 10 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 878d27edba..97c7f7133f 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -1156,8 +1156,8 @@ void SoundManager::_sfRethinkVoiceTypes() { ++idx2; VoiceStructEntryType1 &vse2 = vs->_entries[idx2]._type1; - vse2._sound = sound; - vse2._channelNum = vse._channelNum; + vse2._sound = vse._sound2; + vse2._channelNum = vse._channelNum2; vse2._priority = vse._priority2; vse._field4 = -1; vse2._field5 = 0; @@ -1941,7 +1941,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { b = static_cast(_volume * (int)b / 127); if (voiceType != VOICETYPE_0) { - _soProc38(vtStruct, channelNum, chVoiceType, cmdVal, v); + _soProc38(vtStruct, channelNum, chVoiceType, cmdVal, b); } else if (voiceNum != -1) { assert(driver); driver->proc24(voiceNum, chVoiceType, this, cmdVal, b); @@ -2117,13 +2117,13 @@ void Sound::_soProc38(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voice _soundManager->_needToRethink = true; } else { for (uint entryIndex = 0; entryIndex < vtStruct->_entries.size(); ++entryIndex) { - VoiceStructEntryType1 &vte = vtStruct->_entries[entryIndex]._type1; + VoiceStructEntry &vte = vtStruct->_entries[entryIndex]; - if ((vte._sound == this) && (vte._channelNum == channelNum)) { - SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; + if ((vte._type1._sound == this) && (vte._type1._channelNum == channelNum)) { + SoundDriver *driver = vte._driver; assert(driver); - driver->proc38(vtStruct->_entries[entryIndex]._voiceNum, cmd, value); + driver->proc38(vte._voiceNum, cmd, value); } } } @@ -2502,8 +2502,8 @@ void AdlibSoundDriver::setPitch(int channel, int pitchBlend) { } void AdlibSoundDriver::write(byte reg, byte value) { -static int num = 0; -debug("%d [%x]=%x", ++num, reg, value);//***DEBUG**** +static int num = 1; +debug("%d [%x]=%x", num++, reg, value);//***DEBUG**** _portContents[reg] = value; OPLWriteReg(_opl, reg, value); } diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 77208c16e4..de67044cd1 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -250,7 +250,6 @@ private: void _unPrime(); void orientAfterRestore(); public: - int _field0; bool _stoppedAsynchronously; int _soundResID; int _group; -- cgit v1.2.3 From c18172565b2d3589d37784b34350c05ebcbe836b Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 15 Jun 2011 00:08:40 +1000 Subject: TSAGE: Bugfix for correctly persisting patch data --- engines/tsage/sound.cpp | 11 +++++++---- engines/tsage/sound.h | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 97c7f7133f..b067898a64 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -1307,7 +1307,7 @@ void SoundManager::_sfUnInstallDriver(SoundDriver *driver) { } void SoundManager::_sfInstallPatchBank(SoundDriver *driver, const byte *bankData) { - driver->installPatch(bankData); + driver->installPatch(bankData, _vm->_memoryManager.getSize(bankData)); } /** @@ -2391,6 +2391,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { _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() { @@ -2433,8 +2434,10 @@ const GroupData *AdlibSoundDriver::getGroupData() { return &_groupData; } -void AdlibSoundDriver::installPatch(const byte *data) { - _patchData = data; +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) { @@ -2612,7 +2615,7 @@ void AdlibSoundDriver::setFrequency(int channel) { } ch -= tempVal >> 2; - if (ch >= 128) + if (ch < 0) ch = 0; } diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index de67044cd1..4bef27d2c9 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -82,7 +82,7 @@ public: 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) {} // Method #4 + 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 @@ -421,7 +421,7 @@ public: virtual void close(); virtual bool reset(); virtual const GroupData *getGroupData(); - virtual void installPatch(const byte *data); + 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); -- cgit v1.2.3 From 2fe865c89142d3ef528a6ab3d43180cc95dd99bb Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 15 Jun 2011 00:25:41 +1000 Subject: TSAGE: Bugfix to load correct patch bank for Adlib --- engines/tsage/sound.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index b067898a64..bc1e87d30a 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -193,7 +193,7 @@ void SoundManager::installDriver(int driverNum) { case ROLAND_DRIVER_NUM: case ADLIB_DRIVER_NUM: { // Handle loading bank infomation - byte *bankData = _resourceManager->getResource(RES_BANK, ROLAND_DRIVER_NUM, 0, true); + byte *bankData = _resourceManager->getResource(RES_BANK, driverNum, 0, true); if (bankData) { // Install the patch bank data _sfInstallPatchBank(driver, bankData); @@ -2463,6 +2463,8 @@ void AdlibSoundDriver::proc32(int channel, int program, int v0, int v1) { 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); -- cgit v1.2.3 From 28e236dc6867036f7de2c6de6c8bb6ec8cef430d Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 15 Jun 2011 01:17:47 +1000 Subject: TSAGE: Bugfixes for sound channel updates --- engines/tsage/sound.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index bc1e87d30a..ad39f72364 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -2562,6 +2562,7 @@ void AdlibSoundDriver::updateChannel(int channel) { 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)) @@ -2576,11 +2577,12 @@ void AdlibSoundDriver::updateChannel(int channel) { write(portNum, portValue); write(0x40 + portOffset, (_portContents[0x40 + portOffset] & 0x3f) | (*(dataP + 22) << 6)); - _v44079[channel] = *(dataP + 23); + _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 + portOffset, (_portContents[0xE0 + portOffset] & 0xF0) + + write(0xC0 + channel, (_portContents[0xC0 + channel] & 0xF0) | (*(dataP + 16) << 1) | *(dataP + 3)); _v44082[channel] = *(dataP + 3); -- cgit v1.2.3 From a7ee13a1ec6fab12374b784bd7b0c8335e184ea5 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 15 Jun 2011 01:26:01 +1000 Subject: TSAGE: Properly destroy OPL instance on shutdown --- engines/tsage/sound.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index ad39f72364..f8f0cf6019 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -2396,6 +2396,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { AdlibSoundDriver::~AdlibSoundDriver() { DEALLOCATE(_patchData); + OPLDestroy(_opl); } bool AdlibSoundDriver::open() { -- cgit v1.2.3 From c6ae2acae5750674f8291624d99838281954ebe1 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 16 Jun 2011 18:44:37 +1000 Subject: TSAGE: Added correct 5000 byte MD5 for Ringworld Demo #2 --- engines/tsage/detection_tables.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/detection_tables.h b/engines/tsage/detection_tables.h index fb97e40449..4cd74ff13d 100644 --- a/engines/tsage/detection_tables.h +++ b/engines/tsage/detection_tables.h @@ -66,14 +66,13 @@ static const tSageGameDescription gameDescriptions[] = { GType_Ringworld, GF_FLOPPY | GF_DEMO }, -#if 0 - // FIXME: Compute new MD5s based on 5000 bytes instead of 0 (unlimited) + // Ringworld English Floppy Demo #2 version { { "ring", "Floppy Demo", - AD_ENTRY1s("demoring.rlb", "9ecf48e088a0d475778fab480b3dbdd0", 832206), + AD_ENTRY1s("demoring.rlb", "64050e1806203b15bb03876140eb4f56", 832206), Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, @@ -82,6 +81,7 @@ static const tSageGameDescription gameDescriptions[] = { GType_Ringworld, GF_FLOPPY | GF_DEMO | GF_ALT_REGIONS }, +#if 0 // FIXME: Compute new MD5s based on 5000 bytes instead of 0 (unlimited) // Blue Force floppy { -- cgit v1.2.3 From 15bc708610822d98133ff5fefb52ca55fa8ddd83 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 16 Jun 2011 22:00:33 +1000 Subject: TSAGE: Bugfix for _sfRethinkVoiceTypes type 1 handling --- engines/tsage/sound.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index f8f0cf6019..61254bb21f 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -778,6 +778,7 @@ void SoundManager::_sfRethinkVoiceTypes() { int maxPriority = 0; for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) maxPriority = MAX(maxPriority, vtStruct->_entries[idx]._type1._priority2); + if (!maxPriority) { _sfUpdateVoiceStructs2(); break; @@ -793,11 +794,11 @@ void SoundManager::_sfRethinkVoiceTypes() { } } while (chNumVoices > numVoices); - int voicesCtr = 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 = idx; + vtStruct->_entries[idx]._type1._channelNum2 = foundIndex; vtStruct->_entries[idx]._type1._priority2 = foundPriority; --voicesCtr; } @@ -2509,7 +2510,17 @@ void AdlibSoundDriver::setPitch(int channel, int pitchBlend) { void AdlibSoundDriver::write(byte reg, byte value) { static int num = 1; -debug("%d [%x]=%x", num++, reg, value);//***DEBUG**** +/* + if (((num - 1) % 8) == 0) + debugN("\n9800:%.4x ", (num - 1) * 2 + 2); + + debugN("%.2x %.2x ", reg, value); + ++num; +*/ +debugN("%d [%x]=%x ", num++, reg, value);//***DEBUG**** + for (int idx = 0; idx < 16; ++idx) debugN("%d", _channelVoiced[idx] ? 1 : 0); + debugN("\n"); + _portContents[reg] = value; OPLWriteReg(_opl, reg, value); } -- cgit v1.2.3 From 7428e646d51ae0c666621fe0f407ad1096c6566e Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 16 Jun 2011 23:30:15 +1000 Subject: TSAGE: Minor bugfix to sound fading code --- engines/tsage/sound.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 61254bb21f..79cd08b6fc 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -382,7 +382,7 @@ void SoundManager::_sfProcessFading() { sfManager()._needToRethink = true; } - if (s->_fadeDest != 255) { + if (s->_fadeDest != -1) { if (s->_fadeCounter != 0) --s->_fadeCounter; else { @@ -2382,7 +2382,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { _sampleRate = _mixer->getOutputRate(); _opl = makeAdLibOPL(_sampleRate); - memset(_channelVoiced, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); + 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)); @@ -2518,7 +2518,7 @@ static int num = 1; ++num; */ debugN("%d [%x]=%x ", num++, reg, value);//***DEBUG**** - for (int idx = 0; idx < 16; ++idx) debugN("%d", _channelVoiced[idx] ? 1 : 0); + for (int idx = 0; idx < ADLIB_CHANNEL_COUNT; ++idx) debugN("%d", _channelVoiced[idx] ? 1 : 0); debugN("\n"); _portContents[reg] = value; -- cgit v1.2.3 From 1ef7e958201a6a5f4d99071944fa1048fbf5357f Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Fri, 29 Apr 2011 23:15:33 -0500 Subject: TSAGE: flag all WIP games with ADGF_UNSTABLE all --- engines/tsage/detection_tables.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/detection_tables.h b/engines/tsage/detection_tables.h index 4cd74ff13d..2b64222425 100644 --- a/engines/tsage/detection_tables.h +++ b/engines/tsage/detection_tables.h @@ -32,7 +32,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("ring.rlb", "466f0e6492d9d0f34d35c5cd088de90f", 37847618), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_Ringworld, @@ -46,7 +46,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("ring.rlb", "7b7f0c5b37b58fa5ec06ebb2ca0d0d9d", 8438770), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_Ringworld, @@ -91,7 +91,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("blue.rlb", "17c3993415e8a2cf93040eef7e88ec93", 1156508), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_BlueForce, -- cgit v1.2.3 From 4de14b0dbc593db9bbccba9fb28a1ec0f589e56b Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 19 Jun 2011 13:30:29 +1000 Subject: TSAGE: Fixed problem with number of voices not being reset --- engines/tsage/sound.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 79cd08b6fc..5531ad9843 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -707,6 +707,9 @@ void SoundManager::_sfRethinkVoiceTypes() { vse._type1._channelNum2 = 0; vse._type1._priority2 = 0; } + + // Reset the number of voices available + vs->_numVoices = vs->_total; } } @@ -2058,6 +2061,7 @@ void Sound::_soUpdateDamper(VoiceTypeStruct *voiceType, int channelNum, VoiceTyp vte._field5 = 0; driver->updateVoice(voiceType->_entries[idx]._voiceNum); } + return; } } } @@ -2424,11 +2428,10 @@ void AdlibSoundDriver::close() { bool AdlibSoundDriver::reset() { write(1, 0x20); write(4, 0x80); -/* - * code fragment originally part of testing Adlib timer speed + write(2, 1); write(4, 1); -*/ + return true; } -- cgit v1.2.3 From cc63cbcf5fe466ff72e84d1eeb34f0afd61b5714 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 19 Jun 2011 20:17:47 +1000 Subject: TSAGE: Cleaned up the write() method --- engines/tsage/sound.cpp | 12 ------------ 1 file changed, 12 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 5531ad9843..4494656d46 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -2512,18 +2512,6 @@ void AdlibSoundDriver::setPitch(int channel, int pitchBlend) { } void AdlibSoundDriver::write(byte reg, byte value) { -static int num = 1; -/* - if (((num - 1) % 8) == 0) - debugN("\n9800:%.4x ", (num - 1) * 2 + 2); - - debugN("%.2x %.2x ", reg, value); - ++num; -*/ -debugN("%d [%x]=%x ", num++, reg, value);//***DEBUG**** - for (int idx = 0; idx < ADLIB_CHANNEL_COUNT; ++idx) debugN("%d", _channelVoiced[idx] ? 1 : 0); - debugN("\n"); - _portContents[reg] = value; OPLWriteReg(_opl, reg, value); } -- cgit v1.2.3 From 0efea76fff1a68a2050e9b427c383c24a0ab5d8c Mon Sep 17 00:00:00 2001 From: eriktorbjorn Date: Sun, 19 Jun 2011 15:13:49 +0200 Subject: TSAGE: Silence GCC warnings (hopefully without breaking anything) There is one remaining warning about 'maxPriority' being set but not tested in one of the loops in _sfRethinkSoundDrivers(), but I'm uncertain about that one. Looks like it could be an actual engine bug. --- engines/tsage/sound.cpp | 24 ++++++++++++++---------- engines/tsage/sound.h | 3 ++- 2 files changed, 16 insertions(+), 11 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 4494656d46..88b2c2abb2 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -232,19 +232,20 @@ void SoundManager::unInstallDriver(int driverNum) { // Mute any loaded sounds disableSoundServer(); - for (Common::List::iterator i = _playList.begin(); i != _playList.end(); ++i) - (*i)->mute(true); + Common::List::iterator j; + for (j = _playList.begin(); j != _playList.end(); ++j) + (*j)->mute(true); // Uninstall the driver _sfUnInstallDriver(*i); // Re-orient all the loaded sounds - for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) - (*i)->orientAfterDriverChange(); + for (j = _soundList.begin(); j != _soundList.end(); ++j) + (*j)->orientAfterDriverChange(); // Unmute currently active sounds - for (Common::List::iterator i = _playList.begin(); i != _playList.end(); ++i) - (*i)->mute(false); + for (j = _playList.begin(); j != _playList.end(); ++j) + (*j)->mute(false); enableSoundServer(); } @@ -549,14 +550,16 @@ bool SoundManager::_sfIsOnPlayList(Sound *sound) { void SoundManager::_sfRethinkSoundDrivers() { // Free any existing entries - for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) { + int idx; + + for (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) { + for (idx = 0; idx < SOUND_ARR_SIZE; ++idx) { byte flag = 0xff; int total = 0; @@ -638,7 +641,7 @@ void SoundManager::_sfRethinkSoundDrivers() { byteVal = *groupData; groupData += 2; - for (int idx = 0; idx < byteVal; ++idx) { + for (idx = 0; idx < byteVal; ++idx) { VoiceStructEntry ve; memset(&ve, 0, sizeof(VoiceStructEntry)); @@ -2462,8 +2465,9 @@ void AdlibSoundDriver::proc32(int channel, int program, int v0, int v1) { int offset = READ_LE_UINT16(_patchData + program * 2); if (offset) { const byte *dataP = _patchData + offset; + int id; - for (int offset = 2, id = 0; id != READ_LE_UINT16(dataP); offset += 30, ++id) { + for (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]; diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 4bef27d2c9..105b2a43bf 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -74,6 +74,7 @@ public: int _driverResID; public: SoundDriver(); + virtual ~SoundDriver() {}; const Common::String &getShortDriverDescription() { return _shortDescription; } const Common::String &getLongDriverDescription() { return _longDescription; } @@ -415,7 +416,7 @@ private: void setFrequency(int channel); public: AdlibSoundDriver(); - ~AdlibSoundDriver(); + virtual ~AdlibSoundDriver(); virtual bool open(); virtual void close(); -- cgit v1.2.3 From 85e4e2933adcb3c9472b7a7095bb7b481a973fa0 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 19 Jun 2011 23:21:02 +1000 Subject: TSAGE: Fix signalling an action when a song stops --- engines/tsage/sound.cpp | 10 +++++----- engines/tsage/sound.h | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 88b2c2abb2..1288ba9367 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -1454,7 +1454,7 @@ void Sound::unPrime() { stop(); } -void Sound::_prime(int soundResID, bool queueFlag) { +void Sound::_prime(int soundResID, bool dontQueue) { if (_primed) unPrime(); @@ -1485,8 +1485,8 @@ void Sound::_prime(int soundResID, bool queueFlag) { _remoteReceiver = ALLOCATE(200); } - _soPrimeSound(queueFlag); - if (queueFlag) + _soPrimeSound(dontQueue); + if (!dontQueue) _soundManager->addToSoundList(this); _primed = true; @@ -1675,8 +1675,8 @@ void Sound::release() { _hold = -1; } -void Sound::_soPrimeSound(bool queueFlag) { - if (!queueFlag) { +void Sound::_soPrimeSound(bool dontQueue) { + if (!dontQueue) { _priority = (_fixedPriority != -1) ? _fixedPriority : _sndResPriority; _loop = !_fixedLoop ? _fixedLoop : _sndResLoop; _pausedCount = 0; diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 105b2a43bf..8fcb1c38ff 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -247,7 +247,7 @@ public: class Sound: public EventHandler { private: - void _prime(int soundResID, bool queueFlag); + void _prime(int soundResID, bool dontQueue); void _unPrime(); void orientAfterRestore(); public: @@ -329,7 +329,7 @@ public: void orientAfterDriverChange(); // _so methods - void _soPrimeSound(bool queueFlag); + void _soPrimeSound(bool dontQueue); void _soSetTimeIndex(uint timeIndex); bool _soServiceTracks(); void _soPrimeChannelData(); -- cgit v1.2.3 From 88913c0139ac6d1dfb356d3048702b7bc8ef4079 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 20 Jun 2011 00:59:48 +0200 Subject: ALL: Remove trailing whitespaces This tries to make our code a bit more compliant with our code formatting conventions. For future use, this is the command I used: git ls-files "*.cpp" "*.h" | xargs sed -i -e 's/[ \t]*$//' --- engines/tsage/blueforce_logic.cpp | 2 +- engines/tsage/debugger.cpp | 8 +-- engines/tsage/dialogs.cpp | 2 +- engines/tsage/events.cpp | 4 +- engines/tsage/globals.cpp | 2 +- engines/tsage/graphics.cpp | 4 +- engines/tsage/ringworld_demo.cpp | 6 +-- engines/tsage/ringworld_logic.cpp | 38 ++++++------- engines/tsage/ringworld_scenes1.cpp | 2 +- engines/tsage/ringworld_scenes1.h | 4 +- engines/tsage/ringworld_scenes3.cpp | 2 +- engines/tsage/ringworld_scenes5.cpp | 4 +- engines/tsage/sound.cpp | 104 ++++++++++++++++++------------------ engines/tsage/sound.h | 2 +- 14 files changed, 92 insertions(+), 92 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/blueforce_logic.cpp b/engines/tsage/blueforce_logic.cpp index 9813bef6f7..d266d5e1d9 100644 --- a/engines/tsage/blueforce_logic.cpp +++ b/engines/tsage/blueforce_logic.cpp @@ -30,7 +30,7 @@ namespace tSage { void BlueForceGame::start() { // Start the game _globals->_sceneManager.changeScene(20); - + _globals->_events.setCursor(CURSOR_WALK); } diff --git a/engines/tsage/debugger.cpp b/engines/tsage/debugger.cpp index 5288c98b72..9277fd429a 100644 --- a/engines/tsage/debugger.cpp +++ b/engines/tsage/debugger.cpp @@ -63,7 +63,7 @@ bool Debugger::Cmd_Scene(int argc, const char **argv) { if (argc < 2) { DebugPrintf("Usage: %s [prior scene #]\n", argv[0]); return true; - } + } if (argc == 3) _globals->_sceneManager._sceneNumber = strToInt(argv[2]); @@ -222,7 +222,7 @@ bool Debugger::Cmd_ListObjects(int argc, const char **argv) { DebugPrintf("Usage: %s\n", argv[0]); return true; } - + DebugPrintf("Available objects for this game are:\n"); DebugPrintf("0 - Stunner\n"); DebugPrintf("1 - Scanner\n"); @@ -393,7 +393,7 @@ bool Debugger::Cmd_Hotspots(int argc, const char **argv) { // Lock the background surface for access Graphics::Surface destSurface = _globals->_sceneManager._scene->_backSurface.lockSurface(); - + // Iterate through the scene items SynchronizedList::iterator i; for (i = _globals->_sceneItems.reverse_begin(); i != _globals->_sceneItems.end(); --i, ++colIndex) { @@ -418,7 +418,7 @@ bool Debugger::Cmd_Hotspots(int argc, const char **argv) { LineSliceSet set = r.getLineSlices(y); for (uint p = 0; p < set.items.size(); ++p) - destSurface.hLine(set.items[p].xs - sceneBounds.left, y - sceneBounds.top, + destSurface.hLine(set.items[p].xs - sceneBounds.left, y - sceneBounds.top, set.items[p].xe - sceneBounds.left - 1, colIndex); } } diff --git a/engines/tsage/dialogs.cpp b/engines/tsage/dialogs.cpp index c1bd1d027f..86fbbc8e43 100644 --- a/engines/tsage/dialogs.cpp +++ b/engines/tsage/dialogs.cpp @@ -43,7 +43,7 @@ MessageDialog::MessageDialog(const Common::String &message, const Common::String const Common::String &btn2Message) : GfxDialog() { // Set up the message addElements(&_msg, &_btn1, NULL); - + _msg.set(message, 200, ALIGN_LEFT); _msg._bounds.moveTo(0, 0); _defaultButton = &_btn1; diff --git a/engines/tsage/events.cpp b/engines/tsage/events.cpp index 50077fecaf..94c074a50b 100644 --- a/engines/tsage/events.cpp +++ b/engines/tsage/events.cpp @@ -282,7 +282,7 @@ void EventsClass::hideCursor() { setCursor(CURSOR_NONE); } -bool EventsClass::isCursorVisible() const { +bool EventsClass::isCursorVisible() const { return !_globals->getFlag(122); } @@ -312,7 +312,7 @@ void EventsClass::delay(int numFrames) { void EventsClass::listenerSynchronize(Serializer &s) { s.syncAsUint32LE(_frameNumber); s.syncAsUint32LE(_prevDelayFrame); - + if (s.getVersion() >= 5) { s.syncAsSint16LE(_currentCursor); s.syncAsSint16LE(_lastCursor); diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index b0f6db53c6..e54f1073b0 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -140,7 +140,7 @@ void Globals::synchronize(Serializer &s) { s.syncAsSint32LE(_gfxColors.foreground); s.syncAsSint32LE(_fontColors.background); s.syncAsSint32LE(_fontColors.foreground); - + if (s.getVersion() >= 4) { s.syncAsByte(_unkColor1); s.syncAsByte(_unkColor2); diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp index 25dc897ecd..23f5f22573 100644 --- a/engines/tsage/graphics.cpp +++ b/engines/tsage/graphics.cpp @@ -846,7 +846,7 @@ void GfxButton::setDefaults() { gfxManager._font.getStringBounds(_message.c_str(), tempRect, 240); tempRect.right = ((tempRect.right + 15) / 16) * 16; - // Set the button bounds + // Set the button bounds tempRect.collapse(-_globals->_gfxEdgeAdjust, -_globals->_gfxEdgeAdjust); if (_vm->getFeatures() & GF_CD) --tempRect.top; @@ -866,7 +866,7 @@ void GfxButton::draw() { // Set the font and color gfxManager._font.setFontNumber(_fontNumber); - // + // gfxManager._font._colors.foreground = this->_unkColor1; gfxManager._font._colors2.background = this->_unkColor2; gfxManager._font._colors2.foreground = this->_unkColor3; diff --git a/engines/tsage/ringworld_demo.cpp b/engines/tsage/ringworld_demo.cpp index 4f905d5bec..fa7511808f 100644 --- a/engines/tsage/ringworld_demo.cpp +++ b/engines/tsage/ringworld_demo.cpp @@ -30,7 +30,7 @@ namespace tSage { void RingworldDemoGame::start() { // Start the demo's single scene _globals->_sceneManager.changeScene(1); - + _globals->_events.setCursor(CURSOR_NONE); } @@ -108,12 +108,12 @@ void RingworldDemoScene::signal() { _actor4.postInit(); _actor5.postInit(); _actor6.postInit(); - + setAction(&_sequenceManager, this, 22, &_actor1, &_actor2, &_actor3, &_actor4, &_actor5, &_actor6, NULL); } void RingworldDemoScene::process(Event &event) { - + } } // End of namespace tSage diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld_logic.cpp index 4c60e5fea9..2b5b84ab64 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld_logic.cpp @@ -268,7 +268,7 @@ void SceneArea::setup(int resNum, int rlbNum, int subNum, int actionId) { } void SceneArea::draw2() { - _surface.draw(Common::Point(_bounds.left, _bounds.top)); + _surface.draw(Common::Point(_bounds.left, _bounds.top)); } void SceneArea::display() { @@ -619,7 +619,7 @@ void SpeakerSKL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(203, 120)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(7013); _object2.setStrip2(1); @@ -651,7 +651,7 @@ void SpeakerQL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(128, 146)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(2612); _object2.setStrip2(1); @@ -684,7 +684,7 @@ void SpeakerSR::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(224, 198)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(2813); _object2.setStrip2(1); @@ -725,7 +725,7 @@ void SpeakerSL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(95, 198)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(2812); _object2.setStrip2(1); @@ -757,7 +757,7 @@ void SpeakerQR::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(191, 146)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(2613); _object2.setStrip2(1); @@ -789,7 +789,7 @@ void SpeakerQU::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(116, 120)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(7021); _object2.setStrip2(1); @@ -818,7 +818,7 @@ void SpeakerCR::setText(const Common::String &msg) { _object1.fixPriority(255); _object1.setPosition(Common::Point(219, 168)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(9011); _object2.setStrip2(1); @@ -847,7 +847,7 @@ void SpeakerMR::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(220, 143)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(2713); _object2.setStrip2(1); @@ -879,7 +879,7 @@ void SpeakerSAL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(185, 200)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(2853); _object2.setStrip2(1); @@ -910,7 +910,7 @@ void SpeakerML::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(99, 143)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(2712); _object2.setStrip2(1); @@ -941,7 +941,7 @@ void SpeakerCHFL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(205, 116)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(4113); _object2.setStrip2(1); @@ -972,7 +972,7 @@ void SpeakerCHFR::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(103, 116)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(4112); _object2.setStrip2(1); @@ -1003,7 +1003,7 @@ void SpeakerPL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(107, 117)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(4062); _object2.setStrip2(1); @@ -1048,7 +1048,7 @@ void SpeakerPR::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(212, 117)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(4063); _object2.setStrip2(2); @@ -1093,7 +1093,7 @@ void SpeakerCDR::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(208, 97)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(4163); _object2.setStrip2(2); @@ -1124,7 +1124,7 @@ void SpeakerCDL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(112, 97)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(4162); _object2.setStrip2(2); @@ -1155,7 +1155,7 @@ void SpeakerFLL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(216, 129)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(5223); _object2.setStrip2(1); @@ -1186,7 +1186,7 @@ void SpeakerBatR::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(137, 122)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(5361); _object2.setStrip2(1); diff --git a/engines/tsage/ringworld_scenes1.cpp b/engines/tsage/ringworld_scenes1.cpp index 9f8aedbfc1..717841d4fc 100644 --- a/engines/tsage/ringworld_scenes1.cpp +++ b/engines/tsage/ringworld_scenes1.cpp @@ -2890,7 +2890,7 @@ void Scene6100::Action3::signal() { scene->_sunflower3.hide(); scene->_rocks.hide(); scene->_sceneText.hide(); - + _globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(8120, this); break; diff --git a/engines/tsage/ringworld_scenes1.h b/engines/tsage/ringworld_scenes1.h index 712a16c612..283cf68e07 100644 --- a/engines/tsage/ringworld_scenes1.h +++ b/engines/tsage/ringworld_scenes1.h @@ -272,7 +272,7 @@ class Scene50 : public Scene { public: virtual void signal(); }; - + /* Objects */ class Object1 : public SceneObject { public: @@ -312,7 +312,7 @@ public: virtual void dispatch(); }; -class Scene60 : public Scene { +class Scene60 : public Scene { class Action1 : public Action { public: virtual void signal(); diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index 5d2732d36c..824a96a18b 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -1962,7 +1962,7 @@ void Scene2100::signal() { void Scene2100::synchronize(Serializer &s) { Scene::synchronize(s); if (s.getVersion() >= 3) - s.syncAsSint16LE(_sitFl); + s.syncAsSint16LE(_sitFl); } /*-------------------------------------------------------------------------- diff --git a/engines/tsage/ringworld_scenes5.cpp b/engines/tsage/ringworld_scenes5.cpp index c884f9f6e4..fccc7e1b50 100644 --- a/engines/tsage/ringworld_scenes5.cpp +++ b/engines/tsage/ringworld_scenes5.cpp @@ -1921,7 +1921,7 @@ void Scene4045::postInit(SceneObjectList *OwnerList) { _miranda.setStrip(3); _miranda.setFrame(2); _miranda.changeZoom(-1); - + _miranda.setPosition(Common::Point(66, 209)); _globals->_sceneItems.push_back(&_miranda); } @@ -4268,7 +4268,7 @@ void Scene4301::Action1::signal() { _actionIndex = 2; break; case 10: - // Puzzle: Wrong code + // Puzzle: Wrong code _globals->_events.setCursor(CURSOR_NONE); scene->_soundHandler.play(337); if (scene->_hotspot3._flags & OBJFLAG_HIDE) diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 1288ba9367..0c0d93be03 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -205,7 +205,7 @@ void SoundManager::installDriver(int driverNum) { // Unmute currently active sounds for (Common::List::iterator i = _playList.begin(); i != _playList.end(); ++i) (*i)->mute(false); - + enableSoundServer(); } break; @@ -239,14 +239,14 @@ void SoundManager::unInstallDriver(int driverNum) { // Uninstall the driver _sfUnInstallDriver(*i); - // Re-orient all the loaded sounds + // Re-orient all the loaded sounds for (j = _soundList.begin(); j != _soundList.end(); ++j) (*j)->orientAfterDriverChange(); // Unmute currently active sounds for (j = _playList.begin(); j != _playList.end(); ++j) (*j)->mute(false); - + enableSoundServer(); } } @@ -361,7 +361,7 @@ void SoundManager::_sfSoundServer() { } while (sfManager()._serverSuspendedCount > 0); // Poll all sound drivers in case they need it - for (Common::List::iterator i = sfManager()._installedDrivers.begin(); + for (Common::List::iterator i = sfManager()._installedDrivers.begin(); i != sfManager()._installedDrivers.end(); ++i) { (*i)->poll(); } @@ -479,7 +479,7 @@ void SoundManager::_sfUpdateVoiceStructs2() { vse._priority2 = vse._priority; } } - } + } } /*--------------------------------------------------------------------------*/ @@ -532,7 +532,7 @@ void SoundManager::_sfAddToPlayList(Sound *sound) { _sfRethinkVoiceTypes(); --sfManager()._serverSuspendedCount; } - + void SoundManager::_sfRemoveFromPlayList(Sound *sound) { ++sfManager()._serverSuspendedCount; if (_sfDoRemoveFromPlayList(sound)) @@ -541,7 +541,7 @@ void SoundManager::_sfRemoveFromPlayList(Sound *sound) { } bool SoundManager::_sfIsOnPlayList(Sound *sound) { - ++_soundManager->_serverSuspendedCount; + ++_soundManager->_serverSuspendedCount; bool result = contains(_soundManager->_playList, sound); --_soundManager->_serverSuspendedCount; @@ -619,7 +619,7 @@ void SoundManager::_sfRethinkSoundDrivers() { while (*groupData != 0xff) { byte byteVal = *groupData++; - + if (byteVal == idx) { ++groupData; @@ -666,7 +666,7 @@ void SoundManager::_sfRethinkSoundDrivers() { } } } - } + } } } } @@ -764,7 +764,7 @@ void SoundManager::_sfRethinkVoiceTypes() { if (vtStruct->_voiceType != VOICETYPE_0) { // Type 1 int numVoices = vtStruct->_numVoices; - + if (numVoices >= chNumVoices) { int channelCount = chNumVoices, idx = 0; while (channelCount > 0) { @@ -821,7 +821,7 @@ void SoundManager::_sfRethinkVoiceTypes() { // Type 0 if (sound->_isEmpty) { uint idx = 0; - while ((idx < vtStruct->_entries.size()) && + while ((idx < vtStruct->_entries.size()) && (vtStruct->_entries[idx]._voiceNum == foundIndex)) ++idx; if (idx == vtStruct->_entries.size()) @@ -832,7 +832,7 @@ void SoundManager::_sfRethinkVoiceTypes() { 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)) { @@ -848,7 +848,7 @@ void SoundManager::_sfRethinkVoiceTypes() { vtStruct->_entries[entryIndex]._type0._field12 = 0; continue; } - + if (foundPriority != 0) continue; @@ -874,7 +874,7 @@ void SoundManager::_sfRethinkVoiceTypes() { break; } else { // Channel mode 1 handling (loc_23FAC) - + bool foundMatch = false; int entryIndex = -1; for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { @@ -894,14 +894,14 @@ void SoundManager::_sfRethinkVoiceTypes() { vtStruct->_entries[entryIndex]._type0._field12 = 0; continue; } - + if (!foundMatch) { if (foundPriority) continue; if (entryIndex == -1) { _sfUpdateVoiceStructs2(); break; - } + } } // Find the entry with the highest priority @@ -921,7 +921,7 @@ void SoundManager::_sfRethinkVoiceTypes() { entryIndex = -1; } } - + if (!foundMatch) { if (foundPriority) continue; @@ -966,12 +966,12 @@ void SoundManager::_sfRethinkVoiceTypes() { 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; + continue; } if (!foundPriority) @@ -1031,7 +1031,7 @@ void SoundManager::_sfRethinkVoiceTypes() { 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, + 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]); @@ -1105,7 +1105,7 @@ void SoundManager::_sfRethinkVoiceTypes() { 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, + 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]); @@ -1175,7 +1175,7 @@ void SoundManager::_sfRethinkVoiceTypes() { 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, + 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]); @@ -1206,13 +1206,13 @@ void SoundManager::_sfUpdateVolume(Sound *sound) { } void SoundManager::_sfDereferenceAll() { - // Orignal used handles for both the driver list and voiceStructPtrs list. This method then refreshed + // 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; + ++_soundManager->_serverSuspendedCount; int tempPriority = (sound->_fixedPriority == 255) ? sound->_sndResPriority : sound->_priority; if (sound->_priority != tempPriority) { @@ -1240,7 +1240,7 @@ void SoundManager::_sfSetMasterVol(int volume) { if (volume != _soundManager->_masterVol) { _soundManager->_masterVol = volume; - for (Common::List::iterator i = _soundManager->_installedDrivers.begin(); + for (Common::List::iterator i = _soundManager->_installedDrivers.begin(); i != _soundManager->_installedDrivers.end(); ++i) { (*i)->setMasterVolume(volume); } @@ -1283,8 +1283,8 @@ void SoundManager::_sfTerminate() { void SoundManager::_sfExtractGroupMask() { uint32 mask = 0; - for (Common::List::iterator i = sfManager()._installedDrivers.begin(); - i != sfManager()._installedDrivers.end(); ++i) + for (Common::List::iterator i = sfManager()._installedDrivers.begin(); + i != sfManager()._installedDrivers.end(); ++i) mask |= (*i)->_groupMask; _soundManager->_groupsAvail = mask; @@ -1293,7 +1293,7 @@ void SoundManager::_sfExtractGroupMask() { 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); @@ -1345,13 +1345,13 @@ bool SoundManager::_sfDoRemoveFromPlayList(Sound *sound) { break; } } - + --sfManager()._serverSuspendedCount; return result; } void SoundManager::_sfDoUpdateVolume(Sound *sound) { - ++_soundManager->_serverSuspendedCount; + ++_soundManager->_serverSuspendedCount; for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; @@ -1375,7 +1375,7 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { } } } - + --_soundManager->_serverSuspendedCount; } @@ -1408,7 +1408,7 @@ Sound::Sound() { _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)); @@ -1519,7 +1519,7 @@ void Sound::orientAfterDriverChange() { for (int idx = 0; idx < _trackInfo._numTracks; ++idx) DEALLOCATE(_channelData[idx]); - + _trackInfo._numTracks = 0; _primed = false; _prime(_soundResID, true); @@ -1723,8 +1723,8 @@ bool Sound::_soServiceTracks() { if (_isEmpty) { _soRemoteReceive(); return false; - } - + } + bool flag = true; for (int trackCtr = 0; trackCtr < _trackInfo._numTracks; ++trackCtr) { int mode = *_channelData[trackCtr]; @@ -1784,12 +1784,12 @@ void Sound::_soPrimeChannelData() { for (int idx = 0; idx < _trackInfo._numTracks; ++idx) { byte *d = _channelData[idx]; - int mode = *d; + 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; @@ -1841,7 +1841,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { int chFlags = (channelNum == -1) ? 0 : _chFlags[channelNum]; int voiceNum = -1; SoundDriver *driver = NULL; - + VoiceTypeStruct *vtStruct; VoiceType voiceType = VOICETYPE_0, chVoiceType = VOICETYPE_0; @@ -1856,7 +1856,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { voiceType = vtStruct->_voiceType; if (voiceType == VOICETYPE_0) { for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { - if (!vtStruct->_entries[idx]._type0._sound && + if (!vtStruct->_entries[idx]._type0._sound && (vtStruct->_entries[idx]._type0._channelNum != channelNum)) { voiceNum = vtStruct->_entries[idx]._voiceNum; driver = vtStruct->_entries[idx]._driver; @@ -1870,7 +1870,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { const byte *pData = channelData + _trkIndex[trackIndex]; for (;;) { - byte v = *pData++; + byte v = *pData++; if (!(v & 0x80)) { // Area #1 if (!_soundManager->_soTimeIndexFlag) { @@ -1883,7 +1883,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { driver->proc18(voiceNum, chVoiceType); } } - } + } } else if (!(v & 0x40)) { // Area #2 if (!_soundManager->_soTimeIndexFlag) { @@ -1927,7 +1927,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { } else if (!(v & 0x10)) { // Area #4 v = (v & 0xf) << 1; - + byte b = *pData++; if (b & 0x80) v |= 1; @@ -2023,7 +2023,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { } } } else { - _soSetTrackPos(trackIndex, pData - channelData, program); + _soSetTrackPos(trackIndex, pData - channelData, program); } } else { @@ -2173,7 +2173,7 @@ void Sound::_soDoTrackCommand(int channelNum, int command, int value) { 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]; @@ -2225,7 +2225,7 @@ void Sound::_soServiceTrackType1(int trackIndex, const byte *channelData) { vtStruct->_entries[entryIndex]._type1._field4 = *(channelData + 1); vtStruct->_entries[entryIndex]._type1._field5 = 0; - driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, -1, *(channelData + 1), 0x7f); + driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, -1, *(channelData + 1), 0x7f); } } else { @@ -2310,7 +2310,7 @@ void ASound::dispatch() { void ASound::play(int soundNum, Action *action, int volume) { _action = action; _cueValue = 0; - + setVol(volume); _sound.play(soundNum); } @@ -2355,14 +2355,14 @@ 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] = { +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, + 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 }; @@ -2526,7 +2526,7 @@ void AdlibSoundDriver::updateChannelVolume(int channelNum) { int level1 = !_v44082[channelNum] ? 63 - _v44070[channelNum] : 63 - v44134[volume * _v44070[channelNum] / 63]; - int portNum = v440C2[v440B0[channelNum]] + 0x40; + int portNum = v440C2[v440B0[channelNum]] + 0x40; write(portNum, (_portContents[portNum] & 0x80) | level1); portNum = v440C2[v440B9[channelNum]] + 0x40; @@ -2589,7 +2589,7 @@ void AdlibSoundDriver::updateChannel(int channel) { write(0x80 + portOffset, *(dataP + 27) | (*(dataP + 26) << 4)); write(0xE0 + portOffset, (_portContents[0xE0 + portOffset] & 0xFC) | *(dataP + 28)); - write(0xC0 + channel, (_portContents[0xC0 + channel] & 0xF0) + write(0xC0 + channel, (_portContents[0xC0 + channel] & 0xF0) | (*(dataP + 16) << 1) | *(dataP + 3)); _v44082[channel] = *(dataP + 3); @@ -2607,7 +2607,7 @@ void AdlibSoundDriver::setFrequency(int channel) { v -= 0x2000; if (v == 0x1fff) v = 0x2000; - + offset = (v / 170) & 3; ch += (v / 170) >> 2; @@ -2636,7 +2636,7 @@ void AdlibSoundDriver::setFrequency(int channel) { int dataWord = v440D4[((ch % 12) << 2) + offset]; write(0xA0 + channel, dataWord & 0xff); - write(0xB0 + channel, (_portContents[0xB0 + channel] & 0xE0) | + write(0xB0 + channel, (_portContents[0xB0 + channel] & 0xE0) | ((dataWord >> 8) & 3) | (var2 << 2)); } diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 8fcb1c38ff..4cda2cd1d9 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -372,7 +372,7 @@ public: 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 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); } -- cgit v1.2.3 From 123f2416d8074a50e2c42c83caaf94961d4c6d36 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 20 Jun 2011 19:42:13 +1000 Subject: TSAGE: Initial implementation of AudioStream interface for sound driver --- engines/tsage/events.cpp | 6 +----- engines/tsage/sound.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++++- engines/tsage/sound.h | 22 ++++++++++++++++++++- 3 files changed, 72 insertions(+), 7 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/events.cpp b/engines/tsage/events.cpp index 94c074a50b..a24f65421b 100644 --- a/engines/tsage/events.cpp +++ b/engines/tsage/events.cpp @@ -48,9 +48,8 @@ bool EventsClass::pollEvent() { _priorFrameTime = milli; ++_frameNumber; - // Update screen and allow the sound manager to process pending sounds + // Update screen g_system->updateScreen(); - SoundManager::_sfSoundServer(); } if (!g_system->getEventManager()->pollEvent(_event)) return false; @@ -299,9 +298,6 @@ 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/sound.cpp b/engines/tsage/sound.cpp index 0c0d93be03..24c64bda3c 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -51,6 +51,8 @@ SoundManager::SoundManager() { _needToRethink = false; _soTimeIndexFlag = false; + _updateTicksCounter = 0; + _eventsDelay = GAME_FRAME_TIME; } SoundManager::~SoundManager() { @@ -114,6 +116,14 @@ void SoundManager::syncSounds() { this->setMasterVol(musicVolume / 2); } +void SoundManager::update() { + ++_updateTicksCounter; + if (_updateTicksCounter > _eventsDelay) { + _sfSoundServer(); + _updateTicksCounter = 0; + } +} + Common::List &SoundManager::buildDriverList(bool detectFlag) { assert(__sndmgrReady); _availableDrivers.clear(); @@ -482,6 +492,10 @@ void SoundManager::_sfUpdateVoiceStructs2() { } } +void SoundManager::_sfUpdateCallback(void *ref) { + ((SoundManager *)ref)->update(); +} + /*--------------------------------------------------------------------------*/ void SoundManager::saveNotifier(bool postFlag) { @@ -1293,7 +1307,8 @@ void SoundManager::_sfExtractGroupMask() { bool SoundManager::_sfInstallDriver(SoundDriver *driver) { if (!driver->open()) return false; - + + driver->setUpdateCallback(_sfUpdateCallback, (void *)&sfManager()); sfManager()._installedDrivers.push_back(driver); driver->_groupOffset = driver->getGroupData(); driver->_groupMask = READ_LE_UINT32(driver->_groupOffset); @@ -2376,6 +2391,8 @@ const int v440D4[48] = { }; AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { + _upCb = NULL; + _upRef = NULL; _minVersion = 0x102; _maxVersion = 0x10A; _masterVolume = 0; @@ -2388,6 +2405,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { _mixer = _vm->_mixer; _sampleRate = _mixer->getOutputRate(); _opl = makeAdLibOPL(_sampleRate); + _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); Common::set_to(_channelVoiced, _channelVoiced + ADLIB_CHANNEL_COUNT, false); memset(_channelVolume, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); @@ -2404,6 +2422,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { AdlibSoundDriver::~AdlibSoundDriver() { DEALLOCATE(_patchData); + _mixer->stopHandle(_soundHandle); OPLDestroy(_opl); } @@ -2640,4 +2659,34 @@ void AdlibSoundDriver::setFrequency(int channel) { ((dataWord >> 8) & 3) | (var2 << 2)); } +int AdlibSoundDriver::readBuffer(int16 *buffer, const int numSamples) { + update(buffer, numSamples); + return numSamples; +} + +void AdlibSoundDriver::update(int16 *buf, int len) { + static int samplesLeft = 0; + while (len != 0) { + int count = samplesLeft; + if (count > len) { + count = len; + } + samplesLeft -= count; + len -= count; + YM3812UpdateOne(_opl, buf, count); + if (samplesLeft == 0) { + if (_upCb) { + (*_upCb)(_upRef); + } + samplesLeft = _sampleRate / 50; + } + buf += count; + } +} + +void AdlibSoundDriver::setUpdateCallback(UpdateCallback upCb, void *ref) { + _upCb = upCb; + _upRef = ref; +} + } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 4cda2cd1d9..ed93d33443 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -72,6 +72,10 @@ public: uint32 _groupMask; const GroupData *_groupOffset; int _driverResID; + + typedef void (*UpdateCallback)(void *); + UpdateCallback _upCb; + void *_upRef; public: SoundDriver(); virtual ~SoundDriver() {}; @@ -101,6 +105,8 @@ public: 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 + + virtual void setUpdateCallback(UpdateCallback upCb, void *ref) {} }; struct VoiceStructEntryType0 { @@ -171,6 +177,8 @@ public: Common::List _soundList; Common::List _availableDrivers; bool _needToRethink; + int _updateTicksCounter; + int _eventsDelay; // Misc flags bool _soTimeIndexFlag; public: @@ -181,6 +189,7 @@ public: virtual void listenerSynchronize(Serializer &s); virtual void postInit(); void syncSounds(); + void update(); static void saveNotifier(bool postFlag); void saveNotifierProc(bool postFlag); @@ -243,6 +252,7 @@ public: static void _sfProcessFading(); static void _sfUpdateVoiceStructs(); static void _sfUpdateVoiceStructs2(); + static void _sfUpdateCallback(void *ref); }; class Sound: public EventHandler { @@ -387,11 +397,12 @@ public: #define ADLIB_CHANNEL_COUNT 9 -class AdlibSoundDriver: public SoundDriver { +class AdlibSoundDriver: public SoundDriver, Audio::AudioStream { private: GroupData _groupData; Audio::Mixer *_mixer; FM_OPL *_opl; + Audio::SoundHandle _soundHandle; int _sampleRate; byte _portContents[256]; const byte *_patchData; @@ -428,6 +439,15 @@ public: virtual void updateVoice(int channel); virtual void proc38(int channel, int cmd, int value); virtual void setPitch(int channel, int pitchBlend); + virtual void setUpdateCallback(UpdateCallback upCb, void *ref); + + // AudioStream interface + virtual int readBuffer(int16 *buffer, const int numSamples); + virtual bool isStereo() const { return false; } + virtual bool endOfData() const { return false; } + virtual int getRate() const { return _sampleRate; } + + void update(int16 *buf, int len); }; } // End of namespace tSage -- cgit v1.2.3 From f8e0ff86c74e5ce24cf5f3d7b2308b810e3ebd41 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 20 Jun 2011 19:57:33 +1000 Subject: TSAGE: Bugfix for properly decrementing _disabledServerCount --- engines/tsage/sound.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 24c64bda3c..bbd1c407d2 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -215,12 +215,12 @@ void SoundManager::installDriver(int driverNum) { // Unmute currently active sounds for (Common::List::iterator i = _playList.begin(); i != _playList.end(); ++i) (*i)->mute(false); - - enableSoundServer(); } break; } } + + enableSoundServer(); } /** @@ -355,7 +355,7 @@ void SoundManager::rethinkVoiceTypes() { } void SoundManager::_sfSoundServer() { - if (!sfManager()._serverDisabledCount && !sfManager()._serverSuspendedCount) + if (sfManager()._serverDisabledCount || sfManager()._serverSuspendedCount) return; if (sfManager()._needToRethink) { -- cgit v1.2.3 From c22f824bedceca3dd89bded1bccbc8d2d1ef1b8c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 20 Jun 2011 21:09:39 +1000 Subject: TSAGE: Corrections to the sound fading code --- engines/tsage/sound.cpp | 18 +++++++----------- engines/tsage/sound.h | 8 ++++---- 2 files changed, 11 insertions(+), 15 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index bbd1c407d2..9d397c7fe5 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -398,15 +398,11 @@ void SoundManager::_sfProcessFading() { --s->_fadeCounter; else { if (s->_volume >= s->_fadeDest) { - if ((s->_fadeDest - s->_volume) > s->_fadeSteps) - s->_volume += s->_fadeSteps; - else - s->_volume = s->_fadeDest; + s->_volume = ((s->_volume - s->_fadeDest) > s->_fadeSteps) ? + s->_volume - s->_fadeSteps : s->_fadeDest; } else { - if (s->_fadeDest > s->_fadeSteps) - s->_volume -= s->_fadeSteps; - else - s->_volume = s->_fadeDest; + s->_volume = ((s->_fadeDest - s->_volume) > s->_fadeSteps) ? + s->_volume + s->_fadeSteps : s->_fadeDest; } _sfDoUpdateVolume(s); @@ -1606,7 +1602,7 @@ void Sound::mute(bool flag) { _soundManager->restartSoundServer(); } -void Sound::fade(int fadeDest, int fadeTicks, int fadeSteps, bool stopAfterFadeFlag) { +void Sound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag) { _soundManager->suspendSoundServer(); if (fadeDest > 127) @@ -2346,11 +2342,11 @@ void ASound::unPrime() { _action = NULL; } -void ASound::fade(int v1, int v2, int v3, int v4, Action *action) { +void ASound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, Action *action) { if (action) _action = action; - _sound.fade(v1, v2, v3, v4); + _sound.fade(fadeDest, fadeSteps, fadeTicks, stopAfterFadeFlag); } diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index ed93d33443..9b76cd4a06 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -323,7 +323,7 @@ public: bool isMuted() const; void pause(bool flag); void mute(bool flag); - void fade(int fadeDest, int fadeTicks, int fadeSteps, bool stopAfterFadeFlag); + void fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag); void setTimeIndex(uint32 timeIndex); uint32 getTimeIndex() const; int getCueValue() const; @@ -380,9 +380,9 @@ public: 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 fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, Action *action); + void fadeIn() { fade(127, 5, 10, false, NULL); } + void fadeOut(Action *action) { fade(0, 5, 10, true, action); } void setTimeIndex(uint32 timeIndex) { _sound.setTimeIndex(timeIndex); } uint32 getTimeIndex() const { return _sound.getTimeIndex(); } void setPri(int v) { _sound.setPri(v); } -- cgit v1.2.3 From 7c733a538c5c333041cb35975f215d3b354468ea Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 20 Jun 2011 21:30:20 +1000 Subject: TSAGE: Sound is now working! --- engines/tsage/sound.cpp | 8 +------- engines/tsage/sound.h | 2 -- 2 files changed, 1 insertion(+), 9 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 9d397c7fe5..73eaa5fb2e 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -51,8 +51,6 @@ SoundManager::SoundManager() { _needToRethink = false; _soTimeIndexFlag = false; - _updateTicksCounter = 0; - _eventsDelay = GAME_FRAME_TIME; } SoundManager::~SoundManager() { @@ -117,11 +115,7 @@ void SoundManager::syncSounds() { } void SoundManager::update() { - ++_updateTicksCounter; - if (_updateTicksCounter > _eventsDelay) { - _sfSoundServer(); - _updateTicksCounter = 0; - } + _sfSoundServer(); } Common::List &SoundManager::buildDriverList(bool detectFlag) { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 9b76cd4a06..722e33d8d4 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -177,8 +177,6 @@ public: Common::List _soundList; Common::List _availableDrivers; bool _needToRethink; - int _updateTicksCounter; - int _eventsDelay; // Misc flags bool _soTimeIndexFlag; public: -- cgit v1.2.3 From adb40844d894cd69c4c89fbaddb130a70cab6816 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 20 Jun 2011 21:42:30 +1000 Subject: TSAGE: Bugfix for crash when exiting whilst a sound is playing --- engines/tsage/sound.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 73eaa5fb2e..51a24a3c86 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -55,8 +55,11 @@ SoundManager::SoundManager() { SoundManager::~SoundManager() { if (__sndmgrReady) { - for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) - (*i)->stop(); + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ) { + Sound *s = *i; + ++i; + s->stop(); + } for (Common::List::iterator i = _installedDrivers.begin(); i != _installedDrivers.end(); ) { SoundDriver *driver = *i; ++i; -- cgit v1.2.3 From 0d485d282222e4b0ce407e1bce537acf5b7f5dd0 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 20 Jun 2011 22:33:55 +1000 Subject: TSAGE: Loop variables are meant to be integers rather than bools --- engines/tsage/sound.cpp | 10 +++++----- engines/tsage/sound.h | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 51a24a3c86..65c2c990fb 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -1395,11 +1395,11 @@ Sound::Sound() { _group = 0; _sndResPriority = 0; _fixedPriority = -1; - _sndResLoop = true; - _fixedLoop = true; + _sndResLoop = 1; + _fixedLoop = -1; _priority = 0; _volume = 127; - _loop = false; + _loop = 0; _pausedCount = 0; _mutedCount = 0; _hold = 0xff; @@ -1660,7 +1660,7 @@ void Sound::setPri(int priority) { _soundManager->updateSoundPri(this); } -void Sound::setLoop(bool flag) { +void Sound::setLoop(int flag) { _fixedLoop = flag; _soundManager->updateSoundLoop(this); } @@ -1669,7 +1669,7 @@ int Sound::getPri() const { return _priority; } -bool Sound::getLoop() { +int Sound::getLoop() { return _loop; } diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 722e33d8d4..5e89275722 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -264,8 +264,8 @@ public: int _group; int _sndResPriority; int _fixedPriority; - bool _sndResLoop; - bool _fixedLoop; + int _sndResLoop; + int _fixedLoop; int _priority; int _volume; int _loop; @@ -329,9 +329,9 @@ public: void setVol(int volume); int getVol() const; void setPri(int priority); - void setLoop(bool flag); + void setLoop(int flag); int getPri() const; - bool getLoop(); + int getLoop(); void holdAt(int amount); void release(); void orientAfterDriverChange(); @@ -384,9 +384,9 @@ public: 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); } + void setLoop(int total) { _sound.setLoop(total); } int getPri() const { return _sound.getPri(); } - bool getLoop() { return _sound.getLoop(); } + int getLoop() { return _sound.getLoop(); } void setVol(int volume) { _sound.setVol(volume); } int getVol() const { return _sound.getVol(); } void holdAt(int v) { _sound.holdAt(v); } -- cgit v1.2.3 From fcab88634d57b7db4e06e156992dc34f2c572697 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 20 Jun 2011 23:02:59 +1000 Subject: TSAGE: Replaced integer counters used as mutexes with Common::Mutex usage --- engines/tsage/sound.cpp | 82 +++++++++++++------------------------------------ engines/tsage/sound.h | 9 ++---- 2 files changed, 25 insertions(+), 66 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 65c2c990fb..42416e2bf0 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -44,8 +44,6 @@ SoundManager::SoundManager() { _groupsAvail = 0; _masterVol = 127; - _serverSuspendedCount = 0; - _serverDisabledCount = 0; _suspendedCount = 0; _driversDetected = false; _needToRethink = false; @@ -154,24 +152,6 @@ 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 */ @@ -188,7 +168,8 @@ void SoundManager::installDriver(int driverNum) { assert((_ourDrvResVersion >= driver->_minVersion) && (_ourDrvResVersion <= driver->_maxVersion)); // Mute any loaded sounds - disableSoundServer(); + Common::StackLock slock(_serverDisabledMutex); + for (Common::List::iterator i = _playList.begin(); i != _playList.end(); ++i) (*i)->mute(true); @@ -216,8 +197,6 @@ void SoundManager::installDriver(int driverNum) { break; } } - - enableSoundServer(); } /** @@ -238,7 +217,8 @@ void SoundManager::unInstallDriver(int driverNum) { // Found driver to remove // Mute any loaded sounds - disableSoundServer(); + Common::StackLock slock(_serverDisabledMutex); + Common::List::iterator j; for (j = _playList.begin(); j != _playList.end(); ++j) (*j)->mute(true); @@ -253,8 +233,6 @@ void SoundManager::unInstallDriver(int driverNum) { // Unmute currently active sounds for (j = _playList.begin(); j != _playList.end(); ++j) (*j)->mute(false); - - enableSoundServer(); } } } @@ -348,12 +326,13 @@ void SoundManager::updateSoundLoop(Sound *sound) { } void SoundManager::rethinkVoiceTypes() { + Common::StackLock slock(sfManager()._serverSuspendedMutex); _sfRethinkVoiceTypes(); } void SoundManager::_sfSoundServer() { - if (sfManager()._serverDisabledCount || sfManager()._serverSuspendedCount) - return; + Common::StackLock slock1(sfManager()._serverDisabledMutex); + Common::StackLock slock2(sfManager()._serverSuspendedMutex); if (sfManager()._needToRethink) { _sfRethinkVoiceTypes(); @@ -363,9 +342,7 @@ void SoundManager::_sfSoundServer() { } // Handle any fading if necessary - do { - _sfProcessFading(); - } while (sfManager()._serverSuspendedCount > 0); + _sfProcessFading(); // Poll all sound drivers in case they need it for (Common::List::iterator i = sfManager()._installedDrivers.begin(); @@ -533,24 +510,24 @@ int SoundManager::_sfDetermineGroup(const byte *soundData) { } void SoundManager::_sfAddToPlayList(Sound *sound) { - ++sfManager()._serverSuspendedCount; + Common::StackLock slock(sfManager()._serverSuspendedMutex); + _sfDoAddToPlayList(sound); sound->_stoppedAsynchronously = false; _sfRethinkVoiceTypes(); - --sfManager()._serverSuspendedCount; } void SoundManager::_sfRemoveFromPlayList(Sound *sound) { - ++sfManager()._serverSuspendedCount; + Common::StackLock slock(sfManager()._serverSuspendedMutex); + if (_sfDoRemoveFromPlayList(sound)) _sfRethinkVoiceTypes(); - --sfManager()._serverSuspendedCount; } bool SoundManager::_sfIsOnPlayList(Sound *sound) { - ++_soundManager->_serverSuspendedCount; + Common::StackLock slock(sfManager()._serverSuspendedMutex); + bool result = contains(_soundManager->_playList, sound); - --_soundManager->_serverSuspendedCount; return result; } @@ -679,7 +656,6 @@ void SoundManager::_sfRethinkSoundDrivers() { } void SoundManager::_sfRethinkVoiceTypes() { - ++sfManager()._serverSuspendedCount; _sfDereferenceAll(); // Pre-processing @@ -1203,8 +1179,6 @@ void SoundManager::_sfRethinkVoiceTypes() { } } } - - --sfManager()._serverSuspendedCount; } void SoundManager::_sfUpdateVolume(Sound *sound) { @@ -1219,7 +1193,7 @@ void SoundManager::_sfDereferenceAll() { } void SoundManager::_sfUpdatePriority(Sound *sound) { - ++_soundManager->_serverSuspendedCount; + Common::StackLock slock(sfManager()._serverSuspendedMutex); int tempPriority = (sound->_fixedPriority == 255) ? sound->_sndResPriority : sound->_priority; if (sound->_priority != tempPriority) { @@ -1229,8 +1203,6 @@ void SoundManager::_sfUpdatePriority(Sound *sound) { _sfRethinkVoiceTypes(); } } - - --_soundManager->_serverSuspendedCount; } void SoundManager::_sfUpdateLoop(Sound *sound) { @@ -1329,21 +1301,20 @@ void SoundManager::_sfInstallPatchBank(SoundDriver *driver, const byte *bankData * Adds the specified sound in the playing sound list, inserting in order of priority */ void SoundManager::_sfDoAddToPlayList(Sound *sound) { - ++sfManager()._serverSuspendedCount; + Common::StackLock slock2(sfManager()._serverSuspendedMutex); Common::List::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; + Common::StackLock slock(sfManager()._serverSuspendedMutex); bool result = false; for (Common::List::iterator i = sfManager()._playList.begin(); i != sfManager()._playList.end(); ++i) { @@ -1354,12 +1325,11 @@ bool SoundManager::_sfDoRemoveFromPlayList(Sound *sound) { } } - --sfManager()._serverSuspendedCount; return result; } void SoundManager::_sfDoUpdateVolume(Sound *sound) { - ++_soundManager->_serverSuspendedCount; + Common::StackLock slock(sfManager()._serverSuspendedMutex); for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; @@ -1383,8 +1353,6 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { } } } - - --_soundManager->_serverSuspendedCount; } /*--------------------------------------------------------------------------*/ @@ -1576,7 +1544,7 @@ bool Sound::isMuted() const { } void Sound::pause(bool flag) { - _soundManager->suspendSoundServer(); + Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex); if (flag) ++_pausedCount; @@ -1584,11 +1552,10 @@ void Sound::pause(bool flag) { --_pausedCount; _soundManager->rethinkVoiceTypes(); - _soundManager->restartSoundServer(); } void Sound::mute(bool flag) { - _soundManager->suspendSoundServer(); + Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex); if (flag) ++_mutedCount; @@ -1596,11 +1563,10 @@ void Sound::mute(bool flag) { --_mutedCount; _soundManager->rethinkVoiceTypes(); - _soundManager->restartSoundServer(); } void Sound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag) { - _soundManager->suspendSoundServer(); + Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex); if (fadeDest > 127) fadeDest = 127; @@ -1614,8 +1580,6 @@ void Sound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeF _fadeSteps = fadeSteps; _fadeCounter = 0; _stopAfterFadeFlag = stopAfterFadeFlag; - - _soundManager->restartSoundServer(); } void Sound::setTimeIndex(uint32 timeIndex) { @@ -1704,7 +1668,7 @@ void Sound::_soPrimeSound(bool dontQueue) { } void Sound::_soSetTimeIndex(uint timeIndex) { - ++_soundManager->_serverDisabledCount; + Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex); if (timeIndex != _timer) { _soundManager->_soTimeIndexFlag = true; @@ -1723,8 +1687,6 @@ void Sound::_soSetTimeIndex(uint timeIndex) { _soundManager->_soTimeIndexFlag = false; } - - --_soundManager->_serverDisabledCount; } bool Sound::_soServiceTracks() { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 5e89275722..be3924151b 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -24,6 +24,7 @@ #define TSAGE_SOUND_H #include "common/scummsys.h" +#include "common/mutex.h" #include "audio/audiostream.h" #include "audio/fmopl.h" #include "audio/mixer.h" @@ -170,8 +171,8 @@ public: VoiceTypeStruct *_voiceTypeStructPtrs[SOUND_ARR_SIZE]; uint32 _groupsAvail; int _masterVol; - int _serverDisabledCount; - int _serverSuspendedCount; + Common::Mutex _serverDisabledMutex; + Common::Mutex _serverSuspendedMutex; int _suspendedCount; bool _driversDetected; Common::List _soundList; @@ -201,10 +202,6 @@ public: 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); -- cgit v1.2.3 From 12fc332242413dac8fbaf440220e6f022e7e9555 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 21 Jun 2011 18:50:21 +1000 Subject: TSAGE: Fix for un-used variable in _sfRethinkVoiceTypes --- engines/tsage/sound.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 42416e2bf0..fec5518fd4 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -839,7 +839,7 @@ void SoundManager::_sfRethinkVoiceTypes() { entryIndex = -1; for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { if ((vtStruct->_entries[idx]._field1 != 0) && - (vtStruct->_entries[idx]._type0._priority2 > maxVoiceNum)) { + (vtStruct->_entries[idx]._type0._priority2 > maxPriority)) { maxPriority = vtStruct->_entries[idx]._type0._priority2; entryIndex = idx; } -- cgit v1.2.3 From fd84b0461468c5f1b7c0e4a33bc92c088ebda9c4 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 21 Jun 2011 19:44:22 +1000 Subject: TSAGE: Fixes for sound fading --- engines/tsage/sound.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index fec5518fd4..811e272086 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -1341,14 +1341,14 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { SoundDriver *driver = vse._driver; if (vs->_voiceType == VOICETYPE_0) { - if (!vse._type0._sound) { + 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) { + if (vse._type1._sound) { int vol = sound->_volume * sound->_chVolume[vse._type1._channelNum] / 127; - driver->setVolume1(voiceIndex, vse._voiceNum, 7, vol); + driver->proc38(vse._voiceNum, 7, vol); } } } -- cgit v1.2.3 From 8c6ad70158ecdf75dd4f9e405f6afcee6dfcb982 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 21 Jun 2011 21:30:57 +1000 Subject: TSAGE: Disable SFX and speech volume sliders for all games --- engines/tsage/detection_tables.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/detection_tables.h b/engines/tsage/detection_tables.h index 2b64222425..8b80edf89d 100644 --- a/engines/tsage/detection_tables.h +++ b/engines/tsage/detection_tables.h @@ -33,7 +33,7 @@ static const tSageGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, - Common::GUIO_NONE + Common::GUIO_NOSPEECH | Common::GUIO_NOSFX }, GType_Ringworld, GF_CD | GF_ALT_REGIONS @@ -47,7 +47,7 @@ static const tSageGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, - Common::GUIO_NONE + Common::GUIO_NOSPEECH | Common::GUIO_NOSFX }, GType_Ringworld, GF_FLOPPY @@ -61,7 +61,7 @@ static const tSageGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, - Common::GUIO_NONE + Common::GUIO_NOSPEECH | Common::GUIO_NOSFX }, GType_Ringworld, GF_FLOPPY | GF_DEMO @@ -76,7 +76,7 @@ static const tSageGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, - Common::GUIO_NONE + Common::GUIO_NOSPEECH | Common::GUIO_NOSFX }, GType_Ringworld, GF_FLOPPY | GF_DEMO | GF_ALT_REGIONS @@ -92,7 +92,7 @@ static const tSageGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, - Common::GUIO_NONE + Common::GUIO_NOSPEECH | Common::GUIO_NOSFX }, GType_BlueForce, GF_FLOPPY @@ -107,7 +107,7 @@ static const tSageGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NONE + Common::GUIO_NOSPEECH | Common::GUIO_NOSFX }, GType_BlueForce, GF_FLOPPY @@ -121,7 +121,7 @@ static const tSageGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NONE + Common::GUIO_NOSPEECH | Common::GUIO_NOSFX }, GType_BlueForce, GF_CD -- cgit v1.2.3 From 8aa368fe559bd19aedbbc7353b784466a0381485 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 21 Jun 2011 21:42:42 +1000 Subject: TSAGE: Fix updating the volume when changed in the Options dialog --- engines/tsage/ringworld_demo.cpp | 1 + engines/tsage/ringworld_logic.cpp | 1 + engines/tsage/sound.cpp | 14 +++++++------- engines/tsage/sound.h | 1 + 4 files changed, 10 insertions(+), 7 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/ringworld_demo.cpp b/engines/tsage/ringworld_demo.cpp index fa7511808f..b24fec98f9 100644 --- a/engines/tsage/ringworld_demo.cpp +++ b/engines/tsage/ringworld_demo.cpp @@ -72,6 +72,7 @@ void RingworldDemoGame::processEvent(Event &event) { ConfigDialog *dlg = new ConfigDialog(); dlg->runModal(); delete dlg; + _globals->_soundManager.syncSounds(); _globals->_events.setCursorFromFlag(); break; } diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld_logic.cpp index 2b5b84ab64..eece4abc29 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld_logic.cpp @@ -1441,6 +1441,7 @@ void RingworldGame::processEvent(Event &event) { ConfigDialog *dlg = new ConfigDialog(); dlg->runModal(); delete dlg; + _globals->_soundManager.syncSounds(); _globals->_events.setCursorFromFlag(); break; } diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 811e272086..c2e5ba716f 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -43,7 +43,7 @@ SoundManager::SoundManager() { _voiceTypeStructPtrs[i] = NULL; _groupsAvail = 0; - _masterVol = 127; + _newVolume = _masterVol = 127; _suspendedCount = 0; _driversDetected = false; _needToRethink = false; @@ -100,18 +100,14 @@ void SoundManager::syncSounds() { 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 + // Get the new music volume 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); } @@ -251,7 +247,7 @@ bool SoundManager::isInstalled(int driverNum) const { } void SoundManager::setMasterVol(int volume) { - _sfSetMasterVol(volume); + _newVolume = volume; } int SoundManager::getMasterVol() const { @@ -341,6 +337,10 @@ void SoundManager::_sfSoundServer() { _sfDereferenceAll(); } + // If the master volume has changed, update it + if (sfManager()._newVolume != sfManager()._masterVol) + _sfSetMasterVol(sfManager()._newVolume); + // Handle any fading if necessary _sfProcessFading(); diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index be3924151b..0da54fc179 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -171,6 +171,7 @@ public: VoiceTypeStruct *_voiceTypeStructPtrs[SOUND_ARR_SIZE]; uint32 _groupsAvail; int _masterVol; + int _newVolume; Common::Mutex _serverDisabledMutex; Common::Mutex _serverSuspendedMutex; int _suspendedCount; -- cgit v1.2.3 From 36526ef954bfd105c8a3dd143a0e68e3fb9cb6b9 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 21 Jun 2011 22:41:17 +1000 Subject: TSAGE: Bugfix for properly stopping playing sounds --- engines/tsage/sound.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index c2e5ba716f..2ecd88941d 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -1416,6 +1416,7 @@ void Sound::play(int soundNum) { } void Sound::stop() { + _globals->_soundManager.removeFromPlayList(this); _unPrime(); } @@ -2252,6 +2253,7 @@ void ASound::synchronize(Serializer &s) { SYNC_POINTER(_action); s.syncAsByte(_cueValue); + } void ASound::dispatch() { -- cgit v1.2.3 From 45e1d7aa0dc144792bf5b922d79337dec621ef81 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 21 Jun 2011 22:54:25 +1000 Subject: TSAGE: Bugfix for sound assert in scene 20 --- engines/tsage/sound.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 2ecd88941d..980e080e73 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -1808,7 +1808,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { return; int channelNum = _trkChannel[trackIndex]; - assert((channelNum >= 0) && (channelNum < SOUND_ARR_SIZE)); + assert((channelNum >= -1) && (channelNum < SOUND_ARR_SIZE)); int chFlags = (channelNum == -1) ? 0 : _chFlags[channelNum]; int voiceNum = -1; SoundDriver *driver = NULL; -- cgit v1.2.3 From 7ef6bea74ef157d57c75cf3d582c838dbc651b87 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 22 Jun 2011 18:30:59 +1000 Subject: TSAGE: Clarified Globals::_sceneListeners as Globals::_sounds --- engines/tsage/globals.cpp | 15 ++++++++++++--- engines/tsage/globals.h | 5 ++++- engines/tsage/scenes.cpp | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index e54f1073b0..34b26ec311 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -94,8 +94,8 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface _sceneObjects_queue.push_front(_sceneObjects); _prevSceneOffset = Common::Point(-1, -1); - _sceneListeners.push_back(&_soundHandler); - _sceneListeners.push_back(&_sequenceManager._soundHandler); + _sounds.push_back(&_soundHandler); + _sounds.push_back(&_sequenceManager._soundHandler); _scrollFollower = NULL; _inventory = NULL; @@ -148,7 +148,7 @@ void Globals::synchronize(Serializer &s) { } s.syncAsSint16LE(_dialogCenter.x); s.syncAsSint16LE(_dialogCenter.y); - _sceneListeners.synchronize(s); + _sounds.synchronize(s); for (int i = 0; i < 256; ++i) s.syncAsByte(_flags[i]); @@ -158,4 +158,13 @@ void Globals::synchronize(Serializer &s) { s.syncAsSint32LE(_stripNum); } +void Globals::dispatchSound(ASound *obj) { + obj->dispatch(); +} + +void Globals::dispatchSounds() { + Common::for_each(_sounds.begin(), _sounds.end(), Globals::dispatchSound); +} + + } // end of namespace tSage diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h index 3635fcc3fa..7cfec718e2 100644 --- a/engines/tsage/globals.h +++ b/engines/tsage/globals.h @@ -34,6 +34,8 @@ namespace tSage { class Globals : public SavedObject { +private: + static void dispatchSound(ASound *obj); public: GfxSurface _screenSurface; GfxManager _gfxManagerInstance; @@ -56,7 +58,7 @@ public: SoundManager _soundManager; Common::Point _dialogCenter; WalkRegions _walkRegions; - SynchronizedList _sceneListeners; + SynchronizedList _sounds; bool _flags[256]; Player _player; ASound _soundHandler; @@ -91,6 +93,7 @@ public: GfxManager &gfxManager() { return **_gfxManagers.begin(); } virtual Common::String getClassName() { return "Globals"; } virtual void synchronize(Serializer &s); + void dispatchSounds(); }; extern Globals *_globals; diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp index 4625661b62..a820a20167 100644 --- a/engines/tsage/scenes.cpp +++ b/engines/tsage/scenes.cpp @@ -55,7 +55,7 @@ void SceneManager::checkScene() { _nextSceneNumber = -1; } - Common::for_each(_globals->_sceneListeners.begin(), _globals->_sceneListeners.end(), SceneHandler::dispatchObject); + _globals->dispatchSounds(); } void SceneManager::sceneChange() { -- cgit v1.2.3 From f67f069e3f830b824f1f61db03ebbe7bddb9c19f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 22 Jun 2011 18:58:59 +1000 Subject: TSAGE: Fix sounds not getting registered in Globals::_sounds This fixes a problem in Scene 20 where the scene wasn't ending after a sound fade --- engines/tsage/sound.cpp | 10 +++++++++- engines/tsage/sound.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 980e080e73..d57aa876e2 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -302,7 +302,8 @@ void SoundManager::addToPlayList(Sound *sound) { } void SoundManager::removeFromPlayList(Sound *sound) { - _sfRemoveFromPlayList(sound); + if (_soundManager) + _sfRemoveFromPlayList(sound); } bool SoundManager::isOnPlayList(Sound *sound) { @@ -2246,6 +2247,13 @@ int Sound::_soFindSound(VoiceTypeStruct *vtStruct, int channelNum) { ASound::ASound(): EventHandler() { _action = NULL; _cueValue = -1; + if (_globals) + _globals->_sounds.push_back(this); +} + +ASound::~ASound() { + if (_globals) + _globals->_sounds.remove(this); } void ASound::synchronize(Serializer &s) { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 0da54fc179..9a8cfb3cfc 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -361,6 +361,7 @@ public: int _cueValue; ASound(); + ~ASound(); virtual void synchronize(Serializer &s); virtual void dispatch(); -- cgit v1.2.3 From 69290ef7aeba8e67a1d537fff20825b9f39a1d86 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 22 Jun 2011 19:13:36 +1000 Subject: TSAGE: Remove out of date TODO comments where applicable --- engines/tsage/core.cpp | 11 ++++------- engines/tsage/graphics.cpp | 2 +- engines/tsage/ringworld_logic.cpp | 1 - engines/tsage/ringworld_scenes1.cpp | 3 +-- engines/tsage/scenes.cpp | 3 --- engines/tsage/scenes.h | 4 +++- engines/tsage/sound.cpp | 1 - 7 files changed, 9 insertions(+), 16 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 4603379c78..76714a6f10 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -2869,8 +2869,6 @@ void Region::draw() { } void Region::uniteLine(int yp, LineSliceSet &sliceSet) { - // TODO: More properly implement like the original - // First expand the bounds as necessary to fit in the row if (_ySlices.empty()) { _bounds = Rect(sliceSet.items[0].xs, yp, sliceSet.items[sliceSet.items.size() - 1].xe, yp + 1); @@ -3024,13 +3022,12 @@ void WalkRegion::loadProcessList(byte *dataP, int dataSize, int &dataIndex, int int yp = READ_LE_UINT16(dataP + idx * 4 + 2); if (yp != y1) { /* - * Commented out: doesn't seem to be used + * Commented out: v doesn't seem to be used int v; if (idx == (dataSize - 1)) v = READ_LE_UINT16(dataP + 2); else v = process1(idx, dataP, dataSize); - warning("TODO: v not used? - %d", v); */ process2(dataIndex, x1, y1, xp, yp); ++dataIndex; @@ -3547,9 +3544,10 @@ void SceneHandler::dispatch() { if (_globals->_sceneManager._scene) _globals->_sceneManager._scene->dispatch(); - //TODO: Figure out purpose of the given list - //_globals->_regions.forEach(SceneHandler::handleListener); + // Not actually used + //_eventListeners.forEach(SceneHandler::handleListener); + // Handle pending eents Event event; while (_globals->_events.getEvent(event)) process(event); @@ -3573,7 +3571,6 @@ void SceneHandler::dispatchObject(EventHandler *obj) { } void SceneHandler::saveListener(Serializer &ser) { - warning("TODO: SceneHandler::saveListener"); } } // End of namespace tSage diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp index 23f5f22573..1d432724dc 100644 --- a/engines/tsage/graphics.cpp +++ b/engines/tsage/graphics.cpp @@ -895,7 +895,7 @@ bool GfxButton::process(Event &event) { case EVENT_KEYPRESS: if (!event.handled && (event.kbd.keycode == _keycode)) { - // TODO: Ensure momentary click operation displays + // Highlight the button momentarily highlight(); g_system->delayMillis(20); highlight(); diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld_logic.cpp index eece4abc29..1dd905b3b6 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld_logic.cpp @@ -667,7 +667,6 @@ void SpeakerQL::setText(const Common::String &msg) { /*--------------------------------------------------------------------------*/ SpeakerSR::SpeakerSR() { - // TODO: check initialization of object3 _speakerName = "SR"; _newSceneNumber = 2811; _textPos = Common::Point(10, 30); diff --git a/engines/tsage/ringworld_scenes1.cpp b/engines/tsage/ringworld_scenes1.cpp index 717841d4fc..29b7c9b997 100644 --- a/engines/tsage/ringworld_scenes1.cpp +++ b/engines/tsage/ringworld_scenes1.cpp @@ -1255,8 +1255,7 @@ void Scene40::Action7::signal() { switch (_actionIndex++) { case 0: - // TODO: check if it's rand(500) or rand(499)+500 - setDelay(_globals->_randomSource.getRandomNumber(500)); + setDelay(_globals->_randomSource.getRandomNumber(499) + 500); break; case 1: scene->_object7.postInit(); diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp index a820a20167..6352918e39 100644 --- a/engines/tsage/scenes.cpp +++ b/engines/tsage/scenes.cpp @@ -105,8 +105,6 @@ void SceneManager::sceneChange() { // Set the next scene to be active _sceneNumber = _nextSceneNumber; - // TODO: Unknown check of word_45CD3 / call to saver method - // Free any regions disposeRegions(); @@ -208,7 +206,6 @@ void SceneManager::setBackSurface() { } void SceneManager::saveListener(int saveMode) { - warning("TODO: SceneManager::saveLIstener"); } void SceneManager::loadNotifier(bool postFlag) { diff --git a/engines/tsage/scenes.h b/engines/tsage/scenes.h index b3c009c4fe..5845efaec9 100644 --- a/engines/tsage/scenes.h +++ b/engines/tsage/scenes.h @@ -71,7 +71,9 @@ public: class SceneManager : public GameHandler, public SaveListener { private: - void disposeRegions() { warning("TODO: disposeRegions()"); } + void disposeRegions() { + // No need to do anything, since regions will be freed automatically when the scene is + } Scene *getNewScene(); public: Scene *_scene; diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index d57aa876e2..dc7b6599ed 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -1869,7 +1869,6 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { if (channelNum != -1) { if (voiceType == VOICETYPE_1) { - // TODO: sub_25E32/sub_25DD8 if (chFlags & 0x10) _soProc42(vtStruct, channelNum, chVoiceType, v); else -- cgit v1.2.3 From afdfff02f1415f66856f273fcf9f30d7621d8953 Mon Sep 17 00:00:00 2001 From: eriktorbjorn Date: Wed, 22 Jun 2011 22:00:59 +0200 Subject: TSAGE: Don't crash if -x option points to an non-existing savegame. Instead, just pretend there is no spoon^H^H^H^H^H-x option. --- engines/tsage/ringworld_logic.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld_logic.cpp index 1dd905b3b6..58501172af 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld_logic.cpp @@ -1333,9 +1333,20 @@ void RingworldGame::start() { RING_INVENTORY._scanner._sceneNumber = 1; RING_INVENTORY._ring._sceneNumber = 1; + int slot = -1; + + if (ConfMan.hasKey("save_slot")) { + slot = ConfMan.getInt("save_slot"); + Common::String file = _vm->generateSaveName(slot); + Common::InSaveFile *in = _vm->_system->getSavefileManager()->openForLoading(file); + if (in) + delete in; + else + slot = -1; + } - if (ConfMan.hasKey("save_slot")) - _globals->_sceneHandler._loadGameSlot = ConfMan.getInt("save_slot"); + if (slot >= 0) + _globals->_sceneHandler._loadGameSlot = slot; else // Switch to the title screen _globals->_sceneManager.setNewScene(1000); -- cgit v1.2.3 From 52d91368af89541284fbc525ff1357c5e38cb071 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Wed, 22 Jun 2011 23:08:13 +0200 Subject: TSAGE: Fix bug in sound fading in scene 20. This was blocking progress under linux... --- engines/tsage/ringworld_scenes1.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/tsage') diff --git a/engines/tsage/ringworld_scenes1.cpp b/engines/tsage/ringworld_scenes1.cpp index 29b7c9b997..7fe2610fd7 100644 --- a/engines/tsage/ringworld_scenes1.cpp +++ b/engines/tsage/ringworld_scenes1.cpp @@ -342,7 +342,7 @@ void Scene20::Action2::signal() { } case 8: scene->_sound.release(); - scene->_sound.fadeOut(this); + _globals->_soundHandler.fadeOut(this); break; case 9: SceneItem::display(0, 0, LIST_END); -- cgit v1.2.3 From 367605d774df038166b14044a5f5ce935f244519 Mon Sep 17 00:00:00 2001 From: Julien Date: Sun, 5 Jun 2011 05:22:40 +0800 Subject: TSAGE: Allocate resource decoding buffer on the heap --- engines/tsage/resources.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/resources.cpp b/engines/tsage/resources.cpp index d24c564a1f..e6a561f3a7 100644 --- a/engines/tsage/resources.cpp +++ b/engines/tsage/resources.cpp @@ -237,8 +237,13 @@ byte *TLib::getResource(uint16 id, bool suppressErrors) { uint16 ctrCurrent = 0x102, ctrMax = 0x200; uint16 word_48050 = 0, currentToken = 0, word_48054 =0; byte byte_49068 = 0, byte_49069 = 0; - DecodeReference table[0x1000]; - for (int i = 0; i < 0x1000; ++i) { + + const uint tableSize = 0x1000; + DecodeReference *table = (DecodeReference *)malloc(tableSize * sizeof(DecodeReference)); + if (!table) + error("[TLib::getResource] Cannot allocate table buffer"); + + for (int i = 0; i < tableSize; ++i) { table[i].vByte = table[i].vWord = 0; } Common::Stack tokenList; @@ -302,6 +307,8 @@ byte *TLib::getResource(uint16 id, bool suppressErrors) { } } + free(table); + assert(bytesWritten == re->uncompressedSize); delete compStream; return dataOut; -- cgit v1.2.3 From 97137e6b27a6d64fc2ba45c0c6d1a07d027ee27c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 22 Jun 2011 23:40:25 +1000 Subject: TSAGE: Added saving/restoring of playing sounds to savegames --- engines/tsage/saveload.cpp | 6 ++- engines/tsage/saveload.h | 2 +- engines/tsage/scenes.cpp | 6 ++- engines/tsage/sound.cpp | 93 ++++++++++++++++++++++++++++++++++++++++------ engines/tsage/sound.h | 13 ++++--- 5 files changed, 100 insertions(+), 20 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/saveload.cpp b/engines/tsage/saveload.cpp index 522e40c236..b184e59c9e 100644 --- a/engines/tsage/saveload.cpp +++ b/engines/tsage/saveload.cpp @@ -21,11 +21,13 @@ */ #include "common/savefile.h" +#include "common/mutex.h" #include "graphics/palette.h" #include "graphics/scaler.h" #include "graphics/thumbnail.h" #include "tsage/globals.h" #include "tsage/saveload.h" +#include "tsage/sound.h" #include "tsage/tsage.h" namespace tSage { @@ -105,6 +107,7 @@ void Serializer::validate(int v, Common::Serializer::Version minVersion, Common::Error Saver::save(int slot, const Common::String &saveName) { assert(!getMacroRestoreFlag()); + Common::StackLock slock1(_globals->_soundManager._serverDisabledMutex); // Signal any objects registered for notification _saveNotifiers.notify(false); @@ -149,6 +152,7 @@ Common::Error Saver::save(int slot, const Common::String &saveName) { Common::Error Saver::restore(int slot) { assert(!getMacroRestoreFlag()); + Common::StackLock slock1(_globals->_soundManager._serverDisabledMutex); // Signal any objects registered for notification _loadNotifiers.notify(false); @@ -205,7 +209,7 @@ Common::Error Saver::restore(int slot) { // Final post-restore notifications _macroRestoreFlag = false; - _loadNotifiers.notify(false); + _loadNotifiers.notify(true); return Common::kNoError; } diff --git a/engines/tsage/saveload.h b/engines/tsage/saveload.h index c1c2851f28..0382e4a1fc 100644 --- a/engines/tsage/saveload.h +++ b/engines/tsage/saveload.h @@ -33,7 +33,7 @@ namespace tSage { typedef void (*SaveNotifierFn)(bool postFlag); -#define TSAGE_SAVEGAME_VERSION 5 +#define TSAGE_SAVEGAME_VERSION 6 class SavedObject; diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp index 6352918e39..18b3da2698 100644 --- a/engines/tsage/scenes.cpp +++ b/engines/tsage/scenes.cpp @@ -235,7 +235,11 @@ void SceneManager::listenerSynchronize(Serializer &s) { if (s.isLoading()) { changeScene(_sceneNumber); - checkScene(); + + if (_nextSceneNumber != -1) { + sceneChange(); + _nextSceneNumber = -1; + } } _globals->_sceneManager._scrollerRect.synchronize(s); diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index dc7b6599ed..6f061862dc 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -44,7 +44,6 @@ SoundManager::SoundManager() { _groupsAvail = 0; _newVolume = _masterVol = 127; - _suspendedCount = 0; _driversDetected = false; _needToRethink = false; @@ -53,6 +52,8 @@ SoundManager::SoundManager() { SoundManager::~SoundManager() { if (__sndmgrReady) { + Common::StackLock slock(_serverDisabledMutex); + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ) { Sound *s = *i; ++i; @@ -342,6 +343,18 @@ void SoundManager::_sfSoundServer() { if (sfManager()._newVolume != sfManager()._masterVol) _sfSetMasterVol(sfManager()._newVolume); + // If a time index has been set for any sound, fast forward to it + SynchronizedList::iterator i; + for (i = sfManager()._playList.begin(); i != sfManager()._playList.end(); ++i) { + Sound *s = *i; + if (s->_newTimeIndex != 0) { + s->mute(true); + s->_soSetTimeIndex(s->_newTimeIndex); + s->mute(false); + s->_newTimeIndex = 0; + } + } + // Handle any fading if necessary _sfProcessFading(); @@ -474,7 +487,7 @@ void SoundManager::saveNotifier(bool postFlag) { } void SoundManager::saveNotifierProc(bool postFlag) { - warning("TODO: SoundManager::saveNotifierProc"); + // Nothing needs to be done when saving the game } void SoundManager::loadNotifier(bool postFlag) { @@ -482,12 +495,37 @@ void SoundManager::loadNotifier(bool postFlag) { } void SoundManager::loadNotifierProc(bool postFlag) { - warning("TODO: SoundManager::loadNotifierProc"); + if (!postFlag) { + // Stop any currently playing sounds + if (__sndmgrReady) { + Common::StackLock slock(_serverDisabledMutex); + + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ) { + Sound *s = *i; + ++i; + s->stop(); + } + } + } else { + // Savegame is now loaded, so iterate over the sound list to prime any sounds as necessary + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) { + Sound *s = *i; + s->orientAfterRestore(); + } + } } void SoundManager::listenerSynchronize(Serializer &s) { s.validate("SoundManager"); - warning("TODO: SoundManager listenerSynchronise"); + assert(__sndmgrReady && _driversDetected); + + if (s.getVersion() < 6) + return; + + Common::StackLock slock(_serverDisabledMutex); + _playList.synchronize(s); + + _soundList.synchronize(s); } /*--------------------------------------------------------------------------*/ @@ -1188,7 +1226,7 @@ void SoundManager::_sfUpdateVolume(Sound *sound) { } void SoundManager::_sfDereferenceAll() { - // Orignal used handles for both the driver list and voiceStructPtrs list. This method then refreshed + // Orignal used handles for both the driver list and voiceTypeStructPtrs 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 } @@ -1379,6 +1417,7 @@ Sound::Sound() { _fadeCounter = 0; _stopAfterFadeFlag = false; _timer = 0; + _newTimeIndex = 0; _loopTimer = 0; _trackInfo._numTracks = 0; _primed = false; @@ -1411,6 +1450,36 @@ Sound::~Sound() { stop(); } +void Sound::synchronize(Serializer &s) { + if (s.getVersion() < 6) + return; + + assert(!_remoteReceiver); + + s.syncAsSint16LE(_soundResID); + s.syncAsByte(_primed); + s.syncAsByte(_stoppedAsynchronously); + s.syncAsSint16LE(_group); + s.syncAsSint16LE(_sndResPriority); + s.syncAsSint16LE(_fixedPriority); + s.syncAsSint16LE(_sndResLoop); + s.syncAsSint16LE(_fixedLoop); + s.syncAsSint16LE(_priority); + s.syncAsSint16LE(_volume); + s.syncAsSint16LE(_loop); + s.syncAsSint16LE(_pausedCount); + s.syncAsSint16LE(_mutedCount); + s.syncAsSint16LE(_hold); + s.syncAsSint16LE(_cueValue); + s.syncAsSint16LE(_fadeDest); + s.syncAsSint16LE(_fadeSteps); + s.syncAsUint32LE(_fadeTicks); + s.syncAsUint32LE(_fadeCounter); + s.syncAsByte(_stopAfterFadeFlag); + s.syncAsUint32LE(_timer); + s.syncAsSint16LE(_loopTimer); +} + void Sound::play(int soundNum) { prime(soundNum); _soundManager->addToPlayList(this); @@ -1436,6 +1505,7 @@ void Sound::_prime(int soundResID, bool dontQueue) { if (_primed) unPrime(); + _soundResID = soundResID; if (_soundResID != -1) { // Sound number specified _isEmpty = false; @@ -1501,12 +1571,13 @@ void Sound::orientAfterDriverChange() { _trackInfo._numTracks = 0; _primed = false; _prime(_soundResID, true); + setTimeIndex(timeIndex); } } void Sound::orientAfterRestore() { - if (_isEmpty) { + if (!_isEmpty) { int timeIndex = getTimeIndex(); _primed = false; _prime(_soundResID, true); @@ -1585,11 +1656,8 @@ void Sound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeF } void Sound::setTimeIndex(uint32 timeIndex) { - if (_primed) { - mute(true); - _soSetTimeIndex(timeIndex); - mute(false); - } + if (_primed) + _newTimeIndex = timeIndex; } uint32 Sound::getTimeIndex() const { @@ -1665,6 +1733,7 @@ void Sound::_soPrimeSound(bool dontQueue) { } _timer = 0; + _newTimeIndex = 0; _loopTimer = 0; _soPrimeChannelData(); } @@ -1685,6 +1754,8 @@ void Sound::_soSetTimeIndex(uint timeIndex) { _soundManager->_needToRethink = true; break; } + + --timeIndex; } _soundManager->_soTimeIndexFlag = false; diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 9a8cfb3cfc..4647e3c564 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -123,7 +123,6 @@ struct VoiceStructEntryType0 { int _channelNum3; int _priority3; int _field1A; - int _field1B; }; struct VoiceStructEntryType1 { @@ -166,7 +165,7 @@ private: public: bool __sndmgrReady; int _ourSndResVersion, _ourDrvResVersion; - Common::List _playList; + SynchronizedList _playList; Common::List _installedDrivers; VoiceTypeStruct *_voiceTypeStructPtrs[SOUND_ARR_SIZE]; uint32 _groupsAvail; @@ -174,9 +173,8 @@ public: int _newVolume; Common::Mutex _serverDisabledMutex; Common::Mutex _serverSuspendedMutex; - int _suspendedCount; bool _driversDetected; - Common::List _soundList; + SynchronizedList _soundList; Common::List _availableDrivers; bool _needToRethink; // Misc flags @@ -255,7 +253,6 @@ class Sound: public EventHandler { private: void _prime(int soundResID, bool dontQueue); void _unPrime(); - void orientAfterRestore(); public: bool _stoppedAsynchronously; int _soundResID; @@ -276,7 +273,8 @@ public: int _fadeTicks; int _fadeCounter; bool _stopAfterFadeFlag; - uint _timer; + uint32 _timer; + uint32 _newTimeIndex; int _loopTimer; int _chProgram[SOUND_ARR_SIZE]; int _chModulation[SOUND_ARR_SIZE]; @@ -306,6 +304,9 @@ public: Sound(); ~Sound(); + void synchronize(Serializer &s); + void orientAfterRestore(); + void play(int soundResID); void stop(); void prime(int soundResID); -- cgit v1.2.3 From 77440aadf4055d5cadf86a7be00e6c8ed51a5be7 Mon Sep 17 00:00:00 2001 From: eriktorbjorn Date: Thu, 23 Jun 2011 17:29:34 +0200 Subject: TSAGE: Silence GCC warnings. --- engines/tsage/resources.cpp | 2 +- engines/tsage/sound.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/resources.cpp b/engines/tsage/resources.cpp index e6a561f3a7..6d2c6b5837 100644 --- a/engines/tsage/resources.cpp +++ b/engines/tsage/resources.cpp @@ -243,7 +243,7 @@ byte *TLib::getResource(uint16 id, bool suppressErrors) { if (!table) error("[TLib::getResource] Cannot allocate table buffer"); - for (int i = 0; i < tableSize; ++i) { + for (uint i = 0; i < tableSize; ++i) { table[i].vByte = table[i].vWord = 0; } Common::Stack tokenList; diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 6f061862dc..8bdb2f2d4c 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -359,9 +359,9 @@ void SoundManager::_sfSoundServer() { _sfProcessFading(); // Poll all sound drivers in case they need it - for (Common::List::iterator i = sfManager()._installedDrivers.begin(); - i != sfManager()._installedDrivers.end(); ++i) { - (*i)->poll(); + for (Common::List::iterator j = sfManager()._installedDrivers.begin(); + j != sfManager()._installedDrivers.end(); ++j) { + (*j)->poll(); } } -- cgit v1.2.3 From 10ff50b9702f25bc43e7c32c7dd380b84f1bf9e3 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Fri, 24 Jun 2011 22:27:02 +0200 Subject: TSAGE: Silent a GCC warning reported by eriktorbjorn --- engines/tsage/graphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/tsage') diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp index 1d432724dc..fce9e1317d 100644 --- a/engines/tsage/graphics.cpp +++ b/engines/tsage/graphics.cpp @@ -326,7 +326,7 @@ void GfxSurface::synchronize(Serializer &s) { s.syncAsSint16LE(zero); } } else { - int w, h; + int w = 0, h = 0; s.syncAsSint16LE(w); s.syncAsSint16LE(h); -- cgit v1.2.3 From 13aa8fa79f998048fc8217b347813beba8cb0b62 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 24 Jun 2011 19:04:33 +1000 Subject: TSAGE: Fix for properly initialising the _voiceTypeStructPtrs array --- engines/tsage/sound.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 8bdb2f2d4c..f0273ddfcb 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -664,11 +664,11 @@ void SoundManager::_sfRethinkSoundDrivers() { byteVal = *groupData; groupData += 2; - for (idx = 0; idx < byteVal; ++idx) { + for (int entryIndez = 0; entryIndez < byteVal; ++entryIndez) { VoiceStructEntry ve; memset(&ve, 0, sizeof(VoiceStructEntry)); - ve._voiceNum = idx; + ve._voiceNum = entryIndez; ve._driver = driver; ve._type1._field4 = -1; ve._type1._field5 = 0; -- cgit v1.2.3 From fa97da864aeb17b46a83eead3f87a151b5bee59b Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 26 Jun 2011 09:59:58 +1000 Subject: TSAGE: Several bugfixes for sound output to match the original --- engines/tsage/sound.cpp | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index f0273ddfcb..82cd0f16bd 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -31,6 +31,23 @@ namespace tSage { static SoundManager *_soundManager = NULL; +static void dumpVoiceStruct() { + VoiceTypeStruct *vt = _soundManager->_voiceTypeStructPtrs[1]; + if (!vt) { + debug("Not setup"); + return; + } + + assert(vt->_voiceType == VOICETYPE_1); + for (uint idx = 0; idx < vt->_entries.size(); ++idx) { + VoiceStructEntryType1 &vte = vt->_entries[idx]._type1; + debug("#%d - s=%x, ch=%x, pr=%x | s2=%x, ch2=%x, pr2=%x | s3=%x, ch3=%x, pr3=%x", + idx, vte._sound, vte._channelNum, vte._priority, + vte._sound2, vte._channelNum2, vte._priority2, + vte._sound3, vte._channelNum3, vte._priority3); + } +} + /*--------------------------------------------------------------------------*/ SoundManager::SoundManager() { @@ -1166,8 +1183,7 @@ void SoundManager::_sfRethinkVoiceTypes() { if (!vse2._sound && (vse2._sound3 == sound) && (vse2._channelNum3 == channelNum)) { vse2._sound = sound; vse2._channelNum = channelNum; - vse._channelNum = vse2._channelNum2; - vse._priority = vse2._priority2; + vse2._priority = vse._priority2; vse._sound2 = NULL; break; } @@ -1188,7 +1204,7 @@ void SoundManager::_sfRethinkVoiceTypes() { vse2._sound = vse._sound2; vse2._channelNum = vse._channelNum2; vse2._priority = vse._priority2; - vse._field4 = -1; + vse2._field4 = -1; vse2._field5 = 0; vse2._field6 = 0; @@ -1213,7 +1229,7 @@ void SoundManager::_sfRethinkVoiceTypes() { SoundDriver *driver = vs->_entries[idx]._driver; assert(driver); - driver->updateVoice(voiceIndex); + driver->updateVoice(vs->_entries[idx]._voiceNum); } } } @@ -1939,7 +1955,7 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { b &= 0x7f; if (channelNum != -1) { - if (voiceType == VOICETYPE_1) { + if (voiceType != VOICETYPE_0) { if (chFlags & 0x10) _soProc42(vtStruct, channelNum, chVoiceType, v); else @@ -2484,10 +2500,7 @@ void AdlibSoundDriver::close() { bool AdlibSoundDriver::reset() { write(1, 0x20); - write(4, 0x80); - - write(2, 1); - write(4, 1); + write(1, 0x20); return true; } -- cgit v1.2.3 From c6a1051c3defc6cff4a2df5e064a63d6b586f2ae Mon Sep 17 00:00:00 2001 From: eriktorbjorn Date: Sun, 26 Jun 2011 09:06:25 +0200 Subject: TSAGE: Silence GCC warnings --- engines/tsage/sound.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 82cd0f16bd..2c00e6ec47 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -31,6 +31,7 @@ namespace tSage { static SoundManager *_soundManager = NULL; +#if 0 static void dumpVoiceStruct() { VoiceTypeStruct *vt = _soundManager->_voiceTypeStructPtrs[1]; if (!vt) { @@ -41,12 +42,13 @@ static void dumpVoiceStruct() { assert(vt->_voiceType == VOICETYPE_1); for (uint idx = 0; idx < vt->_entries.size(); ++idx) { VoiceStructEntryType1 &vte = vt->_entries[idx]._type1; - debug("#%d - s=%x, ch=%x, pr=%x | s2=%x, ch2=%x, pr2=%x | s3=%x, ch3=%x, pr3=%x", - idx, vte._sound, vte._channelNum, vte._priority, - vte._sound2, vte._channelNum2, vte._priority2, - vte._sound3, vte._channelNum3, vte._priority3); + debug("#%d - s=%p, ch=%x, pr=%x | s2=%p, ch2=%x, pr2=%x | s3=%p, ch3=%x, pr3=%x", + idx, (void *)vte._sound, vte._channelNum, vte._priority, + (void *)vte._sound2, vte._channelNum2, vte._priority2, + (void *)vte._sound3, vte._channelNum3, vte._priority3); } } +#endif /*--------------------------------------------------------------------------*/ -- cgit v1.2.3 From 6cea946f16cee1529863b0d5ca77cfbf4bfb01b1 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 27 Jun 2011 22:54:28 +1000 Subject: TSAGE: Separated the sound manager processing into it's own thread This will be necessary with the introduction of the Sound FX driver, since the sound manager will do the processing for both drivers, but each will need to do their own output in their AudioStream thread --- engines/tsage/events.h | 1 + engines/tsage/sound.cpp | 344 ++++++++++++++++++++++++++++++++++++++++++++---- engines/tsage/sound.h | 73 +++++++++- 3 files changed, 382 insertions(+), 36 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/events.h b/engines/tsage/events.h index a13455d378..e0fbd88745 100644 --- a/engines/tsage/events.h +++ b/engines/tsage/events.h @@ -37,6 +37,7 @@ enum EventType {EVENT_NONE = 0, EVENT_BUTTON_DOWN = 1, EVENT_BUTTON_UP = 2, EVEN enum ButtonShiftFlags {BTNSHIFT_LEFT = 0, BTNSHIFT_RIGHT = 3, BTNSHIFT_MIDDLE = 4}; // Intrinisc game delay between execution frames. This runs at 60Hz +#define GAME_FRAME_RATE 60 #define GAME_FRAME_TIME (1000 / 60) class GfxManager; diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 2c00e6ec47..01e770a77a 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -31,25 +31,6 @@ namespace tSage { static SoundManager *_soundManager = NULL; -#if 0 -static void dumpVoiceStruct() { - VoiceTypeStruct *vt = _soundManager->_voiceTypeStructPtrs[1]; - if (!vt) { - debug("Not setup"); - return; - } - - assert(vt->_voiceType == VOICETYPE_1); - for (uint idx = 0; idx < vt->_entries.size(); ++idx) { - VoiceStructEntryType1 &vte = vt->_entries[idx]._type1; - debug("#%d - s=%p, ch=%x, pr=%x | s2=%p, ch2=%x, pr2=%x | s3=%p, ch3=%x, pr3=%x", - idx, (void *)vte._sound, vte._channelNum, vte._priority, - (void *)vte._sound2, vte._channelNum2, vte._priority2, - (void *)vte._sound3, vte._channelNum3, vte._priority3); - } -} -#endif - /*--------------------------------------------------------------------------*/ SoundManager::SoundManager() { @@ -84,6 +65,8 @@ SoundManager::~SoundManager() { delete driver; } _sfTerminate(); + + g_system->getTimerManager()->removeTimerProc(_sfUpdateCallback); } _soundManager = NULL; @@ -94,6 +77,10 @@ void SoundManager::postInit() { _saver->addSaveNotifier(&SoundManager::saveNotifier); _saver->addLoadNotifier(&SoundManager::loadNotifier); _saver->addListener(this); + + // Install a timer for handling sound manager updates at 60Hz + g_system->getTimerManager()->installTimerProc(_sfUpdateCallback, 1000000 / GAME_FRAME_RATE, NULL); + __sndmgrReady = true; } } @@ -1330,7 +1317,6 @@ bool SoundManager::_sfInstallDriver(SoundDriver *driver) { if (!driver->open()) return false; - driver->setUpdateCallback(_sfUpdateCallback, (void *)&sfManager()); sfManager()._installedDrivers.push_back(driver); driver->_groupOffset = driver->getGroupData(); driver->_groupMask = READ_LE_UINT32(driver->_groupOffset); @@ -2444,8 +2430,6 @@ const int v440D4[48] = { }; AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { - _upCb = NULL; - _upRef = NULL; _minVersion = 0x102; _maxVersion = 0x10A; _masterVolume = 0; @@ -2586,7 +2570,16 @@ void AdlibSoundDriver::setPitch(int channel, int pitchBlend) { void AdlibSoundDriver::write(byte reg, byte value) { _portContents[reg] = value; - OPLWriteReg(_opl, reg, value); + _queue.push(RegisterValue(reg, value)); +} + +void AdlibSoundDriver::flush() { + Common::StackLock slock(SoundManager::sfManager()._serverDisabledMutex); + + while (!_queue.empty()) { + RegisterValue v = _queue.pop(); + OPLWriteReg(_opl, v._regNum, v._value); + } } void AdlibSoundDriver::updateChannelVolume(int channelNum) { @@ -2725,18 +2718,311 @@ void AdlibSoundDriver::update(int16 *buf, int len) { len -= count; YM3812UpdateOne(_opl, buf, count); if (samplesLeft == 0) { - if (_upCb) { - (*_upCb)(_upRef); - } + flush(); samplesLeft = _sampleRate / 50; } buf += count; } } -void AdlibSoundDriver::setUpdateCallback(UpdateCallback upCb, void *ref) { - _upCb = upCb; - _upRef = ref; +/*--------------------------------------------------------------------------*/ + +const byte adlibFx_group_data[] = { 3, 1, 1, 0, 0xff }; + + +AdlibFxSoundDriver::AdlibFxSoundDriver(): SoundDriver() { + _minVersion = 0x102; + _maxVersion = 0x10A; + _masterVolume = 0; + + _groupData.groupMask = 9; + _groupData.v1 = 0x3E; + _groupData.v2 = 0; + _groupData.pData = &adlib_group_data[0]; + + _mixer = _vm->_mixer; + _sampleRate = _mixer->getOutputRate(); + _opl = makeAdLibOPL(_sampleRate); + _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); +/* + 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; +*/ +} + +AdlibFxSoundDriver::~AdlibFxSoundDriver() { + _mixer->stopHandle(_soundHandle); + OPLDestroy(_opl); +} + +bool AdlibFxSoundDriver::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 AdlibFxSoundDriver::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 AdlibFxSoundDriver::reset() { + write(1, 0x20); + write(1, 0x20); + + return true; +} + +const GroupData *AdlibFxSoundDriver::getGroupData() { + return &_groupData; +} + +int AdlibFxSoundDriver::setMasterVolume(int volume) { + int oldVolume = _masterVolume; + _masterVolume = volume; + + for (int channelNum = 0; channelNum < ADLIB_CHANNEL_COUNT; ++channelNum) + updateChannelVolume(channelNum); + + return oldVolume; +} + +void AdlibFxSoundDriver::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; + int id; + + for (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 AdlibFxSoundDriver::updateVoice(int channel) { + if (_channelVoiced[channel]) + clearVoice(channel); +} + +void AdlibFxSoundDriver::proc38(int channel, int cmd, int value) { + if (cmd == 7) { + // Set channel volume + _channelVolume[channel] = value; + updateChannelVolume(channel); + } +} + +void AdlibFxSoundDriver::setPitch(int channel, int pitchBlend) { + _pitchBlend[channel] = pitchBlend; + setFrequency(channel); +} + +void AdlibFxSoundDriver::write(byte reg, byte value) { + _portContents[reg] = value; + _queue.push(RegisterValue(reg, value)); +} + +void AdlibFxSoundDriver::flush() { + Common::StackLock slock(SoundManager::sfManager()._serverDisabledMutex); + + while (!_queue.empty()) { + RegisterValue v = _queue.pop(); + OPLWriteReg(_opl, v._regNum, v._value); + } +} + +void AdlibFxSoundDriver::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 AdlibFxSoundDriver::setVoice(int channel) { + int portNum = 0xB0 + channel; + write(portNum, _portContents[portNum] | 0x20); + _channelVoiced[channel] = true; +} + +void AdlibFxSoundDriver::clearVoice(int channel) { + write(0xB0 + channel, _portContents[0xB0 + channel] & ~0x20); + _channelVoiced[channel] = false; +} + +void AdlibFxSoundDriver::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 AdlibFxSoundDriver::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)); +} + +int AdlibFxSoundDriver::readBuffer(int16 *buffer, const int numSamples) { + update(buffer, numSamples); + return numSamples; +} + +void AdlibFxSoundDriver::update(int16 *buf, int len) { + static int samplesLeft = 0; + while (len != 0) { + int count = samplesLeft; + if (count > len) { + count = len; + } + samplesLeft -= count; + len -= count; + YM3812UpdateOne(_opl, buf, count); + if (samplesLeft == 0) { + flush(); + samplesLeft = _sampleRate / 50; + } + buf += count; + } } } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 4647e3c564..27f30b9b08 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -25,6 +25,7 @@ #include "common/scummsys.h" #include "common/mutex.h" +#include "common/queue.h" #include "audio/audiostream.h" #include "audio/fmopl.h" #include "audio/mixer.h" @@ -65,6 +66,15 @@ struct GroupData { const byte *pData; }; +struct RegisterValue { + uint8 _regNum; + uint8 _value; + + RegisterValue(int regNum, int value) { + _regNum = regNum; _value = value; + } +}; + class SoundDriver { public: Common::String _shortDescription, _longDescription; @@ -73,10 +83,6 @@ public: uint32 _groupMask; const GroupData *_groupOffset; int _driverResID; - - typedef void (*UpdateCallback)(void *); - UpdateCallback _upCb; - void *_upRef; public: SoundDriver(); virtual ~SoundDriver() {}; @@ -106,8 +112,6 @@ public: 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 - - virtual void setUpdateCallback(UpdateCallback upCb, void *ref) {} }; struct VoiceStructEntryType0 { @@ -405,6 +409,7 @@ private: byte _portContents[256]; const byte *_patchData; int _masterVolume; + Common::Queue _queue; bool _channelVoiced[ADLIB_CHANNEL_COUNT]; int _channelVolume[ADLIB_CHANNEL_COUNT]; @@ -418,6 +423,7 @@ private: void write(byte reg, byte value); + void flush(); void updateChannelVolume(int channel); void setVoice(int channel); void clearVoice(int channel); @@ -437,7 +443,6 @@ public: virtual void updateVoice(int channel); virtual void proc38(int channel, int cmd, int value); virtual void setPitch(int channel, int pitchBlend); - virtual void setUpdateCallback(UpdateCallback upCb, void *ref); // AudioStream interface virtual int readBuffer(int16 *buffer, const int numSamples); @@ -448,6 +453,60 @@ public: void update(int16 *buf, int len); }; +class AdlibFxSoundDriver: public SoundDriver, Audio::AudioStream { +private: + GroupData _groupData; + Audio::Mixer *_mixer; + FM_OPL *_opl; + Audio::SoundHandle _soundHandle; + int _sampleRate; + byte _portContents[256]; + int _masterVolume; + Common::Queue _queue; + + 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 flush(); + void updateChannelVolume(int channel); + void setVoice(int channel); + void clearVoice(int channel); + void updateChannel(int channel); + void setFrequency(int channel); +public: + AdlibFxSoundDriver(); + virtual ~AdlibFxSoundDriver(); + + 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); + + // AudioStream interface + virtual int readBuffer(int16 *buffer, const int numSamples); + virtual bool isStereo() const { return false; } + virtual bool endOfData() const { return false; } + virtual int getRate() const { return _sampleRate; } + + void update(int16 *buf, int len); +}; + + } // End of namespace tSage #endif -- cgit v1.2.3 From ab7fdccc3b69d6ded7eb0c978da8804901ff95a9 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 2 Jul 2011 10:39:57 +1000 Subject: TSAGE: Beginnings of SoundBlaster sound driver --- engines/tsage/sound.cpp | 288 +++++++++++++++++------------------------------- engines/tsage/sound.h | 46 ++++---- 2 files changed, 123 insertions(+), 211 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 01e770a77a..7f454bf801 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -126,7 +126,10 @@ Common::List &SoundManager::buildDriverList(bool detectFlag) { assert(__sndmgrReady); _availableDrivers.clear(); - // Build up a list of available drivers. Currently we only implement an Adlib driver + // Build up a list of available drivers. Currently we only implement an Adlib music + // and SoundBlaster FX driver + + // Adlib driver SoundDriverEntry sd; sd.driverNum = ADLIB_DRIVER_NUM; sd.status = detectFlag ? SNDSTATUS_DETECTED : SNDSTATUS_SKIPPED; @@ -136,12 +139,23 @@ Common::List &SoundManager::buildDriverList(bool detectFlag) { sd.longDescription = "3812fm"; _availableDrivers.push_back(sd); + // SoundBlaster entry + SoundDriverEntry sdFx; + sdFx.driverNum = SBLASTER_DRIVER_NUM; + sdFx.status = detectFlag ? SNDSTATUS_DETECTED : SNDSTATUS_SKIPPED; + sdFx.field2 = 0; + sdFx.field6 = 15000; + sdFx.shortDescription = "SndBlast"; + sdFx.longDescription = "SoundBlaster"; + _availableDrivers.push_back(sdFx); + _driversDetected = true; return _availableDrivers; } void SoundManager::installConfigDrivers() { installDriver(ADLIB_DRIVER_NUM); + installDriver(SBLASTER_DRIVER_NUM); } Common::List &SoundManager::getDriverList(bool detectFlag) { @@ -2125,7 +2139,7 @@ void Sound::_soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voice vtStruct->_entries[entryIndex]._type1._field4 = v0; vtStruct->_entries[entryIndex]._type1._field5 = 0; - driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, _chProgram[channelNum], v0, v1); + driver->proc32(this, vtStruct->_entries[entryIndex]._voiceNum, _chProgram[channelNum], v0, v1); } } @@ -2143,8 +2157,9 @@ void Sound::_soProc42(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voice 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); + int v1, v2; + driver->proc32(this, vtStruct->_entries[entryIndex]._voiceNum, -1, v0, 0x7F); + driver->proc42(vtStruct->_entries[entryIndex]._voiceNum, voiceType, 0, &v1, &v2); } break; } @@ -2271,11 +2286,33 @@ void Sound::_soServiceTrackType1(int trackIndex, const byte *channelData) { vtStruct->_entries[entryIndex]._type1._field4 = *(channelData + 1); vtStruct->_entries[entryIndex]._type1._field5 = 0; - driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, -1, *(channelData + 1), 0x7f); + int v1, v2; + driver->proc32(this, vtStruct->_entries[entryIndex]._voiceNum, -1, *(channelData + 1), 0x7f); + driver->proc42(vtStruct->_entries[entryIndex]._voiceNum, *(channelData + 1), _loop ? 1 : 0, + &v1, &v2); } } else { + int channel = 0; // Is this correct?! + for (uint entryIndex = 0; entryIndex < vtStruct->_entries.size(); ++entryIndex) { + VoiceStructEntry &vte = vtStruct->_entries[entryIndex]; + VoiceStructEntryType1 &vse = vte._type1; + if ((vse._sound == this) && (vse._channelNum == channel) && (vse._field4 == vtStruct->_total)) { + SoundDriver *driver = vte._driver; + + int v1, v2; + driver->proc42(vte._voiceNum, vtStruct->_total, _loop ? 1 : 0, &v1, &v2); + if (v2) { + _trkState[trackIndex] = 0; + } else if (vtStruct->_total) { + _timer = 0; + } + } + } + _trkState[trackIndex] = 0; } + } else { + _trkState[trackIndex] = 0; } } } @@ -2511,7 +2548,7 @@ int AdlibSoundDriver::setMasterVolume(int volume) { return oldVolume; } -void AdlibSoundDriver::proc32(int channel, int program, int v0, int v1) { +void AdlibSoundDriver::proc32(Sound *sound, int channel, int program, int v0, int v1) { if (program == -1) return; @@ -2735,7 +2772,7 @@ AdlibFxSoundDriver::AdlibFxSoundDriver(): SoundDriver() { _maxVersion = 0x10A; _masterVolume = 0; - _groupData.groupMask = 9; + _groupData.groupMask = 1; _groupData.v1 = 0x3E; _groupData.v2 = 0; _groupData.pData = &adlib_group_data[0]; @@ -2765,31 +2802,25 @@ AdlibFxSoundDriver::~AdlibFxSoundDriver() { } bool AdlibFxSoundDriver::open() { + write209(); + write(64); + write(165); + // for (int idx = 0; idx < 5000 * 16; ++idx) al = port[21h] - write(1, 0x20); - if (!reset()) - return false; +// _v45071 = 1; +// _v4506F = 0; - write(8, 0); - for (int idx = 0x20; idx < 0xF6; ++idx) - write(idx, 0); - - write(0xBD, 0); return true; } void AdlibFxSoundDriver::close() { - for (int idx = 0xB0; idx < 0xB8; ++idx) - write(idx, _portContents[idx] & 0xDF); - for (int idx = 0x40; idx < 0x55; ++idx) - write(idx, 0x3F); - reset(); + write(208); + write211(); + } bool AdlibFxSoundDriver::reset() { - write(1, 0x20); - write(1, 0x20); return true; } @@ -2798,77 +2829,72 @@ const GroupData *AdlibFxSoundDriver::getGroupData() { return &_groupData; } +void AdlibFxSoundDriver::poll() { + if (!_masterVolume || !_channelVolume) { + if (_v45046) + write211(); + } else { + if (!_v45046) + write209(); + } +} + int AdlibFxSoundDriver::setMasterVolume(int volume) { int oldVolume = _masterVolume; _masterVolume = volume; - for (int channelNum = 0; channelNum < ADLIB_CHANNEL_COUNT; ++channelNum) - updateChannelVolume(channelNum); - return oldVolume; } -void AdlibFxSoundDriver::proc32(int channel, int program, int v0, int v1) { +void AdlibFxSoundDriver::proc32(Sound *sound, 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; - int id; - - for (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; + if (_sound) + updateVoice(channel); - // Set sustain/release - int portNum = v440C2[v440B0[channel]] + 0x80; - write(portNum, (_portContents[portNum] & 0xF0) | 0xF); + // TODO: Stuff - 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 AdlibFxSoundDriver::updateVoice(int channel) { - if (_channelVoiced[channel]) - clearVoice(channel); + if (_sound) { + write(208); + + _sound = NULL; + _v45062 = 0; + _v45066 = 0; + _v45068 = 0; + } } void AdlibFxSoundDriver::proc38(int channel, int cmd, int value) { if (cmd == 7) { // Set channel volume - _channelVolume[channel] = value; - updateChannelVolume(channel); + _channelVolume = value; } } -void AdlibFxSoundDriver::setPitch(int channel, int pitchBlend) { - _pitchBlend[channel] = pitchBlend; - setFrequency(channel); +void AdlibFxSoundDriver::proc42(int channel, int cmd, int value, int *v1, int *v2) { + _v4506A = value; + *v1 = _v4506B; + *v2 = 0; + _v4506B = 0; + + if (!_sound) + *v2 = 1; } -void AdlibFxSoundDriver::write(byte reg, byte value) { - _portContents[reg] = value; - _queue.push(RegisterValue(reg, value)); +void AdlibFxSoundDriver::write(int v) { + /* + port[adlib_port + 12] = v; + for (int i = 0; i < 100; ++i) { + if (!port[adlib_port + 12] & 0x80) + break; + } + */ } void AdlibFxSoundDriver::flush() { @@ -2880,127 +2906,7 @@ void AdlibFxSoundDriver::flush() { } } -void AdlibFxSoundDriver::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 AdlibFxSoundDriver::setVoice(int channel) { - int portNum = 0xB0 + channel; - write(portNum, _portContents[portNum] | 0x20); - _channelVoiced[channel] = true; -} - -void AdlibFxSoundDriver::clearVoice(int channel) { - write(0xB0 + channel, _portContents[0xB0 + channel] & ~0x20); - _channelVoiced[channel] = false; -} - -void AdlibFxSoundDriver::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 AdlibFxSoundDriver::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)); -} int AdlibFxSoundDriver::readBuffer(int16 *buffer, const int numSamples) { update(buffer, numSamples); @@ -3025,4 +2931,14 @@ void AdlibFxSoundDriver::update(int16 *buf, int len) { } } +void AdlibFxSoundDriver::write209() { + write(209); + _v45046 = true; +} + +void AdlibFxSoundDriver::write211() { + write(211); + _v45046 = false; +} + } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 27f30b9b08..26bf3e6d33 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -40,6 +40,7 @@ class Sound; #define SOUND_ARR_SIZE 16 #define ROLAND_DRIVER_NUM 2 #define ADLIB_DRIVER_NUM 3 +#define SBLASTER_DRIVER_NUM 4 struct trackInfoStruct { int _numTracks; @@ -106,12 +107,12 @@ public: 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 proc32(Sound *sound, 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 + virtual void proc42(int channel, int cmd, int value, int *v1, int *v2) {} // Method #21 }; struct VoiceStructEntryType0 { @@ -439,7 +440,7 @@ public: 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 proc32(Sound *sound, 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); @@ -455,33 +456,28 @@ public: class AdlibFxSoundDriver: public SoundDriver, Audio::AudioStream { private: + Common::Queue _queue; GroupData _groupData; Audio::Mixer *_mixer; FM_OPL *_opl; Audio::SoundHandle _soundHandle; int _sampleRate; - byte _portContents[256]; - int _masterVolume; - Common::Queue _queue; - - 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]; + int _v45062; + int _v45066; + int _v45068; + int _v4506A; + int _v4506B; + bool _v45046; + byte _masterVolume; + byte _channelVolume; + Sound *_sound; - void write(byte reg, byte value); + void write(int v); void flush(); - void updateChannelVolume(int channel); - void setVoice(int channel); - void clearVoice(int channel); - void updateChannel(int channel); - void setFrequency(int channel); + void sub_4556E(); + void write209(); + void write211(); public: AdlibFxSoundDriver(); virtual ~AdlibFxSoundDriver(); @@ -490,12 +486,12 @@ public: virtual void close(); virtual bool reset(); virtual const GroupData *getGroupData(); - virtual void installPatch(const byte *data, int size) {} + virtual void poll(); virtual int setMasterVolume(int volume); - virtual void proc32(int channel, int program, int v0, int v1); + virtual void proc32(Sound *sound, 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); + virtual void proc42(int channel, int cmd, int value, int *v1, int *v2); // AudioStream interface virtual int readBuffer(int16 *buffer, const int numSamples); -- cgit v1.2.3 From 160a8d96d943c878a1c8bed742507d540d51a15d Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 2 Jul 2011 13:49:27 +1000 Subject: TSAGE: Fixed problem with saving double values --- engines/tsage/ringworld_scenes1.cpp | 8 ++++---- engines/tsage/saveload.cpp | 13 +++++++++++++ engines/tsage/saveload.h | 1 + 3 files changed, 18 insertions(+), 4 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/ringworld_scenes1.cpp b/engines/tsage/ringworld_scenes1.cpp index 7fe2610fd7..8299a05967 100644 --- a/engines/tsage/ringworld_scenes1.cpp +++ b/engines/tsage/ringworld_scenes1.cpp @@ -3105,10 +3105,10 @@ void Scene6100::Object::synchronize(Serializer &s) { SceneObject::synchronize(s); // Save the double fields of the FloatSet - s.syncBytes((byte *)&_floats._float1, sizeof(double)); - s.syncBytes((byte *)&_floats._float2, sizeof(double)); - s.syncBytes((byte *)&_floats._float3, sizeof(double)); - s.syncBytes((byte *)&_floats._float4, sizeof(double)); + s.syncAsDouble(_floats._float1); + s.syncAsDouble(_floats._float2); + s.syncAsDouble(_floats._float3); + s.syncAsDouble(_floats._float4); } /*--------------------------------------------------------------------------*/ diff --git a/engines/tsage/saveload.cpp b/engines/tsage/saveload.cpp index b184e59c9e..40444cd630 100644 --- a/engines/tsage/saveload.cpp +++ b/engines/tsage/saveload.cpp @@ -103,6 +103,19 @@ void Serializer::validate(int v, Common::Serializer::Version minVersion, error("Savegame is corrupt"); } +#define DOUBLE_PRECISION 1000000000 + +void Serializer::syncAsDouble(double &v) { + int32 num = (int32)(v); + uint32 fraction = (uint32)((v - (int32)v) * DOUBLE_PRECISION); + + syncAsSint32LE(num); + syncAsUint32LE(fraction); + + if (isLoading()) + v = num + (double)fraction / DOUBLE_PRECISION; +} + /*--------------------------------------------------------------------------*/ Common::Error Saver::save(int slot, const Common::String &saveName) { diff --git a/engines/tsage/saveload.h b/engines/tsage/saveload.h index 0382e4a1fc..ce181cbc8f 100644 --- a/engines/tsage/saveload.h +++ b/engines/tsage/saveload.h @@ -77,6 +77,7 @@ public: Common::Serializer::Version maxVersion = kLastVersion); void validate(int v, Common::Serializer::Version minVersion = 0, Common::Serializer::Version maxVersion = kLastVersion); + void syncAsDouble(double &v); }; /*--------------------------------------------------------------------------*/ -- cgit v1.2.3 From d1a30b41b1bb0bc001751e8a4dcfcdb1044826ad Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 2 Jul 2011 13:51:05 +1000 Subject: TSAGE: Linked in the (in progress) SoundBlaster Fx class --- engines/tsage/sound.cpp | 21 +++++++++++++-------- engines/tsage/sound.h | 1 - 2 files changed, 13 insertions(+), 9 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 7f454bf801..b2cf5300e5 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -155,7 +155,9 @@ Common::List &SoundManager::buildDriverList(bool detectFlag) { void SoundManager::installConfigDrivers() { installDriver(ADLIB_DRIVER_NUM); +#ifdef DEBUG installDriver(SBLASTER_DRIVER_NUM); +#endif } Common::List &SoundManager::getDriverList(bool detectFlag) { @@ -220,8 +222,14 @@ void SoundManager::installDriver(int driverNum) { * Instantiate a driver class for the specified driver number */ SoundDriver *SoundManager::instantiateDriver(int driverNum) { - assert(driverNum == ADLIB_DRIVER_NUM); - return new AdlibSoundDriver(); + switch (driverNum) { + case ADLIB_DRIVER_NUM: + return new AdlibSoundDriver(); + case SBLASTER_DRIVER_NUM: + return new AdlibFxSoundDriver(); + default: + error("Unknown sound driver - %d", driverNum); + } } /** @@ -2779,7 +2787,6 @@ AdlibFxSoundDriver::AdlibFxSoundDriver(): SoundDriver() { _mixer = _vm->_mixer; _sampleRate = _mixer->getOutputRate(); - _opl = makeAdLibOPL(_sampleRate); _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); /* Common::set_to(_channelVoiced, _channelVoiced + ADLIB_CHANNEL_COUNT, false); @@ -2798,7 +2805,6 @@ AdlibFxSoundDriver::AdlibFxSoundDriver(): SoundDriver() { AdlibFxSoundDriver::~AdlibFxSoundDriver() { _mixer->stopHandle(_soundHandle); - OPLDestroy(_opl); } bool AdlibFxSoundDriver::open() { @@ -2900,10 +2906,7 @@ void AdlibFxSoundDriver::write(int v) { void AdlibFxSoundDriver::flush() { Common::StackLock slock(SoundManager::sfManager()._serverDisabledMutex); - while (!_queue.empty()) { - RegisterValue v = _queue.pop(); - OPLWriteReg(_opl, v._regNum, v._value); - } + // No data output yet } @@ -2914,6 +2917,7 @@ int AdlibFxSoundDriver::readBuffer(int16 *buffer, const int numSamples) { } void AdlibFxSoundDriver::update(int16 *buf, int len) { +/* static int samplesLeft = 0; while (len != 0) { int count = samplesLeft; @@ -2929,6 +2933,7 @@ void AdlibFxSoundDriver::update(int16 *buf, int len) { } buf += count; } +*/ } void AdlibFxSoundDriver::write209() { diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 26bf3e6d33..6a47a1aaf5 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -459,7 +459,6 @@ private: Common::Queue _queue; GroupData _groupData; Audio::Mixer *_mixer; - FM_OPL *_opl; Audio::SoundHandle _soundHandle; int _sampleRate; -- cgit v1.2.3 From a5b0792295f46ebcf5d30df975bd2056bc4a695f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 2 Jul 2011 19:54:39 +1000 Subject: TSAGE: Remove outdated extra channel variable --- engines/tsage/sound.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index b2cf5300e5..8dd584ef24 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -2300,7 +2300,6 @@ void Sound::_soServiceTrackType1(int trackIndex, const byte *channelData) { &v1, &v2); } } else { - int channel = 0; // Is this correct?! for (uint entryIndex = 0; entryIndex < vtStruct->_entries.size(); ++entryIndex) { VoiceStructEntry &vte = vtStruct->_entries[entryIndex]; VoiceStructEntryType1 &vse = vte._type1; -- cgit v1.2.3 From ad181a810c5856eae7e472cc358006333f9b348a Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 4 Jul 2011 19:14:39 +1000 Subject: TSAGE: Replace usage of deprecated Adlib OPL functions --- engines/tsage/sound.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 8dd584ef24..e26b3d1544 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -2485,7 +2485,10 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { _mixer = _vm->_mixer; _sampleRate = _mixer->getOutputRate(); - _opl = makeAdLibOPL(_sampleRate); + _opl = OPL::Config::create(); + assert(_opl); + _opl->init(_sampleRate); + _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); Common::set_to(_channelVoiced, _channelVoiced + ADLIB_CHANNEL_COUNT, false); @@ -2504,7 +2507,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { AdlibSoundDriver::~AdlibSoundDriver() { DEALLOCATE(_patchData); _mixer->stopHandle(_soundHandle); - OPLDestroy(_opl); + delete _opl; } bool AdlibSoundDriver::open() { @@ -2622,7 +2625,7 @@ void AdlibSoundDriver::flush() { while (!_queue.empty()) { RegisterValue v = _queue.pop(); - OPLWriteReg(_opl, v._regNum, v._value); + _opl->writeReg(v._regNum, v._value); } } @@ -2760,7 +2763,7 @@ void AdlibSoundDriver::update(int16 *buf, int len) { } samplesLeft -= count; len -= count; - YM3812UpdateOne(_opl, buf, count); + _opl->readBuffer(buf, count); if (samplesLeft == 0) { flush(); samplesLeft = _sampleRate / 50; -- cgit v1.2.3 From a4a99f8cc891d55dd4e196046ee2be6a4e3fd00c Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 7 Jul 2011 19:18:13 +0100 Subject: TSAGE: Add Spanish CD Detection Entry From Bug #3357777 --- engines/tsage/detection_tables.h | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'engines/tsage') diff --git a/engines/tsage/detection_tables.h b/engines/tsage/detection_tables.h index 8b80edf89d..f9ced562c2 100644 --- a/engines/tsage/detection_tables.h +++ b/engines/tsage/detection_tables.h @@ -24,7 +24,7 @@ namespace tSage { static const tSageGameDescription gameDescriptions[] = { - // Ringworld CD and First Wave versions + // Ringworld English CD and First Wave versions { { "ring", @@ -38,6 +38,20 @@ static const tSageGameDescription gameDescriptions[] = { GType_Ringworld, GF_CD | GF_ALT_REGIONS }, + // Ringworld Spanish CD + { + { + "ring", + "CD", + AD_ENTRY1s("ring.rlb", "cb8bba91b30cd172712371d7123bd763", 7427980), + Common::ES_ESP, + Common::kPlatformPC, + ADGF_UNSTABLE, + Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + }, + GType_Ringworld, + GF_CD | GF_ALT_REGIONS + }, // Ringworld English Floppy version { { -- cgit v1.2.3 From b3a05ee089e8f657f8ad1e5416ec06c56d95adf3 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 18 Jul 2011 21:13:39 +1000 Subject: TSAGE: Bugfix to make Return to Launcher work correctly --- engines/tsage/converse.cpp | 6 +++--- engines/tsage/core.cpp | 2 +- engines/tsage/dialogs.cpp | 8 ++++---- engines/tsage/events.cpp | 4 ++-- engines/tsage/graphics.cpp | 6 +++--- engines/tsage/ringworld_logic.cpp | 2 +- engines/tsage/ringworld_scenes3.cpp | 6 +++--- engines/tsage/scenes.cpp | 2 +- engines/tsage/tsage.cpp | 4 ++++ engines/tsage/tsage.h | 1 + 10 files changed, 23 insertions(+), 18 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/converse.cpp b/engines/tsage/converse.cpp index b475310533..0ae575c557 100644 --- a/engines/tsage/converse.cpp +++ b/engines/tsage/converse.cpp @@ -416,13 +416,13 @@ int ConversationChoiceDialog::execute(const Common::StringArray &choiceList) { // Event handling loop Event event; - while (!_vm->getEventManager()->shouldQuit()) { + while (!_vm->shouldQuit()) { while (!_globals->_events.getEvent(event, EVENT_KEYPRESS | EVENT_BUTTON_DOWN | EVENT_MOUSE_MOVE) && - !_vm->getEventManager()->shouldQuit()) { + !_vm->shouldQuit()) { g_system->delayMillis(10); g_system->updateScreen(); } - if (_vm->getEventManager()->shouldQuit()) + if (_vm->shouldQuit()) break; if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode >= Common::KEYCODE_1) && diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 76714a6f10..d0075d5acf 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1552,7 +1552,7 @@ void SceneItem::display(int resNum, int lineNum, ...) { Event event; // Keep event on-screen until a mouse or keypress - while (!_vm->getEventManager()->shouldQuit() && !_globals->_events.getEvent(event, + while (!_vm->shouldQuit() && !_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS)) { g_system->updateScreen(); g_system->delayMillis(10); diff --git a/engines/tsage/dialogs.cpp b/engines/tsage/dialogs.cpp index 86fbbc8e43..d315ce092b 100644 --- a/engines/tsage/dialogs.cpp +++ b/engines/tsage/dialogs.cpp @@ -243,7 +243,7 @@ void RightClickDialog::execute() { // Dialog event handler loop _gfxManager.activate(); - while (!_vm->getEventManager()->shouldQuit() && (_selectedAction == -1)) { + while (!_vm->shouldQuit() && (_selectedAction == -1)) { Event evt; while (_globals->_events.getEvent(evt, EVENT_MOUSE_MOVE | EVENT_BUTTON_DOWN)) { evt.mousePos.x -= _bounds.left; @@ -465,14 +465,14 @@ void InventoryDialog::execute() { bool lookFlag = false; _gfxManager.activate(); - while (!_vm->getEventManager()->shouldQuit()) { + while (!_vm->shouldQuit()) { // Get events Event event; - while (!_globals->_events.getEvent(event) && !_vm->getEventManager()->shouldQuit()) { + while (!_globals->_events.getEvent(event) && !_vm->shouldQuit()) { g_system->delayMillis(10); g_system->updateScreen(); } - if (_vm->getEventManager()->shouldQuit()) + if (_vm->shouldQuit()) break; hiliteObj = NULL; diff --git a/engines/tsage/events.cpp b/engines/tsage/events.cpp index a24f65421b..010117ec78 100644 --- a/engines/tsage/events.cpp +++ b/engines/tsage/events.cpp @@ -78,7 +78,7 @@ bool EventsClass::pollEvent() { void EventsClass::waitForPress(int eventMask) { Event evt; - while (!_vm->getEventManager()->shouldQuit() && !getEvent(evt, eventMask)) + while (!_vm->shouldQuit() && !getEvent(evt, eventMask)) g_system->delayMillis(10); } @@ -86,7 +86,7 @@ void EventsClass::waitForPress(int eventMask) { * Standard event retrieval, which only returns keyboard and mouse clicks */ bool EventsClass::getEvent(Event &evt, int eventMask) { - while (pollEvent() && !_vm->getEventManager()->shouldQuit()) { + while (pollEvent() && !_vm->shouldQuit()) { evt.handled = false; evt.eventType = EVENT_NONE; evt.mousePos = _event.mouse; diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp index fce9e1317d..87ffdf4494 100644 --- a/engines/tsage/graphics.cpp +++ b/engines/tsage/graphics.cpp @@ -408,7 +408,7 @@ bool GfxSurface::displayText(const Common::String &msg, const Common::Point &pt) // Write for a mouse or keypress Event event; - while (!_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !_vm->getEventManager()->shouldQuit()) + while (!_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !_vm->shouldQuit()) ; // Restore the display area @@ -718,7 +718,7 @@ bool GfxElement::focusedEvent(Event &event) { int xOffset = mousePos.x - _globals->_events._mousePos.x; int yOffset = mousePos.y - _globals->_events._mousePos.y; - while (event.eventType != EVENT_BUTTON_UP && !_vm->getEventManager()->shouldQuit()) { + while (event.eventType != EVENT_BUTTON_UP && !_vm->shouldQuit()) { g_system->delayMillis(10); if (_bounds.contains(mousePos)) { @@ -1029,7 +1029,7 @@ GfxButton *GfxDialog::execute(GfxButton *defaultButton) { GfxButton *selectedButton = NULL; bool breakFlag = false; - while (!_vm->getEventManager()->shouldQuit() && !breakFlag) { + while (!_vm->shouldQuit() && !breakFlag) { Event event; while (_globals->_events.getEvent(event) && !breakFlag) { // Adjust mouse positions to be relative within the dialog diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld_logic.cpp index 58501172af..070d8afd25 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld_logic.cpp @@ -296,7 +296,7 @@ void SceneArea::draw(bool flag) { void SceneArea::wait() { // Wait until a mouse or keypress Event event; - while (!_vm->getEventManager()->shouldQuit() && !_globals->_events.getEvent(event)) { + while (!_vm->shouldQuit() && !_globals->_events.getEvent(event)) { g_system->updateScreen(); g_system->delayMillis(10); } diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index 824a96a18b..3f9921b0ad 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -526,7 +526,7 @@ void Scene2100::Action1::signal() { _state = 0; _globals->_events.setCursor(CURSOR_USE); - while (!_state && !_vm->getEventManager()->shouldQuit()) { + while (!_state && !_vm->shouldQuit()) { // Wait for an event Event event; if (!_globals->_events.getEvent(event)) { @@ -2257,7 +2257,7 @@ void Scene2150::Action1::signal() { _state = 0; _globals->_events.setCursor(CURSOR_USE); - while (!_state && !_vm->getEventManager()->shouldQuit()) { + while (!_state && !_vm->shouldQuit()) { // Wait for an event Event event; if (!_globals->_events.getEvent(event)) { @@ -5112,7 +5112,7 @@ void Scene2320::Action3::signal() { _state = 0; _globals->_events.setCursor(CURSOR_USE); - while (!_state && !_vm->getEventManager()->shouldQuit()) { + while (!_state && !_vm->shouldQuit()) { // Wait for an event Event event; if (!_globals->_events.getEvent(event)) { diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp index 18b3da2698..b94e95c696 100644 --- a/engines/tsage/scenes.cpp +++ b/engines/tsage/scenes.cpp @@ -511,7 +511,7 @@ void Game::execute() { activeFlag = true; } } - } while (activeFlag && !_vm->getEventManager()->shouldQuit()); + } while (activeFlag && !_vm->shouldQuit()); } } // End of namespace tSage diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp index 41f3d58897..23a0193b7c 100644 --- a/engines/tsage/tsage.cpp +++ b/engines/tsage/tsage.cpp @@ -147,4 +147,8 @@ void TSageEngine::syncSoundSettings() { _globals->_soundManager.syncSounds(); } +bool TSageEngine::shouldQuit() { + return getEventManager()->shouldQuit() || getEventManager()->shouldRTL(); +} + } // End of namespace tSage diff --git a/engines/tsage/tsage.h b/engines/tsage/tsage.h index f004c7f625..805461886a 100644 --- a/engines/tsage/tsage.h +++ b/engines/tsage/tsage.h @@ -78,6 +78,7 @@ public: uint32 getGameID() const; uint32 getFeatures() const; Common::String getPrimaryFilename() const; + bool shouldQuit(); virtual Common::Error init(); virtual Common::Error run(); -- cgit v1.2.3