static Int32* ym2151Sync(void* ref, UInt32 count) { YM2151* ym2151 = (YM2151*)ref; UInt32 i; for (i = 0; i < count; i++) { Int16 sl, sr; ym2151->off -= SAMPLERATE - AUDIO_SAMPLERATE; ym2151->s1l = ym2151->s2l; ym2151->s1r = ym2151->s2r; YM2151UpdateOne(ym2151->opl, &sl, &sr, 1); ym2151->s2l = sl; ym2151->s2r = sr; if (ym2151->off < 0) { ym2151->off += AUDIO_SAMPLERATE; ym2151->s1l = ym2151->s2l; ym2151->s1r = ym2151->s2r; YM2151UpdateOne(ym2151->opl, &sl, &sr, 1); ym2151->s2l = sl; ym2151->s2r = sr; } ym2151->buffer[2*i+0] = 11*(Int32)((ym2151->s1l * (ym2151->off / 256) + ym2151->s2l * ((SAMPLERATE - ym2151->off) / 256)) / (SAMPLERATE / 256)); ym2151->buffer[2*i+1] = 11*(Int32)((ym2151->s1r * (ym2151->off / 256) + ym2151->s2r * ((SAMPLERATE - ym2151->off) / 256)) / (SAMPLERATE / 256)); } return ym2151->buffer; }
static void YM2151RenderNormal(INT16* pSoundBuf, INT32 nSegmentLength) { #if defined FBA_DEBUG if (!DebugSnd_YM2151Initted) bprintf(PRINT_ERROR, _T("YM2151RenderNormal called without init\n")); #endif nBurnPosition += nSegmentLength; pYM2151Buffer[0] = pBuffer; pYM2151Buffer[1] = pBuffer + nSegmentLength; YM2151UpdateOne(0, pYM2151Buffer, nSegmentLength); for (INT32 n = 0; n < nSegmentLength; n++) { INT32 nLeftSample = 0, nRightSample = 0; if ((YM2151RouteDirs[BURN_SND_YM2151_YM2151_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) { nLeftSample += (INT32)(pYM2151Buffer[0][n] * YM2151Volumes[BURN_SND_YM2151_YM2151_ROUTE_1]); } if ((YM2151RouteDirs[BURN_SND_YM2151_YM2151_ROUTE_1] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) { nRightSample += (INT32)(pYM2151Buffer[0][n] * YM2151Volumes[BURN_SND_YM2151_YM2151_ROUTE_1]); } if ((YM2151RouteDirs[BURN_SND_YM2151_YM2151_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) { nLeftSample += (INT32)(pYM2151Buffer[1][n] * YM2151Volumes[BURN_SND_YM2151_YM2151_ROUTE_2]); } if ((YM2151RouteDirs[BURN_SND_YM2151_YM2151_ROUTE_2] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) { nRightSample += (INT32)(pYM2151Buffer[1][n] * YM2151Volumes[BURN_SND_YM2151_YM2151_ROUTE_2]); } nLeftSample = BURN_SND_CLIP(nLeftSample); nRightSample = BURN_SND_CLIP(nRightSample); pSoundBuf[(n << 1) + 0] = nLeftSample; pSoundBuf[(n << 1) + 1] = nRightSample; } }
static void ym2151_update(void *param, stream_sample_t **inputs, stream_sample_t **buffers, int length) { struct ym2151_info *info = param; YM2151UpdateOne(info->chip, buffers, length); }