diff options
author | Filippos Karapetis | 2009-12-22 20:44:03 +0000 |
---|---|---|
committer | Filippos Karapetis | 2009-12-22 20:44:03 +0000 |
commit | ac28e8165f74a2f425ca78e8ef719179b77127d1 (patch) | |
tree | b8407b1acbc75f6031aea4fa4e0ce7124590e418 | |
parent | 1682b302a8c9568dc9eabfda316506f1896b9754 (diff) | |
download | scummvm-rg350-ac28e8165f74a2f425ca78e8ef719179b77127d1.tar.gz scummvm-rg350-ac28e8165f74a2f425ca78e8ef719179b77127d1.tar.bz2 scummvm-rg350-ac28e8165f74a2f425ca78e8ef719179b77127d1.zip |
SCI/new music code:
- Reverted the code to use local copies of certain sound object selectors, like what was done before
- Simplified and fixed the SCI1.1 digital sound effect playing code
- Removed some duplicate code
- Renamed some sound commands
svn-id: r46487
-rw-r--r-- | engines/sci/sfx/music.cpp | 94 | ||||
-rw-r--r-- | engines/sci/sfx/music.h | 20 | ||||
-rw-r--r-- | engines/sci/sfx/soundcmd.cpp | 158 | ||||
-rw-r--r-- | engines/sci/sfx/soundcmd.h | 2 |
4 files changed, 146 insertions, 128 deletions
diff --git a/engines/sci/sfx/music.cpp b/engines/sci/sfx/music.cpp index 07a5ed29a6..c1e8477e92 100644 --- a/engines/sci/sfx/music.cpp +++ b/engines/sci/sfx/music.cpp @@ -42,7 +42,7 @@ static int f_compare(const void *arg1, const void *arg2) { } SciMusic::SciMusic() { - _segMan = ((SciEngine *)g_engine)->getEngineState()->_segMan; // HACK + } SciMusic::~SciMusic() { @@ -322,41 +322,13 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) { Audio::Mixer::FLAG_UNSIGNED, 0, 0); pSnd->hCurrentAud = Audio::SoundHandle(); } else { - // In SCI1.1 games, sound effects are started from here. If we can find - // a relevant audio resource, play it, otherwise switch to synthesized - // effects. If the resource exists, play it using map 65535 (sound - // effects map) - int16 songNumber = GET_SEL32V(_segMan, pSnd->soundObj, number); - EngineState *s = ((SciEngine *)g_engine)->getEngineState(); // HACK - AudioPlayer *audio = s->_audio; - ResourceManager* resMan = s->resMan; - - if (resMan->testResource(ResourceId(kResourceTypeAudio, songNumber)) && - getSciVersion() >= SCI_VERSION_1_1) { - // Found a relevant audio resource, play it - audio->stopAudio(); - - if (pSnd->pStreamAud) - delete pSnd->pStreamAud; - int sampleLen; - pSnd->pStreamAud = audio->getAudioStream(songNumber, 65535, &sampleLen); - pSnd->hCurrentAud = Audio::SoundHandle(); - - PUT_SEL32V(_segMan, pSnd->soundObj, signal, 0); - - // FIXME: the scripts are signalled that the sound has stopped before it has - // actually stopped, observable in the ship flight sequence in the first scene - // of SQ4CD, right after the intro - soundPlay(pSnd); - } else { - // play MIDI track - if (pSnd->pMidiParser == NULL) { - pSnd->pMidiParser = new MidiParser_SCI(); - pSnd->pMidiParser->setMidiDriver(_pMidiDrv); - pSnd->pMidiParser->setTimerRate(_dwTempo); - } - pSnd->pMidiParser->loadMusic(pTrack, pSnd); + // play MIDI track + if (pSnd->pMidiParser == NULL) { + pSnd->pMidiParser = new MidiParser_SCI(); + pSnd->pMidiParser->setMidiDriver(_pMidiDrv); + pSnd->pMidiParser->setTimerRate(_dwTempo); } + pSnd->pMidiParser->loadMusic(pTrack, pSnd); } } @@ -378,8 +350,13 @@ void SciMusic::onTimer() { } else if (_playList[i]->pStreamAud) { if (!_pMixer->isSoundHandleActive(_playList[i]->hCurrentAud)) { _playList[i]->ticker = 0xFFFF; - PUT_SEL32V(_segMan, _playList[i]->soundObj, signal, 0xFFFF); + _playList[i]->signal = 0xFFFF; _playList[i]->status = kStopped; + + // Signal the engine scripts that the sound is done playing + // FIXME: is there any other place this can be triggered properly? + SegManager *segMan = ((SciEngine *)g_engine)->getEngineState()->_segMan; + PUT_SEL32V(segMan, _playList[i]->soundObj, signal, SIGNAL_OFFSET); } else { _playList[i]->ticker = (uint16)(_pMixer->getSoundElapsedTime( _playList[i]->hCurrentAud) * 0.06); @@ -394,18 +371,12 @@ void SciMusic::doFade(MusicEntry *pSnd) { pSnd->FadeTicker--; else { pSnd->FadeTicker = pSnd->FadeTickerStep; - // Get volume for sound - int16 sndVol = GET_SEL32V(_segMan, pSnd->soundObj, vol); - - if (sndVol + pSnd->FadeStep > pSnd->FadeTo) { - sndVol = pSnd->FadeTo; + if (pSnd->volume + pSnd->FadeStep > pSnd->FadeTo) { + pSnd->volume = pSnd->FadeTo; pSnd->FadeStep = 0; } else - sndVol += pSnd->FadeStep; - - PUT_SEL32V(_segMan, pSnd->soundObj, vol, sndVol); - - pSnd->pMidiParser->setVolume(sndVol); + pSnd->volume += pSnd->FadeStep; + pSnd->pMidiParser->setVolume(pSnd->volume); } } @@ -421,14 +392,11 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { sortPlayList(); } - // Get volume for sound - int16 sndVol = GET_SEL32V(_segMan, pSnd->soundObj, vol); - if (pSnd->pStreamAud && !_pMixer->isSoundHandleActive(pSnd->hCurrentAud)) { _pMixer->playInputStream(Audio::Mixer::kSFXSoundType, &pSnd->hCurrentAud, - pSnd->pStreamAud, -1, sndVol, 0, false); + pSnd->pStreamAud, -1, pSnd->volume, 0, false); } else if (pSnd->pMidiParser) { - pSnd->pMidiParser->setVolume(sndVol); + pSnd->pMidiParser->setVolume(pSnd->volume); if (pSnd->status == kStopped) pSnd->pMidiParser->jumpToTick(0); } @@ -517,8 +485,6 @@ MidiParser_SCI::MidiParser_SCI() : // values of ppqn and tempo are found experimentally and may be wrong _ppqn = 1; setTempo(16667); - - _segMan = ((SciEngine *)g_engine)->getEngineState()->_segMan; // HACK } //--------------------------------------------- MidiParser_SCI::~MidiParser_SCI() { @@ -529,7 +495,7 @@ bool MidiParser_SCI::loadMusic(SoundResource::tagTrack *ptrack, MusicEntry *psnd unloadMusic(); _pTrack = ptrack; _pSnd = psnd; - setVolume(GET_SEL32V(_segMan, _pSnd->soundObj, vol)); + setVolume(psnd->volume); midiMixChannels(); _num_tracks = 1; @@ -567,11 +533,10 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { info.basic.param1 = *(_position._play_pos++); info.basic.param2 = 0; if (info.channel() == 0xF) {// SCI special case - if (info.basic.param1 != 0x7F) { - PUT_SEL32V(_segMan, _pSnd->soundObj, signal, info.basic.param1); - } else { + if (info.basic.param1 != 0x7F) + _pSnd->signal = info.basic.param1; + else _loopTick = _position._play_tick; - } } break; case 0xD: @@ -583,10 +548,8 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { info.basic.param1 = *(_position._play_pos++); info.basic.param2 = *(_position._play_pos++); if (info.channel() == 0xF) {// SCI special - if (info.basic.param1 == 0x60) { - int dataInc = GET_SEL32V(_segMan, _pSnd->soundObj, dataInc); - PUT_SEL32V(_segMan, _pSnd->soundObj, dataInc, dataInc++); - } + if (info.basic.param1 == 0x60) + _pSnd->dataInc++; // BF 50 x - set reverb to x // BF 60 x - dataInc++ // BF 52 x - bHold=x @@ -640,13 +603,12 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { info.ext.data = _position._play_pos; _position._play_pos += info.length; if (info.ext.type == 0x2F) {// end of track reached - uint16 loop = GET_SEL32V(_segMan, _pSnd->soundObj, loop); - if (loop == 0xFFFF) { + if (_pSnd->loop) { jumpToTick(_loopTick); - PUT_SEL32V(_segMan, _pSnd->soundObj, loop, loop--); + _pSnd->loop--; } else { _pSnd->status = kStopped; - PUT_SEL32V(_segMan, _pSnd->soundObj, signal, 0xFFFF); + _pSnd->signal = 0xFFFF; } } break; diff --git a/engines/sci/sfx/music.h b/engines/sci/sfx/music.h index 00db3943ed..b02a7064f8 100644 --- a/engines/sci/sfx/music.h +++ b/engines/sci/sfx/music.h @@ -55,8 +55,6 @@ namespace Sci { typedef uint16 SCIHANDLE; typedef uint16 HEAPHANDLE; -class SegManager; - enum kTrackType { kTrackAdlib = 0, kTrackGameBlaster = 9, @@ -72,18 +70,24 @@ enum kSndStatus { class MidiParser_SCI; struct MusicEntry { - SoundResource *soundRes; reg_t soundObj; - int16 prio; // stored for faster sound sorting - MidiParser_SCI *pMidiParser; - // Variables used for music fading + SoundResource *soundRes; + uint16 resnum; + + uint16 dataInc; uint16 ticker; + uint16 signal; + byte prio; + byte loop; + byte volume; + byte FadeTo; short FadeStep; uint32 FadeTicker; uint32 FadeTickerStep; + MidiParser_SCI *pMidiParser; Audio::AudioStream* pStreamAud; Audio::SoundHandle hCurrentAud; kSndStatus status; @@ -146,7 +150,6 @@ protected: bool _bMultiMidi; // use adlib's digital track if midi track don't have one private: static void miditimerCallback(void *p); - SegManager *_segMan; }; class MidiParser_SCI : public MidiParser { @@ -175,9 +178,6 @@ protected: MusicEntry *_pSnd; uint32 _loopTick; byte _volume; - -private: - SegManager *_segMan; }; } // end of namespace diff --git a/engines/sci/sfx/soundcmd.cpp b/engines/sci/sfx/soundcmd.cpp index edb6b7bc44..7c654622af 100644 --- a/engines/sci/sfx/soundcmd.cpp +++ b/engines/sci/sfx/soundcmd.cpp @@ -156,10 +156,10 @@ SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segM SOUNDCOMMAND(cmdDisposeHandle); SOUNDCOMMAND(cmdMuteSound); SOUNDCOMMAND(cmdStopHandle); - SOUNDCOMMAND(cmdSuspendHandle); + SOUNDCOMMAND(cmdPauseHandle); SOUNDCOMMAND(cmdResumeHandle); SOUNDCOMMAND(cmdVolume); - SOUNDCOMMAND(cmdUpdateVolumePriority); + SOUNDCOMMAND(cmdUpdateHandle); SOUNDCOMMAND(cmdFadeHandle); SOUNDCOMMAND(cmdGetPolyphony); SOUNDCOMMAND(cmdGetPlayNext); @@ -174,7 +174,7 @@ SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segM SOUNDCOMMAND(cmdDisposeHandle); SOUNDCOMMAND(cmdPlayHandle); SOUNDCOMMAND(cmdStopHandle); - SOUNDCOMMAND(cmdSuspendHandle); + SOUNDCOMMAND(cmdPauseHandle); SOUNDCOMMAND(cmdFadeHandle); SOUNDCOMMAND(cmdUpdateCues); SOUNDCOMMAND(cmdSendMidi); @@ -192,7 +192,7 @@ SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segM SOUNDCOMMAND(cmdDisposeHandle); SOUNDCOMMAND(cmdPlayHandle); SOUNDCOMMAND(cmdStopHandle); - SOUNDCOMMAND(cmdSuspendHandle); + SOUNDCOMMAND(cmdPauseHandle); SOUNDCOMMAND(cmdFadeHandle); SOUNDCOMMAND(cmdHoldHandle); SOUNDCOMMAND(cmdDummy); @@ -202,7 +202,7 @@ SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segM SOUNDCOMMAND(cmdUpdateCues); SOUNDCOMMAND(cmdSendMidi); SOUNDCOMMAND(cmdReverb); - SOUNDCOMMAND(cmdUpdateVolumePriority); + SOUNDCOMMAND(cmdUpdateHandle); break; default: warning("Sound command parser: unknown DoSound type %d", doSoundVersion); @@ -242,7 +242,10 @@ reg_t SoundCommandParser::parseCommand(int argc, reg_t *argv, reg_t acc) { } void SoundCommandParser::cmdInitHandle(reg_t obj, int16 value) { - int number = obj.segment ? GET_SEL32V(_segMan, obj, number) : -1; + if (!obj.segment) + return; + + int number = obj.segment ? GET_SEL32V(_segMan, obj, number) : 0; #ifdef USE_OLD_MUSIC_FUNCTIONS @@ -283,10 +286,15 @@ void SoundCommandParser::cmdInitHandle(reg_t obj, int16 value) { MusicEntry *newSound = new MusicEntry(); newSound->soundRes = 0; - if (_resMan->testResource(ResourceId(kResourceTypeSound, number))) + newSound->resnum = number; + if (number && _resMan->testResource(ResourceId(kResourceTypeSound, number))) newSound->soundRes = new SoundResource(number, _resMan); newSound->soundObj = obj; + newSound->loop = GET_SEL32V(_segMan, obj, loop) == 0xFFFF ? 1 : 0; newSound->prio = GET_SEL32V(_segMan, obj, pri) & 0xFF; + newSound->volume = GET_SEL32V(_segMan, obj, vol) & 0xFF; + newSound->signal = 0; + newSound->dataInc = 0; newSound->pStreamAud = 0; newSound->pMidiParser = 0; newSound->ticker = 0; @@ -297,8 +305,20 @@ void SoundCommandParser::cmdInitHandle(reg_t obj, int16 value) { newSound->status = kStopped; _music->_playList.push_back(newSound); - if (newSound->soundRes) - _music->soundInitSnd(newSound); + // In SCI1.1 games, sound effects are started from here. If we can find + // a relevant audio resource, play it, otherwise switch to synthesized + // effects. If the resource exists, play it using map 65535 (sound + // effects map) + + if (_resMan->testResource(ResourceId(kResourceTypeAudio, number)) && getSciVersion() >= SCI_VERSION_1_1) { + // Found a relevant audio resource, play it + int sampleLen; + newSound->pStreamAud = _audio->getAudioStream(number, 65535, &sampleLen); + newSound->hCurrentAud = Audio::SoundHandle(); + } else { + if (newSound->soundRes) + _music->soundInitSnd(newSound); + } #endif } @@ -375,18 +395,28 @@ void SoundCommandParser::cmdPlayHandle(reg_t obj, int16 value) { #else if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) { - //int number = obj.segment ? GET_SEL32V(_segMan, obj, number) : -1; - PUT_SEL32V(_segMan, obj, handle, 0x1234); - PUT_SEL32V(_segMan, obj, signal, 0); - PUT_SEL32V(_segMan, obj, min, 0); - PUT_SEL32V(_segMan, obj, sec, 0); - PUT_SEL32V(_segMan, obj, frame, 0); int slot = _music->findListSlot(obj); if (slot < 0) { warning("cmdPlayHandle: Slot not found"); return; } - _music->_playList[slot]->prio = GET_SEL32V(_segMan, obj, priority) & 0xFF; + + int number = obj.segment ? GET_SEL32V(_segMan, obj, number) : -1; + + if (_music->_playList[slot]->resnum != number) { // another sound loaded into struct + cmdDisposeHandle(obj, value); + cmdInitHandle(obj, value); + } + + PUT_SEL32V(_segMan, obj, handle, 0x1234); + PUT_SEL32V(_segMan, obj, signal, 0); + PUT_SEL32V(_segMan, obj, min, 0); + PUT_SEL32V(_segMan, obj, sec, 0); + PUT_SEL32V(_segMan, obj, frame, 0); + + _music->_playList[slot]->loop = GET_SEL32V(_segMan, obj, loop) == 0xFFFF ? 1 : 0; + _music->_playList[slot]->prio = GET_SEL32V(_segMan, obj, priority); + _music->_playList[slot]->volume = GET_SEL32V(_segMan, obj, vol); _music->soundPlay(_music->_playList[slot]); } #endif @@ -455,13 +485,14 @@ void SoundCommandParser::cmdStopHandle(reg_t obj, int16 value) { PUT_SEL32V(_segMan, obj, signal, SIGNAL_OFFSET); if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) { - PUT_SEL32V(_segMan, obj, dataInc, 0); + _music->_playList[slot]->dataInc = 0; + _music->_playList[slot]->signal = SIGNAL_OFFSET; _music->soundStop(_music->_playList[slot]); } #endif } -void SoundCommandParser::cmdSuspendHandle(reg_t obj, int16 value) { +void SoundCommandParser::cmdPauseHandle(reg_t obj, int16 value) { if (!obj.segment) return; @@ -473,7 +504,7 @@ void SoundCommandParser::cmdSuspendHandle(reg_t obj, int16 value) { #else int slot = _music->findListSlot(obj); if (slot < 0) { - warning("cmdSuspendHandle: Slot not found"); + warning("cmdPauseHandle: Slot not found"); return; } @@ -487,6 +518,8 @@ void SoundCommandParser::cmdSuspendHandle(reg_t obj, int16 value) { } void SoundCommandParser::cmdResumeHandle(reg_t obj, int16 value) { + // SCI0 only command + if (!obj.segment) return; @@ -596,14 +629,32 @@ void SoundCommandParser::cmdGetPolyphony(reg_t obj, int16 value) { } void SoundCommandParser::cmdUpdateHandle(reg_t obj, int16 value) { -#ifndef USE_OLD_MUSIC_FUNCTIONS + if (!obj.segment) + return; + +#ifdef USE_OLD_MUSIC_FUNCTIONS + SongHandle handle = FROBNICATE_HANDLE(obj); + if (!_hasNodePtr && obj.segment) { + _state->sfx_song_set_loops(handle, GET_SEL32V(_segMan, obj, loop)); + script_set_priority(_resMan, _segMan, _state, obj, GET_SEL32V(_segMan, obj, pri)); + } +#else int slot = _music->findListSlot(obj); if (slot < 0) { warning("cmdUpdateHandle: Slot not found"); return; } - _music->_playList[slot]->prio = GET_SEL32V(_segMan, obj, priority) & 0xFF; + if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) { + _music->_playList[slot]->loop = (GET_SEL32V(_segMan, obj, loop) == 0xFFFF ? 1 : 0); + uint32 objVol = GET_SEL32V(_segMan, obj, vol); + if (objVol != _music->_playList[slot]->volume) + _music->soundSetVolume(_music->_playList[slot], objVol); + uint32 objPrio = GET_SEL32V(_segMan, obj, vol); + if (objPrio != _music->_playList[slot]->prio) + _music->soundSetPriority(_music->_playList[slot], objPrio); + } + #endif } @@ -690,16 +741,18 @@ void SoundCommandParser::cmdUpdateCues(reg_t obj, int16 value) { if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) { uint16 signal = GET_SEL32V(_segMan, obj, signal); - int16 dataInc = GET_SEL32V(_segMan, obj, dataInc); - switch (signal) { case 0: - PUT_SEL32V(_segMan, obj, signal, dataInc + 127); + if (_music->_playList[slot]->dataInc != GET_SEL32V(_segMan, obj, dataInc)) { + PUT_SEL32V(_segMan, obj, dataInc, _music->_playList[slot]->dataInc); + PUT_SEL32V(_segMan, obj, signal, _music->_playList[slot]->dataInc + 127); + } break; case 0xFFFF: cmdStopHandle(obj, value); break; default: + PUT_SEL32V(_segMan, obj, signal, _music->_playList[slot]->signal); break; } @@ -743,21 +796,30 @@ void SoundCommandParser::cmdGetPlayNext(reg_t obj, int16 value) { } void SoundCommandParser::cmdSetHandleVolume(reg_t obj, int16 value) { + if (!obj.segment) + return; + #ifndef USE_OLD_MUSIC_FUNCTIONS int slot = _music->findListSlot(obj); if (slot < 0) { - warning("cmdUpdateVolumePriority: Slot not found"); + warning("cmdSetHandleVolume: Slot not found"); return; } if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) { - _music->soundSetVolume(_music->_playList[slot], value); - PUT_SEL32V(_segMan, obj, vol, value); + if (_music->_playList[slot]->volume != value) { + _music->_playList[slot]->volume = value; + _music->soundSetVolume(_music->_playList[slot], value); + PUT_SEL32V(_segMan, obj, vol, value); + } } #endif } void SoundCommandParser::cmdSetHandlePriority(reg_t obj, int16 value) { + if (!obj.segment) + return; + #ifdef USE_OLD_MUSIC_FUNCTIONS script_set_priority(_resMan, _segMan, _state, obj, value); #else @@ -779,11 +841,26 @@ void SoundCommandParser::cmdSetHandlePriority(reg_t obj, int16 value) { } void SoundCommandParser::cmdSetHandleLoop(reg_t obj, int16 value) { + if (!obj.segment) + return; + if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) { - PUT_SEL32V(_segMan, obj, loop, value == -1 ? 0xFFFF : 1); #ifdef USE_OLD_MUSIC_FUNCTIONS - SongHandle handle = FROBNICATE_HANDLE(obj); - _state->sfx_song_set_loops(handle, value); + SongHandle handle = FROBNICATE_HANDLE(obj); + _state->sfx_song_set_loops(handle, value); +#else + int slot = _music->findListSlot(obj); + if (slot < 0) { + warning("cmdSetHandleLoop: Slot not found"); + return; + } + if (value == -1) { + _music->_playList[slot]->loop = 1; + PUT_SEL32V(_segMan, obj, loop, 0xFFFF); + } else { + _music->_playList[slot]->loop = 0; + PUT_SEL32V(_segMan, obj, loop, 1); + } #endif } } @@ -793,25 +870,4 @@ void SoundCommandParser::cmdSuspendSound(reg_t obj, int16 value) { warning("STUB: cmdSuspendSound"); } -void SoundCommandParser::cmdUpdateVolumePriority(reg_t obj, int16 value) { -#ifdef USE_OLD_MUSIC_FUNCTIONS - SongHandle handle = FROBNICATE_HANDLE(obj); - if (!_hasNodePtr && obj.segment) { - _state->sfx_song_set_loops(handle, GET_SEL32V(_segMan, obj, loop)); - script_set_priority(_resMan, _segMan, _state, obj, GET_SEL32V(_segMan, obj, pri)); - } -#else - int slot = _music->findListSlot(obj); - if (slot < 0) { - warning("cmdUpdateVolumePriority: Slot not found"); - return; - } - - if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) { - _music->soundSetVolume(_music->_playList[slot], GET_SEL32V(_segMan, obj, vol)); - _music->soundSetPriority(_music->_playList[slot], GET_SEL32V(_segMan, obj, priority)); - } -#endif -} - } // End of namespace Sci diff --git a/engines/sci/sfx/soundcmd.h b/engines/sci/sfx/soundcmd.h index 7ff2322383..7a714a6e3e 100644 --- a/engines/sci/sfx/soundcmd.h +++ b/engines/sci/sfx/soundcmd.h @@ -74,7 +74,7 @@ private: void cmdPlayHandle(reg_t obj, int16 value); void cmdDummy(reg_t obj, int16 value); void cmdMuteSound(reg_t obj, int16 value); - void cmdSuspendHandle(reg_t obj, int16 value); + void cmdPauseHandle(reg_t obj, int16 value); void cmdResumeHandle(reg_t obj, int16 value); void cmdStopHandle(reg_t obj, int16 value); void cmdDisposeHandle(reg_t obj, int16 value); |