SCI: Rewrap yet more comments

svn-id: r50505
This commit is contained in:
Max Horn 2010-06-29 20:50:52 +00:00
parent 7951e3ddcf
commit b09996cb5c
3 changed files with 69 additions and 50 deletions

View File

@ -77,9 +77,10 @@ int AudioPlayer::startAudio(uint16 module, uint32 number) {
}
int AudioPlayer::wPlayAudio(uint16 module, uint32 tuple) {
// Get the audio sample length and set the wPlay flag so we return 0 on position.
// SSCI pre-loads the audio here, but it's much easier for us to just get the
// sample length and return that. wPlayAudio should *not* actually start the sample.
// Get the audio sample length and set the wPlay flag so we return 0 on
// position. SSCI pre-loads the audio here, but it's much easier for us to
// just get the sample length and return that. wPlayAudio should *not*
// actually start the sample.
int sampleLen = 0;
Audio::AudioStream *audioStream = getAudioStream(tuple, module, &sampleLen);
@ -272,8 +273,8 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32
byte *compressedData = (byte *)malloc(audioRes->size);
assert(compressedData);
// We copy over the compressed data in our own buffer. We have to do
// this, because ResourceManager may free the original data late.
// All other compression types already decompress completely into an
// this, because ResourceManager may free the original data late. All
// other compression types already decompress completely into an
// additional buffer here. MP3/OGG/FLAC decompression works on-the-fly
// instead.
memcpy(compressedData, audioRes->data, audioRes->size);
@ -367,8 +368,9 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32
*sampleLen = (audioSeekStream->getLength().msecs() * 60) / 1000; // we translate msecs to ticks
audioStream = audioSeekStream;
}
// We have to make sure that we don't depend on resource manager pointers after this point, because the actual
// audio resource may get unloaded by resource manager at any time
// We have to make sure that we don't depend on resource manager pointers
// after this point, because the actual audio resource may get unloaded by
// resource manager at any time.
if (audioStream)
return audioStream;

View File

