Add volume and route support to burn_ym2413.cpp, Update drivers to support. Remove old YM2413 interpolation support, caused crashes. Fixed uninitialised Z80 crash in mstwrold in d_mitchell.cpp.
This commit is contained in:
parent
cfcf9639d0
commit
a483c4fe06
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue