Added support to dac.cpp for volume and left/right selection for each route. Updated necessary drivers to support.
This commit is contained in:
parent
1559c9bafb
commit
cfcf9639d0
|
@ -210,12 +210,12 @@ void GalSoundInit()
|
|||
AY8910SetAllRoutes(1, 0.10, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
DACInit(0, 0, 1, SfxSyncDAC);
|
||||
DACSetVolShift(0, 2);
|
||||
DACSetRoute(0, 1.00, BURN_SND_ROUTE_BOTH);
|
||||
}
|
||||
|
||||
if (GalSoundType == GAL_SOUND_HARDWARE_TYPE_KINGBALLDAC) {
|
||||
DACInit(0, 0, 1, KingballSyncDAC);
|
||||
DACSetVolShift(0, 2);
|
||||
DACSetRoute(0, 0.75, BURN_SND_ROUTE_BOTH);
|
||||
}
|
||||
|
||||
if (GalSoundType == GAL_SOUND_HARDWARE_TYPE_HEXPOOLASN76496) {
|
||||
|
|
|
@ -1725,7 +1725,7 @@ static INT32 DrvInit(void (*pCPUMapCallback)(), void (*pSNDMapCallback)(), INT32
|
|||
YM2151SetIrqHandler(0, &m72YM2151IRQHandler);
|
||||
|
||||
DACInit(0, 0, 1, m72SyncDAC);
|
||||
DACSetVolShift(0, 2); // 25% of max
|
||||
DACSetRoute(0, 0.40, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
DrvDoReset();
|
||||
|
||||
|
|
|
@ -1148,7 +1148,7 @@ static INT32 DrvInit(INT32 codesize, INT32 gfxlen, INT32 samples, INT32 bank, IN
|
|||
YM2151SetIrqHandler(0, &m72YM2151IRQHandler);
|
||||
|
||||
DACInit(0, 0, 1, m90SyncDAC);
|
||||
DACSetVolShift(0, 4); // 1/16th of max
|
||||
DACSetRoute(0, 0.10, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
code_mask[0] = ((gfxlen * 2) - 1) / (8 * 8);
|
||||
code_mask[1] = ((gfxlen * 2) - 1) / (16 * 16);
|
||||
|
|
|
@ -1460,7 +1460,7 @@ static INT32 DrvInit()
|
|||
BurnYM2151Init(3579645, 25.0);
|
||||
BurnYM2151SetIrqHandler(&VigilantYM2151IrqHandler);
|
||||
DACInit(0, 0, 1, VigilantSyncDAC);
|
||||
DACSetVolShift(0, 1);
|
||||
DACSetRoute(0, 1.00, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
DrvDoReset();
|
||||
|
||||
|
@ -1570,7 +1570,7 @@ static INT32 BuccanrsInit()
|
|||
BurnYM2203SetRoute(1, BURN_SND_YM2203_AY8910_ROUTE_3, 0.35, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
DACInit(0, 0, 1, VigilantSyncDAC);
|
||||
DACSetVolShift(0, 1);
|
||||
DACSetRoute(0, 0.35, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
DrvDoReset();
|
||||
|
||||
|
@ -1693,7 +1693,7 @@ static INT32 KikcubicInit()
|
|||
BurnYM2151Init(3579645, 25.0);
|
||||
BurnYM2151SetIrqHandler(&VigilantYM2151IrqHandler);
|
||||
DACInit(0, 0, 1, VigilantSyncDAC);
|
||||
DACSetVolShift(0, 1);
|
||||
DACSetRoute(0, 1.00, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
DrvKikcubicDraw = 1;
|
||||
|
||||
|
|
|
@ -249,6 +249,8 @@ static INT32 DrvInit()
|
|||
|
||||
DACInit(0, 0, 0, moguraDACSync);
|
||||
DACInit(1, 0, 0, moguraDACSync);
|
||||
DACSetRoute(0, 0.50, BURN_SND_ROUTE_LEFT);
|
||||
DACSetRoute(1, 0.50, BURN_SND_ROUTE_RIGHT);
|
||||
|
||||
GenericTilesInit();
|
||||
|
||||
|
|
|
@ -872,8 +872,8 @@ static INT32 DrvInit(INT32 (*pLoadRoms)(), void (*p68KInit)(), INT32 zLen)
|
|||
|
||||
DACInit(0, 0, 1, DrvSyncDAC);
|
||||
DACInit(1, 0, 1, DrvSyncDAC);
|
||||
DACSetVolShift(0, 1);
|
||||
DACSetVolShift(1, 1);
|
||||
DACSetRoute(0, 0.40, BURN_SND_ROUTE_BOTH);
|
||||
DACSetRoute(1, 0.40, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
GenericTilesInit();
|
||||
|
||||
|
@ -1289,7 +1289,12 @@ static INT32 ArmedfInit()
|
|||
sprite_offy = 128;
|
||||
irqline = 1;
|
||||
|
||||
return DrvInit(ArmedfLoadRoms, Armedf68KInit, 0xf800);
|
||||
INT32 nRet = DrvInit(ArmedfLoadRoms, Armedf68KInit, 0xf800);
|
||||
|
||||
DACSetRoute(0, 0.50, BURN_SND_ROUTE_BOTH);
|
||||
DACSetRoute(1, 0.50, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
return nRet;
|
||||
}
|
||||
|
||||
struct BurnDriver BurnDrvArmedf = {
|
||||
|
@ -1703,7 +1708,12 @@ static INT32 TerrafInit()
|
|||
sprite_offy = 128;
|
||||
irqline = 1;
|
||||
|
||||
return DrvInit(ArmedfLoadRoms, Cclimbr268KInit, 0xf800);
|
||||
INT32 nRet = DrvInit(ArmedfLoadRoms, Cclimbr268KInit, 0xf800);
|
||||
|
||||
DACSetRoute(0, 0.80, BURN_SND_ROUTE_BOTH);
|
||||
DACSetRoute(1, 0.80, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
return nRet;
|
||||
}
|
||||
|
||||
struct BurnDriver BurnDrvTerraf = {
|
||||
|
@ -1754,7 +1764,12 @@ static INT32 TerrafuInit()
|
|||
sprite_offy = 128;
|
||||
irqline = 1;
|
||||
|
||||
return DrvInit(ArmedfLoadRoms, Cclimbr268KInit, 0xf800);
|
||||
INT32 nRet = DrvInit(ArmedfLoadRoms, Cclimbr268KInit, 0xf800);
|
||||
|
||||
DACSetRoute(0, 0.80, BURN_SND_ROUTE_BOTH);
|
||||
DACSetRoute(1, 0.80, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
return nRet;
|
||||
}
|
||||
|
||||
struct BurnDriver BurnDrvTerrafu = {
|
||||
|
@ -1833,7 +1848,12 @@ static INT32 TerrafjbInit()
|
|||
|
||||
Terrafjb = 1;
|
||||
|
||||
return DrvInit(TerrafjbLoadRoms, Cclimbr268KInit, 0xf800);
|
||||
INT32 nRet = DrvInit(TerrafjbLoadRoms, Cclimbr268KInit, 0xf800);
|
||||
|
||||
DACSetRoute(0, 0.80, BURN_SND_ROUTE_BOTH);
|
||||
DACSetRoute(1, 0.80, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
return nRet;
|
||||
}
|
||||
|
||||
struct BurnDriver BurnDrvTerrafjb = {
|
||||
|
|
|
@ -466,7 +466,7 @@ static INT32 DrvInit()
|
|||
AY8910SetAllRoutes(0, 0.50, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
DACInit(0, 0, 1, DrvSyncDAC);
|
||||
DACSetVolShift(0, 2);
|
||||
DACSetRoute(0, 0.50, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
DrvDoReset();
|
||||
|
||||
|
|
|
@ -1081,8 +1081,8 @@ static INT32 DrvInit()
|
|||
|
||||
DACInit(0, 0, 1, TerracreSyncDAC);
|
||||
DACInit(1, 0, 1, TerracreSyncDAC);
|
||||
DACSetVolShift(0, 1);
|
||||
DACSetVolShift(1, 1);
|
||||
DACSetRoute(0, 0.50, BURN_SND_ROUTE_BOTH);
|
||||
DACSetRoute(1, 0.50, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
GenericTilesInit();
|
||||
|
||||
|
@ -1136,8 +1136,8 @@ static INT32 DrvAmazonInit()
|
|||
|
||||
DACInit(0, 0, 1, TerracreSyncDAC);
|
||||
DACInit(1, 0, 1, TerracreSyncDAC);
|
||||
DACSetVolShift(0, 2);
|
||||
DACSetVolShift(1, 2);
|
||||
DACSetRoute(0, 0.50, BURN_SND_ROUTE_BOTH);
|
||||
DACSetRoute(1, 0.50, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
GenericTilesInit();
|
||||
|
||||
|
|
|
@ -1470,10 +1470,10 @@ static INT32 BestbestInit()
|
|||
DACInit(1, 0, 1, bestbestSyncDAC);
|
||||
DACInit(2, 0, 1, bestbestSyncDAC);
|
||||
DACInit(3, 0, 1, bestbestSyncDAC);
|
||||
DACSetVolShift(0, 2);
|
||||
DACSetVolShift(1, 2);
|
||||
DACSetVolShift(2, 2);
|
||||
DACSetVolShift(3, 2);
|
||||
DACSetRoute(0, 0.40, BURN_SND_ROUTE_LEFT);
|
||||
DACSetRoute(1, 0.40, BURN_SND_ROUTE_RIGHT);
|
||||
DACSetRoute(2, 0.40, BURN_SND_ROUTE_LEFT);
|
||||
DACSetRoute(3, 0.40, BURN_SND_ROUTE_RIGHT);
|
||||
|
||||
DrvDoReset();
|
||||
|
||||
|
@ -1536,8 +1536,8 @@ static INT32 SunaqInit()
|
|||
|
||||
DACInit(0, 0, 2, bestbestSyncDAC);
|
||||
DACInit(1, 0, 2, bestbestSyncDAC);
|
||||
DACSetVolShift(0, 2);
|
||||
DACSetVolShift(1, 2);
|
||||
DACSetRoute(0, 0.50, BURN_SND_ROUTE_LEFT);
|
||||
DACSetRoute(1, 0.50, BURN_SND_ROUTE_RIGHT);
|
||||
|
||||
DrvDoReset();
|
||||
|
||||
|
@ -1610,8 +1610,8 @@ static INT32 UballoonInit()
|
|||
|
||||
DACInit(0, 0, 1, bssoccerSyncDAC);
|
||||
DACInit(1, 0, 1, bssoccerSyncDAC);
|
||||
DACSetVolShift(0, 2);
|
||||
DACSetVolShift(1, 2);
|
||||
DACSetRoute(0, 0.50, BURN_SND_ROUTE_LEFT);
|
||||
DACSetRoute(1, 0.50, BURN_SND_ROUTE_RIGHT);
|
||||
|
||||
GenericTilesInit();
|
||||
|
||||
|
@ -1687,10 +1687,10 @@ static INT32 BssoccerInit()
|
|||
DACInit(1, 0, 1, bssoccerSyncDAC);
|
||||
DACInit(2, 0, 1, bssoccerSyncDAC);
|
||||
DACInit(3, 0, 1, bssoccerSyncDAC);
|
||||
DACSetVolShift(0, 2);
|
||||
DACSetVolShift(1, 2);
|
||||
DACSetVolShift(2, 2);
|
||||
DACSetVolShift(3, 2);
|
||||
DACSetRoute(0, 0.40, BURN_SND_ROUTE_LEFT);
|
||||
DACSetRoute(1, 0.40, BURN_SND_ROUTE_RIGHT);
|
||||
DACSetRoute(2, 0.40, BURN_SND_ROUTE_LEFT);
|
||||
DACSetRoute(3, 0.40, BURN_SND_ROUTE_RIGHT);
|
||||
|
||||
DrvDoReset();
|
||||
|
||||
|
|
|
@ -1852,6 +1852,7 @@ INT32 System16Init()
|
|||
|
||||
YM2151SetPortWriteHandler(0, &System16N7751ControlWrite);
|
||||
DACInit(0, 0, 1, System16ASyncDAC);
|
||||
DACSetRoute(0, 0.80, BURN_SND_ROUTE_BOTH);
|
||||
}
|
||||
|
||||
System16TileBankSize = 0x1000;
|
||||
|
|
|
@ -879,7 +879,7 @@ static INT32 DrvInit()
|
|||
AY8910SetAllRoutes(0, 0.10, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
DACInit(0, 0, 1, flstoryDACSync);
|
||||
DACSetVolShift(0, 2);
|
||||
DACSetRoute(0, 0.20, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
GenericTilesInit();
|
||||
|
||||
|
|
|
@ -1329,6 +1329,7 @@ static INT32 Type1Init(INT32 mcutype)
|
|||
}
|
||||
|
||||
DACInit(0, 0, 1, kabukizSyncDAC); // kabukiz
|
||||
DACSetRoute(0, 1.00, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
GenericTilesInit();
|
||||
|
||||
|
|
|
@ -6,9 +6,10 @@
|
|||
struct dac_info
|
||||
{
|
||||
INT16 Output;
|
||||
INT32 nVolShift;
|
||||
double nVolume;
|
||||
INT32 nCurrentPosition;
|
||||
INT32 Initialized;
|
||||
INT32 OutputDir;
|
||||
INT32 (*pSyncCallback)();
|
||||
};
|
||||
|
||||
|
@ -17,7 +18,8 @@ static struct dac_info dac_table[DAC_NUM];
|
|||
static INT16 UnsignedVolTable[256];
|
||||
static INT16 SignedVolTable[256];
|
||||
|
||||
static INT16 *buffer = NULL;
|
||||
static INT16 *lBuffer = NULL;
|
||||
static INT16 *rBuffer = NULL;
|
||||
|
||||
static INT32 NumChips;
|
||||
|
||||
|
@ -27,9 +29,13 @@ static void UpdateStream(INT32 chip, INT32 length)
|
|||
{
|
||||
struct dac_info *ptr;
|
||||
|
||||
if (buffer == NULL) { // delay buffer allocation for cases when fps is not 60
|
||||
buffer = (INT16*)BurnMalloc(nBurnSoundLen * sizeof(INT16));
|
||||
memset (buffer, 0, nBurnSoundLen * sizeof(INT16));
|
||||
if (lBuffer == NULL) { // delay buffer allocation for cases when fps is not 60
|
||||
lBuffer = (INT16*)BurnMalloc(nBurnSoundLen * sizeof(INT16));
|
||||
memset (lBuffer, 0, nBurnSoundLen * sizeof(INT16));
|
||||
}
|
||||
if (rBuffer == NULL) { // delay buffer allocation for cases when fps is not 60
|
||||
rBuffer = (INT16*)BurnMalloc(nBurnSoundLen * sizeof(INT16));
|
||||
memset (rBuffer, 0, nBurnSoundLen * sizeof(INT16));
|
||||
}
|
||||
|
||||
ptr = &dac_table[chip];
|
||||
|
@ -39,7 +45,8 @@ static void UpdateStream(INT32 chip, INT32 length)
|
|||
length -= ptr->nCurrentPosition;
|
||||
if (length <= 0) return;
|
||||
|
||||
INT16 *buf = buffer + ptr->nCurrentPosition;
|
||||
INT16 *lbuf = lBuffer + ptr->nCurrentPosition;
|
||||
INT16 *rbuf = rBuffer + ptr->nCurrentPosition;
|
||||
|
||||
INT16 Out = ptr->Output;
|
||||
|
||||
|
@ -47,7 +54,12 @@ static void UpdateStream(INT32 chip, INT32 length)
|
|||
|
||||
if (Out) {
|
||||
while (length--) {
|
||||
*buf++ = *buf + Out;
|
||||
if ((ptr->OutputDir & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
|
||||
*lbuf++ = *lbuf + Out;
|
||||
}
|
||||
if ((ptr->OutputDir & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
|
||||
*rbuf++ = *rbuf + Out;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -64,22 +76,28 @@ void DACUpdate(INT16* Buffer, INT32 Length)
|
|||
UpdateStream(i, nBurnSoundLen);
|
||||
}
|
||||
|
||||
INT16 *buf = buffer;
|
||||
INT16 *lbuf = lBuffer;
|
||||
INT16 *rbuf = rBuffer;
|
||||
|
||||
if (bAddSignal) {
|
||||
while (Length--) {
|
||||
Buffer[0] = BURN_SND_CLIP((INT32)(buf[0] + Buffer[0]));
|
||||
Buffer[1] = BURN_SND_CLIP((INT32)(buf[0] + Buffer[1]));
|
||||
Buffer[0] = BURN_SND_CLIP((INT32)(lbuf[0] + Buffer[0]));
|
||||
Buffer[1] = BURN_SND_CLIP((INT32)(rbuf[0] + Buffer[1]));
|
||||
Buffer += 2;
|
||||
buf[0] = 0; // clear buffer
|
||||
buf++;
|
||||
lbuf[0] = 0; // clear buffer
|
||||
rbuf[0] = 0; // clear buffer
|
||||
lbuf++;
|
||||
rbuf++;
|
||||
}
|
||||
} else {
|
||||
while (Length--) {
|
||||
Buffer[1] = Buffer[0] = buf[0];
|
||||
Buffer[0] = lbuf[0];
|
||||
Buffer[1] = rbuf[0];
|
||||
Buffer += 2;
|
||||
buf[0] = 0; // clear buffer
|
||||
buf++;
|
||||
lbuf[0] = 0; // clear buffer
|
||||
rbuf[0] = 0; // clear buffer
|
||||
lbuf++;
|
||||
rbuf++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -102,7 +120,7 @@ void DACWrite(INT32 Chip, UINT8 Data)
|
|||
|
||||
UpdateStream(Chip, ptr->pSyncCallback());
|
||||
|
||||
ptr->Output = UnsignedVolTable[Data] >> ptr->nVolShift;
|
||||
ptr->Output = (INT32)(UnsignedVolTable[Data] * ptr->nVolume);
|
||||
}
|
||||
|
||||
void DACSignedWrite(INT32 Chip, UINT8 Data)
|
||||
|
@ -118,7 +136,7 @@ void DACSignedWrite(INT32 Chip, UINT8 Data)
|
|||
|
||||
UpdateStream(Chip, ptr->pSyncCallback());
|
||||
|
||||
ptr->Output = SignedVolTable[Data] >> ptr->nVolShift;
|
||||
ptr->Output = (INT32)(SignedVolTable[Data] * ptr->nVolume);
|
||||
}
|
||||
|
||||
static void DACBuildVolTables()
|
||||
|
@ -147,7 +165,8 @@ void DACInit(INT32 Num, UINT32 /*Clock*/, INT32 bAdd, INT32 (*pSyncCB)())
|
|||
memset (ptr, 0, sizeof(dac_info));
|
||||
|
||||
ptr->Initialized = 1;
|
||||
ptr->nVolShift = 0;
|
||||
ptr->nVolume = 1.00;
|
||||
ptr->OutputDir = BURN_SND_ROUTE_BOTH;
|
||||
ptr->pSyncCallback = pSyncCB;
|
||||
|
||||
DACBuildVolTables(); // necessary to build for every chip?
|
||||
|
@ -155,17 +174,18 @@ void DACInit(INT32 Num, UINT32 /*Clock*/, INT32 bAdd, INT32 (*pSyncCB)())
|
|||
bAddSignal = bAdd;
|
||||
}
|
||||
|
||||
void DACSetVolShift(INT32 Chip, INT32 nShift)
|
||||
void DACSetRoute(INT32 Chip, double nVolume, INT32 nRouteDir)
|
||||
{
|
||||
#if defined FBA_DEBUG
|
||||
if (!DebugSnd_DACInitted) bprintf(PRINT_ERROR, _T("DACSetVolShift called without init\n"));
|
||||
if (Chip > NumChips) bprintf(PRINT_ERROR, _T("DACSetVolShift called with invalid chip number %x\n"), Chip);
|
||||
if (!DebugSnd_DACInitted) bprintf(PRINT_ERROR, _T("DACSetRoute called without init\n"));
|
||||
if (Chip > NumChips) bprintf(PRINT_ERROR, _T("DACSetRoute called with invalid chip %i\n"), Chip);
|
||||
#endif
|
||||
|
||||
struct dac_info *ptr;
|
||||
|
||||
ptr = &dac_table[Chip];
|
||||
ptr->nVolShift = nShift;
|
||||
ptr->nVolume = nVolume;
|
||||
ptr->OutputDir = nRouteDir;
|
||||
}
|
||||
|
||||
void DACReset()
|
||||
|
@ -203,7 +223,8 @@ void DACExit()
|
|||
|
||||
DebugSnd_DACInitted = 0;
|
||||
|
||||
BurnFree (buffer);
|
||||
BurnFree (lBuffer);
|
||||
BurnFree (rBuffer);
|
||||
}
|
||||
|
||||
INT32 DACScan(INT32 nAction,INT32 *pnMin)
|
||||
|
|
|
@ -2,7 +2,7 @@ void DACUpdate(INT16* Buffer, INT32 Length);
|
|||
void DACWrite(INT32 Chip, UINT8 Data);
|
||||
void DACSignedWrite(INT32 Chip, UINT8 Data);
|
||||
void DACInit(INT32 Num, UINT32 Clock, INT32 bAdd, INT32 (*pSyncCB)());
|
||||
void DACSetVolShift(INT32 Num, INT32 nShift);
|
||||
void DACSetRoute(INT32 Chip, double nVolume, INT32 nRouteDir);
|
||||
void DACReset();
|
||||
void DACExit();
|
||||
INT32 DACScan(INT32 nAction,INT32 *pnMin);
|
||||
|
|
Loading…
Reference in New Issue