burn_ym2203 interpolation - treat same as YM2151

This commit is contained in:
Barry Harris 2014-04-28 21:24:16 +00:00
parent f9e28c6660
commit 8302f51e48
1 changed files with 3 additions and 13 deletions

View File

@ -217,8 +217,8 @@ static void YM2203UpdateResample(INT16* pSoundBuf, INT32 nSegmentEnd)
} }
} }
nTotalLeftSample = INTERPOLATE4PS_16BIT((nFractionalPosition >> 4) & 0x0fff, nLeftSample[0], nLeftSample[1], nLeftSample[2], nLeftSample[3]); nTotalLeftSample = INTERPOLATE4PS_CUSTOM((nFractionalPosition >> 4) & 0x0fff, nLeftSample[0], nLeftSample[1], nLeftSample[2], nLeftSample[3], 16384.0);
nTotalRightSample = INTERPOLATE4PS_16BIT((nFractionalPosition >> 4) & 0x0fff, nRightSample[0], nRightSample[1], nRightSample[2], nRightSample[3]); nTotalRightSample = INTERPOLATE4PS_CUSTOM((nFractionalPosition >> 4) & 0x0fff, nRightSample[0], nRightSample[1], nRightSample[2], nRightSample[3], 16384.0);
nTotalLeftSample = BURN_SND_CLIP(nTotalLeftSample); nTotalLeftSample = BURN_SND_CLIP(nTotalLeftSample);
nTotalRightSample = BURN_SND_CLIP(nTotalRightSample); nTotalRightSample = BURN_SND_CLIP(nTotalRightSample);
@ -490,7 +490,6 @@ INT32 BurnYM2203Init(INT32 num, INT32 nClockFrequency, FM_IRQHANDLER IRQCallback
if (num > MAX_YM2203) num = MAX_YM2203; if (num > MAX_YM2203) num = MAX_YM2203;
BurnTimerInit(&YM2203TimerOver, GetTimeCallback); BurnTimerInit(&YM2203TimerOver, GetTimeCallback);
bprintf(PRINT_NORMAL, _T("User-Defined SoundRate (nBurnSoundRate)[%d].\n"), nBurnSoundRate);
if (nBurnSoundRate <= 0) { if (nBurnSoundRate <= 0) {
BurnYM2203StreamCallback = YM2203StreamCallbackDummy; BurnYM2203StreamCallback = YM2203StreamCallbackDummy;
@ -500,7 +499,6 @@ INT32 BurnYM2203Init(INT32 num, INT32 nClockFrequency, FM_IRQHANDLER IRQCallback
AY8910InitYM(i, nClockFrequency, 11025, NULL, NULL, NULL, NULL, BurnAY8910UpdateRequest); AY8910InitYM(i, nClockFrequency, 11025, NULL, NULL, NULL, NULL, BurnAY8910UpdateRequest);
} }
YM2203Init(num, nClockFrequency, 11025, &BurnOPNTimerCallback, IRQCallback); YM2203Init(num, nClockFrequency, 11025, &BurnOPNTimerCallback, IRQCallback);
return 0; return 0;
} }
@ -508,7 +506,7 @@ INT32 BurnYM2203Init(INT32 num, INT32 nClockFrequency, FM_IRQHANDLER IRQCallback
if (nFMInterpolation == 3) { if (nFMInterpolation == 3) {
// Set YM2203 core samplerate to match the hardware // Set YM2203 core samplerate to match the hardware
nBurnYM2203SoundRate = nClockFrequency / (144 * num); nBurnYM2203SoundRate = nClockFrequency >> 6;
// Bring YM2203 core samplerate within usable range // Bring YM2203 core samplerate within usable range
while (nBurnYM2203SoundRate > nBurnSoundRate * 3) { while (nBurnYM2203SoundRate > nBurnSoundRate * 3) {
nBurnYM2203SoundRate >>= 1; nBurnYM2203SoundRate >>= 1;
@ -516,15 +514,7 @@ INT32 BurnYM2203Init(INT32 num, INT32 nClockFrequency, FM_IRQHANDLER IRQCallback
BurnYM2203Update = YM2203UpdateResample; BurnYM2203Update = YM2203UpdateResample;
nSampleSize = (UINT32)nBurnYM2203SoundRate * (1 << 16) / nBurnSoundRate; nSampleSize = (UINT32)nBurnYM2203SoundRate * (1 << 16) / nBurnSoundRate;
bprintf(PRINT_NORMAL, _T("Suggested nBurnYM2203SoundRate[%d]???\n"), nBurnYM2203SoundRate);
// something seriously wrong here - dink
// nBurnYM2203SoundRate ends up being about 5khz in games like
// gng, gun.smoke, and other misc. ym2203-games when using FM interpolation.
// Temporary fix for the issue: use the user-defined samplerate.
nBurnYM2203SoundRate = nBurnSoundRate;
nSampleSize = (UINT32)nBurnYM2203SoundRate * (1 << 16) / nBurnSoundRate;
bprintf(PRINT_NORMAL, _T("Forced nBurnYM2203SoundRate[%d]!!!\n"), nBurnYM2203SoundRate);
} else { } else {
nBurnYM2203SoundRate = nBurnSoundRate; nBurnYM2203SoundRate = nBurnSoundRate;
BurnYM2203Update = YM2203UpdateNormal; BurnYM2203Update = YM2203UpdateNormal;