diff --git a/src/burn/drv/sega/sys16_run.cpp b/src/burn/drv/sega/sys16_run.cpp index 0eaf1ac9b..6634f3491 100644 --- a/src/burn/drv/sega/sys16_run.cpp +++ b/src/burn/drv/sega/sys16_run.cpp @@ -1987,6 +1987,7 @@ INT32 System16Init() BurnYM3438SetAllRoutes(1, 0.40, BURN_SND_ROUTE_BOTH); RF5C68PCMInit(10000000); + RF5C68PCMSetAllRoutes(1.00, BURN_SND_ROUTE_BOTH); System16TileBankSize = 0x400; System16CreateOpaqueTileMaps = 1; diff --git a/src/burn/snd/rf5c68.cpp b/src/burn/snd/rf5c68.cpp index 9d9e55442..b0cef2fe6 100644 --- a/src/burn/snd/rf5c68.cpp +++ b/src/burn/snd/rf5c68.cpp @@ -24,6 +24,8 @@ struct rf5c68pcm UINT8 wbank; UINT8 enable; UINT8 data[0x10000]; + double volume[2]; + INT32 output_dir[2]; }; static struct rf5c68pcm *chip = NULL; @@ -61,7 +63,7 @@ void RF5C68PCMUpdate(INT16* pSoundBuf, INT32 length) if (sample == 0xff) break; } - chan->addr += (chan->step * nUpdateStep) >> 15;//(chan->step * 1181) / 1000; + chan->addr += (chan->step * nUpdateStep) >> 15; if (sample & 0x80) { sample &= 0x7f; @@ -76,15 +78,33 @@ void RF5C68PCMUpdate(INT16* pSoundBuf, INT32 length) } for (i = 0; i < length; i++) { - if (left[i] > 32767) left[i] = 32767; - if (left[i] < -32768) left[i] = -32768; - left[i] = left[i] & ~0x3f; - if (right[i] > 32767) right[i] = 32767; - if (right[i] < -32768) right[i] = -32768; - right[i] = right[i] & ~0x3f; + INT32 nLeftSample = 0; + INT32 nRightSample = 0; - pSoundBuf[i + 0] = left[i]; - pSoundBuf[i + 1] = right[i]; + left[i] = BURN_SND_CLIP(left[i]); + left[i] = left[i] & ~0x3f; + right[i] = BURN_SND_CLIP(right[i]); + right[i] = right[i] & ~0x3f; + + if ((chip->output_dir[BURN_SND_RF5C68PCM_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) { + nLeftSample += (INT32)(left[i] * chip->volume[BURN_SND_RF5C68PCM_ROUTE_1]); + } + if ((chip->output_dir[BURN_SND_RF5C68PCM_ROUTE_1] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) { + nRightSample += (INT32)(left[i] * chip->volume[BURN_SND_RF5C68PCM_ROUTE_1]); + } + + if ((chip->output_dir[BURN_SND_RF5C68PCM_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) { + nLeftSample += (INT32)(right[i] * chip->volume[BURN_SND_RF5C68PCM_ROUTE_2]); + } + if ((chip->output_dir[BURN_SND_RF5C68PCM_ROUTE_2] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) { + nRightSample += (INT32)(right[i] * chip->volume[BURN_SND_RF5C68PCM_ROUTE_2]); + } + + nLeftSample = BURN_SND_CLIP(nLeftSample); + nRightSample = BURN_SND_CLIP(nRightSample); + + pSoundBuf[i + 0] = nLeftSample; + pSoundBuf[i + 1] = nRightSample; } } @@ -94,7 +114,6 @@ void RF5C68PCMReset() if (!DebugSnd_RF5C68Initted) bprintf(PRINT_ERROR, _T("RF5C68PCMReset called without init\n")); #endif - memset(chip, 0, sizeof(*chip)); memset(chip->data, 0xff, sizeof(chip->data)); } @@ -109,9 +128,25 @@ void RF5C68PCMInit(INT32 clock) left = (INT32*)malloc(nBurnSoundLen * sizeof(INT32)); right = (INT32*)malloc(nBurnSoundLen * sizeof(INT32)); + chip->volume[BURN_SND_RF5C68PCM_ROUTE_1] = 1.00; + chip->volume[BURN_SND_RF5C68PCM_ROUTE_2] = 1.00; + chip->output_dir[BURN_SND_RF5C68PCM_ROUTE_1] = BURN_SND_ROUTE_LEFT; + chip->output_dir[BURN_SND_RF5C68PCM_ROUTE_2] = BURN_SND_ROUTE_RIGHT; + DebugSnd_RF5C68Initted = 1; } +void RF5C68PCMSetRoute(INT32 nIndex, double nVolume, INT32 nRouteDir) +{ +#if defined FBA_DEBUG + if (!DebugSnd_RF5C68Initted) bprintf(PRINT_ERROR, _T("RF5C68PCMSetRoute called without init\n")); + if (nIndex < 0 || nIndex > 1) bprintf(PRINT_ERROR, _T("RF5C68PCMSetRoute called with invalid index %i\n"), nIndex); +#endif + + chip->volume[nIndex] = nVolume; + chip->output_dir[nIndex] = nRouteDir; +} + void RF5C68PCMExit() { #if defined FBA_DEBUG diff --git a/src/burn/snd/rf5c68.h b/src/burn/snd/rf5c68.h index e3a72191b..61e6bd704 100644 --- a/src/burn/snd/rf5c68.h +++ b/src/burn/snd/rf5c68.h @@ -1,8 +1,16 @@ void RF5C68PCMUpdate(INT16* pSoundBuf, INT32 length); void RF5C68PCMReset(); void RF5C68PCMInit(INT32 clock); +void RF5C68PCMSetRoute(INT32 nIndex, double nVolume, INT32 nRouteDir); void RF5C68PCMExit(); void RF5C68PCMScan(INT32 nAction); void RF5C68PCMRegWrite(UINT8 offset, UINT8 data); UINT8 RF5C68PCMRead(UINT16 offset); void RF5C68PCMWrite(UINT16 offset, UINT8 data); + +#define BURN_SND_RF5C68PCM_ROUTE_1 0 +#define BURN_SND_RF5C68PCM_ROUTE_2 1 + +#define RF5C68PCMSetAllRoutes(v, d) \ + RF5C68PCMSetRoute(BURN_SND_RF5C68PCM_ROUTE_1, v, d); \ + RF5C68PCMSetRoute(BURN_SND_RF5C68PCM_ROUTE_2, v, d); diff --git a/src/burn/snd/segapcm.h b/src/burn/snd/segapcm.h index 8c725b0ff..6541d6a64 100644 --- a/src/burn/snd/segapcm.h +++ b/src/burn/snd/segapcm.h @@ -16,6 +16,6 @@ void SegaPCMWrite(UINT32 Offset, UINT8 Data); #define BURN_SND_SEGAPCM_ROUTE_1 0 #define BURN_SND_SEGAPCM_ROUTE_2 1 -#define SegaPCMSetAllRoutes(i, v, d) \ - SegaPCMSetRoute(i, BURN_SND_SEGAPCM_ROUTE_1, v, d); \ - SegaPCMSetRoute(i, BURN_SND_SEGAPCM_ROUTE_2, v, d); +#define SegaPCMSetAllRoutes(v, d) \ + SegaPCMSetRoute(BURN_SND_SEGAPCM_ROUTE_1, v, d); \ + SegaPCMSetRoute(BURN_SND_SEGAPCM_ROUTE_2, v, d);