diff --git a/src/burn/drv/capcom/fcrash_snd.cpp b/src/burn/drv/capcom/fcrash_snd.cpp index cda35659e..790097d48 100644 --- a/src/burn/drv/capcom/fcrash_snd.cpp +++ b/src/burn/drv/capcom/fcrash_snd.cpp @@ -80,8 +80,8 @@ void __fastcall FcrashZ80Write(UINT16 a, UINT8 d) } case 0xe000: { - MSM5205SetVolume(0, (d & 0x08) ? 0 : 20); - MSM5205SetVolume(1, (d & 0x10) ? 0 : 20); + MSM5205SetRoute(0, (d & 0x08) ? 0 : 0.25, BURN_SND_ROUTE_BOTH); + MSM5205SetRoute(1, (d & 0x10) ? 0 : 0.25, BURN_SND_ROUTE_BOTH); FcrashZ80BankAddress = (d & 0x07) * 0x4000; ZetMapArea(0x8000, 0xbfff, 0, CpsZRom + FcrashZ80BankAddress); @@ -168,8 +168,10 @@ INT32 FcrashSoundInit() BurnYM2203SetRoute(1, BURN_SND_YM2203_AY8910_ROUTE_2, 0.07, BURN_SND_ROUTE_BOTH); BurnYM2203SetRoute(1, BURN_SND_YM2203_AY8910_ROUTE_3, 0.07, BURN_SND_ROUTE_BOTH); - MSM5205Init(0, FcrashSynchroniseStream, 24000000 / 64, FcrashMSM5205Vck0, MSM5205_S96_4B, 20, 1); - MSM5205Init(1, FcrashSynchroniseStream, 24000000 / 64, FcrashMSM5205Vck1, MSM5205_S96_4B, 20, 1); + MSM5205Init(0, FcrashSynchroniseStream, 24000000 / 64, FcrashMSM5205Vck0, MSM5205_S96_4B, 1); + MSM5205Init(1, FcrashSynchroniseStream, 24000000 / 64, FcrashMSM5205Vck1, MSM5205_S96_4B, 1); + MSM5205SetRoute(0, 0.25, BURN_SND_ROUTE_BOTH); + MSM5205SetRoute(1, 0.25, BURN_SND_ROUTE_BOTH); nCpsZ80Cycles = (24000000 / 6) * 100 / nBurnFPS; diff --git a/src/burn/drv/capcom/sf2mdt_snd.cpp b/src/burn/drv/capcom/sf2mdt_snd.cpp index f2f1182d9..a58185d59 100644 --- a/src/burn/drv/capcom/sf2mdt_snd.cpp +++ b/src/burn/drv/capcom/sf2mdt_snd.cpp @@ -67,8 +67,8 @@ void __fastcall Sf2mdtZ80Write(UINT16 a, UINT8 d) } case 0xe000: { - MSM5205SetVolume(0, (d & 0x20) ? 0 : 20); - MSM5205SetVolume(1, (d & 0x10) ? 0 : 20); + MSM5205SetRoute(0, (d & 0x20) ? 0 : 0.25, BURN_SND_ROUTE_BOTH); + MSM5205SetRoute(1, (d & 0x10) ? 0 : 0.25, BURN_SND_ROUTE_BOTH); Sf2mdtZ80BankAddress = (d & Sf2mdtNumZ80Banks) * 0x4000; ZetMapArea(0x8000, 0xbfff, 0, CpsZRom + Sf2mdtZ80BankAddress); @@ -135,8 +135,10 @@ INT32 Sf2mdtSoundInit() BurnYM2151Init(3579540); BurnYM2151SetAllRoutes(0.35, BURN_SND_ROUTE_BOTH); - MSM5205Init(0, Sf2mdtSynchroniseStream, 24000000 / 64, Sf2mdtMSM5205Vck0, MSM5205_S96_4B, 20, 1); - MSM5205Init(1, Sf2mdtSynchroniseStream, 24000000 / 64, Sf2mdtMSM5205Vck1, MSM5205_S96_4B, 20, 1); + MSM5205Init(0, Sf2mdtSynchroniseStream, 24000000 / 64, Sf2mdtMSM5205Vck0, MSM5205_S96_4B, 1); + MSM5205Init(1, Sf2mdtSynchroniseStream, 24000000 / 64, Sf2mdtMSM5205Vck1, MSM5205_S96_4B, 1); + MSM5205SetRoute(0, 0.25, BURN_SND_ROUTE_BOTH); + MSM5205SetRoute(1, 0.25, BURN_SND_ROUTE_BOTH); nCpsZ80Cycles = 3579540 * 100 / nBurnFPS; diff --git a/src/burn/drv/dataeast/d_dec8.cpp b/src/burn/drv/dataeast/d_dec8.cpp index 5404d7e9a..1d4d59f6e 100644 --- a/src/burn/drv/dataeast/d_dec8.cpp +++ b/src/burn/drv/dataeast/d_dec8.cpp @@ -5407,7 +5407,8 @@ static INT32 CsilverInit() BurnYM2203SetRoute(0, BURN_SND_YM2203_AY8910_ROUTE_2, 0.23, BURN_SND_ROUTE_BOTH); BurnYM2203SetRoute(0, BURN_SND_YM2203_AY8910_ROUTE_3, 0.23, BURN_SND_ROUTE_BOTH); - MSM5205Init(0, CsilverMSM5205SynchroniseStream, 384000, CsilverADPCMInt, MSM5205_S48_4B, 80, 1); + MSM5205Init(0, CsilverMSM5205SynchroniseStream, 384000, CsilverADPCMInt, MSM5205_S48_4B, 1); + MSM5205SetRoute(0, 0.88, BURN_SND_ROUTE_BOTH); GenericTilesInit(); diff --git a/src/burn/drv/irem/d_m62.cpp b/src/burn/drv/irem/d_m62.cpp index 93dcc0af6..c981dc520 100644 --- a/src/burn/drv/irem/d_m62.cpp +++ b/src/burn/drv/irem/d_m62.cpp @@ -3391,8 +3391,10 @@ static void M62MachineInit() pAY8910Buffer[4] = pFMBuffer + nBurnSoundLen * 4; pAY8910Buffer[5] = pFMBuffer + nBurnSoundLen * 5; - MSM5205Init(0, M62SynchroniseStream, 384000, M62MSM5205Vck0, MSM5205_S96_4B, 50, 1); - MSM5205Init(1, M62SynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 50, 1); + MSM5205Init(0, M62SynchroniseStream, 384000, M62MSM5205Vck0, MSM5205_S96_4B, 1); + MSM5205Init(1, M62SynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 1); + MSM5205SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH); + MSM5205SetRoute(1, 0.50, BURN_SND_ROUTE_BOTH); AY8910Init(0, 894886, nBurnSoundRate, &M62SoundLatchRead, NULL, NULL, &AY8910_0PortBWrite); AY8910Init(1, 894886, nBurnSoundRate, NULL, NULL, NULL, NULL); diff --git a/src/burn/drv/pre90s/d_ddragon.cpp b/src/burn/drv/pre90s/d_ddragon.cpp index dc1cf285a..189437224 100644 --- a/src/burn/drv/pre90s/d_ddragon.cpp +++ b/src/burn/drv/pre90s/d_ddragon.cpp @@ -1853,8 +1853,10 @@ static INT32 DrvMachineInit() BurnYM2151SetIrqHandler(&DrvYM2151IrqHandler); BurnYM2151SetAllRoutes(0.60, BURN_SND_ROUTE_BOTH); - MSM5205Init(0, DrvSynchroniseStream, 375000, DrvMSM5205Vck0, MSM5205_S48_4B, 45, 1); - MSM5205Init(1, DrvSynchroniseStream, 375000, DrvMSM5205Vck1, MSM5205_S48_4B, 45, 1); + MSM5205Init(0, DrvSynchroniseStream, 375000, DrvMSM5205Vck0, MSM5205_S48_4B, 1); + MSM5205Init(1, DrvSynchroniseStream, 375000, DrvMSM5205Vck1, MSM5205_S48_4B, 1); + MSM5205SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH); + MSM5205SetRoute(1, 0.50, BURN_SND_ROUTE_BOTH); } if (DrvGameType == DD_GAME_DARKTOWR) { diff --git a/src/burn/drv/pre90s/d_lwings.cpp b/src/burn/drv/pre90s/d_lwings.cpp index cb7fe5417..1aad7b1e9 100644 --- a/src/burn/drv/pre90s/d_lwings.cpp +++ b/src/burn/drv/pre90s/d_lwings.cpp @@ -1043,7 +1043,8 @@ static INT32 TrojanInit() ZetMemEnd(); ZetClose(); - MSM5205Init(0, DrvMSM5205SynchroniseStream, 455000, NULL, MSM5205_SEX_4B, 50, 1); + MSM5205Init(0, DrvMSM5205SynchroniseStream, 455000, NULL, MSM5205_SEX_4B, 1); + MSM5205SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH); MSM5205InUse = 1; GenericTilesInit(); diff --git a/src/burn/drv/pre90s/d_sf.cpp b/src/burn/drv/pre90s/d_sf.cpp index e0451cbb8..838afd534 100644 --- a/src/burn/drv/pre90s/d_sf.cpp +++ b/src/burn/drv/pre90s/d_sf.cpp @@ -860,8 +860,10 @@ static INT32 DrvInit(INT32 initver) BurnYM2151SetRoute(BURN_SND_YM2151_YM2151_ROUTE_1, 0.60, BURN_SND_ROUTE_LEFT); BurnYM2151SetRoute(BURN_SND_YM2151_YM2151_ROUTE_2, 0.60, BURN_SND_ROUTE_RIGHT); - MSM5205Init(0, DrvSynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 100, 1); - MSM5205Init(1, DrvSynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 100, 1); + MSM5205Init(0, DrvSynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 1); + MSM5205Init(1, DrvSynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 1); + MSM5205SetRoute(0, 1.00, BURN_SND_ROUTE_BOTH); + MSM5205SetRoute(1, 1.00, BURN_SND_ROUTE_BOTH); GenericTilesInit(); diff --git a/src/burn/drv/pre90s/d_tecmo.cpp b/src/burn/drv/pre90s/d_tecmo.cpp index 93e747182..9479acec0 100644 --- a/src/burn/drv/pre90s/d_tecmo.cpp +++ b/src/burn/drv/pre90s/d_tecmo.cpp @@ -549,7 +549,9 @@ void __fastcall rygar_sound_write(UINT16 address, UINT8 data) case 0xc800: case 0xe000: - if (DrvHasADPCM) MSM5205SetVolume(0, (data & 0x0f) * 100 / 15); + if (DrvHasADPCM) { + MSM5205SetRoute(0, (data & 0x0f) / 15, BURN_SND_ROUTE_BOTH); + } return; case 0xf000: @@ -768,7 +770,8 @@ static INT32 RygarInit() BurnTimerAttachZetYM3812(4000000); BurnYM3812SetRoute(BURN_SND_YM3812_ROUTE, 1.00, BURN_SND_ROUTE_BOTH); - MSM5205Init(0, TecmoSynchroniseStream, 400000, TecmoMSM5205Vck, MSM5205_S48_4B, 100, 1); + MSM5205Init(0, TecmoSynchroniseStream, 400000, TecmoMSM5205Vck, MSM5205_S48_4B, 1); + MSM5205SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH); GenericTilesInit(); @@ -848,7 +851,8 @@ static INT32 SilkwormInit() BurnTimerAttachZetYM3812(4000000); BurnYM3812SetRoute(BURN_SND_YM3812_ROUTE, 1.00, BURN_SND_ROUTE_BOTH); - MSM5205Init(0, TecmoSynchroniseStream, 400000, TecmoMSM5205Vck, MSM5205_S48_4B, 100, 1); + MSM5205Init(0, TecmoSynchroniseStream, 400000, TecmoMSM5205Vck, MSM5205_S48_4B, 1); + MSM5205SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH); GenericTilesInit(); @@ -928,7 +932,10 @@ static INT32 GeminiInit() BurnTimerAttachZetYM3812(4000000); BurnYM3812SetRoute(BURN_SND_YM3812_ROUTE, 1.00, BURN_SND_ROUTE_BOTH); - if (DrvHasADPCM) MSM5205Init(0, TecmoSynchroniseStream, 400000, TecmoMSM5205Vck, MSM5205_S48_4B, 100, 1); + if (DrvHasADPCM) { + MSM5205Init(0, TecmoSynchroniseStream, 400000, TecmoMSM5205Vck, MSM5205_S48_4B, 1); + MSM5205SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH); + } GenericTilesInit(); diff --git a/src/burn/drv/pre90s/d_tigeroad.cpp b/src/burn/drv/pre90s/d_tigeroad.cpp index d030dcaa4..7a74d821a 100644 --- a/src/burn/drv/pre90s/d_tigeroad.cpp +++ b/src/burn/drv/pre90s/d_tigeroad.cpp @@ -733,7 +733,10 @@ static INT32 DrvInit(INT32 (*pInitCallback)()) BurnYM2203SetAllRoutes(0, 0.25, BURN_SND_ROUTE_BOTH); BurnYM2203SetAllRoutes(1, 0.25, BURN_SND_ROUTE_BOTH); - if (toramich) MSM5205Init(0, DrvMSM5205SynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 100, 1); + if (toramich) { + MSM5205Init(0, DrvMSM5205SynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 1); + MSM5205SetRoute(0, 1.00, BURN_SND_ROUTE_BOTH); + } GenericTilesInit(); diff --git a/src/burn/drv/pre90s/d_toki.cpp b/src/burn/drv/pre90s/d_toki.cpp index 0d0f89dad..64d27d6de 100644 --- a/src/burn/drv/pre90s/d_toki.cpp +++ b/src/burn/drv/pre90s/d_toki.cpp @@ -984,7 +984,8 @@ static INT32 TokibInit() BurnTimerAttachZetYM3812(3579545); BurnYM3812SetRoute(BURN_SND_YM3812_ROUTE, 1.00, BURN_SND_ROUTE_BOTH); - MSM5205Init(0, TokibSynchroniseStream, 384000, toki_adpcm_int, MSM5205_S96_4B, 45, 1); + MSM5205Init(0, TokibSynchroniseStream, 384000, toki_adpcm_int, MSM5205_S96_4B, 1); + MSM5205SetRoute(0, 0.60, BURN_SND_ROUTE_BOTH); GenericTilesInit(); diff --git a/src/burn/drv/pre90s/d_wc90b.cpp b/src/burn/drv/pre90s/d_wc90b.cpp index 970011ce9..9d00de97e 100644 --- a/src/burn/drv/pre90s/d_wc90b.cpp +++ b/src/burn/drv/pre90s/d_wc90b.cpp @@ -649,7 +649,8 @@ static INT32 Wc90b1Init() BurnTimerAttachZet(5000000); BurnYM2203SetAllRoutes(0, 0.20, BURN_SND_ROUTE_BOTH); - MSM5205Init(0, Wc90b1SynchroniseStream, 384000, Wc90b1MSM5205Vck0, MSM5205_S96_4B, 100, 1); + MSM5205Init(0, Wc90b1SynchroniseStream, 384000, Wc90b1MSM5205Vck0, MSM5205_S96_4B, 1); + MSM5205SetRoute(0, 0.30, BURN_SND_ROUTE_BOTH); Wc90b1DoReset(); diff --git a/src/burn/drv/taito/d_ashnojoe.cpp b/src/burn/drv/taito/d_ashnojoe.cpp index db9ba3d79..ec2b0e74f 100644 --- a/src/burn/drv/taito/d_ashnojoe.cpp +++ b/src/burn/drv/taito/d_ashnojoe.cpp @@ -399,7 +399,8 @@ static INT32 DrvInit() ZetSetInHandler(ashnojoe_sound_read_port); ZetMemEnd(); - MSM5205Init(0, DrvSynchroniseStream, 384000, ashnojoe_vclk_cb, MSM5205_S48_4B, 100, 1); + MSM5205Init(0, DrvSynchroniseStream, 384000, ashnojoe_vclk_cb, MSM5205_S48_4B, 1); + MSM5205SetRoute(0, 1.00, BURN_SND_ROUTE_BOTH); BurnYM2203Init(1, 4000000, &DrvIRQHandler, DrvSynchroniseStream, DrvGetTime, 0); BurnYM2203SetPorts(0, NULL, NULL, &DrvYM2203WritePortA, &DrvYM2203WritePortB); diff --git a/src/burn/drv/taito/d_asuka.cpp b/src/burn/drv/taito/d_asuka.cpp index 61dfca91b..f50628d44 100644 --- a/src/burn/drv/taito/d_asuka.cpp +++ b/src/burn/drv/taito/d_asuka.cpp @@ -1324,7 +1324,8 @@ static void AsukaSoundSetup() BurnYM2151SetPortHandler(&DrvSoundBankSwitch); BurnYM2151SetAllRoutes(0.50, BURN_SND_ROUTE_BOTH); - MSM5205Init(0, DrvSynchroniseStream, 384000, AsukaMSM5205Vck, MSM5205_S48_4B, 100, 1); + MSM5205Init(0, DrvSynchroniseStream, 384000, AsukaMSM5205Vck, MSM5205_S48_4B, 1); + MSM5205SetRoute(0, 1.00, BURN_SND_ROUTE_BOTH); TaitoNumYM2151 = 1; TaitoNumMSM5205 = 1; diff --git a/src/burn/drv/taito/d_taitomisc.cpp b/src/burn/drv/taito/d_taitomisc.cpp index cf54a15d1..070467aa5 100644 --- a/src/burn/drv/taito/d_taitomisc.cpp +++ b/src/burn/drv/taito/d_taitomisc.cpp @@ -4153,7 +4153,8 @@ static INT32 DariusInit() BurnYM2203SetRoute(1, BURN_SND_YM2203_AY8910_ROUTE_2, 0.08, BURN_SND_ROUTE_BOTH); BurnYM2203SetRoute(1, BURN_SND_YM2203_AY8910_ROUTE_3, 0.08, BURN_SND_ROUTE_BOTH); - MSM5205Init(0, TaitoSynchroniseStream, 384000, DariusAdpcmInt, MSM5205_S48_4B, 50, 1); + MSM5205Init(0, TaitoSynchroniseStream, 384000, DariusAdpcmInt, MSM5205_S48_4B, 1); + MSM5205SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH); GenericTilesInit(); @@ -4252,8 +4253,10 @@ static INT32 OpwolfInit() BurnYM2151SetRoute(BURN_SND_YM2151_YM2151_ROUTE_1, 0.75, BURN_SND_ROUTE_LEFT); BurnYM2151SetRoute(BURN_SND_YM2151_YM2151_ROUTE_2, 0.75, BURN_SND_ROUTE_RIGHT); - MSM5205Init(0, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck0, MSM5205_S48_4B, 60, 1); - MSM5205Init(1, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck1, MSM5205_S48_4B, 60, 1); + MSM5205Init(0, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck0, MSM5205_S48_4B, 1); + MSM5205Init(1, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck1, MSM5205_S48_4B, 1); + MSM5205SetRoute(0, 0.60, BURN_SND_ROUTE_BOTH); + MSM5205SetRoute(1, 0.60, BURN_SND_ROUTE_BOTH); GenericTilesInit(); @@ -4370,8 +4373,10 @@ static INT32 OpwolfbInit() BurnYM2151SetRoute(BURN_SND_YM2151_YM2151_ROUTE_1, 0.75, BURN_SND_ROUTE_LEFT); BurnYM2151SetRoute(BURN_SND_YM2151_YM2151_ROUTE_2, 0.75, BURN_SND_ROUTE_RIGHT); - MSM5205Init(0, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck0, MSM5205_S48_4B, 60, 1); - MSM5205Init(1, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck1, MSM5205_S48_4B, 60, 1); + MSM5205Init(0, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck0, MSM5205_S48_4B, 1); + MSM5205Init(1, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck1, MSM5205_S48_4B, 1); + MSM5205SetRoute(0, 0.60, BURN_SND_ROUTE_BOTH); + MSM5205SetRoute(1, 0.60, BURN_SND_ROUTE_BOTH); GenericTilesInit(); @@ -4662,7 +4667,8 @@ static INT32 RastanInit() BurnYM2151SetPortHandler(&RastanBankSwitch); BurnYM2151SetAllRoutes(0.50, BURN_SND_ROUTE_BOTH); - MSM5205Init(0, TaitoSynchroniseStream, 384000, RastanMSM5205Vck, MSM5205_S48_4B, 60, 1); + MSM5205Init(0, TaitoSynchroniseStream, 384000, RastanMSM5205Vck, MSM5205_S48_4B, 1); + MSM5205SetRoute(0, 0.60, BURN_SND_ROUTE_BOTH); GenericTilesInit(); @@ -4770,7 +4776,8 @@ static INT32 TopspeedInit() BurnYM2151SetPortHandler(&TopspeedBankSwitch); BurnYM2151SetAllRoutes(0.30, BURN_SND_ROUTE_BOTH); - MSM5205Init(0, TaitoSynchroniseStream, 384000, TopspeedMSM5205Vck, MSM5205_S48_4B, 60, 1); + MSM5205Init(0, TaitoSynchroniseStream, 384000, TopspeedMSM5205Vck, MSM5205_S48_4B, 1); + MSM5205SetRoute(0, 0.60, BURN_SND_ROUTE_BOTH); GenericTilesInit(); diff --git a/src/burn/snd/msm5205.cpp b/src/burn/snd/msm5205.cpp index 92926f9cc..d6fd54abb 100644 --- a/src/burn/snd/msm5205.cpp +++ b/src/burn/snd/msm5205.cpp @@ -15,7 +15,8 @@ struct _MSM5205_state INT32 bitwidth; /* bit width selector -3B/4B */ INT32 signal; /* current ADPCM signal */ INT32 step; /* current ADPCM step */ - INT32 volume; + double volume; + INT32 output_dir; INT32 clock; /* clock rate */ @@ -123,7 +124,7 @@ static void MSM5205StreamUpdate(INT32 chip) { INT32 i = 0; - INT32 volval = ((voice->signal * 16) * voice->volume) / 100; + INT32 volval = (INT32)((voice->signal * 16) * voice->volume); INT16 val = volval; while (len) { @@ -181,38 +182,27 @@ void MSM5205Render(INT32 chip, INT16 *buffer, INT32 len) voice->streampos = 0; - if (voice->bAdd) { - for (INT32 i = 0; i < len; i++) - { - INT32 nSample0 = buffer[0] + source[i]; - INT32 nSample1 = buffer[1] + source[i]; - - if (nSample0 < -32768) { - nSample0 = -32768; - } else { - if (nSample0 > 32767) { - nSample0 = 32767; - } - } - - if (nSample1 < -32768) { - nSample1 = -32768; - } else { - if (nSample1 > 32767) { - nSample1 = 32767; - } - } - - buffer[0] = nSample0; - buffer[1] = nSample1; - buffer += 2; + for (INT32 i = 0; i < len; i++) { + INT32 nLeftSample = 0, nRightSample = 0; + + if ((voice->output_dir & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) { + nLeftSample += source[i]; } - } else { - for (INT32 i = 0; i < len; i++) - { - buffer[0] = buffer[1] = source[i]; - buffer+=2; + if ((voice->output_dir & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) { + nRightSample += source[i]; } + + nLeftSample = BURN_SND_CLIP(nLeftSample); + nRightSample = BURN_SND_CLIP(nRightSample); + + if (voice->bAdd) { + buffer[0] += nLeftSample; + buffer[1] += nRightSample; + } else { + buffer[0] = nLeftSample; + buffer[1] = nRightSample; + } + buffer += 2; } } @@ -239,7 +229,7 @@ void MSM5205Reset() } } -void MSM5205Init(INT32 chip, INT32 (*stream_sync)(INT32), INT32 clock, void (*vclk_callback)(), INT32 select, INT32 volume, INT32 bAdd) +void MSM5205Init(INT32 chip, INT32 (*stream_sync)(INT32), INT32 clock, void (*vclk_callback)(), INT32 select, INT32 bAdd) { DebugSnd_MSM5205Initted = 1; @@ -252,17 +242,30 @@ void MSM5205Init(INT32 chip, INT32 (*stream_sync)(INT32), INT32 clock, void (*vc voice->select = select; voice->clock = clock; voice->bAdd = bAdd; - voice->volume = volume; + voice->volume = 1.00; + voice->output_dir = BURN_SND_ROUTE_BOTH; float FPSRatio = (float)(6000 - nBurnFPS) / 6000; INT32 nSoundLen = nBurnSoundLen + (INT32)((float)nBurnSoundLen * FPSRatio) + 1; - stream[chip] = (INT16*)malloc(nSoundLen * sizeof(INT16)); + stream[chip] = (INT16*)BurnMalloc(nSoundLen * sizeof(INT16)); ComputeTables (chip); nNumChips = chip; } +void MSM5205SetRoute(INT32 chip, double nVolume, INT32 nRouteDir) +{ +#if defined FBA_DEBUG + if (!DebugSnd_MSM5205Initted) bprintf(PRINT_ERROR, _T("MSM5205SetRoute called without init\n")); + if (chip > nNumChips) bprintf(PRINT_ERROR, _T("MSM5205SetRoute called with invalid chip %x\n"), chip); +#endif + + voice = &chips[chip]; + voice->volume = nVolume; + voice->output_dir = nRouteDir; +} + void MSM5205Exit() { #if defined FBA_DEBUG @@ -277,10 +280,7 @@ void MSM5205Exit() memset (voice, 0, sizeof(_MSM5205_state)); - if (stream[chip]) { - free (stream[chip]); - stream[chip] = NULL; - } + BurnFree (stream[chip]); } DebugSnd_MSM5205Initted = 0; @@ -343,17 +343,6 @@ void MSM5205PlaymodeWrite(INT32 chip, INT32 select) MSM5205_playmode(chip,select); } -void MSM5205SetVolume(INT32 chip, INT32 volume) -{ -#if defined FBA_DEBUG - if (!DebugSnd_MSM5205Initted) bprintf(PRINT_ERROR, _T("MSM5205SetVolume called without init\n")); - if (chip > nNumChips) bprintf(PRINT_ERROR, _T("MSM5205SetVolume called with invalid chip %x\n"), chip); -#endif - - voice = &chips[chip]; - voice->volume = volume; -} - void MSM5205Update() { #if defined FBA_DEBUG diff --git a/src/burn/snd/msm5205.h b/src/burn/snd/msm5205.h index 63d02e9c0..06bdc10f3 100644 --- a/src/burn/snd/msm5205.h +++ b/src/burn/snd/msm5205.h @@ -14,9 +14,8 @@ void MSM5205DataWrite(INT32 chip, INT32 data); void MSM5205VCLKWrite(INT32 chip, INT32 reset); void MSM5205PlaymodeWrite(INT32 chip, INT32 select); -void MSM5205SetVolume(INT32 chip, INT32 volume); - -void MSM5205Init(INT32 chip, INT32 (*stream_sync)(INT32), INT32 clock, void (*vclk_callback)(), INT32 select, INT32 volume, INT32 bAdd); +void MSM5205Init(INT32 chip, INT32 (*stream_sync)(INT32), INT32 clock, void (*vclk_callback)(), INT32 select, INT32 bAdd); +void MSM5205SetRoute(INT32 chip, double nVolume, INT32 nRouteDir); void MSM5205Reset(); /*