Esempio n. 1
0
void BurnYM2612UpdateRequest()
{
    YM2612Render(BurnYM2612StreamCallback(nBurnYM2612SoundRate));
}
Esempio n. 2
0
// 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;
    }
}
Esempio n. 3
0
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];
			}
		}