[Scummvm-cvs-logs] SF.net SVN: scummvm:[50602] scummvm/trunk/engines/kyra/sound_towns.cpp
athrxx at users.sourceforge.net
athrxx at users.sourceforge.net
Fri Jul 2 21:08:23 CEST 2010
Revision: 50602
http://scummvm.svn.sourceforge.net/scummvm/?rev=50602&view=rev
Author: athrxx
Date: 2010-07-02 19:08:22 +0000 (Fri, 02 Jul 2010)
Log Message:
-----------
KYRA/PC98: fix sfx volume control
Modified Paths:
--------------
scummvm/trunk/engines/kyra/sound_towns.cpp
Modified: scummvm/trunk/engines/kyra/sound_towns.cpp
===================================================================
--- scummvm/trunk/engines/kyra/sound_towns.cpp 2010-07-02 19:04:44 UTC (rev 50601)
+++ scummvm/trunk/engines/kyra/sound_towns.cpp 2010-07-02 19:08:22 UTC (rev 50602)
@@ -1858,10 +1858,29 @@
_dataPtr = data;
_totalLevel = 0x7F;
- uint8 *src_b = _dataPtr;
- int loop = 1;
+ uint8 *tmp = _dataPtr;
+ for (bool loop = true; loop; ) {
+ uint8 cmd = *tmp++;
+ if (cmd < 0xf0) {
+ tmp++;
+ } else if (cmd == 0xff) {
+ if (READ_LE_UINT16(tmp))
+ _drv->_looping |= _idFlag;
+ else
+ loop = false;
+ } else if (cmd == 0xf6) {
+ // reset repeat section countdown
+ tmp[0] = tmp[1];
+ tmp += 4;
+ } else {
+ tmp += _drv->_opnFxCmdLen[cmd - 240];
+ }
+ }
+
+ /*uint8 *src_b = _dataPtr;
uint8 cmd = 0;
- while (loop) {
+
+ for (int loop = 1; loop; ) {
if (loop == 1) {
cmd = *src_b++;
if (cmd < 0xf0) {
@@ -1882,11 +1901,12 @@
src_b += _drv->_opnFxCmdLen[cmd - 240];
loop = 1;
} else if (loop == 3) {
+ // reset repeat section countdown
src_b[0] = src_b[1];
src_b += 4;
loop = 1;
}
- }
+ }*/
}
void TownsPC98_OpnChannel::processEvents() {
@@ -2498,6 +2518,22 @@
_dataPtr = data;
_ssgTl = 0xff;
_algorithm = 0x80;
+
+ uint8 *tmp = _dataPtr;
+ for (bool loop = true; loop; ) {
+ uint8 cmd = *tmp++;
+ if (cmd < 0xf0) {
+ tmp++;
+ } else if (cmd == 0xff && !*tmp) {
+ loop = false;
+ } else if (cmd == 0xf6) {
+ // reset repeat section countdown
+ tmp[0] = tmp[1];
+ tmp += 4;
+ } else {
+ tmp += _drv->_opnFxCmdLen[cmd - 240];
+ }
+ }
}
TownsPC98_OpnChannelPCM::TownsPC98_OpnChannelPCM(TownsPC98_OpnDriver *driver, uint8 regOffs,
@@ -2750,15 +2786,15 @@
finOut += _tleTable[_channels[ii].out ? _pReslt : 0];
else
finOut += _tlTable[_channels[ii].out ? (_channels[ii].vol & 0x0f) : 0];
- }
- finOut /= 3;
+ if ((1 << ii) & _volMaskA)
+ finOut = (finOut * _volumeA) / Audio::Mixer::kMaxMixerVolume;
- if ((1 << i) & _volMaskA)
- finOut = (finOut * _volumeA) / Audio::Mixer::kMaxMixerVolume;
+ if ((1 << ii) & _volMaskB)
+ finOut = (finOut * _volumeB) / Audio::Mixer::kMaxMixerVolume;
+ }
- if ((1 << i) & _volMaskB)
- finOut = (finOut * _volumeB) / Audio::Mixer::kMaxMixerVolume;
+ finOut /= 3;
buffer[i << 1] += finOut;
buffer[(i << 1) + 1] += finOut;
@@ -3764,21 +3800,21 @@
}
void TownsPC98_OpnDriver::startSoundEffect() {
- _updateSfxFlag = 0;
+ int volFlags = 0;
for (int i = 0; i < 2; i++) {
if (_sfxOffsets[i]) {
_ssgChannels[i + 1]->protect();
_sfxChannels[i]->reset();
_sfxChannels[i]->loadData(_sfxData + _sfxOffsets[i]);
_updateSfxFlag |= _sfxChannels[i]->_idFlag;
+ volFlags |= (_sfxChannels[i]->_idFlag << _numChan);
+ } else {
+ _ssgChannels[i + 1]->restore();
+ _updateSfxFlag &= ~_sfxChannels[i]->_idFlag;
}
}
-
- int volFlags = 0;
- for (int i = 0; i < (_numChan + _numSSG - 2); i++)
- volFlags |= (1 << i);
- setVolumeChannelMasks(volFlags, ~volFlags);
-
+
+ setVolumeChannelMasks(~volFlags, volFlags);
_sfxData = 0;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list