diff --git a/src/burn/snd/dac.cpp b/src/burn/snd/dac.cpp index 56b8d44a9..026f4825a 100644 --- a/src/burn/snd/dac.cpp +++ b/src/burn/snd/dac.cpp @@ -30,6 +30,38 @@ static INT32 bAddSignal; static INT32 (*pCPUTotalCycles)() = NULL; static UINT32 nDACCPUMHZ = 0; +// single-order dc blocking filter +static INT32 dac_dcblock = 0; // enable +static INT16 dac_lastin_r = 0; +static INT16 dac_lastout_r = 0; +static INT16 dac_lastin_l = 0; +static INT16 dac_lastout_l = 0; + +void DACDCBlock(INT32 enable) +{ + dac_dcblock = enable; +} + +static INT16 dc_blockR(INT16 sam) +{ + if (!dac_dcblock) return sam; + INT16 outr = sam - dac_lastin_r + 0.998 * dac_lastout_r; + dac_lastin_r = sam; + dac_lastout_r = outr; + + return outr; +} + +static INT16 dc_blockL(INT16 sam) +{ + if (!dac_dcblock) return sam; + INT16 outl = sam - dac_lastin_l + 0.998 * dac_lastout_l; + dac_lastin_l = sam; + dac_lastout_l = outl; + + return outl; +} + static INT32 DACSyncInternal() { return (INT32)(float)(nBurnSoundLen * (pCPUTotalCycles() / (nDACCPUMHZ / (nBurnFPS / 100.0000)))); @@ -99,8 +131,8 @@ void DACUpdate(INT16* Buffer, INT32 Length) if (bAddSignal) { while (Length--) { - Buffer[0] = BURN_SND_CLIP((INT32)(lbuf[0] + Buffer[0])); - Buffer[1] = BURN_SND_CLIP((INT32)(rbuf[0] + Buffer[1])); + Buffer[0] = BURN_SND_CLIP((INT32)(dc_blockL(lbuf[0]) + Buffer[0])); + Buffer[1] = BURN_SND_CLIP((INT32)(dc_blockR(rbuf[0]) + Buffer[1])); Buffer += 2; lbuf[0] = 0; // clear buffer rbuf[0] = 0; // clear buffer @@ -109,8 +141,8 @@ void DACUpdate(INT16* Buffer, INT32 Length) } } else { while (Length--) { - Buffer[0] = lbuf[0]; - Buffer[1] = rbuf[0]; + Buffer[0] = dc_blockL(lbuf[0]); + Buffer[1] = dc_blockR(rbuf[0]); Buffer += 2; lbuf[0] = 0; // clear buffer rbuf[0] = 0; // clear buffer @@ -181,6 +213,27 @@ void DACWrite16Stereo(INT32 Chip, INT16 Data, INT16 Data2) } } +void DACWrite16Signed(INT32 Chip, UINT16 Data) +{ +#if defined FBA_DEBUG + if (!DebugSnd_DACInitted) bprintf(PRINT_ERROR, _T("DACWrite16 called without init\n")); + if (Chip > NumChips) bprintf(PRINT_ERROR, _T("DACWrite16 called with invalid chip number %x\n"), Chip); +#endif + + struct dac_info *ptr; + + ptr = &dac_table[Chip]; + + INT16 Signed = Data - 0x8000; + + Data = (INT32)(Signed * ptr->nVolume); + + if (Data != ptr->Output) { + UpdateStream(Chip, ptr->pSyncCallback()); + ptr->Output = Data; + } +} + void DACSignedWrite(INT32 Chip, UINT8 Data) { #if defined FBA_DEBUG @@ -289,7 +342,10 @@ void DACReset() ptr->nCurrentPosition = 0; ptr->Output = 0; ptr->Output2 = 0; - } + } + + dac_lastin_r = dac_lastout_r = 0; + dac_lastin_l = dac_lastout_l = 0; } void DACExit() @@ -313,7 +369,9 @@ void DACExit() nDACCPUMHZ = 0; NumChips = 0; - + + dac_dcblock = 0; + DebugSnd_DACInitted = 0; BurnFree (lBuffer); diff --git a/src/burn/snd/dac.h b/src/burn/snd/dac.h index a23260b84..1bfd21093 100644 --- a/src/burn/snd/dac.h +++ b/src/burn/snd/dac.h @@ -1,12 +1,14 @@ void DACUpdate(INT16* Buffer, INT32 Length); void DACWrite(INT32 Chip, UINT8 Data); void DACWrite16(INT32 Chip, INT16 Data); +void DACWrite16Signed(INT32 Chip, UINT16 Data); void DACWrite16Stereo(INT32 Chip, INT16 Data, INT16 Data2); void DACSignedWrite(INT32 Chip, UINT8 Data); void DACInit(INT32 Num, UINT32 Clock, INT32 bAdd, INT32 (*pSyncCB)()); void DACInit(INT32 Num, UINT32 Clock, INT32 bAdd, INT32 (*pCPUCyclesCB)(), INT32 nCpuMHZ); void DACSetRoute(INT32 Chip, double nVolume, INT32 nRouteDir); void DACStereoMode(INT32 Chip); +void DACDCBlock(INT32 enable); void DACReset(); void DACExit(); void DACScan(INT32 nAction, INT32 *pnMin);