mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-15 14:18:37 +00:00
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
This commit is contained in:
parent
1682b302a8
commit
ac28e8165f
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user