diff --git a/src/burn/drv/pre90s/d_mitchell.cpp b/src/burn/drv/pre90s/d_mitchell.cpp index abc00d243..2bb49722a 100644 --- a/src/burn/drv/pre90s/d_mitchell.cpp +++ b/src/burn/drv/pre90s/d_mitchell.cpp @@ -1593,8 +1593,8 @@ static void MitchellMachineInit() ZetMemEnd(); ZetClose(); - BurnYM2413Init(4000000, 1.0); - BurnYM2413DecreaseVolume(40); + BurnYM2413Init(4000000); + BurnYM2413SetAllRoutes(1.00, BURN_SND_ROUTE_BOTH); MSM6295Init(0, 1000000 / 132, 10.0, 1); MSM6295ROM = DrvSoundRom; @@ -1628,8 +1628,8 @@ static void MahjongMachineInit() ZetMemEnd(); ZetClose(); - BurnYM2413Init(4000000, 1.0); - BurnYM2413DecreaseVolume(40); + BurnYM2413Init(4000000); + BurnYM2413SetAllRoutes(1.00, BURN_SND_ROUTE_BOTH); MSM6295Init(0, 990000 / 132, 10.0, 1); memcpy(MSM6295ROM, DrvSoundRom, 0x40000); @@ -1700,8 +1700,8 @@ static INT32 MgakuenInit() ZetMemEnd(); ZetClose(); - BurnYM2413Init(4000000, 1.0); - BurnYM2413DecreaseVolume(40); + BurnYM2413Init(4000000); + BurnYM2413SetAllRoutes(1.00, BURN_SND_ROUTE_BOTH); MSM6295Init(0, 990000 / 132, 10.0, 1); memcpy(MSM6295ROM, DrvSoundRom, 0x40000); @@ -2309,6 +2309,7 @@ static INT32 MstworldInit() ZetMemEnd(); ZetClose(); + ZetInit(1); ZetOpen(1); ZetSetReadHandler(MstworldSoundZ80Read); ZetSetWriteHandler(MstworldSoundZ80Write); diff --git a/src/burn/drv/sega/sys16_run.cpp b/src/burn/drv/sega/sys16_run.cpp index 0e4d70138..f9fafc507 100644 --- a/src/burn/drv/sega/sys16_run.cpp +++ b/src/burn/drv/sega/sys16_run.cpp @@ -1913,8 +1913,8 @@ INT32 System16Init() } if (BurnDrvGetHardwareCode() & HARDWARE_SEGA_YM2413) { - BurnYM2413Init(5000000, 25.0); - BurnYM2413IncreaseVolume(4); + BurnYM2413Init(5000000); + BurnYM2413SetAllRoutes(1.00, BURN_SND_ROUTE_BOTH); } else { BurnYM2151Init(4000000, 25.0); } diff --git a/src/burn/snd/burn_ym2413.cpp b/src/burn/snd/burn_ym2413.cpp index a0ecb0c25..2180a6512 100644 --- a/src/burn/snd/burn_ym2413.cpp +++ b/src/burn/snd/burn_ym2413.cpp @@ -14,68 +14,19 @@ static UINT32 nSampleSize; static INT32 nFractionalPosition; static UINT32 nSamplesRendered; -static INT32 nYM2413Volume; +static double YM2413Volumes[2]; +static INT32 YM2413RouteDirs[2]; +#if 0 static void YM2413RenderResample(INT16* pSoundBuf, INT32 nSegmentLength) { #if defined FBA_DEBUG if (!DebugSnd_YM2413Initted) bprintf(PRINT_ERROR, _T("YM2413RenderResample called without init\n")); #endif - nBurnPosition += nSegmentLength; - - if (nBurnPosition >= nBurnSoundRate) { - nBurnPosition = nSegmentLength; - - pYM2413Buffer[0][1] = pYM2413Buffer[0][(nFractionalPosition >> 16) - 3]; - pYM2413Buffer[0][2] = pYM2413Buffer[0][(nFractionalPosition >> 16) - 2]; - pYM2413Buffer[0][3] = pYM2413Buffer[0][(nFractionalPosition >> 16) - 1]; - - pYM2413Buffer[1][1] = pYM2413Buffer[1][(nFractionalPosition >> 16) - 3]; - pYM2413Buffer[1][2] = pYM2413Buffer[1][(nFractionalPosition >> 16) - 2]; - pYM2413Buffer[1][3] = pYM2413Buffer[1][(nFractionalPosition >> 16) - 1]; - - nSamplesRendered -= (nFractionalPosition >> 16) - 4; - - for (UINT32 i = 0; i <= nSamplesRendered; i++) { - pYM2413Buffer[0][4 + i] = pYM2413Buffer[0][(nFractionalPosition >> 16) + i]; - pYM2413Buffer[1][4 + i] = pYM2413Buffer[1][(nFractionalPosition >> 16) + i]; - } - - nFractionalPosition &= 0x0000FFFF; - nFractionalPosition |= 4 << 16; - } - - pYM2413Buffer[0] = pBuffer + 4 + nSamplesRendered; - pYM2413Buffer[1] = pBuffer + 4 + nSamplesRendered + 65536; - - YM2413UpdateOne(0, pYM2413Buffer, (UINT32)(nBurnPosition + 1) * nBurnYM2413SoundRate / nBurnSoundRate - nSamplesRendered); - nSamplesRendered += (UINT32)(nBurnPosition + 1) * nBurnYM2413SoundRate / nBurnSoundRate - nSamplesRendered; - - pYM2413Buffer[0] = pBuffer; - pYM2413Buffer[1] = pBuffer + 65536; - - nSegmentLength <<= 1; - - for (INT32 i = 0; i < nSegmentLength; i += 2, nFractionalPosition += nSampleSize) { - - INT32 nSample = INTERPOLATE4PS_CUSTOM((nFractionalPosition >> 4) & 0x0FFF, - pYM2413Buffer[0][(nFractionalPosition >> 16) - 3], - pYM2413Buffer[0][(nFractionalPosition >> 16) - 2], - pYM2413Buffer[0][(nFractionalPosition >> 16) - 1], - pYM2413Buffer[0][(nFractionalPosition >> 16) - 0], - nYM2413Volume / 100) - + INTERPOLATE4PS_CUSTOM((nFractionalPosition >> 4) & 0x0FFF, - pYM2413Buffer[1][(nFractionalPosition >> 16) - 3], - pYM2413Buffer[1][(nFractionalPosition >> 16) - 2], - pYM2413Buffer[1][(nFractionalPosition >> 16) - 1], - pYM2413Buffer[1][(nFractionalPosition >> 16) - 0], - nYM2413Volume / 100); - - pSoundBuf[i + 0] = nSample; - pSoundBuf[i + 1] = nSample; - } + // not currently supported (old code crashed) } +#endif static void YM2413RenderNormal(INT16* pSoundBuf, INT32 nSegmentLength) { @@ -91,17 +42,27 @@ static void YM2413RenderNormal(INT16* pSoundBuf, INT32 nSegmentLength) YM2413UpdateOne(0, pYM2413Buffer, nSegmentLength); for (INT32 n = 0; n < nSegmentLength; n++) { - INT32 nSample1 = pYM2413Buffer[0][n] * (nYM2413Volume >> 10); - nSample1 >>= 8; - INT32 nSample2 = pYM2413Buffer[1][n] * (nYM2413Volume >> 10); - nSample2 >>= 8; - - INT32 nSample = nSample1 + nSample2; - if (nSample < -32768) nSample = -32768; - if (nSample > 32767) nSample = 32767; - - pSoundBuf[(n << 1) + 0] = nSample; - pSoundBuf[(n << 1) + 1] = nSample; + INT32 nLeftSample = 0, nRightSample = 0; + + if ((YM2413RouteDirs[BURN_SND_YM2413_YM2413_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) { + nLeftSample += (INT32)(pYM2413Buffer[0][n] * YM2413Volumes[BURN_SND_YM2413_YM2413_ROUTE_1]); + } + if ((YM2413RouteDirs[BURN_SND_YM2413_YM2413_ROUTE_1] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) { + nRightSample += (INT32)(pYM2413Buffer[0][n] * YM2413Volumes[BURN_SND_YM2413_YM2413_ROUTE_1]); + } + + if ((YM2413RouteDirs[BURN_SND_YM2413_YM2413_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) { + nLeftSample += (INT32)(pYM2413Buffer[1][n] * YM2413Volumes[BURN_SND_YM2413_YM2413_ROUTE_2]); + } + if ((YM2413RouteDirs[BURN_SND_YM2413_YM2413_ROUTE_2] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) { + nRightSample += (INT32)(pYM2413Buffer[1][n] * YM2413Volumes[BURN_SND_YM2413_YM2413_ROUTE_2]); + } + + nLeftSample = BURN_SND_CLIP(nLeftSample); + nRightSample = BURN_SND_CLIP(nRightSample); + + pSoundBuf[(n << 1) + 0] = nLeftSample; + pSoundBuf[(n << 1) + 1] = nRightSample; } } @@ -129,7 +90,7 @@ void BurnYM2413Exit() DebugSnd_YM2413Initted = 0; } -INT32 BurnYM2413Init(INT32 nClockFrequency, float nVolume) +INT32 BurnYM2413Init(INT32 nClockFrequency) { DebugSnd_YM2413Initted = 1; @@ -138,6 +99,7 @@ INT32 BurnYM2413Init(INT32 nClockFrequency, float nVolume) return 0; } +#if 0 if (nFMInterpolation == 3) { // Set YM2413 core samplerate to match the hardware nBurnYM2413SoundRate = nClockFrequency >> 6; @@ -147,14 +109,14 @@ INT32 BurnYM2413Init(INT32 nClockFrequency, float nVolume) } BurnYM2413Render = YM2413RenderResample; - - nYM2413Volume = (INT32)((double)16384.0 * 100.0 / nVolume); } else { nBurnYM2413SoundRate = nBurnSoundRate; BurnYM2413Render = YM2413RenderNormal; - - nYM2413Volume = (INT32)((double)65536.0 * 100.0 / nVolume); } +#else + nBurnYM2413SoundRate = nBurnSoundRate; + BurnYM2413Render = YM2413RenderNormal; +#endif YM2413Init(1, nClockFrequency, nBurnYM2413SoundRate); @@ -165,26 +127,25 @@ INT32 BurnYM2413Init(INT32 nClockFrequency, float nVolume) nFractionalPosition = 4 << 16; nSamplesRendered = 0; nBurnPosition = 0; + + // default routes + YM2413Volumes[BURN_SND_YM2413_YM2413_ROUTE_1] = 1.00; + YM2413Volumes[BURN_SND_YM2413_YM2413_ROUTE_2] = 1.00; + YM2413RouteDirs[BURN_SND_YM2413_YM2413_ROUTE_1] = BURN_SND_ROUTE_BOTH; + YM2413RouteDirs[BURN_SND_YM2413_YM2413_ROUTE_2] = BURN_SND_ROUTE_BOTH; return 0; } -void BurnYM2413IncreaseVolume(INT32 nFactor) +void BurnYM2413SetRoute(INT32 nIndex, double nVolume, INT32 nRouteDir) { #if defined FBA_DEBUG - if (!DebugSnd_YM2413Initted) bprintf(PRINT_ERROR, _T("BurnYM2413IncreaseVolume called without init\n")); + if (!DebugSnd_YM2413Initted) bprintf(PRINT_ERROR, _T("BurnYM2413SetRoute called without init\n")); + if (nIndex < 0 || nIndex > 1) bprintf(PRINT_ERROR, _T("BurnYM2413SetRoute called with invalid index %i\n"), nIndex); #endif - - nYM2413Volume *= nFactor; -} - -void BurnYM2413DecreaseVolume(INT32 nFactor) -{ -#if defined FBA_DEBUG - if (!DebugSnd_YM2413Initted) bprintf(PRINT_ERROR, _T("BurnYM2413DecreaseVolume called without init\n")); -#endif - - nYM2413Volume /= nFactor; + + YM2413Volumes[nIndex] = nVolume; + YM2413RouteDirs[nIndex] = nRouteDir; } void BurnYM2413Scan(INT32 nAction) diff --git a/src/burn/snd/burn_ym2413.h b/src/burn/snd/burn_ym2413.h index 0c1d00860..8d19b771b 100644 --- a/src/burn/snd/burn_ym2413.h +++ b/src/burn/snd/burn_ym2413.h @@ -4,13 +4,12 @@ extern "C" { #include "ym2413.h" } -INT32 BurnYM2413Init(INT32 nClockFrequency, float nVolume); +INT32 BurnYM2413Init(INT32 nClockFrequency); +void BurnYM2413SetRoute(INT32 nIndex, double nVolume, INT32 nRouteDir); void BurnYM2413Reset(); void BurnYM2413Exit(); extern void (*BurnYM2413Render)(INT16* pSoundBuf, INT32 nSegmentLength); void BurnYM2413Scan(INT32 nAction); -void BurnYM2413IncreaseVolume(INT32 nFactor); -void BurnYM2413DecreaseVolume(INT32 nFactor); #define BurnYM2413Read(a) YM2413Read(0, a) @@ -22,3 +21,10 @@ static inline void BurnYM2413Write(INT32 Address, const UINT8 nValue) YM2413Write(0, Address, nValue); } + +#define BURN_SND_YM2413_YM2413_ROUTE_1 0 +#define BURN_SND_YM2413_YM2413_ROUTE_2 1 + +#define BurnYM2413SetAllRoutes(v, d) \ + BurnYM2413SetRoute(BURN_SND_YM2413_YM2413_ROUTE_1, v, d); \ + BurnYM2413SetRoute(BURN_SND_YM2413_YM2413_ROUTE_2, v, d);