diff --git a/src/engine/platform/pcspkr.cpp b/src/engine/platform/pcspkr.cpp index 91ddd5f2d..e26ef64f1 100644 --- a/src/engine/platform/pcspkr.cpp +++ b/src/engine/platform/pcspkr.cpp @@ -251,6 +251,9 @@ int DivPlatformPCSpeaker::dispatch(DivCommand c) { chan[c.chan].active=true; chan[c.chan].keyOn=true; chan[c.chan].macroInit(parent->getIns(chan[c.chan].ins,DIV_INS_BEEPER)); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } break; case DIV_CMD_NOTE_OFF: chan[c.chan].active=false; diff --git a/src/engine/platform/pet.cpp b/src/engine/platform/pet.cpp index f2ee6addd..233027e21 100644 --- a/src/engine/platform/pet.cpp +++ b/src/engine/platform/pet.cpp @@ -149,6 +149,9 @@ int DivPlatformPET::dispatch(DivCommand c) { chan.active=true; chan.keyOn=true; chan.macroInit(ins); + if (!parent->song.brokenOutVol && !chan.std.vol.will) { + chan.outVol=chan.vol; + } break; } case DIV_CMD_NOTE_OFF: diff --git a/src/engine/platform/qsound.cpp b/src/engine/platform/qsound.cpp index 8fc294b65..4bd9c3220 100644 --- a/src/engine/platform/qsound.cpp +++ b/src/engine/platform/qsound.cpp @@ -404,6 +404,9 @@ int DivPlatformQSound::dispatch(DivCommand c) { chan[c.chan].active=true; chan[c.chan].keyOn=true; chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } break; } case DIV_CMD_NOTE_OFF: diff --git a/src/engine/platform/rf5c68.cpp b/src/engine/platform/rf5c68.cpp index 830a16859..ae5138c15 100644 --- a/src/engine/platform/rf5c68.cpp +++ b/src/engine/platform/rf5c68.cpp @@ -189,6 +189,9 @@ int DivPlatformRF5C68::dispatch(DivCommand c) { chan[c.chan].active=true; chan[c.chan].keyOn=true; chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } break; } case DIV_CMD_NOTE_OFF: diff --git a/src/engine/platform/saa.cpp b/src/engine/platform/saa.cpp index 31382068c..f6be85090 100644 --- a/src/engine/platform/saa.cpp +++ b/src/engine/platform/saa.cpp @@ -264,6 +264,9 @@ int DivPlatformSAA1099::dispatch(DivCommand c) { chan[c.chan].active=true; chan[c.chan].keyOn=true; chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } if (isMuted[c.chan]) { rWrite(c.chan,0); } else { diff --git a/src/engine/platform/scc.cpp b/src/engine/platform/scc.cpp index 1b9ad17d0..2ab6f1aa4 100644 --- a/src/engine/platform/scc.cpp +++ b/src/engine/platform/scc.cpp @@ -184,6 +184,9 @@ int DivPlatformSCC::dispatch(DivCommand c) { } chan[c.chan].active=true; chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } if (!isMuted[c.chan]) { rWrite(regBase+15,regPool[regBase+15]|(1< @@ -169,6 +170,9 @@ int DivPlatformSegaPCM::dispatch(DivCommand c) { addWrite(0x10086+(c.chan<<3),3); } chan[c.chan].macroInit(NULL); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } break; } chan[c.chan].pcm.pos=0; diff --git a/src/engine/platform/sms.cpp b/src/engine/platform/sms.cpp index 7dd5c65d7..c5cf1091a 100644 --- a/src/engine/platform/sms.cpp +++ b/src/engine/platform/sms.cpp @@ -245,6 +245,9 @@ int DivPlatformSMS::dispatch(DivCommand c) { chan[c.chan].active=true; rWrite(0x90|c.chan<<5|(isMuted[c.chan]?15:(15-(chan[c.chan].vol&15)))); chan[c.chan].macroInit(parent->getIns(chan[c.chan].ins,DIV_INS_STD)); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } break; case DIV_CMD_NOTE_OFF: chan[c.chan].active=false; diff --git a/src/engine/platform/su.cpp b/src/engine/platform/su.cpp index fdcfca3f1..1f85cd335 100644 --- a/src/engine/platform/su.cpp +++ b/src/engine/platform/su.cpp @@ -264,6 +264,9 @@ int DivPlatformSoundUnit::dispatch(DivCommand c) { chan[c.chan].keyOn=true; chWrite(c.chan,0x02,chan[c.chan].vol); chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } chan[c.chan].insChanged=false; break; } diff --git a/src/engine/platform/swan.cpp b/src/engine/platform/swan.cpp index 03c18771a..c941a8fff 100644 --- a/src/engine/platform/swan.cpp +++ b/src/engine/platform/swan.cpp @@ -313,6 +313,9 @@ int DivPlatformSwan::dispatch(DivCommand c) { chan[c.chan].active=true; chan[c.chan].keyOn=true; chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } if (chan[c.chan].wave<0) { chan[c.chan].wave=0; chan[c.chan].ws.changeWave1(chan[c.chan].wave); diff --git a/src/engine/platform/tia.cpp b/src/engine/platform/tia.cpp index e74533d54..7a4407ebd 100644 --- a/src/engine/platform/tia.cpp +++ b/src/engine/platform/tia.cpp @@ -170,6 +170,9 @@ int DivPlatformTIA::dispatch(DivCommand c) { chan[c.chan].keyOn=true; rWrite(0x15+c.chan,chan[c.chan].shape); chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } if (isMuted[c.chan]) { rWrite(0x19+c.chan,0); } else { diff --git a/src/engine/platform/vera.cpp b/src/engine/platform/vera.cpp index 2ad06c6ef..353a9f603 100644 --- a/src/engine/platform/vera.cpp +++ b/src/engine/platform/vera.cpp @@ -283,6 +283,9 @@ int DivPlatformVERA::dispatch(DivCommand c) { } chan[c.chan].active=true; chan[c.chan].macroInit(parent->getIns(chan[c.chan].ins,DIV_INS_VERA)); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } break; case DIV_CMD_NOTE_OFF: chan[c.chan].active=false; diff --git a/src/engine/platform/vrc6.cpp b/src/engine/platform/vrc6.cpp index 37cd726d6..16ba73b0b 100644 --- a/src/engine/platform/vrc6.cpp +++ b/src/engine/platform/vrc6.cpp @@ -264,6 +264,9 @@ int DivPlatformVRC6::dispatch(DivCommand c) { } chan[c.chan].active=true; chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } //chan[c.chan].keyOn=true; chan[c.chan].furnaceDac=true; } else { diff --git a/src/engine/platform/x1_010.cpp b/src/engine/platform/x1_010.cpp index eb5a10692..1cbfd68e7 100644 --- a/src/engine/platform/x1_010.cpp +++ b/src/engine/platform/x1_010.cpp @@ -609,6 +609,9 @@ int DivPlatformX1_010::dispatch(DivCommand c) { chan[c.chan].keyOn=true; chan[c.chan].envChanged=true; chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } if (chan[c.chan].wave<0) { chan[c.chan].wave=0; chan[c.chan].ws.changeWave1(chan[c.chan].wave); diff --git a/src/engine/platform/ymz280b.cpp b/src/engine/platform/ymz280b.cpp index 961ec8b84..1c4997c2e 100644 --- a/src/engine/platform/ymz280b.cpp +++ b/src/engine/platform/ymz280b.cpp @@ -217,6 +217,9 @@ int DivPlatformYMZ280B::dispatch(DivCommand c) { chan[c.chan].active=true; chan[c.chan].keyOn=true; chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } break; } case DIV_CMD_NOTE_OFF: