Added support to dac.cpp for volume and left/right selection for each route. Updated necessary drivers to support.

This commit is contained in:
Barry Harris 2012-05-18 13:25:40 +00:00
parent 1559c9bafb
commit cfcf9639d0
14 changed files with 100 additions and 55 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 = {

View File

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

View File

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

View File

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

View File

@ -1852,6 +1852,7 @@ INT32 System16Init()
YM2151SetPortWriteHandler(0, &System16N7751ControlWrite);
DACInit(0, 0, 1, System16ASyncDAC);
DACSetRoute(0, 0.80, BURN_SND_ROUTE_BOTH);
}
System16TileBankSize = 0x1000;

View File

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

View File

@ -1329,6 +1329,7 @@ static INT32 Type1Init(INT32 mcutype)
}
DACInit(0, 0, 1, kabukizSyncDAC); // kabukiz
DACSetRoute(0, 1.00, BURN_SND_ROUTE_BOTH);
GenericTilesInit();

View File

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

View File

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