diff options
| author | Paweł Kołodziejski | 2002-09-18 08:06:15 +0000 | 
|---|---|---|
| committer | Paweł Kołodziejski | 2002-09-18 08:06:15 +0000 | 
| commit | c8a63096ad8d2d8703b7f85ded813f18a2e164d5 (patch) | |
| tree | 0624de0c628c33822be8499560050eed7c404ebf | |
| parent | 068042781feca5ddd1a1cc0f36a8c842773d994a (diff) | |
| download | scummvm-rg350-c8a63096ad8d2d8703b7f85ded813f18a2e164d5.tar.gz scummvm-rg350-c8a63096ad8d2d8703b7f85ded813f18a2e164d5.tar.bz2 scummvm-rg350-c8a63096ad8d2d8703b7f85ded813f18a2e164d5.zip | |
fixed naming convention and added support 11khz for Smush sound channels
svn-id: r4962
| -rw-r--r-- | scumm/smush/channel.h | 3 | ||||
| -rw-r--r-- | scumm/smush/imuse_channel.cpp | 20 | ||||
| -rw-r--r-- | scumm/smush/scumm_renderer.cpp | 36 | ||||
| -rw-r--r-- | scumm/smush/scumm_renderer.h | 4 | 
4 files changed, 40 insertions, 23 deletions
| diff --git a/scumm/smush/channel.h b/scumm/smush/channel.h index 112ca5f1e7..8ba1c44a08 100644 --- a/scumm/smush/channel.h +++ b/scumm/smush/channel.h @@ -54,6 +54,7 @@ public:  	virtual int32 availableSoundData() const = 0;  	virtual void getSoundData(int16 * sound_buffer, int32 size) = 0; // size is in sample   	virtual void getSoundData(int8 * sound_buffer, int32 size) = 0; +	virtual int32 getRate() = 0;  	virtual bool getParameters(int32 &rate, bool &stereo, bool &is_16bit) = 0;  	virtual int32 getTrackIdentifier() const = 0;  }; @@ -94,6 +95,7 @@ public:  	int32 availableSoundData() const;  	void getSoundData(int16 * sound_buffer, int32 size);  	void getSoundData(int8 * sound_buffer, int32 size) { error("16bit request for SAUD channel should never happen"); }; +	int32 getRate() { return _frequency; }  	bool getParameters(int32 &rate, bool &stereo, bool &is_16bit) {   		rate = _frequency;  		stereo = true; @@ -146,6 +148,7 @@ public:  	int32 availableSoundData() const;  	void getSoundData(int16 * sound_buffer, int32 size);  	void getSoundData(int8 * sound_buffer, int32 size); +	int32 getRate() { return _rate; }  	bool getParameters(int32 &rate, bool &stereo, bool &is_16bit) {  		rate = _frequency;  		stereo = (_channels == 2); diff --git a/scumm/smush/imuse_channel.cpp b/scumm/smush/imuse_channel.cpp index 0c4d531b89..5106a7b76c 100644 --- a/scumm/smush/imuse_channel.cpp +++ b/scumm/smush/imuse_channel.cpp @@ -306,8 +306,14 @@ int32 ImuseChannel::availableSoundData(void) const {  void ImuseChannel::getSoundData(int16 * snd, int32 size) {  	if(_dataSize <= 0 || _bitsize <= 8) error("invalid call to imuse_channel::read_sound_data()");  	if(_channels == 2) size *= 2; -	for(int32 i = 0; i < size; i++) -		snd[i] = READ_BE_UINT16(_sbuffer + 2 * i); +	if(_rate == 11025) { +		for(int32 i = 0; i < size; i++) +			snd[i * 2] = READ_BE_UINT16(_sbuffer + 2 * i); +			snd[i * 2 + 1] = snd[i * 2]; +	} else { +		for(int32 i = 0; i < size; i++) +			snd[i] = READ_BE_UINT16(_sbuffer + 2 * i); +	}  	delete []_sbuffer;  	assert(_sbufferSize == 2 * size);  	_sbuffer = 0; @@ -318,8 +324,14 @@ void ImuseChannel::getSoundData(int16 * snd, int32 size) {  void ImuseChannel::getSoundData(int8 * snd, int32 size) {  	if(_dataSize <= 0 || _bitsize > 8) error("invalid call to imuse_channel::read_sound_data()");  	if(_channels == 2) size *= 2; -	for(int32 i = 0; i < size; i++) -		snd[i] = _sbuffer[i]; +	if(_rate == 11025) { +		for(int32 i = 0; i < size; i++) +			snd[i * 2] = _sbuffer[i]; +			snd[i * 2 + 1] = _sbuffer[i]; +	} else { +		for(int32 i = 0; i < size; i++) +			snd[i] = _sbuffer[i]; +	}  	delete []_sbuffer;  	_sbuffer = 0;  	_sbufferSize = 0; diff --git a/scumm/smush/scumm_renderer.cpp b/scumm/smush/scumm_renderer.cpp index e6b9454801..db09d5ccd6 100644 --- a/scumm/smush/scumm_renderer.cpp +++ b/scumm/smush/scumm_renderer.cpp @@ -28,7 +28,7 @@  #include "scumm/scumm.h"  #include "scumm/sound.h" -class scumm_mixer : public Mixer { +class ScummMixer : public Mixer {  private:  	SoundMixer * _mixer; //!< pointer to the SoundMixer instance  	struct { @@ -39,8 +39,8 @@ private:  	} _channels[SoundMixer::NUM_CHANNELS];		//!< The map of track and channels  	int _nextIndex;  public: -	scumm_mixer(SoundMixer *); -	virtual ~scumm_mixer(); +	ScummMixer(SoundMixer *); +	virtual ~ScummMixer();  	bool init();  	_Channel * findChannel(int32 track);  	bool addChannel(_Channel * c); @@ -49,7 +49,7 @@ public:  	bool update();  }; -scumm_mixer::scumm_mixer(SoundMixer * m) : _mixer(m), _nextIndex(0) { +ScummMixer::ScummMixer(SoundMixer * m) : _mixer(m), _nextIndex(0) {  	for(int32 i = 0; i < SoundMixer::NUM_CHANNELS; i++) {  		_channels[i].id = -1;  		_channels[i].chan = 0; @@ -57,15 +57,15 @@ scumm_mixer::scumm_mixer(SoundMixer * m) : _mixer(m), _nextIndex(0) {  	}  } -scumm_mixer::~scumm_mixer() { +ScummMixer::~ScummMixer() {  } -bool scumm_mixer::init() { -	debug(9, "scumm_mixer::init()"); +bool ScummMixer::init() { +	debug(9, "ScummMixer::init()");  	return true;  } -_Channel * scumm_mixer::findChannel(int32 track) { +_Channel * ScummMixer::findChannel(int32 track) {  	debug(9, "scumm_mixer::findChannel(%d)", track);  	for(int32 i = 0; i < SoundMixer::NUM_CHANNELS; i++) {  		if(_channels[i].id == track) @@ -74,11 +74,11 @@ _Channel * scumm_mixer::findChannel(int32 track) {  	return 0;  } -bool scumm_mixer::addChannel(_Channel * c) { +bool ScummMixer::addChannel(_Channel * c) {  	int32 track = c->getTrackIdentifier();  	int32 i; -	debug(9, "scumm_mixer::addChannel(%d)", track); +	debug(9, "ScummMixer::addChannel(%d)", track);  	for(i = 0; i < SoundMixer::NUM_CHANNELS; i++) {  		if(_channels[i].id == track) @@ -119,8 +119,8 @@ bool scumm_mixer::addChannel(_Channel * c) {  	return false;  } -bool scumm_mixer::handleFrame() { -	debug(9, "scumm_mixer::handleFrame()"); +bool ScummMixer::handleFrame() { +	debug(9, "ScummMixer::handleFrame()");  	for(int i = 0; i < SoundMixer::NUM_CHANNELS; i++) {  		if(_channels[i].id != -1) {  			debug(9, "updating channel %d (%p)", _channels[i].id, _channels[i].chan); @@ -140,8 +140,9 @@ bool scumm_mixer::handleFrame() {  				if(is_short) {  					// FIXME this is one more data copy... we could get rid of it... -					short * data = new int16[size * (stereo ? 2 : 1)]; +					short * data = new int16[size * (stereo ? 2 : 1) * 2];  					_channels[i].chan->getSoundData(data, size); +					if(_channels[i].chan->getRate() == 11025) size *= 2;  					size *= stereo ? 4 : 2;  					// append to _sound @@ -155,8 +156,9 @@ bool scumm_mixer::handleFrame() {  					delete []data;  				} else { -					int8 * data = new int8[size * (stereo ? 2 : 1)]; +					int8 * data = new int8[size * (stereo ? 2 : 1) * 2];  					_channels[i].chan->getSoundData(data, size); +					if(_channels[i].chan->getRate() == 11025) size *= 2;  					size *= stereo ? 2 : 1;  					// append to _sound @@ -175,8 +177,8 @@ bool scumm_mixer::handleFrame() {  	return true;  } -bool scumm_mixer::stop() { -	debug(9, "scumm_mixer::stop()"); +bool ScummMixer::stop() { +	debug(9, "ScummMixer::stop()");  	for(int i = 0; i < SoundMixer::NUM_CHANNELS; i++) {  		if(_channels[i].id != -1) {  				delete _channels[i].chan; @@ -203,7 +205,7 @@ static void smush_handler(Scumm * scumm) {  Mixer * ScummRenderer::getMixer() {  	if(_smixer == 0) {  		_scumm->_sound->pauseBundleMusic(true); -		_smixer = new scumm_mixer(_scumm->_mixer); +		_smixer = new ScummMixer(_scumm->_mixer);  		if(!_smixer) error("unable to allocate a smush mixer");  		s_renderer = this;  		_scumm->_timer->installProcedure(&smush_handler, _insaneSpeed); diff --git a/scumm/smush/scumm_renderer.h b/scumm/smush/scumm_renderer.h index d77e86da0a..d59e586c47 100644 --- a/scumm/smush/scumm_renderer.h +++ b/scumm/smush/scumm_renderer.h @@ -36,14 +36,14 @@  #include "brenderer.h" -class scumm_mixer; +class ScummMixer;  class Scumm;  class Mixer;  class ScummRenderer : public BaseRenderer {  private:  	Scumm * _scumm; -	scumm_mixer * _smixer; +	ScummMixer * _smixer;  	uint32 _insaneSpeed;  	volatile bool _wait;  public: | 
