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:
Barry Harris 2012-05-18 19:54:34 +00:00
parent cfcf9639d0
commit a483c4fe06
4 changed files with 62 additions and 94 deletions

View File

@ -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);

View File

@ -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);
}

View File

@ -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)

View File

@ -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);