void BurnYM2612UpdateRequest() { YM2612Render(BurnYM2612StreamCallback(nBurnYM2612SoundRate)); }
// Update the sound buffer static void YM2612UpdateNormal(short* pSoundBuf, int nSegmentEnd) { int nSegmentLength = nSegmentEnd; int i; // bprintf(PRINT_NORMAL, _T(" YM2612 update -> %6i\n", nSegmentLength)); if (nSegmentEnd < nYM2612Position) { nSegmentEnd = nYM2612Position; } if (nSegmentLength > nBurnSoundLen) { nSegmentLength = nBurnSoundLen; } YM2612Render(nSegmentEnd); pYM2612Buffer[0] = pBuffer + 4 + 0 * 4096; pYM2612Buffer[1] = pBuffer + 4 + 1 * 4096; if (nNumChips > 1) { pYM2612Buffer[2] = pBuffer + 4 + 2 * 4096; pYM2612Buffer[3] = pBuffer + 4 + 3 * 4096; } for (int n = nFractionalPosition; n < nSegmentLength; n++) { int nTotalSample; nTotalSample = pYM2612Buffer[0][n]; if (nNumChips > 1) nTotalSample += pYM2612Buffer[2][n]; if (nTotalSample < -32768) { nTotalSample = -32768; } else { if (nTotalSample > 32767) { nTotalSample = 32767; } } if (bYM2612AddSignal) { pSoundBuf[(n << 1) + 0] += nTotalSample; } else { pSoundBuf[(n << 1) + 0] = nTotalSample; } nTotalSample = pYM2612Buffer[1][n]; if (nNumChips > 1) nTotalSample += pYM2612Buffer[3][n]; if (nTotalSample < -32768) { nTotalSample = -32768; } else { if (nTotalSample > 32767) { nTotalSample = 32767; } } if (bYM2612AddSignal) { pSoundBuf[(n << 1) + 1] += nTotalSample; } else { pSoundBuf[(n << 1) + 1] = nTotalSample; } } nFractionalPosition = nSegmentLength; if (nSegmentEnd >= nBurnSoundLen) { int nExtraSamples = nSegmentEnd - nBurnSoundLen; for (i = 0; i < nExtraSamples; i++) { pYM2612Buffer[0][i] = pYM2612Buffer[0][nBurnSoundLen + i]; pYM2612Buffer[1][i] = pYM2612Buffer[1][nBurnSoundLen + i]; if (nNumChips > 1) { pYM2612Buffer[2][i] = pYM2612Buffer[2][nBurnSoundLen + i]; pYM2612Buffer[3][i] = pYM2612Buffer[3][nBurnSoundLen + i]; } } nFractionalPosition = 0; nYM2612Position = nExtraSamples; dTime += 100.0 / nBurnFPS; } }
static void YM2612UpdateResample(INT16* pSoundBuf, INT32 nSegmentEnd) { #if defined FBA_DEBUG if (!DebugSnd_YM2612Initted) bprintf(PRINT_ERROR, _T("YM2612UpdateResample called without init\n")); #endif INT32 nSegmentLength = nSegmentEnd; INT32 nSamplesNeeded = nSegmentEnd * nBurnYM2612SoundRate / nBurnSoundRate + 1; if (nSamplesNeeded < nYM2612Position) { nSamplesNeeded = nYM2612Position; } if (nSegmentLength > nBurnSoundLen) { nSegmentLength = nBurnSoundLen; } nSegmentLength <<= 1; YM2612Render(nSamplesNeeded); pYM2612Buffer[0] = pBuffer + 0 * 4096 + 4; pYM2612Buffer[1] = pBuffer + 1 * 4096 + 4; if (nNumChips > 1) { pYM2612Buffer[2] = pBuffer + 2 * 4096 + 4; pYM2612Buffer[3] = pBuffer + 3 * 4096 + 4; } for (INT32 i = (nFractionalPosition & 0xFFFF0000) >> 15; i < nSegmentLength; i += 2, nFractionalPosition += nSampleSize) { INT32 nLeftSample[4] = {0, 0, 0, 0}; INT32 nRightSample[4] = {0, 0, 0, 0}; INT32 nTotalLeftSample, nTotalRightSample; INTERPOLATE_ADD_SOUND_LEFT (BURN_SND_YM2612_YM2612_ROUTE_1, 0) INTERPOLATE_ADD_SOUND_RIGHT (BURN_SND_YM2612_YM2612_ROUTE_1, 0) INTERPOLATE_ADD_SOUND_LEFT (BURN_SND_YM2612_YM2612_ROUTE_2, 1) INTERPOLATE_ADD_SOUND_RIGHT (BURN_SND_YM2612_YM2612_ROUTE_2, 1) if (nNumChips > 1) { INTERPOLATE_ADD_SOUND_LEFT (2 + BURN_SND_YM2612_YM2612_ROUTE_1, 2) INTERPOLATE_ADD_SOUND_RIGHT (2 + BURN_SND_YM2612_YM2612_ROUTE_1, 2) INTERPOLATE_ADD_SOUND_LEFT (2 + BURN_SND_YM2612_YM2612_ROUTE_2, 3) INTERPOLATE_ADD_SOUND_RIGHT (2 + BURN_SND_YM2612_YM2612_ROUTE_2, 3) } nTotalLeftSample = INTERPOLATE4PS_16BIT((nFractionalPosition >> 4) & 0x0fff, nLeftSample[0], nLeftSample[1], nLeftSample[2], nLeftSample[3]); nTotalRightSample = INTERPOLATE4PS_16BIT((nFractionalPosition >> 4) & 0x0fff, nRightSample[0], nRightSample[1], nRightSample[2], nRightSample[3]); nTotalLeftSample = BURN_SND_CLIP(nTotalLeftSample); nTotalRightSample = BURN_SND_CLIP(nTotalRightSample); if (bYM2612AddSignal) { pSoundBuf[i + 0] = BURN_SND_CLIP(pSoundBuf[i + 0] + nTotalLeftSample); pSoundBuf[i + 1] = BURN_SND_CLIP(pSoundBuf[i + 1] + nTotalRightSample); } else { pSoundBuf[i + 0] = nTotalLeftSample; pSoundBuf[i + 1] = nTotalRightSample; } } if (nSegmentEnd >= nBurnSoundLen) { INT32 nExtraSamples = nSamplesNeeded - (nFractionalPosition >> 16); for (INT32 i = -4; i < nExtraSamples; i++) { pYM2612Buffer[0][i] = pYM2612Buffer[0][(nFractionalPosition >> 16) + i]; pYM2612Buffer[1][i] = pYM2612Buffer[1][(nFractionalPosition >> 16) + i]; if (nNumChips > 1) { pYM2612Buffer[2][i] = pYM2612Buffer[2][(nFractionalPosition >> 16) + i]; pYM2612Buffer[3][i] = pYM2612Buffer[3][(nFractionalPosition >> 16) + i]; } }