@ -64,11 +64,16 @@ void SciMusic::init() {
_dwTempo = 0;
// Default to MIDI in SCI32 games, as many don't have AdLib support.
// WORKAROUND: Default to MIDI in Amiga SCI1_EGA+ games as we don't support those patches yet.
// We also don't yet support the 7.pat file of SCI1+ Mac games or SCI0 Mac patches, so we
// default to MIDI in those games to let them run.
// WORKAROUND: Default to MIDI in Amiga SCI1_EGA+ games as we don't support
// those patches yet. We also don't yet support the 7.pat file of SCI1+ Mac
// games or SCI0 Mac patches, so we default to MIDI in those games to let
// them run.
Common::Platform platform = g_sci->getPlatform();
uint32 dev = MidiDriver::detectDevice((getSciVersion() >= SCI_VERSION_2 || platform == Common::kPlatformMacintosh || (platform == Common::kPlatformAmiga && getSciVersion() >= SCI_VERSION_1_EGA)) ? (MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM) : (MDT_PCSPK | MDT_ADLIB | MDT_MIDI));
uint32 dev = MidiDriver::detectDevice(
(getSciVersion() >= SCI_VERSION_2 || platform == Common::kPlatformMacintosh ||
(platform == Common::kPlatformAmiga && getSciVersion() >= SCI_VERSION_1_EGA))
? (MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM)
: (MDT_PCSPK | MDT_ADLIB | MDT_MIDI));
switch (MidiDriver::getMusicType(dev)) {
case MT_ADLIB:
@ -100,7 +105,8 @@ void SciMusic::init() {
_bMultiMidi = ConfMan.getBool("multi_midi");
// Find out what the first possible channel is (used, when doing channel remapping)
// Find out what the first possible channel is (used, when doing channel
// remapping).
_driverFirstChannel = _pMidiDrv->getFirstChannel();
}
@ -128,9 +134,10 @@ void SciMusic::putMidiCommandInQueue(uint32 midi) {
_queuedCommands.push_back(midi);
}
// This sends the stored commands from queue to driver (is supposed to get called only during onTimer())
// at least mt32 emulation doesn't like getting note-on commands from main thread (if we directly send, we would get
// a crash during piano scene in lsl5)
// This sends the stored commands from queue to driver (is supposed to get
// called only during onTimer()). At least mt32 emulation doesn't like getting
// note-on commands from main thread (if we directly send, we would get a crash
// during piano scene in lsl5).
void SciMusic::sendMidiCommandsFromQueue() {
uint curCommand = 0;
uint commandCount = _queuedCommands.size();
@ -210,10 +217,10 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) {
int channelFilterMask = 0;
SoundResource::Track *track = pSnd->soundRes->getTrackByType(_pMidiDrv->getPlayId());
// If MIDI device is selected but there is no digital track in sound resource
// try to use adlib's digital sample if possible
// Also, if the track couldn't be found, load the digital track, as some games
// depend on this (e.g. the Longbow demo)
// If MIDI device is selected but there is no digital track in sound
// resource try to use adlib's digital sample if possible. Also, if the
// track couldn't be found, load the digital track, as some games depend on
// this (e.g. the Longbow demo).
if (!track || (_bMultiMidi && track->digitalChannelNr == -1)) {
SoundResource::Track *digital = pSnd->soundRes->getDigitalTrack();
if (digital)
@ -260,8 +267,8 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) {
}
}
// This one checks, if requested channel is available -> in that case give caller that channel
// Otherwise look for an unused one
// This one checks, if requested channel is available -> in that case give
// caller that channel. Otherwise look for an unused one
int16 SciMusic::tryToOwnChannel(MusicEntry *caller, int16 bestChannel) {
// Don't even try this for SCI0
if (_soundVersion <= SCI_VERSION_0_LATE)
@ -316,7 +323,7 @@ void SciMusic::soundPlay(MusicEntry *pSnd) {
if ((_soundVersion <= SCI_VERSION_0_LATE) && (alreadyPlaying)) {
// Music already playing in SCI0?
if (pSnd->priority > alreadyPlaying->priority) {
// And new priority higher? pause previous music and play new one immediately
// And new priority higher? pause previous music and play new one immediately.
// Example of such case: lsl3, when getting points (jingle is played then)
soundPause(alreadyPlaying);
alreadyPlaying->isQueued = true;
@ -339,7 +346,8 @@ void SciMusic::soundPlay(MusicEntry *pSnd) {
pSnd->pLoopStream, -1, pSnd->volume, 0,
DisposeAfterUse::NO);
} else {
// Rewind in case we play the same sample multiple times (non-looped) like in pharkas right at the start
// Rewind in case we play the same sample multiple times
// (non-looped) like in pharkas right at the start
pSnd->pStreamAud->rewind();
_pMixer->playStream(pSnd->soundType, &pSnd->hCurrentAud,
pSnd->pStreamAud, -1, pSnd->volume, 0,
@ -377,7 +385,8 @@ void SciMusic::soundStop(MusicEntry *pSnd) {
if (pSnd->pMidiParser) {
_mutex.lock();
pSnd->pMidiParser->mainThreadBegin();
// We shouldn't call stop in case it's paused, otherwise we would send allNotesOff() again
// We shouldn't call stop in case it's paused, otherwise we would send
// allNotesOff() again
if (previousStatus == kSoundPlaying)
pSnd->pMidiParser->stop();
freeChannels(pSnd);

View File

@ -134,7 +134,8 @@ SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segM
_resMan(resMan), _segMan(segMan), _kernel(kernel), _audio(audio), _soundVersion(soundVersion) {
#ifdef USE_OLD_MUSIC_FUNCTIONS
// The following hack is needed to ease the change from old to new sound code (because the new sound code does not use SfxState)
// The following hack is needed to ease the change from old to new sound
// code (because the new sound code does not use SfxState)
_state = &g_sci->getEngineState()->_sound; // HACK
#endif
@ -378,22 +379,24 @@ void SoundCommandParser::cmdPlaySound(reg_t obj, int16 value) {
}
if (!readSelectorValue(_segMan, obj, SELECTOR(nodePtr)) && obj.segment) {
// 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)
// 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, songNumber)) &&
getSciVersion() >= SCI_VERSION_1_1) {
// Found a relevant audio resource, play it
_audio->stopAudio();
warning("Initializing audio resource instead of requested sound resource %d", songNumber);
sampleLen = _audio->startAudio(65535, songNumber);
// Also create iterator, that will fire SI_FINISHED event, when the sound is done playing
// Also create iterator, that will fire SI_FINISHED event, when
// the sound is done playing.
_state->sfx_add_song(new_timer_iterator(sampleLen), 0, handle, songNumber);
} else {
if (!_resMan->testResource(ResourceId(kResourceTypeSound, songNumber))) {
warning("Could not open song number %d", songNumber);
// Send a "stop handle" event so that the engine won't wait forever here
// Send a "stop handle" event so that the engine won't wait
// forever here.
_state->sfx_song_set_status(handle, SOUND_STATUS_STOPPED);
writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET);
return;
@ -533,12 +536,13 @@ void SoundCommandParser::processStopSound(reg_t obj, int16 value, bool sampleFin
writeSelectorValue(_segMan, obj, SELECTOR(handle), 0);
}
// Set signal selector in sound SCI0 games only, when the sample has finished playing
// If we don't set it at all, we get a problem when using vaporizer on the 2 guys
// If we set it all the time, we get no music in sq3new and kq1
// FIXME: this *may* be wrong, it's impossible to find out in sierra DOS sci, because SCI0 under DOS didn't have
// sfx drivers included
// We need to set signal in sound SCI1+ games all the time
// Set signal selector in sound SCI0 games only, when the sample has
// finished playing. If we don't set it at all, we get a problem when using
// vaporizer on the 2 guys. If we set it all the time, we get no music in
// sq3new and kq1.
// FIXME: This *may* be wrong, it's impossible to find out in Sierra DOS
// SCI, because SCI0 under DOS didn't have sfx drivers included.
// We need to set signal in sound SCI1+ games all the time.
if ((_soundVersion > SCI_VERSION_0_LATE) || sampleFinishedPlaying)
writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET);
@ -560,8 +564,8 @@ void SoundCommandParser::cmdPauseSound(reg_t obj, int16 value) {
#else
if (!obj.segment) { // pause the whole playlist
// Pausing/Resuming the whole playlist was introduced
// in the SCI1 late sound scheme
// Pausing/Resuming the whole playlist was introduced in the SCI1 late
// sound scheme.
if (_soundVersion <= SCI_VERSION_1_EARLY)
return;
@ -685,7 +689,8 @@ void SoundCommandParser::cmdFadeSound(reg_t obj, int16 value) {
switch (_argc) {
case 2: // SCI0
// SCI0 fades out all the time and when fadeout is done it will also stop the music from playing
// SCI0 fades out all the time and when fadeout is done it will also
// stop the music from playing
musicSlot->fadeTo = 0;
musicSlot->fadeStep = -5;
musicSlot->fadeTickerStep = 10 * 16667 / _music->soundGetTempo();
@ -864,10 +869,12 @@ void SoundCommandParser::cmdUpdateCues(reg_t obj, int16 value) {
cmdStopSound(obj, 0);
}
} else {
// Slot actually has no data (which would mean that a sound-resource w/ unsupported data is used
// Slot actually has no data (which would mean that a sound-resource w/
// unsupported data is used.
// (example lsl5 - sound resource 744 - it's roland exclusive
writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET);
// If we don't set signal here, at least the switch to the mud wrestling room in lsl5 will not work
// If we don't set signal here, at least the switch to the mud wrestling
// room in lsl5 will not work.
}
if (musicSlot->fadeCompleted) {
@ -968,9 +975,9 @@ void SoundCommandParser::cmdSetSoundVolume(reg_t obj, int16 value) {
MusicEntry *musicSlot = _music->getSlot(obj);
if (!musicSlot) {
// Do not throw a warning if the sound can't be found, as in some games
// this is called before the actual sound is loaded (e.g. SQ4CD, with the
// drum sounds of the energizer bunny at the beginning), so this is normal
// behavior
// this is called before the actual sound is loaded (e.g. SQ4CD, with
// the drum sounds of the energizer bunny at the beginning), so this is
// normal behavior.
//warning("cmdSetSoundVolume: Slot not found (%04x:%04x)", PRINT_REG(obj));
return;
}
@ -1036,7 +1043,7 @@ void SoundCommandParser::cmdSetSoundLoop(reg_t obj, int16 value) {
// before actually initializing the sound and adding it to the playlist
// with cmdInitSound. Usually, it doesn't matter if the game doesn't
// request to loop the sound, so in this case, don't throw any warning,
// otherwise do, because the sound won't be looped
// otherwise do, because the sound won't be looped.
if (value == -1) {
warning("cmdSetSoundLoop: Slot not found (%04x:%04x) and the song was requested to be looped", PRINT_REG(obj));
} else {
@ -1070,12 +1077,13 @@ void SoundCommandParser::updateSci0Cues() {
const MusicList::iterator end = _music->getPlayListEnd();
for (MusicList::iterator i = _music->getPlayListStart(); i != end; ++i) {
// Is the sound stopped, and the sound object updated too? If yes, skip
// this sound, as SCI0 only allows one active song
// this sound, as SCI0 only allows one active song.
if ((*i)->isQueued) {
pWaitingForPlay = (*i);
// FIXME (?) - in iceman 2 songs are queued when playing the door sound - if we use the first song for resuming
// then it's the wrong one. Both songs have same priority. Maybe the new sound function in sci0
// is somehow responsible
// FIXME(?): In iceman 2 songs are queued when playing the door
// sound - if we use the first song for resuming then it's the wrong
// one. Both songs have same priority. Maybe the new sound function
// in sci0 is somehow responsible.
continue;
}
if ((*i)->signal == 0 && (*i)->status != kSoundPlaying)