TITANIC: Fleshed out CMusicRoom & CMusicHandler setup

This commit is contained in:
Paul Gilbert
2016-08-30 22:51:18 -04:00
parent 46316fdb63
commit d9fb4a2bc5
12 changed files with 214 additions and 71 deletions
+20 -20
View File
@@ -167,29 +167,29 @@ bool CPhonographCylinder::SetMusicControlsMsg(CSetMusicControlsMsg *msg) {
return true;
CMusicRoom *musicRoom = getMusicRoom();
musicRoom->setItem5(BELLS, _bellsMuteControl);
musicRoom->setItem2(BELLS, _bellsPitchControl);
musicRoom->setItem1(BELLS, _bellsSpeedControl);
musicRoom->setItem4(BELLS, _bellsInversionControl);
musicRoom->setItem3(BELLS, _bellsDirectionControl);
musicRoom->setMuteControl(BELLS, _bellsMuteControl);
musicRoom->setPitchControl(BELLS, _bellsPitchControl);
musicRoom->setSpeedControl(BELLS, _bellsSpeedControl);
musicRoom->setInversionControl(BELLS, _bellsInversionControl);
musicRoom->setDirectionControl(BELLS, _bellsDirectionControl);
musicRoom->setItem5(SNAKE, _snakeMuteControl);
musicRoom->setItem2(SNAKE, _snakePitchControl);
musicRoom->setItem1(SNAKE, _snakeSpeedControl);
musicRoom->setItem4(SNAKE, _snakeInversionControl);
musicRoom->setItem3(SNAKE, _snakeDirectionControl);
musicRoom->setMuteControl(SNAKE, _snakeMuteControl);
musicRoom->setPitchControl(SNAKE, _snakePitchControl);
musicRoom->setSpeedControl(SNAKE, _snakeSpeedControl);
musicRoom->setInversionControl(SNAKE, _snakeInversionControl);
musicRoom->setDirectionControl(SNAKE, _snakeDirectionControl);
musicRoom->setItem5(PIANO, _pianoMuteControl);
musicRoom->setItem2(PIANO, _pianoPitchControl);
musicRoom->setItem1(PIANO, _pianoSpeedControl);
musicRoom->setItem4(PIANO, _pianoInversionControl);
musicRoom->setItem3(PIANO, _pianoDirectionControl);
musicRoom->setMuteControl(PIANO, _pianoMuteControl);
musicRoom->setPitchControl(PIANO, _pianoPitchControl);
musicRoom->setSpeedControl(PIANO, _pianoSpeedControl);
musicRoom->setInversionControl(PIANO, _pianoInversionControl);
musicRoom->setDirectionControl(PIANO, _pianoDirectionControl);
musicRoom->setItem5(BASS, _bassMuteControl);
musicRoom->setItem2(BASS, _bassPitchControl);
musicRoom->setItem1(BASS, _bassSpeedControl);
musicRoom->setItem4(BASS, _bassInversionControl);
musicRoom->setItem3(BASS, _bassDirectionControl);
musicRoom->setMuteControl(BASS, _bassMuteControl);
musicRoom->setPitchControl(BASS, _bassPitchControl);
musicRoom->setSpeedControl(BASS, _bassSpeedControl);
musicRoom->setInversionControl(BASS, _bassInversionControl);
musicRoom->setDirectionControl(BASS, _bassDirectionControl);
return true;
}
@@ -30,7 +30,7 @@ CGameObjectDescItem::CGameObjectDescItem(): CTreeItem() {
void CGameObjectDescItem::save(SimpleFile *file, int indent) {
file->writeNumberLine(1, indent);
_clipList.save(file, indent);
file->writeQuotedLine(_string1, indent);
file->writeQuotedLine(_name, indent);
file->writeQuotedLine(_string2, indent);
_list1.save(file, indent);
_list2.save(file, indent);
@@ -45,7 +45,7 @@ void CGameObjectDescItem::load(SimpleFile *file) {
if (val)
_clipList.load(file);
_string1 = file->readString();
_name = file->readString();
_string2 = file->readString();
_list1.load(file);
_list1.load(file);
+6 -1
View File
@@ -31,7 +31,7 @@ namespace Titanic {
class CGameObjectDescItem : public CTreeItem {
protected:
CString _string1;
CString _name;
CString _string2;
List<ListItem> _list1;
List<ListItem> _list2;
@@ -49,6 +49,11 @@ public:
* Load the data for the class from file
*/
virtual void load(SimpleFile *file);
/**
* Gets the name of the item, if any
*/
virtual const CString getName() const { return _name; }
};
} // End of namespace Titanic
+20 -20
View File
@@ -84,48 +84,48 @@ bool CMusicConsoleButton::SetMusicControlsMsg(CSetMusicControlsMsg *msg) {
CQueryMusicControlSettingMsg queryMsg;
queryMsg.execute("Bells Mute Control");
musicRoom->setItem5(BELLS, queryMsg._value == 1 ? 1 : 0);
musicRoom->setMuteControl(BELLS, queryMsg._value == 1 ? 1 : 0);
queryMsg.execute("Bells Pitch Control");
musicRoom->setItem2(BELLS, queryMsg._value);
musicRoom->setPitchControl(BELLS, queryMsg._value);
queryMsg.execute("Bells Speed Control");
musicRoom->setItem1(BELLS, queryMsg._value);
musicRoom->setSpeedControl(BELLS, queryMsg._value);
queryMsg.execute("Bells Inversion Control");
musicRoom->setItem4(BELLS, queryMsg._value == 0 ? 1 : 0);
musicRoom->setInversionControl(BELLS, queryMsg._value == 0 ? 1 : 0);
queryMsg.execute("Bells Direction Control");
musicRoom->setItem3(BELLS, queryMsg._value == 0 ? 1 : 0);
musicRoom->setDirectionControl(BELLS, queryMsg._value == 0 ? 1 : 0);
queryMsg.execute("Snake Mute Control");
musicRoom->setItem5(SNAKE, queryMsg._value == 1 ? 1 : 0);
musicRoom->setMuteControl(SNAKE, queryMsg._value == 1 ? 1 : 0);
queryMsg.execute("Snake Pitch Control");
musicRoom->setItem2(SNAKE, queryMsg._value);
musicRoom->setPitchControl(SNAKE, queryMsg._value);
queryMsg.execute("Snake Speed Control");
musicRoom->setItem1(SNAKE, queryMsg._value);
musicRoom->setSpeedControl(SNAKE, queryMsg._value);
queryMsg.execute("Snake Inversion Control");
musicRoom->setItem4(SNAKE, queryMsg._value == 0 ? 1 : 0);
musicRoom->setInversionControl(SNAKE, queryMsg._value == 0 ? 1 : 0);
queryMsg.execute("Snake Direction Control");
musicRoom->setItem3(SNAKE, queryMsg._value == 0 ? 1 : 0);
musicRoom->setDirectionControl(SNAKE, queryMsg._value == 0 ? 1 : 0);
queryMsg.execute("Piano Mute Control");
musicRoom->setItem5(PIANO, queryMsg._value == 1 ? 1 : 0);
musicRoom->setMuteControl(PIANO, queryMsg._value == 1 ? 1 : 0);
queryMsg.execute("Piano Pitch Control");
musicRoom->setItem2(PIANO, queryMsg._value);
musicRoom->setPitchControl(PIANO, queryMsg._value);
queryMsg.execute("Piano Speed Control");
musicRoom->setItem1(PIANO, queryMsg._value);
musicRoom->setSpeedControl(PIANO, queryMsg._value);
queryMsg.execute("Piano Inversion Control");
musicRoom->setItem4(PIANO, queryMsg._value == 0 ? 1 : 0);
musicRoom->setInversionControl(PIANO, queryMsg._value == 0 ? 1 : 0);
queryMsg.execute("Piano Direction Control");
musicRoom->setItem3(PIANO, queryMsg._value == 0 ? 1 : 0);
musicRoom->setDirectionControl(PIANO, queryMsg._value == 0 ? 1 : 0);
queryMsg.execute("Bass Mute Control");
musicRoom->setItem5(BASS, queryMsg._value == 1 ? 1 : 0);
musicRoom->setMuteControl(BASS, queryMsg._value == 1 ? 1 : 0);
queryMsg.execute("Bass Pitch Control");
musicRoom->setItem2(BASS, queryMsg._value);
musicRoom->setPitchControl(BASS, queryMsg._value);
queryMsg.execute("Bass Speed Control");
musicRoom->setItem1(BASS, queryMsg._value);
musicRoom->setSpeedControl(BASS, queryMsg._value);
queryMsg.execute("Bass Inversion Control");
musicRoom->setItem4(BASS, queryMsg._value == 0 ? 1 : 0);
musicRoom->setInversionControl(BASS, queryMsg._value == 0 ? 1 : 0);
queryMsg.execute("Bass Direction Control");
musicRoom->setItem3(BASS, queryMsg._value == 0 ? 1 : 0);
musicRoom->setDirectionControl(BASS, queryMsg._value == 0 ? 1 : 0);
return true;
}
+1 -1
View File
@@ -64,7 +64,7 @@ bool CPlayMusicButton::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
}
bool CPlayMusicButton::FrameMsg(CFrameMsg *msg) {
if (_flag && !CMusicRoom::_musicHandler->isBusy()) {
if (_flag && !CMusicRoom::_musicHandler->poll()) {
CMusicRoom *musicRoom = getMusicRoom();
musicRoom->stopMusic();
stopMovie();
+2 -2
View File
@@ -36,7 +36,7 @@ bool CMusicVoiceMute::MusicSettingChangedMsg(CMusicSettingChangedMsg *msg) {
_controlVal = 0;
CMusicRoom *musicRoom = getMusicRoom();
musicRoom->setItem5(_controlArea, _controlVal == 1 ? 1 : 0);
musicRoom->setMuteControl(_controlArea, _controlVal == 1 ? 1 : 0);
loadFrame(1 - _controlVal);
playSound("z#55.wav", 50);
@@ -46,7 +46,7 @@ bool CMusicVoiceMute::MusicSettingChangedMsg(CMusicSettingChangedMsg *msg) {
bool CMusicVoiceMute::EnterViewMsg(CEnterViewMsg *msg) {
loadFrame(1 - _controlVal);
CMusicRoom *musicRoom = getMusicRoom();
musicRoom->setItem5(_controlArea, _controlVal == 1 ? 1 : 0);
musicRoom->setMuteControl(_controlArea, _controlVal == 1 ? 1 : 0);
return true;
}
+55 -2
View File
@@ -28,12 +28,15 @@ namespace Titanic {
CMusicHandler::CMusicHandler(CProjectItem *project, CSoundManager *soundManager) :
_project(project), _soundManager(soundManager), _stopWaves(false),
_soundHandle(-1), _waveFile(nullptr) {
_soundHandle(-1), _waveFile(nullptr), _soundVolume(100), _ticks(0),
_field108(0) {
Common::fill(&_musicWaves[0], &_musicWaves[4], (CMusicWave *)nullptr);
}
CMusicHandler::~CMusicHandler() {
stop();
for (int idx = 0; idx < 4; ++idx)
delete _musicWaves[idx];
}
CMusicWave *CMusicHandler::createMusicWave(int waveIndex, int count) {
@@ -58,7 +61,12 @@ CMusicWave *CMusicHandler::createMusicWave(int waveIndex, int count) {
return _musicWaves[waveIndex];
}
bool CMusicHandler::isBusy() {
void CMusicHandler::createWaveFile(int musicVolume) {
_soundVolume = musicVolume;
// _waveFile = _soundManager->loadMusic()
}
bool CMusicHandler::poll() {
// TODO
return false;
}
@@ -82,4 +90,49 @@ bool CMusicHandler::checkSound(int index) const {
return false;
}
void CMusicHandler::setSpeedControl2(MusicControlArea area, int value) {
if (area >= 0 && area <= 3 && value >= -2 && value <= 2)
_array2[area]._speedControl = value;
}
void CMusicHandler::setPitchControl2(MusicControlArea area, int value) {
if (area >= 0 && area <= 3 && value >= -2 && value <= 2)
_array2[area]._pitchControl = value * 3;
}
void CMusicHandler::setInversionControl2(MusicControlArea area, int value) {
if (area >= 0 && area <= 3 && value >= -2 && value <= 2)
_array2[area]._inversionControl = value;
}
void CMusicHandler::setDirectionControl2(MusicControlArea area, int value) {
if (area >= 0 && area <= 3 && value >= -2 && value <= 2)
_array2[area]._directionControl = value;
}
void CMusicHandler::setPitchControl(MusicControlArea area, int value) {
if (area >= 0 && area <= 3 && value >= -2 && value <= 2)
_array1[area]._pitchControl = value;
}
void CMusicHandler::setSpeedControl(MusicControlArea area, int value) {
if (area >= 0 && area <= 3 && value >= -2 && value <= 2)
_array1[area]._speedControl = value;
}
void CMusicHandler::setDirectionControl(MusicControlArea area, int value) {
if (area >= 0 && area <= 3 && value >= -2 && value <= 2)
_array1[area]._directionControl = value;
}
void CMusicHandler::setInversionControl(MusicControlArea area, int value) {
if (area >= 0 && area <= 3 && value >= -2 && value <= 2)
_array1[area]._inversionControl = value;
}
void CMusicHandler::setMuteControl(MusicControlArea area, int value) {
if (area >= 0 && area <= 3 && value >= -2 && value <= 2)
_array1[area]._muteControl = value;
}
} // End of namespace Titanic
+54 -1
View File
@@ -31,14 +31,36 @@ namespace Titanic {
class CProjectItem;
class CSoundManager;
enum MusicControlArea { BELLS = 0, SNAKE = 1, PIANO = 2, BASS = 3 };
class CMusicHandler {
struct Controls {
int _pitchControl;
int _speedControl;
int _directionControl;
int _inversionControl;
int _muteControl;
Controls() : _pitchControl(0), _speedControl(0), _directionControl(0),
_inversionControl(0), _muteControl(0) {}
};
struct Array5Entry {
int _v1;
int _v2;
Array5Entry() : _v1(0), _v2(0) {}
};
private:
CProjectItem *_project;
CSoundManager *_soundManager;
CMusicWave *_musicWaves[4];
Controls _array1[4];
Controls _array2[4];
Array5Entry _array5[4];
bool _stopWaves;
CWaveFile *_waveFile;
int _soundHandle;
int _soundVolume;
uint _ticks;
int _field108;
public:
CMusicHandler(CProjectItem *project, CSoundManager *soundManager);
~CMusicHandler();
@@ -51,7 +73,12 @@ public:
*/
CMusicWave *createMusicWave(int waveIndex, int count);
bool isBusy();
void createWaveFile(int musicVolume);
/**
* Handles regular polling the music handler
*/
bool poll();
/**
* Flags whether the loaded music waves will be stopped when the
@@ -65,6 +92,32 @@ public:
void stop();
bool checkSound(int index) const;
/**
* Set a setting
*/
void setSpeedControl2(MusicControlArea area, int value);
/**
* Set a setting
*/
void setPitchControl2(MusicControlArea area, int value);
/**
* Set a setting
*/
void setInversionControl2(MusicControlArea area, int value);
/**
* Set a setting
*/
void setDirectionControl2(MusicControlArea area, int value);
void setPitchControl(MusicControlArea area, int value);
void setSpeedControl(MusicControlArea area, int value);
void setDirectionControl(MusicControlArea area, int value);
void setInversionControl(MusicControlArea area, int value);
void setMuteControl(MusicControlArea area, int value);
};
} // End of namespace Titanic
+1 -1
View File
@@ -97,7 +97,7 @@ bool CMusicPlayer::StopMusicMsg(CStopMusicMsg *msg) {
}
bool CMusicPlayer::FrameMsg(CFrameMsg *msg) {
if (_isActive && !CMusicRoom::_musicHandler->isBusy()) {
if (_isActive && !CMusicRoom::_musicHandler->poll()) {
getMusicRoom()->stopMusic();
_isActive = false;
+35 -3
View File
@@ -32,7 +32,7 @@ CMusicHandler *CMusicRoom::_musicHandler;
CMusicRoom::CMusicRoom(CGameManager *gameManager) :
_gameManager(gameManager) {
_sound = &_gameManager->_sound;
_items.resize(4);
_controls.resize(4);
}
CMusicRoom::~CMusicRoom() {
@@ -52,8 +52,40 @@ void CMusicRoom::destroyMusicHandler() {
_musicHandler = nullptr;
}
void CMusicRoom::startMusic(int musicId) {
// TODO
void CMusicRoom::startMusic(int volume) {
if (_musicHandler) {
_musicHandler->setSpeedControl2(BELLS, 0);
_musicHandler->setSpeedControl2(SNAKE, 1);
_musicHandler->setSpeedControl2(PIANO, -1);
_musicHandler->setSpeedControl2(BASS, -2);
_musicHandler->setPitchControl2(BELLS, 1);
_musicHandler->setPitchControl2(SNAKE, 2);
_musicHandler->setPitchControl2(PIANO, 0);
_musicHandler->setPitchControl2(BELLS, 1);
_musicHandler->setInversionControl2(BELLS, 1);
_musicHandler->setInversionControl2(SNAKE, 0);
_musicHandler->setInversionControl2(PIANO, 1);
_musicHandler->setInversionControl2(BASS, 0);
_musicHandler->setDirectionControl2(BELLS, 0);
_musicHandler->setDirectionControl2(SNAKE, 0);
_musicHandler->setDirectionControl2(PIANO, 1);
_musicHandler->setDirectionControl2(BASS, 1);
for (MusicControlArea idx = BELLS; idx <= BASS;
idx = (MusicControlArea)((int)idx + 1)) {
Controls &controls = _controls[idx];
_musicHandler->setSpeedControl(idx, controls._speedControl);
_musicHandler->setPitchControl(idx, controls._pitchControl);
_musicHandler->setDirectionControl(idx, controls._directionControl);
_musicHandler->setInversionControl(idx, controls._inversionControl);
_musicHandler->setMuteControl(idx, controls._muteControl);
}
_musicHandler->createWaveFile(volume);
}
}
void CMusicRoom::stopMusic() {
+15 -16
View File
@@ -31,20 +31,19 @@ namespace Titanic {
class CGameManager;
class CSound;
enum MusicControlArea { BELLS = 0, SNAKE = 1, PIANO = 2, BASS = 3 };
class CMusicRoom {
struct Entry {
uint _val1;
uint _val2;
uint _val3;
uint _val4;
uint _val5;
struct Controls {
int _speedControl;
int _pitchControl;
int _directionControl;
int _inversionControl;
int _muteControl;
Entry() : _val1(0), _val2(0), _val3(0), _val4(0), _val5(0) {}
Controls() : _speedControl(0), _pitchControl(0), _directionControl(0),
_inversionControl(0), _muteControl(0) {}
};
private:
Common::Array<Entry> _items;
Common::Array<Controls> _controls;
public:
static CMusicHandler *_musicHandler;
public:
@@ -64,16 +63,16 @@ public:
*/
void destroyMusicHandler();
void setItem1(MusicControlArea index, int val) { _items[index]._val1 = val; }
void setItem2(MusicControlArea index, int val) { _items[index]._val2 = val; }
void setItem3(MusicControlArea index, int val) { _items[index]._val3 = val; }
void setItem4(MusicControlArea index, int val) { _items[index]._val4 = val; }
void setItem5(MusicControlArea index, int val) { _items[index]._val5 = val; }
void setSpeedControl(MusicControlArea index, int val) { _controls[index]._speedControl = val; }
void setPitchControl(MusicControlArea index, int val) { _controls[index]._pitchControl = val; }
void setDirectionControl(MusicControlArea index, int val) { _controls[index]._directionControl = val; }
void setInversionControl(MusicControlArea index, int val) { _controls[index]._inversionControl = val; }
void setMuteControl(MusicControlArea index, int val) { _controls[index]._muteControl = val; }
/**
* Start playing a given music number
*/
void startMusic(int musicId);
void startMusic(int volume = 100);
/**
* Stop playing music
+3 -2
View File
@@ -67,7 +67,8 @@ void QMixer::qsWaveMixSetPanRate(int iChannel, uint flags, uint rate) {
}
void QMixer::qsWaveMixSetVolume(int iChannel, uint flags, uint volume) {
// Not currently implemented in ScummVM
}
void QMixer::qsWaveMixSetSourcePosition(int iChannel, uint flags, const QSVECTOR &position) {
@@ -170,4 +171,4 @@ void QMixer::qsWaveMixPump() {
}
}
} // End of namespace Titanic z
} // End of namespace Titanic