static void YM3812UpdateResample(INT16* pSoundBuf, INT32 nSegmentEnd) { #if defined FBA_DEBUG if (!DebugSnd_YM3812Initted) bprintf(PRINT_ERROR, _T("YM3812UpdateResample called without init\n")); #endif INT32 nSegmentLength = nSegmentEnd; INT32 nSamplesNeeded = nSegmentEnd * nBurnYM3812SoundRate / nBurnSoundRate + 1; // bprintf(PRINT_NORMAL, _T(" YM3812 update -> %6i\n", nSegmentLength)); if (nSamplesNeeded < nYM3812Position) { nSamplesNeeded = nYM3812Position; } if (nSegmentLength > nBurnSoundLen) { nSegmentLength = nBurnSoundLen; } nSegmentLength <<= 1; YM3812Render(nSamplesNeeded); pYM3812Buffer = pBuffer + 0 * 4096 + 4; for (INT32 i = (nFractionalPosition & 0xFFFF0000) >> 15; i < nSegmentLength; i += 2, nFractionalPosition += nSampleSize) { INT16 nSample = INTERPOLATE4PS_16BIT((nFractionalPosition >> 4) & 0x0FFF, pYM3812Buffer[(nFractionalPosition >> 16) - 3], pYM3812Buffer[(nFractionalPosition >> 16) - 2], pYM3812Buffer[(nFractionalPosition >> 16) - 1], pYM3812Buffer[(nFractionalPosition >> 16) - 0]); if (bYM3812AddSignal) { pSoundBuf[i + 0] += nSample; pSoundBuf[i + 1] += nSample; } else { pSoundBuf[i + 0] = nSample; pSoundBuf[i + 1] = nSample; } } if (nSegmentEnd >= nBurnSoundLen) { INT32 nExtraSamples = nSamplesNeeded - (nFractionalPosition >> 16); // bprintf(PRINT_NORMAL, _T(" %6i rendered, %i extra, %i <- %i\n"), nSamplesNeeded, nExtraSamples, nExtraSamples, (nFractionalPosition >> 16) + nExtraSamples - 1); for (INT32 i = -4; i < nExtraSamples; i++) { pYM3812Buffer[i] = pYM3812Buffer[(nFractionalPosition >> 16) + i]; } nFractionalPosition &= 0xFFFF; nYM3812Position = nExtraSamples; }
static void YM3812UpdateResample(int nSegmentEnd) { short* pSoundBuf = pBurnSoundOut; int nSegmentLength = nSegmentEnd; int nSamplesNeeded = nSegmentEnd * nBurnYM3812SoundRate / nBurnSoundRate + 1; // bprintf(PRINT_NORMAL, _T(" YM3812 update -> %6i\n", nSegmentLength)); if (nSamplesNeeded < nYM3812Position) { nSamplesNeeded = nYM3812Position; } if (nSegmentLength > nBurnSoundLen) { nSegmentLength = nBurnSoundLen; } nSegmentLength <<= 1; YM3812Render(nSamplesNeeded); pYM3812Buffer = pBuffer + 0 * 4096 + 4; for (int i = (nFractionalPosition & 0xFFFF0000) >> 15; i < nSegmentLength; i += 2, nFractionalPosition += nSampleSize) { pSoundBuf[i + 0] = INTERPOLATE4PS_16BIT((nFractionalPosition >> 4) & 0x0FFF, pYM3812Buffer[(nFractionalPosition >> 16) - 3], pYM3812Buffer[(nFractionalPosition >> 16) - 2], pYM3812Buffer[(nFractionalPosition >> 16) - 1], pYM3812Buffer[(nFractionalPosition >> 16) - 0]); pSoundBuf[i + 1] = pSoundBuf[i + 0]; } if (nSegmentEnd >= nBurnSoundLen) { int nExtraSamples = nSamplesNeeded - (nFractionalPosition >> 16); // bprintf(PRINT_NORMAL, _T(" %6i rendered, %i extra, %i <- %i\n"), nSamplesNeeded, nExtraSamples, nExtraSamples, (nFractionalPosition >> 16) + nExtraSamples - 1); for (int i = -4; i < nExtraSamples; i++) { pYM3812Buffer[i] = pYM3812Buffer[(nFractionalPosition >> 16) + i]; } nFractionalPosition &= 0xFFFF; nYM3812Position = nExtraSamples; }