diff options
Diffstat (limited to 'sword2/driver/d_sound.cpp')
-rw-r--r-- | sword2/driver/d_sound.cpp | 144 |
1 files changed, 51 insertions, 93 deletions
diff --git a/sword2/driver/d_sound.cpp b/sword2/driver/d_sound.cpp index e6b547fdae..b5cf40d9c2 100644 --- a/sword2/driver/d_sound.cpp +++ b/sword2/driver/d_sound.cpp @@ -1029,77 +1029,13 @@ bool Sound::isFxPlaying(int32 id) { } /** - * This function opens a sound effect ready for playing. A unique id should be - * passed in so that each effect can be referenced individually. - * @param id the unique sound id - * @param data the WAV data - * @warning Zero is not a valid id - */ - -int32 Sound::openFx(int32 id, byte *data) { - if (!_soundOn) - return RD_OK; - - if (id == 0) - return RDERR_INVALIDID; - - if (getFxIndex(id) != MAXFX) - return RDERR_FXALREADYOPEN; - - // Find a free slot - int32 fxi = getFxIndex(0); - - if (fxi == MAXFX) { - warning("openFx: Running out of sound slots"); - - // There isn't any free sound handle available. This usually - // shouldn't happen, but if it does we expire the first sound - // effect that isn't currently playing. - - for (fxi = 0; fxi < MAXFX; fxi++) - if (!_fx[fxi]._handle.isActive()) - break; - - // Still no dice? I give up! - - if (fxi == MAXFX) { - warning("openFx: No free sound slots"); - return RDERR_NOFREEBUFFERS; - } - } - - _fx[fxi]._id = id; - _fx[fxi]._flags = SoundMixer::FLAG_16BITS | SoundMixer::FLAG_LITTLE_ENDIAN; - - WavInfo wavInfo; - - if (!getWavInfo(data, &wavInfo)) { - warning("openFx: Not a valida WAV file"); - return RDERR_INVALIDWAV; - } - - if (wavInfo.channels == 2) - _fx[fxi]._flags |= SoundMixer::FLAG_STEREO; - - _fx[fxi]._rate = wavInfo.rate; - _fx[fxi]._bufSize = wavInfo.samples; - - // Fill the speech buffer with data - free(_fx[fxi]._buf); - _fx[fxi]._buf = (uint16 *) malloc(_fx[fxi]._bufSize); - memcpy(_fx[fxi]._buf, wavInfo.data, _fx[fxi]._bufSize); - - return RD_OK; -} - -/** * This function closes a sound effect which has been previously opened for * playing. Sound effects must be closed when they are finished with, otherwise * you will run out of sound effect buffers. * @param id the id of the sound to close */ -int32 Sound::closeFx(int32 id) { +int32 Sound::stopFx(int32 id) { int i; if (!_soundOn) @@ -1133,43 +1069,69 @@ int32 Sound::playFx(int32 id, byte *data, uint8 vol, int8 pan, uint8 type) { return RD_OK; byte volume = _fxMuted ? 0 : vol * _fxVol; - int8 p = _panTable[pan + 16]; - int32 i, hr; - if (data) { - // All lead-ins and lead-outs I've heard are music, so we use - // the music volume setting for them. + // All lead-ins and lead-outs I've heard are music, so we use + // the music volume setting for them. - if (type == RDSE_FXLEADIN || type == RDSE_FXLEADOUT) { - id = (type == RDSE_FXLEADIN) ? -2 : -1; - volume = _musicMuted ? 0 : _musicVolTable[_musicVol]; - } + if (type == RDSE_FXLEADIN || type == RDSE_FXLEADOUT) { + id = (type == RDSE_FXLEADIN) ? -2 : -1; + volume = _musicMuted ? 0 : _musicVolTable[_musicVol]; + } + + WavInfo wavInfo; - hr = openFx(id, data); - if (hr != RD_OK) - return hr; + if (!getWavInfo(data, &wavInfo)) { + warning("playFx: Not a valid WAV file"); + return RDERR_INVALIDWAV; } - i = getFxIndex(id); + int32 fxi = getFxIndex(id); - if (i == MAXFX) { - if (data) { - warning("playFx(%d, %d, %d, %d) - Not found", id, vol, pan, type); - return RDERR_FXFUCKED; - } else { - warning("playFx(%d, %d, %d, %d) - Not open", id, vol, pan, type); - return RDERR_FXNOTOPEN; + if (fxi == MAXFX) { + // Find a free slot + fxi = getFxIndex(0); + + if (fxi == MAXFX) { + warning("openFx: Running out of sound slots"); + + // There aren't any free sound handles available. This + // usually shouldn't happen, but if it does we expire + // the first sound effect that isn't currently playing. + + for (fxi = 0; fxi < MAXFX; fxi++) + if (!_fx[fxi]._handle.isActive()) + break; + + // Still no dice? I give up! + + if (fxi == MAXFX) { + warning("openFx: No free sound slots"); + return RDERR_NOFREEBUFFERS; + } } + + _fx[fxi]._id = id; } + 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) - _fx[i]._flags |= SoundMixer::FLAG_LOOP; + flags |= SoundMixer::FLAG_LOOP; else - _fx[i]._flags &= ~SoundMixer::FLAG_LOOP; + flags &= ~SoundMixer::FLAG_LOOP; - _fx[i]._volume = vol; + _fx[fxi]._volume = vol; + + int8 p = _panTable[pan + 16]; - _vm->_mixer->playRaw(&_fx[i]._handle, _fx[i]._buf, _fx[i]._bufSize, _fx[i]._rate, _fx[i]._flags, -1, volume, p); + _vm->_mixer->playRaw(&_fx[fxi]._handle, wavInfo.data, wavInfo.samples, wavInfo.rate, flags, -1, volume, p); return RD_OK; } @@ -1177,12 +1139,8 @@ int32 Sound::playFx(int32 id, byte *data, uint8 vol, int8 pan, uint8 type) { void Sound::stopFxHandle(int i) { if (_fx[i]._id) { _vm->_mixer->stopHandle(_fx[i]._handle); - free(_fx[i]._buf); _fx[i]._id = 0; _fx[i]._paused = false; - _fx[i]._flags = 0; - _fx[i]._bufSize = 0; - _fx[i]._buf = NULL; } } |