diff options
| author | Travis Howell | 2007-01-01 09:58:00 +0000 | 
|---|---|---|
| committer | Travis Howell | 2007-01-01 09:58:00 +0000 | 
| commit | 66249c651ee5fcd9913adda535d4e5ad92f7af95 (patch) | |
| tree | 362a409d6839c39acb857420ac4cb188edef59a8 | |
| parent | 6944797891cb80cb465d0d06ab824f498e7459d8 (diff) | |
| download | scummvm-rg350-66249c651ee5fcd9913adda535d4e5ad92f7af95.tar.gz scummvm-rg350-66249c651ee5fcd9913adda535d4e5ad92f7af95.tar.bz2 scummvm-rg350-66249c651ee5fcd9913adda535d4e5ad92f7af95.zip | |
Add eriktorbjorn's patch for secondary sound looping in swampy, with minor changes for uncompressed sounds.
svn-id: r24965
| -rw-r--r-- | engines/agos/sound.cpp | 180 | 
1 files changed, 90 insertions, 90 deletions
| diff --git a/engines/agos/sound.cpp b/engines/agos/sound.cpp index f3413af2c3..cb820b34c4 100644 --- a/engines/agos/sound.cpp +++ b/engines/agos/sound.cpp @@ -53,29 +53,86 @@ protected:  public:  	BaseSound(Audio::Mixer *mixer, File *file, uint32 base = 0, bool bigEndian = false);  	BaseSound(Audio::Mixer *mixer, File *file, uint32 *offsets, bool bigEndian = false); +	void playSound(uint sound, Audio::SoundHandle *handle, byte flags) { +		playSound(sound, sound, handle, flags); +	}  	virtual ~BaseSound(); -	virtual void playSound(uint sound, Audio::SoundHandle *handle, byte flags) = 0; -#if defined(USE_MAD) || defined(USE_VORBIS) || defined(USE_FLAC) +	virtual void playSound(uint sound, uint loopSound, Audio::SoundHandle *handle, byte flags) = 0;  	virtual Audio::AudioStream *makeAudioStream(uint sound) { return NULL; } -#endif  }; +class LoopingAudioStream : public Audio::AudioStream { +private: +	BaseSound *_parent; +	Audio::AudioStream *_stream; +	bool _loop; +	uint _sound; +	uint _loopSound; +public: +	LoopingAudioStream(BaseSound *parent, uint sound, uint loopSound, bool loop); +	int readBuffer(int16 *buffer, const int numSamples); +	bool isStereo() const { return _stream ? _stream->isStereo() : 0; } +	bool endOfData() const; +	int getRate() const { return _stream ? _stream->getRate() : 22050; } +}; + +LoopingAudioStream::LoopingAudioStream(BaseSound *parent, uint sound, uint loopSound, bool loop) { +	_parent = parent; +	_sound = sound; +	_loop = loop; +	_loopSound = loopSound; + +	_stream = _parent->makeAudioStream(sound); +} + +int LoopingAudioStream::readBuffer(int16 *buffer, const int numSamples) { +	if (!_loop) { +		return _stream->readBuffer(buffer, numSamples); +	} + +	int16 *buf = buffer; +	int samplesLeft = numSamples; + +	while (samplesLeft > 0) { +		int len = _stream->readBuffer(buf, samplesLeft); +		if (len < samplesLeft) { +			delete _stream; +			_stream = _parent->makeAudioStream(_loopSound); +		} +		samplesLeft -= len; +		buf += len; +	} + +	return numSamples; +} + +bool LoopingAudioStream::endOfData() const { +	if (!_stream) +		return true; +	if (_loop) +		return false; +	return _stream->endOfData(); +} +  class WavSound : public BaseSound {  public:  	WavSound(Audio::Mixer *mixer, File *file, uint32 base = 0, bool bigEndian = false) : BaseSound(mixer, file, base, bigEndian) {};  	WavSound(Audio::Mixer *mixer, File *file, uint32 *offsets) : BaseSound(mixer, file, offsets) {}; -	void playSound(uint sound, Audio::SoundHandle *handle, byte flags); +	Audio::AudioStream *makeAudioStream(uint sound); +	void playSound(uint sound, uint loopSound, Audio::SoundHandle *handle, byte flags);  };  class VocSound : public BaseSound {  public:  	VocSound(Audio::Mixer *mixer, File *file, uint32 base = 0, bool bigEndian = false) : BaseSound(mixer, file, base, bigEndian) {}; -	void playSound(uint sound, Audio::SoundHandle *handle, byte flags); +	Audio::AudioStream *makeAudioStream(uint sound); +	void playSound(uint sound, uint loopSound, Audio::SoundHandle *handle, byte flags);  }; +  class RawSound : public BaseSound {  public:  	RawSound(Audio::Mixer *mixer, File *file, uint32 base = 0, bool bigEndian = false) : BaseSound(mixer, file, base, bigEndian) {}; -	void playSound(uint sound, Audio::SoundHandle *handle, byte flags); +	void playSound(uint sound, uint loopSound, Audio::SoundHandle *handle, byte flags);  };  BaseSound::BaseSound(Audio::Mixer *mixer, File *file, uint32 base, bool bigEndian) { @@ -126,38 +183,31 @@ BaseSound::~BaseSound() {  	delete _file;  } -void WavSound::playSound(uint sound, Audio::SoundHandle *handle, byte flags) { +Audio::AudioStream *WavSound::makeAudioStream(uint sound) {  	if (_offsets == NULL) -		return; +		return NULL;  	_file->seek(_offsets[sound], SEEK_SET); +	return Audio::makeWAVStream(*_file); +} -	byte wavFlags; -	int size, rate; -	if (!Audio::loadWAVFromStream(*_file, size, rate, wavFlags)) -		error("playSound: Not a valid WAV file"); - -	flags |= wavFlags; - -	byte *buffer = (byte *)malloc(size); -	assert(buffer); -	_file->read(buffer, size); -	_mixer->playRaw(handle, buffer, size, rate, flags | Audio::Mixer::FLAG_AUTOFREE, sound); +void WavSound::playSound(uint sound, uint loopSound, Audio::SoundHandle *handle, byte flags) { +	_mixer->playInputStream(Audio::Mixer::kSFXSoundType, handle, new LoopingAudioStream(this, sound, loopSound, (flags & Audio::Mixer::FLAG_LOOP) != 0), sound);  } -void VocSound::playSound(uint sound, Audio::SoundHandle *handle, byte flags) { +Audio::AudioStream *VocSound::makeAudioStream(uint sound) {  	if (_offsets == NULL) -		return; +		return NULL;  	_file->seek(_offsets[sound], SEEK_SET); +	return Audio::makeVOCStream(*_file); +} -	int size, rate; -	byte *buffer = Audio::loadVOCFromStream(*_file, size, rate); -	assert(buffer); -	_mixer->playRaw(handle, buffer, size, rate, flags | Audio::Mixer::FLAG_AUTOFREE, sound); +void VocSound::playSound(uint sound, uint loopSound, Audio::SoundHandle *handle, byte flags) { +	_mixer->playInputStream(Audio::Mixer::kSFXSoundType, handle, new LoopingAudioStream(this, sound, loopSound, (flags & Audio::Mixer::FLAG_LOOP) != 0), sound);  } -void RawSound::playSound(uint sound, Audio::SoundHandle *handle, byte flags) { +void RawSound::playSound(uint sound, uint loopSound, Audio::SoundHandle *handle, byte flags) {  	if (_offsets == NULL)  		return; @@ -170,65 +220,12 @@ void RawSound::playSound(uint sound, Audio::SoundHandle *handle, byte flags) {  	_mixer->playRaw(handle, buffer, size, 22050, flags | Audio::Mixer::FLAG_AUTOFREE, sound);  } -#if defined(USE_MAD) || defined(USE_VORBIS) || defined(USE_FLAC) -class CompAudioStream : public Audio::AudioStream { -private: -	BaseSound *_parent; -	Audio::AudioStream *_stream; -	bool _loop; -	uint _sound; -public: -	CompAudioStream(BaseSound *parent, uint sound, bool loop); -	int readBuffer(int16 *buffer, const int numSamples); -	bool isStereo() const { return _stream ? _stream->isStereo() : 0; } -	bool endOfData() const; -	int getRate() const { return _stream ? _stream->getRate() : 22050; } -}; - -CompAudioStream::CompAudioStream(BaseSound *parent, uint sound, bool loop) { -	_parent = parent; -	_sound = sound; -	_loop = loop; - -	_stream = _parent->makeAudioStream(sound); -} - -int CompAudioStream::readBuffer(int16 *buffer, const int numSamples) { -	if (!_loop) { -		return _stream->readBuffer(buffer, numSamples); -	} - -	int16 *buf = buffer; -	int samplesLeft = numSamples; - -	while (samplesLeft > 0) { -		int len = _stream->readBuffer(buf, samplesLeft); -		if (len < samplesLeft) { -			delete _stream; -			_stream = _parent->makeAudioStream(_sound); -		} -		samplesLeft -= len; -		buf += len; -	} - -	return numSamples; -} - -bool CompAudioStream::endOfData() const { -	if (!_stream) -		return true; -	if (_loop) -		return false; -	return _stream->endOfData(); -} -#endif -  #ifdef USE_MAD  class MP3Sound : public BaseSound {  public:  	MP3Sound(Audio::Mixer *mixer, File *file, uint32 base = 0) : BaseSound(mixer, file, base) {};  	Audio::AudioStream *makeAudioStream(uint sound); -	void playSound(uint sound, Audio::SoundHandle *handle, byte flags); +	void playSound(uint sound, uint loopSound, Audio::SoundHandle *handle, byte flags);  };  Audio::AudioStream *MP3Sound::makeAudioStream(uint sound) { @@ -246,8 +243,8 @@ Audio::AudioStream *MP3Sound::makeAudioStream(uint sound) {  	return Audio::makeMP3Stream(_file, size);  } -void MP3Sound::playSound(uint sound, Audio::SoundHandle *handle, byte flags) { -	_mixer->playInputStream(Audio::Mixer::kSFXSoundType, handle, new CompAudioStream(this, sound, (flags & Audio::Mixer::FLAG_LOOP) != 0), sound); +void MP3Sound::playSound(uint sound, uint loopSound, Audio::SoundHandle *handle, byte flags) { +	_mixer->playInputStream(Audio::Mixer::kSFXSoundType, handle, new LoopingAudioStream(this, sound, loopSound, (flags & Audio::Mixer::FLAG_LOOP) != 0), sound);  }  #endif @@ -256,7 +253,7 @@ class VorbisSound : public BaseSound {  public:  	VorbisSound(Audio::Mixer *mixer, File *file, uint32 base = 0) : BaseSound(mixer, file, base) {};  	Audio::AudioStream *makeAudioStream(uint sound); -	void playSound(uint sound, Audio::SoundHandle *handle, byte flags); +	void playSound(uint sound, uint loopSound, Audio::SoundHandle *handle, byte flags);  };  Audio::AudioStream *VorbisSound::makeAudioStream(uint sound) { @@ -274,8 +271,8 @@ Audio::AudioStream *VorbisSound::makeAudioStream(uint sound) {  	return Audio::makeVorbisStream(_file, size);  } -void VorbisSound::playSound(uint sound, Audio::SoundHandle *handle, byte flags) { -	_mixer->playInputStream(Audio::Mixer::kSFXSoundType, handle, new CompAudioStream(this, sound, (flags & Audio::Mixer::FLAG_LOOP) != 0), sound); +void VorbisSound::playSound(uint sound, uint loopSound, Audio::SoundHandle *handle, byte flags) { +	_mixer->playInputStream(Audio::Mixer::kSFXSoundType, handle, new LoopingAudioStream(this, sound, loopSound, (flags & Audio::Mixer::FLAG_LOOP) != 0), sound);  }  #endif @@ -284,7 +281,7 @@ class FlacSound : public BaseSound {  public:  	FlacSound(Audio::Mixer *mixer, File *file, uint32 base = 0) : BaseSound(mixer, file, base) {};  	Audio::AudioStream *makeAudioStream(uint sound); -	void playSound(uint sound, Audio::SoundHandle *handle, byte flags); +	void playSound(uint sound, uint loopSound, Audio::SoundHandle *handle, byte flags);  };  Audio::AudioStream *FlacSound::makeAudioStream(uint sound) { @@ -302,8 +299,8 @@ Audio::AudioStream *FlacSound::makeAudioStream(uint sound) {  	return Audio::makeFlacStream(_file, size);  } -void FlacSound::playSound(uint sound, Audio::SoundHandle *handle, byte flags) { -	_mixer->playInputStream(Audio::Mixer::kSFXSoundType, handle, new CompAudioStream(this, sound, (flags & Audio::Mixer::FLAG_LOOP) != 0), sound); +void FlacSound::playSound(uint sound, uint loopSound, Audio::SoundHandle *handle, byte flags) { +	_mixer->playInputStream(Audio::Mixer::kSFXSoundType, handle, new LoopingAudioStream(this, sound, loopSound, (flags & Audio::Mixer::FLAG_LOOP) != 0), sound);  }  #endif @@ -543,7 +540,10 @@ void Sound::playVoice(uint sound) {  	_mixer->stopHandle(_voiceHandle);  	if (_vm->getGameType() == GType_PP) { -		_voice->playSound(sound, &_voiceHandle, Audio::Mixer::FLAG_LOOP); +		uint loopSound = sound; +		if (sound < 11) +			loopSound++; +		_voice->playSound(sound, loopSound, &_voiceHandle, Audio::Mixer::FLAG_LOOP);  	} else if (_vm->getGameType() == GType_FF || _vm->getGameId() == GID_SIMON1CD32) {  		_voice->playSound(sound, &_voiceHandle, 0);  	} else { @@ -574,7 +574,7 @@ void Sound::playAmbient(uint sound) {  		return;  	_mixer->stopHandle(_ambientHandle); -	_effects->playSound(sound, &_ambientHandle, Audio::Mixer::FLAG_LOOP|Audio::Mixer::FLAG_UNSIGNED); +	_effects->playSound(sound, &_ambientHandle, Audio::Mixer::FLAG_LOOP | Audio::Mixer::FLAG_UNSIGNED);  }  bool Sound::hasVoice() const { | 
