diff options
-rw-r--r-- | saga/sndres.cpp | 54 | ||||
-rw-r--r-- | sword2/anims.cpp | 19 | ||||
-rw-r--r-- | sword2/driver/animation.cpp | 12 | ||||
-rw-r--r-- | sword2/driver/animation.h | 4 | ||||
-rw-r--r-- | sword2/driver/d_sound.cpp | 75 | ||||
-rw-r--r-- | sword2/driver/d_sound.h | 11 | ||||
-rw-r--r-- | sword2/sound.cpp | 4 |
7 files changed, 33 insertions, 146 deletions
diff --git a/saga/sndres.cpp b/saga/sndres.cpp index de47cafc09..8bb225bb0d 100644 --- a/saga/sndres.cpp +++ b/saga/sndres.cpp @@ -199,61 +199,19 @@ int SndRes::loadVocSound(byte *snd_res, size_t snd_res_len, SOUNDBUFFER *snd_buf } int SndRes::loadWavSound(byte *snd_res, size_t snd_res_len, SOUNDBUFFER *snd_buf_i) { - // TODO: This function should, perhaps, be made more robust. - - // TODO: use loadWAVFromStream to load the WAVE data! - /* + Common::MemoryReadStream readS(snd_res, snd_res_len); int rate, size; - bye flags; - bool isValidWAV; - Common::MemoryReadStream stream(snd_res, snd_res_len); - isValidWAV = loadWAVFromStream(stream, size, rate, flags); - */ - - MemoryReadStreamEndian readS(snd_res, snd_res_len, IS_BIG_ENDIAN); - - byte buf[4]; - - readS.read(buf, sizeof(buf)); - if (memcmp(buf, "RIFF", sizeof(buf)) != 0) { - return FAILURE; - } - - readS.readUint32(); - - readS.read(buf, sizeof(buf)); - if (memcmp(buf, "WAVE", sizeof(buf)) != 0) { - return FAILURE; - } + byte flags; - readS.read(buf, sizeof(buf)); - if (memcmp(buf, "fmt ", sizeof(buf)) != 0) { + if (!loadWAVFromStream(readS, size, rate, flags)) { return FAILURE; } - uint32 len = readS.readUint32(); - uint32 pos = readS.pos(); - - readS.readUint16(); - - snd_buf_i->s_stereo = (readS.readUint16() == 2) ? 1 : 0; - snd_buf_i->s_freq = readS.readUint16(); + snd_buf_i->s_stereo = ((flags & SoundMixer::FLAG_STEREO) != 0); + snd_buf_i->s_freq = rate; snd_buf_i->s_samplebits = 16; snd_buf_i->s_signed = 1; - - readS.seek(pos + len); - - for (;;) { - readS.read(buf, sizeof(buf)); - if (memcmp(buf, "data", sizeof(buf)) == 0) { - break; - } - - len = readS.readUint32(); - readS.seek(len, SEEK_CUR); - } - - snd_buf_i->s_buf_len = readS.readUint32(); + snd_buf_i->s_buf_len = size; byte *data = (byte *)malloc(snd_buf_i->s_buf_len); if (!data) { diff --git a/sword2/anims.cpp b/sword2/anims.cpp index 9d41e2c104..777b96329c 100644 --- a/sword2/anims.cpp +++ b/sword2/anims.cpp @@ -462,18 +462,16 @@ void Logic::clearSequenceSpeech(MovieTextObject *sequenceText[]) { } int32 Logic::fnSmackerLeadIn(int32 *params) { - byte *leadIn; - uint32 rv; - // params: 0 id of lead-in music - leadIn = _vm->_resman->openResource(params[0]); + byte *leadIn = _vm->_resman->openResource(params[0]); StandardHeader *header = (StandardHeader *) leadIn; assert(header->fileType == WAV_FILE); leadIn += sizeof(StandardHeader); - // wav data gets copied to sound memory - rv = _vm->_sound->playFx(0, leadIn, 0, 0, RDSE_FXLEADIN); + + uint32 len = _vm->_resman->fetchLen(params[0]) - sizeof(StandardHeader); + uint32 rv = _vm->_sound->playFx(0, len, leadIn, 0, 0, RDSE_FXLEADIN); if (rv) debug(5, "SFX ERROR: playFx() returned %.8x", rv); @@ -500,6 +498,7 @@ int32 Logic::fnPlaySequence(int32 *params) { char filename[30]; MovieTextObject *sequenceSpeechArray[MAX_SEQUENCE_TEXT_LINES + 1]; byte *leadOut = NULL; + uint32 leadOutLen = 0; // The original code had some #ifdef blocks for skipping or muting the // cutscenes - fondly described as "the biggest fudge in the history @@ -529,9 +528,9 @@ int32 Logic::fnPlaySequence(int32 *params) { assert(header->fileType == WAV_FILE); leadOut += sizeof(StandardHeader); - } - // play the smacker + leadOutLen = _vm->_resman->fetchLen(_smackerLeadOut) - sizeof(StandardHeader); + } // don't want to carry on streaming game music when smacker starts! fnStopMusic(NULL); @@ -543,9 +542,9 @@ int32 Logic::fnPlaySequence(int32 *params) { uint32 rv; if (_sequenceTextLines && !_scriptVars[DEMO]) - rv = player.play(filename, sequenceSpeechArray, leadOut); + rv = player.play(filename, sequenceSpeechArray, leadOut, leadOutLen); else - rv = player.play(filename, NULL, leadOut); + rv = player.play(filename, NULL, leadOut, leadOutLen); // check the error return-value if (rv) diff --git a/sword2/driver/animation.cpp b/sword2/driver/animation.cpp index 3a1a30f630..91c6847080 100644 --- a/sword2/driver/animation.cpp +++ b/sword2/driver/animation.cpp @@ -168,7 +168,7 @@ void MoviePlayer::drawTextObject(AnimationState *anim, MovieTextObject *obj) { * @param musicOut lead-out music */ -int32 MoviePlayer::play(const char *filename, MovieTextObject *text[], byte *musicOut) { +int32 MoviePlayer::play(const char *filename, MovieTextObject *text[], byte *musicOut, uint32 musicOutLen) { // This happens if the user quits during the "eye" smacker if (_vm->_quit) return RD_OK; @@ -188,7 +188,7 @@ int32 MoviePlayer::play(const char *filename, MovieTextObject *text[], byte *mus if (!anim->init(filename)) { delete anim; // Missing Files? Use the old 'Narration Only' hack - playDummy(filename, text, musicOut); + playDummy(filename, text, musicOut, musicOutLen); return RD_OK; } @@ -253,7 +253,7 @@ int32 MoviePlayer::play(const char *filename, MovieTextObject *text[], byte *mus frameCounter++; if (frameCounter == leadOutFrame && musicOut) - _vm->_sound->playFx(0, musicOut, 0, 0, RDSE_FXLEADOUT); + _vm->_sound->playFx(0, musicOutLen, musicOut, 0, 0, RDSE_FXLEADOUT); OSystem::Event event; while (_sys->pollEvent(event)) { @@ -334,7 +334,7 @@ int32 MoviePlayer::play(const char *filename, MovieTextObject *text[], byte *mus return RD_OK; #else // No MPEG2? Use the old 'Narration Only' hack - playDummy(filename, text, musicOut); + playDummy(filename, text, musicOut, musicOutLen); return RD_OK; #endif } @@ -344,7 +344,7 @@ int32 MoviePlayer::play(const char *filename, MovieTextObject *text[], byte *mus * are missing. */ -int32 MoviePlayer::playDummy(const char *filename, MovieTextObject *text[], byte *musicOut) { +int32 MoviePlayer::playDummy(const char *filename, MovieTextObject *text[], byte *musicOut, uint32 musicOutLen) { int frameCounter = 0, textCounter = 0; if (text) { byte oldPal[256 * 4]; @@ -484,7 +484,7 @@ int32 MoviePlayer::playDummy(const char *filename, MovieTextObject *text[], byte // that have subtitles. if (!skipCutscene && musicOut) { - _vm->_sound->playFx(0, musicOut, 0, 0, RDSE_FXLEADOUT); + _vm->_sound->playFx(0, musicOutLen, musicOut, 0, 0, RDSE_FXLEADOUT); _vm->_sound->waitForLeadOut(); } diff --git a/sword2/driver/animation.h b/sword2/driver/animation.h index 1e44343244..edf1c575a6 100644 --- a/sword2/driver/animation.h +++ b/sword2/driver/animation.h @@ -71,11 +71,11 @@ private: void closeTextObject(MovieTextObject *obj); void drawTextObject(AnimationState *anim, MovieTextObject *obj); - int32 playDummy(const char *filename, MovieTextObject *text[], byte *musicOut); + int32 playDummy(const char *filename, MovieTextObject *text[], byte *musicOut, uint32 musicOutLen); public: MoviePlayer(Sword2Engine *vm); - int32 play(const char *filename, MovieTextObject *text[], byte *musicOut); + int32 play(const char *filename, MovieTextObject *text[], byte *musicOut, uint32 musicOutLen); }; } // End of namespace Sword2 diff --git a/sword2/driver/d_sound.cpp b/sword2/driver/d_sound.cpp index c61a349d28..3a1f1ba8b2 100644 --- a/sword2/driver/d_sound.cpp +++ b/sword2/driver/d_sound.cpp @@ -896,55 +896,6 @@ int32 Sound::playCompSpeech(uint32 speechid, uint8 vol, int8 pan) { // ---------------------------------------------------------------------------- /** - * Retrieve information about an in-memory WAV file. - * @param data The WAV data - * @param wavInfo Pointer to the WavInfo structure to fill with information. - * @return True if the data appears to be a WAV file, otherwise false. - */ - -bool Sound::getWavInfo(byte *data, WavInfo *wavInfo) { - uint32 wavLength; - uint32 offset; - - if (READ_UINT32(data) != MKID('RIFF')) { - warning("getWavInfo: No 'RIFF' header"); - return false; - } - - wavLength = READ_LE_UINT32(data + 4) + 8; - - if (READ_UINT32(data + 8) != MKID('WAVE')) { - warning("getWavInfo: No 'WAVE' header"); - return false; - } - - if (READ_UINT32(data + 12) != MKID('fmt ')) { - warning("getWavInfo: No 'fmt' header"); - return false; - } - - wavInfo->channels = READ_LE_UINT16(data + 22); - wavInfo->rate = READ_LE_UINT16(data + 24); - - offset = READ_LE_UINT32(data + 16) + 20; - - // It's almost certainly a WAV file, but we still need to find its - // 'data' chunk. - - while (READ_UINT32(data + offset) != MKID('data')) { - if (offset >= wavLength) { - warning("getWavInfo: Can't find 'data' chunk"); - return false; - } - offset += (READ_LE_UINT32(data + offset + 4) + 8); - } - - wavInfo->samples = READ_LE_UINT32(data + offset + 4); - wavInfo->data = data + offset + 8; - return true; -} - -/** * @return the index of the sound effect with the ID passed in. */ @@ -1112,7 +1063,7 @@ int32 Sound::stopFx(int32 id) { * @warning Zero is not a valid id */ -int32 Sound::playFx(int32 id, byte *data, uint8 vol, int8 pan, uint8 type) { +int32 Sound::playFx(int32 id, uint32 len, byte *data, uint8 vol, int8 pan, uint8 type) { if (!_soundOn) return RD_OK; @@ -1128,19 +1079,11 @@ int32 Sound::playFx(int32 id, byte *data, uint8 vol, int8 pan, uint8 type) { soundType = SoundMixer::kMusicAudioDataType; } - WavInfo wavInfo; - - // TODO: use loadWAVFromStream to load the WAVE data! - /* + Common::MemoryReadStream stream(data, len); int rate, size; - bye flags; - // FIXME: Instead of passing an arbitrary large size for the memory stream - // here, we should instead determine the real size of the memory area. - Common::MemoryReadStream stream(data, 10000000); - isValidWAV = loadWAVFromStream(stream, size, rate, flags); - */ - - if (!getWavInfo(data, &wavInfo)) { + byte flags; + + if (!loadWAVFromStream(stream, size, rate, flags)) { warning("playFx: Not a valid WAV file"); return RDERR_INVALIDWAV; } @@ -1176,12 +1119,6 @@ int32 Sound::playFx(int32 id, byte *data, uint8 vol, int8 pan, uint8 type) { if (_fx[fxi]._handle.isActive()) return RDERR_FXALREADYOPEN; - uint32 flags = SoundMixer::FLAG_16BITS | SoundMixer::FLAG_LITTLE_ENDIAN; - - if (wavInfo.channels == 2) - flags |= SoundMixer::FLAG_STEREO; - - if (type == RDSE_FXLOOP) flags |= SoundMixer::FLAG_LOOP; else @@ -1191,7 +1128,7 @@ int32 Sound::playFx(int32 id, byte *data, uint8 vol, int8 pan, uint8 type) { int8 p = _panTable[pan + 16]; - _vm->_mixer->playRaw(&_fx[fxi]._handle, wavInfo.data, wavInfo.samples, wavInfo.rate, flags, -1, volume, p, 0, 0, soundType); + _vm->_mixer->playRaw(&_fx[fxi]._handle, data + stream.pos(), size, rate, flags, -1, volume, p, 0, 0, soundType); return RD_OK; } diff --git a/sword2/driver/d_sound.h b/sword2/driver/d_sound.h index 77d8f753d0..244f58625c 100644 --- a/sword2/driver/d_sound.h +++ b/sword2/driver/d_sound.h @@ -41,13 +41,6 @@ enum { extern void sword2_sound_handler(void *refCon); -struct WavInfo { - uint8 channels; - uint16 rate; - uint32 samples; - uint8 *data; -}; - struct FxHandle { int32 _id; bool _paused; @@ -97,8 +90,6 @@ public: void buildPanTable(bool reverse); - bool getWavInfo(uint8 *data, WavInfo *wavInfo); - void muteMusic(bool mute); bool isMusicMute(void); void pauseMusic(void); @@ -126,7 +117,7 @@ public: void pauseFxForSequence(void); void unpauseFx(void); bool isFxPlaying(int32 id); - int32 playFx(int32 id, uint8 *data, uint8 vol, int8 pan, uint8 type); + int32 playFx(int32 id, uint32 len, uint8 *data, uint8 vol, int8 pan, uint8 type); int32 stopFx(int32 id); void clearAllFx(void); }; diff --git a/sword2/sound.cpp b/sword2/sound.cpp index a2bb003bf2..b5dff64f4a 100644 --- a/sword2/sound.cpp +++ b/sword2/sound.cpp @@ -128,7 +128,9 @@ void Sword2Engine::triggerFx(uint8 i) { else type = RDSE_FXSPOT; - uint32 rv = _sound->playFx(i + 1, fxQueue[i].data, fxQueue[i].volume, fxQueue[i].pan, type); + uint32 len = _resman->fetchLen(fxQueue[i].resource) - sizeof(StandardHeader); + uint32 rv = _sound->playFx(i + 1, len, fxQueue[i].data, fxQueue[i].volume, fxQueue[i].pan, type); + if (rv) debug(5, "SFX ERROR: playFx() returned %.8x", rv); } |