aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/sfx
diff options
context:
space:
mode:
authorFilippos Karapetis2009-11-29 14:48:15 +0000
committerFilippos Karapetis2009-11-29 14:48:15 +0000
commit3cedd0f2b9d8df729ece264b8dfb39253a092937 (patch)
tree2f848948920cd2c7f2fb8d55378ebbd2c039b9c6 /engines/sci/sfx
parentdc22fc1c9e7ad026990ed553ac368d1a125bf415 (diff)
downloadscummvm-rg350-3cedd0f2b9d8df729ece264b8dfb39253a092937.tar.gz
scummvm-rg350-3cedd0f2b9d8df729ece264b8dfb39253a092937.tar.bz2
scummvm-rg350-3cedd0f2b9d8df729ece264b8dfb39253a092937.zip
Started assigning the code from Greg's SCI engine to our sound commands - still WIP
svn-id: r46197
Diffstat (limited to 'engines/sci/sfx')
-rw-r--r--engines/sci/sfx/soundcmd.cpp211
1 files changed, 181 insertions, 30 deletions
diff --git a/engines/sci/sfx/soundcmd.cpp b/engines/sci/sfx/soundcmd.cpp
index ec90d49c4e..4a42a2f457 100644
--- a/engines/sci/sfx/soundcmd.cpp
+++ b/engines/sci/sfx/soundcmd.cpp
@@ -131,10 +131,8 @@ SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segM
_hasNodePtr = (((SciEngine*)g_engine)->getKernel()->_selectorCache.nodePtr != -1);
-#ifndef USE_OLD_MUSIC_FUNCTIONS
_music = new SciMusic();
_music->init();
-#endif
switch (doSoundVersion) {
case SCI_VERSION_0_EARLY:
@@ -351,6 +349,31 @@ void SoundCommandParser::cmdPlayHandle(reg_t obj, SongHandle handle, int value)
PUT_SEL32V(_segMan, obj, signal, 0);
}
}
+
+#if 0
+ if (hobj == 0)
+ return;
+ Object obj(hobj);
+ HEAPHANDLE hptr = obj.getProperty(44);
+ if (hptr) {
+ sciSound *pSnd = (sciSound *)heap2Ptr(hptr);
+ if (pSnd->resnum != obj.getProperty(43)) { // another sound loaded into struct
+ KillSnd(hobj);
+ InitSnd(hobj);
+ }
+ ResMgr.ResLock(SCI_RES_SOUND, pSnd->resnum);
+ obj.setProperty(93, 0x1234/*res->getHandle()*/); // handle
+ obj.setProperty(17, 0); // signal
+ obj.setProperty(94, 0); // min
+ obj.setProperty(95, 0); // sec
+ obj.setProperty(96, 0); // frame
+ pSnd->loop = (obj.getProperty(6) == 0xFFFF ? 1 : 0); // loop
+ pSnd->prio = obj.getProperty(63); // priority
+ pSnd->volume = obj.getProperty(97); // vol
+ //ChangeSndState(hobj);
+ _audio->soundPlay(pSnd);
+ }
+#endif
}
void SoundCommandParser::cmdDummy(reg_t obj, SongHandle handle, int value) {
@@ -374,6 +397,22 @@ void SoundCommandParser::cmdDisposeHandle(reg_t obj, SongHandle handle, int valu
if (!_hasNodePtr)
PUT_SEL32V(_segMan, obj, handle, 0x0000);
}
+
+#if 0
+ if (hobj == 0)
+ return;
+ Object obj(hobj);
+ StopSnd(hobj);
+ HEAPHANDLE hptr = obj.getProperty(44); // nodePtr
+ if (hptr) {
+ sciSound *pSnd = (sciSound *)heap2Ptr(hptr);
+ _audio->soundKill(pSnd);
+ ResMgr.ResUnload(SCI_RES_SOUND, pSnd->resnum);
+ _soundList->DeleteNode(hptr);
+ heapDisposePtr(hptr);
+ }
+ obj.setProperty(44, 0); // nodePtr
+#endif
}
void SoundCommandParser::cmdStopHandle(reg_t obj, SongHandle handle, int value) {
@@ -381,6 +420,20 @@ void SoundCommandParser::cmdStopHandle(reg_t obj, SongHandle handle, int value)
if (_hasNodePtr)
PUT_SEL32V(_segMan, obj, signal, SIGNAL_OFFSET);
+
+#if 0
+ if (hobj == 0)
+ return;
+ Object obj(hobj);
+ obj.setProperty(93, 0); // handle
+ obj.setProperty(17, 0xFFFF); // signal
+ sciSound *pSnd = (sciSound *)heap2Ptr(obj.getProperty(44));
+ if (pSnd) {
+ pSnd->dataInc = 0;
+ pSnd->signal = 0xFFFF;
+ _audio->soundStop(pSnd);
+ }
+#endif
}
void SoundCommandParser::cmdSuspendHandle(reg_t obj, SongHandle handle, int value) {
@@ -388,6 +441,21 @@ void SoundCommandParser::cmdSuspendHandle(reg_t obj, SongHandle handle, int valu
changeHandleStatus(obj, handle, SOUND_STATUS_SUSPENDED);
else
changeHandleStatus(obj, handle, value ? SOUND_STATUS_SUSPENDED : SOUND_STATUS_PLAYING);
+
+#if 0
+ // PauseSnd(argv[2], argv[3]); - PauseSnd(HEAPHANDLE hobj, uint16 w)
+ if (hobj == 0)
+ return;
+ Object obj(hobj);
+ HEAPHANDLE hnode = obj.getProperty(44); // nodePtr
+ if (!hnode)
+ return;
+ sciSound *pSnd = (sciSound *)heap2Ptr(hnode);
+ if (w)
+ _audio->soundPause(pSnd);
+ else
+ _audio->soundPlay(pSnd);
+#endif
}
void SoundCommandParser::cmdResumeHandle(reg_t obj, SongHandle handle, int value) {
@@ -395,6 +463,8 @@ void SoundCommandParser::cmdResumeHandle(reg_t obj, SongHandle handle, int value
}
void SoundCommandParser::cmdMuteSound(reg_t obj, SongHandle handle, int value) {
+ //_acc = _music->SoundOn(argc > 1 ? argv[2] : 0xFF);
+
// TODO
/* if there's a parameter, we're setting it. Otherwise, we're querying it. */
@@ -407,10 +477,9 @@ void SoundCommandParser::cmdMuteSound(reg_t obj, SongHandle handle, int value) {
}
void SoundCommandParser::cmdVolume(reg_t obj, SongHandle handle, int value) {
- if (obj != SIGNAL_REG)
- _state->sfx_setVolume(obj.toSint16());
-
- _acc = make_reg(0, _state->sfx_getVolume());
+ if (_argc > 1)
+ _music->soundSetMasterVolume(obj.toSint16());
+ _acc = make_reg(0, _music->soundGetMasterVolume());
}
void SoundCommandParser::cmdFadeHandle(reg_t obj, SongHandle handle, int value) {
@@ -446,36 +515,43 @@ void SoundCommandParser::cmdFadeHandle(reg_t obj, SongHandle handle, int value)
PUT_SEL32V(_segMan, obj, signal, SIGNAL_OFFSET);
}
}
+
+#if 0
+ // FadeSnd(argv[2], argv[3], argv[4], argv[5]);
+
+//void SciEngine::FadeSnd(HEAPHANDLE hobj, uint16 tVolume, uint16 tickerstep, int16 fadestep) {
+ if (hobj == 0)
+ return;
+ Object obj(hobj);
+ HEAPHANDLE hnode = obj.getProperty(44); // nodePtr
+ if (!hnode)
+ return;
+ sciSound *pSnd = (sciSound *)heap2Ptr(hnode);
+ pSnd->FadeTo = tVolume;
+ pSnd->FadeStep = pSnd->volume > tVolume ? -fadestep : fadestep;
+ pSnd->FadeTickerStep = tickerstep * 16667 / _audio->soundGetTempo();
+ pSnd->FadeTicker = 0;
+//}
+#endif
}
void SoundCommandParser::cmdGetPolyphony(reg_t obj, SongHandle handle, int value) {
_acc = make_reg(0, _state->sfx_get_player_polyphony());
-}
-
-void cmdGetPlayNext(EngineState *s, reg_t obj, SongHandle handle, int value) {
- // TODO
- // _state->sfx_all_stop();
+ // TODO: Amiga music
+ //_acc = make_reg(0, _music->soundGetVoices());
}
void SoundCommandParser::cmdUpdateHandle(reg_t obj, SongHandle handle, int value) {
- // FIXME: Get these from the sound server
- int signal = 0;
- int min = 0;
- int sec = 0;
- int frame = 0;
-
- // FIXME: Update the sound server state with 'vol'
- //int vol = GET_SEL32V(segMan, obj, vol);
-
- _state->sfx_song_set_loops(handle, GET_SEL32V(_segMan, obj, loop));
- _state->sfx_song_renice(handle, GET_SEL32V(_segMan, obj, pri));
-
- debugC(2, kDebugLevelSound, "[sound01-update-handle] -- CUE %04x:%04x", PRINT_REG(obj));
-
- PUT_SEL32V(_segMan, obj, signal, signal);
- PUT_SEL32V(_segMan, obj, min, min);
- PUT_SEL32V(_segMan, obj, sec, sec);
- PUT_SEL32V(_segMan, obj, frame, frame);
+ if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) {
+ int16 loop = GET_SEL32V(_segMan, obj, loop);
+ int16 vol = GET_SEL32V(_segMan, obj, vol);
+ int16 priority = GET_SEL32V(_segMan, obj, priority);
+
+ // TODO: pSnd
+ //pSnd->loop = (loop == 0xFFFF ? 1 : 0);
+ //_music->soundSetVolume(pSnd, vol);
+ //_music->soundSetPriority(pSnd, prio);
+ }
}
void SoundCommandParser::cmdUpdateCues(reg_t obj, SongHandle handle, int value) {
@@ -546,6 +622,35 @@ void SoundCommandParser::cmdUpdateCues(reg_t obj, SongHandle handle, int value)
PUT_SEL32V(_segMan, obj, sec, sec);
PUT_SEL32V(_segMan, obj, frame, frame);
}
+
+#if 0
+ if (hobj == 0)
+ return;
+ Object obj(hobj);
+ HEAPHANDLE hnode = obj.getProperty(44); // nodePtr
+ if (hnode) {
+ sciSound *pSnd = (sciSound *)heap2Ptr(hnode);
+ switch (pSnd->signal) {
+ case 0:
+ if (pSnd->dataInc != obj.getProperty(92)) { // dataInc
+ obj.setProperty(92, pSnd->dataInc); // dataInc
+ obj.setProperty(17, pSnd->dataInc + 127); // signal
+ }
+ break;
+ case 0xFFFF:
+ StopSnd(hobj);
+ break;
+ default:
+ obj.setProperty(17, pSnd->signal); // signal
+ }
+ //D13E
+ pSnd->signal = 0;
+ obj.setProperty(94, pSnd->ticker / 3600); // .min
+ obj.setProperty(95, pSnd->ticker % 3600 / 60); // .sec
+ obj.setProperty(96, pSnd->ticker); // .frame
+ obj.setProperty(97, pSnd->volume); // volume
+ }
+#endif
}
void SoundCommandParser::cmdSendMidi(reg_t obj, SongHandle handle, int value) {
@@ -559,6 +664,7 @@ void SoundCommandParser::cmdReverb(reg_t obj, SongHandle handle, int value) {
}
void SoundCommandParser::cmdHoldHandle(reg_t obj, SongHandle handle, int value) {
_state->sfx_song_set_hold(handle, value);
+ // TODO
}
void SoundCommandParser::cmdGetAudioCapability(reg_t obj, SongHandle handle, int value) {
@@ -571,17 +677,49 @@ void SoundCommandParser::cmdGetPlayNext(reg_t obj, SongHandle handle, int value)
void SoundCommandParser::cmdSetHandleVolume(reg_t obj, SongHandle handle, int value) {
// TODO
+#if 0
+ if (hobj == 0)
+ return;
+ Object obj(hobj);
+ sciSound *pSnd;
+ HEAPHANDLE hnode = obj.getProperty(44); // nodePtr
+ if (hnode && (pSnd = (sciSound *)heap2Ptr(hnode))) {
+ if (pSnd->volume != w) {
+ pSnd->volume = w;
+ _audio->soundSetVolume(pSnd, w);
+ obj.setProperty(97, w); // volume
+ }
+ }
+#endif
}
void SoundCommandParser::cmdSetHandlePriority(reg_t obj, SongHandle handle, int value) {
script_set_priority(_resMan, _segMan, _state, obj, value);
+
+#if 0
+ if (hobj == 0)
+ return;
+ Object obj(hobj);
+ sciSound *pSnd;
+ HEAPHANDLE hnode = obj.getProperty(44); // nodePtr
+ if (hnode && (pSnd = (sciSound *)heap2Ptr(hnode))) {
+ if (w == 0xFFFF) {
+ //pSnd->prio=0;field_15B=0
+ obj.setProperty(102, obj.getProperty(102) & 0xFD);//flags
+ } else {
+ //pSnd->field_15B=1;
+ obj.setProperty(102, obj.getProperty(102) | 2);//flags
+ //DoSOund(0xF,hobj,w)
+ }
+ }
+#endif
}
void SoundCommandParser::cmdSetHandleLoop(reg_t obj, SongHandle handle, int value) {
if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) {
uint16 looping = (value == -1) ? 1 : 0xFFFF;
_state->sfx_song_set_loops(handle, looping);
- PUT_SEL32V(_segMan, obj, loop, looping);
+ PUT_SEL32V(_segMan, obj, loop, (value == -1) ? 0xFFFF : 1);
}
}
@@ -594,6 +732,19 @@ void SoundCommandParser::cmdUpdateVolumePriority(reg_t obj, SongHandle handle, i
_state->sfx_song_set_loops(handle, GET_SEL32V(_segMan, obj, loop));
script_set_priority(_resMan, _segMan, _state, obj, GET_SEL32V(_segMan, obj, pri));
}
+
+#if 0
+ if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) {
+ int16 loop = GET_SEL32V(_segMan, obj, loop);
+ int16 vol = GET_SEL32V(_segMan, obj, vol);
+ int16 priority = GET_SEL32V(_segMan, obj, priority);
+
+ // TODO: pSnd
+ //pSnd->loop = (loop == 0xFFFF ? 1 : 0);
+ //_music->soundSetVolume(pSnd, vol);
+ //_music->soundSetPriority(pSnd, prio);
+ }
+#endif
}
} // End of namespace Sci