diff options
| author | Johannes Schickel | 2010-03-08 00:33:36 +0000 | 
|---|---|---|
| committer | Johannes Schickel | 2010-03-08 00:33:36 +0000 | 
| commit | f7b1faedc251348692942b7cffbabea6959b7827 (patch) | |
| tree | 51a046c0878644b85ba13b42b4e04b6bf3b9bc9d /sound/softsynth/opl/dosbox.cpp | |
| parent | 4dafbcd924b8c9a21461341e85eda4acf6b25e14 (diff) | |
| download | scummvm-rg350-f7b1faedc251348692942b7cffbabea6959b7827.tar.gz scummvm-rg350-f7b1faedc251348692942b7cffbabea6959b7827.tar.bz2 scummvm-rg350-f7b1faedc251348692942b7cffbabea6959b7827.zip  | |
Switch to the other DOSBox OPL emulator as suggested by the DOSBox developers.
svn-id: r48179
Diffstat (limited to 'sound/softsynth/opl/dosbox.cpp')
| -rw-r--r-- | sound/softsynth/opl/dosbox.cpp | 108 | 
1 files changed, 40 insertions, 68 deletions
diff --git a/sound/softsynth/opl/dosbox.cpp b/sound/softsynth/opl/dosbox.cpp index 9b3cab57c6..7de66af9f5 100644 --- a/sound/softsynth/opl/dosbox.cpp +++ b/sound/softsynth/opl/dosbox.cpp @@ -144,53 +144,7 @@ uint8 Chip::read() {  	return ret;  } -namespace OPL2 { -#include "opl_impl.h" - -struct Handler : public DOSBox::Handler { -	void writeReg(uint32 reg, uint8 val) { -		adlib_write(reg, val); -	} - -	uint32 writeAddr(uint32 port, uint8 val) { -		return val; -	} - -	void generate(int16 *chan, uint samples) { -		adlib_getsample(chan, samples); -	} - -	void init(uint rate) { -		adlib_init(rate); -	} -}; -} // End of namespace OPL2 - -namespace OPL3 { -#define OPLTYPE_IS_OPL3 -#include "opl_impl.h" - -struct Handler : public DOSBox::Handler { -	void writeReg(uint32 reg, uint8 val) { -		adlib_write(reg, val); -	} - -	uint32 writeAddr(uint32 port, uint8 val) { -		adlib_write_index(port, val); -		return opl_index; -	} - -	void generate(int16 *chan, uint samples) { -		adlib_getsample(chan, samples); -	} - -	void init(uint rate) { -		adlib_init(rate); -	} -}; -} // End of namespace OPL3 - -OPL::OPL(Config::OplType type) : _type(type), _rate(0), _handler(0) { +OPL::OPL(Config::OplType type) : _type(type), _rate(0), _emulator(0) {  }  OPL::~OPL() { @@ -198,8 +152,8 @@ OPL::~OPL() {  }  void OPL::free() { -	delete _handler; -	_handler = 0; +	delete _emulator; +	_emulator = 0;  }  bool OPL::init(int rate) { @@ -208,25 +162,16 @@ bool OPL::init(int rate) {  	memset(&_reg, 0, sizeof(_reg));  	memset(_chip, 0, sizeof(_chip)); -	switch (_type) { -	case Config::kOpl2: -		_handler = new OPL2::Handler(); -		break; - -	case Config::kDualOpl2: -	case Config::kOpl3: -		_handler = new OPL3::Handler(); -		break; - -	default: +	_emulator = new DBOPL::Chip(); +	if (!_emulator)  		return false; -	} -	_handler->init(rate); +	DBOPL::InitTables(); +	_emulator->Setup(rate);  	if (_type == Config::kDualOpl2) {  		// Setup opl3 mode in the hander -		_handler->writeReg(0x105, 1); +		_emulator->WriteReg(0x105, 1);  	}  	_rate = rate; @@ -243,7 +188,7 @@ void OPL::write(int port, int val) {  		case Config::kOpl2:  		case Config::kOpl3:  			if (!_chip[0].write(_reg.normal, val)) -				_handler->writeReg(_reg.normal, val); +				_emulator->WriteReg(_reg.normal, val);  			break;  		case Config::kDualOpl2:  			// Not a 0x??8 port, then write to a specific port @@ -262,10 +207,10 @@ void OPL::write(int port, int val) {  		// Make sure to clip them in the right range  		switch (_type) {  		case Config::kOpl2: -			_reg.normal = _handler->writeAddr(port, val) & 0xff; +			_reg.normal = _emulator->WriteAddr(port, val) & 0xff;  			break;  		case Config::kOpl3: -			_reg.normal = _handler->writeAddr(port, val) & 0x1ff; +			_reg.normal = _emulator->WriteAddr(port, val) & 0x1ff;  			break;  		case Config::kDualOpl2:  			// Not a 0x?88 port, when write to a specific side @@ -344,7 +289,7 @@ void OPL::dualWrite(uint8 index, uint8 reg, uint8 val) {  	}  	uint32 fullReg = reg + (index ? 0x100 : 0); -	_handler->writeReg(fullReg, val); +	_emulator->WriteReg(fullReg, val);  }  void OPL::readBuffer(int16 *buffer, int length) { @@ -353,7 +298,34 @@ void OPL::readBuffer(int16 *buffer, int length) {  	if (_type != Config::kOpl2)  		length >>= 1; -	_handler->generate(buffer, length); +	const uint bufferLength = 512; +	int32 tempBuffer[bufferLength * 2]; + +	if (_emulator->opl3Active) { +		while (length > 0) { +			const uint readSamples = MIN<uint>(length, bufferLength); + +			_emulator->GenerateBlock3(readSamples, tempBuffer); + +			for (uint i = 0; i < (readSamples << 1); ++i) +				buffer[i] = tempBuffer[i]; + +			buffer += (readSamples << 1); +			length -= readSamples; +		} +	} else { +		while (length > 0) { +			const uint readSamples = MIN<uint>(length, bufferLength << 1); + +			_emulator->GenerateBlock2(readSamples, tempBuffer); + +			for (uint i = 0; i < readSamples; ++i) +				buffer[i] = tempBuffer[i]; + +			buffer += readSamples; +			length -= readSamples; +		} +	}  }  } // End of namespace DOSBox  | 
