[Scummvm-git-logs] scummvm master -> a083cf5abc8eec87d04e7018cf4818a5abc78f22
aquadran
noreply at scummvm.org
Sun Mar 6 10:11:13 UTC 2022
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
a083cf5abc SCUMM: DiMUSE: Create separate InternalMixer flow for FT engine
Commit: a083cf5abc8eec87d04e7018cf4818a5abc78f22
https://github.com/scummvm/scummvm/commit/a083cf5abc8eec87d04e7018cf4818a5abc78f22
Author: Andrea Boscarino (andywinxp at gmail.com)
Date: 2022-03-06T11:11:11+01:00
Commit Message:
SCUMM: DiMUSE: Create separate InternalMixer flow for FT engine
Changed paths:
engines/scumm/imuse_digi/dimuse_dispatch.cpp
engines/scumm/imuse_digi/dimuse_engine.cpp
engines/scumm/imuse_digi/dimuse_internalmixer.cpp
engines/scumm/imuse_digi/dimuse_internalmixer.h
diff --git a/engines/scumm/imuse_digi/dimuse_dispatch.cpp b/engines/scumm/imuse_digi/dimuse_dispatch.cpp
index 0b6f79b02d4..e528737f404 100644
--- a/engines/scumm/imuse_digi/dimuse_dispatch.cpp
+++ b/engines/scumm/imuse_digi/dimuse_dispatch.cpp
@@ -492,7 +492,8 @@ void IMuseDigital::dispatchProcessDispatches(IMuseDigiTrack *trackPtr, int feedS
effFeedSize,
0,
mixVolume,
- trackPtr->pan);
+ trackPtr->pan,
+ false);
dispatchPtr->fadeOffset += effRemainingFade;
dispatchPtr->fadeRemaining -= effRemainingFade;
@@ -565,7 +566,8 @@ void IMuseDigital::dispatchProcessDispatches(IMuseDigiTrack *trackPtr, int feedS
effFeedSize,
mixStartingPoint,
mixVolume,
- trackPtr->pan);
+ trackPtr->pan,
+ false);
dispatchPtr->fadeOffset += effRemainingFade;
dispatchPtr->fadeRemaining -= effRemainingFade;
@@ -699,7 +701,8 @@ void IMuseDigital::dispatchProcessDispatches(IMuseDigiTrack *trackPtr, int feedS
effFeedSize,
mixStartingPoint,
mixVolume,
- trackPtr->pan);
+ trackPtr->pan,
+ false);
_internalMixer->clearRadioChatter();
mixStartingPoint += effFeedSize;
@@ -736,7 +739,7 @@ void IMuseDigital::dispatchProcessDispatches(IMuseDigiTrack *trackPtr, int feedS
}
mixVolume = dispatchUpdateFadeMixVolume(dispatchPtr, fadeChunkSize);
- _internalMixer->mix(dispatchPtr->fadeBuf, fadeChunkSize, 8, 1, feedSize, 0, mixVolume, trackPtr->pan);
+ _internalMixer->mix(dispatchPtr->fadeBuf, fadeChunkSize, 8, 1, feedSize, 0, mixVolume, trackPtr->pan, (dispatchPtr->sampleRate == 11025));
dispatchPtr->fadeRemaining -= fadeChunkSize;
dispatchPtr->fadeBuf += fadeChunkSize;
if (dispatchPtr->fadeRemaining == fadeChunkSize)
@@ -793,7 +796,7 @@ void IMuseDigital::dispatchProcessDispatches(IMuseDigiTrack *trackPtr, int feedS
mixVolume = trackPtr->effVol;
}
- _internalMixer->mix(buffer, inFrameCount, 8, 1, feedSize, mixStartingPoint, mixVolume, trackPtr->pan);
+ _internalMixer->mix(buffer, inFrameCount, 8, 1, feedSize, mixStartingPoint, mixVolume, trackPtr->pan, (dispatchPtr->sampleRate == 11025));
mixStartingPoint += inFrameCount;
tentativeFeedSize -= inFrameCount;
dispatchPtr->currentOffset += inFrameCount;
@@ -1625,7 +1628,6 @@ void IMuseDigital::dispatchVOCLoopCallback(int soundId) {
int IMuseDigital::dispatchSeekToNextChunk(IMuseDigiDispatch *dispatchPtr) {
uint8 *headerBuf;
uint8 *soundAddrData;
- int32 resSize;
while (1) {
if (dispatchPtr->streamPtr) {
@@ -1660,8 +1662,6 @@ int IMuseDigital::dispatchSeekToNextChunk(IMuseDigiDispatch *dispatchPtr) {
return -1;
} else {
uint8 *headerTag = _currentVOCHeader;
- if (headerTag[0] != 1 && headerTag[0] != 4 && headerTag[0] != 6 && headerTag[0] != 7)
- headerTag += 2;
switch (headerTag[0]) {
case 1:
@@ -1669,13 +1669,6 @@ int IMuseDigital::dispatchSeekToNextChunk(IMuseDigiDispatch *dispatchPtr) {
dispatchPtr->audioRemaining = (READ_LE_UINT32(headerTag) >> 8) - 2;
dispatchPtr->currentOffset += 6;
- // A little hack to avoid click and pops artifacts:
- // read one audio sample less if this is the last audio chunk of the file
- resSize = _filesHandler->getSoundAddrDataSize(dispatchPtr->trackPtr->soundId, dispatchPtr->streamPtr != nullptr);
- if ((resSize - (dispatchPtr->currentOffset + dispatchPtr->audioRemaining)) < 0x30) {
- dispatchPtr->audioRemaining -= 2;
- }
-
if (dispatchPtr->streamPtr) {
streamerGetStreamBuffer(dispatchPtr->streamPtr, 6);
if (dispatchPtr->vocLoopStartingPoint)
diff --git a/engines/scumm/imuse_digi/dimuse_engine.cpp b/engines/scumm/imuse_digi/dimuse_engine.cpp
index 91ca57ec591..c9244b5f92e 100644
--- a/engines/scumm/imuse_digi/dimuse_engine.cpp
+++ b/engines/scumm/imuse_digi/dimuse_engine.cpp
@@ -81,7 +81,7 @@ IMuseDigital::IMuseDigital(ScummEngine_v7 *scumm, Audio::Mixer *mixer)
_numAudioNames = 0;
_emptyMarker[0] = '\0';
- _internalMixer = new IMuseDigiInternalMixer(mixer);
+ _internalMixer = new IMuseDigiInternalMixer(mixer, _isEarlyDiMUSE);
_groupsHandler = new IMuseDigiGroupsHandler(this);
_fadesHandler = new IMuseDigiFadesHandler(this);
_triggersHandler = new IMuseDigiTriggersHandler(this);
diff --git a/engines/scumm/imuse_digi/dimuse_internalmixer.cpp b/engines/scumm/imuse_digi/dimuse_internalmixer.cpp
index 9e0c4129528..61bc2dad338 100644
--- a/engines/scumm/imuse_digi/dimuse_internalmixer.cpp
+++ b/engines/scumm/imuse_digi/dimuse_internalmixer.cpp
@@ -30,9 +30,10 @@
namespace Scumm {
-IMuseDigiInternalMixer::IMuseDigiInternalMixer(Audio::Mixer *mixer) {
+IMuseDigiInternalMixer::IMuseDigiInternalMixer(Audio::Mixer *mixer, bool isEarlyDiMUSE) {
_stream = Audio::makeQueuingAudioStream(DIMUSE_SAMPLERATE, true);
_mixer = mixer;
+ _isEarlyDiMUSE = isEarlyDiMUSE;
_radioChatter = 0;
_amp8Table = nullptr;
}
@@ -171,7 +172,7 @@ int IMuseDigiInternalMixer::clearMixerBuffer() {
return 0;
}
-void IMuseDigiInternalMixer::mix(uint8 *srcBuf, int32 inFrameCount, int wordSize, int channelCount, int feedSize, int32 mixBufStartIndex, int volume, int pan) {
+void IMuseDigiInternalMixer::mix(uint8 *srcBuf, int32 inFrameCount, int wordSize, int channelCount, int feedSize, int32 mixBufStartIndex, int volume, int pan, bool ftIs11025Hz) {
int32 *ampTable;
int rightChannelVolume;
int leftChannelVolume;
@@ -203,7 +204,8 @@ void IMuseDigiInternalMixer::mix(uint8 *srcBuf, int32 inFrameCount, int wordSize
feedSize,
mixBufStartIndex,
&_amp8Table[leftChannelVolume * 128],
- &_amp8Table[rightChannelVolume * 128]);
+ &_amp8Table[rightChannelVolume * 128],
+ ftIs11025Hz);
} else if (wordSize == 12) {
mixBits12ConvertToStereo(
srcBuf,
@@ -236,7 +238,7 @@ void IMuseDigiInternalMixer::mix(uint8 *srcBuf, int32 inFrameCount, int wordSize
if (_outChannelCount == 1) {
if (channelCount == 1) {
if (wordSize == 8) {
- mixBits8Mono(srcBuf, inFrameCount, feedSize, mixBufStartIndex, ampTable);
+ mixBits8Mono(srcBuf, inFrameCount, feedSize, mixBufStartIndex, ampTable, ftIs11025Hz);
} else if (wordSize == 12) {
mixBits12Mono(srcBuf, inFrameCount, feedSize, mixBufStartIndex, ampTable);
} else {
@@ -291,7 +293,7 @@ int IMuseDigiInternalMixer::loop(uint8 **destBuffer, int len) {
if (_outWordSize == 16) {
if (len) {
for (int i = 0; i < len; i += 2) {
- ((uint16 *)destBuffer_tmp)[i] = ((uint16 *)_softLMID)[mixBuffer[i + 1]];
+ ((uint16 *)destBuffer_tmp)[i] = ((uint16 *)_softLMID)[mixBuffer[i + 1]];
((uint16 *)destBuffer_tmp)[i + 1] = ((uint16 *)_softLMID)[mixBuffer[i]];
}
}
@@ -307,7 +309,7 @@ int IMuseDigiInternalMixer::loop(uint8 **destBuffer, int len) {
return 0;
}
-void IMuseDigiInternalMixer::mixBits8Mono(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *ampTable) {
+void IMuseDigiInternalMixer::mixBits8Mono(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *ampTable, bool ftIs11025Hz) {
uint16 *mixBufCurCell;
uint8 *srcBuf_ptr;
uint8 *ptr;
@@ -316,46 +318,70 @@ void IMuseDigiInternalMixer::mixBits8Mono(uint8 *srcBuf, int32 inFrameCount, int
mixBufCurCell = (uint16 *)(&_mixBuf[2 * mixBufStartIndex]);
srcBuf_ptr = srcBuf;
- if (inFrameCount == feedSize) {
- if (_radioChatter) {
- ptr = srcBuf + 4;
- value = srcBuf[0] - 128 + srcBuf[1] - 128 + srcBuf[2] - 128 + srcBuf[3] - 128;
- if (feedSize) {
- for (int i = 0; i < feedSize; i++) {
- mixBufCurCell[i] += 4 * *((uint16 *)ampTable + (srcBuf_ptr[i] - (value >> 2)));
- value += ptr[i] - srcBuf_ptr[i];
+ if (_isEarlyDiMUSE) {
+ if (ftIs11025Hz) {
+ if (inFrameCount - 1) {
+ for (int i = 0; i < inFrameCount - 1; i++) {
+ mixBufCurCell[0] += *((uint16 *)ampTable + srcBuf_ptr[0]);
+ mixBufCurCell[1] += (*((int16 *)ampTable + srcBuf_ptr[0]) + *((int16 *)ampTable + srcBuf_ptr[1])) >> 1;
+ mixBufCurCell += 2;
+ srcBuf_ptr += 1;
}
}
+
+ mixBufCurCell[0] += *((uint16 *)ampTable + srcBuf_ptr[0]);
+ mixBufCurCell[1] += *((uint16 *)ampTable + srcBuf_ptr[0]);
} else {
- if (feedSize) {
- for (int i = 0; i < feedSize; i++) {
- mixBufCurCell[i] += *((uint16 *)ampTable + srcBuf_ptr[i]);
+ if (inFrameCount) {
+ for (int i = 0; i < inFrameCount; i++) {
+ mixBufCurCell[i] += *((int16 *)ampTable + srcBuf_ptr[i]);
}
}
}
- } else if (2 * inFrameCount == feedSize) {
- if (inFrameCount - 1 != 0) {
- for (int i = 0, j = 0; i < inFrameCount - 1; i++, j += 2) {
- mixBufCurCell[j] += *((uint16 *)ampTable + srcBuf_ptr[i]);
- mixBufCurCell[j + 1] += (*((int16 *)ampTable + srcBuf_ptr[i]) + *((int16 *)ampTable + srcBuf_ptr[i + 1])) >> 1;
+ } else {
+ if (inFrameCount == feedSize) {
+ if (_radioChatter) {
+ ptr = srcBuf + 4;
+ value = srcBuf[0] - 128 + srcBuf[1] - 128 + srcBuf[2] - 128 + srcBuf[3] - 128;
+ if (feedSize) {
+ for (int i = 0; i < feedSize; i++) {
+ mixBufCurCell[i] += 4 * *((uint16 *)ampTable + (srcBuf_ptr[i] - (value >> 2)));
+ value += ptr[i] - srcBuf_ptr[i];
+ }
+ }
+ } else {
+ if (feedSize) {
+ for (int i = 0; i < feedSize; i++) {
+ mixBufCurCell[i] += *((uint16 *)ampTable + srcBuf_ptr[i]);
+ }
+ }
}
- }
- mixBufCurCell[inFrameCount] += *((uint16 *)ampTable + srcBuf_ptr[inFrameCount]);
- mixBufCurCell[inFrameCount + 1] += *((uint16 *)ampTable + srcBuf_ptr[inFrameCount]);
- } else if (2 * feedSize == inFrameCount) {
- if (feedSize) {
- for (int i = 0, j = 0; i < feedSize; i++, j += 2) {
- mixBufCurCell[i] += *((uint16 *)ampTable + srcBuf_ptr[j]);
+ } else if (2 * inFrameCount == feedSize) {
+ if (inFrameCount - 1 != 0) {
+ for (int i = 0; i < inFrameCount - 1; i++) {
+ mixBufCurCell[0] += *((uint16 *)ampTable + srcBuf_ptr[0]);
+ mixBufCurCell[1] += (*((int16 *)ampTable + srcBuf_ptr[0]) + *((int16 *)ampTable + srcBuf_ptr[1])) >> 1;
+ mixBufCurCell += 2;
+ srcBuf_ptr += 1;
+ }
}
- }
- } else {
- residualLength = -inFrameCount;
- if (feedSize) {
- for (int i = 0; i < feedSize; i++) {
- mixBufCurCell[i] += *((uint16 *)ampTable + srcBuf_ptr[0]);
- // Seek the next srcBuf element until there's excess length
- for (residualLength += inFrameCount; residualLength >= 0; ++srcBuf_ptr)
- residualLength -= feedSize;
+ mixBufCurCell[0] += *((uint16 *)ampTable + srcBuf_ptr[0]);
+ mixBufCurCell[1] += *((uint16 *)ampTable + srcBuf_ptr[0]);
+ } else if (2 * feedSize == inFrameCount) {
+ if (feedSize) {
+ for (int i = 0, j = 0; i < feedSize; i++, j += 2) {
+ mixBufCurCell[i] += *((uint16 *)ampTable + srcBuf_ptr[j]);
+ }
+ }
+ } else {
+ residualLength = -inFrameCount;
+ if (feedSize) {
+ for (int i = 0; i < feedSize; i++) {
+ mixBufCurCell[i] += *((uint16 *)ampTable + srcBuf_ptr[0]);
+ // Seek the next srcBuf element until there's excess length
+ for (residualLength += inFrameCount; residualLength >= 0; ++srcBuf_ptr)
+ residualLength -= feedSize;
+ }
}
}
}
@@ -364,7 +390,6 @@ void IMuseDigiInternalMixer::mixBits8Mono(uint8 *srcBuf, int32 inFrameCount, int
void IMuseDigiInternalMixer::mixBits12Mono(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *ampTable) {
uint16 *mixBufCurCell;
uint8 *srcBuf_ptr;
- int value;
int xorFlag;
int residualLength;
int term_1;
@@ -390,19 +415,24 @@ void IMuseDigiInternalMixer::mixBits12Mono(uint8 *srcBuf, int32 inFrameCount, in
srcBuf_ptr = srcBuf;
if ((inFrameCount / 2) - 1) {
for (int i = 0; i < (inFrameCount / 2) - 1; i++) {
- value = *((uint16 *)ampTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4)));
+ mixBufCurCell[0] += *((uint16 *)ampTable + (srcBuf_ptr[0] | ((srcBuf_ptr[1] & 0xF) << 8)));
+
+ mixBufCurCell[1] += (*((int16 *)ampTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4))) +
+ *((int16 *)ampTable + (srcBuf_ptr[0] | ((srcBuf_ptr[1] & 0xF) << 8)))) >> 1;
+
+ mixBufCurCell[2] += *((uint16 *)ampTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4)));
+
+ mixBufCurCell[3] += (*((int16 *)ampTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4))) +
+ *((int16 *)ampTable + (srcBuf_ptr[3] | ((srcBuf_ptr[4] & 0xF) << 8)))) >> 1;
- mixBufCurCell[0] += *((uint16 *)ampTable + (srcBuf_ptr[0] | ((srcBuf_ptr[1] & 0xF) << 8)));
- mixBufCurCell[1] += (value + *((uint16 *)ampTable + value)) >> 1;
- mixBufCurCell[2] += value;
- mixBufCurCell[3] += ((int16)value + *((int16 *)ampTable + (srcBuf_ptr[3] | ((srcBuf_ptr[4] & 0xF) << 8)))) >> 1;
srcBuf_ptr += 3;
mixBufCurCell += 4;
}
}
+
mixBufCurCell[0] += *((uint16 *)ampTable + (srcBuf_ptr[0] | ((srcBuf_ptr[1] & 0xF) << 8)));
- mixBufCurCell[1] += (*((uint16 *)ampTable + (srcBuf_ptr[0] | ((srcBuf_ptr[1] & 0xF) << 8)))
- + *((uint16 *)ampTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4)))) >> 1;
+ mixBufCurCell[1] += (*((int16 *)ampTable + (srcBuf_ptr[0] | ((srcBuf_ptr[1] & 0xF) << 8)))
+ + *((int16 *)ampTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4)))) >> 1;
mixBufCurCell[2] += *((uint16 *)ampTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4)));
mixBufCurCell[3] += *((uint16 *)ampTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4)));
} else if (2 * feedSize == inFrameCount) {
@@ -664,7 +694,7 @@ void IMuseDigiInternalMixer::mixBits16ConvertToMono(uint8 *srcBuf, int32 inFrame
}
}
-void IMuseDigiInternalMixer::mixBits8ConvertToStereo(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *leftAmpTable, int32 *rightAmpTable) {
+void IMuseDigiInternalMixer::mixBits8ConvertToStereo(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *leftAmpTable, int32 *rightAmpTable, bool ftIs11025Hz) {
uint16 *mixBufCurCell;
uint8 *srcBuf_ptr;
uint8 *ptr;
@@ -672,66 +702,95 @@ void IMuseDigiInternalMixer::mixBits8ConvertToStereo(uint8 *srcBuf, int32 inFram
int residualLength;
mixBufCurCell = (uint16 *)(&_mixBuf[2 * mixBufStartIndex]);
- if (feedSize == inFrameCount) {
- if (_radioChatter) {
+ if (_isEarlyDiMUSE) {
+ if (ftIs11025Hz) {
srcBuf_ptr = srcBuf;
- ptr = srcBuf + 4;
- value = srcBuf[0] - 128 + srcBuf[1] - 128 + srcBuf[2] - 128 + srcBuf[3] - 128;
- if (feedSize) {
- for (int i = 0; i < feedSize; i++) {
- mixBufCurCell[0] += 4 * *((uint16 *)leftAmpTable + (srcBuf_ptr[i] - (value >> 2)));
- mixBufCurCell[1] += 4 * *((uint16 *)rightAmpTable + (srcBuf_ptr[i] - (value >> 2)));
- value += ptr[i] - srcBuf_ptr[i];
- mixBufCurCell += 2;
+ int i = 0;
+ if (inFrameCount - 1 != 0) {
+ for (i = 0; i < inFrameCount - 1; i++) {
+ mixBufCurCell[0] += *((uint16 *)leftAmpTable + srcBuf_ptr[i]);
+ mixBufCurCell[1] += *((uint16 *)rightAmpTable + srcBuf_ptr[i]);
+ mixBufCurCell[2] += (*((int16 *)leftAmpTable + srcBuf_ptr[i]) + *((int16 *)leftAmpTable + srcBuf_ptr[i + 1])) >> 1;
+ mixBufCurCell[3] += (*((int16 *)rightAmpTable + srcBuf_ptr[i]) + *((int16 *)rightAmpTable + srcBuf_ptr[i + 1])) >> 1;
+ mixBufCurCell += 4;
}
}
+ mixBufCurCell[0] += *((uint16 *)leftAmpTable + srcBuf_ptr[i]);
+ mixBufCurCell[1] += *((uint16 *)rightAmpTable + srcBuf_ptr[i]);
+ mixBufCurCell[2] += *((uint16 *)leftAmpTable + srcBuf_ptr[i]);
+ mixBufCurCell[3] += *((uint16 *)rightAmpTable + srcBuf_ptr[i]);
} else {
- if (feedSize) {
- srcBuf_ptr = srcBuf;
- for (int i = 0; i < feedSize; i++) {
- mixBufCurCell[0] += *((uint16 *)leftAmpTable + srcBuf_ptr[i]);
- mixBufCurCell[1] += *((uint16 *)rightAmpTable + srcBuf_ptr[i]);
+ srcBuf_ptr = srcBuf;
+ if (inFrameCount) {
+ for (int i = 0; i < inFrameCount; i++) {
+ mixBufCurCell[0] += *((int16 *)leftAmpTable + srcBuf_ptr[i]);
+ mixBufCurCell[1] += *((int16 *)rightAmpTable + srcBuf_ptr[i]);
mixBufCurCell += 2;
}
}
}
- } else if (2 * inFrameCount == feedSize) {
- srcBuf_ptr = srcBuf;
- int i = 0;
- if (inFrameCount - 1 != 0) {
- for (i = 0; i < inFrameCount - 1; i++) {
- mixBufCurCell[0] += *((uint16 *)leftAmpTable + srcBuf_ptr[i]);
- mixBufCurCell[1] += *((uint16 *)rightAmpTable + srcBuf_ptr[i]);
- mixBufCurCell[2] += (*((int16 *)leftAmpTable + srcBuf_ptr[i]) + *((int16 *)leftAmpTable + srcBuf_ptr[i + 1])) >> 1;
- mixBufCurCell[3] += (*((int16 *)rightAmpTable + srcBuf_ptr[i]) + *((int16 *)rightAmpTable + srcBuf_ptr[i + 1])) >> 1;
- mixBufCurCell += 4;
+ } else {
+ if (feedSize == inFrameCount) {
+ if (_radioChatter) {
+ srcBuf_ptr = srcBuf;
+ ptr = srcBuf + 4;
+ value = srcBuf[0] - 128 + srcBuf[1] - 128 + srcBuf[2] - 128 + srcBuf[3] - 128;
+ if (feedSize) {
+ for (int i = 0; i < feedSize; i++) {
+ mixBufCurCell[0] += 4 * *((uint16 *)leftAmpTable + (srcBuf_ptr[i] - (value >> 2)));
+ mixBufCurCell[1] += 4 * *((uint16 *)rightAmpTable + (srcBuf_ptr[i] - (value >> 2)));
+ value += ptr[i] - srcBuf_ptr[i];
+ mixBufCurCell += 2;
+ }
+ }
+ } else {
+ if (feedSize) {
+ srcBuf_ptr = srcBuf;
+ for (int i = 0; i < feedSize; i++) {
+ mixBufCurCell[0] += *((uint16 *)leftAmpTable + srcBuf_ptr[i]);
+ mixBufCurCell[1] += *((uint16 *)rightAmpTable + srcBuf_ptr[i]);
+ mixBufCurCell += 2;
+ }
+ }
}
- }
- mixBufCurCell[0] += *((uint16 *)leftAmpTable + srcBuf_ptr[i]);
- mixBufCurCell[1] += *((uint16 *)rightAmpTable + srcBuf_ptr[i]);
- mixBufCurCell[2] += *((uint16 *)leftAmpTable + srcBuf_ptr[i]);
- mixBufCurCell[3] += *((uint16 *)rightAmpTable + srcBuf_ptr[i]);
- } else if (2 * feedSize == inFrameCount) {
- if (feedSize) {
+ } else if (2 * inFrameCount == feedSize) {
srcBuf_ptr = srcBuf;
- for (int i = 0; i < feedSize; i++) {
- mixBufCurCell[0] += *((uint16 *)leftAmpTable + srcBuf_ptr[0]);
- mixBufCurCell[1] += *((uint16 *)rightAmpTable + srcBuf_ptr[0]);
- mixBufCurCell += 2;
- srcBuf_ptr += 2;
+ int i = 0;
+ if (inFrameCount - 1 != 0) {
+ for (i = 0; i < inFrameCount - 1; i++) {
+ mixBufCurCell[0] += *((uint16 *)leftAmpTable + srcBuf_ptr[i]);
+ mixBufCurCell[1] += *((uint16 *)rightAmpTable + srcBuf_ptr[i]);
+ mixBufCurCell[2] += (*((int16 *)leftAmpTable + srcBuf_ptr[i]) + *((int16 *)leftAmpTable + srcBuf_ptr[i + 1])) >> 1;
+ mixBufCurCell[3] += (*((int16 *)rightAmpTable + srcBuf_ptr[i]) + *((int16 *)rightAmpTable + srcBuf_ptr[i + 1])) >> 1;
+ mixBufCurCell += 4;
+ }
}
- }
- } else {
- residualLength = -inFrameCount;
- if (feedSize) {
- srcBuf_ptr = srcBuf;
- for (int i = 0; i < feedSize; i++) {
- mixBufCurCell[0] += *((uint16 *)leftAmpTable + srcBuf_ptr[0]);
- mixBufCurCell[1] += *((uint16 *)rightAmpTable + srcBuf_ptr[0]);
- mixBufCurCell += 2;
+ mixBufCurCell[0] += *((uint16 *)leftAmpTable + srcBuf_ptr[i]);
+ mixBufCurCell[1] += *((uint16 *)rightAmpTable + srcBuf_ptr[i]);
+ mixBufCurCell[2] += *((uint16 *)leftAmpTable + srcBuf_ptr[i]);
+ mixBufCurCell[3] += *((uint16 *)rightAmpTable + srcBuf_ptr[i]);
+ } else if (2 * feedSize == inFrameCount) {
+ if (feedSize) {
+ srcBuf_ptr = srcBuf;
+ for (int i = 0; i < feedSize; i++) {
+ mixBufCurCell[0] += *((uint16 *)leftAmpTable + srcBuf_ptr[0]);
+ mixBufCurCell[1] += *((uint16 *)rightAmpTable + srcBuf_ptr[0]);
+ mixBufCurCell += 2;
+ srcBuf_ptr += 2;
+ }
+ }
+ } else {
+ residualLength = -inFrameCount;
+ if (feedSize) {
+ srcBuf_ptr = srcBuf;
+ for (int i = 0; i < feedSize; i++) {
+ mixBufCurCell[0] += *((uint16 *)leftAmpTable + srcBuf_ptr[0]);
+ mixBufCurCell[1] += *((uint16 *)rightAmpTable + srcBuf_ptr[0]);
+ mixBufCurCell += 2;
- for (residualLength += inFrameCount; residualLength > 0; ++srcBuf_ptr)
- residualLength -= feedSize;
+ for (residualLength += inFrameCount; residualLength > 0; ++srcBuf_ptr)
+ residualLength -= feedSize;
+ }
}
}
}
@@ -795,7 +854,7 @@ void IMuseDigiInternalMixer::mixBits12ConvertToStereo(uint8 *srcBuf, int32 inFra
+ *((int16 *)leftAmpTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4)))) >> 1;
mixBufCurCell[3] += (*((int16 *)rightAmpTable + (srcBuf_ptr[0] | ((srcBuf_ptr[1] & 0xF) << 8)))
- + *((int16 *)rightAmpTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4)))) >> 1;
+ + *((int16 *)rightAmpTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4)))) >> 1;
mixBufCurCell[4] += *((uint16 *)leftAmpTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4)));
mixBufCurCell[5] += *((uint16 *)rightAmpTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4)));
@@ -991,12 +1050,12 @@ void IMuseDigiInternalMixer::mixBits12Stereo(uint8 *srcBuf, int32 inFrameCount,
srcBuf_ptr = srcBuf;
if (inFrameCount - 1 != 0) {
for (int i = 0; i < inFrameCount - 1; i++) {
- mixBufCurCell[0] += *((uint16 *)ampTable + (srcBuf_ptr[0] | ((srcBuf_ptr[1] & 0xF) << 8)));
- mixBufCurCell[1] += *((uint16 *)ampTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4)));
+ mixBufCurCell[0] += *((uint16 *)ampTable + (srcBuf_ptr[0] | ((srcBuf_ptr[1] & 0xF) << 8)));
+ mixBufCurCell[1] += *((uint16 *)ampTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4)));
mixBufCurCell[2] += (*((int16 *)ampTable + (srcBuf_ptr[0] | ((srcBuf_ptr[1] & 0xF) << 8)))
- + *((int16 *)ampTable + (srcBuf_ptr[3] | ((srcBuf_ptr[4] & 0xF) << 8)))) >> 1;
+ + *((int16 *)ampTable + (srcBuf_ptr[3] | ((srcBuf_ptr[4] & 0xF) << 8)))) >> 1;
mixBufCurCell[3] += (*((int16 *)ampTable + (srcBuf_ptr[2] | ((srcBuf_ptr[1] & 0xF0) << 4)))
- + *((int16 *)ampTable + (srcBuf_ptr[5] | ((srcBuf_ptr[4] & 0xF0) << 4)))) >> 1;
+ + *((int16 *)ampTable + (srcBuf_ptr[5] | ((srcBuf_ptr[4] & 0xF0) << 4)))) >> 1;
srcBuf_ptr += 3;
mixBufCurCell += 4;
diff --git a/engines/scumm/imuse_digi/dimuse_internalmixer.h b/engines/scumm/imuse_digi/dimuse_internalmixer.h
index d90fc78738d..7e5ea79a84d 100644
--- a/engines/scumm/imuse_digi/dimuse_internalmixer.h
+++ b/engines/scumm/imuse_digi/dimuse_internalmixer.h
@@ -59,8 +59,9 @@ private:
int _outWordSize;
int _outChannelCount;
int _stereoReverseFlag;
+ bool _isEarlyDiMUSE;
- void mixBits8Mono(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *ampTable);
+ void mixBits8Mono(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *ampTable, bool ftIs11025Hz);
void mixBits12Mono(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *ampTable);
void mixBits16Mono(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *ampTable);
@@ -68,7 +69,7 @@ private:
void mixBits12ConvertToMono(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *ampTable);
void mixBits16ConvertToMono(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *ampTable);
- void mixBits8ConvertToStereo(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *leftAmpTable, int32 *rightAmpTable);
+ void mixBits8ConvertToStereo(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *leftAmpTable, int32 *rightAmpTable, bool ftIs11025Hz);
void mixBits12ConvertToStereo(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *leftAmpTable, int32 *rightAmpTable);
void mixBits16ConvertToStereo(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *leftAmpTable, int32 *rightAmpTable);
@@ -77,14 +78,14 @@ private:
void mixBits16Stereo(uint8 *srcBuf, int32 inFrameCount, int feedSize, int32 mixBufStartIndex, int32 *ampTable);
public:
- IMuseDigiInternalMixer(Audio::Mixer *mixer);
+ IMuseDigiInternalMixer(Audio::Mixer *mixer, bool isEarlyDiMUSE);
~IMuseDigiInternalMixer();
int init(int bytesPerSample, int numChannels, uint8 *mixBuf, int mixBufSize, int sizeSampleKB, int mixChannelsNum);
void setRadioChatter();
void clearRadioChatter();
int clearMixerBuffer();
- void mix(uint8 *srcBuf, int32 inFrameCount, int wordSize, int channelCount, int feedSize, int32 mixBufStartIndex, int volume, int pan);
+ void mix(uint8 *srcBuf, int32 inFrameCount, int wordSize, int channelCount, int feedSize, int32 mixBufStartIndex, int volume, int pan, bool ftIs11025Hz);
int loop(uint8 **destBuffer, int len);
Audio::QueuingAudioStream *_stream;
};
More information about the Scummvm-git-logs
mailing list