diff --git a/pcsx2/SPU2/ADSR.cpp b/pcsx2/SPU2/ADSR.cpp
index a49969f578..c1f425c8ed 100644
--- a/pcsx2/SPU2/ADSR.cpp
+++ b/pcsx2/SPU2/ADSR.cpp
@@ -23,129 +23,144 @@ static u32 PsxRates[160];
void InitADSR() // INIT ADSR
{
- for (int i = 0; i < (32 + 128); i++) {
- int shift = (i - 32) >> 2;
- s64 rate = (i & 3) + 4;
- if (shift < 0)
- rate >>= -shift;
- else
- rate <<= shift;
+ for (int i = 0; i < (32 + 128); i++)
+ {
+ int shift = (i - 32) >> 2;
+ s64 rate = (i & 3) + 4;
+ if (shift < 0)
+ rate >>= -shift;
+ else
+ rate <<= shift;
- PsxRates[i] = (int)std::min(rate, (s64)0x3fffffffLL);
- }
+ PsxRates[i] = (int)std::min(rate, (s64)0x3fffffffLL);
+ }
}
bool V_ADSR::Calculate()
{
- pxAssume(Phase != 0);
+ pxAssume(Phase != 0);
- if (Releasing && (Phase < 5))
- Phase = 5;
+ if (Releasing && (Phase < 5))
+ Phase = 5;
- switch (Phase) {
- case 1: // attack
- if (Value == ADSR_MAX_VOL) {
- // Already maxed out. Progress phase and nothing more:
- Phase++;
- break;
- }
+ switch (Phase)
+ {
+ case 1: // attack
+ if (Value == ADSR_MAX_VOL)
+ {
+ // Already maxed out. Progress phase and nothing more:
+ Phase++;
+ break;
+ }
- // Case 1 below is for pseudo exponential below 75%.
- // Pseudo Exp > 75% and Linear are the same.
+ // Case 1 below is for pseudo exponential below 75%.
+ // Pseudo Exp > 75% and Linear are the same.
- if (AttackMode && (Value >= 0x60000000))
- Value += PsxRates[(AttackRate ^ 0x7f) - 0x18 + 32];
- else
- Value += PsxRates[(AttackRate ^ 0x7f) - 0x10 + 32];
+ if (AttackMode && (Value >= 0x60000000))
+ Value += PsxRates[(AttackRate ^ 0x7f) - 0x18 + 32];
+ else
+ Value += PsxRates[(AttackRate ^ 0x7f) - 0x10 + 32];
- if (Value < 0) {
- // We hit the ceiling.
- Phase++;
- Value = ADSR_MAX_VOL;
- }
- break;
+ if (Value < 0)
+ {
+ // We hit the ceiling.
+ Phase++;
+ Value = ADSR_MAX_VOL;
+ }
+ break;
- case 2: // decay
- {
- u32 off = InvExpOffsets[(Value >> 28) & 7];
- Value -= PsxRates[((DecayRate ^ 0x1f) * 4) - 0x18 + off + 32];
+ case 2: // decay
+ {
+ u32 off = InvExpOffsets[(Value >> 28) & 7];
+ Value -= PsxRates[((DecayRate ^ 0x1f) * 4) - 0x18 + off + 32];
- // calculate sustain level as a factor of the ADSR maximum volume.
+ // calculate sustain level as a factor of the ADSR maximum volume.
- s32 suslev = ((0x80000000 / 0x10) * (SustainLevel + 1)) - 1;
+ s32 suslev = ((0x80000000 / 0x10) * (SustainLevel + 1)) - 1;
- if (Value <= suslev) {
- if (Value < 0)
- Value = 0;
- Phase++;
- }
- } break;
+ if (Value <= suslev)
+ {
+ if (Value < 0)
+ Value = 0;
+ Phase++;
+ }
+ }
+ break;
- case 3: // sustain
- {
- // 0x7f disables sustain (infinite sustain)
- if (SustainRate == 0x7f)
- return true;
+ case 3: // sustain
+ {
+ // 0x7f disables sustain (infinite sustain)
+ if (SustainRate == 0x7f)
+ return true;
- if (SustainMode & 2) // decreasing
- {
- if (SustainMode & 4) // exponential
- {
- u32 off = InvExpOffsets[(Value >> 28) & 7];
- Value -= PsxRates[(SustainRate ^ 0x7f) - 0x1b + off + 32];
- } else // linear
- Value -= PsxRates[(SustainRate ^ 0x7f) - 0xf + 32];
+ if (SustainMode & 2) // decreasing
+ {
+ if (SustainMode & 4) // exponential
+ {
+ u32 off = InvExpOffsets[(Value >> 28) & 7];
+ Value -= PsxRates[(SustainRate ^ 0x7f) - 0x1b + off + 32];
+ }
+ else // linear
+ Value -= PsxRates[(SustainRate ^ 0x7f) - 0xf + 32];
- if (Value <= 0) {
- Value = 0;
- Phase++;
- }
- } else { // increasing
- if ((SustainMode & 4) && (Value >= 0x60000000))
- Value += PsxRates[(SustainRate ^ 0x7f) - 0x18 + 32];
- else
- // linear / Pseudo below 75% (they're the same)
- Value += PsxRates[(SustainRate ^ 0x7f) - 0x10 + 32];
+ if (Value <= 0)
+ {
+ Value = 0;
+ Phase++;
+ }
+ }
+ else
+ { // increasing
+ if ((SustainMode & 4) && (Value >= 0x60000000))
+ Value += PsxRates[(SustainRate ^ 0x7f) - 0x18 + 32];
+ else
+ // linear / Pseudo below 75% (they're the same)
+ Value += PsxRates[(SustainRate ^ 0x7f) - 0x10 + 32];
- if (Value < 0) {
- Value = ADSR_MAX_VOL;
- Phase++;
- }
- }
- } break;
+ if (Value < 0)
+ {
+ Value = ADSR_MAX_VOL;
+ Phase++;
+ }
+ }
+ }
+ break;
- case 4: // sustain end
- Value = (SustainMode & 2) ? 0 : ADSR_MAX_VOL;
- if (Value == 0)
- Phase = 6;
- break;
+ case 4: // sustain end
+ Value = (SustainMode & 2) ? 0 : ADSR_MAX_VOL;
+ if (Value == 0)
+ Phase = 6;
+ break;
- case 5: // release
- if (ReleaseMode) // exponential
- {
- u32 off = InvExpOffsets[(Value >> 28) & 7];
- Value -= PsxRates[((ReleaseRate ^ 0x1f) * 4) - 0x18 + off + 32];
- } else { // linear
- //Value-=PsxRates[((ReleaseRate^0x1f)*4)-0xc+32];
- if (ReleaseRate != 0x1f)
- Value -= (1 << (0x1f - ReleaseRate));
- }
+ case 5: // release
+ if (ReleaseMode) // exponential
+ {
+ u32 off = InvExpOffsets[(Value >> 28) & 7];
+ Value -= PsxRates[((ReleaseRate ^ 0x1f) * 4) - 0x18 + off + 32];
+ }
+ else
+ { // linear
+ //Value-=PsxRates[((ReleaseRate^0x1f)*4)-0xc+32];
+ if (ReleaseRate != 0x1f)
+ Value -= (1 << (0x1f - ReleaseRate));
+ }
- if (Value <= 0) {
- Value = 0;
- Phase++;
- }
- break;
+ if (Value <= 0)
+ {
+ Value = 0;
+ Phase++;
+ }
+ break;
- case 6: // release end
- Value = 0;
- break;
+ case 6: // release end
+ Value = 0;
+ break;
- jNO_DEFAULT
- }
+ jNO_DEFAULT
+ }
- // returns true if the voice is active, or false if it's stopping.
- return Phase != 6;
+ // returns true if the voice is active, or false if it's stopping.
+ return Phase != 6;
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -159,47 +174,53 @@ bool V_ADSR::Calculate()
void V_VolumeSlide::Update()
{
- if (!(Mode & VOLFLAG_SLIDE_ENABLE))
- return;
+ if (!(Mode & VOLFLAG_SLIDE_ENABLE))
+ return;
- // Volume slides use the same basic logic as ADSR, but simplified (single-stage
- // instead of multi-stage)
+ // Volume slides use the same basic logic as ADSR, but simplified (single-stage
+ // instead of multi-stage)
- if (Increment == 0x7f)
- return;
+ if (Increment == 0x7f)
+ return;
- s32 value = abs(Value);
+ s32 value = abs(Value);
- if (Mode & VOLFLAG_DECREMENT) {
- // Decrement
+ if (Mode & VOLFLAG_DECREMENT)
+ {
+ // Decrement
- if (Mode & VOLFLAG_EXPONENTIAL) {
- u32 off = InvExpOffsets[(value >> 28) & 7];
- value -= PsxRates[(Increment ^ 0x7f) - 0x1b + off + 32];
- } else
- value -= PsxRates[(Increment ^ 0x7f) - 0xf + 32];
+ if (Mode & VOLFLAG_EXPONENTIAL)
+ {
+ u32 off = InvExpOffsets[(value >> 28) & 7];
+ value -= PsxRates[(Increment ^ 0x7f) - 0x1b + off + 32];
+ }
+ else
+ value -= PsxRates[(Increment ^ 0x7f) - 0xf + 32];
- if (value < 0) {
- value = 0;
- Mode = 0; // disable slide
- }
- } else {
- // Increment
- // Pseudo-exponential increments, as done by the SPU2 (really!)
- // Above 75% slides slow, below 75% slides fast. It's exponential, pseudo'ly speaking.
+ if (value < 0)
+ {
+ value = 0;
+ Mode = 0; // disable slide
+ }
+ }
+ else
+ {
+ // Increment
+ // Pseudo-exponential increments, as done by the SPU2 (really!)
+ // Above 75% slides slow, below 75% slides fast. It's exponential, pseudo'ly speaking.
- if ((Mode & VOLFLAG_EXPONENTIAL) && (value >= 0x60000000))
- value += PsxRates[(Increment ^ 0x7f) - 0x18 + 32];
- else
- // linear / Pseudo below 75% (they're the same)
- value += PsxRates[(Increment ^ 0x7f) - 0x10 + 32];
+ if ((Mode & VOLFLAG_EXPONENTIAL) && (value >= 0x60000000))
+ value += PsxRates[(Increment ^ 0x7f) - 0x18 + 32];
+ else
+ // linear / Pseudo below 75% (they're the same)
+ value += PsxRates[(Increment ^ 0x7f) - 0x10 + 32];
- if (value < 0) // wrapped around the "top"?
- {
- value = 0x7fffffff;
- Mode = 0; // disable slide
- }
- }
+ if (value < 0) // wrapped around the "top"?
+ {
+ value = 0x7fffffff;
+ Mode = 0; // disable slide
+ }
+ }
- Value = (Value < 0) ? -value : value;
+ Value = (Value < 0) ? -value : value;
}
diff --git a/pcsx2/SPU2/Config.h b/pcsx2/SPU2/Config.h
index 4d71ba15d7..f19cee2739 100644
--- a/pcsx2/SPU2/Config.h
+++ b/pcsx2/SPU2/Config.h
@@ -92,7 +92,7 @@ extern bool dspPluginEnabled;
namespace SoundtouchCfg
{
-extern void ApplySettings(soundtouch::SoundTouch &sndtouch);
+ extern void ApplySettings(soundtouch::SoundTouch& sndtouch);
}
//////
diff --git a/pcsx2/SPU2/Debug.cpp b/pcsx2/SPU2/Debug.cpp
index edb66b40ad..5af217d85b 100644
--- a/pcsx2/SPU2/Debug.cpp
+++ b/pcsx2/SPU2/Debug.cpp
@@ -19,24 +19,24 @@ int crazy_debug = 0;
char s[4096];
-FILE *spu2Log = NULL;
+FILE* spu2Log = NULL;
-void FileLog(const char *fmt, ...)
+void FileLog(const char* fmt, ...)
{
#ifdef SPU2_LOG
- va_list list;
+ va_list list;
- if (!AccessLog())
- return;
- if (!spu2Log)
- return;
+ if (!AccessLog())
+ return;
+ if (!spu2Log)
+ return;
- va_start(list, fmt);
- vsprintf(s, fmt, list);
- va_end(list);
+ va_start(list, fmt);
+ vsprintf(s, fmt, list);
+ va_end(list);
- fputs(s, spu2Log);
- fflush(spu2Log);
+ fputs(s, spu2Log);
+ fflush(spu2Log);
#if 0
if(crazy_debug)
@@ -52,205 +52,215 @@ void FileLog(const char *fmt, ...)
// while ConLog doesn't print anything if messages to console are disabled at the GUI,
// it's still better to outright not call it on tight loop scenarios, by testing MsgToConsole() (which is inline and very quick).
// Else, there's some (small) overhead in calling and returning from ConLog.
-void ConLog(const char *fmt, ...)
+void ConLog(const char* fmt, ...)
{
- if (!MsgToConsole())
- return;
+ if (!MsgToConsole())
+ return;
- va_list list;
- va_start(list, fmt);
- vsprintf(s, fmt, list);
- va_end(list);
+ va_list list;
+ va_start(list, fmt);
+ vsprintf(s, fmt, list);
+ va_end(list);
- fputs(s, stderr);
- fflush(stderr);
+ fputs(s, stderr);
+ fflush(stderr);
- if (spu2Log) {
- fputs(s, spu2Log);
- fflush(spu2Log);
- }
+ if (spu2Log)
+ {
+ fputs(s, spu2Log);
+ fflush(spu2Log);
+ }
}
-void V_VolumeSlide::DebugDump(FILE *dump, const char *title, const char *nameLR)
+void V_VolumeSlide::DebugDump(FILE* dump, const char* title, const char* nameLR)
{
- fprintf(dump, "%s Volume for %s Channel:\t%x\n"
- " - Value: %x\n"
- " - Mode: %x\n"
- " - Increment: %x\n",
- title, nameLR, Reg_VOL, Value, Mode, Increment);
+ fprintf(dump, "%s Volume for %s Channel:\t%x\n"
+ " - Value: %x\n"
+ " - Mode: %x\n"
+ " - Increment: %x\n",
+ title, nameLR, Reg_VOL, Value, Mode, Increment);
}
-void V_VolumeSlideLR::DebugDump(FILE *dump, const char *title)
+void V_VolumeSlideLR::DebugDump(FILE* dump, const char* title)
{
- Left.DebugDump(dump, title, "Left");
- Right.DebugDump(dump, title, "Right");
+ Left.DebugDump(dump, title, "Left");
+ Right.DebugDump(dump, title, "Right");
}
-void V_VolumeLR::DebugDump(FILE *dump, const char *title)
+void V_VolumeLR::DebugDump(FILE* dump, const char* title)
{
- fprintf(dump, "Volume for %s (%s Channel):\t%x\n", title, "Left", Left);
- fprintf(dump, "Volume for %s (%s Channel):\t%x\n", title, "Right", Right);
+ fprintf(dump, "Volume for %s (%s Channel):\t%x\n", title, "Left", Left);
+ fprintf(dump, "Volume for %s (%s Channel):\t%x\n", title, "Right", Right);
}
void DoFullDump()
{
#ifdef _MSC_VER
#ifdef SPU2_LOG
- FILE *dump;
- u8 c = 0, v = 0;
+ FILE* dump;
+ u8 c = 0, v = 0;
- if (MemDump()) {
- dump = fopen(wxString(MemDumpFileName).ToUTF8(), "wb");
- if (dump) {
- fwrite(_spu2mem, 0x200000, 1, dump);
- fclose(dump);
- }
- }
- if (RegDump()) {
- dump = fopen(wxString(RegDumpFileName).ToUTF8(), "wb");
- if (dump) {
- fwrite(spu2regs, 0x2000, 1, dump);
- fclose(dump);
- }
- }
+ if (MemDump())
+ {
+ dump = fopen(wxString(MemDumpFileName).ToUTF8(), "wb");
+ if (dump)
+ {
+ fwrite(_spu2mem, 0x200000, 1, dump);
+ fclose(dump);
+ }
+ }
+ if (RegDump())
+ {
+ dump = fopen(wxString(RegDumpFileName).ToUTF8(), "wb");
+ if (dump)
+ {
+ fwrite(spu2regs, 0x2000, 1, dump);
+ fclose(dump);
+ }
+ }
- if (!CoresDump())
- return;
- dump = fopen(wxString(CoresDumpFileName).ToUTF8(), "wt");
- if (dump) {
- for (c = 0; c < 2; c++) {
- fprintf(dump, "#### CORE %d DUMP.\n", c);
+ if (!CoresDump())
+ return;
+ dump = fopen(wxString(CoresDumpFileName).ToUTF8(), "wt");
+ if (dump)
+ {
+ for (c = 0; c < 2; c++)
+ {
+ fprintf(dump, "#### CORE %d DUMP.\n", c);
- Cores[c].MasterVol.DebugDump(dump, "Master");
+ Cores[c].MasterVol.DebugDump(dump, "Master");
- Cores[c].ExtVol.DebugDump(dump, "External Data Input");
- Cores[c].InpVol.DebugDump(dump, "Voice Data Input [dry]");
- Cores[c].FxVol.DebugDump(dump, "Effects/Reverb [wet]");
+ Cores[c].ExtVol.DebugDump(dump, "External Data Input");
+ Cores[c].InpVol.DebugDump(dump, "Voice Data Input [dry]");
+ Cores[c].FxVol.DebugDump(dump, "Effects/Reverb [wet]");
- fprintf(dump, "Interrupt Address: %x\n", Cores[c].IRQA);
- fprintf(dump, "DMA Transfer Start Address: %x\n", Cores[c].TSA);
- fprintf(dump, "External Input to Direct Output (Left): %s\n", Cores[c].DryGate.ExtL ? "Yes" : "No");
- fprintf(dump, "External Input to Direct Output (Right): %s\n", Cores[c].DryGate.ExtR ? "Yes" : "No");
- fprintf(dump, "External Input to Effects (Left): %s\n", Cores[c].WetGate.ExtL ? "Yes" : "No");
- fprintf(dump, "External Input to Effects (Right): %s\n", Cores[c].WetGate.ExtR ? "Yes" : "No");
- fprintf(dump, "Sound Data Input to Direct Output (Left): %s\n", Cores[c].DryGate.SndL ? "Yes" : "No");
- fprintf(dump, "Sound Data Input to Direct Output (Right): %s\n", Cores[c].DryGate.SndR ? "Yes" : "No");
- fprintf(dump, "Sound Data Input to Effects (Left): %s\n", Cores[c].WetGate.SndL ? "Yes" : "No");
- fprintf(dump, "Sound Data Input to Effects (Right): %s\n", Cores[c].WetGate.SndR ? "Yes" : "No");
- fprintf(dump, "Voice Data Input to Direct Output (Left): %s\n", Cores[c].DryGate.InpL ? "Yes" : "No");
- fprintf(dump, "Voice Data Input to Direct Output (Right): %s\n", Cores[c].DryGate.InpR ? "Yes" : "No");
- fprintf(dump, "Voice Data Input to Effects (Left): %s\n", Cores[c].WetGate.InpL ? "Yes" : "No");
- fprintf(dump, "Voice Data Input to Effects (Right): %s\n", Cores[c].WetGate.InpR ? "Yes" : "No");
- fprintf(dump, "IRQ Enabled: %s\n", Cores[c].IRQEnable ? "Yes" : "No");
- fprintf(dump, "Effects Enabled: %s\n", Cores[c].FxEnable ? "Yes" : "No");
- fprintf(dump, "Mute Enabled: %s\n", Cores[c].Mute ? "Yes" : "No");
- fprintf(dump, "Noise Clock: %d\n", Cores[c].NoiseClk);
- fprintf(dump, "DMA Bits: %d\n", Cores[c].DMABits);
- fprintf(dump, "Effects Start: %x\n", Cores[c].EffectsStartA);
- fprintf(dump, "Effects End: %x\n", Cores[c].EffectsEndA);
- fprintf(dump, "Registers:\n");
- fprintf(dump, " - PMON: %x\n", Cores[c].Regs.PMON);
- fprintf(dump, " - NON: %x\n", Cores[c].Regs.NON);
- fprintf(dump, " - VMIXL: %x\n", Cores[c].Regs.VMIXL);
- fprintf(dump, " - VMIXR: %x\n", Cores[c].Regs.VMIXR);
- fprintf(dump, " - VMIXEL: %x\n", Cores[c].Regs.VMIXEL);
- fprintf(dump, " - VMIXER: %x\n", Cores[c].Regs.VMIXER);
- fprintf(dump, " - MMIX: %x\n", Cores[c].Regs.VMIXEL);
- fprintf(dump, " - ENDX: %x\n", Cores[c].Regs.VMIXER);
- fprintf(dump, " - STATX: %x\n", Cores[c].Regs.VMIXEL);
- fprintf(dump, " - ATTR: %x\n", Cores[c].Regs.VMIXER);
- for (v = 0; v < 24; v++) {
- fprintf(dump, "Voice %d:\n", v);
- Cores[c].Voices[v].Volume.DebugDump(dump, "");
+ fprintf(dump, "Interrupt Address: %x\n", Cores[c].IRQA);
+ fprintf(dump, "DMA Transfer Start Address: %x\n", Cores[c].TSA);
+ fprintf(dump, "External Input to Direct Output (Left): %s\n", Cores[c].DryGate.ExtL ? "Yes" : "No");
+ fprintf(dump, "External Input to Direct Output (Right): %s\n", Cores[c].DryGate.ExtR ? "Yes" : "No");
+ fprintf(dump, "External Input to Effects (Left): %s\n", Cores[c].WetGate.ExtL ? "Yes" : "No");
+ fprintf(dump, "External Input to Effects (Right): %s\n", Cores[c].WetGate.ExtR ? "Yes" : "No");
+ fprintf(dump, "Sound Data Input to Direct Output (Left): %s\n", Cores[c].DryGate.SndL ? "Yes" : "No");
+ fprintf(dump, "Sound Data Input to Direct Output (Right): %s\n", Cores[c].DryGate.SndR ? "Yes" : "No");
+ fprintf(dump, "Sound Data Input to Effects (Left): %s\n", Cores[c].WetGate.SndL ? "Yes" : "No");
+ fprintf(dump, "Sound Data Input to Effects (Right): %s\n", Cores[c].WetGate.SndR ? "Yes" : "No");
+ fprintf(dump, "Voice Data Input to Direct Output (Left): %s\n", Cores[c].DryGate.InpL ? "Yes" : "No");
+ fprintf(dump, "Voice Data Input to Direct Output (Right): %s\n", Cores[c].DryGate.InpR ? "Yes" : "No");
+ fprintf(dump, "Voice Data Input to Effects (Left): %s\n", Cores[c].WetGate.InpL ? "Yes" : "No");
+ fprintf(dump, "Voice Data Input to Effects (Right): %s\n", Cores[c].WetGate.InpR ? "Yes" : "No");
+ fprintf(dump, "IRQ Enabled: %s\n", Cores[c].IRQEnable ? "Yes" : "No");
+ fprintf(dump, "Effects Enabled: %s\n", Cores[c].FxEnable ? "Yes" : "No");
+ fprintf(dump, "Mute Enabled: %s\n", Cores[c].Mute ? "Yes" : "No");
+ fprintf(dump, "Noise Clock: %d\n", Cores[c].NoiseClk);
+ fprintf(dump, "DMA Bits: %d\n", Cores[c].DMABits);
+ fprintf(dump, "Effects Start: %x\n", Cores[c].EffectsStartA);
+ fprintf(dump, "Effects End: %x\n", Cores[c].EffectsEndA);
+ fprintf(dump, "Registers:\n");
+ fprintf(dump, " - PMON: %x\n", Cores[c].Regs.PMON);
+ fprintf(dump, " - NON: %x\n", Cores[c].Regs.NON);
+ fprintf(dump, " - VMIXL: %x\n", Cores[c].Regs.VMIXL);
+ fprintf(dump, " - VMIXR: %x\n", Cores[c].Regs.VMIXR);
+ fprintf(dump, " - VMIXEL: %x\n", Cores[c].Regs.VMIXEL);
+ fprintf(dump, " - VMIXER: %x\n", Cores[c].Regs.VMIXER);
+ fprintf(dump, " - MMIX: %x\n", Cores[c].Regs.VMIXEL);
+ fprintf(dump, " - ENDX: %x\n", Cores[c].Regs.VMIXER);
+ fprintf(dump, " - STATX: %x\n", Cores[c].Regs.VMIXEL);
+ fprintf(dump, " - ATTR: %x\n", Cores[c].Regs.VMIXER);
+ for (v = 0; v < 24; v++)
+ {
+ fprintf(dump, "Voice %d:\n", v);
+ Cores[c].Voices[v].Volume.DebugDump(dump, "");
- fprintf(dump, " - ADSR Envelope: %x & %x\n"
- " - Ar: %x\n"
- " - Am: %x\n"
- " - Dr: %x\n"
- " - Sl: %x\n"
- " - Sr: %x\n"
- " - Sm: %x\n"
- " - Rr: %x\n"
- " - Rm: %x\n"
- " - Phase: %x\n"
- " - Value: %x\n",
- Cores[c].Voices[v].ADSR.regADSR1,
- Cores[c].Voices[v].ADSR.regADSR2,
- Cores[c].Voices[v].ADSR.AttackRate,
- Cores[c].Voices[v].ADSR.AttackMode,
- Cores[c].Voices[v].ADSR.DecayRate,
- Cores[c].Voices[v].ADSR.SustainLevel,
- Cores[c].Voices[v].ADSR.SustainRate,
- Cores[c].Voices[v].ADSR.SustainMode,
- Cores[c].Voices[v].ADSR.ReleaseRate,
- Cores[c].Voices[v].ADSR.ReleaseMode,
- Cores[c].Voices[v].ADSR.Phase,
- Cores[c].Voices[v].ADSR.Value);
+ fprintf(dump, " - ADSR Envelope: %x & %x\n"
+ " - Ar: %x\n"
+ " - Am: %x\n"
+ " - Dr: %x\n"
+ " - Sl: %x\n"
+ " - Sr: %x\n"
+ " - Sm: %x\n"
+ " - Rr: %x\n"
+ " - Rm: %x\n"
+ " - Phase: %x\n"
+ " - Value: %x\n",
+ Cores[c].Voices[v].ADSR.regADSR1,
+ Cores[c].Voices[v].ADSR.regADSR2,
+ Cores[c].Voices[v].ADSR.AttackRate,
+ Cores[c].Voices[v].ADSR.AttackMode,
+ Cores[c].Voices[v].ADSR.DecayRate,
+ Cores[c].Voices[v].ADSR.SustainLevel,
+ Cores[c].Voices[v].ADSR.SustainRate,
+ Cores[c].Voices[v].ADSR.SustainMode,
+ Cores[c].Voices[v].ADSR.ReleaseRate,
+ Cores[c].Voices[v].ADSR.ReleaseMode,
+ Cores[c].Voices[v].ADSR.Phase,
+ Cores[c].Voices[v].ADSR.Value);
- fprintf(dump, " - Pitch: %x\n", Cores[c].Voices[v].Pitch);
- fprintf(dump, " - Modulated: %s\n", Cores[c].Voices[v].Modulated ? "Yes" : "No");
- fprintf(dump, " - Source: %s\n", Cores[c].Voices[v].Noise ? "Noise" : "Wave");
- fprintf(dump, " - Direct Output for Left Channel: %s\n", Cores[c].VoiceGates[v].DryL ? "Yes" : "No");
- fprintf(dump, " - Direct Output for Right Channel: %s\n", Cores[c].VoiceGates[v].DryR ? "Yes" : "No");
- fprintf(dump, " - Effects Output for Left Channel: %s\n", Cores[c].VoiceGates[v].WetL ? "Yes" : "No");
- fprintf(dump, " - Effects Output for Right Channel: %s\n", Cores[c].VoiceGates[v].WetR ? "Yes" : "No");
- fprintf(dump, " - Loop Start Address: %x\n", Cores[c].Voices[v].LoopStartA);
- fprintf(dump, " - Sound Start Address: %x\n", Cores[c].Voices[v].StartA);
- fprintf(dump, " - Next Data Address: %x\n", Cores[c].Voices[v].NextA);
- fprintf(dump, " - Play Start Cycle: %d\n", Cores[c].Voices[v].PlayCycle);
- fprintf(dump, " - Play Status: %s\n", (Cores[c].Voices[v].ADSR.Phase > 0) ? "Playing" : "Not Playing");
- fprintf(dump, " - Block Sample: %d\n", Cores[c].Voices[v].SCurrent);
- }
- fprintf(dump, "#### END OF DUMP.\n\n");
- }
- fclose(dump);
- }
+ fprintf(dump, " - Pitch: %x\n", Cores[c].Voices[v].Pitch);
+ fprintf(dump, " - Modulated: %s\n", Cores[c].Voices[v].Modulated ? "Yes" : "No");
+ fprintf(dump, " - Source: %s\n", Cores[c].Voices[v].Noise ? "Noise" : "Wave");
+ fprintf(dump, " - Direct Output for Left Channel: %s\n", Cores[c].VoiceGates[v].DryL ? "Yes" : "No");
+ fprintf(dump, " - Direct Output for Right Channel: %s\n", Cores[c].VoiceGates[v].DryR ? "Yes" : "No");
+ fprintf(dump, " - Effects Output for Left Channel: %s\n", Cores[c].VoiceGates[v].WetL ? "Yes" : "No");
+ fprintf(dump, " - Effects Output for Right Channel: %s\n", Cores[c].VoiceGates[v].WetR ? "Yes" : "No");
+ fprintf(dump, " - Loop Start Address: %x\n", Cores[c].Voices[v].LoopStartA);
+ fprintf(dump, " - Sound Start Address: %x\n", Cores[c].Voices[v].StartA);
+ fprintf(dump, " - Next Data Address: %x\n", Cores[c].Voices[v].NextA);
+ fprintf(dump, " - Play Start Cycle: %d\n", Cores[c].Voices[v].PlayCycle);
+ fprintf(dump, " - Play Status: %s\n", (Cores[c].Voices[v].ADSR.Phase > 0) ? "Playing" : "Not Playing");
+ fprintf(dump, " - Block Sample: %d\n", Cores[c].Voices[v].SCurrent);
+ }
+ fprintf(dump, "#### END OF DUMP.\n\n");
+ }
+ fclose(dump);
+ }
- dump = fopen("logs/effects.txt", "wt");
- if (dump) {
- for (c = 0; c < 2; c++) {
- fprintf(dump, "#### CORE %d EFFECTS PROCESSOR DUMP.\n", c);
+ dump = fopen("logs/effects.txt", "wt");
+ if (dump)
+ {
+ for (c = 0; c < 2; c++)
+ {
+ fprintf(dump, "#### CORE %d EFFECTS PROCESSOR DUMP.\n", c);
- fprintf(dump, " - IN_COEF_L: %x\n", Cores[c].Revb.IN_COEF_R);
- fprintf(dump, " - IN_COEF_R: %x\n", Cores[c].Revb.IN_COEF_L);
+ fprintf(dump, " - IN_COEF_L: %x\n", Cores[c].Revb.IN_COEF_R);
+ fprintf(dump, " - IN_COEF_R: %x\n", Cores[c].Revb.IN_COEF_L);
- fprintf(dump, " - APF1_VOL: %x\n", Cores[c].Revb.APF1_VOL);
- fprintf(dump, " - APF2_VOL: %x\n", Cores[c].Revb.APF2_VOL);
- fprintf(dump, " - APF1_SIZE: %x\n", Cores[c].Revb.APF1_SIZE);
- fprintf(dump, " - APF2_SIZE: %x\n", Cores[c].Revb.APF2_SIZE);
+ fprintf(dump, " - APF1_VOL: %x\n", Cores[c].Revb.APF1_VOL);
+ fprintf(dump, " - APF2_VOL: %x\n", Cores[c].Revb.APF2_VOL);
+ fprintf(dump, " - APF1_SIZE: %x\n", Cores[c].Revb.APF1_SIZE);
+ fprintf(dump, " - APF2_SIZE: %x\n", Cores[c].Revb.APF2_SIZE);
- fprintf(dump, " - IIR_VOL: %x\n", Cores[c].Revb.IIR_VOL);
- fprintf(dump, " - WALL_VOL: %x\n", Cores[c].Revb.WALL_VOL);
- fprintf(dump, " - SAME_L_SRC: %x\n", Cores[c].Revb.SAME_L_SRC);
- fprintf(dump, " - SAME_R_SRC: %x\n", Cores[c].Revb.SAME_R_SRC);
- fprintf(dump, " - DIFF_L_SRC: %x\n", Cores[c].Revb.DIFF_L_SRC);
- fprintf(dump, " - DIFF_R_SRC: %x\n", Cores[c].Revb.DIFF_R_SRC);
- fprintf(dump, " - SAME_L_DST: %x\n", Cores[c].Revb.SAME_L_DST);
- fprintf(dump, " - SAME_R_DST: %x\n", Cores[c].Revb.SAME_R_DST);
- fprintf(dump, " - DIFF_L_DST: %x\n", Cores[c].Revb.DIFF_L_DST);
- fprintf(dump, " - DIFF_R_DST: %x\n", Cores[c].Revb.DIFF_R_DST);
+ fprintf(dump, " - IIR_VOL: %x\n", Cores[c].Revb.IIR_VOL);
+ fprintf(dump, " - WALL_VOL: %x\n", Cores[c].Revb.WALL_VOL);
+ fprintf(dump, " - SAME_L_SRC: %x\n", Cores[c].Revb.SAME_L_SRC);
+ fprintf(dump, " - SAME_R_SRC: %x\n", Cores[c].Revb.SAME_R_SRC);
+ fprintf(dump, " - DIFF_L_SRC: %x\n", Cores[c].Revb.DIFF_L_SRC);
+ fprintf(dump, " - DIFF_R_SRC: %x\n", Cores[c].Revb.DIFF_R_SRC);
+ fprintf(dump, " - SAME_L_DST: %x\n", Cores[c].Revb.SAME_L_DST);
+ fprintf(dump, " - SAME_R_DST: %x\n", Cores[c].Revb.SAME_R_DST);
+ fprintf(dump, " - DIFF_L_DST: %x\n", Cores[c].Revb.DIFF_L_DST);
+ fprintf(dump, " - DIFF_R_DST: %x\n", Cores[c].Revb.DIFF_R_DST);
- fprintf(dump, " - COMB1_VOL: %x\n", Cores[c].Revb.COMB1_VOL);
- fprintf(dump, " - COMB2_VOL: %x\n", Cores[c].Revb.COMB2_VOL);
- fprintf(dump, " - COMB3_VOL: %x\n", Cores[c].Revb.COMB3_VOL);
- fprintf(dump, " - COMB4_VOL: %x\n", Cores[c].Revb.COMB4_VOL);
- fprintf(dump, " - COMB1_L_SRC: %x\n", Cores[c].Revb.COMB1_L_SRC);
- fprintf(dump, " - COMB1_R_SRC: %x\n", Cores[c].Revb.COMB1_R_SRC);
- fprintf(dump, " - COMB2_L_SRC: %x\n", Cores[c].Revb.COMB2_L_SRC);
- fprintf(dump, " - COMB2_R_SRC: %x\n", Cores[c].Revb.COMB2_R_SRC);
- fprintf(dump, " - COMB3_L_SRC: %x\n", Cores[c].Revb.COMB3_L_SRC);
- fprintf(dump, " - COMB3_R_SRC: %x\n", Cores[c].Revb.COMB3_R_SRC);
- fprintf(dump, " - COMB4_L_SRC: %x\n", Cores[c].Revb.COMB4_L_SRC);
- fprintf(dump, " - COMB4_R_SRC: %x\n", Cores[c].Revb.COMB4_R_SRC);
+ fprintf(dump, " - COMB1_VOL: %x\n", Cores[c].Revb.COMB1_VOL);
+ fprintf(dump, " - COMB2_VOL: %x\n", Cores[c].Revb.COMB2_VOL);
+ fprintf(dump, " - COMB3_VOL: %x\n", Cores[c].Revb.COMB3_VOL);
+ fprintf(dump, " - COMB4_VOL: %x\n", Cores[c].Revb.COMB4_VOL);
+ fprintf(dump, " - COMB1_L_SRC: %x\n", Cores[c].Revb.COMB1_L_SRC);
+ fprintf(dump, " - COMB1_R_SRC: %x\n", Cores[c].Revb.COMB1_R_SRC);
+ fprintf(dump, " - COMB2_L_SRC: %x\n", Cores[c].Revb.COMB2_L_SRC);
+ fprintf(dump, " - COMB2_R_SRC: %x\n", Cores[c].Revb.COMB2_R_SRC);
+ fprintf(dump, " - COMB3_L_SRC: %x\n", Cores[c].Revb.COMB3_L_SRC);
+ fprintf(dump, " - COMB3_R_SRC: %x\n", Cores[c].Revb.COMB3_R_SRC);
+ fprintf(dump, " - COMB4_L_SRC: %x\n", Cores[c].Revb.COMB4_L_SRC);
+ fprintf(dump, " - COMB4_R_SRC: %x\n", Cores[c].Revb.COMB4_R_SRC);
- fprintf(dump, " - APF1_L_DST: %x\n", Cores[c].Revb.APF1_L_DST);
- fprintf(dump, " - APF1_R_DST: %x\n", Cores[c].Revb.APF1_R_DST);
- fprintf(dump, " - APF2_L_DST: %x\n", Cores[c].Revb.APF2_L_DST);
- fprintf(dump, " - APF2_R_DST: %x\n", Cores[c].Revb.APF2_R_DST);
- fprintf(dump, "#### END OF DUMP.\n\n");
- }
- fclose(dump);
- }
+ fprintf(dump, " - APF1_L_DST: %x\n", Cores[c].Revb.APF1_L_DST);
+ fprintf(dump, " - APF1_R_DST: %x\n", Cores[c].Revb.APF1_R_DST);
+ fprintf(dump, " - APF2_L_DST: %x\n", Cores[c].Revb.APF2_L_DST);
+ fprintf(dump, " - APF2_R_DST: %x\n", Cores[c].Revb.APF2_R_DST);
+ fprintf(dump, "#### END OF DUMP.\n\n");
+ }
+ fclose(dump);
+ }
#endif
#endif
}
diff --git a/pcsx2/SPU2/Debug.h b/pcsx2/SPU2/Debug.h
index a974b3505c..c718b7429b 100644
--- a/pcsx2/SPU2/Debug.h
+++ b/pcsx2/SPU2/Debug.h
@@ -16,53 +16,54 @@
#ifndef DEBUG_H_INCLUDED
#define DEBUG_H_INCLUDED
-extern FILE *spu2Log;
+extern FILE* spu2Log;
-extern void FileLog(const char *fmt, ...);
-extern void ConLog(const char *fmt, ...);
+extern void FileLog(const char* fmt, ...);
+extern void ConLog(const char* fmt, ...);
extern void DoFullDump();
-extern FILE *OpenBinaryLog(const wxString &logfile);
-extern FILE *OpenLog(const wxString &logfile);
-extern FILE *OpenDump(const wxString &logfile);
+extern FILE* OpenBinaryLog(const wxString& logfile);
+extern FILE* OpenLog(const wxString& logfile);
+extern FILE* OpenDump(const wxString& logfile);
namespace WaveDump
{
-enum CoreSourceType {
- // Core's input stream, usually pulled from ADMA streams.
- CoreSrc_Input = 0,
+ enum CoreSourceType
+ {
+ // Core's input stream, usually pulled from ADMA streams.
+ CoreSrc_Input = 0,
- // Output of the actual 24 input voices which have dry output enabled.
- CoreSrc_DryVoiceMix,
+ // Output of the actual 24 input voices which have dry output enabled.
+ CoreSrc_DryVoiceMix,
- // Output of the actual 24 input voices that have wet output enabled.
- CoreSrc_WetVoiceMix,
+ // Output of the actual 24 input voices that have wet output enabled.
+ CoreSrc_WetVoiceMix,
- // Wet mix including inputs and externals, prior to the application of reverb.
- CoreSrc_PreReverb,
+ // Wet mix including inputs and externals, prior to the application of reverb.
+ CoreSrc_PreReverb,
- // Wet mix after reverb has turned it into a pile of garbly gook.
- CoreSrc_PostReverb,
+ // Wet mix after reverb has turned it into a pile of garbly gook.
+ CoreSrc_PostReverb,
- // Final output of the core. For core 0, it's the feed into Core1.
- // For Core1, it's the feed into SndOut.
- CoreSrc_External,
+ // Final output of the core. For core 0, it's the feed into Core1.
+ // For Core1, it's the feed into SndOut.
+ CoreSrc_External,
- CoreSrc_Count
-};
+ CoreSrc_Count
+ };
-extern void Open();
-extern void Close();
-extern void WriteCore(uint coreidx, CoreSourceType src, s16 left, s16 right);
-extern void WriteCore(uint coreidx, CoreSourceType src, const StereoOut16 &sample);
-}
+ extern void Open();
+ extern void Close();
+ extern void WriteCore(uint coreidx, CoreSourceType src, s16 left, s16 right);
+ extern void WriteCore(uint coreidx, CoreSourceType src, const StereoOut16& sample);
+} // namespace WaveDump
-using WaveDump::CoreSrc_Input;
using WaveDump::CoreSrc_DryVoiceMix;
-using WaveDump::CoreSrc_WetVoiceMix;
-using WaveDump::CoreSrc_PreReverb;
-using WaveDump::CoreSrc_PostReverb;
using WaveDump::CoreSrc_External;
+using WaveDump::CoreSrc_Input;
+using WaveDump::CoreSrc_PostReverb;
+using WaveDump::CoreSrc_PreReverb;
+using WaveDump::CoreSrc_WetVoiceMix;
#endif // DEBUG_H_INCLUDED //
diff --git a/pcsx2/SPU2/Dma.cpp b/pcsx2/SPU2/Dma.cpp
index a170715e28..4e8345dc55 100644
--- a/pcsx2/SPU2/Dma.cpp
+++ b/pcsx2/SPU2/Dma.cpp
@@ -20,153 +20,165 @@
extern u8 callirq;
-static FILE *DMA4LogFile = NULL;
-static FILE *DMA7LogFile = NULL;
-static FILE *ADMA4LogFile = NULL;
-static FILE *ADMA7LogFile = NULL;
-static FILE *ADMAOutLogFile = NULL;
+static FILE* DMA4LogFile = NULL;
+static FILE* DMA7LogFile = NULL;
+static FILE* ADMA4LogFile = NULL;
+static FILE* ADMA7LogFile = NULL;
+static FILE* ADMAOutLogFile = NULL;
-static FILE *REGWRTLogFile[2] = {0, 0};
+static FILE* REGWRTLogFile[2] = {0, 0};
void DMALogOpen()
{
- if (!DMALog())
- return;
- DMA4LogFile = OpenBinaryLog(DMA4LogFileName);
- DMA7LogFile = OpenBinaryLog(DMA7LogFileName);
- ADMA4LogFile = OpenBinaryLog(L"adma4.raw");
- ADMA7LogFile = OpenBinaryLog(L"adma7.raw");
- ADMAOutLogFile = OpenBinaryLog(L"admaOut.raw");
+ if (!DMALog())
+ return;
+ DMA4LogFile = OpenBinaryLog(DMA4LogFileName);
+ DMA7LogFile = OpenBinaryLog(DMA7LogFileName);
+ ADMA4LogFile = OpenBinaryLog(L"adma4.raw");
+ ADMA7LogFile = OpenBinaryLog(L"adma7.raw");
+ ADMAOutLogFile = OpenBinaryLog(L"admaOut.raw");
}
-void DMA4LogWrite(void *lpData, u32 ulSize)
+void DMA4LogWrite(void* lpData, u32 ulSize)
{
- if (!DMALog())
- return;
- if (!DMA4LogFile)
- return;
- fwrite(lpData, ulSize, 1, DMA4LogFile);
+ if (!DMALog())
+ return;
+ if (!DMA4LogFile)
+ return;
+ fwrite(lpData, ulSize, 1, DMA4LogFile);
}
-void DMA7LogWrite(void *lpData, u32 ulSize)
+void DMA7LogWrite(void* lpData, u32 ulSize)
{
- if (!DMALog())
- return;
- if (!DMA7LogFile)
- return;
- fwrite(lpData, ulSize, 1, DMA7LogFile);
+ if (!DMALog())
+ return;
+ if (!DMA7LogFile)
+ return;
+ fwrite(lpData, ulSize, 1, DMA7LogFile);
}
-void ADMAOutLogWrite(void *lpData, u32 ulSize)
+void ADMAOutLogWrite(void* lpData, u32 ulSize)
{
- if (!DMALog())
- return;
- if (!ADMAOutLogFile)
- return;
- fwrite(lpData, ulSize, 1, ADMAOutLogFile);
+ if (!DMALog())
+ return;
+ if (!ADMAOutLogFile)
+ return;
+ fwrite(lpData, ulSize, 1, ADMAOutLogFile);
}
void RegWriteLog(u32 core, u16 value)
{
- if (!DMALog())
- return;
- if (!REGWRTLogFile[core])
- return;
- fwrite(&value, 2, 1, REGWRTLogFile[core]);
+ if (!DMALog())
+ return;
+ if (!REGWRTLogFile[core])
+ return;
+ fwrite(&value, 2, 1, REGWRTLogFile[core]);
}
void DMALogClose()
{
- safe_fclose(DMA4LogFile);
- safe_fclose(DMA7LogFile);
- safe_fclose(REGWRTLogFile[0]);
- safe_fclose(REGWRTLogFile[1]);
- safe_fclose(ADMA4LogFile);
- safe_fclose(ADMA7LogFile);
- safe_fclose(ADMAOutLogFile);
+ safe_fclose(DMA4LogFile);
+ safe_fclose(DMA7LogFile);
+ safe_fclose(REGWRTLogFile[0]);
+ safe_fclose(REGWRTLogFile[1]);
+ safe_fclose(ADMA4LogFile);
+ safe_fclose(ADMA7LogFile);
+ safe_fclose(ADMAOutLogFile);
}
-void V_Core::LogAutoDMA(FILE *fp)
+void V_Core::LogAutoDMA(FILE* fp)
{
- if (!DMALog() || !fp || !DMAPtr)
- return;
- fwrite(DMAPtr + InputDataProgress, 0x400, 1, fp);
+ if (!DMALog() || !fp || !DMAPtr)
+ return;
+ fwrite(DMAPtr + InputDataProgress, 0x400, 1, fp);
}
void V_Core::AutoDMAReadBuffer(int mode) //mode: 0= split stereo; 1 = do not split stereo
{
- int spos = ((InputPosRead + 0xff) & 0x100); //starting position of the free buffer
+ int spos = ((InputPosRead + 0xff) & 0x100); //starting position of the free buffer
- LogAutoDMA(Index ? ADMA7LogFile : ADMA4LogFile);
+ LogAutoDMA(Index ? ADMA7LogFile : ADMA4LogFile);
- // HACKFIX!! DMAPtr can be invalid after a savestate load, so the savestate just forces it
- // to NULL and we ignore it here. (used to work in old VM editions of PCSX2 with fixed
- // addressing, but new PCSX2s have dynamic memory addressing).
+ // HACKFIX!! DMAPtr can be invalid after a savestate load, so the savestate just forces it
+ // to NULL and we ignore it here. (used to work in old VM editions of PCSX2 with fixed
+ // addressing, but new PCSX2s have dynamic memory addressing).
- if (mode) {
- if (DMAPtr != NULL)
- //memcpy((ADMATempBuffer+(spos<<1)),DMAPtr+InputDataProgress,0x400);
- memcpy(GetMemPtr(0x2000 + (Index << 10) + spos), DMAPtr + InputDataProgress, 0x400);
- MADR += 0x400;
- InputDataLeft -= 0x200;
- InputDataProgress += 0x200;
- } else {
- if (DMAPtr != NULL)
- //memcpy((ADMATempBuffer+spos),DMAPtr+InputDataProgress,0x200);
- memcpy(GetMemPtr(0x2000 + (Index << 10) + spos), DMAPtr + InputDataProgress, 0x200);
- MADR += 0x200;
- InputDataLeft -= 0x100;
- InputDataProgress += 0x100;
+ if (mode)
+ {
+ if (DMAPtr != NULL)
+ //memcpy((ADMATempBuffer+(spos<<1)),DMAPtr+InputDataProgress,0x400);
+ memcpy(GetMemPtr(0x2000 + (Index << 10) + spos), DMAPtr + InputDataProgress, 0x400);
+ MADR += 0x400;
+ InputDataLeft -= 0x200;
+ InputDataProgress += 0x200;
+ }
+ else
+ {
+ if (DMAPtr != NULL)
+ //memcpy((ADMATempBuffer+spos),DMAPtr+InputDataProgress,0x200);
+ memcpy(GetMemPtr(0x2000 + (Index << 10) + spos), DMAPtr + InputDataProgress, 0x200);
+ MADR += 0x200;
+ InputDataLeft -= 0x100;
+ InputDataProgress += 0x100;
- if (DMAPtr != NULL)
- //memcpy((ADMATempBuffer+spos+0x200),DMAPtr+InputDataProgress,0x200);
- memcpy(GetMemPtr(0x2200 + (Index << 10) + spos), DMAPtr + InputDataProgress, 0x200);
- MADR += 0x200;
- InputDataLeft -= 0x100;
- InputDataProgress += 0x100;
- }
-// See ReadInput at mixer.cpp for explanation on the commented out lines
-//
+ if (DMAPtr != NULL)
+ //memcpy((ADMATempBuffer+spos+0x200),DMAPtr+InputDataProgress,0x200);
+ memcpy(GetMemPtr(0x2200 + (Index << 10) + spos), DMAPtr + InputDataProgress, 0x200);
+ MADR += 0x200;
+ InputDataLeft -= 0x100;
+ InputDataProgress += 0x100;
+ }
+ // See ReadInput at mixer.cpp for explanation on the commented out lines
+ //
}
-void V_Core::StartADMAWrite(u16 *pMem, u32 sz)
+void V_Core::StartADMAWrite(u16* pMem, u32 sz)
{
- int size = (sz) & (~511);
+ int size = (sz) & (~511);
- if (MsgAutoDMA())
- ConLog("* SPU2-X: DMA%c AutoDMA Transfer of %d bytes to %x (%02x %x %04x).\n",
- GetDmaIndexChar(), size << 1, TSA, DMABits, AutoDMACtrl, (~Regs.ATTR) & 0x7fff);
+ if (MsgAutoDMA())
+ ConLog("* SPU2-X: DMA%c AutoDMA Transfer of %d bytes to %x (%02x %x %04x).\n",
+ GetDmaIndexChar(), size << 1, TSA, DMABits, AutoDMACtrl, (~Regs.ATTR) & 0x7fff);
- InputDataProgress = 0;
- if ((AutoDMACtrl & (Index + 1)) == 0) {
- TSA = 0x2000 + (Index << 10);
- DMAICounter = size;
- } else if (size >= 512) {
- InputDataLeft = size;
- if (AdmaInProgress == 0) {
+ InputDataProgress = 0;
+ if ((AutoDMACtrl & (Index + 1)) == 0)
+ {
+ TSA = 0x2000 + (Index << 10);
+ DMAICounter = size;
+ }
+ else if (size >= 512)
+ {
+ InputDataLeft = size;
+ if (AdmaInProgress == 0)
+ {
#ifdef PCM24_S1_INTERLEAVE
- if ((Index == 1) && ((PlayMode & 8) == 8)) {
- AutoDMAReadBuffer(Index, 1);
- } else {
- AutoDMAReadBuffer(Index, 0);
- }
+ if ((Index == 1) && ((PlayMode & 8) == 8))
+ {
+ AutoDMAReadBuffer(Index, 1);
+ }
+ else
+ {
+ AutoDMAReadBuffer(Index, 0);
+ }
#else
- if (((PlayMode & 4) == 4) && (Index == 0))
- Cores[0].InputPosRead = 0;
+ if (((PlayMode & 4) == 4) && (Index == 0))
+ Cores[0].InputPosRead = 0;
- AutoDMAReadBuffer(0);
+ AutoDMAReadBuffer(0);
#endif
- // Klonoa 2
- if (size == 512)
- DMAICounter = size;
- }
+ // Klonoa 2
+ if (size == 512)
+ DMAICounter = size;
+ }
- AdmaInProgress = 1;
- } else {
- InputDataLeft = 0;
- DMAICounter = 1;
- }
- TADR = MADR + (size << 1);
+ AdmaInProgress = 1;
+ }
+ else
+ {
+ InputDataLeft = 0;
+ DMAICounter = 1;
+ }
+ TADR = MADR + (size << 1);
}
// HACKFIX: The BIOS breaks if we check the IRQA for both cores when issuing DMA writes. The
@@ -186,228 +198,255 @@ void V_Core::StartADMAWrite(u16 *pMem, u32 sz)
// Update: This hack is no longer needed when we don't do a core reset. Guess the null pc was in spu2 memory?
#define NO_BIOS_HACKFIX 1 // set to 1 to disable the hackfix
-void V_Core::PlainDMAWrite(u16 *pMem, u32 size)
+void V_Core::PlainDMAWrite(u16* pMem, u32 size)
{
- // Perform an alignment check.
- // Not really important. Everything should work regardless,
- // but it could be indicative of an emulation foopah elsewhere.
+ // Perform an alignment check.
+ // Not really important. Everything should work regardless,
+ // but it could be indicative of an emulation foopah elsewhere.
- if (MsgToConsole()) {
- // Don't need this anymore. Target may still be good to know though.
- /*if((uptr)pMem & 15)
+ if (MsgToConsole())
+ {
+ // Don't need this anymore. Target may still be good to know though.
+ /*if((uptr)pMem & 15)
{
ConLog("* SPU2 DMA Write > Misaligned source. Core: %d IOP: %p TSA: 0x%x Size: 0x%x\n", Index, (void*)pMem, TSA, size);
}*/
- if (TSA & 7) {
- ConLog("* SPU2 DMA Write > Misaligned target. Core: %d IOP: %p TSA: 0x%x Size: 0x%x\n", Index, (void *)pMem, TSA, size);
- }
- }
+ if (TSA & 7)
+ {
+ ConLog("* SPU2 DMA Write > Misaligned target. Core: %d IOP: %p TSA: 0x%x Size: 0x%x\n", Index, (void*)pMem, TSA, size);
+ }
+ }
- if (Index == 0)
- DMA4LogWrite(pMem, size << 1);
- else
- DMA7LogWrite(pMem, size << 1);
+ if (Index == 0)
+ DMA4LogWrite(pMem, size << 1);
+ else
+ DMA7LogWrite(pMem, size << 1);
- TSA &= 0xfffff;
+ TSA &= 0xfffff;
- u32 buff1end = TSA + size;
- u32 buff2end = 0;
- if (buff1end > 0x100000) {
- buff2end = buff1end - 0x100000;
- buff1end = 0x100000;
- }
+ u32 buff1end = TSA + size;
+ u32 buff2end = 0;
+ if (buff1end > 0x100000)
+ {
+ buff2end = buff1end - 0x100000;
+ buff1end = 0x100000;
+ }
- const int cacheIdxStart = TSA / pcm_WordsPerBlock;
- const int cacheIdxEnd = (buff1end + pcm_WordsPerBlock - 1) / pcm_WordsPerBlock;
- PcmCacheEntry *cacheLine = &pcm_cache_data[cacheIdxStart];
- PcmCacheEntry &cacheEnd = pcm_cache_data[cacheIdxEnd];
+ const int cacheIdxStart = TSA / pcm_WordsPerBlock;
+ const int cacheIdxEnd = (buff1end + pcm_WordsPerBlock - 1) / pcm_WordsPerBlock;
+ PcmCacheEntry* cacheLine = &pcm_cache_data[cacheIdxStart];
+ PcmCacheEntry& cacheEnd = pcm_cache_data[cacheIdxEnd];
- do {
- cacheLine->Validated = false;
- cacheLine++;
- } while (cacheLine != &cacheEnd);
+ do
+ {
+ cacheLine->Validated = false;
+ cacheLine++;
+ } while (cacheLine != &cacheEnd);
- //ConLog( "* SPU2-X: Cache Clear Range! TSA=0x%x, TDA=0x%x (low8=0x%x, high8=0x%x, len=0x%x)\n",
- // TSA, buff1end, flagTSA, flagTDA, clearLen );
+ //ConLog( "* SPU2-X: Cache Clear Range! TSA=0x%x, TDA=0x%x (low8=0x%x, high8=0x%x, len=0x%x)\n",
+ // TSA, buff1end, flagTSA, flagTDA, clearLen );
- // First Branch needs cleared:
- // It starts at TSA and goes to buff1end.
+ // First Branch needs cleared:
+ // It starts at TSA and goes to buff1end.
- const u32 buff1size = (buff1end - TSA);
- memcpy(GetMemPtr(TSA), pMem, buff1size * 2);
+ const u32 buff1size = (buff1end - TSA);
+ memcpy(GetMemPtr(TSA), pMem, buff1size * 2);
- u32 TDA;
+ u32 TDA;
- if (buff2end > 0) {
- // second branch needs copied:
- // It starts at the beginning of memory and moves forward to buff2end
+ if (buff2end > 0)
+ {
+ // second branch needs copied:
+ // It starts at the beginning of memory and moves forward to buff2end
- // endpoint cache should be irrelevant, since it's almost certainly dynamic
- // memory below 0x2800 (registers and such)
- //const u32 endpt2 = (buff2end + roundUp) / indexer_scalar;
- //memset( pcm_cache_flags, 0, endpt2 );
+ // endpoint cache should be irrelevant, since it's almost certainly dynamic
+ // memory below 0x2800 (registers and such)
+ //const u32 endpt2 = (buff2end + roundUp) / indexer_scalar;
+ //memset( pcm_cache_flags, 0, endpt2 );
- // Emulation Grayarea: Should addresses wrap around to zero, or wrap around to
- // 0x2800? Hard to know for sure (almost no games depend on this)
+ // Emulation Grayarea: Should addresses wrap around to zero, or wrap around to
+ // 0x2800? Hard to know for sure (almost no games depend on this)
- memcpy(GetMemPtr(0), &pMem[buff1size], buff2end * 2);
- TDA = (buff2end + 1) & 0xfffff;
+ memcpy(GetMemPtr(0), &pMem[buff1size], buff2end * 2);
+ TDA = (buff2end + 1) & 0xfffff;
-// Flag interrupt? If IRQA occurs between start and dest, flag it.
-// Important: Test both core IRQ settings for either DMA!
-// Note: Because this buffer wraps, we use || instead of &&
+ // Flag interrupt? If IRQA occurs between start and dest, flag it.
+ // Important: Test both core IRQ settings for either DMA!
+ // Note: Because this buffer wraps, we use || instead of &&
#if NO_BIOS_HACKFIX
- for (int i = 0; i < 2; i++) {
- // Start is exclusive and end is inclusive... maybe? The end is documented to be inclusive,
- // which suggests that memory access doesn't trigger interrupts, incrementing registers does
- // (which would mean that if TSA=IRQA an interrupt doesn't fire... I guess?)
- // Chaos Legion uses interrupt addresses set to the beginning of the two buffers in a double
- // buffer scheme and sets LSA of one of the voices to the start of the opposite buffer.
- // However it transfers to the same address right after setting IRQA, which by our previous
- // understanding would trigger the interrupt early causing it to switch buffers again immediately
- // and an interrupt never fires again, leaving the voices looping the same samples forever.
-
- if (Cores[i].IRQEnable && (Cores[i].IRQA > TSA || Cores[i].IRQA <= TDA)) {
- //ConLog("DMAwrite Core %d: IRQ Called (IRQ passed). IRQA = %x Cycles = %d\n", i, Cores[i].IRQA, Cycles );
- SetIrqCall(i);
- }
- }
-#else
- if ((IRQEnable && (IRQA > TSA || IRQA <= TDA))
+ for (int i = 0; i < 2; i++)
{
- SetIrqCall(Index);
+ // Start is exclusive and end is inclusive... maybe? The end is documented to be inclusive,
+ // which suggests that memory access doesn't trigger interrupts, incrementing registers does
+ // (which would mean that if TSA=IRQA an interrupt doesn't fire... I guess?)
+ // Chaos Legion uses interrupt addresses set to the beginning of the two buffers in a double
+ // buffer scheme and sets LSA of one of the voices to the start of the opposite buffer.
+ // However it transfers to the same address right after setting IRQA, which by our previous
+ // understanding would trigger the interrupt early causing it to switch buffers again immediately
+ // and an interrupt never fires again, leaving the voices looping the same samples forever.
+
+ if (Cores[i].IRQEnable && (Cores[i].IRQA > TSA || Cores[i].IRQA <= TDA))
+ {
+ //ConLog("DMAwrite Core %d: IRQ Called (IRQ passed). IRQA = %x Cycles = %d\n", i, Cores[i].IRQA, Cycles );
+ SetIrqCall(i);
+ }
+ }
+#else
+ if ((IRQEnable && (IRQA > TSA || IRQA <= TDA))
+ {
+ SetIrqCall(Index);
}
#endif
- } else {
- // Buffer doesn't wrap/overflow!
- // Just set the TDA and check for an IRQ...
+ }
+ else
+ {
+ // Buffer doesn't wrap/overflow!
+ // Just set the TDA and check for an IRQ...
- TDA = (buff1end + 1) & 0xfffff;
+ TDA = (buff1end + 1) & 0xfffff;
-// Flag interrupt? If IRQA occurs between start and dest, flag it.
-// Important: Test both core IRQ settings for either DMA!
+ // Flag interrupt? If IRQA occurs between start and dest, flag it.
+ // Important: Test both core IRQ settings for either DMA!
#if NO_BIOS_HACKFIX
- for (int i = 0; i < 2; i++) {
- if (Cores[i].IRQEnable && (Cores[i].IRQA > TSA && Cores[i].IRQA <= TDA)) {
- //ConLog("DMAwrite Core %d: IRQ Called (IRQ passed). IRQA = %x Cycles = %d\n", i, Cores[i].IRQA, Cycles );
- SetIrqCall(i);
- }
- }
+ for (int i = 0; i < 2; i++)
+ {
+ if (Cores[i].IRQEnable && (Cores[i].IRQA > TSA && Cores[i].IRQA <= TDA))
+ {
+ //ConLog("DMAwrite Core %d: IRQ Called (IRQ passed). IRQA = %x Cycles = %d\n", i, Cores[i].IRQA, Cycles );
+ SetIrqCall(i);
+ }
+ }
#else
- if (IRQEnable && (IRQA > TSA) && (IRQA <= TDA)) {
- SetIrqCall(Index);
- }
+ if (IRQEnable && (IRQA > TSA) && (IRQA <= TDA))
+ {
+ SetIrqCall(Index);
+ }
#endif
- }
+ }
- TSA = TDA;
- DMAICounter = size;
- TADR = MADR + (size << 1);
+ TSA = TDA;
+ DMAICounter = size;
+ TADR = MADR + (size << 1);
}
-void V_Core::DoDMAread(u16 *pMem, u32 size)
+void V_Core::DoDMAread(u16* pMem, u32 size)
{
- TSA &= 0xfffff;
+ TSA &= 0xfffff;
- u32 buff1end = TSA + size;
- u32 buff2end = 0;
- if (buff1end > 0x100000) {
- buff2end = buff1end - 0x100000;
- buff1end = 0x100000;
- }
+ u32 buff1end = TSA + size;
+ u32 buff2end = 0;
+ if (buff1end > 0x100000)
+ {
+ buff2end = buff1end - 0x100000;
+ buff1end = 0x100000;
+ }
- const u32 buff1size = (buff1end - TSA);
- memcpy(pMem, GetMemPtr(TSA), buff1size * 2);
+ const u32 buff1size = (buff1end - TSA);
+ memcpy(pMem, GetMemPtr(TSA), buff1size * 2);
- // Note on TSA's position after our copy finishes:
- // IRQA should be measured by the end of the writepos+0x20. But the TDA
- // should be written back at the precise endpoint of the xfer.
+ // Note on TSA's position after our copy finishes:
+ // IRQA should be measured by the end of the writepos+0x20. But the TDA
+ // should be written back at the precise endpoint of the xfer.
- u32 TDA;
+ u32 TDA;
- if (buff2end > 0) {
- // second branch needs cleared:
- // It starts at the beginning of memory and moves forward to buff2end
+ if (buff2end > 0)
+ {
+ // second branch needs cleared:
+ // It starts at the beginning of memory and moves forward to buff2end
- memcpy(&pMem[buff1size], GetMemPtr(0), buff2end * 2);
+ memcpy(&pMem[buff1size], GetMemPtr(0), buff2end * 2);
- TDA = (buff2end + 0x20) & 0xfffff;
+ TDA = (buff2end + 0x20) & 0xfffff;
- // Flag interrupt? If IRQA occurs between start and dest, flag it.
- // Important: Test both core IRQ settings for either DMA!
- // Note: Because this buffer wraps, we use || instead of &&
+ // Flag interrupt? If IRQA occurs between start and dest, flag it.
+ // Important: Test both core IRQ settings for either DMA!
+ // Note: Because this buffer wraps, we use || instead of &&
- for (int i = 0; i < 2; i++) {
- if (Cores[i].IRQEnable && (Cores[i].IRQA > TSA || Cores[i].IRQA <= TDA)) {
- SetIrqCall(i);
- }
- }
- } else {
- // Buffer doesn't wrap/overflow!
- // Just set the TDA and check for an IRQ...
+ for (int i = 0; i < 2; i++)
+ {
+ if (Cores[i].IRQEnable && (Cores[i].IRQA > TSA || Cores[i].IRQA <= TDA))
+ {
+ SetIrqCall(i);
+ }
+ }
+ }
+ else
+ {
+ // Buffer doesn't wrap/overflow!
+ // Just set the TDA and check for an IRQ...
- TDA = (buff1end + 0x20) & 0xfffff;
+ TDA = (buff1end + 0x20) & 0xfffff;
- // Flag interrupt? If IRQA occurs between start and dest, flag it.
- // Important: Test both core IRQ settings for either DMA!
+ // Flag interrupt? If IRQA occurs between start and dest, flag it.
+ // Important: Test both core IRQ settings for either DMA!
- for (int i = 0; i < 2; i++) {
- if (Cores[i].IRQEnable && (Cores[i].IRQA > TSA && Cores[i].IRQA <= TDA)) {
- SetIrqCall(i);
- }
- }
- }
+ for (int i = 0; i < 2; i++)
+ {
+ if (Cores[i].IRQEnable && (Cores[i].IRQA > TSA && Cores[i].IRQA <= TDA))
+ {
+ SetIrqCall(i);
+ }
+ }
+ }
- TSA = TDA;
+ TSA = TDA;
- DMAICounter = size;
- Regs.STATX &= ~0x80;
- //Regs.ATTR |= 0x30;
- TADR = MADR + (size << 1);
+ DMAICounter = size;
+ Regs.STATX &= ~0x80;
+ //Regs.ATTR |= 0x30;
+ TADR = MADR + (size << 1);
}
-void V_Core::DoDMAwrite(u16 *pMem, u32 size)
+void V_Core::DoDMAwrite(u16* pMem, u32 size)
{
- DMAPtr = pMem;
+ DMAPtr = pMem;
- if (size < 2) {
- Regs.STATX &= ~0x80;
- //Regs.ATTR |= 0x30;
- DMAICounter = 1;
+ if (size < 2)
+ {
+ Regs.STATX &= ~0x80;
+ //Regs.ATTR |= 0x30;
+ DMAICounter = 1;
- return;
- }
+ return;
+ }
- if (IsDevBuild) {
- DebugCores[Index].lastsize = size;
- DebugCores[Index].dmaFlag = 2;
- }
+ if (IsDevBuild)
+ {
+ DebugCores[Index].lastsize = size;
+ DebugCores[Index].dmaFlag = 2;
+ }
- if (MsgToConsole()) {
- if (TSA > 0xfffff) {
- ConLog("* SPU2-X: Transfer Start Address out of bounds. TSA is %x\n", TSA);
- }
- }
+ if (MsgToConsole())
+ {
+ if (TSA > 0xfffff)
+ {
+ ConLog("* SPU2-X: Transfer Start Address out of bounds. TSA is %x\n", TSA);
+ }
+ }
- TSA &= 0xfffff;
+ TSA &= 0xfffff;
- bool adma_enable = ((AutoDMACtrl & (Index + 1)) == (Index + 1));
+ bool adma_enable = ((AutoDMACtrl & (Index + 1)) == (Index + 1));
- if (adma_enable) {
- TSA &= 0x1fff;
- StartADMAWrite(pMem, size);
- } else {
- if (MsgDMA())
- ConLog("* SPU2-X: DMA%c Transfer of %d bytes to %x (%02x %x %04x). IRQE = %d IRQA = %x \n",
- GetDmaIndexChar(), size << 1, TSA, DMABits, AutoDMACtrl, (~Regs.ATTR) & 0x7fff,
- Cores[0].IRQEnable, Cores[0].IRQA);
+ if (adma_enable)
+ {
+ TSA &= 0x1fff;
+ StartADMAWrite(pMem, size);
+ }
+ else
+ {
+ if (MsgDMA())
+ ConLog("* SPU2-X: DMA%c Transfer of %d bytes to %x (%02x %x %04x). IRQE = %d IRQA = %x \n",
+ GetDmaIndexChar(), size << 1, TSA, DMABits, AutoDMACtrl, (~Regs.ATTR) & 0x7fff,
+ Cores[0].IRQEnable, Cores[0].IRQA);
- PlainDMAWrite(pMem, size);
- }
- Regs.STATX &= ~0x80;
-//Regs.ATTR |= 0x30;
+ PlainDMAWrite(pMem, size);
+ }
+ Regs.STATX &= ~0x80;
+ //Regs.ATTR |= 0x30;
}
diff --git a/pcsx2/SPU2/Dma.h b/pcsx2/SPU2/Dma.h
index d0ccd3e461..4d8a831597 100644
--- a/pcsx2/SPU2/Dma.h
+++ b/pcsx2/SPU2/Dma.h
@@ -16,6 +16,6 @@
#pragma once
extern void DMALogOpen();
-extern void DMA4LogWrite(void *lpData, u32 ulSize);
-extern void DMA7LogWrite(void *lpData, u32 ulSize);
+extern void DMA4LogWrite(void* lpData, u32 ulSize);
+extern void DMA7LogWrite(void* lpData, u32 ulSize);
extern void DMALogClose();
diff --git a/pcsx2/SPU2/DplIIdecoder.cpp b/pcsx2/SPU2/DplIIdecoder.cpp
index 000051001c..28430d9df2 100644
--- a/pcsx2/SPU2/DplIIdecoder.cpp
+++ b/pcsx2/SPU2/DplIIdecoder.cpp
@@ -57,114 +57,114 @@ const float AddCLR = 0.20f * Scale; // Stereo expansion
extern void ResetDplIIDecoder()
{
- Gfl = 0;
- Gfr = 0;
- LMax = 0;
- RMax = 0;
- AccL = 0;
- AccR = 0;
+ Gfl = 0;
+ Gfr = 0;
+ LMax = 0;
+ RMax = 0;
+ AccL = 0;
+ AccR = 0;
}
-void ProcessDplIISample32(const StereoOut32 &src, Stereo51Out32DplII *s)
+void ProcessDplIISample32(const StereoOut32& src, Stereo51Out32DplII* s)
{
- float IL = src.Left / (float)(1 << (SndOutVolumeShift + 16));
- float IR = src.Right / (float)(1 << (SndOutVolumeShift + 16));
+ float IL = src.Left / (float)(1 << (SndOutVolumeShift + 16));
+ float IR = src.Right / (float)(1 << (SndOutVolumeShift + 16));
- // Calculate center channel and LFE
- float C = (IL + IR) * 0.5f;
- float SUB = C; // no need to lowpass, the speaker amplifier should take care of it
+ // Calculate center channel and LFE
+ float C = (IL + IR) * 0.5f;
+ float SUB = C; // no need to lowpass, the speaker amplifier should take care of it
- float L = IL - C; // Effective L/R data
- float R = IR - C;
+ float L = IL - C; // Effective L/R data
+ float R = IR - C;
- // Peak L/R
- float PL = std::abs(L);
- float PR = std::abs(R);
+ // Peak L/R
+ float PL = std::abs(L);
+ float PR = std::abs(R);
- AccL += (PL - AccL) * 0.1f;
- AccR += (PR - AccR) * 0.1f;
+ AccL += (PL - AccL) * 0.1f;
+ AccR += (PR - AccR) * 0.1f;
- // Calculate power balance
- float Balance = (AccR - AccL); // -1 .. 1
+ // Calculate power balance
+ float Balance = (AccR - AccL); // -1 .. 1
- // If the power levels are different, then the audio is meant for the front speakers
- float Frontness = std::abs(Balance);
- float Rearness = 1 - Frontness; // And the other way around
+ // If the power levels are different, then the audio is meant for the front speakers
+ float Frontness = std::abs(Balance);
+ float Rearness = 1 - Frontness; // And the other way around
- // Equalize the power levels for L/R
- float B = std::min(0.9f, std::max(-0.9f, Balance));
+ // Equalize the power levels for L/R
+ float B = std::min(0.9f, std::max(-0.9f, Balance));
- float VL = L / (1 - B); // if B>0, it means R>L, so increase L, else decrease L
- float VR = R / (1 + B); // vice-versa
+ float VL = L / (1 - B); // if B>0, it means R>L, so increase L, else decrease L
+ float VR = R / (1 + B); // vice-versa
- // 1.73+1.22 = 2.94; 2.94 = 0.34 = 0.9996; Close enough.
- // The range for VL/VR is approximately 0..1,
- // But in the cases where VL/VR are > 0.5, Rearness is 0 so it should never overflow.
- const float RearScale = 0.34f * 2;
+ // 1.73+1.22 = 2.94; 2.94 = 0.34 = 0.9996; Close enough.
+ // The range for VL/VR is approximately 0..1,
+ // But in the cases where VL/VR are > 0.5, Rearness is 0 so it should never overflow.
+ const float RearScale = 0.34f * 2;
- float SL = (VR * 1.73f - VL * 1.22f) * RearScale * Rearness;
- float SR = (VR * 1.22f - VL * 1.73f) * RearScale * Rearness;
- // Possible experiment: Play with stereo expension levels on rear
+ float SL = (VR * 1.73f - VL * 1.22f) * RearScale * Rearness;
+ float SR = (VR * 1.22f - VL * 1.73f) * RearScale * Rearness;
+ // Possible experiment: Play with stereo expension levels on rear
- // Adjust the volume of the front speakers based on what we calculated above
- L *= Frontness;
- R *= Frontness;
+ // Adjust the volume of the front speakers based on what we calculated above
+ L *= Frontness;
+ R *= Frontness;
- s32 CX = (s32)(C * AddCLR);
+ s32 CX = (s32)(C * AddCLR);
- s->Left = (s32)(L * GainL) + CX;
- s->Right = (s32)(R * GainR) + CX;
- s->Center = (s32)(C * GainC);
- s->LFE = (s32)(SUB * GainLFE);
- s->LeftBack = (s32)(SL * GainSL);
- s->RightBack = (s32)(SR * GainSR);
+ s->Left = (s32)(L * GainL) + CX;
+ s->Right = (s32)(R * GainR) + CX;
+ s->Center = (s32)(C * GainC);
+ s->LFE = (s32)(SUB * GainLFE);
+ s->LeftBack = (s32)(SL * GainSL);
+ s->RightBack = (s32)(SR * GainSR);
}
-void ProcessDplIISample16(const StereoOut32 &src, Stereo51Out16DplII *s)
+void ProcessDplIISample16(const StereoOut32& src, Stereo51Out16DplII* s)
{
- Stereo51Out32DplII ss;
- ProcessDplIISample32(src, &ss);
+ Stereo51Out32DplII ss;
+ ProcessDplIISample32(src, &ss);
- s->Left = ss.Left >> 16;
- s->Right = ss.Right >> 16;
- s->Center = ss.Center >> 16;
- s->LFE = ss.LFE >> 16;
- s->LeftBack = ss.LeftBack >> 16;
- s->RightBack = ss.RightBack >> 16;
+ s->Left = ss.Left >> 16;
+ s->Right = ss.Right >> 16;
+ s->Center = ss.Center >> 16;
+ s->LFE = ss.LFE >> 16;
+ s->LeftBack = ss.LeftBack >> 16;
+ s->RightBack = ss.RightBack >> 16;
}
-void ProcessDplSample32(const StereoOut32 &src, Stereo51Out32Dpl *s)
+void ProcessDplSample32(const StereoOut32& src, Stereo51Out32Dpl* s)
{
- float ValL = src.Left / (float)(1 << (SndOutVolumeShift + 16));
- float ValR = src.Right / (float)(1 << (SndOutVolumeShift + 16));
+ float ValL = src.Left / (float)(1 << (SndOutVolumeShift + 16));
+ float ValR = src.Right / (float)(1 << (SndOutVolumeShift + 16));
- float C = (ValL + ValR) * 0.5f; //+15.8
- float S = (ValL - ValR) * 0.5f;
+ float C = (ValL + ValR) * 0.5f; //+15.8
+ float S = (ValL - ValR) * 0.5f;
- float L = ValL - C; //+15.8
- float R = ValR - C;
+ float L = ValL - C; //+15.8
+ float R = ValR - C;
- float SUB = C;
+ float SUB = C;
- s32 CX = (s32)(C * AddCLR); // +15.16
+ s32 CX = (s32)(C * AddCLR); // +15.16
- s->Left = (s32)(L * GainL) + CX; // +15.16 = +31, can grow to +32 if (GainL + AddCLR)>255
- s->Right = (s32)(R * GainR) + CX;
- s->Center = (s32)(C * GainC); // +15.16 = +31
- s->LFE = (s32)(SUB * GainLFE);
- s->LeftBack = (s32)(S * GainSL);
- s->RightBack = (s32)(S * GainSR);
+ s->Left = (s32)(L * GainL) + CX; // +15.16 = +31, can grow to +32 if (GainL + AddCLR)>255
+ s->Right = (s32)(R * GainR) + CX;
+ s->Center = (s32)(C * GainC); // +15.16 = +31
+ s->LFE = (s32)(SUB * GainLFE);
+ s->LeftBack = (s32)(S * GainSL);
+ s->RightBack = (s32)(S * GainSR);
}
-void ProcessDplSample16(const StereoOut32 &src, Stereo51Out16Dpl *s)
+void ProcessDplSample16(const StereoOut32& src, Stereo51Out16Dpl* s)
{
- Stereo51Out32Dpl ss;
- ProcessDplSample32(src, &ss);
+ Stereo51Out32Dpl ss;
+ ProcessDplSample32(src, &ss);
- s->Left = ss.Left >> 16;
- s->Right = ss.Right >> 16;
- s->Center = ss.Center >> 16;
- s->LFE = ss.LFE >> 16;
- s->LeftBack = ss.LeftBack >> 16;
- s->RightBack = ss.RightBack >> 16;
+ s->Left = ss.Left >> 16;
+ s->Right = ss.Right >> 16;
+ s->Center = ss.Center >> 16;
+ s->LFE = ss.LFE >> 16;
+ s->LeftBack = ss.LeftBack >> 16;
+ s->RightBack = ss.RightBack >> 16;
}
diff --git a/pcsx2/SPU2/Global.h b/pcsx2/SPU2/Global.h
index 4d90a11d9a..50c10c7859 100644
--- a/pcsx2/SPU2/Global.h
+++ b/pcsx2/SPU2/Global.h
@@ -13,7 +13,7 @@
* If not, see .
*/
-#pragma once
+#pragma once
#define NOMINMAX
@@ -27,7 +27,7 @@ struct V_Core;
namespace soundtouch
{
-class SoundTouch;
+ class SoundTouch;
}
#include
@@ -44,9 +44,9 @@ class SoundTouch;
namespace VersionInfo
{
-static const u8 Release = 2;
-static const u8 Revision = 0; // increase that with each version
-}
+ static const u8 Release = 2;
+ static const u8 Revision = 0; // increase that with each version
+} // namespace VersionInfo
//////////////////////////////////////////////////////////////////////////
// Override Win32 min/max macros with the STL's type safe and macro
@@ -56,22 +56,22 @@ static const u8 Revision = 0; // increase that with each version
#undef max
template
-static __forceinline void Clampify(T &src, T min, T max)
+static __forceinline void Clampify(T& src, T min, T max)
{
- src = std::min(std::max(src, min), max);
+ src = std::min(std::max(src, min), max);
}
template
static __forceinline T GetClamped(T src, T min, T max)
{
- return std::min(std::max(src, min), max);
+ return std::min(std::max(src, min), max);
}
#ifdef __WXMAC__
#else
-extern void SysMessage(const char *fmt, ...);
+extern void SysMessage(const char* fmt, ...);
#endif
-extern void SysMessage(const wchar_t *fmt, ...);
+extern void SysMessage(const wchar_t* fmt, ...);
//////////////////////////////////////////////////////////////
// Dev / Debug conditionals --
@@ -100,4 +100,3 @@ extern void SysMessage(const wchar_t *fmt, ...);
#include "Config.h"
#include "Debug.h"
#include "SndOut.h"
-
diff --git a/pcsx2/SPU2/Linux/Alsa.cpp b/pcsx2/SPU2/Linux/Alsa.cpp
index 0e900cf8f4..6e08901416 100644
--- a/pcsx2/SPU2/Linux/Alsa.cpp
+++ b/pcsx2/SPU2/Linux/Alsa.cpp
@@ -27,226 +27,241 @@
class AlsaMod : public SndOutModule
{
protected:
- static const int PacketsPerBuffer = 1; // increase this if ALSA can't keep up with 512-sample packets
- static const int MAX_BUFFER_COUNT = 4;
- static const int NumBuffers = 4; // TODO: this should be configurable someday -- lower values reduce latency.
- unsigned int pspeed;
+ static const int PacketsPerBuffer = 1; // increase this if ALSA can't keep up with 512-sample packets
+ static const int MAX_BUFFER_COUNT = 4;
+ static const int NumBuffers = 4; // TODO: this should be configurable someday -- lower values reduce latency.
+ unsigned int pspeed;
- snd_pcm_t *handle;
- snd_pcm_uframes_t buffer_size;
- snd_async_handler_t *pcm_callback;
+ snd_pcm_t* handle;
+ snd_pcm_uframes_t buffer_size;
+ snd_async_handler_t* pcm_callback;
- uint period_time;
- uint buffer_time;
+ uint period_time;
+ uint buffer_time;
protected:
- // Invoked by the static ExternalCallback method below.
- void _InternalCallback()
- {
- snd_pcm_sframes_t avail;
- fprintf(stderr, "* SPU2-X:Iz in your internal callback.\n");
+ // Invoked by the static ExternalCallback method below.
+ void _InternalCallback()
+ {
+ snd_pcm_sframes_t avail;
+ fprintf(stderr, "* SPU2-X:Iz in your internal callback.\n");
- avail = snd_pcm_avail_update(handle);
- while (avail >= (int)period_time) {
- StereoOut16 buff[PacketsPerBuffer * SndOutPacketSize];
- StereoOut16 *p1 = buff;
+ avail = snd_pcm_avail_update(handle);
+ while (avail >= (int)period_time)
+ {
+ StereoOut16 buff[PacketsPerBuffer * SndOutPacketSize];
+ StereoOut16* p1 = buff;
- for (int p = 0; p < PacketsPerBuffer; p++, p1 += SndOutPacketSize)
- SndBuffer::ReadSamples(p1);
+ for (int p = 0; p < PacketsPerBuffer; p++, p1 += SndOutPacketSize)
+ SndBuffer::ReadSamples(p1);
- snd_pcm_writei(handle, buff, period_time);
- avail = snd_pcm_avail_update(handle);
- }
- }
+ snd_pcm_writei(handle, buff, period_time);
+ avail = snd_pcm_avail_update(handle);
+ }
+ }
- // Preps and invokes the _InternalCallback above. This provides a cdecl-compliant
- // entry point for our C++ified object state. :)
- static void ExternalCallback(snd_async_handler_t *pcm_call)
- {
- fprintf(stderr, "* SPU2-X:Iz in your external callback.\n");
- AlsaMod *data = (AlsaMod *)snd_async_handler_get_callback_private(pcm_call);
+ // Preps and invokes the _InternalCallback above. This provides a cdecl-compliant
+ // entry point for our C++ified object state. :)
+ static void ExternalCallback(snd_async_handler_t* pcm_call)
+ {
+ fprintf(stderr, "* SPU2-X:Iz in your external callback.\n");
+ AlsaMod* data = (AlsaMod*)snd_async_handler_get_callback_private(pcm_call);
- pxAssume(data != NULL);
- //pxAssume( data->handle == snd_async_handler_get_pcm(pcm_call) );
+ pxAssume(data != NULL);
+ //pxAssume( data->handle == snd_async_handler_get_pcm(pcm_call) );
- // Not sure if we just need an assert, or something like this:
- if (data->handle != snd_async_handler_get_pcm(pcm_call)) {
- fprintf(stderr, "* SPU2-X: Failed to handle sound.\n");
- return;
- }
+ // Not sure if we just need an assert, or something like this:
+ if (data->handle != snd_async_handler_get_pcm(pcm_call))
+ {
+ fprintf(stderr, "* SPU2-X: Failed to handle sound.\n");
+ return;
+ }
- data->_InternalCallback();
- }
+ data->_InternalCallback();
+ }
public:
- s32 Init()
- {
- //fprintf(stderr,"* SPU2-X: Initing Alsa\n");
- snd_pcm_hw_params_t *hwparams;
- snd_pcm_sw_params_t *swparams;
- snd_pcm_status_t *status;
- int pchannels = 2;
- snd_pcm_format_t format = SND_PCM_FORMAT_S16_LE;
+ s32 Init()
+ {
+ //fprintf(stderr,"* SPU2-X: Initing Alsa\n");
+ snd_pcm_hw_params_t* hwparams;
+ snd_pcm_sw_params_t* swparams;
+ snd_pcm_status_t* status;
+ int pchannels = 2;
+ snd_pcm_format_t format = SND_PCM_FORMAT_S16_LE;
- handle = NULL;
- pcm_callback = NULL;
- pspeed = SAMPLE_RATE;
+ handle = NULL;
+ pcm_callback = NULL;
+ pspeed = SAMPLE_RATE;
- // buffer time and period time are in microseconds...
- // (don't simplify the equation below -- it'll just cause integer rounding errors.
- period_time = (SndOutPacketSize * 1000) / (SampleRate / 1000);
- buffer_time = period_time * NumBuffers;
+ // buffer time and period time are in microseconds...
+ // (don't simplify the equation below -- it'll just cause integer rounding errors.
+ period_time = (SndOutPacketSize * 1000) / (SampleRate / 1000);
+ buffer_time = period_time * NumBuffers;
- int err;
+ int err;
- err = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, SND_PCM_ASYNC /*| SND_PCM_NONBLOCK*/);
- if (err < 0) {
- fprintf(stderr, "Audio open error: %s\n", snd_strerror(err));
- return -1;
- }
+ err = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, SND_PCM_ASYNC /*| SND_PCM_NONBLOCK*/);
+ if (err < 0)
+ {
+ fprintf(stderr, "Audio open error: %s\n", snd_strerror(err));
+ return -1;
+ }
- err = snd_pcm_nonblock(handle, 0);
- if (err < 0) {
- fprintf(stderr, "Can't set blocking mode: %s\n", snd_strerror(err));
- return -1;
- }
+ err = snd_pcm_nonblock(handle, 0);
+ if (err < 0)
+ {
+ fprintf(stderr, "Can't set blocking mode: %s\n", snd_strerror(err));
+ return -1;
+ }
- snd_pcm_hw_params_alloca(&hwparams);
- snd_pcm_sw_params_alloca(&swparams);
+ snd_pcm_hw_params_alloca(&hwparams);
+ snd_pcm_sw_params_alloca(&swparams);
- err = snd_pcm_hw_params_any(handle, hwparams);
- if (err < 0) {
- fprintf(stderr, "Broken configuration for this PCM: %s\n", snd_strerror(err));
- return -1;
- }
+ err = snd_pcm_hw_params_any(handle, hwparams);
+ if (err < 0)
+ {
+ fprintf(stderr, "Broken configuration for this PCM: %s\n", snd_strerror(err));
+ return -1;
+ }
- err = snd_pcm_hw_params_set_access(handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED);
- if (err < 0) {
- fprintf(stderr, "Access type not available: %s\n", snd_strerror(err));
- return -1;
- }
+ err = snd_pcm_hw_params_set_access(handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED);
+ if (err < 0)
+ {
+ fprintf(stderr, "Access type not available: %s\n", snd_strerror(err));
+ return -1;
+ }
- err = snd_pcm_hw_params_set_format(handle, hwparams, format);
- if (err < 0) {
- fprintf(stderr, "Sample format not available: %s\n", snd_strerror(err));
- return -1;
- }
+ err = snd_pcm_hw_params_set_format(handle, hwparams, format);
+ if (err < 0)
+ {
+ fprintf(stderr, "Sample format not available: %s\n", snd_strerror(err));
+ return -1;
+ }
- err = snd_pcm_hw_params_set_channels(handle, hwparams, pchannels);
- if (err < 0) {
- fprintf(stderr, "Channels count not available: %s\n", snd_strerror(err));
- return -1;
- }
- err = snd_pcm_hw_params_set_rate_near(handle, hwparams, &pspeed, 0);
- if (err < 0) {
- fprintf(stderr, "Rate not available: %s\n", snd_strerror(err));
- return -1;
- }
+ err = snd_pcm_hw_params_set_channels(handle, hwparams, pchannels);
+ if (err < 0)
+ {
+ fprintf(stderr, "Channels count not available: %s\n", snd_strerror(err));
+ return -1;
+ }
+ err = snd_pcm_hw_params_set_rate_near(handle, hwparams, &pspeed, 0);
+ if (err < 0)
+ {
+ fprintf(stderr, "Rate not available: %s\n", snd_strerror(err));
+ return -1;
+ }
- err = snd_pcm_hw_params_set_buffer_time_near(handle, hwparams, &buffer_time, 0);
- if (err < 0) {
- fprintf(stderr, "Buffer time error: %s\n", snd_strerror(err));
- return -1;
- }
+ err = snd_pcm_hw_params_set_buffer_time_near(handle, hwparams, &buffer_time, 0);
+ if (err < 0)
+ {
+ fprintf(stderr, "Buffer time error: %s\n", snd_strerror(err));
+ return -1;
+ }
- err = snd_pcm_hw_params_set_period_time_near(handle, hwparams, &period_time, 0);
- if (err < 0) {
- fprintf(stderr, "Period time error: %s\n", snd_strerror(err));
- return -1;
- }
+ err = snd_pcm_hw_params_set_period_time_near(handle, hwparams, &period_time, 0);
+ if (err < 0)
+ {
+ fprintf(stderr, "Period time error: %s\n", snd_strerror(err));
+ return -1;
+ }
- err = snd_pcm_hw_params(handle, hwparams);
- if (err < 0) {
- fprintf(stderr, "Unable to install hw params: %s\n", snd_strerror(err));
- return -1;
- }
+ err = snd_pcm_hw_params(handle, hwparams);
+ if (err < 0)
+ {
+ fprintf(stderr, "Unable to install hw params: %s\n", snd_strerror(err));
+ return -1;
+ }
- snd_pcm_status_alloca(&status);
- err = snd_pcm_status(handle, status);
- if (err < 0) {
- fprintf(stderr, "Unable to get status: %s\n", snd_strerror(err));
- return -1;
- }
+ snd_pcm_status_alloca(&status);
+ err = snd_pcm_status(handle, status);
+ if (err < 0)
+ {
+ fprintf(stderr, "Unable to get status: %s\n", snd_strerror(err));
+ return -1;
+ }
- // Bind our asynchronous callback magic:
+ // Bind our asynchronous callback magic:
- if (handle == NULL)
- fprintf(stderr, "No handle.");
+ if (handle == NULL)
+ fprintf(stderr, "No handle.");
- //fprintf(stderr,"* SPU2-X:Iz setting your internal callback.\n");
- // The external handler never seems to get called after this.
- snd_async_add_pcm_handler(&pcm_callback, handle, ExternalCallback, this);
- err = snd_pcm_start(handle);
- if (err < 0) {
- fprintf(stderr, "Pcm start failed: %s\n", snd_strerror(err));
- return -1;
- }
- // Diagnostic code:
- //buffer_size = snd_pcm_status_get_avail(status);
+ //fprintf(stderr,"* SPU2-X:Iz setting your internal callback.\n");
+ // The external handler never seems to get called after this.
+ snd_async_add_pcm_handler(&pcm_callback, handle, ExternalCallback, this);
+ err = snd_pcm_start(handle);
+ if (err < 0)
+ {
+ fprintf(stderr, "Pcm start failed: %s\n", snd_strerror(err));
+ return -1;
+ }
+ // Diagnostic code:
+ //buffer_size = snd_pcm_status_get_avail(status);
- //fprintf(stderr,"All set up.\n");
- return 0;
- }
+ //fprintf(stderr,"All set up.\n");
+ return 0;
+ }
- void Close()
- {
- //fprintf(stderr,"* SPU2-X: Closing Alsa\n");
- if (handle == NULL)
- return;
+ void Close()
+ {
+ //fprintf(stderr,"* SPU2-X: Closing Alsa\n");
+ if (handle == NULL)
+ return;
- snd_pcm_drop(handle);
- snd_pcm_close(handle);
- handle = NULL;
- }
+ snd_pcm_drop(handle);
+ snd_pcm_close(handle);
+ handle = NULL;
+ }
- virtual void Configure(uptr parent)
- {
- }
+ virtual void Configure(uptr parent)
+ {
+ }
- virtual bool Is51Out() const { return false; }
+ virtual bool Is51Out() const { return false; }
- s32 Test() const
- {
- return 0;
- }
+ s32 Test() const
+ {
+ return 0;
+ }
- int GetEmptySampleCount()
- {
- if (handle == NULL) {
- fprintf(stderr, "Handle is NULL!\n");
- return 0;
- }
+ int GetEmptySampleCount()
+ {
+ if (handle == NULL)
+ {
+ fprintf(stderr, "Handle is NULL!\n");
+ return 0;
+ }
- // Returns the amount of free buffer space, in samples.
- int l = snd_pcm_avail_update(handle);
- if (l < 0)
- return 0;
- return (l / 1000) * (SampleRate / 1000);
- }
+ // Returns the amount of free buffer space, in samples.
+ int l = snd_pcm_avail_update(handle);
+ if (l < 0)
+ return 0;
+ return (l / 1000) * (SampleRate / 1000);
+ }
- const wchar_t *GetIdent() const
- {
- return L"Alsa";
- }
+ const wchar_t* GetIdent() const
+ {
+ return L"Alsa";
+ }
- const wchar_t *GetLongName() const
- {
- return L"Alsa";
- }
+ const wchar_t* GetLongName() const
+ {
+ return L"Alsa";
+ }
- void ReadSettings()
- {
- }
+ void ReadSettings()
+ {
+ }
- void SetApiSettings(wxString api)
- {
- }
+ void SetApiSettings(wxString api)
+ {
+ }
- void WriteSettings() const
- {
- }
+ void WriteSettings() const
+ {
+ }
} static Alsa;
-SndOutModule *AlsaOut = &Alsa;
+SndOutModule* AlsaOut = &Alsa;
#endif
diff --git a/pcsx2/SPU2/Linux/Alsa.h b/pcsx2/SPU2/Linux/Alsa.h
index 3eb08c6b13..e727b38fae 100644
--- a/pcsx2/SPU2/Linux/Alsa.h
+++ b/pcsx2/SPU2/Linux/Alsa.h
@@ -30,11 +30,11 @@
extern int AlsaSetupSound();
extern void AlsaRemoveSound();
extern int AlsaSoundGetBytesBuffered();
-extern void AlsaSoundFeedVoiceData(unsigned char *pSound, long lBytes);
+extern void AlsaSoundFeedVoiceData(unsigned char* pSound, long lBytes);
extern int SetupSound();
extern void RemoveSound();
extern int SoundGetBytesBuffered();
-extern void SoundFeedVoiceData(unsigned char *pSound, long lBytes);
+extern void SoundFeedVoiceData(unsigned char* pSound, long lBytes);
#endif // __LINUX_H__
diff --git a/pcsx2/SPU2/Linux/CfgHelpers.cpp b/pcsx2/SPU2/Linux/CfgHelpers.cpp
index 7eac8d8527..4ea0222130 100644
--- a/pcsx2/SPU2/Linux/CfgHelpers.cpp
+++ b/pcsx2/SPU2/Linux/CfgHelpers.cpp
@@ -16,91 +16,91 @@
#include "Dialogs.h"
#include
-wxFileConfig *spuConfig = nullptr;
+wxFileConfig* spuConfig = nullptr;
wxString path(L"~/.config/PCSX2/inis/SPU2.ini");
bool pathSet = false;
void initIni()
{
- if (spuConfig == nullptr)
- spuConfig = new wxFileConfig(L"", L"", path, L"", wxCONFIG_USE_LOCAL_FILE);
+ if (spuConfig == nullptr)
+ spuConfig = new wxFileConfig(L"", L"", path, L"", wxCONFIG_USE_LOCAL_FILE);
}
-void setIni(const wchar_t *Section)
+void setIni(const wchar_t* Section)
{
- initIni();
- spuConfig->SetPath(wxsFormat(L"/%s", Section));
+ initIni();
+ spuConfig->SetPath(wxsFormat(L"/%s", Section));
}
-void CfgSetSettingsDir(const char *dir)
+void CfgSetSettingsDir(const char* dir)
{
- FileLog("CfgSetSettingsDir(%s)\n", dir);
- path = wxString::FromUTF8(dir) + L"/SPU2.ini";
- pathSet = true;
+ FileLog("CfgSetSettingsDir(%s)\n", dir);
+ path = wxString::FromUTF8(dir) + L"/SPU2.ini";
+ pathSet = true;
}
-void CfgWriteBool(const wchar_t *Section, const wchar_t *Name, bool Value)
+void CfgWriteBool(const wchar_t* Section, const wchar_t* Name, bool Value)
{
- setIni(Section);
- spuConfig->Write(Name, Value);
+ setIni(Section);
+ spuConfig->Write(Name, Value);
}
-void CfgWriteInt(const wchar_t *Section, const wchar_t *Name, int Value)
+void CfgWriteInt(const wchar_t* Section, const wchar_t* Name, int Value)
{
- setIni(Section);
- spuConfig->Write(Name, Value);
+ setIni(Section);
+ spuConfig->Write(Name, Value);
}
-void CfgWriteFloat(const wchar_t *Section, const wchar_t *Name, float Value)
+void CfgWriteFloat(const wchar_t* Section, const wchar_t* Name, float Value)
{
- setIni(Section);
- spuConfig->Write(Name, (double)Value);
+ setIni(Section);
+ spuConfig->Write(Name, (double)Value);
}
-void CfgWriteStr(const wchar_t *Section, const wchar_t *Name, const wxString &Data)
+void CfgWriteStr(const wchar_t* Section, const wchar_t* Name, const wxString& Data)
{
- setIni(Section);
- spuConfig->Write(Name, Data);
+ setIni(Section);
+ spuConfig->Write(Name, Data);
}
-bool CfgReadBool(const wchar_t *Section, const wchar_t *Name, bool Default)
+bool CfgReadBool(const wchar_t* Section, const wchar_t* Name, bool Default)
{
- bool ret;
+ bool ret;
- setIni(Section);
- spuConfig->Read(Name, &ret, Default);
+ setIni(Section);
+ spuConfig->Read(Name, &ret, Default);
- return ret;
+ return ret;
}
-int CfgReadInt(const wchar_t *Section, const wchar_t *Name, int Default)
+int CfgReadInt(const wchar_t* Section, const wchar_t* Name, int Default)
{
- int ret;
+ int ret;
- setIni(Section);
- spuConfig->Read(Name, &ret, Default);
+ setIni(Section);
+ spuConfig->Read(Name, &ret, Default);
- return ret;
+ return ret;
}
-float CfgReadFloat(const wchar_t *Section, const wchar_t *Name, float Default)
+float CfgReadFloat(const wchar_t* Section, const wchar_t* Name, float Default)
{
- double ret;
+ double ret;
- setIni(Section);
- spuConfig->Read(Name, &ret, (double)Default);
+ setIni(Section);
+ spuConfig->Read(Name, &ret, (double)Default);
- return (float)ret;
+ return (float)ret;
}
-void CfgReadStr(const wchar_t *Section, const wchar_t *Name, wchar_t *Data, int DataSize, const wchar_t *Default)
+void CfgReadStr(const wchar_t* Section, const wchar_t* Name, wchar_t* Data, int DataSize, const wchar_t* Default)
{
- setIni(Section);
- wcscpy(Data, spuConfig->Read(Name, Default).wc_str());
+ setIni(Section);
+ wcscpy(Data, spuConfig->Read(Name, Default).wc_str());
}
-void CfgReadStr(const wchar_t *Section, const wchar_t *Name, wxString &Data, const wchar_t *Default)
+void CfgReadStr(const wchar_t* Section, const wchar_t* Name, wxString& Data, const wchar_t* Default)
{
- setIni(Section);
- Data = spuConfig->Read(Name, Default);
+ setIni(Section);
+ Data = spuConfig->Read(Name, Default);
}
diff --git a/pcsx2/SPU2/Linux/Config.cpp b/pcsx2/SPU2/Linux/Config.cpp
index 180fda479e..4380b78573 100644
--- a/pcsx2/SPU2/Linux/Config.cpp
+++ b/pcsx2/SPU2/Linux/Config.cpp
@@ -79,153 +79,157 @@ bool temp_debug_state;
void ReadSettings()
{
- // For some reason this can be called before we know what ini file we're writing to.
- // Lets not try to read it if that happens.
- if (!pathSet) {
- FileLog("Read called without the path set.\n");
- return;
- }
+ // For some reason this can be called before we know what ini file we're writing to.
+ // Lets not try to read it if that happens.
+ if (!pathSet)
+ {
+ FileLog("Read called without the path set.\n");
+ return;
+ }
- Interpolation = CfgReadInt(L"MIXING", L"Interpolation", 4);
- EffectsDisabled = CfgReadBool(L"MIXING", L"Disable_Effects", false);
- postprocess_filter_dealias = CfgReadBool(L"MIXING", L"DealiasFilter", false);
- FinalVolume = ((float)CfgReadInt(L"MIXING", L"FinalVolume", 100)) / 100;
- if (FinalVolume > 1.0f)
- FinalVolume = 1.0f;
+ Interpolation = CfgReadInt(L"MIXING", L"Interpolation", 4);
+ EffectsDisabled = CfgReadBool(L"MIXING", L"Disable_Effects", false);
+ postprocess_filter_dealias = CfgReadBool(L"MIXING", L"DealiasFilter", false);
+ FinalVolume = ((float)CfgReadInt(L"MIXING", L"FinalVolume", 100)) / 100;
+ if (FinalVolume > 1.0f)
+ FinalVolume = 1.0f;
- AdvancedVolumeControl = CfgReadBool(L"MIXING", L"AdvancedVolumeControl", false);
- VolumeAdjustCdb = CfgReadFloat(L"MIXING", L"VolumeAdjustC(dB)", 0);
- VolumeAdjustFLdb = CfgReadFloat(L"MIXING", L"VolumeAdjustFL(dB)", 0);
- VolumeAdjustFRdb = CfgReadFloat(L"MIXING", L"VolumeAdjustFR(dB)", 0);
- VolumeAdjustBLdb = CfgReadFloat(L"MIXING", L"VolumeAdjustBL(dB)", 0);
- VolumeAdjustBRdb = CfgReadFloat(L"MIXING", L"VolumeAdjustBR(dB)", 0);
- VolumeAdjustSLdb = CfgReadFloat(L"MIXING", L"VolumeAdjustSL(dB)", 0);
- VolumeAdjustSRdb = CfgReadFloat(L"MIXING", L"VolumeAdjustSR(dB)", 0);
- VolumeAdjustLFEdb = CfgReadFloat(L"MIXING", L"VolumeAdjustLFE(dB)", 0);
- VolumeAdjustC = powf(10, VolumeAdjustCdb / 10);
- VolumeAdjustFL = powf(10, VolumeAdjustFLdb / 10);
- VolumeAdjustFR = powf(10, VolumeAdjustFRdb / 10);
- VolumeAdjustBL = powf(10, VolumeAdjustBLdb / 10);
- VolumeAdjustBR = powf(10, VolumeAdjustBRdb / 10);
- VolumeAdjustSL = powf(10, VolumeAdjustSLdb / 10);
- VolumeAdjustSR = powf(10, VolumeAdjustSRdb / 10);
- VolumeAdjustLFE = powf(10, VolumeAdjustLFEdb / 10);
- delayCycles = CfgReadInt(L"DEBUG", L"DelayCycles", 4);
+ AdvancedVolumeControl = CfgReadBool(L"MIXING", L"AdvancedVolumeControl", false);
+ VolumeAdjustCdb = CfgReadFloat(L"MIXING", L"VolumeAdjustC(dB)", 0);
+ VolumeAdjustFLdb = CfgReadFloat(L"MIXING", L"VolumeAdjustFL(dB)", 0);
+ VolumeAdjustFRdb = CfgReadFloat(L"MIXING", L"VolumeAdjustFR(dB)", 0);
+ VolumeAdjustBLdb = CfgReadFloat(L"MIXING", L"VolumeAdjustBL(dB)", 0);
+ VolumeAdjustBRdb = CfgReadFloat(L"MIXING", L"VolumeAdjustBR(dB)", 0);
+ VolumeAdjustSLdb = CfgReadFloat(L"MIXING", L"VolumeAdjustSL(dB)", 0);
+ VolumeAdjustSRdb = CfgReadFloat(L"MIXING", L"VolumeAdjustSR(dB)", 0);
+ VolumeAdjustLFEdb = CfgReadFloat(L"MIXING", L"VolumeAdjustLFE(dB)", 0);
+ VolumeAdjustC = powf(10, VolumeAdjustCdb / 10);
+ VolumeAdjustFL = powf(10, VolumeAdjustFLdb / 10);
+ VolumeAdjustFR = powf(10, VolumeAdjustFRdb / 10);
+ VolumeAdjustBL = powf(10, VolumeAdjustBLdb / 10);
+ VolumeAdjustBR = powf(10, VolumeAdjustBRdb / 10);
+ VolumeAdjustSL = powf(10, VolumeAdjustSLdb / 10);
+ VolumeAdjustSR = powf(10, VolumeAdjustSRdb / 10);
+ VolumeAdjustLFE = powf(10, VolumeAdjustLFEdb / 10);
+ delayCycles = CfgReadInt(L"DEBUG", L"DelayCycles", 4);
- wxString temp;
+ wxString temp;
#if SDL_MAJOR_VERSION >= 2 || !defined(SPU2X_PORTAUDIO)
- CfgReadStr(L"OUTPUT", L"Output_Module", temp, SDLOut->GetIdent());
+ CfgReadStr(L"OUTPUT", L"Output_Module", temp, SDLOut->GetIdent());
#else
- CfgReadStr(L"OUTPUT", L"Output_Module", temp, PortaudioOut->GetIdent());
+ CfgReadStr(L"OUTPUT", L"Output_Module", temp, PortaudioOut->GetIdent());
#endif
- OutputModule = FindOutputModuleById(temp.c_str()); // find the driver index of this module
+ OutputModule = FindOutputModuleById(temp.c_str()); // find the driver index of this module
// find current API
#ifdef SPU2X_PORTAUDIO
#ifdef __linux__
- CfgReadStr(L"PORTAUDIO", L"HostApi", temp, L"ALSA");
- if (temp == L"OSS")
- OutputAPI = 1;
- else if (temp == L"JACK")
- OutputAPI = 2;
- else // L"ALSA"
- OutputAPI = 0;
+ CfgReadStr(L"PORTAUDIO", L"HostApi", temp, L"ALSA");
+ if (temp == L"OSS")
+ OutputAPI = 1;
+ else if (temp == L"JACK")
+ OutputAPI = 2;
+ else // L"ALSA"
+ OutputAPI = 0;
#else
- CfgReadStr(L"PORTAUDIO", L"HostApi", temp, L"OSS");
- OutputAPI = 0; // L"OSS"
+ CfgReadStr(L"PORTAUDIO", L"HostApi", temp, L"OSS");
+ OutputAPI = 0; // L"OSS"
#endif
#endif
#if defined(__unix__) || defined(__APPLE__)
- CfgReadStr(L"SDL", L"HostApi", temp, L"pulseaudio");
- SdlOutputAPI = 0;
+ CfgReadStr(L"SDL", L"HostApi", temp, L"pulseaudio");
+ SdlOutputAPI = 0;
#if SDL_MAJOR_VERSION >= 2
- // YES It sucks ...
- for (int i = 0; i < SDL_GetNumAudioDrivers(); ++i) {
- if (!temp.Cmp(wxString(SDL_GetAudioDriver(i), wxConvUTF8)))
- SdlOutputAPI = i;
- }
+ // YES It sucks ...
+ for (int i = 0; i < SDL_GetNumAudioDrivers(); ++i)
+ {
+ if (!temp.Cmp(wxString(SDL_GetAudioDriver(i), wxConvUTF8)))
+ SdlOutputAPI = i;
+ }
#endif
#endif
- SndOutLatencyMS = CfgReadInt(L"OUTPUT", L"Latency", 300);
- SynchMode = CfgReadInt(L"OUTPUT", L"Synch_Mode", 0);
- numSpeakers = CfgReadInt(L"OUTPUT", L"SpeakerConfiguration", 0);
+ SndOutLatencyMS = CfgReadInt(L"OUTPUT", L"Latency", 300);
+ SynchMode = CfgReadInt(L"OUTPUT", L"Synch_Mode", 0);
+ numSpeakers = CfgReadInt(L"OUTPUT", L"SpeakerConfiguration", 0);
#ifdef SPU2X_PORTAUDIO
- PortaudioOut->ReadSettings();
+ PortaudioOut->ReadSettings();
#endif
#if defined(__unix__) || defined(__APPLE__)
- SDLOut->ReadSettings();
+ SDLOut->ReadSettings();
#endif
- SoundtouchCfg::ReadSettings();
- DebugConfig::ReadSettings();
+ SoundtouchCfg::ReadSettings();
+ DebugConfig::ReadSettings();
- // Sanity Checks
- // -------------
+ // Sanity Checks
+ // -------------
- Clampify(SndOutLatencyMS, LATENCY_MIN, LATENCY_MAX);
+ Clampify(SndOutLatencyMS, LATENCY_MIN, LATENCY_MAX);
- if (mods[OutputModule] == nullptr) {
- fwprintf(stderr, L"* SPU2-X: Unknown output module '%s' specified in configuration file.\n", temp.wc_str());
- fprintf(stderr, "* SPU2-X: Defaulting to SDL (%S).\n", SDLOut->GetIdent());
- OutputModule = FindOutputModuleById(SDLOut->GetIdent());
- }
+ if (mods[OutputModule] == nullptr)
+ {
+ fwprintf(stderr, L"* SPU2-X: Unknown output module '%s' specified in configuration file.\n", temp.wc_str());
+ fprintf(stderr, "* SPU2-X: Defaulting to SDL (%S).\n", SDLOut->GetIdent());
+ OutputModule = FindOutputModuleById(SDLOut->GetIdent());
+ }
- WriteSettings();
- spuConfig->Flush();
+ WriteSettings();
+ spuConfig->Flush();
}
/*****************************************************************************/
void WriteSettings()
{
- if (!pathSet) {
- FileLog("Write called without the path set.\n");
- return;
- }
+ if (!pathSet)
+ {
+ FileLog("Write called without the path set.\n");
+ return;
+ }
- CfgWriteInt(L"MIXING", L"Interpolation", Interpolation);
- CfgWriteBool(L"MIXING", L"Disable_Effects", EffectsDisabled);
- CfgWriteBool(L"MIXING", L"DealiasFilter", postprocess_filter_dealias);
- CfgWriteInt(L"MIXING", L"FinalVolume", (int)(FinalVolume * 100 + 0.5f));
+ CfgWriteInt(L"MIXING", L"Interpolation", Interpolation);
+ CfgWriteBool(L"MIXING", L"Disable_Effects", EffectsDisabled);
+ CfgWriteBool(L"MIXING", L"DealiasFilter", postprocess_filter_dealias);
+ CfgWriteInt(L"MIXING", L"FinalVolume", (int)(FinalVolume * 100 + 0.5f));
- CfgWriteBool(L"MIXING", L"AdvancedVolumeControl", AdvancedVolumeControl);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustC(dB)", VolumeAdjustCdb);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustFL(dB)", VolumeAdjustFLdb);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustFR(dB)", VolumeAdjustFRdb);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustBL(dB)", VolumeAdjustBLdb);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustBR(dB)", VolumeAdjustBRdb);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustSL(dB)", VolumeAdjustSLdb);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustSR(dB)", VolumeAdjustSRdb);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustLFE(dB)", VolumeAdjustLFEdb);
+ CfgWriteBool(L"MIXING", L"AdvancedVolumeControl", AdvancedVolumeControl);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustC(dB)", VolumeAdjustCdb);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustFL(dB)", VolumeAdjustFLdb);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustFR(dB)", VolumeAdjustFRdb);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustBL(dB)", VolumeAdjustBLdb);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustBR(dB)", VolumeAdjustBRdb);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustSL(dB)", VolumeAdjustSLdb);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustSR(dB)", VolumeAdjustSRdb);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustLFE(dB)", VolumeAdjustLFEdb);
- CfgWriteStr(L"OUTPUT", L"Output_Module", mods[OutputModule]->GetIdent());
- CfgWriteInt(L"OUTPUT", L"Latency", SndOutLatencyMS);
- CfgWriteInt(L"OUTPUT", L"Synch_Mode", SynchMode);
- CfgWriteInt(L"OUTPUT", L"SpeakerConfiguration", numSpeakers);
- CfgWriteInt(L"DEBUG", L"DelayCycles", delayCycles);
+ CfgWriteStr(L"OUTPUT", L"Output_Module", mods[OutputModule]->GetIdent());
+ CfgWriteInt(L"OUTPUT", L"Latency", SndOutLatencyMS);
+ CfgWriteInt(L"OUTPUT", L"Synch_Mode", SynchMode);
+ CfgWriteInt(L"OUTPUT", L"SpeakerConfiguration", numSpeakers);
+ CfgWriteInt(L"DEBUG", L"DelayCycles", delayCycles);
#ifdef SPU2X_PORTAUDIO
- PortaudioOut->WriteSettings();
+ PortaudioOut->WriteSettings();
#endif
#if defined(__unix__) || defined(__APPLE__)
- SDLOut->WriteSettings();
+ SDLOut->WriteSettings();
#endif
- SoundtouchCfg::WriteSettings();
- DebugConfig::WriteSettings();
+ SoundtouchCfg::WriteSettings();
+ DebugConfig::WriteSettings();
}
void configure()
{
- auto *dialog = new Dialog;
+ auto* dialog = new Dialog;
- initIni();
- ReadSettings();
- dialog->Display();
- WriteSettings();
- delete spuConfig;
- spuConfig = nullptr;
- wxDELETE(dialog);
+ initIni();
+ ReadSettings();
+ dialog->Display();
+ WriteSettings();
+ delete spuConfig;
+ spuConfig = nullptr;
+ wxDELETE(dialog);
}
diff --git a/pcsx2/SPU2/Linux/Config.h b/pcsx2/SPU2/Linux/Config.h
index 5d358b81d7..1d97a49406 100644
--- a/pcsx2/SPU2/Linux/Config.h
+++ b/pcsx2/SPU2/Linux/Config.h
@@ -97,21 +97,21 @@ const int LATENCY_MIN_TIMESTRETCH = 15;
namespace SoundtouchCfg
{
-extern const int SequenceLen_Min;
-extern const int SequenceLen_Max;
+ extern const int SequenceLen_Min;
+ extern const int SequenceLen_Max;
-extern const int SeekWindow_Min;
-extern const int SeekWindow_Max;
+ extern const int SeekWindow_Min;
+ extern const int SeekWindow_Max;
-extern const int Overlap_Min;
-extern const int Overlap_Max;
+ extern const int Overlap_Min;
+ extern const int Overlap_Max;
-extern int SequenceLenMS;
-extern int SeekWindowMS;
-extern int OverlapMS;
+ extern int SequenceLenMS;
+ extern int SeekWindowMS;
+ extern int OverlapMS;
-void ReadSettings();
-void WriteSettings();
+ void ReadSettings();
+ void WriteSettings();
}; // namespace SoundtouchCfg
void ReadSettings();
@@ -119,7 +119,7 @@ void WriteSettings();
void DisplayDialog();
void configure();
-extern wxFileConfig *spuConfig;
+extern wxFileConfig* spuConfig;
extern bool pathSet;
extern void initIni();
#endif // CONFIG_H_INCLUDED
diff --git a/pcsx2/SPU2/Linux/ConfigDebug.cpp b/pcsx2/SPU2/Linux/ConfigDebug.cpp
index fc9501bb5a..3ea7598ae1 100644
--- a/pcsx2/SPU2/Linux/ConfigDebug.cpp
+++ b/pcsx2/SPU2/Linux/ConfigDebug.cpp
@@ -51,105 +51,105 @@ wxString CoresDumpFileName;
wxString MemDumpFileName;
wxString RegDumpFileName;
-void CfgSetLogDir(const char *dir)
+void CfgSetLogDir(const char* dir)
{
- LogsFolder = (dir == NULL) ? wxString(L"logs") : fromUTF8(dir);
- DumpsFolder = (dir == NULL) ? wxString(L"logs") : fromUTF8(dir);
- LogLocationSetByPcsx2 = (dir != NULL);
+ LogsFolder = (dir == NULL) ? wxString(L"logs") : fromUTF8(dir);
+ DumpsFolder = (dir == NULL) ? wxString(L"logs") : fromUTF8(dir);
+ LogLocationSetByPcsx2 = (dir != NULL);
}
-FILE *OpenBinaryLog(const wxString &logfile)
+FILE* OpenBinaryLog(const wxString& logfile)
{
- return wxFopen(Path::Combine(LogsFolder, logfile), L"wb");
+ return wxFopen(Path::Combine(LogsFolder, logfile), L"wb");
}
-FILE *OpenLog(const wxString &logfile)
+FILE* OpenLog(const wxString& logfile)
{
- return wxFopen(Path::Combine(LogsFolder, logfile), L"w");
+ return wxFopen(Path::Combine(LogsFolder, logfile), L"w");
}
-FILE *OpenDump(const wxString &logfile)
+FILE* OpenDump(const wxString& logfile)
{
- return wxFopen(Path::Combine(DumpsFolder, logfile), L"w");
+ return wxFopen(Path::Combine(DumpsFolder, logfile), L"w");
}
namespace DebugConfig
{
-static const wchar_t *Section = L"DEBUG";
+ static const wchar_t* Section = L"DEBUG";
-static void set_default_filenames()
-{
- AccessLogFileName = L"SPU2Log.txt";
- WaveLogFileName = L"SPU2log.wav";
- DMA4LogFileName = L"SPU2dma4.dat";
- DMA7LogFileName = L"SPU2dma7.dat";
+ static void set_default_filenames()
+ {
+ AccessLogFileName = L"SPU2Log.txt";
+ WaveLogFileName = L"SPU2log.wav";
+ DMA4LogFileName = L"SPU2dma4.dat";
+ DMA7LogFileName = L"SPU2dma7.dat";
- CoresDumpFileName = L"SPU2Cores.txt";
- MemDumpFileName = L"SPU2mem.dat";
- RegDumpFileName = L"SPU2regs.dat";
-}
+ CoresDumpFileName = L"SPU2Cores.txt";
+ MemDumpFileName = L"SPU2mem.dat";
+ RegDumpFileName = L"SPU2regs.dat";
+ }
-void ReadSettings()
-{
- DebugEnabled = CfgReadBool(Section, L"Global_Enable", 0);
- _MsgToConsole = CfgReadBool(Section, L"Show_Messages", 0);
- _MsgKeyOnOff = CfgReadBool(Section, L"Show_Messages_Key_On_Off", 0);
- _MsgVoiceOff = CfgReadBool(Section, L"Show_Messages_Voice_Off", 0);
- _MsgDMA = CfgReadBool(Section, L"Show_Messages_DMA_Transfer", 0);
- _MsgAutoDMA = CfgReadBool(Section, L"Show_Messages_AutoDMA", 0);
- _MsgOverruns = CfgReadBool(Section, L"Show_Messages_Overruns", 0);
- _MsgCache = CfgReadBool(Section, L"Show_Messages_CacheStats", 0);
+ void ReadSettings()
+ {
+ DebugEnabled = CfgReadBool(Section, L"Global_Enable", 0);
+ _MsgToConsole = CfgReadBool(Section, L"Show_Messages", 0);
+ _MsgKeyOnOff = CfgReadBool(Section, L"Show_Messages_Key_On_Off", 0);
+ _MsgVoiceOff = CfgReadBool(Section, L"Show_Messages_Voice_Off", 0);
+ _MsgDMA = CfgReadBool(Section, L"Show_Messages_DMA_Transfer", 0);
+ _MsgAutoDMA = CfgReadBool(Section, L"Show_Messages_AutoDMA", 0);
+ _MsgOverruns = CfgReadBool(Section, L"Show_Messages_Overruns", 0);
+ _MsgCache = CfgReadBool(Section, L"Show_Messages_CacheStats", 0);
- _AccessLog = CfgReadBool(Section, L"Log_Register_Access", 0);
- _DMALog = CfgReadBool(Section, L"Log_DMA_Transfers", 0);
- _WaveLog = CfgReadBool(Section, L"Log_WAVE_Output", 0);
+ _AccessLog = CfgReadBool(Section, L"Log_Register_Access", 0);
+ _DMALog = CfgReadBool(Section, L"Log_DMA_Transfers", 0);
+ _WaveLog = CfgReadBool(Section, L"Log_WAVE_Output", 0);
- _CoresDump = CfgReadBool(Section, L"Dump_Info", 0);
- _MemDump = CfgReadBool(Section, L"Dump_Memory", 0);
- _RegDump = CfgReadBool(Section, L"Dump_Regs", 0);
+ _CoresDump = CfgReadBool(Section, L"Dump_Info", 0);
+ _MemDump = CfgReadBool(Section, L"Dump_Memory", 0);
+ _RegDump = CfgReadBool(Section, L"Dump_Regs", 0);
- set_default_filenames();
+ set_default_filenames();
- CfgReadStr(Section, L"Access_Log_Filename", AccessLogFileName, L"logs/SPU2Log.txt");
- CfgReadStr(Section, L"WaveLog_Filename", WaveLogFileName, L"logs/SPU2log.wav");
- CfgReadStr(Section, L"DMA4Log_Filename", DMA4LogFileName, L"logs/SPU2dma4.dat");
- CfgReadStr(Section, L"DMA7Log_Filename", DMA7LogFileName, L"logs/SPU2dma7.dat");
+ CfgReadStr(Section, L"Access_Log_Filename", AccessLogFileName, L"logs/SPU2Log.txt");
+ CfgReadStr(Section, L"WaveLog_Filename", WaveLogFileName, L"logs/SPU2log.wav");
+ CfgReadStr(Section, L"DMA4Log_Filename", DMA4LogFileName, L"logs/SPU2dma4.dat");
+ CfgReadStr(Section, L"DMA7Log_Filename", DMA7LogFileName, L"logs/SPU2dma7.dat");
- CfgReadStr(Section, L"Info_Dump_Filename", CoresDumpFileName, L"logs/SPU2Cores.txt");
- CfgReadStr(Section, L"Mem_Dump_Filename", MemDumpFileName, L"logs/SPU2mem.dat");
- CfgReadStr(Section, L"Reg_Dump_Filename", RegDumpFileName, L"logs/SPU2regs.dat");
-}
+ CfgReadStr(Section, L"Info_Dump_Filename", CoresDumpFileName, L"logs/SPU2Cores.txt");
+ CfgReadStr(Section, L"Mem_Dump_Filename", MemDumpFileName, L"logs/SPU2mem.dat");
+ CfgReadStr(Section, L"Reg_Dump_Filename", RegDumpFileName, L"logs/SPU2regs.dat");
+ }
-void WriteSettings()
-{
- CfgWriteBool(Section, L"Global_Enable", DebugEnabled);
+ void WriteSettings()
+ {
+ CfgWriteBool(Section, L"Global_Enable", DebugEnabled);
- CfgWriteBool(Section, L"Show_Messages", _MsgToConsole);
- CfgWriteBool(Section, L"Show_Messages_Key_On_Off", _MsgKeyOnOff);
- CfgWriteBool(Section, L"Show_Messages_Voice_Off", _MsgVoiceOff);
- CfgWriteBool(Section, L"Show_Messages_DMA_Transfer", _MsgDMA);
- CfgWriteBool(Section, L"Show_Messages_AutoDMA", _MsgAutoDMA);
- CfgWriteBool(Section, L"Show_Messages_Overruns", _MsgOverruns);
- CfgWriteBool(Section, L"Show_Messages_CacheStats", _MsgCache);
+ CfgWriteBool(Section, L"Show_Messages", _MsgToConsole);
+ CfgWriteBool(Section, L"Show_Messages_Key_On_Off", _MsgKeyOnOff);
+ CfgWriteBool(Section, L"Show_Messages_Voice_Off", _MsgVoiceOff);
+ CfgWriteBool(Section, L"Show_Messages_DMA_Transfer", _MsgDMA);
+ CfgWriteBool(Section, L"Show_Messages_AutoDMA", _MsgAutoDMA);
+ CfgWriteBool(Section, L"Show_Messages_Overruns", _MsgOverruns);
+ CfgWriteBool(Section, L"Show_Messages_CacheStats", _MsgCache);
- CfgWriteBool(Section, L"Log_Register_Access", _AccessLog);
- CfgWriteBool(Section, L"Log_DMA_Transfers", _DMALog);
- CfgWriteBool(Section, L"Log_WAVE_Output", _WaveLog);
+ CfgWriteBool(Section, L"Log_Register_Access", _AccessLog);
+ CfgWriteBool(Section, L"Log_DMA_Transfers", _DMALog);
+ CfgWriteBool(Section, L"Log_WAVE_Output", _WaveLog);
- CfgWriteBool(Section, L"Dump_Info", _CoresDump);
- CfgWriteBool(Section, L"Dump_Memory", _MemDump);
- CfgWriteBool(Section, L"Dump_Regs", _RegDump);
+ CfgWriteBool(Section, L"Dump_Info", _CoresDump);
+ CfgWriteBool(Section, L"Dump_Memory", _MemDump);
+ CfgWriteBool(Section, L"Dump_Regs", _RegDump);
- set_default_filenames();
- CfgWriteStr(Section, L"Access_Log_Filename", AccessLogFileName);
- CfgWriteStr(Section, L"WaveLog_Filename", WaveLogFileName);
- CfgWriteStr(Section, L"DMA4Log_Filename", DMA4LogFileName);
- CfgWriteStr(Section, L"DMA7Log_Filename", DMA7LogFileName);
+ set_default_filenames();
+ CfgWriteStr(Section, L"Access_Log_Filename", AccessLogFileName);
+ CfgWriteStr(Section, L"WaveLog_Filename", WaveLogFileName);
+ CfgWriteStr(Section, L"DMA4Log_Filename", DMA4LogFileName);
+ CfgWriteStr(Section, L"DMA7Log_Filename", DMA7LogFileName);
- CfgWriteStr(Section, L"Info_Dump_Filename", CoresDumpFileName);
- CfgWriteStr(Section, L"Mem_Dump_Filename", MemDumpFileName);
- CfgWriteStr(Section, L"Reg_Dump_Filename", RegDumpFileName);
-}
+ CfgWriteStr(Section, L"Info_Dump_Filename", CoresDumpFileName);
+ CfgWriteStr(Section, L"Mem_Dump_Filename", MemDumpFileName);
+ CfgWriteStr(Section, L"Reg_Dump_Filename", RegDumpFileName);
+ }
} // namespace DebugConfig
diff --git a/pcsx2/SPU2/Linux/ConfigSoundTouch.cpp b/pcsx2/SPU2/Linux/ConfigSoundTouch.cpp
index a0c5c7bc49..6b608bb55c 100644
--- a/pcsx2/SPU2/Linux/ConfigSoundTouch.cpp
+++ b/pcsx2/SPU2/Linux/ConfigSoundTouch.cpp
@@ -20,49 +20,49 @@
namespace SoundtouchCfg
{
-// Timestretch Slider Bounds, Min/Max
-const int SequenceLen_Min = 20;
-const int SequenceLen_Max = 100;
+ // Timestretch Slider Bounds, Min/Max
+ const int SequenceLen_Min = 20;
+ const int SequenceLen_Max = 100;
-const int SeekWindow_Min = 10;
-const int SeekWindow_Max = 30;
+ const int SeekWindow_Min = 10;
+ const int SeekWindow_Max = 30;
-const int Overlap_Min = 5;
-const int Overlap_Max = 15;
+ const int Overlap_Min = 5;
+ const int Overlap_Max = 15;
-int SequenceLenMS = 30;
-int SeekWindowMS = 20;
-int OverlapMS = 10;
+ int SequenceLenMS = 30;
+ int SeekWindowMS = 20;
+ int OverlapMS = 10;
-static void ClampValues()
-{
- Clampify(SequenceLenMS, SequenceLen_Min, SequenceLen_Max);
- Clampify(SeekWindowMS, SeekWindow_Min, SeekWindow_Max);
- Clampify(OverlapMS, Overlap_Min, Overlap_Max);
-}
+ static void ClampValues()
+ {
+ Clampify(SequenceLenMS, SequenceLen_Min, SequenceLen_Max);
+ Clampify(SeekWindowMS, SeekWindow_Min, SeekWindow_Max);
+ Clampify(OverlapMS, Overlap_Min, Overlap_Max);
+ }
-void ApplySettings(soundtouch::SoundTouch &sndtouch)
-{
- sndtouch.setSetting(SETTING_SEQUENCE_MS, SequenceLenMS);
- sndtouch.setSetting(SETTING_SEEKWINDOW_MS, SeekWindowMS);
- sndtouch.setSetting(SETTING_OVERLAP_MS, OverlapMS);
-}
+ void ApplySettings(soundtouch::SoundTouch& sndtouch)
+ {
+ sndtouch.setSetting(SETTING_SEQUENCE_MS, SequenceLenMS);
+ sndtouch.setSetting(SETTING_SEEKWINDOW_MS, SeekWindowMS);
+ sndtouch.setSetting(SETTING_OVERLAP_MS, OverlapMS);
+ }
-void ReadSettings()
-{
- SequenceLenMS = CfgReadInt(L"SOUNDTOUCH", L"SequenceLengthMS", 30);
- SeekWindowMS = CfgReadInt(L"SOUNDTOUCH", L"SeekWindowMS", 20);
- OverlapMS = CfgReadInt(L"SOUNDTOUCH", L"OverlapMS", 10);
+ void ReadSettings()
+ {
+ SequenceLenMS = CfgReadInt(L"SOUNDTOUCH", L"SequenceLengthMS", 30);
+ SeekWindowMS = CfgReadInt(L"SOUNDTOUCH", L"SeekWindowMS", 20);
+ OverlapMS = CfgReadInt(L"SOUNDTOUCH", L"OverlapMS", 10);
- ClampValues();
- WriteSettings();
-}
+ ClampValues();
+ WriteSettings();
+ }
-void WriteSettings()
-{
- CfgWriteInt(L"SOUNDTOUCH", L"SequenceLengthMS", SequenceLenMS);
- CfgWriteInt(L"SOUNDTOUCH", L"SeekWindowMS", SeekWindowMS);
- CfgWriteInt(L"SOUNDTOUCH", L"OverlapMS", OverlapMS);
-}
+ void WriteSettings()
+ {
+ CfgWriteInt(L"SOUNDTOUCH", L"SequenceLengthMS", SequenceLenMS);
+ CfgWriteInt(L"SOUNDTOUCH", L"SeekWindowMS", SeekWindowMS);
+ CfgWriteInt(L"SOUNDTOUCH", L"OverlapMS", OverlapMS);
+ }
} // namespace SoundtouchCfg
diff --git a/pcsx2/SPU2/Linux/Dialogs.cpp b/pcsx2/SPU2/Linux/Dialogs.cpp
index c4d9c125e2..026b30a97e 100644
--- a/pcsx2/SPU2/Linux/Dialogs.cpp
+++ b/pcsx2/SPU2/Linux/Dialogs.cpp
@@ -21,32 +21,32 @@
#if defined(__unix__)
#include
-void SysMessage(const char *fmt, ...)
+void SysMessage(const char* fmt, ...)
{
- va_list list;
- char msg[512];
+ va_list list;
+ char msg[512];
- va_start(list, fmt);
- vsprintf(msg, fmt, list);
- va_end(list);
+ va_start(list, fmt);
+ vsprintf(msg, fmt, list);
+ va_end(list);
- if (msg[strlen(msg) - 1] == '\n')
- msg[strlen(msg) - 1] = 0;
+ if (msg[strlen(msg) - 1] == '\n')
+ msg[strlen(msg) - 1] = 0;
- wxMessageDialog dialog(nullptr, msg, "Info", wxOK);
- dialog.ShowModal();
+ wxMessageDialog dialog(nullptr, msg, "Info", wxOK);
+ dialog.ShowModal();
}
-void SysMessage(const wchar_t *fmt, ...)
+void SysMessage(const wchar_t* fmt, ...)
{
- va_list list;
- va_start(list, fmt);
- wxString msg;
- msg.PrintfV(fmt, list);
- va_end(list);
+ va_list list;
+ va_start(list, fmt);
+ wxString msg;
+ msg.PrintfV(fmt, list);
+ va_end(list);
- wxMessageDialog dialog(nullptr, msg, "Info", wxOK);
- dialog.ShowModal();
+ wxMessageDialog dialog(nullptr, msg, "Info", wxOK);
+ dialog.ShowModal();
}
#endif
@@ -54,7 +54,7 @@ void DspUpdate()
{
}
-s32 DspLoadLibrary(wchar_t *fileName, int modnum)
+s32 DspLoadLibrary(wchar_t* fileName, int modnum)
{
- return 0;
+ return 0;
}
diff --git a/pcsx2/SPU2/Linux/Dialogs.h b/pcsx2/SPU2/Linux/Dialogs.h
index 496a2a852b..6f6992cf08 100644
--- a/pcsx2/SPU2/Linux/Dialogs.h
+++ b/pcsx2/SPU2/Linux/Dialogs.h
@@ -21,22 +21,22 @@
namespace DebugConfig
{
-extern void ReadSettings();
-extern void WriteSettings();
+ extern void ReadSettings();
+ extern void WriteSettings();
} // namespace DebugConfig
-extern void CfgSetSettingsDir(const char *dir);
-extern void CfgSetLogDir(const char *dir);
+extern void CfgSetSettingsDir(const char* dir);
+extern void CfgSetLogDir(const char* dir);
-extern void CfgWriteBool(const wchar_t *Section, const wchar_t *Name, bool Value);
-extern void CfgWriteInt(const wchar_t *Section, const wchar_t *Name, int Value);
-extern void CfgWriteFloat(const wchar_t *Section, const wchar_t *Name, float Value);
-extern void CfgWriteStr(const wchar_t *Section, const wchar_t *Name, const wxString &Data);
+extern void CfgWriteBool(const wchar_t* Section, const wchar_t* Name, bool Value);
+extern void CfgWriteInt(const wchar_t* Section, const wchar_t* Name, int Value);
+extern void CfgWriteFloat(const wchar_t* Section, const wchar_t* Name, float Value);
+extern void CfgWriteStr(const wchar_t* Section, const wchar_t* Name, const wxString& Data);
-extern bool CfgReadBool(const wchar_t *Section, const wchar_t *Name, bool Default);
-extern void CfgReadStr(const wchar_t *Section, const wchar_t *Name, wxString &Data, const wchar_t *Default);
+extern bool CfgReadBool(const wchar_t* Section, const wchar_t* Name, bool Default);
+extern void CfgReadStr(const wchar_t* Section, const wchar_t* Name, wxString& Data, const wchar_t* Default);
//extern void CfgReadStr(const wchar_t* Section, const wchar_t* Name, wchar_t* Data, int DataSize, const wchar_t* Default);
-extern int CfgReadInt(const wchar_t *Section, const wchar_t *Name, int Default);
-extern float CfgReadFloat(const wchar_t *Section, const wchar_t *Name, float Default);
+extern int CfgReadInt(const wchar_t* Section, const wchar_t* Name, int Default);
+extern float CfgReadFloat(const wchar_t* Section, const wchar_t* Name, float Default);
#endif
diff --git a/pcsx2/SPU2/Lowpass.cpp b/pcsx2/SPU2/Lowpass.cpp
index 059830dd87..289852c942 100644
--- a/pcsx2/SPU2/Lowpass.cpp
+++ b/pcsx2/SPU2/Lowpass.cpp
@@ -21,72 +21,72 @@
template
__forceinline LowPassFilter::LowPassFilter(FloatType freq, FloatType srate)
{
- typedef FloatType FT;
+ typedef FloatType FT;
- FloatType omega = (FT)2.0 * freq / srate;
- static const FloatType g = (FT)1.0;
+ FloatType omega = (FT)2.0 * freq / srate;
+ static const FloatType g = (FT)1.0;
- // calculating coefficients:
+ // calculating coefficients:
- FloatType k, p, q, a;
- FloatType a0, a1, a2, a3, a4;
+ FloatType k, p, q, a;
+ FloatType a0, a1, a2, a3, a4;
- k = ((FT)4.0 * g - (FT)3.0) / (g + (FT)1.0);
- p = (FT)1.0 - (FT)0.25 * k;
- p *= p;
+ k = ((FT)4.0 * g - (FT)3.0) / (g + (FT)1.0);
+ p = (FT)1.0 - (FT)0.25 * k;
+ p *= p;
- // LP:
- a = (FT)1.0 / (tan((FT)0.5 * omega) * ((FT)1.0 + p));
- p = (FT)1.0 + a;
- q = (FT)1.0 - a;
+ // LP:
+ a = (FT)1.0 / (tan((FT)0.5 * omega) * ((FT)1.0 + p));
+ p = (FT)1.0 + a;
+ q = (FT)1.0 - a;
- a0 = (FT)1.0 / (k + p * p * p * p);
- a1 = (FT)4.0 * (k + p * p * p * q);
- a2 = (FT)6.0 * (k + p * p * q * q);
- a3 = (FT)4.0 * (k + p * q * q * q);
- a4 = (k + q * q * q * q);
- p = a0 * (k + (FT)1.0);
+ a0 = (FT)1.0 / (k + p * p * p * p);
+ a1 = (FT)4.0 * (k + p * p * p * q);
+ a2 = (FT)6.0 * (k + p * p * q * q);
+ a3 = (FT)4.0 * (k + p * q * q * q);
+ a4 = (k + q * q * q * q);
+ p = a0 * (k + (FT)1.0);
- coef[0] = p;
- coef[1] = (FT)4.0 * p;
- coef[2] = (FT)6.0 * p;
- coef[3] = (FT)4.0 * p;
- coef[4] = p;
- coef[5] = -a1 * a0;
- coef[6] = -a2 * a0;
- coef[7] = -a3 * a0;
- coef[8] = -a4 * a0;
+ coef[0] = p;
+ coef[1] = (FT)4.0 * p;
+ coef[2] = (FT)6.0 * p;
+ coef[3] = (FT)4.0 * p;
+ coef[4] = p;
+ coef[5] = -a1 * a0;
+ coef[6] = -a2 * a0;
+ coef[7] = -a3 * a0;
+ coef[8] = -a4 * a0;
}
// Processes a single sample into the LPF.
template
__forceinline FloatType LowPassFilter::sample(FloatType inval)
{
- const FloatType out = (coef[0] * inval) + d[0];
- d[0] = (coef[1] * inval) + (coef[5] * out) + d[1];
- d[1] = (coef[2] * inval) + (coef[6] * out) + d[2];
- d[2] = (coef[3] * inval) + (coef[7] * out) + d[3];
- d[3] = (coef[4] * inval) + (coef[8] * out);
+ const FloatType out = (coef[0] * inval) + d[0];
+ d[0] = (coef[1] * inval) + (coef[5] * out) + d[1];
+ d[1] = (coef[2] * inval) + (coef[6] * out) + d[2];
+ d[2] = (coef[3] * inval) + (coef[7] * out) + d[3];
+ d[3] = (coef[4] * inval) + (coef[8] * out);
- return out;
+ return out;
}
LowPassFilter32::LowPassFilter32(float freq, float srate)
- : impl_lpf(freq, srate)
+ : impl_lpf(freq, srate)
{
}
LowPassFilter64::LowPassFilter64(double freq, double srate)
- : impl_lpf(freq, srate)
+ : impl_lpf(freq, srate)
{
}
float LowPassFilter32::sample(float inval)
{
- return impl_lpf.sample(inval);
+ return impl_lpf.sample(inval);
}
double LowPassFilter64::sample(double inval)
{
- return impl_lpf.sample(inval);
+ return impl_lpf.sample(inval);
}
diff --git a/pcsx2/SPU2/Lowpass.h b/pcsx2/SPU2/Lowpass.h
index f1e3e5879b..f6ae6bd2ee 100644
--- a/pcsx2/SPU2/Lowpass.h
+++ b/pcsx2/SPU2/Lowpass.h
@@ -18,25 +18,25 @@
template
struct LowPassFilter
{
- FloatType coef[9];
- FloatType d[4];
+ FloatType coef[9];
+ FloatType d[4];
- LowPassFilter(FloatType freq, FloatType srate);
- FloatType sample(FloatType inval);
+ LowPassFilter(FloatType freq, FloatType srate);
+ FloatType sample(FloatType inval);
};
struct LowPassFilter32
{
- LowPassFilter impl_lpf;
+ LowPassFilter impl_lpf;
- LowPassFilter32(float freq, float srate);
- float sample(float inval);
+ LowPassFilter32(float freq, float srate);
+ float sample(float inval);
};
struct LowPassFilter64
{
- LowPassFilter impl_lpf;
+ LowPassFilter impl_lpf;
- LowPassFilter64(double freq, double srate);
- double sample(double inval);
+ LowPassFilter64(double freq, double srate);
+ double sample(double inval);
};
diff --git a/pcsx2/SPU2/Mixer.cpp b/pcsx2/SPU2/Mixer.cpp
index 5eb2543d5a..4d13415507 100644
--- a/pcsx2/SPU2/Mixer.cpp
+++ b/pcsx2/SPU2/Mixer.cpp
@@ -20,15 +20,15 @@
// disable the optimisation until we can tie it to the game database.
#define NEVER_SKIP_VOICES 1
-void ADMAOutLogWrite(void *lpData, u32 ulSize);
+void ADMAOutLogWrite(void* lpData, u32 ulSize);
static const s32 tbl_XA_Factor[16][2] =
- {
- {0, 0},
- {60, 0},
- {115, -52},
- {98, -55},
- {122, -60}};
+ {
+ {0, 0},
+ {60, 0},
+ {115, -52},
+ {98, -55},
+ {122, -60}};
// Performs a 64-bit multiplication between two values and returns the
@@ -46,13 +46,13 @@ static const s32 tbl_XA_Factor[16][2] =
//
static __forceinline s32 MulShr32(s32 srcval, s32 mulval)
{
- return (s64)srcval * mulval >> 32;
+ return (s64)srcval * mulval >> 32;
}
__forceinline s32 clamp_mix(s32 x, u8 bitshift)
{
- assert(bitshift <= 15);
- return GetClamped(x, -(0x8000 << bitshift), 0x7fff << bitshift);
+ assert(bitshift <= 15);
+ return GetClamped(x, -(0x8000 << bitshift), 0x7fff << bitshift);
}
#if _MSC_VER
@@ -64,72 +64,75 @@ __forceinline
// inline. Gcc 4.5 has the experimental options -flto, -fwhopr and -fwhole-program to
// do it but it still experimental...
#endif
- StereoOut32
- clamp_mix(const StereoOut32 &sample, u8 bitshift)
+ StereoOut32
+ clamp_mix(const StereoOut32& sample, u8 bitshift)
{
- // We should clampify between -0x8000 and 0x7fff, however some audio output
- // modules or sound drivers could (will :p) overshoot with that. So giving it a small safety.
+ // We should clampify between -0x8000 and 0x7fff, however some audio output
+ // modules or sound drivers could (will :p) overshoot with that. So giving it a small safety.
- return StereoOut32(
- GetClamped(sample.Left, -(0x7f00 << bitshift), 0x7f00 << bitshift),
- GetClamped(sample.Right, -(0x7f00 << bitshift), 0x7f00 << bitshift));
+ return StereoOut32(
+ GetClamped(sample.Left, -(0x7f00 << bitshift), 0x7f00 << bitshift),
+ GetClamped(sample.Right, -(0x7f00 << bitshift), 0x7f00 << bitshift));
}
-static void __forceinline XA_decode_block(s16 *buffer, const s16 *block, s32 &prev1, s32 &prev2)
+static void __forceinline XA_decode_block(s16* buffer, const s16* block, s32& prev1, s32& prev2)
{
- const s32 header = *block;
- const s32 shift = (header & 0xF) + 16;
- const int id = header >> 4 & 0xF;
- if (id > 4 && MsgToConsole())
- ConLog("* SPU2-X: Unknown ADPCM coefficients table id %d\n", id);
- const s32 pred1 = tbl_XA_Factor[id][0];
- const s32 pred2 = tbl_XA_Factor[id][1];
+ const s32 header = *block;
+ const s32 shift = (header & 0xF) + 16;
+ const int id = header >> 4 & 0xF;
+ if (id > 4 && MsgToConsole())
+ ConLog("* SPU2-X: Unknown ADPCM coefficients table id %d\n", id);
+ const s32 pred1 = tbl_XA_Factor[id][0];
+ const s32 pred2 = tbl_XA_Factor[id][1];
- const s8 *blockbytes = (s8 *)&block[1];
- const s8 *blockend = &blockbytes[13];
+ const s8* blockbytes = (s8*)&block[1];
+ const s8* blockend = &blockbytes[13];
- for (; blockbytes <= blockend; ++blockbytes) {
- s32 data = ((*blockbytes) << 28) & 0xF0000000;
- s32 pcm = (data >> shift) + (((pred1 * prev1) + (pred2 * prev2) + 32) >> 6);
+ for (; blockbytes <= blockend; ++blockbytes)
+ {
+ s32 data = ((*blockbytes) << 28) & 0xF0000000;
+ s32 pcm = (data >> shift) + (((pred1 * prev1) + (pred2 * prev2) + 32) >> 6);
- Clampify(pcm, -0x8000, 0x7fff);
- *(buffer++) = pcm;
+ Clampify(pcm, -0x8000, 0x7fff);
+ *(buffer++) = pcm;
- data = ((*blockbytes) << 24) & 0xF0000000;
- s32 pcm2 = (data >> shift) + (((pred1 * pcm) + (pred2 * prev1) + 32) >> 6);
+ data = ((*blockbytes) << 24) & 0xF0000000;
+ s32 pcm2 = (data >> shift) + (((pred1 * pcm) + (pred2 * prev1) + 32) >> 6);
- Clampify(pcm2, -0x8000, 0x7fff);
- *(buffer++) = pcm2;
+ Clampify(pcm2, -0x8000, 0x7fff);
+ *(buffer++) = pcm2;
- prev2 = pcm;
- prev1 = pcm2;
- }
+ prev2 = pcm;
+ prev1 = pcm2;
+ }
}
-static void __forceinline IncrementNextA(V_Core &thiscore, uint voiceidx)
+static void __forceinline IncrementNextA(V_Core& thiscore, uint voiceidx)
{
- V_Voice &vc(thiscore.Voices[voiceidx]);
+ V_Voice& vc(thiscore.Voices[voiceidx]);
- // Important! Both cores signal IRQ when an address is read, regardless of
- // which core actually reads the address.
+ // Important! Both cores signal IRQ when an address is read, regardless of
+ // which core actually reads the address.
- for (int i = 0; i < 2; i++) {
- if (Cores[i].IRQEnable && (vc.NextA == Cores[i].IRQA)) {
- //if( IsDevBuild )
- // ConLog(" * SPU2 Core %d: IRQ Requested (IRQA (%05X) passed; voice %d).\n", i, Cores[i].IRQA, thiscore.Index * 24 + voiceidx);
+ for (int i = 0; i < 2; i++)
+ {
+ if (Cores[i].IRQEnable && (vc.NextA == Cores[i].IRQA))
+ {
+ //if( IsDevBuild )
+ // ConLog(" * SPU2 Core %d: IRQ Requested (IRQA (%05X) passed; voice %d).\n", i, Cores[i].IRQA, thiscore.Index * 24 + voiceidx);
- SetIrqCall(i);
- }
- }
+ SetIrqCall(i);
+ }
+ }
- vc.NextA++;
- vc.NextA &= 0xFFFFF;
+ vc.NextA++;
+ vc.NextA &= 0xFFFFF;
}
// decoded pcm data, used to cache the decoded data so that it needn't be decoded
// multiple times. Cache chunks are decoded when the mixer requests the blocks, and
// invalided when DMA transfers and memory writes are performed.
-PcmCacheEntry *pcm_cache_data = NULL;
+PcmCacheEntry* pcm_cache_data = NULL;
int g_counter_cache_hits = 0;
int g_counter_cache_misses = 0;
@@ -144,110 +147,123 @@ int g_counter_cache_ignores = 0;
#define XAFLAG_LOOP (1ul << 1)
#define XAFLAG_LOOP_START (1ul << 2)
-static __forceinline s32 GetNextDataBuffered(V_Core &thiscore, uint voiceidx)
+static __forceinline s32 GetNextDataBuffered(V_Core& thiscore, uint voiceidx)
{
- V_Voice &vc(thiscore.Voices[voiceidx]);
+ V_Voice& vc(thiscore.Voices[voiceidx]);
- if ((vc.SCurrent & 3) == 0) {
- IncrementNextA(thiscore, voiceidx);
+ if ((vc.SCurrent & 3) == 0)
+ {
+ IncrementNextA(thiscore, voiceidx);
- if ((vc.NextA & 7) == 0) // vc.SCurrent == 24 equivalent
- {
- if (vc.LoopFlags & XAFLAG_LOOP_END) {
- thiscore.Regs.ENDX |= (1 << voiceidx);
- vc.NextA = vc.LoopStartA | 1;
- if (!(vc.LoopFlags & XAFLAG_LOOP)) {
- vc.Stop();
+ if ((vc.NextA & 7) == 0) // vc.SCurrent == 24 equivalent
+ {
+ if (vc.LoopFlags & XAFLAG_LOOP_END)
+ {
+ thiscore.Regs.ENDX |= (1 << voiceidx);
+ vc.NextA = vc.LoopStartA | 1;
+ if (!(vc.LoopFlags & XAFLAG_LOOP))
+ {
+ vc.Stop();
- if (IsDevBuild) {
- if (MsgVoiceOff())
- ConLog("* SPU2-X: Voice Off by EndPoint: %d \n", voiceidx);
- }
- }
- } else
- vc.NextA++; // no, don't IncrementNextA here. We haven't read the header yet.
- }
- }
+ if (IsDevBuild)
+ {
+ if (MsgVoiceOff())
+ ConLog("* SPU2-X: Voice Off by EndPoint: %d \n", voiceidx);
+ }
+ }
+ }
+ else
+ vc.NextA++; // no, don't IncrementNextA here. We haven't read the header yet.
+ }
+ }
- if (vc.SCurrent == 28) {
- vc.SCurrent = 0;
+ if (vc.SCurrent == 28)
+ {
+ vc.SCurrent = 0;
- // We'll need the loop flags and buffer pointers regardless of cache status:
+ // We'll need the loop flags and buffer pointers regardless of cache status:
- for (int i = 0; i < 2; i++)
- if (Cores[i].IRQEnable && Cores[i].IRQA == (vc.NextA & 0xFFFF8))
- SetIrqCall(i);
+ for (int i = 0; i < 2; i++)
+ if (Cores[i].IRQEnable && Cores[i].IRQA == (vc.NextA & 0xFFFF8))
+ SetIrqCall(i);
- s16 *memptr = GetMemPtr(vc.NextA & 0xFFFF8);
- vc.LoopFlags = *memptr >> 8; // grab loop flags from the upper byte.
+ s16* memptr = GetMemPtr(vc.NextA & 0xFFFF8);
+ vc.LoopFlags = *memptr >> 8; // grab loop flags from the upper byte.
- if ((vc.LoopFlags & XAFLAG_LOOP_START) && !vc.LoopMode)
- vc.LoopStartA = vc.NextA & 0xFFFF8;
+ if ((vc.LoopFlags & XAFLAG_LOOP_START) && !vc.LoopMode)
+ vc.LoopStartA = vc.NextA & 0xFFFF8;
- const int cacheIdx = vc.NextA / pcm_WordsPerBlock;
- PcmCacheEntry &cacheLine = pcm_cache_data[cacheIdx];
- vc.SBuffer = cacheLine.Sampledata;
+ const int cacheIdx = vc.NextA / pcm_WordsPerBlock;
+ PcmCacheEntry& cacheLine = pcm_cache_data[cacheIdx];
+ vc.SBuffer = cacheLine.Sampledata;
- if (cacheLine.Validated) {
- // Cached block! Read from the cache directly.
- // Make sure to propagate the prev1/prev2 ADPCM:
+ if (cacheLine.Validated)
+ {
+ // Cached block! Read from the cache directly.
+ // Make sure to propagate the prev1/prev2 ADPCM:
- vc.Prev1 = vc.SBuffer[27];
- vc.Prev2 = vc.SBuffer[26];
+ vc.Prev1 = vc.SBuffer[27];
+ vc.Prev2 = vc.SBuffer[26];
- //ConLog( "* SPU2-X: Cache Hit! NextA=0x%x, cacheIdx=0x%x\n", vc.NextA, cacheIdx );
+ //ConLog( "* SPU2-X: Cache Hit! NextA=0x%x, cacheIdx=0x%x\n", vc.NextA, cacheIdx );
- if (IsDevBuild)
- g_counter_cache_hits++;
- } else {
- // Only flag the cache if it's a non-dynamic memory range.
- if (vc.NextA >= SPU2_DYN_MEMLINE)
- cacheLine.Validated = true;
+ if (IsDevBuild)
+ g_counter_cache_hits++;
+ }
+ else
+ {
+ // Only flag the cache if it's a non-dynamic memory range.
+ if (vc.NextA >= SPU2_DYN_MEMLINE)
+ cacheLine.Validated = true;
- if (IsDevBuild) {
- if (vc.NextA < SPU2_DYN_MEMLINE)
- g_counter_cache_ignores++;
- else
- g_counter_cache_misses++;
- }
+ if (IsDevBuild)
+ {
+ if (vc.NextA < SPU2_DYN_MEMLINE)
+ g_counter_cache_ignores++;
+ else
+ g_counter_cache_misses++;
+ }
- XA_decode_block(vc.SBuffer, memptr, vc.Prev1, vc.Prev2);
- }
- }
+ XA_decode_block(vc.SBuffer, memptr, vc.Prev1, vc.Prev2);
+ }
+ }
- return vc.SBuffer[vc.SCurrent++];
+ return vc.SBuffer[vc.SCurrent++];
}
-static __forceinline void GetNextDataDummy(V_Core &thiscore, uint voiceidx)
+static __forceinline void GetNextDataDummy(V_Core& thiscore, uint voiceidx)
{
- V_Voice &vc(thiscore.Voices[voiceidx]);
+ V_Voice& vc(thiscore.Voices[voiceidx]);
- IncrementNextA(thiscore, voiceidx);
+ IncrementNextA(thiscore, voiceidx);
- if ((vc.NextA & 7) == 0) // vc.SCurrent == 24 equivalent
- {
- if (vc.LoopFlags & XAFLAG_LOOP_END) {
- thiscore.Regs.ENDX |= (1 << voiceidx);
- vc.NextA = vc.LoopStartA | 1;
- } else
- vc.NextA++; // no, don't IncrementNextA here. We haven't read the header yet.
- }
+ if ((vc.NextA & 7) == 0) // vc.SCurrent == 24 equivalent
+ {
+ if (vc.LoopFlags & XAFLAG_LOOP_END)
+ {
+ thiscore.Regs.ENDX |= (1 << voiceidx);
+ vc.NextA = vc.LoopStartA | 1;
+ }
+ else
+ vc.NextA++; // no, don't IncrementNextA here. We haven't read the header yet.
+ }
- if (vc.SCurrent == 28) {
- for (int i = 0; i < 2; i++)
- if (Cores[i].IRQEnable && Cores[i].IRQA == (vc.NextA & 0xFFFF8))
- SetIrqCall(i);
+ if (vc.SCurrent == 28)
+ {
+ for (int i = 0; i < 2; i++)
+ if (Cores[i].IRQEnable && Cores[i].IRQA == (vc.NextA & 0xFFFF8))
+ SetIrqCall(i);
- vc.LoopFlags = *GetMemPtr(vc.NextA & 0xFFFF8) >> 8; // grab loop flags from the upper byte.
+ vc.LoopFlags = *GetMemPtr(vc.NextA & 0xFFFF8) >> 8; // grab loop flags from the upper byte.
- if ((vc.LoopFlags & XAFLAG_LOOP_START) && !vc.LoopMode)
- vc.LoopStartA = vc.NextA & 0xFFFF8;
+ if ((vc.LoopFlags & XAFLAG_LOOP_START) && !vc.LoopMode)
+ vc.LoopStartA = vc.NextA & 0xFFFF8;
- vc.SCurrent = 0;
- }
+ vc.SCurrent = 0;
+ }
- vc.SP -= 4096 * (4 - (vc.SCurrent & 3));
- vc.SCurrent += 4 - (vc.SCurrent & 3);
+ vc.SP -= 4096 * (4 - (vc.SCurrent & 3));
+ vc.SCurrent += 4 - (vc.SCurrent & 3);
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -255,12 +271,12 @@ static __forceinline void GetNextDataDummy(V_Core &thiscore, uint voiceidx)
static s32 __forceinline GetNoiseValues()
{
- static u16 lfsr = 0xC0FEu;
+ static u16 lfsr = 0xC0FEu;
- u16 bit = lfsr ^ (lfsr << 3) ^ (lfsr << 4) ^ (lfsr << 5);
- lfsr = (lfsr << 1) | (bit >> 15);
+ u16 bit = lfsr ^ (lfsr << 3) ^ (lfsr << 4) ^ (lfsr << 5);
+ lfsr = (lfsr << 1) | (bit >> 15);
- return (s16)lfsr;
+ return (s16)lfsr;
}
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
@@ -271,60 +287,63 @@ static s32 __forceinline GetNoiseValues()
// Data is shifted up by 1 bit to give the output an effective 16 bit range.
static __forceinline s32 ApplyVolume(s32 data, s32 volume)
{
- //return (volume * data) >> 15;
- return MulShr32(data << 1, volume);
+ //return (volume * data) >> 15;
+ return MulShr32(data << 1, volume);
}
-static __forceinline StereoOut32 ApplyVolume(const StereoOut32 &data, const V_VolumeLR &volume)
+static __forceinline StereoOut32 ApplyVolume(const StereoOut32& data, const V_VolumeLR& volume)
{
- return StereoOut32(
- ApplyVolume(data.Left, volume.Left),
- ApplyVolume(data.Right, volume.Right));
+ return StereoOut32(
+ ApplyVolume(data.Left, volume.Left),
+ ApplyVolume(data.Right, volume.Right));
}
-static __forceinline StereoOut32 ApplyVolume(const StereoOut32 &data, const V_VolumeSlideLR &volume)
+static __forceinline StereoOut32 ApplyVolume(const StereoOut32& data, const V_VolumeSlideLR& volume)
{
- return StereoOut32(
- ApplyVolume(data.Left, volume.Left.Value),
- ApplyVolume(data.Right, volume.Right.Value));
+ return StereoOut32(
+ ApplyVolume(data.Left, volume.Left.Value),
+ ApplyVolume(data.Right, volume.Right.Value));
}
static void __forceinline UpdatePitch(uint coreidx, uint voiceidx)
{
- V_Voice &vc(Cores[coreidx].Voices[voiceidx]);
- s32 pitch;
+ V_Voice& vc(Cores[coreidx].Voices[voiceidx]);
+ s32 pitch;
- // [Air] : re-ordered comparisons: Modulated is much more likely to be zero than voice,
- // and so the way it was before it's have to check both voice and modulated values
- // most of the time. Now it'll just check Modulated and short-circuit past the voice
- // check (not that it amounts to much, but eh every little bit helps).
- if ((vc.Modulated == 0) || (voiceidx == 0))
- pitch = vc.Pitch;
- else
- pitch = GetClamped((vc.Pitch * (32768 + Cores[coreidx].Voices[voiceidx - 1].OutX)) >> 15, 0, 0x3fff);
+ // [Air] : re-ordered comparisons: Modulated is much more likely to be zero than voice,
+ // and so the way it was before it's have to check both voice and modulated values
+ // most of the time. Now it'll just check Modulated and short-circuit past the voice
+ // check (not that it amounts to much, but eh every little bit helps).
+ if ((vc.Modulated == 0) || (voiceidx == 0))
+ pitch = vc.Pitch;
+ else
+ pitch = GetClamped((vc.Pitch * (32768 + Cores[coreidx].Voices[voiceidx - 1].OutX)) >> 15, 0, 0x3fff);
- vc.SP += pitch;
+ vc.SP += pitch;
}
-static __forceinline void CalculateADSR(V_Core &thiscore, uint voiceidx)
+static __forceinline void CalculateADSR(V_Core& thiscore, uint voiceidx)
{
- V_Voice &vc(thiscore.Voices[voiceidx]);
+ V_Voice& vc(thiscore.Voices[voiceidx]);
- if (vc.ADSR.Phase == 0) {
- vc.ADSR.Value = 0;
- return;
- }
+ if (vc.ADSR.Phase == 0)
+ {
+ vc.ADSR.Value = 0;
+ return;
+ }
- if (!vc.ADSR.Calculate()) {
- if (IsDevBuild) {
- if (MsgVoiceOff())
- ConLog("* SPU2-X: Voice Off by ADSR: %d \n", voiceidx);
- }
- vc.Stop();
- }
+ if (!vc.ADSR.Calculate())
+ {
+ if (IsDevBuild)
+ {
+ if (MsgVoiceOff())
+ ConLog("* SPU2-X: Voice Off by ADSR: %d \n", voiceidx);
+ }
+ vc.Stop();
+ }
- pxAssume(vc.ADSR.Value >= 0); // ADSR should never be negative...
+ pxAssume(vc.ADSR.Value >= 0); // ADSR should never be negative...
}
/*
@@ -332,131 +351,134 @@ static __forceinline void CalculateADSR(V_Core &thiscore, uint voiceidx)
*/
template
__forceinline static s32 HermiteInterpolate(
- s32 y0, // 16.0
- s32 y1, // 16.0
- s32 y2, // 16.0
- s32 y3, // 16.0
- s32 mu // 0.12
- )
+ s32 y0, // 16.0
+ s32 y1, // 16.0
+ s32 y2, // 16.0
+ s32 y3, // 16.0
+ s32 mu // 0.12
+)
{
- s32 m00 = ((y1 - y0) * i_tension) >> 16; // 16.0
- s32 m01 = ((y2 - y1) * i_tension) >> 16; // 16.0
- s32 m0 = m00 + m01;
+ s32 m00 = ((y1 - y0) * i_tension) >> 16; // 16.0
+ s32 m01 = ((y2 - y1) * i_tension) >> 16; // 16.0
+ s32 m0 = m00 + m01;
- s32 m10 = ((y2 - y1) * i_tension) >> 16; // 16.0
- s32 m11 = ((y3 - y2) * i_tension) >> 16; // 16.0
- s32 m1 = m10 + m11;
+ s32 m10 = ((y2 - y1) * i_tension) >> 16; // 16.0
+ s32 m11 = ((y3 - y2) * i_tension) >> 16; // 16.0
+ s32 m1 = m10 + m11;
- s32 val = ((2 * y1 + m0 + m1 - 2 * y2) * mu) >> 12; // 16.0
- val = ((val - 3 * y1 - 2 * m0 - m1 + 3 * y2) * mu) >> 12; // 16.0
- val = ((val + m0) * mu) >> 11; // 16.0
+ s32 val = ((2 * y1 + m0 + m1 - 2 * y2) * mu) >> 12; // 16.0
+ val = ((val - 3 * y1 - 2 * m0 - m1 + 3 * y2) * mu) >> 12; // 16.0
+ val = ((val + m0) * mu) >> 11; // 16.0
- return (val + (y1 << 1));
+ return (val + (y1 << 1));
}
__forceinline static s32 CatmullRomInterpolate(
- s32 y0, // 16.0
- s32 y1, // 16.0
- s32 y2, // 16.0
- s32 y3, // 16.0
- s32 mu // 0.12
- )
+ s32 y0, // 16.0
+ s32 y1, // 16.0
+ s32 y2, // 16.0
+ s32 y3, // 16.0
+ s32 mu // 0.12
+)
{
- //q(t) = 0.5 *( (2 * P1) +
- // (-P0 + P2) * t +
- // (2*P0 - 5*P1 + 4*P2 - P3) * t2 +
- // (-P0 + 3*P1- 3*P2 + P3) * t3)
+ //q(t) = 0.5 *( (2 * P1) +
+ // (-P0 + P2) * t +
+ // (2*P0 - 5*P1 + 4*P2 - P3) * t2 +
+ // (-P0 + 3*P1- 3*P2 + P3) * t3)
- s32 a3 = (-y0 + 3 * y1 - 3 * y2 + y3);
- s32 a2 = (2 * y0 - 5 * y1 + 4 * y2 - y3);
- s32 a1 = (-y0 + y2);
- s32 a0 = (2 * y1);
+ s32 a3 = (-y0 + 3 * y1 - 3 * y2 + y3);
+ s32 a2 = (2 * y0 - 5 * y1 + 4 * y2 - y3);
+ s32 a1 = (-y0 + y2);
+ s32 a0 = (2 * y1);
- s32 val = ((a3)*mu) >> 12;
- val = ((a2 + val) * mu) >> 12;
- val = ((a1 + val) * mu) >> 12;
+ s32 val = ((a3)*mu) >> 12;
+ val = ((a2 + val) * mu) >> 12;
+ val = ((a1 + val) * mu) >> 12;
- return (a0 + val);
+ return (a0 + val);
}
__forceinline static s32 CubicInterpolate(
- s32 y0, // 16.0
- s32 y1, // 16.0
- s32 y2, // 16.0
- s32 y3, // 16.0
- s32 mu // 0.12
- )
+ s32 y0, // 16.0
+ s32 y1, // 16.0
+ s32 y2, // 16.0
+ s32 y3, // 16.0
+ s32 mu // 0.12
+)
{
- const s32 a0 = y3 - y2 - y0 + y1;
- const s32 a1 = y0 - y1 - a0;
- const s32 a2 = y2 - y0;
+ const s32 a0 = y3 - y2 - y0 + y1;
+ const s32 a1 = y0 - y1 - a0;
+ const s32 a2 = y2 - y0;
- s32 val = ((a0)*mu) >> 12;
- val = ((val + a1) * mu) >> 12;
- val = ((val + a2) * mu) >> 11;
+ s32 val = ((a0)*mu) >> 12;
+ val = ((val + a1) * mu) >> 12;
+ val = ((val + a2) * mu) >> 11;
- return (val + (y1 << 1));
+ return (val + (y1 << 1));
}
// Returns a 16 bit result in Value.
// Uses standard template-style optimization techniques to statically generate five different
// versions of this function (one for each type of interpolation).
template
-static __forceinline s32 GetVoiceValues(V_Core &thiscore, uint voiceidx)
+static __forceinline s32 GetVoiceValues(V_Core& thiscore, uint voiceidx)
{
- V_Voice &vc(thiscore.Voices[voiceidx]);
+ V_Voice& vc(thiscore.Voices[voiceidx]);
- while (vc.SP > 0) {
- if (InterpType >= 2) {
- vc.PV4 = vc.PV3;
- vc.PV3 = vc.PV2;
- }
- vc.PV2 = vc.PV1;
- vc.PV1 = GetNextDataBuffered(thiscore, voiceidx);
- vc.SP -= 4096;
- }
+ while (vc.SP > 0)
+ {
+ if (InterpType >= 2)
+ {
+ vc.PV4 = vc.PV3;
+ vc.PV3 = vc.PV2;
+ }
+ vc.PV2 = vc.PV1;
+ vc.PV1 = GetNextDataBuffered(thiscore, voiceidx);
+ vc.SP -= 4096;
+ }
- const s32 mu = vc.SP + 4096;
+ const s32 mu = vc.SP + 4096;
- switch (InterpType) {
- case 0:
- return vc.PV1 << 1;
- case 1:
- return (vc.PV1 << 1) - (((vc.PV2 - vc.PV1) * vc.SP) >> 11);
+ switch (InterpType)
+ {
+ case 0:
+ return vc.PV1 << 1;
+ case 1:
+ return (vc.PV1 << 1) - (((vc.PV2 - vc.PV1) * vc.SP) >> 11);
- case 2:
- return CubicInterpolate(vc.PV4, vc.PV3, vc.PV2, vc.PV1, mu);
- case 3:
- return HermiteInterpolate<16384>(vc.PV4, vc.PV3, vc.PV2, vc.PV1, mu);
- case 4:
- return CatmullRomInterpolate(vc.PV4, vc.PV3, vc.PV2, vc.PV1, mu);
+ case 2:
+ return CubicInterpolate(vc.PV4, vc.PV3, vc.PV2, vc.PV1, mu);
+ case 3:
+ return HermiteInterpolate<16384>(vc.PV4, vc.PV3, vc.PV2, vc.PV1, mu);
+ case 4:
+ return CatmullRomInterpolate(vc.PV4, vc.PV3, vc.PV2, vc.PV1, mu);
- jNO_DEFAULT;
- }
+ jNO_DEFAULT;
+ }
- return 0; // technically unreachable!
+ return 0; // technically unreachable!
}
// Noise values need to be mixed without going through interpolation, since it
// can wreak havoc on the noise (causing muffling or popping). Not that this noise
// generator is accurate in its own right.. but eh, ah well :)
-static __forceinline s32 GetNoiseValues(V_Core &thiscore, uint voiceidx)
+static __forceinline s32 GetNoiseValues(V_Core& thiscore, uint voiceidx)
{
- // V_Voice &vc(thiscore.Voices[voiceidx]);
+ // V_Voice &vc(thiscore.Voices[voiceidx]);
- s32 retval = GetNoiseValues();
+ s32 retval = GetNoiseValues();
- /*while(vc.SP>=4096)
+ /*while(vc.SP>=4096)
{
retval = GetNoiseValues();
vc.SP-=4096;
}*/
- // GetNoiseValues can't set the phase zero on us unexpectedly
- // like GetVoiceValues can. Better assert just in case though..
- // pxAssume(vc.ADSR.Phase != 0);
+ // GetNoiseValues can't set the phase zero on us unexpectedly
+ // like GetVoiceValues can. Better assert just in case though..
+ // pxAssume(vc.ADSR.Phase != 0);
- return retval;
+ return retval;
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -468,305 +490,315 @@ static __forceinline s32 GetNoiseValues(V_Core &thiscore, uint voiceidx)
// of the SPU2 (between 0x0000 and SPU2_DYN_MEMLINE)
static __forceinline void spu2M_WriteFast(u32 addr, s16 value)
{
- // Fixes some of the oldest hangs in pcsx2's history! :p
- for (int i = 0; i < 2; i++) {
- if (Cores[i].IRQEnable && Cores[i].IRQA == addr) {
- //printf("Core %d special write IRQ Called (IRQ passed). IRQA = %x\n",i,addr);
- SetIrqCall(i);
- }
- }
+ // Fixes some of the oldest hangs in pcsx2's history! :p
+ for (int i = 0; i < 2; i++)
+ {
+ if (Cores[i].IRQEnable && Cores[i].IRQA == addr)
+ {
+ //printf("Core %d special write IRQ Called (IRQ passed). IRQA = %x\n",i,addr);
+ SetIrqCall(i);
+ }
+ }
// throw an assertion if the memory range is invalid:
#ifndef DEBUG_FAST
- pxAssume(addr < SPU2_DYN_MEMLINE);
+ pxAssume(addr < SPU2_DYN_MEMLINE);
#endif
- *GetMemPtr(addr) = value;
+ *GetMemPtr(addr) = value;
}
static __forceinline StereoOut32 MixVoice(uint coreidx, uint voiceidx)
{
- V_Core &thiscore(Cores[coreidx]);
- V_Voice &vc(thiscore.Voices[voiceidx]);
+ V_Core& thiscore(Cores[coreidx]);
+ V_Voice& vc(thiscore.Voices[voiceidx]);
- // If this assertion fails, it mans SCurrent is being corrupted somewhere, or is not initialized
- // properly. Invalid values in SCurrent will cause errant IRQs and corrupted audio.
- pxAssertMsg((vc.SCurrent <= 28) && (vc.SCurrent != 0), "Current sample should always range from 1->28");
+ // If this assertion fails, it mans SCurrent is being corrupted somewhere, or is not initialized
+ // properly. Invalid values in SCurrent will cause errant IRQs and corrupted audio.
+ pxAssertMsg((vc.SCurrent <= 28) && (vc.SCurrent != 0), "Current sample should always range from 1->28");
- // Most games don't use much volume slide effects. So only call the UpdateVolume
- // methods when needed by checking the flag outside the method here...
- // (Note: Ys 6 : Ark of Nephistm uses these effects)
+ // Most games don't use much volume slide effects. So only call the UpdateVolume
+ // methods when needed by checking the flag outside the method here...
+ // (Note: Ys 6 : Ark of Nephistm uses these effects)
- vc.Volume.Update();
+ vc.Volume.Update();
- // SPU2 Note: The spu2 continues to process voices for eternity, always, so we
- // have to run through all the motions of updating the voice regardless of it's
- // audible status. Otherwise IRQs might not trigger and emulation might fail.
+ // SPU2 Note: The spu2 continues to process voices for eternity, always, so we
+ // have to run through all the motions of updating the voice regardless of it's
+ // audible status. Otherwise IRQs might not trigger and emulation might fail.
- if (vc.ADSR.Phase > 0) {
- UpdatePitch(coreidx, voiceidx);
+ if (vc.ADSR.Phase > 0)
+ {
+ UpdatePitch(coreidx, voiceidx);
- s32 Value = 0;
+ s32 Value = 0;
- if (vc.Noise)
- Value = GetNoiseValues(thiscore, voiceidx);
- else {
- // Optimization : Forceinline'd Templated Dispatch Table. Any halfwit compiler will
- // turn this into a clever jump dispatch table (no call/rets, no compares, uber-efficient!)
+ if (vc.Noise)
+ Value = GetNoiseValues(thiscore, voiceidx);
+ else
+ {
+ // Optimization : Forceinline'd Templated Dispatch Table. Any halfwit compiler will
+ // turn this into a clever jump dispatch table (no call/rets, no compares, uber-efficient!)
- switch (Interpolation) {
- case 0:
- Value = GetVoiceValues<0>(thiscore, voiceidx);
- break;
- case 1:
- Value = GetVoiceValues<1>(thiscore, voiceidx);
- break;
- case 2:
- Value = GetVoiceValues<2>(thiscore, voiceidx);
- break;
- case 3:
- Value = GetVoiceValues<3>(thiscore, voiceidx);
- break;
- case 4:
- Value = GetVoiceValues<4>(thiscore, voiceidx);
- break;
+ switch (Interpolation)
+ {
+ case 0:
+ Value = GetVoiceValues<0>(thiscore, voiceidx);
+ break;
+ case 1:
+ Value = GetVoiceValues<1>(thiscore, voiceidx);
+ break;
+ case 2:
+ Value = GetVoiceValues<2>(thiscore, voiceidx);
+ break;
+ case 3:
+ Value = GetVoiceValues<3>(thiscore, voiceidx);
+ break;
+ case 4:
+ Value = GetVoiceValues<4>(thiscore, voiceidx);
+ break;
- jNO_DEFAULT;
- }
- }
+ jNO_DEFAULT;
+ }
+ }
- // Update and Apply ADSR (applies to normal and noise sources)
- //
- // Note! It's very important that ADSR stay as accurate as possible. By the way
- // it is used, various sound effects can end prematurely if we truncate more than
- // one or two bits. Best result comes from no truncation at all, which is why we
- // use a full 64-bit multiply/result here.
+ // Update and Apply ADSR (applies to normal and noise sources)
+ //
+ // Note! It's very important that ADSR stay as accurate as possible. By the way
+ // it is used, various sound effects can end prematurely if we truncate more than
+ // one or two bits. Best result comes from no truncation at all, which is why we
+ // use a full 64-bit multiply/result here.
- CalculateADSR(thiscore, voiceidx);
- Value = MulShr32(Value, vc.ADSR.Value);
+ CalculateADSR(thiscore, voiceidx);
+ Value = MulShr32(Value, vc.ADSR.Value);
- // Store Value for eventual modulation later
- // Pseudonym's Crest calculation idea. Actually calculates a crest, unlike the old code which was just peak.
- if (vc.PV1 < vc.NextCrest) {
- vc.OutX = MulShr32(vc.NextCrest, vc.ADSR.Value);
- vc.NextCrest = -0x8000;
- }
- if (vc.PV1 > vc.PV2) {
- vc.NextCrest = vc.PV1;
- }
+ // Store Value for eventual modulation later
+ // Pseudonym's Crest calculation idea. Actually calculates a crest, unlike the old code which was just peak.
+ if (vc.PV1 < vc.NextCrest)
+ {
+ vc.OutX = MulShr32(vc.NextCrest, vc.ADSR.Value);
+ vc.NextCrest = -0x8000;
+ }
+ if (vc.PV1 > vc.PV2)
+ {
+ vc.NextCrest = vc.PV1;
+ }
- if (IsDevBuild)
- DebugCores[coreidx].Voices[voiceidx].displayPeak = std::max(DebugCores[coreidx].Voices[voiceidx].displayPeak, (s32)vc.OutX);
+ if (IsDevBuild)
+ DebugCores[coreidx].Voices[voiceidx].displayPeak = std::max(DebugCores[coreidx].Voices[voiceidx].displayPeak, (s32)vc.OutX);
- // Write-back of raw voice data (post ADSR applied)
+ // Write-back of raw voice data (post ADSR applied)
- if (voiceidx == 1)
- spu2M_WriteFast(((0 == coreidx) ? 0x400 : 0xc00) + OutPos, vc.OutX);
- else if (voiceidx == 3)
- spu2M_WriteFast(((0 == coreidx) ? 0x600 : 0xe00) + OutPos, vc.OutX);
+ if (voiceidx == 1)
+ spu2M_WriteFast(((0 == coreidx) ? 0x400 : 0xc00) + OutPos, vc.OutX);
+ else if (voiceidx == 3)
+ spu2M_WriteFast(((0 == coreidx) ? 0x600 : 0xe00) + OutPos, vc.OutX);
- return ApplyVolume(StereoOut32(Value, Value), vc.Volume);
- } else {
- // Continue processing voice, even if it's "off". Or else we miss interrupts! (Fatal Frame engine died because of this.)
- if (NEVER_SKIP_VOICES || (*GetMemPtr(vc.NextA & 0xFFFF8) >> 8 & 3) != 3 || vc.LoopStartA != (vc.NextA & ~7) // not in a tight loop
- || (Cores[0].IRQEnable && (Cores[0].IRQA & ~7) == vc.LoopStartA) // or should be interrupting regularly
- || (Cores[1].IRQEnable && (Cores[1].IRQA & ~7) == vc.LoopStartA) || !(thiscore.Regs.ENDX & 1 << voiceidx)) // or isn't currently flagged as having passed the endpoint
- {
- UpdatePitch(coreidx, voiceidx);
+ return ApplyVolume(StereoOut32(Value, Value), vc.Volume);
+ }
+ else
+ {
+ // Continue processing voice, even if it's "off". Or else we miss interrupts! (Fatal Frame engine died because of this.)
+ if (NEVER_SKIP_VOICES || (*GetMemPtr(vc.NextA & 0xFFFF8) >> 8 & 3) != 3 || vc.LoopStartA != (vc.NextA & ~7) // not in a tight loop
+ || (Cores[0].IRQEnable && (Cores[0].IRQA & ~7) == vc.LoopStartA) // or should be interrupting regularly
+ || (Cores[1].IRQEnable && (Cores[1].IRQA & ~7) == vc.LoopStartA) || !(thiscore.Regs.ENDX & 1 << voiceidx)) // or isn't currently flagged as having passed the endpoint
+ {
+ UpdatePitch(coreidx, voiceidx);
- while (vc.SP > 0)
- GetNextDataDummy(thiscore, voiceidx); // Dummy is enough
- }
+ while (vc.SP > 0)
+ GetNextDataDummy(thiscore, voiceidx); // Dummy is enough
+ }
- // Write-back of raw voice data (some zeros since the voice is "dead")
- if (voiceidx == 1)
- spu2M_WriteFast(((0 == coreidx) ? 0x400 : 0xc00) + OutPos, 0);
- else if (voiceidx == 3)
- spu2M_WriteFast(((0 == coreidx) ? 0x600 : 0xe00) + OutPos, 0);
+ // Write-back of raw voice data (some zeros since the voice is "dead")
+ if (voiceidx == 1)
+ spu2M_WriteFast(((0 == coreidx) ? 0x400 : 0xc00) + OutPos, 0);
+ else if (voiceidx == 3)
+ spu2M_WriteFast(((0 == coreidx) ? 0x600 : 0xe00) + OutPos, 0);
- return StereoOut32(0, 0);
- }
+ return StereoOut32(0, 0);
+ }
}
const VoiceMixSet VoiceMixSet::Empty((StereoOut32()), (StereoOut32())); // Don't use SteroOut32::Empty because C++ doesn't make any dep/order checks on global initializers.
-static __forceinline void MixCoreVoices(VoiceMixSet &dest, const uint coreidx)
+static __forceinline void MixCoreVoices(VoiceMixSet& dest, const uint coreidx)
{
- V_Core &thiscore(Cores[coreidx]);
+ V_Core& thiscore(Cores[coreidx]);
- for (uint voiceidx = 0; voiceidx < V_Core::NumVoices; ++voiceidx) {
- StereoOut32 VVal(MixVoice(coreidx, voiceidx));
+ for (uint voiceidx = 0; voiceidx < V_Core::NumVoices; ++voiceidx)
+ {
+ StereoOut32 VVal(MixVoice(coreidx, voiceidx));
- // Note: Results from MixVoice are ranged at 16 bits.
+ // Note: Results from MixVoice are ranged at 16 bits.
- dest.Dry.Left += VVal.Left & thiscore.VoiceGates[voiceidx].DryL;
- dest.Dry.Right += VVal.Right & thiscore.VoiceGates[voiceidx].DryR;
- dest.Wet.Left += VVal.Left & thiscore.VoiceGates[voiceidx].WetL;
- dest.Wet.Right += VVal.Right & thiscore.VoiceGates[voiceidx].WetR;
- }
+ dest.Dry.Left += VVal.Left & thiscore.VoiceGates[voiceidx].DryL;
+ dest.Dry.Right += VVal.Right & thiscore.VoiceGates[voiceidx].DryR;
+ dest.Wet.Left += VVal.Left & thiscore.VoiceGates[voiceidx].WetL;
+ dest.Wet.Right += VVal.Right & thiscore.VoiceGates[voiceidx].WetR;
+ }
}
-StereoOut32 V_Core::Mix(const VoiceMixSet &inVoices, const StereoOut32 &Input, const StereoOut32 &Ext)
+StereoOut32 V_Core::Mix(const VoiceMixSet& inVoices, const StereoOut32& Input, const StereoOut32& Ext)
{
- MasterVol.Update();
+ MasterVol.Update();
- // Saturate final result to standard 16 bit range.
- const VoiceMixSet Voices(clamp_mix(inVoices.Dry), clamp_mix(inVoices.Wet));
+ // Saturate final result to standard 16 bit range.
+ const VoiceMixSet Voices(clamp_mix(inVoices.Dry), clamp_mix(inVoices.Wet));
- // Write Mixed results To Output Area
- spu2M_WriteFast(((0 == Index) ? 0x1000 : 0x1800) + OutPos, Voices.Dry.Left);
- spu2M_WriteFast(((0 == Index) ? 0x1200 : 0x1A00) + OutPos, Voices.Dry.Right);
- spu2M_WriteFast(((0 == Index) ? 0x1400 : 0x1C00) + OutPos, Voices.Wet.Left);
- spu2M_WriteFast(((0 == Index) ? 0x1600 : 0x1E00) + OutPos, Voices.Wet.Right);
+ // Write Mixed results To Output Area
+ spu2M_WriteFast(((0 == Index) ? 0x1000 : 0x1800) + OutPos, Voices.Dry.Left);
+ spu2M_WriteFast(((0 == Index) ? 0x1200 : 0x1A00) + OutPos, Voices.Dry.Right);
+ spu2M_WriteFast(((0 == Index) ? 0x1400 : 0x1C00) + OutPos, Voices.Wet.Left);
+ spu2M_WriteFast(((0 == Index) ? 0x1600 : 0x1E00) + OutPos, Voices.Wet.Right);
- // Write mixed results to logfile (if enabled)
+ // Write mixed results to logfile (if enabled)
- WaveDump::WriteCore(Index, CoreSrc_DryVoiceMix, Voices.Dry);
- WaveDump::WriteCore(Index, CoreSrc_WetVoiceMix, Voices.Wet);
+ WaveDump::WriteCore(Index, CoreSrc_DryVoiceMix, Voices.Dry);
+ WaveDump::WriteCore(Index, CoreSrc_WetVoiceMix, Voices.Wet);
- // Mix in the Input data
+ // Mix in the Input data
- StereoOut32 TD(
- Input.Left & DryGate.InpL,
- Input.Right & DryGate.InpR);
+ StereoOut32 TD(
+ Input.Left & DryGate.InpL,
+ Input.Right & DryGate.InpR);
- // Mix in the Voice data
- TD.Left += Voices.Dry.Left & DryGate.SndL;
- TD.Right += Voices.Dry.Right & DryGate.SndR;
+ // Mix in the Voice data
+ TD.Left += Voices.Dry.Left & DryGate.SndL;
+ TD.Right += Voices.Dry.Right & DryGate.SndR;
- // Mix in the External (nothing/core0) data
- TD.Left += Ext.Left & DryGate.ExtL;
- TD.Right += Ext.Right & DryGate.ExtR;
+ // Mix in the External (nothing/core0) data
+ TD.Left += Ext.Left & DryGate.ExtL;
+ TD.Right += Ext.Right & DryGate.ExtR;
- // User-level Effects disabling. Nice speedup but breaks games that depend on
- // reverb IRQs (very few -- if you find one name it here!).
- if (EffectsDisabled)
- return TD;
+ // User-level Effects disabling. Nice speedup but breaks games that depend on
+ // reverb IRQs (very few -- if you find one name it here!).
+ if (EffectsDisabled)
+ return TD;
- // ----------------------------------------------------------------------------
- // Reverberation Effects Processing
- // ----------------------------------------------------------------------------
- // SPU2 has an FxEnable bit which seems to disable all reverb processing *and*
- // output, but does *not* disable the advancing buffers. IRQs are not triggered
- // and reverb is rendered silent.
- //
- // Technically we should advance the buffers even when fx are disabled. However
- // there are two things that make this very unlikely to matter:
- //
- // 1. Any SPU2 app wanting to avoid noise or pops needs to clear the reverb buffers
- // when adjusting settings anyway; so the read/write positions in the reverb
- // buffer after FxEnabled is set back to 1 doesn't really matter.
- //
- // 2. Writes to ESA (and possibly EEA) reset the buffer pointers to 0.
- //
- // On the other hand, updating the buffer is cheap and easy, so might as well. ;)
+ // ----------------------------------------------------------------------------
+ // Reverberation Effects Processing
+ // ----------------------------------------------------------------------------
+ // SPU2 has an FxEnable bit which seems to disable all reverb processing *and*
+ // output, but does *not* disable the advancing buffers. IRQs are not triggered
+ // and reverb is rendered silent.
+ //
+ // Technically we should advance the buffers even when fx are disabled. However
+ // there are two things that make this very unlikely to matter:
+ //
+ // 1. Any SPU2 app wanting to avoid noise or pops needs to clear the reverb buffers
+ // when adjusting settings anyway; so the read/write positions in the reverb
+ // buffer after FxEnabled is set back to 1 doesn't really matter.
+ //
+ // 2. Writes to ESA (and possibly EEA) reset the buffer pointers to 0.
+ //
+ // On the other hand, updating the buffer is cheap and easy, so might as well. ;)
- Reverb_AdvanceBuffer(); // Updates the reverb work area as well, if needed.
+ Reverb_AdvanceBuffer(); // Updates the reverb work area as well, if needed.
- // ToDo:
- // Bad EndA causes memory corruption. Bad for us, unknown on PS2!
- // According to no$psx, effects always run but don't always write back, so the FxEnable check may be wrong
- if (!FxEnable || EffectsEndA >= 0x100000)
- return TD;
+ // ToDo:
+ // Bad EndA causes memory corruption. Bad for us, unknown on PS2!
+ // According to no$psx, effects always run but don't always write back, so the FxEnable check may be wrong
+ if (!FxEnable || EffectsEndA >= 0x100000)
+ return TD;
- StereoOut32 TW;
+ StereoOut32 TW;
- // Mix Input, Voice, and External data:
+ // Mix Input, Voice, and External data:
- TW.Left = Input.Left & WetGate.InpL;
- TW.Right = Input.Right & WetGate.InpR;
+ TW.Left = Input.Left & WetGate.InpL;
+ TW.Right = Input.Right & WetGate.InpR;
- TW.Left += Voices.Wet.Left & WetGate.SndL;
- TW.Right += Voices.Wet.Right & WetGate.SndR;
- TW.Left += Ext.Left & WetGate.ExtL;
- TW.Right += Ext.Right & WetGate.ExtR;
+ TW.Left += Voices.Wet.Left & WetGate.SndL;
+ TW.Right += Voices.Wet.Right & WetGate.SndR;
+ TW.Left += Ext.Left & WetGate.ExtL;
+ TW.Right += Ext.Right & WetGate.ExtR;
- WaveDump::WriteCore(Index, CoreSrc_PreReverb, TW);
+ WaveDump::WriteCore(Index, CoreSrc_PreReverb, TW);
- StereoOut32 RV = DoReverb(TW);
+ StereoOut32 RV = DoReverb(TW);
- WaveDump::WriteCore(Index, CoreSrc_PostReverb, RV);
+ WaveDump::WriteCore(Index, CoreSrc_PostReverb, RV);
- // Mix Dry + Wet
- // (master volume is applied later to the result of both outputs added together).
- return TD + ApplyVolume(RV, FxVol);
+ // Mix Dry + Wet
+ // (master volume is applied later to the result of both outputs added together).
+ return TD + ApplyVolume(RV, FxVol);
}
// Filters that work on the final output to de-alias and equlize it.
// Taken from http://nenolod.net/projects/upse/
#define OVERALL_SCALE (0.87f)
-StereoOut32 Apply_Frequency_Response_Filter(StereoOut32 &SoundStream)
+StereoOut32 Apply_Frequency_Response_Filter(StereoOut32& SoundStream)
{
- static FrequencyResponseFilter FRF = FrequencyResponseFilter();
+ static FrequencyResponseFilter FRF = FrequencyResponseFilter();
- s32 in, out;
- s32 l, r;
- s32 mid, side;
+ s32 in, out;
+ s32 l, r;
+ s32 mid, side;
- l = SoundStream.Left;
- r = SoundStream.Right;
+ l = SoundStream.Left;
+ r = SoundStream.Right;
- mid = l + r;
- side = l - r;
+ mid = l + r;
+ side = l - r;
- in = mid;
- out = FRF.la0 * in + FRF.la1 * FRF.lx1 + FRF.la2 * FRF.lx2 - FRF.lb1 * FRF.ly1 - FRF.lb2 * FRF.ly2;
+ in = mid;
+ out = FRF.la0 * in + FRF.la1 * FRF.lx1 + FRF.la2 * FRF.lx2 - FRF.lb1 * FRF.ly1 - FRF.lb2 * FRF.ly2;
- FRF.lx2 = FRF.lx1;
- FRF.lx1 = in;
+ FRF.lx2 = FRF.lx1;
+ FRF.lx1 = in;
- FRF.ly2 = FRF.ly1;
- FRF.ly1 = out;
+ FRF.ly2 = FRF.ly1;
+ FRF.ly1 = out;
- mid = out;
+ mid = out;
- l = ((0.5) * (OVERALL_SCALE)) * (mid + side);
- r = ((0.5) * (OVERALL_SCALE)) * (mid - side);
+ l = ((0.5) * (OVERALL_SCALE)) * (mid + side);
+ r = ((0.5) * (OVERALL_SCALE)) * (mid - side);
- in = l;
- out = FRF.ha0 * in + FRF.ha1 * FRF.History_One_In.Left + FRF.ha2 * FRF.History_Two_In.Left - FRF.hb1 * FRF.History_One_Out.Left - FRF.hb2 * FRF.History_Two_Out.Left;
- FRF.History_Two_In.Left = FRF.History_One_In.Left;
- FRF.History_One_In.Left = in;
- FRF.History_Two_Out.Left = FRF.History_One_Out.Left;
- FRF.History_One_Out.Left = out;
- l = out;
+ in = l;
+ out = FRF.ha0 * in + FRF.ha1 * FRF.History_One_In.Left + FRF.ha2 * FRF.History_Two_In.Left - FRF.hb1 * FRF.History_One_Out.Left - FRF.hb2 * FRF.History_Two_Out.Left;
+ FRF.History_Two_In.Left = FRF.History_One_In.Left;
+ FRF.History_One_In.Left = in;
+ FRF.History_Two_Out.Left = FRF.History_One_Out.Left;
+ FRF.History_One_Out.Left = out;
+ l = out;
- in = r;
- out = FRF.ha0 * in + FRF.ha1 * FRF.History_One_In.Right + FRF.ha2 * FRF.History_Two_In.Right - FRF.hb1 * FRF.History_One_Out.Right - FRF.hb2 * FRF.History_Two_Out.Right;
- FRF.History_Two_In.Right = FRF.History_One_In.Right;
- FRF.History_One_In.Right = in;
- FRF.History_Two_Out.Right = FRF.History_One_Out.Right;
- FRF.History_One_Out.Right = out;
- r = out;
+ in = r;
+ out = FRF.ha0 * in + FRF.ha1 * FRF.History_One_In.Right + FRF.ha2 * FRF.History_Two_In.Right - FRF.hb1 * FRF.History_One_Out.Right - FRF.hb2 * FRF.History_Two_Out.Right;
+ FRF.History_Two_In.Right = FRF.History_One_In.Right;
+ FRF.History_One_In.Right = in;
+ FRF.History_Two_Out.Right = FRF.History_One_Out.Right;
+ FRF.History_One_Out.Right = out;
+ r = out;
- //clamp_mix(l);
- //clamp_mix(r);
+ //clamp_mix(l);
+ //clamp_mix(r);
- SoundStream.Left = l;
- SoundStream.Right = r;
+ SoundStream.Left = l;
+ SoundStream.Right = r;
- return SoundStream;
+ return SoundStream;
}
-StereoOut32 Apply_Dealias_Filter(StereoOut32 &SoundStream)
+StereoOut32 Apply_Dealias_Filter(StereoOut32& SoundStream)
{
- static StereoOut32 Old = StereoOut32::Empty;
+ static StereoOut32 Old = StereoOut32::Empty;
- s32 l, r;
+ s32 l, r;
- l = SoundStream.Left;
- r = SoundStream.Right;
+ l = SoundStream.Left;
+ r = SoundStream.Right;
- l += (l - Old.Left);
- r += (r - Old.Right);
+ l += (l - Old.Left);
+ r += (r - Old.Right);
- Old.Left = SoundStream.Left;
- Old.Right = SoundStream.Right;
+ Old.Left = SoundStream.Left;
+ Old.Right = SoundStream.Right;
- SoundStream.Left = l;
- SoundStream.Right = r;
+ SoundStream.Left = l;
+ SoundStream.Right = r;
- return SoundStream;
+ return SoundStream;
}
// used to throttle the output rate of cache stat reports
@@ -777,102 +809,109 @@ static int p_cachestat_counter = 0;
#ifndef __POSIX__
__forceinline
#endif
- void
- Mix()
+ void
+ Mix()
{
- // Note: Playmode 4 is SPDIF, which overrides other inputs.
- StereoOut32 InputData[2] =
- {
- // SPDIF is on Core 0:
- // Fixme:
- // 1. We do not have an AC3 decoder for the bitstream.
- // 2. Games usually provide a normal ADMA stream as well and want to see it getting read!
- /*(PlayMode&4) ? StereoOut32::Empty : */ ApplyVolume(Cores[0].ReadInput(), Cores[0].InpVol),
+ // Note: Playmode 4 is SPDIF, which overrides other inputs.
+ StereoOut32 InputData[2] =
+ {
+ // SPDIF is on Core 0:
+ // Fixme:
+ // 1. We do not have an AC3 decoder for the bitstream.
+ // 2. Games usually provide a normal ADMA stream as well and want to see it getting read!
+ /*(PlayMode&4) ? StereoOut32::Empty : */ ApplyVolume(Cores[0].ReadInput(), Cores[0].InpVol),
- // CDDA is on Core 1:
- (PlayMode & 8) ? StereoOut32::Empty : ApplyVolume(Cores[1].ReadInput(), Cores[1].InpVol)};
+ // CDDA is on Core 1:
+ (PlayMode & 8) ? StereoOut32::Empty : ApplyVolume(Cores[1].ReadInput(), Cores[1].InpVol)};
- WaveDump::WriteCore(0, CoreSrc_Input, InputData[0]);
- WaveDump::WriteCore(1, CoreSrc_Input, InputData[1]);
+ WaveDump::WriteCore(0, CoreSrc_Input, InputData[0]);
+ WaveDump::WriteCore(1, CoreSrc_Input, InputData[1]);
- // Todo: Replace me with memzero initializer!
- VoiceMixSet VoiceData[2] = {VoiceMixSet::Empty, VoiceMixSet::Empty}; // mixed voice data for each core.
- MixCoreVoices(VoiceData[0], 0);
- MixCoreVoices(VoiceData[1], 1);
+ // Todo: Replace me with memzero initializer!
+ VoiceMixSet VoiceData[2] = {VoiceMixSet::Empty, VoiceMixSet::Empty}; // mixed voice data for each core.
+ MixCoreVoices(VoiceData[0], 0);
+ MixCoreVoices(VoiceData[1], 1);
- StereoOut32 Ext(Cores[0].Mix(VoiceData[0], InputData[0], StereoOut32::Empty));
+ StereoOut32 Ext(Cores[0].Mix(VoiceData[0], InputData[0], StereoOut32::Empty));
- if ((PlayMode & 4) || (Cores[0].Mute != 0))
- Ext = StereoOut32::Empty;
- else {
- Ext = clamp_mix(ApplyVolume(Ext, Cores[0].MasterVol));
- }
+ if ((PlayMode & 4) || (Cores[0].Mute != 0))
+ Ext = StereoOut32::Empty;
+ else
+ {
+ Ext = clamp_mix(ApplyVolume(Ext, Cores[0].MasterVol));
+ }
- // Commit Core 0 output to ram before mixing Core 1:
- spu2M_WriteFast(0x800 + OutPos, Ext.Left);
- spu2M_WriteFast(0xA00 + OutPos, Ext.Right);
+ // Commit Core 0 output to ram before mixing Core 1:
+ spu2M_WriteFast(0x800 + OutPos, Ext.Left);
+ spu2M_WriteFast(0xA00 + OutPos, Ext.Right);
- WaveDump::WriteCore(0, CoreSrc_External, Ext);
+ WaveDump::WriteCore(0, CoreSrc_External, Ext);
- Ext = ApplyVolume(Ext, Cores[1].ExtVol);
- StereoOut32 Out(Cores[1].Mix(VoiceData[1], InputData[1], Ext));
+ Ext = ApplyVolume(Ext, Cores[1].ExtVol);
+ StereoOut32 Out(Cores[1].Mix(VoiceData[1], InputData[1], Ext));
- if (PlayMode & 8) {
- // Experimental CDDA support
- // The CDDA overrides all other mixer output. It's a direct feed!
+ if (PlayMode & 8)
+ {
+ // Experimental CDDA support
+ // The CDDA overrides all other mixer output. It's a direct feed!
- Out = Cores[1].ReadInput_HiFi();
- //WaveLog::WriteCore( 1, "CDDA-32", OutL, OutR );
- } else {
- Out.Left = MulShr32(Out.Left << (SndOutVolumeShift + 1), Cores[1].MasterVol.Left.Value);
- Out.Right = MulShr32(Out.Right << (SndOutVolumeShift + 1), Cores[1].MasterVol.Right.Value);
+ Out = Cores[1].ReadInput_HiFi();
+ //WaveLog::WriteCore( 1, "CDDA-32", OutL, OutR );
+ }
+ else
+ {
+ Out.Left = MulShr32(Out.Left << (SndOutVolumeShift + 1), Cores[1].MasterVol.Left.Value);
+ Out.Right = MulShr32(Out.Right << (SndOutVolumeShift + 1), Cores[1].MasterVol.Right.Value);
#ifdef DEBUG_KEYS
- if (postprocess_filter_enabled)
+ if (postprocess_filter_enabled)
#endif
- {
- if (postprocess_filter_dealias) {
- // Dealias filter emphasizes the highs too much.
- Out = Apply_Dealias_Filter(Out);
- }
- Out = Apply_Frequency_Response_Filter(Out);
- }
+ {
+ if (postprocess_filter_dealias)
+ {
+ // Dealias filter emphasizes the highs too much.
+ Out = Apply_Dealias_Filter(Out);
+ }
+ Out = Apply_Frequency_Response_Filter(Out);
+ }
- // Final Clamp!
- // Like any good audio system, the PS2 pumps the volume and incurs some distortion in its
- // output, giving us a nice thumpy sound at times. So we add 1 above (2x volume pump) and
- // then clamp it all here.
+ // Final Clamp!
+ // Like any good audio system, the PS2 pumps the volume and incurs some distortion in its
+ // output, giving us a nice thumpy sound at times. So we add 1 above (2x volume pump) and
+ // then clamp it all here.
- // Edit: I'm sorry Jake, but I know of no good audio system that arbitrary distorts and clips
- // output by design.
- // Good thing though that this code gets the volume exactly right, as per tests :)
- Out = clamp_mix(Out, SndOutVolumeShift);
- }
+ // Edit: I'm sorry Jake, but I know of no good audio system that arbitrary distorts and clips
+ // output by design.
+ // Good thing though that this code gets the volume exactly right, as per tests :)
+ Out = clamp_mix(Out, SndOutVolumeShift);
+ }
- // Configurable output volume
- Out.Left *= FinalVolume;
- Out.Right *= FinalVolume;
+ // Configurable output volume
+ Out.Left *= FinalVolume;
+ Out.Right *= FinalVolume;
- SndBuffer::Write(Out);
+ SndBuffer::Write(Out);
- // Update AutoDMA output positioning
- OutPos++;
- if (OutPos >= 0x200)
- OutPos = 0;
+ // Update AutoDMA output positioning
+ OutPos++;
+ if (OutPos >= 0x200)
+ OutPos = 0;
- if (IsDevBuild) {
- p_cachestat_counter++;
- if (p_cachestat_counter > (48000 * 10)) {
- p_cachestat_counter = 0;
- if (MsgCache())
- ConLog(" * SPU2 > CacheStats > Hits: %d Misses: %d Ignores: %d\n",
- g_counter_cache_hits,
- g_counter_cache_misses,
- g_counter_cache_ignores);
+ if (IsDevBuild)
+ {
+ p_cachestat_counter++;
+ if (p_cachestat_counter > (48000 * 10))
+ {
+ p_cachestat_counter = 0;
+ if (MsgCache())
+ ConLog(" * SPU2 > CacheStats > Hits: %d Misses: %d Ignores: %d\n",
+ g_counter_cache_hits,
+ g_counter_cache_misses,
+ g_counter_cache_ignores);
- g_counter_cache_hits =
- g_counter_cache_misses =
- g_counter_cache_ignores = 0;
- }
- }
+ g_counter_cache_hits =
+ g_counter_cache_misses =
+ g_counter_cache_ignores = 0;
+ }
+ }
}
diff --git a/pcsx2/SPU2/Mixer.h b/pcsx2/SPU2/Mixer.h
index 7c479af0d9..a01ceeb4b9 100644
--- a/pcsx2/SPU2/Mixer.h
+++ b/pcsx2/SPU2/Mixer.h
@@ -21,112 +21,112 @@ extern float VolumeAdjustFR;
struct StereoOut32
{
- static StereoOut32 Empty;
+ static StereoOut32 Empty;
- s32 Left;
- s32 Right;
+ s32 Left;
+ s32 Right;
- StereoOut32()
- : Left(0)
- , Right(0)
- {
- }
+ StereoOut32()
+ : Left(0)
+ , Right(0)
+ {
+ }
- StereoOut32(s32 left, s32 right)
- : Left(left)
- , Right(right)
- {
- }
+ StereoOut32(s32 left, s32 right)
+ : Left(left)
+ , Right(right)
+ {
+ }
- StereoOut32(const StereoOut16 &src);
- explicit StereoOut32(const StereoOutFloat &src);
+ StereoOut32(const StereoOut16& src);
+ explicit StereoOut32(const StereoOutFloat& src);
- StereoOut16 DownSample() const;
+ StereoOut16 DownSample() const;
- StereoOut32 operator*(const int &factor) const
- {
- return StereoOut32(
- Left * factor,
- Right * factor);
- }
+ StereoOut32 operator*(const int& factor) const
+ {
+ return StereoOut32(
+ Left * factor,
+ Right * factor);
+ }
- StereoOut32 &operator*=(const int &factor)
- {
- Left *= factor;
- Right *= factor;
- return *this;
- }
+ StereoOut32& operator*=(const int& factor)
+ {
+ Left *= factor;
+ Right *= factor;
+ return *this;
+ }
- StereoOut32 operator+(const StereoOut32 &right) const
- {
- return StereoOut32(
- Left + right.Left,
- Right + right.Right);
- }
+ StereoOut32 operator+(const StereoOut32& right) const
+ {
+ return StereoOut32(
+ Left + right.Left,
+ Right + right.Right);
+ }
- StereoOut32 operator/(int src) const
- {
- return StereoOut32(Left / src, Right / src);
- }
+ StereoOut32 operator/(int src) const
+ {
+ return StereoOut32(Left / src, Right / src);
+ }
- void ResampleFrom(const StereoOut32 &src)
- {
- this->Left = src.Left << 2;
- this->Right = src.Right << 2;
- }
+ void ResampleFrom(const StereoOut32& src)
+ {
+ this->Left = src.Left << 2;
+ this->Right = src.Right << 2;
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s32)(Left * VolumeAdjustFL);
- Right = (s32)(Right * VolumeAdjustFR);
- }
+ Left = (s32)(Left * VolumeAdjustFL);
+ Right = (s32)(Right * VolumeAdjustFR);
+ }
};
struct FrequencyResponseFilter
{
- static FrequencyResponseFilter Empty;
+ static FrequencyResponseFilter Empty;
- StereoOut32 History_One_In;
- StereoOut32 History_One_Out;
- StereoOut32 History_Two_In;
- StereoOut32 History_Two_Out;
+ StereoOut32 History_One_In;
+ StereoOut32 History_One_Out;
+ StereoOut32 History_Two_In;
+ StereoOut32 History_Two_Out;
- s32 lx1;
- s32 lx2;
- s32 ly1;
- s32 ly2;
+ s32 lx1;
+ s32 lx2;
+ s32 ly1;
+ s32 ly2;
- float la0, la1, la2, lb1, lb2;
- float ha0, ha1, ha2, hb1, hb2;
+ float la0, la1, la2, lb1, lb2;
+ float ha0, ha1, ha2, hb1, hb2;
- FrequencyResponseFilter()
- : History_One_In(0, 0)
- , History_One_Out(0, 0)
- , History_Two_In(0, 0)
- , History_Two_Out(0, 0)
- , lx1(0)
- , lx2(0)
- , ly1(0)
- , ly2(0)
+ FrequencyResponseFilter()
+ : History_One_In(0, 0)
+ , History_One_Out(0, 0)
+ , History_Two_In(0, 0)
+ , History_Two_Out(0, 0)
+ , lx1(0)
+ , lx2(0)
+ , ly1(0)
+ , ly2(0)
- , la0(1.00320890889339290000f)
- , la1(-1.97516434134506300000f)
- , la2(0.97243484967313087000f)
- , lb1(-1.97525280404731810000f)
- , lb2(0.97555529586426892000f)
+ , la0(1.00320890889339290000f)
+ , la1(-1.97516434134506300000f)
+ , la2(0.97243484967313087000f)
+ , lb1(-1.97525280404731810000f)
+ , lb2(0.97555529586426892000f)
- , ha0(1.52690772687271160000f)
- , ha1(-1.62653918974914990000f) //-1.72 = "common equilizer curve" --____--
- , ha2(0.57997976029249387000f)
- , hb1(-0.80955590379048203000f)
- , hb2(0.28990420120653748000f)
- {
- }
+ , ha0(1.52690772687271160000f)
+ , ha1(-1.62653918974914990000f) //-1.72 = "common equilizer curve" --____--
+ , ha2(0.57997976029249387000f)
+ , hb1(-0.80955590379048203000f)
+ , hb2(0.28990420120653748000f)
+ {
+ }
};
extern void Mix();
extern s32 clamp_mix(s32 x, u8 bitshift = 0);
-extern StereoOut32 clamp_mix(const StereoOut32 &sample, u8 bitshift = 0);
+extern StereoOut32 clamp_mix(const StereoOut32& sample, u8 bitshift = 0);
diff --git a/pcsx2/SPU2/ReadInput.cpp b/pcsx2/SPU2/ReadInput.cpp
index c58a0f4516..dfc3a4cf0c 100644
--- a/pcsx2/SPU2/ReadInput.cpp
+++ b/pcsx2/SPU2/ReadInput.cpp
@@ -30,145 +30,163 @@
//
StereoOut32 V_Core::ReadInput_HiFi()
{
- if (psxmode)
- ConLog("ReadInput_HiFi!!!!!\n");
- InputPosRead &= ~1;
- //
- //#ifdef PCM24_S1_INTERLEAVE
- // StereoOut32 retval(
- // *((s32*)(ADMATempBuffer+(InputPosRead<<1))),
- // *((s32*)(ADMATempBuffer+(InputPosRead<<1)+2))
- // );
- //#else
- // StereoOut32 retval(
- // (s32&)(ADMATempBuffer[InputPosRead]),
- // (s32&)(ADMATempBuffer[InputPosRead+0x200])
- // );
- //#endif
+ if (psxmode)
+ ConLog("ReadInput_HiFi!!!!!\n");
+ InputPosRead &= ~1;
+ //
+ //#ifdef PCM24_S1_INTERLEAVE
+ // StereoOut32 retval(
+ // *((s32*)(ADMATempBuffer+(InputPosRead<<1))),
+ // *((s32*)(ADMATempBuffer+(InputPosRead<<1)+2))
+ // );
+ //#else
+ // StereoOut32 retval(
+ // (s32&)(ADMATempBuffer[InputPosRead]),
+ // (s32&)(ADMATempBuffer[InputPosRead+0x200])
+ // );
+ //#endif
- StereoOut32 retval(
- (s32 &)(*GetMemPtr(0x2000 + (Index << 10) + InputPosRead)),
- (s32 &)(*GetMemPtr(0x2200 + (Index << 10) + InputPosRead)));
+ StereoOut32 retval(
+ (s32&)(*GetMemPtr(0x2000 + (Index << 10) + InputPosRead)),
+ (s32&)(*GetMemPtr(0x2200 + (Index << 10) + InputPosRead)));
- if (Index == 1) {
- // CDDA Mode:
- // give 30 bit data (SndOut downsamples the rest of the way)
- // HACKFIX: 28 bits seems better according to rama. I should take some time and do some
- // bitcounting on this one. --air
- retval.Left >>= 4;
- retval.Right >>= 4;
- }
+ if (Index == 1)
+ {
+ // CDDA Mode:
+ // give 30 bit data (SndOut downsamples the rest of the way)
+ // HACKFIX: 28 bits seems better according to rama. I should take some time and do some
+ // bitcounting on this one. --air
+ retval.Left >>= 4;
+ retval.Right >>= 4;
+ }
- InputPosRead += 2;
+ InputPosRead += 2;
- // Why does CDDA mode check for InputPos == 0x100? In the old code, SPDIF mode did not but CDDA did.
- // One of these seems wrong, they should be the same. Since standard ADMA checks too I'm assuming that as default. -- air
+ // Why does CDDA mode check for InputPos == 0x100? In the old code, SPDIF mode did not but CDDA did.
+ // One of these seems wrong, they should be the same. Since standard ADMA checks too I'm assuming that as default. -- air
- if ((InputPosRead == 0x100) || (InputPosRead >= 0x200)) {
- AdmaInProgress = 0;
- if (InputDataLeft >= 0x200) {
+ if ((InputPosRead == 0x100) || (InputPosRead >= 0x200))
+ {
+ AdmaInProgress = 0;
+ if (InputDataLeft >= 0x200)
+ {
#ifdef PCM24_S1_INTERLEAVE
- AutoDMAReadBuffer(1);
+ AutoDMAReadBuffer(1);
#else
- AutoDMAReadBuffer(0);
+ AutoDMAReadBuffer(0);
#endif
- AdmaInProgress = 1;
+ AdmaInProgress = 1;
- TSA = (Index << 10) + InputPosRead;
+ TSA = (Index << 10) + InputPosRead;
- if (InputDataLeft < 0x200) {
- FileLog("[%10d] %s AutoDMA%c block end.\n", (Index == 1) ? "CDDA" : "SPDIF", Cycles, GetDmaIndexChar());
+ if (InputDataLeft < 0x200)
+ {
+ FileLog("[%10d] %s AutoDMA%c block end.\n", (Index == 1) ? "CDDA" : "SPDIF", Cycles, GetDmaIndexChar());
- if (IsDevBuild) {
- if (InputDataLeft > 0) {
- if (MsgAutoDMA())
- ConLog("WARNING: adma buffer didn't finish with a whole block!!\n");
- }
- }
- InputDataLeft = 0;
- // Hack, kinda. We call the interrupt early here, since PCSX2 doesn't like them delayed.
- //DMAICounter = 1;
- if (Index == 0) {
- if(!SPU2_dummy_callback)
- spu2DMA4Irq();
- else
- SPU2interruptDMA4();
- } else {
- if(!SPU2_dummy_callback)
- spu2DMA7Irq();
- else
- SPU2interruptDMA7();
- }
- }
- }
- InputPosRead &= 0x1ff;
- }
- return retval;
+ if (IsDevBuild)
+ {
+ if (InputDataLeft > 0)
+ {
+ if (MsgAutoDMA())
+ ConLog("WARNING: adma buffer didn't finish with a whole block!!\n");
+ }
+ }
+ InputDataLeft = 0;
+ // Hack, kinda. We call the interrupt early here, since PCSX2 doesn't like them delayed.
+ //DMAICounter = 1;
+ if (Index == 0)
+ {
+ if (!SPU2_dummy_callback)
+ spu2DMA4Irq();
+ else
+ SPU2interruptDMA4();
+ }
+ else
+ {
+ if (!SPU2_dummy_callback)
+ spu2DMA7Irq();
+ else
+ SPU2interruptDMA7();
+ }
+ }
+ }
+ InputPosRead &= 0x1ff;
+ }
+ return retval;
}
StereoOut32 V_Core::ReadInput()
{
- StereoOut32 retval;
+ StereoOut32 retval;
- if ((Index != 1) || ((PlayMode & 2) == 0)) {
- for (int i = 0; i < 2; i++)
- if (Cores[i].IRQEnable && 0x2000 + (Index << 10) + InputPosRead == (Cores[i].IRQA & 0xfffffdff))
- SetIrqCall(i);
+ if ((Index != 1) || ((PlayMode & 2) == 0))
+ {
+ for (int i = 0; i < 2; i++)
+ if (Cores[i].IRQEnable && 0x2000 + (Index << 10) + InputPosRead == (Cores[i].IRQA & 0xfffffdff))
+ SetIrqCall(i);
- //retval = StereoOut32(
- // (s32)ADMATempBuffer[InputPosRead],
- // (s32)ADMATempBuffer[InputPosRead+0x200]
- //);
- retval = StereoOut32(
- (s32)(*GetMemPtr(0x2000 + (Index << 10) + InputPosRead)),
- (s32)(*GetMemPtr(0x2200 + (Index << 10) + InputPosRead)));
- }
+ //retval = StereoOut32(
+ // (s32)ADMATempBuffer[InputPosRead],
+ // (s32)ADMATempBuffer[InputPosRead+0x200]
+ //);
+ retval = StereoOut32(
+ (s32)(*GetMemPtr(0x2000 + (Index << 10) + InputPosRead)),
+ (s32)(*GetMemPtr(0x2200 + (Index << 10) + InputPosRead)));
+ }
#ifdef PCSX2_DEVBUILD
- DebugCores[Index].admaWaveformL[InputPosRead % 0x100] = retval.Left;
- DebugCores[Index].admaWaveformR[InputPosRead % 0x100] = retval.Right;
+ DebugCores[Index].admaWaveformL[InputPosRead % 0x100] = retval.Left;
+ DebugCores[Index].admaWaveformR[InputPosRead % 0x100] = retval.Right;
#endif
- InputPosRead++;
+ InputPosRead++;
- if (AutoDMACtrl & (Index + 1) && (InputPosRead == 0x100 || InputPosRead == 0x200)) {
- AdmaInProgress = 0;
- if (InputDataLeft >= 0x200) {
- //u8 k=InputDataLeft>=InputDataProgress;
+ if (AutoDMACtrl & (Index + 1) && (InputPosRead == 0x100 || InputPosRead == 0x200))
+ {
+ AdmaInProgress = 0;
+ if (InputDataLeft >= 0x200)
+ {
+ //u8 k=InputDataLeft>=InputDataProgress;
- AutoDMAReadBuffer(0);
+ AutoDMAReadBuffer(0);
- AdmaInProgress = 1;
- TSA = (Index << 10) + InputPosRead;
+ AdmaInProgress = 1;
+ TSA = (Index << 10) + InputPosRead;
- if (InputDataLeft < 0x200) {
- AutoDMACtrl |= ~3;
+ if (InputDataLeft < 0x200)
+ {
+ AutoDMACtrl |= ~3;
- if (IsDevBuild) {
- FileLog("[%10d] AutoDMA%c block end.\n", Cycles, GetDmaIndexChar());
- if (InputDataLeft > 0) {
- if (MsgAutoDMA())
- ConLog("WARNING: adma buffer didn't finish with a whole block!!\n");
- }
- }
+ if (IsDevBuild)
+ {
+ FileLog("[%10d] AutoDMA%c block end.\n", Cycles, GetDmaIndexChar());
+ if (InputDataLeft > 0)
+ {
+ if (MsgAutoDMA())
+ ConLog("WARNING: adma buffer didn't finish with a whole block!!\n");
+ }
+ }
- InputDataLeft = 0;
- // Hack, kinda. We call the interrupt early here, since PCSX2 doesn't like them delayed.
- //DMAICounter = 1;
- if (Index == 0) {
- if(!SPU2_dummy_callback)
- spu2DMA4Irq();
- else
- SPU2interruptDMA4();
- } else {
- if(!SPU2_dummy_callback)
- spu2DMA7Irq();
- else
- SPU2interruptDMA7();
- }
- }
- }
- }
- InputPosRead &= 0x1ff;
- return retval;
+ InputDataLeft = 0;
+ // Hack, kinda. We call the interrupt early here, since PCSX2 doesn't like them delayed.
+ //DMAICounter = 1;
+ if (Index == 0)
+ {
+ if (!SPU2_dummy_callback)
+ spu2DMA4Irq();
+ else
+ SPU2interruptDMA4();
+ }
+ else
+ {
+ if (!SPU2_dummy_callback)
+ spu2DMA7Irq();
+ else
+ SPU2interruptDMA7();
+ }
+ }
+ }
+ }
+ InputPosRead &= 0x1ff;
+ return retval;
}
diff --git a/pcsx2/SPU2/RegLog.cpp b/pcsx2/SPU2/RegLog.cpp
index 90ee87269b..7504a77eda 100644
--- a/pcsx2/SPU2/RegLog.cpp
+++ b/pcsx2/SPU2/RegLog.cpp
@@ -15,281 +15,295 @@
#include "Global.h"
-const char *ParamNames[8] = {"VOLL", "VOLR", "PITCH", "ADSR1", "ADSR2", "ENVX", "VOLXL", "VOLXR"};
-const char *AddressNames[6] = {"SSAH", "SSAL", "LSAH", "LSAL", "NAXH", "NAXL"};
+const char* ParamNames[8] = {"VOLL", "VOLR", "PITCH", "ADSR1", "ADSR2", "ENVX", "VOLXL", "VOLXR"};
+const char* AddressNames[6] = {"SSAH", "SSAL", "LSAH", "LSAL", "NAXH", "NAXL"};
-__forceinline void _RegLog_(const char *action, int level, const char *RName, u32 mem, u32 core, u16 value)
+__forceinline void _RegLog_(const char* action, int level, const char* RName, u32 mem, u32 core, u16 value)
{
- if (level > 1)
- FileLog("[%10d] SPU2 %s mem %08x (core %d, register %s) value %04x\n",
- Cycles, action, mem, core, RName, value);
+ if (level > 1)
+ FileLog("[%10d] SPU2 %s mem %08x (core %d, register %s) value %04x\n",
+ Cycles, action, mem, core, RName, value);
}
#define RegLog(lev, rname, mem, core, val) _RegLog_(action, lev, rname, mem, core, val)
-void SPU2writeLog(const char *action, u32 rmem, u16 value)
+void SPU2writeLog(const char* action, u32 rmem, u16 value)
{
- if (!IsDevBuild)
- return;
+ if (!IsDevBuild)
+ return;
- //u32 vx=0, vc=0;
- u32 core = 0, omem, mem;
- omem = mem = rmem & 0x7FF; //FFFF;
- if (mem & 0x400) {
- omem ^= 0x400;
- core = 1;
- }
+ //u32 vx=0, vc=0;
+ u32 core = 0, omem, mem;
+ omem = mem = rmem & 0x7FF; //FFFF;
+ if (mem & 0x400)
+ {
+ omem ^= 0x400;
+ core = 1;
+ }
- if (omem < 0x0180) // Voice Params (VP)
- {
- const u32 voice = (omem & 0x1F0) >> 4;
- const u32 param = (omem & 0xF) >> 1;
- char dest[192];
- sprintf(dest, "Voice %d %s", voice, ParamNames[param]);
- RegLog(2, dest, rmem, core, value);
- } else if ((omem >= 0x01C0) && (omem < 0x02E0)) // Voice Addressing Params (VA)
- {
- const u32 voice = ((omem - 0x01C0) / 12);
- const u32 address = ((omem - 0x01C0) % 12) >> 1;
+ if (omem < 0x0180) // Voice Params (VP)
+ {
+ const u32 voice = (omem & 0x1F0) >> 4;
+ const u32 param = (omem & 0xF) >> 1;
+ char dest[192];
+ sprintf(dest, "Voice %d %s", voice, ParamNames[param]);
+ RegLog(2, dest, rmem, core, value);
+ }
+ else if ((omem >= 0x01C0) && (omem < 0x02E0)) // Voice Addressing Params (VA)
+ {
+ const u32 voice = ((omem - 0x01C0) / 12);
+ const u32 address = ((omem - 0x01C0) % 12) >> 1;
- char dest[192];
- sprintf(dest, "Voice %d %s", voice, AddressNames[address]);
- RegLog(2, dest, rmem, core, value);
- } else if ((mem >= 0x0760) && (mem < 0x07b0)) {
- omem = mem;
- core = 0;
- if (mem >= 0x0788) {
- omem -= 0x28;
- core = 1;
- }
- switch (omem) {
- case REG_P_EVOLL:
- RegLog(2, "EVOLL", rmem, core, value);
- break;
- case REG_P_EVOLR:
- RegLog(2, "EVOLR", rmem, core, value);
- break;
- case REG_P_AVOLL:
- if (core) {
- RegLog(2, "AVOLL", rmem, core, value);
- }
- break;
- case REG_P_AVOLR:
- if (core) {
- RegLog(2, "AVOLR", rmem, core, value);
- }
- break;
- case REG_P_BVOLL:
- RegLog(2, "BVOLL", rmem, core, value);
- break;
- case REG_P_BVOLR:
- RegLog(2, "BVOLR", rmem, core, value);
- break;
- case REG_P_MVOLXL:
- RegLog(2, "MVOLXL", rmem, core, value);
- break;
- case REG_P_MVOLXR:
- RegLog(2, "MVOLXR", rmem, core, value);
- break;
- case R_IIR_VOL:
- RegLog(2, "IIR_VOL", rmem, core, value);
- break;
- case R_COMB1_VOL:
- RegLog(2, "COMB1_VOL", rmem, core, value);
- break;
- case R_COMB2_VOL:
- RegLog(2, "COMB2_VOL", rmem, core, value);
- break;
- case R_COMB3_VOL:
- RegLog(2, "COMB3_VOL", rmem, core, value);
- break;
- case R_COMB4_VOL:
- RegLog(2, "COMB4_VOL", rmem, core, value);
- break;
- case R_WALL_VOL:
- RegLog(2, "WALL_VOL", rmem, core, value);
- break;
- case R_APF1_VOL:
- RegLog(2, "APF1_VOL", rmem, core, value);
- break;
- case R_APF2_VOL:
- RegLog(2, "APF2_VOL", rmem, core, value);
- break;
- case R_IN_COEF_L:
- RegLog(2, "IN_COEF_L", rmem, core, value);
- break;
- case R_IN_COEF_R:
- RegLog(2, "IN_COEF_R", rmem, core, value);
- break;
- }
- } else if ((mem >= 0x07C0) && (mem < 0x07CE)) {
- switch (mem) {
- case SPDIF_OUT:
- RegLog(2, "SPDIF_OUT", rmem, -1, value);
- break;
- case SPDIF_IRQINFO:
- RegLog(2, "SPDIF_IRQINFO", rmem, -1, value);
- break;
- case 0x7c4:
- if (Spdif.Unknown1 != value)
- ConLog("* SPU2-X: SPDIF Unknown Register 1 set to %04x\n", value);
- RegLog(2, "SPDIF_UNKNOWN1", rmem, -1, value);
- break;
- case SPDIF_MODE:
- if (Spdif.Mode != value)
- ConLog("* SPU2-X: SPDIF Mode set to %04x\n", value);
- RegLog(2, "SPDIF_MODE", rmem, -1, value);
- break;
- case SPDIF_MEDIA:
- if (Spdif.Media != value)
- ConLog("* SPU2-X: SPDIF Media set to %04x\n", value);
- RegLog(2, "SPDIF_MEDIA", rmem, -1, value);
- break;
- case 0x7ca:
- if (Spdif.Unknown2 != value)
- ConLog("* SPU2-X: SPDIF Unknown Register 2 set to %04x\n", value);
- RegLog(2, "SPDIF_UNKNOWN2", rmem, -1, value);
- break;
- case SPDIF_PROTECT:
- if (Spdif.Protection != value)
- ConLog("* SPU2-X: SPDIF Copy set to %04x\n", value);
- RegLog(2, "SPDIF_PROTECT", rmem, -1, value);
- break;
- }
- UpdateSpdifMode();
- } else {
- switch (omem) {
- case REG_C_ATTR:
- RegLog(4, "ATTR", rmem, core, value);
- break;
- case REG_S_PMON:
- RegLog(1, "PMON0", rmem, core, value);
- break;
- case (REG_S_PMON + 2):
- RegLog(1, "PMON1", rmem, core, value);
- break;
- case REG_S_NON:
- RegLog(1, "NON0", rmem, core, value);
- break;
- case (REG_S_NON + 2):
- RegLog(1, "NON1", rmem, core, value);
- break;
- case REG_S_VMIXL:
- RegLog(1, "VMIXL0", rmem, core, value);
- break;
- case (REG_S_VMIXL + 2):
- RegLog(1, "VMIXL1", rmem, core, value);
- break;
- case REG_S_VMIXEL:
- RegLog(1, "VMIXEL0", rmem, core, value);
- break;
- case (REG_S_VMIXEL + 2):
- RegLog(1, "VMIXEL1", rmem, core, value);
- break;
- case REG_S_VMIXR:
- RegLog(1, "VMIXR0", rmem, core, value);
- break;
- case (REG_S_VMIXR + 2):
- RegLog(1, "VMIXR1", rmem, core, value);
- break;
- case REG_S_VMIXER:
- RegLog(1, "VMIXER0", rmem, core, value);
- break;
- case (REG_S_VMIXER + 2):
- RegLog(1, "VMIXER1", rmem, core, value);
- break;
- case REG_P_MMIX:
- RegLog(1, "MMIX", rmem, core, value);
- break;
- case REG_A_IRQA:
- RegLog(2, "IRQAH", rmem, core, value);
- break;
- case (REG_A_IRQA + 2):
- RegLog(2, "IRQAL", rmem, core, value);
- break;
- case (REG_S_KON + 2):
- RegLog(1, "KON1", rmem, core, value);
- break;
- case REG_S_KON:
- RegLog(1, "KON0", rmem, core, value);
- break;
- case (REG_S_KOFF + 2):
- RegLog(1, "KOFF1", rmem, core, value);
- break;
- case REG_S_KOFF:
- RegLog(1, "KOFF0", rmem, core, value);
- break;
- case REG_A_TSA:
- RegLog(2, "TSAH", rmem, core, value);
- break;
- case (REG_A_TSA + 2):
- RegLog(2, "TSAL", rmem, core, value);
- break;
- case REG_S_ENDX:
- //ConLog("* SPU2-X: Core %d ENDX cleared!\n",core);
- RegLog(2, "ENDX0", rmem, core, value);
- break;
- case (REG_S_ENDX + 2):
- //ConLog("* SPU2-X: Core %d ENDX cleared!\n",core);
- RegLog(2, "ENDX1", rmem, core, value);
- break;
- case REG_P_MVOLL:
- RegLog(1, "MVOLL", rmem, core, value);
- break;
- case REG_P_MVOLR:
- RegLog(1, "MVOLR", rmem, core, value);
- break;
- case REG_S_ADMAS:
- RegLog(3, "ADMAS", rmem, core, value);
- //ConLog("* SPU2-X: Core %d AutoDMAControl set to %d\n",core,value);
- break;
- case REG_P_STATX:
- RegLog(3, "STATX", rmem, core, value);
- break;
- case REG_A_ESA:
- RegLog(2, "ESAH", rmem, core, value);
- break;
- case (REG_A_ESA + 2):
- RegLog(2, "ESAL", rmem, core, value);
- break;
- case REG_A_EEA:
- RegLog(2, "EEAH", rmem, core, value);
- break;
+ char dest[192];
+ sprintf(dest, "Voice %d %s", voice, AddressNames[address]);
+ RegLog(2, dest, rmem, core, value);
+ }
+ else if ((mem >= 0x0760) && (mem < 0x07b0))
+ {
+ omem = mem;
+ core = 0;
+ if (mem >= 0x0788)
+ {
+ omem -= 0x28;
+ core = 1;
+ }
+ switch (omem)
+ {
+ case REG_P_EVOLL:
+ RegLog(2, "EVOLL", rmem, core, value);
+ break;
+ case REG_P_EVOLR:
+ RegLog(2, "EVOLR", rmem, core, value);
+ break;
+ case REG_P_AVOLL:
+ if (core)
+ {
+ RegLog(2, "AVOLL", rmem, core, value);
+ }
+ break;
+ case REG_P_AVOLR:
+ if (core)
+ {
+ RegLog(2, "AVOLR", rmem, core, value);
+ }
+ break;
+ case REG_P_BVOLL:
+ RegLog(2, "BVOLL", rmem, core, value);
+ break;
+ case REG_P_BVOLR:
+ RegLog(2, "BVOLR", rmem, core, value);
+ break;
+ case REG_P_MVOLXL:
+ RegLog(2, "MVOLXL", rmem, core, value);
+ break;
+ case REG_P_MVOLXR:
+ RegLog(2, "MVOLXR", rmem, core, value);
+ break;
+ case R_IIR_VOL:
+ RegLog(2, "IIR_VOL", rmem, core, value);
+ break;
+ case R_COMB1_VOL:
+ RegLog(2, "COMB1_VOL", rmem, core, value);
+ break;
+ case R_COMB2_VOL:
+ RegLog(2, "COMB2_VOL", rmem, core, value);
+ break;
+ case R_COMB3_VOL:
+ RegLog(2, "COMB3_VOL", rmem, core, value);
+ break;
+ case R_COMB4_VOL:
+ RegLog(2, "COMB4_VOL", rmem, core, value);
+ break;
+ case R_WALL_VOL:
+ RegLog(2, "WALL_VOL", rmem, core, value);
+ break;
+ case R_APF1_VOL:
+ RegLog(2, "APF1_VOL", rmem, core, value);
+ break;
+ case R_APF2_VOL:
+ RegLog(2, "APF2_VOL", rmem, core, value);
+ break;
+ case R_IN_COEF_L:
+ RegLog(2, "IN_COEF_L", rmem, core, value);
+ break;
+ case R_IN_COEF_R:
+ RegLog(2, "IN_COEF_R", rmem, core, value);
+ break;
+ }
+ }
+ else if ((mem >= 0x07C0) && (mem < 0x07CE))
+ {
+ switch (mem)
+ {
+ case SPDIF_OUT:
+ RegLog(2, "SPDIF_OUT", rmem, -1, value);
+ break;
+ case SPDIF_IRQINFO:
+ RegLog(2, "SPDIF_IRQINFO", rmem, -1, value);
+ break;
+ case 0x7c4:
+ if (Spdif.Unknown1 != value)
+ ConLog("* SPU2-X: SPDIF Unknown Register 1 set to %04x\n", value);
+ RegLog(2, "SPDIF_UNKNOWN1", rmem, -1, value);
+ break;
+ case SPDIF_MODE:
+ if (Spdif.Mode != value)
+ ConLog("* SPU2-X: SPDIF Mode set to %04x\n", value);
+ RegLog(2, "SPDIF_MODE", rmem, -1, value);
+ break;
+ case SPDIF_MEDIA:
+ if (Spdif.Media != value)
+ ConLog("* SPU2-X: SPDIF Media set to %04x\n", value);
+ RegLog(2, "SPDIF_MEDIA", rmem, -1, value);
+ break;
+ case 0x7ca:
+ if (Spdif.Unknown2 != value)
+ ConLog("* SPU2-X: SPDIF Unknown Register 2 set to %04x\n", value);
+ RegLog(2, "SPDIF_UNKNOWN2", rmem, -1, value);
+ break;
+ case SPDIF_PROTECT:
+ if (Spdif.Protection != value)
+ ConLog("* SPU2-X: SPDIF Copy set to %04x\n", value);
+ RegLog(2, "SPDIF_PROTECT", rmem, -1, value);
+ break;
+ }
+ UpdateSpdifMode();
+ }
+ else
+ {
+ switch (omem)
+ {
+ case REG_C_ATTR:
+ RegLog(4, "ATTR", rmem, core, value);
+ break;
+ case REG_S_PMON:
+ RegLog(1, "PMON0", rmem, core, value);
+ break;
+ case (REG_S_PMON + 2):
+ RegLog(1, "PMON1", rmem, core, value);
+ break;
+ case REG_S_NON:
+ RegLog(1, "NON0", rmem, core, value);
+ break;
+ case (REG_S_NON + 2):
+ RegLog(1, "NON1", rmem, core, value);
+ break;
+ case REG_S_VMIXL:
+ RegLog(1, "VMIXL0", rmem, core, value);
+ break;
+ case (REG_S_VMIXL + 2):
+ RegLog(1, "VMIXL1", rmem, core, value);
+ break;
+ case REG_S_VMIXEL:
+ RegLog(1, "VMIXEL0", rmem, core, value);
+ break;
+ case (REG_S_VMIXEL + 2):
+ RegLog(1, "VMIXEL1", rmem, core, value);
+ break;
+ case REG_S_VMIXR:
+ RegLog(1, "VMIXR0", rmem, core, value);
+ break;
+ case (REG_S_VMIXR + 2):
+ RegLog(1, "VMIXR1", rmem, core, value);
+ break;
+ case REG_S_VMIXER:
+ RegLog(1, "VMIXER0", rmem, core, value);
+ break;
+ case (REG_S_VMIXER + 2):
+ RegLog(1, "VMIXER1", rmem, core, value);
+ break;
+ case REG_P_MMIX:
+ RegLog(1, "MMIX", rmem, core, value);
+ break;
+ case REG_A_IRQA:
+ RegLog(2, "IRQAH", rmem, core, value);
+ break;
+ case (REG_A_IRQA + 2):
+ RegLog(2, "IRQAL", rmem, core, value);
+ break;
+ case (REG_S_KON + 2):
+ RegLog(1, "KON1", rmem, core, value);
+ break;
+ case REG_S_KON:
+ RegLog(1, "KON0", rmem, core, value);
+ break;
+ case (REG_S_KOFF + 2):
+ RegLog(1, "KOFF1", rmem, core, value);
+ break;
+ case REG_S_KOFF:
+ RegLog(1, "KOFF0", rmem, core, value);
+ break;
+ case REG_A_TSA:
+ RegLog(2, "TSAH", rmem, core, value);
+ break;
+ case (REG_A_TSA + 2):
+ RegLog(2, "TSAL", rmem, core, value);
+ break;
+ case REG_S_ENDX:
+ //ConLog("* SPU2-X: Core %d ENDX cleared!\n",core);
+ RegLog(2, "ENDX0", rmem, core, value);
+ break;
+ case (REG_S_ENDX + 2):
+ //ConLog("* SPU2-X: Core %d ENDX cleared!\n",core);
+ RegLog(2, "ENDX1", rmem, core, value);
+ break;
+ case REG_P_MVOLL:
+ RegLog(1, "MVOLL", rmem, core, value);
+ break;
+ case REG_P_MVOLR:
+ RegLog(1, "MVOLR", rmem, core, value);
+ break;
+ case REG_S_ADMAS:
+ RegLog(3, "ADMAS", rmem, core, value);
+ //ConLog("* SPU2-X: Core %d AutoDMAControl set to %d\n",core,value);
+ break;
+ case REG_P_STATX:
+ RegLog(3, "STATX", rmem, core, value);
+ break;
+ case REG_A_ESA:
+ RegLog(2, "ESAH", rmem, core, value);
+ break;
+ case (REG_A_ESA + 2):
+ RegLog(2, "ESAL", rmem, core, value);
+ break;
+ case REG_A_EEA:
+ RegLog(2, "EEAH", rmem, core, value);
+ break;
#define LOG_REVB_REG(n, t) \
- case R_##n: \
- RegLog(2, t "H", mem, core, value); \
- break; \
- case (R_##n + 2): \
- RegLog(2, t "L", mem, core, value); \
- break;
+ case R_##n: \
+ RegLog(2, t "H", mem, core, value); \
+ break; \
+ case (R_##n + 2): \
+ RegLog(2, t "L", mem, core, value); \
+ break;
- LOG_REVB_REG(APF1_SIZE, "APF1_SIZE")
- LOG_REVB_REG(APF2_SIZE, "APF2_SIZE")
- LOG_REVB_REG(SAME_L_SRC, "SAME_L_SRC")
- LOG_REVB_REG(SAME_R_SRC, "SAME_R_SRC")
- LOG_REVB_REG(DIFF_L_SRC, "DIFF_L_SRC")
- LOG_REVB_REG(DIFF_R_SRC, "DIFF_R_SRC")
- LOG_REVB_REG(SAME_L_DST, "SAME_L_DST")
- LOG_REVB_REG(SAME_R_DST, "SAME_R_DST")
- LOG_REVB_REG(DIFF_L_DST, "DIFF_L_DST")
- LOG_REVB_REG(DIFF_R_DST, "DIFF_R_DST")
- LOG_REVB_REG(COMB1_L_SRC, "COMB1_L_SRC")
- LOG_REVB_REG(COMB1_R_SRC, "COMB1_R_SRC")
- LOG_REVB_REG(COMB2_L_SRC, "COMB2_L_SRC")
- LOG_REVB_REG(COMB2_R_SRC, "COMB2_R_SRC")
- LOG_REVB_REG(COMB3_L_SRC, "COMB3_L_SRC")
- LOG_REVB_REG(COMB3_R_SRC, "COMB3_R_SRC")
- LOG_REVB_REG(COMB4_L_SRC, "COMB4_L_SRC")
- LOG_REVB_REG(COMB4_R_SRC, "COMB4_R_SRC")
- LOG_REVB_REG(APF1_L_DST, "APF1_L_DST")
- LOG_REVB_REG(APF1_R_DST, "APF1_R_DST")
- LOG_REVB_REG(APF2_L_DST, "APF2_L_DST")
- LOG_REVB_REG(APF2_R_DST, "APF2_R_DST")
+ LOG_REVB_REG(APF1_SIZE, "APF1_SIZE")
+ LOG_REVB_REG(APF2_SIZE, "APF2_SIZE")
+ LOG_REVB_REG(SAME_L_SRC, "SAME_L_SRC")
+ LOG_REVB_REG(SAME_R_SRC, "SAME_R_SRC")
+ LOG_REVB_REG(DIFF_L_SRC, "DIFF_L_SRC")
+ LOG_REVB_REG(DIFF_R_SRC, "DIFF_R_SRC")
+ LOG_REVB_REG(SAME_L_DST, "SAME_L_DST")
+ LOG_REVB_REG(SAME_R_DST, "SAME_R_DST")
+ LOG_REVB_REG(DIFF_L_DST, "DIFF_L_DST")
+ LOG_REVB_REG(DIFF_R_DST, "DIFF_R_DST")
+ LOG_REVB_REG(COMB1_L_SRC, "COMB1_L_SRC")
+ LOG_REVB_REG(COMB1_R_SRC, "COMB1_R_SRC")
+ LOG_REVB_REG(COMB2_L_SRC, "COMB2_L_SRC")
+ LOG_REVB_REG(COMB2_R_SRC, "COMB2_R_SRC")
+ LOG_REVB_REG(COMB3_L_SRC, "COMB3_L_SRC")
+ LOG_REVB_REG(COMB3_R_SRC, "COMB3_R_SRC")
+ LOG_REVB_REG(COMB4_L_SRC, "COMB4_L_SRC")
+ LOG_REVB_REG(COMB4_R_SRC, "COMB4_R_SRC")
+ LOG_REVB_REG(APF1_L_DST, "APF1_L_DST")
+ LOG_REVB_REG(APF1_R_DST, "APF1_R_DST")
+ LOG_REVB_REG(APF2_L_DST, "APF2_L_DST")
+ LOG_REVB_REG(APF2_R_DST, "APF2_R_DST")
- default:
- RegLog(2, "UNKNOWN", rmem, core, value);
- spu2Ru16(mem) = value;
- }
- }
+ default:
+ RegLog(2, "UNKNOWN", rmem, core, value);
+ spu2Ru16(mem) = value;
+ }
+ }
}
diff --git a/pcsx2/SPU2/RegTable.cpp b/pcsx2/SPU2/RegTable.cpp
index 2b5870f9c0..429c44d12e 100644
--- a/pcsx2/SPU2/RegTable.cpp
+++ b/pcsx2/SPU2/RegTable.cpp
@@ -16,286 +16,286 @@
#include "Global.h"
#define PCORE(c, p) \
- U16P(Cores[c].p)
+ U16P(Cores[c].p)
#define PVCP(c, v, p) \
- PCORE(c, Voices[v].p)
+ PCORE(c, Voices[v].p)
#define PVC(c, v) \
- PVCP(c, v, Volume.Left.Reg_VOL) \
- , \
- PVCP(c, v, Volume.Right.Reg_VOL), \
- PVCP(c, v, Pitch), \
- PVCP(c, v, ADSR.regADSR1), \
- PVCP(c, v, ADSR.regADSR2), \
- PVCP(c, v, ADSR.Value) + 1, \
- PVCP(c, v, Volume.Left.Value) + 1, \
- PVCP(c, v, Volume.Right.Value) + 1
+ PVCP(c, v, Volume.Left.Reg_VOL) \
+ , \
+ PVCP(c, v, Volume.Right.Reg_VOL), \
+ PVCP(c, v, Pitch), \
+ PVCP(c, v, ADSR.regADSR1), \
+ PVCP(c, v, ADSR.regADSR2), \
+ PVCP(c, v, ADSR.Value) + 1, \
+ PVCP(c, v, Volume.Left.Value) + 1, \
+ PVCP(c, v, Volume.Right.Value) + 1
#define PVCA(c, v) \
- PVCP(c, v, StartA) + 1, \
- PVCP(c, v, StartA), \
- PVCP(c, v, LoopStartA) + 1, \
- PVCP(c, v, LoopStartA), \
- PVCP(c, v, NextA) + 1, \
- PVCP(c, v, NextA)
+ PVCP(c, v, StartA) + 1, \
+ PVCP(c, v, StartA), \
+ PVCP(c, v, LoopStartA) + 1, \
+ PVCP(c, v, LoopStartA), \
+ PVCP(c, v, NextA) + 1, \
+ PVCP(c, v, NextA)
#define PRAW(a) \
- ((u16 *)NULL)
+ ((u16*)NULL)
#define PREVB_REG(c, n) \
- PCORE(c, Revb.n) + 1, \
- PCORE(c, Revb.n)
+ PCORE(c, Revb.n) + 1, \
+ PCORE(c, Revb.n)
-u16 *regtable[0x401];
+u16* regtable[0x401];
-u16 const *const regtable_original[0x401] =
- {
- // Voice Params: 8 params, 24 voices = 0x180 bytes
- PVC(0, 0), PVC(0, 1), PVC(0, 2), PVC(0, 3), PVC(0, 4), PVC(0, 5),
- PVC(0, 6), PVC(0, 7), PVC(0, 8), PVC(0, 9), PVC(0, 10), PVC(0, 11),
- PVC(0, 12), PVC(0, 13), PVC(0, 14), PVC(0, 15), PVC(0, 16), PVC(0, 17),
- PVC(0, 18), PVC(0, 19), PVC(0, 20), PVC(0, 21), PVC(0, 22), PVC(0, 23),
+u16 const* const regtable_original[0x401] =
+ {
+ // Voice Params: 8 params, 24 voices = 0x180 bytes
+ PVC(0, 0), PVC(0, 1), PVC(0, 2), PVC(0, 3), PVC(0, 4), PVC(0, 5),
+ PVC(0, 6), PVC(0, 7), PVC(0, 8), PVC(0, 9), PVC(0, 10), PVC(0, 11),
+ PVC(0, 12), PVC(0, 13), PVC(0, 14), PVC(0, 15), PVC(0, 16), PVC(0, 17),
+ PVC(0, 18), PVC(0, 19), PVC(0, 20), PVC(0, 21), PVC(0, 22), PVC(0, 23),
- PCORE(0, Regs.PMON),
- PCORE(0, Regs.PMON) + 1,
- PCORE(0, Regs.NON),
- PCORE(0, Regs.NON) + 1,
- PCORE(0, Regs.VMIXL),
- PCORE(0, Regs.VMIXL) + 1,
- PCORE(0, Regs.VMIXEL),
- PCORE(0, Regs.VMIXEL) + 1,
- PCORE(0, Regs.VMIXR),
- PCORE(0, Regs.VMIXR) + 1,
- PCORE(0, Regs.VMIXER),
- PCORE(0, Regs.VMIXER) + 1,
+ PCORE(0, Regs.PMON),
+ PCORE(0, Regs.PMON) + 1,
+ PCORE(0, Regs.NON),
+ PCORE(0, Regs.NON) + 1,
+ PCORE(0, Regs.VMIXL),
+ PCORE(0, Regs.VMIXL) + 1,
+ PCORE(0, Regs.VMIXEL),
+ PCORE(0, Regs.VMIXEL) + 1,
+ PCORE(0, Regs.VMIXR),
+ PCORE(0, Regs.VMIXR) + 1,
+ PCORE(0, Regs.VMIXER),
+ PCORE(0, Regs.VMIXER) + 1,
- PCORE(0, Regs.MMIX),
- PCORE(0, Regs.ATTR),
+ PCORE(0, Regs.MMIX),
+ PCORE(0, Regs.ATTR),
- PCORE(0, IRQA) + 1,
- PCORE(0, IRQA),
+ PCORE(0, IRQA) + 1,
+ PCORE(0, IRQA),
- NULL, NULL,
- NULL, NULL,
+ NULL, NULL,
+ NULL, NULL,
- PCORE(0, TSA) + 1,
- PCORE(0, TSA),
+ PCORE(0, TSA) + 1,
+ PCORE(0, TSA),
- PRAW(REG__1AC), PRAW(REG__1AE),
+ PRAW(REG__1AC), PRAW(REG__1AE),
- PCORE(0, AutoDMACtrl),
+ PCORE(0, AutoDMACtrl),
- PRAW(0x1b2), PRAW(0x1b4), PRAW(0x1b6), PRAW(0x1b8), PRAW(0x1ba), PRAW(0x1bc), PRAW(0x1be), // unknown
+ PRAW(0x1b2), PRAW(0x1b4), PRAW(0x1b6), PRAW(0x1b8), PRAW(0x1ba), PRAW(0x1bc), PRAW(0x1be), // unknown
- // Voice Addresses
- PVCA(0, 0), PVCA(0, 1), PVCA(0, 2), PVCA(0, 3), PVCA(0, 4), PVCA(0, 5),
- PVCA(0, 6), PVCA(0, 7), PVCA(0, 8), PVCA(0, 9), PVCA(0, 10), PVCA(0, 11),
- PVCA(0, 12), PVCA(0, 13), PVCA(0, 14), PVCA(0, 15), PVCA(0, 16), PVCA(0, 17),
- PVCA(0, 18), PVCA(0, 19), PVCA(0, 20), PVCA(0, 21), PVCA(0, 22), PVCA(0, 23),
+ // Voice Addresses
+ PVCA(0, 0), PVCA(0, 1), PVCA(0, 2), PVCA(0, 3), PVCA(0, 4), PVCA(0, 5),
+ PVCA(0, 6), PVCA(0, 7), PVCA(0, 8), PVCA(0, 9), PVCA(0, 10), PVCA(0, 11),
+ PVCA(0, 12), PVCA(0, 13), PVCA(0, 14), PVCA(0, 15), PVCA(0, 16), PVCA(0, 17),
+ PVCA(0, 18), PVCA(0, 19), PVCA(0, 20), PVCA(0, 21), PVCA(0, 22), PVCA(0, 23),
- PCORE(0, ExtEffectsStartA) + 1,
- PCORE(0, ExtEffectsStartA),
+ PCORE(0, ExtEffectsStartA) + 1,
+ PCORE(0, ExtEffectsStartA),
- PREVB_REG(0, APF1_SIZE),
- PREVB_REG(0, APF2_SIZE),
- PREVB_REG(0, SAME_L_DST),
- PREVB_REG(0, SAME_R_DST),
- PREVB_REG(0, COMB1_L_SRC),
- PREVB_REG(0, COMB1_R_SRC),
- PREVB_REG(0, COMB2_L_SRC),
- PREVB_REG(0, COMB2_R_SRC),
- PREVB_REG(0, SAME_L_SRC),
- PREVB_REG(0, SAME_R_SRC),
- PREVB_REG(0, DIFF_L_DST),
- PREVB_REG(0, DIFF_R_DST),
- PREVB_REG(0, COMB3_L_SRC),
- PREVB_REG(0, COMB3_R_SRC),
- PREVB_REG(0, COMB4_L_SRC),
- PREVB_REG(0, COMB4_R_SRC),
- PREVB_REG(0, DIFF_L_SRC),
- PREVB_REG(0, DIFF_R_SRC),
- PREVB_REG(0, APF1_L_DST),
- PREVB_REG(0, APF1_R_DST),
- PREVB_REG(0, APF2_L_DST),
- PREVB_REG(0, APF2_R_DST),
+ PREVB_REG(0, APF1_SIZE),
+ PREVB_REG(0, APF2_SIZE),
+ PREVB_REG(0, SAME_L_DST),
+ PREVB_REG(0, SAME_R_DST),
+ PREVB_REG(0, COMB1_L_SRC),
+ PREVB_REG(0, COMB1_R_SRC),
+ PREVB_REG(0, COMB2_L_SRC),
+ PREVB_REG(0, COMB2_R_SRC),
+ PREVB_REG(0, SAME_L_SRC),
+ PREVB_REG(0, SAME_R_SRC),
+ PREVB_REG(0, DIFF_L_DST),
+ PREVB_REG(0, DIFF_R_DST),
+ PREVB_REG(0, COMB3_L_SRC),
+ PREVB_REG(0, COMB3_R_SRC),
+ PREVB_REG(0, COMB4_L_SRC),
+ PREVB_REG(0, COMB4_R_SRC),
+ PREVB_REG(0, DIFF_L_SRC),
+ PREVB_REG(0, DIFF_R_SRC),
+ PREVB_REG(0, APF1_L_DST),
+ PREVB_REG(0, APF1_R_DST),
+ PREVB_REG(0, APF2_L_DST),
+ PREVB_REG(0, APF2_R_DST),
- PCORE(0, ExtEffectsEndA) + 1,
- PCORE(0, ExtEffectsEndA),
+ PCORE(0, ExtEffectsEndA) + 1,
+ PCORE(0, ExtEffectsEndA),
- PCORE(0, Regs.ENDX),
- PCORE(0, Regs.ENDX) + 1,
- PCORE(0, Regs.STATX),
+ PCORE(0, Regs.ENDX),
+ PCORE(0, Regs.ENDX) + 1,
+ PCORE(0, Regs.STATX),
- //0x346 here
- PRAW(0x346),
- PRAW(0x348), PRAW(0x34A), PRAW(0x34C), PRAW(0x34E),
- PRAW(0x350), PRAW(0x352), PRAW(0x354), PRAW(0x356),
- PRAW(0x358), PRAW(0x35A), PRAW(0x35C), PRAW(0x35E),
- PRAW(0x360), PRAW(0x362), PRAW(0x364), PRAW(0x366),
- PRAW(0x368), PRAW(0x36A), PRAW(0x36C), PRAW(0x36E),
- PRAW(0x370), PRAW(0x372), PRAW(0x374), PRAW(0x376),
- PRAW(0x378), PRAW(0x37A), PRAW(0x37C), PRAW(0x37E),
- PRAW(0x380), PRAW(0x382), PRAW(0x384), PRAW(0x386),
- PRAW(0x388), PRAW(0x38A), PRAW(0x38C), PRAW(0x38E),
- PRAW(0x390), PRAW(0x392), PRAW(0x394), PRAW(0x396),
- PRAW(0x398), PRAW(0x39A), PRAW(0x39C), PRAW(0x39E),
- PRAW(0x3A0), PRAW(0x3A2), PRAW(0x3A4), PRAW(0x3A6),
- PRAW(0x3A8), PRAW(0x3AA), PRAW(0x3AC), PRAW(0x3AE),
- PRAW(0x3B0), PRAW(0x3B2), PRAW(0x3B4), PRAW(0x3B6),
- PRAW(0x3B8), PRAW(0x3BA), PRAW(0x3BC), PRAW(0x3BE),
- PRAW(0x3C0), PRAW(0x3C2), PRAW(0x3C4), PRAW(0x3C6),
- PRAW(0x3C8), PRAW(0x3CA), PRAW(0x3CC), PRAW(0x3CE),
- PRAW(0x3D0), PRAW(0x3D2), PRAW(0x3D4), PRAW(0x3D6),
- PRAW(0x3D8), PRAW(0x3DA), PRAW(0x3DC), PRAW(0x3DE),
- PRAW(0x3E0), PRAW(0x3E2), PRAW(0x3E4), PRAW(0x3E6),
- PRAW(0x3E8), PRAW(0x3EA), PRAW(0x3EC), PRAW(0x3EE),
- PRAW(0x3F0), PRAW(0x3F2), PRAW(0x3F4), PRAW(0x3F6),
- PRAW(0x3F8), PRAW(0x3FA), PRAW(0x3FC), PRAW(0x3FE),
+ //0x346 here
+ PRAW(0x346),
+ PRAW(0x348), PRAW(0x34A), PRAW(0x34C), PRAW(0x34E),
+ PRAW(0x350), PRAW(0x352), PRAW(0x354), PRAW(0x356),
+ PRAW(0x358), PRAW(0x35A), PRAW(0x35C), PRAW(0x35E),
+ PRAW(0x360), PRAW(0x362), PRAW(0x364), PRAW(0x366),
+ PRAW(0x368), PRAW(0x36A), PRAW(0x36C), PRAW(0x36E),
+ PRAW(0x370), PRAW(0x372), PRAW(0x374), PRAW(0x376),
+ PRAW(0x378), PRAW(0x37A), PRAW(0x37C), PRAW(0x37E),
+ PRAW(0x380), PRAW(0x382), PRAW(0x384), PRAW(0x386),
+ PRAW(0x388), PRAW(0x38A), PRAW(0x38C), PRAW(0x38E),
+ PRAW(0x390), PRAW(0x392), PRAW(0x394), PRAW(0x396),
+ PRAW(0x398), PRAW(0x39A), PRAW(0x39C), PRAW(0x39E),
+ PRAW(0x3A0), PRAW(0x3A2), PRAW(0x3A4), PRAW(0x3A6),
+ PRAW(0x3A8), PRAW(0x3AA), PRAW(0x3AC), PRAW(0x3AE),
+ PRAW(0x3B0), PRAW(0x3B2), PRAW(0x3B4), PRAW(0x3B6),
+ PRAW(0x3B8), PRAW(0x3BA), PRAW(0x3BC), PRAW(0x3BE),
+ PRAW(0x3C0), PRAW(0x3C2), PRAW(0x3C4), PRAW(0x3C6),
+ PRAW(0x3C8), PRAW(0x3CA), PRAW(0x3CC), PRAW(0x3CE),
+ PRAW(0x3D0), PRAW(0x3D2), PRAW(0x3D4), PRAW(0x3D6),
+ PRAW(0x3D8), PRAW(0x3DA), PRAW(0x3DC), PRAW(0x3DE),
+ PRAW(0x3E0), PRAW(0x3E2), PRAW(0x3E4), PRAW(0x3E6),
+ PRAW(0x3E8), PRAW(0x3EA), PRAW(0x3EC), PRAW(0x3EE),
+ PRAW(0x3F0), PRAW(0x3F2), PRAW(0x3F4), PRAW(0x3F6),
+ PRAW(0x3F8), PRAW(0x3FA), PRAW(0x3FC), PRAW(0x3FE),
- //AND... we reached 0x400!
- // Voice Params: 8 params, 24 voices = 0x180 bytes
- PVC(1, 0), PVC(1, 1), PVC(1, 2), PVC(1, 3), PVC(1, 4), PVC(1, 5),
- PVC(1, 6), PVC(1, 7), PVC(1, 8), PVC(1, 9), PVC(1, 10), PVC(1, 11),
- PVC(1, 12), PVC(1, 13), PVC(1, 14), PVC(1, 15), PVC(1, 16), PVC(1, 17),
- PVC(1, 18), PVC(1, 19), PVC(1, 20), PVC(1, 21), PVC(1, 22), PVC(1, 23),
+ //AND... we reached 0x400!
+ // Voice Params: 8 params, 24 voices = 0x180 bytes
+ PVC(1, 0), PVC(1, 1), PVC(1, 2), PVC(1, 3), PVC(1, 4), PVC(1, 5),
+ PVC(1, 6), PVC(1, 7), PVC(1, 8), PVC(1, 9), PVC(1, 10), PVC(1, 11),
+ PVC(1, 12), PVC(1, 13), PVC(1, 14), PVC(1, 15), PVC(1, 16), PVC(1, 17),
+ PVC(1, 18), PVC(1, 19), PVC(1, 20), PVC(1, 21), PVC(1, 22), PVC(1, 23),
- PCORE(1, Regs.PMON),
- PCORE(1, Regs.PMON) + 1,
- PCORE(1, Regs.NON),
- PCORE(1, Regs.NON) + 1,
- PCORE(1, Regs.VMIXL),
- PCORE(1, Regs.VMIXL) + 1,
- PCORE(1, Regs.VMIXEL),
- PCORE(1, Regs.VMIXEL) + 1,
- PCORE(1, Regs.VMIXR),
- PCORE(1, Regs.VMIXR) + 1,
- PCORE(1, Regs.VMIXER),
- PCORE(1, Regs.VMIXER) + 1,
- PCORE(1, Regs.MMIX),
+ PCORE(1, Regs.PMON),
+ PCORE(1, Regs.PMON) + 1,
+ PCORE(1, Regs.NON),
+ PCORE(1, Regs.NON) + 1,
+ PCORE(1, Regs.VMIXL),
+ PCORE(1, Regs.VMIXL) + 1,
+ PCORE(1, Regs.VMIXEL),
+ PCORE(1, Regs.VMIXEL) + 1,
+ PCORE(1, Regs.VMIXR),
+ PCORE(1, Regs.VMIXR) + 1,
+ PCORE(1, Regs.VMIXER),
+ PCORE(1, Regs.VMIXER) + 1,
+ PCORE(1, Regs.MMIX),
- PCORE(1, Regs.ATTR),
+ PCORE(1, Regs.ATTR),
- PCORE(1, IRQA) + 1,
- PCORE(1, IRQA),
+ PCORE(1, IRQA) + 1,
+ PCORE(1, IRQA),
- NULL, NULL,
- NULL, NULL,
+ NULL, NULL,
+ NULL, NULL,
- PCORE(1, TSA) + 1,
- PCORE(1, TSA),
+ PCORE(1, TSA) + 1,
+ PCORE(1, TSA),
- PRAW(0x5ac), PRAW(0x5ae),
+ PRAW(0x5ac), PRAW(0x5ae),
- PCORE(1, AutoDMACtrl),
+ PCORE(1, AutoDMACtrl),
- PRAW(0x5b2), PRAW(0x5b4), PRAW(0x5b6), PRAW(0x5b8), PRAW(0x5ba), PRAW(0x5bc), PRAW(0x5be), // unknown
+ PRAW(0x5b2), PRAW(0x5b4), PRAW(0x5b6), PRAW(0x5b8), PRAW(0x5ba), PRAW(0x5bc), PRAW(0x5be), // unknown
- // Voice Addresses
- PVCA(1, 0), PVCA(1, 1), PVCA(1, 2), PVCA(1, 3), PVCA(1, 4), PVCA(1, 5),
- PVCA(1, 6), PVCA(1, 7), PVCA(1, 8), PVCA(1, 9), PVCA(1, 10), PVCA(1, 11),
- PVCA(1, 12), PVCA(1, 13), PVCA(1, 14), PVCA(1, 15), PVCA(1, 16), PVCA(1, 17),
- PVCA(1, 18), PVCA(1, 19), PVCA(1, 20), PVCA(1, 21), PVCA(1, 22), PVCA(1, 23),
+ // Voice Addresses
+ PVCA(1, 0), PVCA(1, 1), PVCA(1, 2), PVCA(1, 3), PVCA(1, 4), PVCA(1, 5),
+ PVCA(1, 6), PVCA(1, 7), PVCA(1, 8), PVCA(1, 9), PVCA(1, 10), PVCA(1, 11),
+ PVCA(1, 12), PVCA(1, 13), PVCA(1, 14), PVCA(1, 15), PVCA(1, 16), PVCA(1, 17),
+ PVCA(1, 18), PVCA(1, 19), PVCA(1, 20), PVCA(1, 21), PVCA(1, 22), PVCA(1, 23),
- PCORE(1, ExtEffectsStartA) + 1,
- PCORE(1, ExtEffectsStartA),
+ PCORE(1, ExtEffectsStartA) + 1,
+ PCORE(1, ExtEffectsStartA),
- PREVB_REG(1, APF1_SIZE),
- PREVB_REG(1, APF2_SIZE),
- PREVB_REG(1, SAME_L_DST),
- PREVB_REG(1, SAME_R_DST),
- PREVB_REG(1, COMB1_L_SRC),
- PREVB_REG(1, COMB1_R_SRC),
- PREVB_REG(1, COMB2_L_SRC),
- PREVB_REG(1, COMB2_R_SRC),
- PREVB_REG(1, SAME_L_SRC),
- PREVB_REG(1, SAME_R_SRC),
- PREVB_REG(1, DIFF_L_DST),
- PREVB_REG(1, DIFF_R_DST),
- PREVB_REG(1, COMB3_L_SRC),
- PREVB_REG(1, COMB3_R_SRC),
- PREVB_REG(1, COMB4_L_SRC),
- PREVB_REG(1, COMB4_R_SRC),
- PREVB_REG(1, DIFF_L_SRC),
- PREVB_REG(1, DIFF_R_SRC),
- PREVB_REG(1, APF1_L_DST),
- PREVB_REG(1, APF1_R_DST),
- PREVB_REG(1, APF2_L_DST),
- PREVB_REG(1, APF2_R_DST),
+ PREVB_REG(1, APF1_SIZE),
+ PREVB_REG(1, APF2_SIZE),
+ PREVB_REG(1, SAME_L_DST),
+ PREVB_REG(1, SAME_R_DST),
+ PREVB_REG(1, COMB1_L_SRC),
+ PREVB_REG(1, COMB1_R_SRC),
+ PREVB_REG(1, COMB2_L_SRC),
+ PREVB_REG(1, COMB2_R_SRC),
+ PREVB_REG(1, SAME_L_SRC),
+ PREVB_REG(1, SAME_R_SRC),
+ PREVB_REG(1, DIFF_L_DST),
+ PREVB_REG(1, DIFF_R_DST),
+ PREVB_REG(1, COMB3_L_SRC),
+ PREVB_REG(1, COMB3_R_SRC),
+ PREVB_REG(1, COMB4_L_SRC),
+ PREVB_REG(1, COMB4_R_SRC),
+ PREVB_REG(1, DIFF_L_SRC),
+ PREVB_REG(1, DIFF_R_SRC),
+ PREVB_REG(1, APF1_L_DST),
+ PREVB_REG(1, APF1_R_DST),
+ PREVB_REG(1, APF2_L_DST),
+ PREVB_REG(1, APF2_R_DST),
- PCORE(1, ExtEffectsEndA) + 1,
- PCORE(1, ExtEffectsEndA),
+ PCORE(1, ExtEffectsEndA) + 1,
+ PCORE(1, ExtEffectsEndA),
- PCORE(1, Regs.ENDX),
- PCORE(1, Regs.ENDX) + 1,
- PCORE(1, Regs.STATX),
+ PCORE(1, Regs.ENDX),
+ PCORE(1, Regs.ENDX) + 1,
+ PCORE(1, Regs.STATX),
- PRAW(0x746),
- PRAW(0x748), PRAW(0x74A), PRAW(0x74C), PRAW(0x74E),
- PRAW(0x750), PRAW(0x752), PRAW(0x754), PRAW(0x756),
- PRAW(0x758), PRAW(0x75A), PRAW(0x75C), PRAW(0x75E),
+ PRAW(0x746),
+ PRAW(0x748), PRAW(0x74A), PRAW(0x74C), PRAW(0x74E),
+ PRAW(0x750), PRAW(0x752), PRAW(0x754), PRAW(0x756),
+ PRAW(0x758), PRAW(0x75A), PRAW(0x75C), PRAW(0x75E),
- //0x760: weird area
- PCORE(0, MasterVol.Left.Reg_VOL),
- PCORE(0, MasterVol.Right.Reg_VOL),
- PCORE(0, FxVol.Left) + 1,
- PCORE(0, FxVol.Right) + 1,
- PCORE(0, ExtVol.Left) + 1,
- PCORE(0, ExtVol.Right) + 1,
- PCORE(0, InpVol.Left) + 1,
- PCORE(0, InpVol.Right) + 1,
- PCORE(0, MasterVol.Left.Value) + 1,
- PCORE(0, MasterVol.Right.Value) + 1,
- PCORE(0, Revb.IIR_VOL),
- PCORE(0, Revb.COMB1_VOL),
- PCORE(0, Revb.COMB2_VOL),
- PCORE(0, Revb.COMB3_VOL),
- PCORE(0, Revb.COMB4_VOL),
- PCORE(0, Revb.WALL_VOL),
- PCORE(0, Revb.APF1_VOL),
- PCORE(0, Revb.APF2_VOL),
- PCORE(0, Revb.IN_COEF_L),
- PCORE(0, Revb.IN_COEF_R),
+ //0x760: weird area
+ PCORE(0, MasterVol.Left.Reg_VOL),
+ PCORE(0, MasterVol.Right.Reg_VOL),
+ PCORE(0, FxVol.Left) + 1,
+ PCORE(0, FxVol.Right) + 1,
+ PCORE(0, ExtVol.Left) + 1,
+ PCORE(0, ExtVol.Right) + 1,
+ PCORE(0, InpVol.Left) + 1,
+ PCORE(0, InpVol.Right) + 1,
+ PCORE(0, MasterVol.Left.Value) + 1,
+ PCORE(0, MasterVol.Right.Value) + 1,
+ PCORE(0, Revb.IIR_VOL),
+ PCORE(0, Revb.COMB1_VOL),
+ PCORE(0, Revb.COMB2_VOL),
+ PCORE(0, Revb.COMB3_VOL),
+ PCORE(0, Revb.COMB4_VOL),
+ PCORE(0, Revb.WALL_VOL),
+ PCORE(0, Revb.APF1_VOL),
+ PCORE(0, Revb.APF2_VOL),
+ PCORE(0, Revb.IN_COEF_L),
+ PCORE(0, Revb.IN_COEF_R),
- PCORE(1, MasterVol.Left.Reg_VOL),
- PCORE(1, MasterVol.Right.Reg_VOL),
- PCORE(1, FxVol.Left) + 1,
- PCORE(1, FxVol.Right) + 1,
- PCORE(1, ExtVol.Left) + 1,
- PCORE(1, ExtVol.Right) + 1,
- PCORE(1, InpVol.Left) + 1,
- PCORE(1, InpVol.Right) + 1,
- PCORE(1, MasterVol.Left.Value) + 1,
- PCORE(1, MasterVol.Right.Value) + 1,
- PCORE(1, Revb.IIR_VOL),
- PCORE(1, Revb.COMB1_VOL),
- PCORE(1, Revb.COMB2_VOL),
- PCORE(1, Revb.COMB3_VOL),
- PCORE(1, Revb.COMB4_VOL),
- PCORE(1, Revb.WALL_VOL),
- PCORE(1, Revb.APF1_VOL),
- PCORE(1, Revb.APF2_VOL),
- PCORE(1, Revb.IN_COEF_L),
- PCORE(1, Revb.IN_COEF_R),
+ PCORE(1, MasterVol.Left.Reg_VOL),
+ PCORE(1, MasterVol.Right.Reg_VOL),
+ PCORE(1, FxVol.Left) + 1,
+ PCORE(1, FxVol.Right) + 1,
+ PCORE(1, ExtVol.Left) + 1,
+ PCORE(1, ExtVol.Right) + 1,
+ PCORE(1, InpVol.Left) + 1,
+ PCORE(1, InpVol.Right) + 1,
+ PCORE(1, MasterVol.Left.Value) + 1,
+ PCORE(1, MasterVol.Right.Value) + 1,
+ PCORE(1, Revb.IIR_VOL),
+ PCORE(1, Revb.COMB1_VOL),
+ PCORE(1, Revb.COMB2_VOL),
+ PCORE(1, Revb.COMB3_VOL),
+ PCORE(1, Revb.COMB4_VOL),
+ PCORE(1, Revb.WALL_VOL),
+ PCORE(1, Revb.APF1_VOL),
+ PCORE(1, Revb.APF2_VOL),
+ PCORE(1, Revb.IN_COEF_L),
+ PCORE(1, Revb.IN_COEF_R),
- PRAW(0x7B0), PRAW(0x7B2), PRAW(0x7B4), PRAW(0x7B6),
- PRAW(0x7B8), PRAW(0x7BA), PRAW(0x7BC), PRAW(0x7BE),
+ PRAW(0x7B0), PRAW(0x7B2), PRAW(0x7B4), PRAW(0x7B6),
+ PRAW(0x7B8), PRAW(0x7BA), PRAW(0x7BC), PRAW(0x7BE),
- // SPDIF interface
- U16P(Spdif.Out),
- U16P(Spdif.Info),
- U16P(Spdif.Unknown1),
- U16P(Spdif.Mode),
- U16P(Spdif.Media),
- U16P(Spdif.Unknown2),
- U16P(Spdif.Protection),
+ // SPDIF interface
+ U16P(Spdif.Out),
+ U16P(Spdif.Info),
+ U16P(Spdif.Unknown1),
+ U16P(Spdif.Mode),
+ U16P(Spdif.Media),
+ U16P(Spdif.Unknown2),
+ U16P(Spdif.Protection),
- PRAW(0x7CE),
- PRAW(0x7D0), PRAW(0x7D2), PRAW(0x7D4), PRAW(0x7D6),
- PRAW(0x7D8), PRAW(0x7DA), PRAW(0x7DC), PRAW(0x7DE),
- PRAW(0x7E0), PRAW(0x7E2), PRAW(0x7E4), PRAW(0x7E6),
- PRAW(0x7E8), PRAW(0x7EA), PRAW(0x7EC), PRAW(0x7EE),
- PRAW(0x7F0), PRAW(0x7F2), PRAW(0x7F4), PRAW(0x7F6),
- PRAW(0x7F8), PRAW(0x7FA), PRAW(0x7FC), PRAW(0x7FE),
+ PRAW(0x7CE),
+ PRAW(0x7D0), PRAW(0x7D2), PRAW(0x7D4), PRAW(0x7D6),
+ PRAW(0x7D8), PRAW(0x7DA), PRAW(0x7DC), PRAW(0x7DE),
+ PRAW(0x7E0), PRAW(0x7E2), PRAW(0x7E4), PRAW(0x7E6),
+ PRAW(0x7E8), PRAW(0x7EA), PRAW(0x7EC), PRAW(0x7EE),
+ PRAW(0x7F0), PRAW(0x7F2), PRAW(0x7F4), PRAW(0x7F6),
+ PRAW(0x7F8), PRAW(0x7FA), PRAW(0x7FC), PRAW(0x7FE),
- NULL};
+ NULL};
diff --git a/pcsx2/SPU2/Reverb.cpp b/pcsx2/SPU2/Reverb.cpp
index c3afa69b85..e1f0133818 100644
--- a/pcsx2/SPU2/Reverb.cpp
+++ b/pcsx2/SPU2/Reverb.cpp
@@ -17,115 +17,122 @@
__forceinline s32 V_Core::RevbGetIndexer(s32 offset)
{
- u32 pos = ReverbX + offset;
+ u32 pos = ReverbX + offset;
- // Fast and simple single step wrapping, made possible by the preparation of the
- // effects buffer addresses.
+ // Fast and simple single step wrapping, made possible by the preparation of the
+ // effects buffer addresses.
- if (pos > EffectsEndA) {
- pos -= EffectsEndA + 1;
- pos += EffectsStartA;
- }
+ if (pos > EffectsEndA)
+ {
+ pos -= EffectsEndA + 1;
+ pos += EffectsStartA;
+ }
- assert(pos >= EffectsStartA && pos <= EffectsEndA);
- return pos;
+ assert(pos >= EffectsStartA && pos <= EffectsEndA);
+ return pos;
}
void V_Core::Reverb_AdvanceBuffer()
{
- if (RevBuffers.NeedsUpdated)
- UpdateEffectsBufferSize();
+ if (RevBuffers.NeedsUpdated)
+ UpdateEffectsBufferSize();
- if ((Cycles & 1) && (EffectsBufferSize > 0)) {
- ReverbX += 1;
- if (ReverbX >= (u32)EffectsBufferSize)
- ReverbX = 0;
- }
+ if ((Cycles & 1) && (EffectsBufferSize > 0))
+ {
+ ReverbX += 1;
+ if (ReverbX >= (u32)EffectsBufferSize)
+ ReverbX = 0;
+ }
}
/////////////////////////////////////////////////////////////////////////////////////////
-StereoOut32 V_Core::DoReverb(const StereoOut32 &Input)
+StereoOut32 V_Core::DoReverb(const StereoOut32& Input)
{
- if (EffectsBufferSize <= 0) {
- return StereoOut32::Empty;
- }
+ if (EffectsBufferSize <= 0)
+ {
+ return StereoOut32::Empty;
+ }
- bool R = Cycles & 1;
+ bool R = Cycles & 1;
- // Calculate the read/write addresses we'll be needing for this session of reverb.
+ // Calculate the read/write addresses we'll be needing for this session of reverb.
- const u32 same_src = RevbGetIndexer(R ? RevBuffers.SAME_R_SRC : RevBuffers.SAME_L_SRC);
- const u32 same_dst = RevbGetIndexer(R ? RevBuffers.SAME_R_DST : RevBuffers.SAME_L_DST);
- const u32 same_prv = RevbGetIndexer(R ? RevBuffers.SAME_R_PRV : RevBuffers.SAME_L_PRV);
+ const u32 same_src = RevbGetIndexer(R ? RevBuffers.SAME_R_SRC : RevBuffers.SAME_L_SRC);
+ const u32 same_dst = RevbGetIndexer(R ? RevBuffers.SAME_R_DST : RevBuffers.SAME_L_DST);
+ const u32 same_prv = RevbGetIndexer(R ? RevBuffers.SAME_R_PRV : RevBuffers.SAME_L_PRV);
- const u32 diff_src = RevbGetIndexer(R ? RevBuffers.DIFF_L_SRC : RevBuffers.DIFF_R_SRC);
- const u32 diff_dst = RevbGetIndexer(R ? RevBuffers.DIFF_R_DST : RevBuffers.DIFF_L_DST);
- const u32 diff_prv = RevbGetIndexer(R ? RevBuffers.DIFF_R_PRV : RevBuffers.DIFF_L_PRV);
+ const u32 diff_src = RevbGetIndexer(R ? RevBuffers.DIFF_L_SRC : RevBuffers.DIFF_R_SRC);
+ const u32 diff_dst = RevbGetIndexer(R ? RevBuffers.DIFF_R_DST : RevBuffers.DIFF_L_DST);
+ const u32 diff_prv = RevbGetIndexer(R ? RevBuffers.DIFF_R_PRV : RevBuffers.DIFF_L_PRV);
- const u32 comb1_src = RevbGetIndexer(R ? RevBuffers.COMB1_R_SRC : RevBuffers.COMB1_L_SRC);
- const u32 comb2_src = RevbGetIndexer(R ? RevBuffers.COMB2_R_SRC : RevBuffers.COMB2_L_SRC);
- const u32 comb3_src = RevbGetIndexer(R ? RevBuffers.COMB3_R_SRC : RevBuffers.COMB3_L_SRC);
- const u32 comb4_src = RevbGetIndexer(R ? RevBuffers.COMB4_R_SRC : RevBuffers.COMB4_L_SRC);
+ const u32 comb1_src = RevbGetIndexer(R ? RevBuffers.COMB1_R_SRC : RevBuffers.COMB1_L_SRC);
+ const u32 comb2_src = RevbGetIndexer(R ? RevBuffers.COMB2_R_SRC : RevBuffers.COMB2_L_SRC);
+ const u32 comb3_src = RevbGetIndexer(R ? RevBuffers.COMB3_R_SRC : RevBuffers.COMB3_L_SRC);
+ const u32 comb4_src = RevbGetIndexer(R ? RevBuffers.COMB4_R_SRC : RevBuffers.COMB4_L_SRC);
- const u32 apf1_src = RevbGetIndexer(R ? RevBuffers.APF1_R_SRC : RevBuffers.APF1_L_SRC);
- const u32 apf1_dst = RevbGetIndexer(R ? RevBuffers.APF1_R_DST : RevBuffers.APF1_L_DST);
- const u32 apf2_src = RevbGetIndexer(R ? RevBuffers.APF2_R_SRC : RevBuffers.APF2_L_SRC);
- const u32 apf2_dst = RevbGetIndexer(R ? RevBuffers.APF2_R_DST : RevBuffers.APF2_L_DST);
+ const u32 apf1_src = RevbGetIndexer(R ? RevBuffers.APF1_R_SRC : RevBuffers.APF1_L_SRC);
+ const u32 apf1_dst = RevbGetIndexer(R ? RevBuffers.APF1_R_DST : RevBuffers.APF1_L_DST);
+ const u32 apf2_src = RevbGetIndexer(R ? RevBuffers.APF2_R_SRC : RevBuffers.APF2_L_SRC);
+ const u32 apf2_dst = RevbGetIndexer(R ? RevBuffers.APF2_R_DST : RevBuffers.APF2_L_DST);
- // -----------------------------------------
- // Optimized IRQ Testing !
- // -----------------------------------------
+ // -----------------------------------------
+ // Optimized IRQ Testing !
+ // -----------------------------------------
- // This test is enhanced by using the reverb effects area begin/end test as a
- // shortcut, since all buffer addresses are within that area. If the IRQA isn't
- // within that zone then the "bulk" of the test is skipped, so this should only
- // be a slowdown on a few evil games.
+ // This test is enhanced by using the reverb effects area begin/end test as a
+ // shortcut, since all buffer addresses are within that area. If the IRQA isn't
+ // within that zone then the "bulk" of the test is skipped, so this should only
+ // be a slowdown on a few evil games.
- for (int i = 0; i < 2; i++) {
- if (Cores[i].IRQEnable && ((Cores[i].IRQA >= EffectsStartA) && (Cores[i].IRQA <= EffectsEndA))) {
- if ((Cores[i].IRQA == same_src) || (Cores[i].IRQA == diff_src) ||
- (Cores[i].IRQA == same_dst) || (Cores[i].IRQA == diff_dst) ||
- (Cores[i].IRQA == same_prv) || (Cores[i].IRQA == diff_prv) ||
+ for (int i = 0; i < 2; i++)
+ {
+ if (Cores[i].IRQEnable && ((Cores[i].IRQA >= EffectsStartA) && (Cores[i].IRQA <= EffectsEndA)))
+ {
+ if ((Cores[i].IRQA == same_src) || (Cores[i].IRQA == diff_src) ||
+ (Cores[i].IRQA == same_dst) || (Cores[i].IRQA == diff_dst) ||
+ (Cores[i].IRQA == same_prv) || (Cores[i].IRQA == diff_prv) ||
- (Cores[i].IRQA == comb1_src) || (Cores[i].IRQA == comb2_src) ||
- (Cores[i].IRQA == comb3_src) || (Cores[i].IRQA == comb4_src) ||
+ (Cores[i].IRQA == comb1_src) || (Cores[i].IRQA == comb2_src) ||
+ (Cores[i].IRQA == comb3_src) || (Cores[i].IRQA == comb4_src) ||
- (Cores[i].IRQA == apf1_dst) || (Cores[i].IRQA == apf1_src) ||
- (Cores[i].IRQA == apf2_dst) || (Cores[i].IRQA == apf2_src)) {
- //printf("Core %d IRQ Called (Reverb). IRQA = %x\n",i,addr);
- SetIrqCall(i);
- }
- }
- }
+ (Cores[i].IRQA == apf1_dst) || (Cores[i].IRQA == apf1_src) ||
+ (Cores[i].IRQA == apf2_dst) || (Cores[i].IRQA == apf2_src))
+ {
+ //printf("Core %d IRQ Called (Reverb). IRQA = %x\n",i,addr);
+ SetIrqCall(i);
+ }
+ }
+ }
- // Reverb algorithm pretty much directly ripped from http://drhell.web.fc2.com/ps1/
- // minus the 35 step FIR which just seems to break things.
+ // Reverb algorithm pretty much directly ripped from http://drhell.web.fc2.com/ps1/
+ // minus the 35 step FIR which just seems to break things.
- s32 in, same, diff, apf1, apf2, out;
+ s32 in, same, diff, apf1, apf2, out;
#define MUL(x, y) ((x) * (y) >> 15)
- in = MUL(R ? Revb.IN_COEF_R : Revb.IN_COEF_L, R ? Input.Right : Input.Left);
+ in = MUL(R ? Revb.IN_COEF_R : Revb.IN_COEF_L, R ? Input.Right : Input.Left);
- same = MUL(Revb.IIR_VOL, in + MUL(Revb.WALL_VOL, _spu2mem[same_src]) - _spu2mem[same_prv]) + _spu2mem[same_prv];
- diff = MUL(Revb.IIR_VOL, in + MUL(Revb.WALL_VOL, _spu2mem[diff_src]) - _spu2mem[diff_prv]) + _spu2mem[diff_prv];
+ same = MUL(Revb.IIR_VOL, in + MUL(Revb.WALL_VOL, _spu2mem[same_src]) - _spu2mem[same_prv]) + _spu2mem[same_prv];
+ diff = MUL(Revb.IIR_VOL, in + MUL(Revb.WALL_VOL, _spu2mem[diff_src]) - _spu2mem[diff_prv]) + _spu2mem[diff_prv];
- out = MUL(Revb.COMB1_VOL, _spu2mem[comb1_src]) + MUL(Revb.COMB2_VOL, _spu2mem[comb2_src]) + MUL(Revb.COMB3_VOL, _spu2mem[comb3_src]) + MUL(Revb.COMB4_VOL, _spu2mem[comb4_src]);
+ out = MUL(Revb.COMB1_VOL, _spu2mem[comb1_src]) + MUL(Revb.COMB2_VOL, _spu2mem[comb2_src]) + MUL(Revb.COMB3_VOL, _spu2mem[comb3_src]) + MUL(Revb.COMB4_VOL, _spu2mem[comb4_src]);
- apf1 = out - MUL(Revb.APF1_VOL, _spu2mem[apf1_src]);
- out = _spu2mem[apf1_src] + MUL(Revb.APF1_VOL, apf1);
- apf2 = out - MUL(Revb.APF2_VOL, _spu2mem[apf2_src]);
- out = _spu2mem[apf2_src] + MUL(Revb.APF2_VOL, apf2);
+ apf1 = out - MUL(Revb.APF1_VOL, _spu2mem[apf1_src]);
+ out = _spu2mem[apf1_src] + MUL(Revb.APF1_VOL, apf1);
+ apf2 = out - MUL(Revb.APF2_VOL, _spu2mem[apf2_src]);
+ out = _spu2mem[apf2_src] + MUL(Revb.APF2_VOL, apf2);
- // According to no$psx the effects always run but don't always write back, see check in V_Core::Mix
- if (FxEnable) {
- _spu2mem[same_dst] = clamp_mix(same);
- _spu2mem[diff_dst] = clamp_mix(diff);
- _spu2mem[apf1_dst] = clamp_mix(apf1);
- _spu2mem[apf2_dst] = clamp_mix(apf2);
- }
+ // According to no$psx the effects always run but don't always write back, see check in V_Core::Mix
+ if (FxEnable)
+ {
+ _spu2mem[same_dst] = clamp_mix(same);
+ _spu2mem[diff_dst] = clamp_mix(diff);
+ _spu2mem[apf1_dst] = clamp_mix(apf1);
+ _spu2mem[apf2_dst] = clamp_mix(apf2);
+ }
- (R ? LastEffect.Right : LastEffect.Left) = -clamp_mix(out);
+ (R ? LastEffect.Right : LastEffect.Left) = -clamp_mix(out);
- return LastEffect;
+ return LastEffect;
}
diff --git a/pcsx2/SPU2/SndOut.cpp b/pcsx2/SPU2/SndOut.cpp
index c46d3551c5..ccdcafa4d8 100644
--- a/pcsx2/SPU2/SndOut.cpp
+++ b/pcsx2/SPU2/SndOut.cpp
@@ -18,208 +18,219 @@
StereoOut32 StereoOut32::Empty(0, 0);
-StereoOut32::StereoOut32(const StereoOut16 &src)
- : Left(src.Left)
- , Right(src.Right)
+StereoOut32::StereoOut32(const StereoOut16& src)
+ : Left(src.Left)
+ , Right(src.Right)
{
}
-StereoOut32::StereoOut32(const StereoOutFloat &src)
- : Left((s32)(src.Left * 2147483647.0f))
- , Right((s32)(src.Right * 2147483647.0f))
+StereoOut32::StereoOut32(const StereoOutFloat& src)
+ : Left((s32)(src.Left * 2147483647.0f))
+ , Right((s32)(src.Right * 2147483647.0f))
{
}
StereoOut16 StereoOut32::DownSample() const
{
- return StereoOut16(
- Left >> SndOutVolumeShift,
- Right >> SndOutVolumeShift);
+ return StereoOut16(
+ Left >> SndOutVolumeShift,
+ Right >> SndOutVolumeShift);
}
StereoOut32 StereoOut16::UpSample() const
{
- return StereoOut32(
- Left << SndOutVolumeShift,
- Right << SndOutVolumeShift);
+ return StereoOut32(
+ Left << SndOutVolumeShift,
+ Right << SndOutVolumeShift);
}
class NullOutModule : public SndOutModule
{
public:
- s32 Init() { return 0; }
- void Close() {}
- s32 Test() const { return 0; }
- void Configure(uptr parent) {}
- int GetEmptySampleCount() { return 0; }
+ s32 Init() { return 0; }
+ void Close() {}
+ s32 Test() const { return 0; }
+ void Configure(uptr parent) {}
+ int GetEmptySampleCount() { return 0; }
- const wchar_t *GetIdent() const
- {
- return L"nullout";
- }
+ const wchar_t* GetIdent() const
+ {
+ return L"nullout";
+ }
- const wchar_t *GetLongName() const
- {
- return L"No Sound (Emulate SPU2 only)";
- }
+ const wchar_t* GetLongName() const
+ {
+ return L"No Sound (Emulate SPU2 only)";
+ }
- void ReadSettings()
- {
- }
+ void ReadSettings()
+ {
+ }
- void SetApiSettings(wxString api)
- {
- }
+ void SetApiSettings(wxString api)
+ {
+ }
- void WriteSettings() const
- {
- }
+ void WriteSettings() const
+ {
+ }
} NullOut;
-SndOutModule *mods[] =
- {
- &NullOut,
+SndOutModule* mods[] =
+ {
+ &NullOut,
#ifdef _MSC_VER
- XAudio2Out,
- DSoundOut,
- WaveOut,
+ XAudio2Out,
+ DSoundOut,
+ WaveOut,
#endif
#if defined(_WIN32) || defined(SPU2X_PORTAUDIO)
- PortaudioOut,
+ PortaudioOut,
#endif
- SDLOut,
+ SDLOut,
#if defined(__linux__) /* && defined(__ALSA__)*/
- AlsaOut,
+ AlsaOut,
#endif
- NULL // signals the end of our list
+ NULL // signals the end of our list
};
-int FindOutputModuleById(const wchar_t *omodid)
+int FindOutputModuleById(const wchar_t* omodid)
{
- int modcnt = 0;
- while (mods[modcnt] != NULL) {
- if (wcscmp(mods[modcnt]->GetIdent(), omodid) == 0)
- break;
- ++modcnt;
- }
- return modcnt;
+ int modcnt = 0;
+ while (mods[modcnt] != NULL)
+ {
+ if (wcscmp(mods[modcnt]->GetIdent(), omodid) == 0)
+ break;
+ ++modcnt;
+ }
+ return modcnt;
}
-StereoOut32 *SndBuffer::m_buffer;
+StereoOut32* SndBuffer::m_buffer;
s32 SndBuffer::m_size;
__aligned(4) volatile s32 SndBuffer::m_rpos;
__aligned(4) volatile s32 SndBuffer::m_wpos;
bool SndBuffer::m_underrun_freeze;
-StereoOut32 *SndBuffer::sndTempBuffer = NULL;
-StereoOut16 *SndBuffer::sndTempBuffer16 = NULL;
+StereoOut32* SndBuffer::sndTempBuffer = NULL;
+StereoOut16* SndBuffer::sndTempBuffer16 = NULL;
int SndBuffer::sndTempProgress = 0;
int GetAlignedBufferSize(int comp)
{
- return (comp + SndOutPacketSize - 1) & ~(SndOutPacketSize - 1);
+ return (comp + SndOutPacketSize - 1) & ~(SndOutPacketSize - 1);
}
// Returns TRUE if there is data to be output, or false if no data
// is available to be copied.
-bool SndBuffer::CheckUnderrunStatus(int &nSamples, int &quietSampleCount)
+bool SndBuffer::CheckUnderrunStatus(int& nSamples, int& quietSampleCount)
{
- quietSampleCount = 0;
+ quietSampleCount = 0;
- int data = _GetApproximateDataInBuffer();
- if (m_underrun_freeze) {
- int toFill = m_size / ((SynchMode == 2) ? 32 : 400); // TimeStretch and Async off?
- toFill = GetAlignedBufferSize(toFill);
+ int data = _GetApproximateDataInBuffer();
+ if (m_underrun_freeze)
+ {
+ int toFill = m_size / ((SynchMode == 2) ? 32 : 400); // TimeStretch and Async off?
+ toFill = GetAlignedBufferSize(toFill);
- // toFill is now aligned to a SndOutPacket
+ // toFill is now aligned to a SndOutPacket
- if (data < toFill) {
- quietSampleCount = nSamples;
- return false;
- }
+ if (data < toFill)
+ {
+ quietSampleCount = nSamples;
+ return false;
+ }
- m_underrun_freeze = false;
- if (MsgOverruns())
- ConLog(" * SPU2 > Underrun compensation (%d packets buffered)\n", toFill / SndOutPacketSize);
- lastPct = 0.0; // normalize timestretcher
- } else if (data < nSamples) {
- nSamples = data;
- quietSampleCount = SndOutPacketSize - data;
- m_underrun_freeze = true;
+ m_underrun_freeze = false;
+ if (MsgOverruns())
+ ConLog(" * SPU2 > Underrun compensation (%d packets buffered)\n", toFill / SndOutPacketSize);
+ lastPct = 0.0; // normalize timestretcher
+ }
+ else if (data < nSamples)
+ {
+ nSamples = data;
+ quietSampleCount = SndOutPacketSize - data;
+ m_underrun_freeze = true;
- if (SynchMode == 0) // TimeStrech on
- timeStretchUnderrun();
+ if (SynchMode == 0) // TimeStrech on
+ timeStretchUnderrun();
- return nSamples != 0;
- }
+ return nSamples != 0;
+ }
- return true;
+ return true;
}
void SndBuffer::_InitFail()
{
- // If a failure occurs, just initialize the NoSound driver. This'll allow
- // the game to emulate properly (hopefully), albeit without sound.
- OutputModule = FindOutputModuleById(NullOut.GetIdent());
- mods[OutputModule]->Init();
+ // If a failure occurs, just initialize the NoSound driver. This'll allow
+ // the game to emulate properly (hopefully), albeit without sound.
+ OutputModule = FindOutputModuleById(NullOut.GetIdent());
+ mods[OutputModule]->Init();
}
int SndBuffer::_GetApproximateDataInBuffer()
{
- // WARNING: not necessarily 100% up to date by the time it's used, but it will have to do.
- return (m_wpos + m_size - m_rpos) % m_size;
+ // WARNING: not necessarily 100% up to date by the time it's used, but it will have to do.
+ return (m_wpos + m_size - m_rpos) % m_size;
}
-void SndBuffer::_WriteSamples_Internal(StereoOut32 *bData, int nSamples)
+void SndBuffer::_WriteSamples_Internal(StereoOut32* bData, int nSamples)
{
- // WARNING: This assumes the write will NOT wrap around,
- // and also assumes there's enough free space in the buffer.
+ // WARNING: This assumes the write will NOT wrap around,
+ // and also assumes there's enough free space in the buffer.
- memcpy(m_buffer + m_wpos, bData, nSamples * sizeof(StereoOut32));
- m_wpos = (m_wpos + nSamples) % m_size;
+ memcpy(m_buffer + m_wpos, bData, nSamples * sizeof(StereoOut32));
+ m_wpos = (m_wpos + nSamples) % m_size;
}
void SndBuffer::_DropSamples_Internal(int nSamples)
{
- m_rpos = (m_rpos + nSamples) % m_size;
+ m_rpos = (m_rpos + nSamples) % m_size;
}
-void SndBuffer::_ReadSamples_Internal(StereoOut32 *bData, int nSamples)
+void SndBuffer::_ReadSamples_Internal(StereoOut32* bData, int nSamples)
{
- // WARNING: This assumes the read will NOT wrap around,
- // and also assumes there's enough data in the buffer.
- memcpy(bData, m_buffer + m_rpos, nSamples * sizeof(StereoOut32));
- _DropSamples_Internal(nSamples);
+ // WARNING: This assumes the read will NOT wrap around,
+ // and also assumes there's enough data in the buffer.
+ memcpy(bData, m_buffer + m_rpos, nSamples * sizeof(StereoOut32));
+ _DropSamples_Internal(nSamples);
}
-void SndBuffer::_WriteSamples_Safe(StereoOut32 *bData, int nSamples)
+void SndBuffer::_WriteSamples_Safe(StereoOut32* bData, int nSamples)
{
- // WARNING: This code assumes there's only ONE writing process.
- if ((m_size - m_wpos) < nSamples) {
- int b1 = m_size - m_wpos;
- int b2 = nSamples - b1;
+ // WARNING: This code assumes there's only ONE writing process.
+ if ((m_size - m_wpos) < nSamples)
+ {
+ int b1 = m_size - m_wpos;
+ int b2 = nSamples - b1;
- _WriteSamples_Internal(bData, b1);
- _WriteSamples_Internal(bData + b1, b2);
- } else {
- _WriteSamples_Internal(bData, nSamples);
- }
+ _WriteSamples_Internal(bData, b1);
+ _WriteSamples_Internal(bData + b1, b2);
+ }
+ else
+ {
+ _WriteSamples_Internal(bData, nSamples);
+ }
}
-void SndBuffer::_ReadSamples_Safe(StereoOut32 *bData, int nSamples)
+void SndBuffer::_ReadSamples_Safe(StereoOut32* bData, int nSamples)
{
- // WARNING: This code assumes there's only ONE reading process.
- if ((m_size - m_rpos) < nSamples) {
- int b1 = m_size - m_rpos;
- int b2 = nSamples - b1;
+ // WARNING: This code assumes there's only ONE reading process.
+ if ((m_size - m_rpos) < nSamples)
+ {
+ int b1 = m_size - m_rpos;
+ int b2 = nSamples - b1;
- _ReadSamples_Internal(bData, b1);
- _ReadSamples_Internal(bData + b1, b2);
- } else {
- _ReadSamples_Internal(bData, nSamples);
- }
+ _ReadSamples_Internal(bData, b1);
+ _ReadSamples_Internal(bData + b1, b2);
+ }
+ else
+ {
+ _ReadSamples_Internal(bData, nSamples);
+ }
}
// Note: When using with 32 bit output buffers, the user of this function is responsible
@@ -227,100 +238,105 @@ void SndBuffer::_ReadSamples_Safe(StereoOut32 *bData, int nSamples)
// the sample output is determined by the SndOutVolumeShift, which is the number of bits
// to shift right to get a 16 bit result.
template
-void SndBuffer::ReadSamples(T *bData)
+void SndBuffer::ReadSamples(T* bData)
{
- int nSamples = SndOutPacketSize;
+ int nSamples = SndOutPacketSize;
- // Problem:
- // If the SPU2 gets even the least bit out of sync with the SndOut device,
- // the readpos of the circular buffer will overtake the writepos,
- // leading to a prolonged period of hopscotching read/write accesses (ie,
- // lots of staticy crap sound for several seconds).
- //
- // Fix:
- // If the read position overtakes the write position, abort the
- // transfer immediately and force the SndOut driver to wait until
- // the read buffer has filled up again before proceeding.
- // This will cause one brief hiccup that can never exceed the user's
- // set buffer length in duration.
+ // Problem:
+ // If the SPU2 gets even the least bit out of sync with the SndOut device,
+ // the readpos of the circular buffer will overtake the writepos,
+ // leading to a prolonged period of hopscotching read/write accesses (ie,
+ // lots of staticy crap sound for several seconds).
+ //
+ // Fix:
+ // If the read position overtakes the write position, abort the
+ // transfer immediately and force the SndOut driver to wait until
+ // the read buffer has filled up again before proceeding.
+ // This will cause one brief hiccup that can never exceed the user's
+ // set buffer length in duration.
- int quietSamples;
- if (CheckUnderrunStatus(nSamples, quietSamples)) {
- pxAssume(nSamples <= SndOutPacketSize);
+ int quietSamples;
+ if (CheckUnderrunStatus(nSamples, quietSamples))
+ {
+ pxAssume(nSamples <= SndOutPacketSize);
- // WARNING: This code assumes there's only ONE reading process.
- int b1 = m_size - m_rpos;
+ // WARNING: This code assumes there's only ONE reading process.
+ int b1 = m_size - m_rpos;
- if (b1 > nSamples)
- b1 = nSamples;
+ if (b1 > nSamples)
+ b1 = nSamples;
- if (AdvancedVolumeControl) {
- // First part
- for (int i = 0; i < b1; i++)
- bData[i].AdjustFrom(m_buffer[i + m_rpos]);
+ if (AdvancedVolumeControl)
+ {
+ // First part
+ for (int i = 0; i < b1; i++)
+ bData[i].AdjustFrom(m_buffer[i + m_rpos]);
- // Second part
- int b2 = nSamples - b1;
- for (int i = 0; i < b2; i++)
- bData[i + b1].AdjustFrom(m_buffer[i]);
- } else {
- // First part
- for (int i = 0; i < b1; i++)
- bData[i].ResampleFrom(m_buffer[i + m_rpos]);
+ // Second part
+ int b2 = nSamples - b1;
+ for (int i = 0; i < b2; i++)
+ bData[i + b1].AdjustFrom(m_buffer[i]);
+ }
+ else
+ {
+ // First part
+ for (int i = 0; i < b1; i++)
+ bData[i].ResampleFrom(m_buffer[i + m_rpos]);
- // Second part
- int b2 = nSamples - b1;
- for (int i = 0; i < b2; i++)
- bData[i + b1].ResampleFrom(m_buffer[i]);
- }
+ // Second part
+ int b2 = nSamples - b1;
+ for (int i = 0; i < b2; i++)
+ bData[i + b1].ResampleFrom(m_buffer[i]);
+ }
- _DropSamples_Internal(nSamples);
- }
+ _DropSamples_Internal(nSamples);
+ }
- // If quietSamples != 0 it means we have an underrun...
- // Let's just dull out some silence, because that's usually the least
- // painful way of dealing with underruns:
- std::fill_n(bData, quietSamples, T{});
+ // If quietSamples != 0 it means we have an underrun...
+ // Let's just dull out some silence, because that's usually the least
+ // painful way of dealing with underruns:
+ std::fill_n(bData, quietSamples, T{});
}
-template void SndBuffer::ReadSamples(StereoOut16 *);
-template void SndBuffer::ReadSamples(StereoOut32 *);
+template void SndBuffer::ReadSamples(StereoOut16*);
+template void SndBuffer::ReadSamples(StereoOut32*);
//template void SndBuffer::ReadSamples(StereoOutFloat*);
-template void SndBuffer::ReadSamples(Stereo21Out16 *);
-template void SndBuffer::ReadSamples(Stereo40Out16 *);
-template void SndBuffer::ReadSamples(Stereo41Out16 *);
-template void SndBuffer::ReadSamples(Stereo51Out16 *);
-template void SndBuffer::ReadSamples(Stereo51Out16Dpl *);
-template void SndBuffer::ReadSamples(Stereo51Out16DplII *);
-template void SndBuffer::ReadSamples(Stereo71Out16 *);
+template void SndBuffer::ReadSamples(Stereo21Out16*);
+template void SndBuffer::ReadSamples(Stereo40Out16*);
+template void SndBuffer::ReadSamples(Stereo41Out16*);
+template void SndBuffer::ReadSamples(Stereo51Out16*);
+template void SndBuffer::ReadSamples(Stereo51Out16Dpl*);
+template void SndBuffer::ReadSamples(Stereo51Out16DplII*);
+template void SndBuffer::ReadSamples(Stereo71Out16*);
-template void SndBuffer::ReadSamples(Stereo20Out32 *);
-template void SndBuffer::ReadSamples(Stereo21Out32 *);
-template void SndBuffer::ReadSamples(Stereo40Out32 *);
-template void SndBuffer::ReadSamples(Stereo41Out32 *);
-template void SndBuffer::ReadSamples(Stereo51Out32 *);
-template void SndBuffer::ReadSamples(Stereo51Out32Dpl *);
-template void SndBuffer::ReadSamples(Stereo51Out32DplII *);
-template void SndBuffer::ReadSamples(Stereo71Out32 *);
+template void SndBuffer::ReadSamples(Stereo20Out32*);
+template void SndBuffer::ReadSamples(Stereo21Out32*);
+template void SndBuffer::ReadSamples(Stereo40Out32*);
+template void SndBuffer::ReadSamples(Stereo41Out32*);
+template void SndBuffer::ReadSamples(Stereo51Out32*);
+template void SndBuffer::ReadSamples(Stereo51Out32Dpl*);
+template void SndBuffer::ReadSamples(Stereo51Out32DplII*);
+template void SndBuffer::ReadSamples(Stereo71Out32*);
-void SndBuffer::_WriteSamples(StereoOut32 *bData, int nSamples)
+void SndBuffer::_WriteSamples(StereoOut32* bData, int nSamples)
{
- m_predictData = 0;
+ m_predictData = 0;
- // Problem:
- // If the SPU2 gets out of sync with the SndOut device, the writepos of the
- // circular buffer will overtake the readpos, leading to a prolonged period
- // of hopscotching read/write accesses (ie, lots of staticy crap sound for
- // several seconds).
- //
- // Compromise:
- // When an overrun occurs, we adapt by discarding a portion of the buffer.
- // The older portion of the buffer is discarded rather than incoming data,
- // so that the overall audio synchronization is better.
+ // Problem:
+ // If the SPU2 gets out of sync with the SndOut device, the writepos of the
+ // circular buffer will overtake the readpos, leading to a prolonged period
+ // of hopscotching read/write accesses (ie, lots of staticy crap sound for
+ // several seconds).
+ //
+ // Compromise:
+ // When an overrun occurs, we adapt by discarding a portion of the buffer.
+ // The older portion of the buffer is discarded rather than incoming data,
+ // so that the overall audio synchronization is better.
- int free = m_size - _GetApproximateDataInBuffer(); // -1, but the <= handles that
- if (free <= nSamples) {
+ int free = m_size - _GetApproximateDataInBuffer(); // -1, but the <= handles that
+ if (free <= nSamples)
+ {
// Disabled since the lock-free queue can't handle changing the read end from the write thread
#if 0
// Buffer overrun!
@@ -346,65 +362,69 @@ void SndBuffer::_WriteSamples(StereoOut32 *bData, int nSamples)
ConLog(" * SPU2 > Overrun Compensation (%d packets tossed)\n", comp / SndOutPacketSize );
lastPct = 0.0; // normalize the timestretcher
#else
- if (MsgOverruns())
- ConLog(" * SPU2 > Overrun! 1 packet tossed)\n");
- lastPct = 0.0; // normalize the timestretcher
- return;
+ if (MsgOverruns())
+ ConLog(" * SPU2 > Overrun! 1 packet tossed)\n");
+ lastPct = 0.0; // normalize the timestretcher
+ return;
#endif
- }
+ }
- _WriteSamples_Safe(bData, nSamples);
+ _WriteSamples_Safe(bData, nSamples);
}
void SndBuffer::Init()
{
- if (mods[OutputModule] == NULL) {
- _InitFail();
- return;
- }
+ if (mods[OutputModule] == NULL)
+ {
+ _InitFail();
+ return;
+ }
- // initialize sound buffer
- // Buffer actually attempts to run ~50%, so allocate near double what
- // the requested latency is:
+ // initialize sound buffer
+ // Buffer actually attempts to run ~50%, so allocate near double what
+ // the requested latency is:
- m_rpos = 0;
- m_wpos = 0;
+ m_rpos = 0;
+ m_wpos = 0;
- try {
- const float latencyMS = SndOutLatencyMS * 16;
- m_size = GetAlignedBufferSize((int)(latencyMS * SampleRate / 1000.0f));
- printf("%d SampleRate: \n", SampleRate);
- m_buffer = new StereoOut32[m_size];
- m_underrun_freeze = false;
+ try
+ {
+ const float latencyMS = SndOutLatencyMS * 16;
+ m_size = GetAlignedBufferSize((int)(latencyMS * SampleRate / 1000.0f));
+ printf("%d SampleRate: \n", SampleRate);
+ m_buffer = new StereoOut32[m_size];
+ m_underrun_freeze = false;
- sndTempBuffer = new StereoOut32[SndOutPacketSize];
- sndTempBuffer16 = new StereoOut16[SndOutPacketSize * 2]; // in case of leftovers.
- } catch (std::bad_alloc &) {
- // out of memory exception (most likely)
+ sndTempBuffer = new StereoOut32[SndOutPacketSize];
+ sndTempBuffer16 = new StereoOut16[SndOutPacketSize * 2]; // in case of leftovers.
+ }
+ catch (std::bad_alloc&)
+ {
+ // out of memory exception (most likely)
- SysMessage("Out of memory error occurred while initializing SPU2.");
- _InitFail();
- return;
- }
+ SysMessage("Out of memory error occurred while initializing SPU2.");
+ _InitFail();
+ return;
+ }
- sndTempProgress = 0;
+ sndTempProgress = 0;
- soundtouchInit(); // initializes the timestretching
+ soundtouchInit(); // initializes the timestretching
- // initialize module
- if (mods[OutputModule]->Init() == -1)
- _InitFail();
+ // initialize module
+ if (mods[OutputModule]->Init() == -1)
+ _InitFail();
}
void SndBuffer::Cleanup()
{
- mods[OutputModule]->Close();
+ mods[OutputModule]->Close();
- soundtouchCleanup();
+ soundtouchCleanup();
- safe_delete_array(m_buffer);
- safe_delete_array(sndTempBuffer);
- safe_delete_array(sndTempBuffer16);
+ safe_delete_array(m_buffer);
+ safe_delete_array(sndTempBuffer);
+ safe_delete_array(sndTempBuffer16);
}
int SndBuffer::m_dsp_progress = 0;
@@ -414,78 +434,85 @@ int SndBuffer::ssFreeze = 0;
void SndBuffer::ClearContents()
{
- SndBuffer::soundtouchClearContents();
- SndBuffer::ssFreeze = 256; //Delays sound output for about 1 second.
+ SndBuffer::soundtouchClearContents();
+ SndBuffer::ssFreeze = 256; //Delays sound output for about 1 second.
}
-void SndBuffer::Write(const StereoOut32 &Sample)
+void SndBuffer::Write(const StereoOut32& Sample)
{
- // Log final output to wavefile.
- WaveDump::WriteCore(1, CoreSrc_External, Sample.DownSample());
+ // Log final output to wavefile.
+ WaveDump::WriteCore(1, CoreSrc_External, Sample.DownSample());
- if (WavRecordEnabled)
- RecordWrite(Sample.DownSample());
+ if (WavRecordEnabled)
+ RecordWrite(Sample.DownSample());
- if (mods[OutputModule] == &NullOut) // null output doesn't need buffering or stretching! :p
- return;
+ if (mods[OutputModule] == &NullOut) // null output doesn't need buffering or stretching! :p
+ return;
- sndTempBuffer[sndTempProgress++] = Sample;
+ sndTempBuffer[sndTempProgress++] = Sample;
- // If we haven't accumulated a full packet yet, do nothing more:
- if (sndTempProgress < SndOutPacketSize)
- return;
- sndTempProgress = 0;
+ // If we haven't accumulated a full packet yet, do nothing more:
+ if (sndTempProgress < SndOutPacketSize)
+ return;
+ sndTempProgress = 0;
- //Don't play anything directly after loading a savestate, avoids static killing your speakers.
- if (ssFreeze > 0) {
- ssFreeze--;
- // Play silence
- std::fill_n(sndTempBuffer, SndOutPacketSize, StereoOut32{});
- }
+ //Don't play anything directly after loading a savestate, avoids static killing your speakers.
+ if (ssFreeze > 0)
+ {
+ ssFreeze--;
+ // Play silence
+ std::fill_n(sndTempBuffer, SndOutPacketSize, StereoOut32{});
+ }
#ifndef __POSIX__
- if (dspPluginEnabled) {
- // Convert in, send to winamp DSP, and convert out.
+ if (dspPluginEnabled)
+ {
+ // Convert in, send to winamp DSP, and convert out.
- int ei = m_dsp_progress;
- for (int i = 0; i < SndOutPacketSize; ++i, ++ei) {
- sndTempBuffer16[ei] = sndTempBuffer[i].DownSample();
- }
- m_dsp_progress += DspProcess((s16 *)sndTempBuffer16 + m_dsp_progress, SndOutPacketSize);
+ int ei = m_dsp_progress;
+ for (int i = 0; i < SndOutPacketSize; ++i, ++ei)
+ {
+ sndTempBuffer16[ei] = sndTempBuffer[i].DownSample();
+ }
+ m_dsp_progress += DspProcess((s16*)sndTempBuffer16 + m_dsp_progress, SndOutPacketSize);
- // Some ugly code to ensure full packet handling:
- ei = 0;
- while (m_dsp_progress >= SndOutPacketSize) {
- for (int i = 0; i < SndOutPacketSize; ++i, ++ei) {
- sndTempBuffer[i] = sndTempBuffer16[ei].UpSample();
- }
+ // Some ugly code to ensure full packet handling:
+ ei = 0;
+ while (m_dsp_progress >= SndOutPacketSize)
+ {
+ for (int i = 0; i < SndOutPacketSize; ++i, ++ei)
+ {
+ sndTempBuffer[i] = sndTempBuffer16[ei].UpSample();
+ }
- if (SynchMode == 0) // TimeStrech on
- timeStretchWrite();
- else
- _WriteSamples(sndTempBuffer, SndOutPacketSize);
+ if (SynchMode == 0) // TimeStrech on
+ timeStretchWrite();
+ else
+ _WriteSamples(sndTempBuffer, SndOutPacketSize);
- m_dsp_progress -= SndOutPacketSize;
- }
+ m_dsp_progress -= SndOutPacketSize;
+ }
- // copy any leftovers to the front of the dsp buffer.
- if (m_dsp_progress > 0) {
- memcpy(sndTempBuffer16, &sndTempBuffer16[ei],
- sizeof(sndTempBuffer16[0]) * m_dsp_progress);
- }
- }
+ // copy any leftovers to the front of the dsp buffer.
+ if (m_dsp_progress > 0)
+ {
+ memcpy(sndTempBuffer16, &sndTempBuffer16[ei],
+ sizeof(sndTempBuffer16[0]) * m_dsp_progress);
+ }
+ }
#endif
- else {
- if (SynchMode == 0) // TimeStrech on
- timeStretchWrite();
- else
- _WriteSamples(sndTempBuffer, SndOutPacketSize);
- }
+ else
+ {
+ if (SynchMode == 0) // TimeStrech on
+ timeStretchWrite();
+ else
+ _WriteSamples(sndTempBuffer, SndOutPacketSize);
+ }
}
s32 SndBuffer::Test()
{
- if (mods[OutputModule] == NULL)
- return -1;
+ if (mods[OutputModule] == NULL)
+ return -1;
- return mods[OutputModule]->Test();
+ return mods[OutputModule]->Test();
}
diff --git a/pcsx2/SPU2/SndOut.h b/pcsx2/SPU2/SndOut.h
index 8265ef4912..27558cfad9 100644
--- a/pcsx2/SPU2/SndOut.h
+++ b/pcsx2/SPU2/SndOut.h
@@ -32,7 +32,7 @@ static const int SndOutVolumeShift32 = 16 - SndOutVolumeShift; // shift up, not
// is too problematic. :)
extern int SampleRate;
-extern int FindOutputModuleById(const wchar_t *omodid);
+extern int FindOutputModuleById(const wchar_t* omodid);
// Implemented in Config.cpp
extern float VolumeAdjustFL;
@@ -52,633 +52,633 @@ struct Stereo51Out16Dpl; // similar to DplII but without rear balancing
struct Stereo51Out32Dpl;
extern void ResetDplIIDecoder();
-extern void ProcessDplIISample16(const StereoOut32 &src, Stereo51Out16DplII *s);
-extern void ProcessDplIISample32(const StereoOut32 &src, Stereo51Out32DplII *s);
-extern void ProcessDplSample16(const StereoOut32 &src, Stereo51Out16Dpl *s);
-extern void ProcessDplSample32(const StereoOut32 &src, Stereo51Out32Dpl *s);
+extern void ProcessDplIISample16(const StereoOut32& src, Stereo51Out16DplII* s);
+extern void ProcessDplIISample32(const StereoOut32& src, Stereo51Out32DplII* s);
+extern void ProcessDplSample16(const StereoOut32& src, Stereo51Out16Dpl* s);
+extern void ProcessDplSample32(const StereoOut32& src, Stereo51Out32Dpl* s);
struct StereoOut16
{
- s16 Left;
- s16 Right;
+ s16 Left;
+ s16 Right;
- StereoOut16()
- : Left(0)
- , Right(0)
- {
- }
+ StereoOut16()
+ : Left(0)
+ , Right(0)
+ {
+ }
- StereoOut16(const StereoOut32 &src)
- : Left((s16)src.Left)
- , Right((s16)src.Right)
- {
- }
+ StereoOut16(const StereoOut32& src)
+ : Left((s16)src.Left)
+ , Right((s16)src.Right)
+ {
+ }
- StereoOut16(s16 left, s16 right)
- : Left(left)
- , Right(right)
- {
- }
+ StereoOut16(s16 left, s16 right)
+ : Left(left)
+ , Right(right)
+ {
+ }
- StereoOut32 UpSample() const;
+ StereoOut32 UpSample() const;
- void ResampleFrom(const StereoOut32 &src)
- {
- // Use StereoOut32's built in conversion
- *this = src.DownSample();
- }
+ void ResampleFrom(const StereoOut32& src)
+ {
+ // Use StereoOut32's built in conversion
+ *this = src.DownSample();
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s16)(Left * VolumeAdjustFL);
- Right = (s16)(Right * VolumeAdjustFR);
- }
+ Left = (s16)(Left * VolumeAdjustFL);
+ Right = (s16)(Right * VolumeAdjustFR);
+ }
};
struct StereoOutFloat
{
- float Left;
- float Right;
+ float Left;
+ float Right;
- StereoOutFloat()
- : Left(0)
- , Right(0)
- {
- }
+ StereoOutFloat()
+ : Left(0)
+ , Right(0)
+ {
+ }
- explicit StereoOutFloat(const StereoOut32 &src)
- : Left(src.Left / 2147483647.0f)
- , Right(src.Right / 2147483647.0f)
- {
- }
+ explicit StereoOutFloat(const StereoOut32& src)
+ : Left(src.Left / 2147483647.0f)
+ , Right(src.Right / 2147483647.0f)
+ {
+ }
- explicit StereoOutFloat(s32 left, s32 right)
- : Left(left / 2147483647.0f)
- , Right(right / 2147483647.0f)
- {
- }
+ explicit StereoOutFloat(s32 left, s32 right)
+ : Left(left / 2147483647.0f)
+ , Right(right / 2147483647.0f)
+ {
+ }
- StereoOutFloat(float left, float right)
- : Left(left)
- , Right(right)
- {
- }
+ StereoOutFloat(float left, float right)
+ : Left(left)
+ , Right(right)
+ {
+ }
};
struct Stereo21Out16
{
- s16 Left;
- s16 Right;
- s16 LFE;
+ s16 Left;
+ s16 Right;
+ s16 LFE;
- void ResampleFrom(const StereoOut32 &src)
- {
- Left = src.Left >> SndOutVolumeShift;
- Right = src.Right >> SndOutVolumeShift;
- LFE = (src.Left + src.Right) >> (SndOutVolumeShift + 1);
- }
+ void ResampleFrom(const StereoOut32& src)
+ {
+ Left = src.Left >> SndOutVolumeShift;
+ Right = src.Right >> SndOutVolumeShift;
+ LFE = (src.Left + src.Right) >> (SndOutVolumeShift + 1);
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s16)(Left * VolumeAdjustFL);
- Right = (s16)(Right * VolumeAdjustFR);
- LFE = (s16)(LFE * VolumeAdjustLFE);
- }
+ Left = (s16)(Left * VolumeAdjustFL);
+ Right = (s16)(Right * VolumeAdjustFR);
+ LFE = (s16)(LFE * VolumeAdjustLFE);
+ }
};
struct Stereo40Out16
{
- s16 Left;
- s16 Right;
- s16 LeftBack;
- s16 RightBack;
+ s16 Left;
+ s16 Right;
+ s16 LeftBack;
+ s16 RightBack;
- void ResampleFrom(const StereoOut32 &src)
- {
- Left = src.Left >> SndOutVolumeShift;
- Right = src.Right >> SndOutVolumeShift;
- LeftBack = src.Left >> SndOutVolumeShift;
- RightBack = src.Right >> SndOutVolumeShift;
- }
+ void ResampleFrom(const StereoOut32& src)
+ {
+ Left = src.Left >> SndOutVolumeShift;
+ Right = src.Right >> SndOutVolumeShift;
+ LeftBack = src.Left >> SndOutVolumeShift;
+ RightBack = src.Right >> SndOutVolumeShift;
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s16)(Left * VolumeAdjustFL);
- Right = (s16)(Right * VolumeAdjustFR);
- LeftBack = (s16)(LeftBack * VolumeAdjustBL);
- RightBack = (s16)(RightBack * VolumeAdjustBR);
- }
+ Left = (s16)(Left * VolumeAdjustFL);
+ Right = (s16)(Right * VolumeAdjustFR);
+ LeftBack = (s16)(LeftBack * VolumeAdjustBL);
+ RightBack = (s16)(RightBack * VolumeAdjustBR);
+ }
};
struct Stereo40Out32
{
- s32 Left;
- s32 Right;
- s32 LeftBack;
- s32 RightBack;
+ s32 Left;
+ s32 Right;
+ s32 LeftBack;
+ s32 RightBack;
- void ResampleFrom(const StereoOut32 &src)
- {
- Left = src.Left << SndOutVolumeShift32;
- Right = src.Right << SndOutVolumeShift32;
- LeftBack = src.Left << SndOutVolumeShift32;
- RightBack = src.Right << SndOutVolumeShift32;
- }
+ void ResampleFrom(const StereoOut32& src)
+ {
+ Left = src.Left << SndOutVolumeShift32;
+ Right = src.Right << SndOutVolumeShift32;
+ LeftBack = src.Left << SndOutVolumeShift32;
+ RightBack = src.Right << SndOutVolumeShift32;
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s32)(Left * VolumeAdjustFL);
- Right = (s32)(Right * VolumeAdjustFR);
- LeftBack = (s32)(LeftBack * VolumeAdjustBL);
- RightBack = (s32)(RightBack * VolumeAdjustBR);
- }
+ Left = (s32)(Left * VolumeAdjustFL);
+ Right = (s32)(Right * VolumeAdjustFR);
+ LeftBack = (s32)(LeftBack * VolumeAdjustBL);
+ RightBack = (s32)(RightBack * VolumeAdjustBR);
+ }
};
struct Stereo41Out16
{
- s16 Left;
- s16 Right;
- s16 LFE;
- s16 LeftBack;
- s16 RightBack;
+ s16 Left;
+ s16 Right;
+ s16 LFE;
+ s16 LeftBack;
+ s16 RightBack;
- void ResampleFrom(const StereoOut32 &src)
- {
- Left = src.Left >> SndOutVolumeShift;
- Right = src.Right >> SndOutVolumeShift;
- LFE = (src.Left + src.Right) >> (SndOutVolumeShift + 1);
- LeftBack = src.Left >> SndOutVolumeShift;
- RightBack = src.Right >> SndOutVolumeShift;
- }
+ void ResampleFrom(const StereoOut32& src)
+ {
+ Left = src.Left >> SndOutVolumeShift;
+ Right = src.Right >> SndOutVolumeShift;
+ LFE = (src.Left + src.Right) >> (SndOutVolumeShift + 1);
+ LeftBack = src.Left >> SndOutVolumeShift;
+ RightBack = src.Right >> SndOutVolumeShift;
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s32)(Left * VolumeAdjustFL);
- Right = (s32)(Right * VolumeAdjustFR);
- LeftBack = (s32)(LeftBack * VolumeAdjustBL);
- RightBack = (s32)(RightBack * VolumeAdjustBR);
- LFE = (s32)(LFE * VolumeAdjustLFE);
- }
+ Left = (s32)(Left * VolumeAdjustFL);
+ Right = (s32)(Right * VolumeAdjustFR);
+ LeftBack = (s32)(LeftBack * VolumeAdjustBL);
+ RightBack = (s32)(RightBack * VolumeAdjustBR);
+ LFE = (s32)(LFE * VolumeAdjustLFE);
+ }
};
struct Stereo51Out16
{
- s16 Left;
- s16 Right;
- s16 Center;
- s16 LFE;
- s16 LeftBack;
- s16 RightBack;
+ s16 Left;
+ s16 Right;
+ s16 Center;
+ s16 LFE;
+ s16 LeftBack;
+ s16 RightBack;
- // Implementation Note: Center and Subwoofer/LFE -->
- // This method is simple and sounds nice. It relies on the speaker/soundcard
- // systems do to their own low pass / crossover. Manual lowpass is wasted effort
- // and can't match solid state results anyway.
+ // Implementation Note: Center and Subwoofer/LFE -->
+ // This method is simple and sounds nice. It relies on the speaker/soundcard
+ // systems do to their own low pass / crossover. Manual lowpass is wasted effort
+ // and can't match solid state results anyway.
- void ResampleFrom(const StereoOut32 &src)
- {
- Left = src.Left >> SndOutVolumeShift;
- Right = src.Right >> SndOutVolumeShift;
- Center = (src.Left + src.Right) >> (SndOutVolumeShift + 1);
- LFE = Center;
- LeftBack = src.Left >> SndOutVolumeShift;
- RightBack = src.Right >> SndOutVolumeShift;
- }
+ void ResampleFrom(const StereoOut32& src)
+ {
+ Left = src.Left >> SndOutVolumeShift;
+ Right = src.Right >> SndOutVolumeShift;
+ Center = (src.Left + src.Right) >> (SndOutVolumeShift + 1);
+ LFE = Center;
+ LeftBack = src.Left >> SndOutVolumeShift;
+ RightBack = src.Right >> SndOutVolumeShift;
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s16)(Left * VolumeAdjustFL);
- Right = (s16)(Right * VolumeAdjustFR);
- LeftBack = (s16)(LeftBack * VolumeAdjustBL);
- RightBack = (s16)(RightBack * VolumeAdjustBR);
- Center = (s16)(Center * VolumeAdjustC);
- LFE = (s16)(LFE * VolumeAdjustLFE);
- }
+ Left = (s16)(Left * VolumeAdjustFL);
+ Right = (s16)(Right * VolumeAdjustFR);
+ LeftBack = (s16)(LeftBack * VolumeAdjustBL);
+ RightBack = (s16)(RightBack * VolumeAdjustBR);
+ Center = (s16)(Center * VolumeAdjustC);
+ LFE = (s16)(LFE * VolumeAdjustLFE);
+ }
};
struct Stereo51Out16DplII
{
- s16 Left;
- s16 Right;
- s16 Center;
- s16 LFE;
- s16 LeftBack;
- s16 RightBack;
+ s16 Left;
+ s16 Right;
+ s16 Center;
+ s16 LFE;
+ s16 LeftBack;
+ s16 RightBack;
- void ResampleFrom(const StereoOut32 &src)
- {
- ProcessDplIISample16(src, this);
- }
+ void ResampleFrom(const StereoOut32& src)
+ {
+ ProcessDplIISample16(src, this);
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s32)(Left * VolumeAdjustFL);
- Right = (s32)(Right * VolumeAdjustFR);
- LeftBack = (s32)(LeftBack * VolumeAdjustBL);
- RightBack = (s32)(RightBack * VolumeAdjustBR);
- Center = (s32)(Center * VolumeAdjustC);
- LFE = (s32)(LFE * VolumeAdjustLFE);
- }
+ Left = (s32)(Left * VolumeAdjustFL);
+ Right = (s32)(Right * VolumeAdjustFR);
+ LeftBack = (s32)(LeftBack * VolumeAdjustBL);
+ RightBack = (s32)(RightBack * VolumeAdjustBR);
+ Center = (s32)(Center * VolumeAdjustC);
+ LFE = (s32)(LFE * VolumeAdjustLFE);
+ }
};
struct Stereo51Out32DplII
{
- s32 Left;
- s32 Right;
- s32 Center;
- s32 LFE;
- s32 LeftBack;
- s32 RightBack;
+ s32 Left;
+ s32 Right;
+ s32 Center;
+ s32 LFE;
+ s32 LeftBack;
+ s32 RightBack;
- void ResampleFrom(const StereoOut32 &src)
- {
- ProcessDplIISample32(src, this);
- }
+ void ResampleFrom(const StereoOut32& src)
+ {
+ ProcessDplIISample32(src, this);
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s32)(Left * VolumeAdjustFL);
- Right = (s32)(Right * VolumeAdjustFR);
- LeftBack = (s32)(LeftBack * VolumeAdjustBL);
- RightBack = (s32)(RightBack * VolumeAdjustBR);
- Center = (s32)(Center * VolumeAdjustC);
- LFE = (s32)(LFE * VolumeAdjustLFE);
- }
+ Left = (s32)(Left * VolumeAdjustFL);
+ Right = (s32)(Right * VolumeAdjustFR);
+ LeftBack = (s32)(LeftBack * VolumeAdjustBL);
+ RightBack = (s32)(RightBack * VolumeAdjustBR);
+ Center = (s32)(Center * VolumeAdjustC);
+ LFE = (s32)(LFE * VolumeAdjustLFE);
+ }
};
struct Stereo51Out16Dpl
{
- s16 Left;
- s16 Right;
- s16 Center;
- s16 LFE;
- s16 LeftBack;
- s16 RightBack;
+ s16 Left;
+ s16 Right;
+ s16 Center;
+ s16 LFE;
+ s16 LeftBack;
+ s16 RightBack;
- void ResampleFrom(const StereoOut32 &src)
- {
- ProcessDplSample16(src, this);
- }
+ void ResampleFrom(const StereoOut32& src)
+ {
+ ProcessDplSample16(src, this);
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s32)(Left * VolumeAdjustFL);
- Right = (s32)(Right * VolumeAdjustFR);
- LeftBack = (s32)(LeftBack * VolumeAdjustBL);
- RightBack = (s32)(RightBack * VolumeAdjustBR);
- Center = (s32)(Center * VolumeAdjustC);
- LFE = (s32)(LFE * VolumeAdjustLFE);
- }
+ Left = (s32)(Left * VolumeAdjustFL);
+ Right = (s32)(Right * VolumeAdjustFR);
+ LeftBack = (s32)(LeftBack * VolumeAdjustBL);
+ RightBack = (s32)(RightBack * VolumeAdjustBR);
+ Center = (s32)(Center * VolumeAdjustC);
+ LFE = (s32)(LFE * VolumeAdjustLFE);
+ }
};
struct Stereo51Out32Dpl
{
- s32 Left;
- s32 Right;
- s32 Center;
- s32 LFE;
- s32 LeftBack;
- s32 RightBack;
+ s32 Left;
+ s32 Right;
+ s32 Center;
+ s32 LFE;
+ s32 LeftBack;
+ s32 RightBack;
- void ResampleFrom(const StereoOut32 &src)
- {
- ProcessDplSample32(src, this);
- }
+ void ResampleFrom(const StereoOut32& src)
+ {
+ ProcessDplSample32(src, this);
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s32)(Left * VolumeAdjustFL);
- Right = (s32)(Right * VolumeAdjustFR);
- LeftBack = (s32)(LeftBack * VolumeAdjustBL);
- RightBack = (s32)(RightBack * VolumeAdjustBR);
- Center = (s32)(Center * VolumeAdjustC);
- LFE = (s32)(LFE * VolumeAdjustLFE);
- }
+ Left = (s32)(Left * VolumeAdjustFL);
+ Right = (s32)(Right * VolumeAdjustFR);
+ LeftBack = (s32)(LeftBack * VolumeAdjustBL);
+ RightBack = (s32)(RightBack * VolumeAdjustBR);
+ Center = (s32)(Center * VolumeAdjustC);
+ LFE = (s32)(LFE * VolumeAdjustLFE);
+ }
};
struct Stereo71Out16
{
- s16 Left;
- s16 Right;
- s16 Center;
- s16 LFE;
- s16 LeftBack;
- s16 RightBack;
- s16 LeftSide;
- s16 RightSide;
+ s16 Left;
+ s16 Right;
+ s16 Center;
+ s16 LFE;
+ s16 LeftBack;
+ s16 RightBack;
+ s16 LeftSide;
+ s16 RightSide;
- void ResampleFrom(const StereoOut32 &src)
- {
- Left = src.Left >> SndOutVolumeShift;
- Right = src.Right >> SndOutVolumeShift;
- Center = (src.Left + src.Right) >> (SndOutVolumeShift + 1);
- LFE = Center;
- LeftBack = src.Left >> SndOutVolumeShift;
- RightBack = src.Right >> SndOutVolumeShift;
+ void ResampleFrom(const StereoOut32& src)
+ {
+ Left = src.Left >> SndOutVolumeShift;
+ Right = src.Right >> SndOutVolumeShift;
+ Center = (src.Left + src.Right) >> (SndOutVolumeShift + 1);
+ LFE = Center;
+ LeftBack = src.Left >> SndOutVolumeShift;
+ RightBack = src.Right >> SndOutVolumeShift;
- LeftSide = src.Left >> (SndOutVolumeShift + 1);
- RightSide = src.Right >> (SndOutVolumeShift + 1);
- }
+ LeftSide = src.Left >> (SndOutVolumeShift + 1);
+ RightSide = src.Right >> (SndOutVolumeShift + 1);
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s16)(Left * VolumeAdjustFL);
- Right = (s16)(Right * VolumeAdjustFR);
- LeftBack = (s16)(LeftBack * VolumeAdjustBL);
- RightBack = (s16)(RightBack * VolumeAdjustBR);
- LeftSide = (s16)(LeftBack * VolumeAdjustSL);
- RightSide = (s16)(RightBack * VolumeAdjustSR);
- Center = (s16)(Center * VolumeAdjustC);
- LFE = (s16)(LFE * VolumeAdjustLFE);
- }
+ Left = (s16)(Left * VolumeAdjustFL);
+ Right = (s16)(Right * VolumeAdjustFR);
+ LeftBack = (s16)(LeftBack * VolumeAdjustBL);
+ RightBack = (s16)(RightBack * VolumeAdjustBR);
+ LeftSide = (s16)(LeftBack * VolumeAdjustSL);
+ RightSide = (s16)(RightBack * VolumeAdjustSR);
+ Center = (s16)(Center * VolumeAdjustC);
+ LFE = (s16)(LFE * VolumeAdjustLFE);
+ }
};
struct Stereo71Out32
{
- s32 Left;
- s32 Right;
- s32 Center;
- s32 LFE;
- s32 LeftBack;
- s32 RightBack;
- s32 LeftSide;
- s32 RightSide;
+ s32 Left;
+ s32 Right;
+ s32 Center;
+ s32 LFE;
+ s32 LeftBack;
+ s32 RightBack;
+ s32 LeftSide;
+ s32 RightSide;
- void ResampleFrom(const StereoOut32 &src)
- {
- Left = src.Left << SndOutVolumeShift32;
- Right = src.Right << SndOutVolumeShift32;
- Center = (src.Left + src.Right) << (SndOutVolumeShift32 - 1);
- LFE = Center;
- LeftBack = src.Left << SndOutVolumeShift32;
- RightBack = src.Right << SndOutVolumeShift32;
+ void ResampleFrom(const StereoOut32& src)
+ {
+ Left = src.Left << SndOutVolumeShift32;
+ Right = src.Right << SndOutVolumeShift32;
+ Center = (src.Left + src.Right) << (SndOutVolumeShift32 - 1);
+ LFE = Center;
+ LeftBack = src.Left << SndOutVolumeShift32;
+ RightBack = src.Right << SndOutVolumeShift32;
- LeftSide = src.Left << (SndOutVolumeShift32 - 1);
- RightSide = src.Right << (SndOutVolumeShift32 - 1);
- }
+ LeftSide = src.Left << (SndOutVolumeShift32 - 1);
+ RightSide = src.Right << (SndOutVolumeShift32 - 1);
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s32)(Left * VolumeAdjustFL);
- Right = (s32)(Right * VolumeAdjustFR);
- LeftBack = (s32)(LeftBack * VolumeAdjustBL);
- RightBack = (s32)(RightBack * VolumeAdjustBR);
- LeftSide = (s32)(LeftBack * VolumeAdjustSL);
- RightSide = (s32)(RightBack * VolumeAdjustSR);
- Center = (s32)(Center * VolumeAdjustC);
- LFE = (s32)(LFE * VolumeAdjustLFE);
- }
+ Left = (s32)(Left * VolumeAdjustFL);
+ Right = (s32)(Right * VolumeAdjustFR);
+ LeftBack = (s32)(LeftBack * VolumeAdjustBL);
+ RightBack = (s32)(RightBack * VolumeAdjustBR);
+ LeftSide = (s32)(LeftBack * VolumeAdjustSL);
+ RightSide = (s32)(RightBack * VolumeAdjustSR);
+ Center = (s32)(Center * VolumeAdjustC);
+ LFE = (s32)(LFE * VolumeAdjustLFE);
+ }
};
struct Stereo20Out32
{
- s32 Left;
- s32 Right;
+ s32 Left;
+ s32 Right;
- void ResampleFrom(const StereoOut32 &src)
- {
- Left = src.Left << SndOutVolumeShift32;
- Right = src.Right << SndOutVolumeShift32;
- }
+ void ResampleFrom(const StereoOut32& src)
+ {
+ Left = src.Left << SndOutVolumeShift32;
+ Right = src.Right << SndOutVolumeShift32;
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s32)(Left * VolumeAdjustFL);
- Right = (s32)(Right * VolumeAdjustFR);
- }
+ Left = (s32)(Left * VolumeAdjustFL);
+ Right = (s32)(Right * VolumeAdjustFR);
+ }
};
struct Stereo21Out32
{
- s32 Left;
- s32 Right;
- s32 LFE;
+ s32 Left;
+ s32 Right;
+ s32 LFE;
- void ResampleFrom(const StereoOut32 &src)
- {
- Left = src.Left << SndOutVolumeShift32;
- Right = src.Right << SndOutVolumeShift32;
- LFE = (src.Left + src.Right) << (SndOutVolumeShift32 - 1);
- }
+ void ResampleFrom(const StereoOut32& src)
+ {
+ Left = src.Left << SndOutVolumeShift32;
+ Right = src.Right << SndOutVolumeShift32;
+ LFE = (src.Left + src.Right) << (SndOutVolumeShift32 - 1);
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s32)(Left * VolumeAdjustFL);
- Right = (s32)(Right * VolumeAdjustFR);
- LFE = (s32)(LFE * VolumeAdjustLFE);
- }
+ Left = (s32)(Left * VolumeAdjustFL);
+ Right = (s32)(Right * VolumeAdjustFR);
+ LFE = (s32)(LFE * VolumeAdjustLFE);
+ }
};
struct Stereo41Out32
{
- s32 Left;
- s32 Right;
- s32 LFE;
- s32 LeftBack;
- s32 RightBack;
+ s32 Left;
+ s32 Right;
+ s32 LFE;
+ s32 LeftBack;
+ s32 RightBack;
- void ResampleFrom(const StereoOut32 &src)
- {
- Left = src.Left << SndOutVolumeShift32;
- Right = src.Right << SndOutVolumeShift32;
- LFE = (src.Left + src.Right) << (SndOutVolumeShift32 - 1);
+ void ResampleFrom(const StereoOut32& src)
+ {
+ Left = src.Left << SndOutVolumeShift32;
+ Right = src.Right << SndOutVolumeShift32;
+ LFE = (src.Left + src.Right) << (SndOutVolumeShift32 - 1);
- LeftBack = src.Left << SndOutVolumeShift32;
- RightBack = src.Right << SndOutVolumeShift32;
- }
+ LeftBack = src.Left << SndOutVolumeShift32;
+ RightBack = src.Right << SndOutVolumeShift32;
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s32)(Left * VolumeAdjustFL);
- Right = (s32)(Right * VolumeAdjustFR);
- LeftBack = (s32)(LeftBack * VolumeAdjustBL);
- RightBack = (s32)(RightBack * VolumeAdjustBR);
- LFE = (s32)(LFE * VolumeAdjustLFE);
- }
+ Left = (s32)(Left * VolumeAdjustFL);
+ Right = (s32)(Right * VolumeAdjustFR);
+ LeftBack = (s32)(LeftBack * VolumeAdjustBL);
+ RightBack = (s32)(RightBack * VolumeAdjustBR);
+ LFE = (s32)(LFE * VolumeAdjustLFE);
+ }
};
struct Stereo51Out32
{
- s32 Left;
- s32 Right;
- s32 Center;
- s32 LFE;
- s32 LeftBack;
- s32 RightBack;
+ s32 Left;
+ s32 Right;
+ s32 Center;
+ s32 LFE;
+ s32 LeftBack;
+ s32 RightBack;
- void ResampleFrom(const StereoOut32 &src)
- {
- Left = src.Left << SndOutVolumeShift32;
- Right = src.Right << SndOutVolumeShift32;
- Center = (src.Left + src.Right) << (SndOutVolumeShift32 - 1);
- LFE = Center;
- LeftBack = src.Left << SndOutVolumeShift32;
- RightBack = src.Right << SndOutVolumeShift32;
- }
+ void ResampleFrom(const StereoOut32& src)
+ {
+ Left = src.Left << SndOutVolumeShift32;
+ Right = src.Right << SndOutVolumeShift32;
+ Center = (src.Left + src.Right) << (SndOutVolumeShift32 - 1);
+ LFE = Center;
+ LeftBack = src.Left << SndOutVolumeShift32;
+ RightBack = src.Right << SndOutVolumeShift32;
+ }
- void AdjustFrom(const StereoOut32 &src)
- {
- ResampleFrom(src);
+ void AdjustFrom(const StereoOut32& src)
+ {
+ ResampleFrom(src);
- Left = (s32)(Left * VolumeAdjustFL);
- Right = (s32)(Right * VolumeAdjustFR);
- LeftBack = (s32)(LeftBack * VolumeAdjustBL);
- RightBack = (s32)(RightBack * VolumeAdjustBR);
- Center = (s32)(Center * VolumeAdjustC);
- LFE = (s32)(LFE * VolumeAdjustLFE);
- }
+ Left = (s32)(Left * VolumeAdjustFL);
+ Right = (s32)(Right * VolumeAdjustFR);
+ LeftBack = (s32)(LeftBack * VolumeAdjustBL);
+ RightBack = (s32)(RightBack * VolumeAdjustBR);
+ Center = (s32)(Center * VolumeAdjustC);
+ LFE = (s32)(LFE * VolumeAdjustLFE);
+ }
};
// Developer Note: This is a static class only (all static members).
class SndBuffer
{
private:
- static bool m_underrun_freeze;
- static s32 m_predictData;
- static float lastPct;
+ static bool m_underrun_freeze;
+ static s32 m_predictData;
+ static float lastPct;
- static StereoOut32 *sndTempBuffer;
- static StereoOut16 *sndTempBuffer16;
+ static StereoOut32* sndTempBuffer;
+ static StereoOut16* sndTempBuffer16;
- static int sndTempProgress;
- static int m_dsp_progress;
+ static int sndTempProgress;
+ static int m_dsp_progress;
- static int m_timestretch_progress;
- static int m_timestretch_writepos;
+ static int m_timestretch_progress;
+ static int m_timestretch_writepos;
- static StereoOut32 *m_buffer;
- static s32 m_size;
+ static StereoOut32* m_buffer;
+ static s32 m_size;
- static __aligned(4) volatile s32 m_rpos;
- static __aligned(4) volatile s32 m_wpos;
+ static __aligned(4) volatile s32 m_rpos;
+ static __aligned(4) volatile s32 m_wpos;
- static float lastEmergencyAdj;
- static float cTempo;
- static float eTempo;
- static int ssFreeze;
+ static float lastEmergencyAdj;
+ static float cTempo;
+ static float eTempo;
+ static int ssFreeze;
- static void _InitFail();
- static bool CheckUnderrunStatus(int &nSamples, int &quietSampleCount);
+ static void _InitFail();
+ static bool CheckUnderrunStatus(int& nSamples, int& quietSampleCount);
- static void soundtouchInit();
- static void soundtouchClearContents();
- static void soundtouchCleanup();
- static void timeStretchWrite();
- static void timeStretchUnderrun();
- static s32 timeStretchOverrun();
+ static void soundtouchInit();
+ static void soundtouchClearContents();
+ static void soundtouchCleanup();
+ static void timeStretchWrite();
+ static void timeStretchUnderrun();
+ static s32 timeStretchOverrun();
- static void PredictDataWrite(int samples);
- static float GetStatusPct();
- static void UpdateTempoChangeSoundTouch();
- static void UpdateTempoChangeSoundTouch2();
+ static void PredictDataWrite(int samples);
+ static float GetStatusPct();
+ static void UpdateTempoChangeSoundTouch();
+ static void UpdateTempoChangeSoundTouch2();
- static void _WriteSamples(StereoOut32 *bData, int nSamples);
+ static void _WriteSamples(StereoOut32* bData, int nSamples);
- static void _WriteSamples_Safe(StereoOut32 *bData, int nSamples);
- static void _ReadSamples_Safe(StereoOut32 *bData, int nSamples);
+ static void _WriteSamples_Safe(StereoOut32* bData, int nSamples);
+ static void _ReadSamples_Safe(StereoOut32* bData, int nSamples);
- static void _WriteSamples_Internal(StereoOut32 *bData, int nSamples);
- static void _DropSamples_Internal(int nSamples);
- static void _ReadSamples_Internal(StereoOut32 *bData, int nSamples);
+ static void _WriteSamples_Internal(StereoOut32* bData, int nSamples);
+ static void _DropSamples_Internal(int nSamples);
+ static void _ReadSamples_Internal(StereoOut32* bData, int nSamples);
- static int _GetApproximateDataInBuffer();
+ static int _GetApproximateDataInBuffer();
public:
- static void UpdateTempoChangeAsyncMixing();
- static void Init();
- static void Cleanup();
- static void Write(const StereoOut32 &Sample);
- static s32 Test();
- static void ClearContents();
+ static void UpdateTempoChangeAsyncMixing();
+ static void Init();
+ static void Cleanup();
+ static void Write(const StereoOut32& Sample);
+ static s32 Test();
+ static void ClearContents();
- // Note: When using with 32 bit output buffers, the user of this function is responsible
- // for shifting the values to where they need to be manually. The fixed point depth of
- // the sample output is determined by the SndOutVolumeShift, which is the number of bits
- // to shift right to get a 16 bit result.
- template
- static void ReadSamples(T *bData);
+ // Note: When using with 32 bit output buffers, the user of this function is responsible
+ // for shifting the values to where they need to be manually. The fixed point depth of
+ // the sample output is determined by the SndOutVolumeShift, which is the number of bits
+ // to shift right to get a 16 bit result.
+ template
+ static void ReadSamples(T* bData);
};
class SndOutModule
{
public:
- // Virtual destructor, because it helps fight C+++ funny-business.
- virtual ~SndOutModule() {}
+ // Virtual destructor, because it helps fight C+++ funny-business.
+ virtual ~SndOutModule() {}
- // Returns a unique identification string for this driver.
- // (usually just matches the driver's cpp filename)
- virtual const wchar_t *GetIdent() const = 0;
+ // Returns a unique identification string for this driver.
+ // (usually just matches the driver's cpp filename)
+ virtual const wchar_t* GetIdent() const = 0;
- // Returns the long name / description for this driver.
- // (for use in configuration screen)
- virtual const wchar_t *GetLongName() const = 0;
+ // Returns the long name / description for this driver.
+ // (for use in configuration screen)
+ virtual const wchar_t* GetLongName() const = 0;
- virtual s32 Init() = 0;
- virtual void Close() = 0;
- virtual s32 Test() const = 0;
+ virtual s32 Init() = 0;
+ virtual void Close() = 0;
+ virtual s32 Test() const = 0;
- // Gui function: Used to open the configuration box for this driver.
- virtual void Configure(uptr parent) = 0;
+ // Gui function: Used to open the configuration box for this driver.
+ virtual void Configure(uptr parent) = 0;
- // Loads settings from the INI file for this driver
- virtual void ReadSettings() = 0;
+ // Loads settings from the INI file for this driver
+ virtual void ReadSettings() = 0;
- // Set output API for this driver
- virtual void SetApiSettings(wxString api) = 0;
+ // Set output API for this driver
+ virtual void SetApiSettings(wxString api) = 0;
- // Saves settings to the INI file for this driver
- virtual void WriteSettings() const = 0;
+ // Saves settings to the INI file for this driver
+ virtual void WriteSettings() const = 0;
- // Returns the number of empty samples in the output buffer.
- // (which is effectively the amount of data played since the last update)
- virtual int GetEmptySampleCount() = 0;
+ // Returns the number of empty samples in the output buffer.
+ // (which is effectively the amount of data played since the last update)
+ virtual int GetEmptySampleCount() = 0;
};
#ifdef _MSC_VER
//internal
-extern SndOutModule *WaveOut;
-extern SndOutModule *DSoundOut;
-extern SndOutModule *XAudio2Out;
+extern SndOutModule* WaveOut;
+extern SndOutModule* DSoundOut;
+extern SndOutModule* XAudio2Out;
#endif
#if defined(_WIN32) || defined(SPU2X_PORTAUDIO)
-extern SndOutModule *PortaudioOut;
+extern SndOutModule* PortaudioOut;
#endif
-extern SndOutModule *const SDLOut;
+extern SndOutModule* const SDLOut;
#ifdef __linux__
-extern SndOutModule *AlsaOut;
+extern SndOutModule* AlsaOut;
#endif
-extern SndOutModule *mods[];
+extern SndOutModule* mods[];
// =====================================================================================================
@@ -686,9 +686,9 @@ extern bool WavRecordEnabled;
extern void RecordStart(std::wstring* filename);
extern void RecordStop();
-extern void RecordWrite(const StereoOut16 &sample);
+extern void RecordWrite(const StereoOut16& sample);
-extern s32 DspLoadLibrary(wchar_t *fileName, int modNum);
+extern s32 DspLoadLibrary(wchar_t* fileName, int modNum);
extern void DspCloseLibrary();
-extern int DspProcess(s16 *buffer, int samples);
+extern int DspProcess(s16* buffer, int samples);
extern void DspUpdate(); // to let the Dsp process window messages
diff --git a/pcsx2/SPU2/SndOut_Portaudio.cpp b/pcsx2/SPU2/SndOut_Portaudio.cpp
index a5c182ae24..2a2bb3c8e4 100644
--- a/pcsx2/SPU2/SndOut_Portaudio.cpp
+++ b/pcsx2/SPU2/SndOut_Portaudio.cpp
@@ -28,657 +28,703 @@
#include "pa_win_wasapi.h"
#endif
-int PaCallback(const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo *timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData);
+int PaCallback(const void* inputBuffer, void* outputBuffer,
+ unsigned long framesPerBuffer,
+ const PaStreamCallbackTimeInfo* timeInfo,
+ PaStreamCallbackFlags statusFlags,
+ void* userData);
class Portaudio : public SndOutModule
{
private:
- //////////////////////////////////////////////////////////////////////////////////////////
- // Configuration Vars (unused still)
+ //////////////////////////////////////////////////////////////////////////////////////////
+ // Configuration Vars (unused still)
- int m_ApiId;
- wxString m_Device;
+ int m_ApiId;
+ wxString m_Device;
- bool m_UseHardware;
+ bool m_UseHardware;
- bool m_WasapiExclusiveMode;
+ bool m_WasapiExclusiveMode;
- bool m_SuggestedLatencyMinimal;
- int m_SuggestedLatencyMS;
+ bool m_SuggestedLatencyMinimal;
+ int m_SuggestedLatencyMS;
- //////////////////////////////////////////////////////////////////////////////////////////
- // Instance vars
+ //////////////////////////////////////////////////////////////////////////////////////////
+ // Instance vars
- int writtenSoFar;
- int writtenLastTime;
- int availableLastTime;
+ int writtenSoFar;
+ int writtenLastTime;
+ int availableLastTime;
- int actualUsedChannels;
+ int actualUsedChannels;
- bool started;
- PaStream *stream;
+ bool started;
+ PaStream* stream;
- //////////////////////////////////////////////////////////////////////////////////////////
- // Stuff necessary for speaker expansion
- class SampleReader
- {
- public:
- virtual int ReadSamples(const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo *timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData) = 0;
- };
+ //////////////////////////////////////////////////////////////////////////////////////////
+ // Stuff necessary for speaker expansion
+ class SampleReader
+ {
+ public:
+ virtual int ReadSamples(const void* inputBuffer, void* outputBuffer,
+ unsigned long framesPerBuffer,
+ const PaStreamCallbackTimeInfo* timeInfo,
+ PaStreamCallbackFlags statusFlags,
+ void* userData) = 0;
+ };
- template
- class ConvertedSampleReader : public SampleReader
- {
- int *written;
+ template
+ class ConvertedSampleReader : public SampleReader
+ {
+ int* written;
- public:
- ConvertedSampleReader(int *pWritten)
- {
- written = pWritten;
- }
+ public:
+ ConvertedSampleReader(int* pWritten)
+ {
+ written = pWritten;
+ }
- virtual int ReadSamples(const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo *timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData)
- {
- T *p1 = (T *)outputBuffer;
+ virtual int ReadSamples(const void* inputBuffer, void* outputBuffer,
+ unsigned long framesPerBuffer,
+ const PaStreamCallbackTimeInfo* timeInfo,
+ PaStreamCallbackFlags statusFlags,
+ void* userData)
+ {
+ T* p1 = (T*)outputBuffer;
- int packets = framesPerBuffer / SndOutPacketSize;
+ int packets = framesPerBuffer / SndOutPacketSize;
- for (int p = 0; p < packets; p++, p1 += SndOutPacketSize)
- SndBuffer::ReadSamples(p1);
+ for (int p = 0; p < packets; p++, p1 += SndOutPacketSize)
+ SndBuffer::ReadSamples(p1);
- (*written) += packets * SndOutPacketSize;
+ (*written) += packets * SndOutPacketSize;
- return 0;
- }
- };
+ return 0;
+ }
+ };
public:
- SampleReader *ActualPaCallback;
+ SampleReader* ActualPaCallback;
- Portaudio()
- {
- m_SuggestedLatencyMinimal = true;
- m_UseHardware = false;
- m_WasapiExclusiveMode = false;
- started = false;
- stream = NULL;
- ActualPaCallback = NULL;
- m_ApiId = -1;
- m_SuggestedLatencyMS = 20;
- actualUsedChannels = 0;
- writtenSoFar = 0;
- writtenLastTime = 0;
- availableLastTime = 0;
- }
+ Portaudio()
+ {
+ m_SuggestedLatencyMinimal = true;
+ m_UseHardware = false;
+ m_WasapiExclusiveMode = false;
+ started = false;
+ stream = NULL;
+ ActualPaCallback = NULL;
+ m_ApiId = -1;
+ m_SuggestedLatencyMS = 20;
+ actualUsedChannels = 0;
+ writtenSoFar = 0;
+ writtenLastTime = 0;
+ availableLastTime = 0;
+ }
- s32 Init()
- {
- started = false;
- stream = NULL;
+ s32 Init()
+ {
+ started = false;
+ stream = NULL;
- ReadSettings();
+ ReadSettings();
- PaError err = Pa_Initialize();
- if (err != paNoError) {
- fprintf(stderr, "* SPU2-X: PortAudio error: %s\n", Pa_GetErrorText(err));
- return -1;
- }
- started = true;
+ PaError err = Pa_Initialize();
+ if (err != paNoError)
+ {
+ fprintf(stderr, "* SPU2-X: PortAudio error: %s\n", Pa_GetErrorText(err));
+ return -1;
+ }
+ started = true;
- int deviceIndex = -1;
+ int deviceIndex = -1;
- fprintf(stderr, "* SPU2-X: Enumerating PortAudio devices:\n");
- for (int i = 0, j = 0; i < Pa_GetDeviceCount(); i++) {
- const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
+ fprintf(stderr, "* SPU2-X: Enumerating PortAudio devices:\n");
+ for (int i = 0, j = 0; i < Pa_GetDeviceCount(); i++)
+ {
+ const PaDeviceInfo* info = Pa_GetDeviceInfo(i);
- if (info->maxOutputChannels > 0) {
- const PaHostApiInfo *apiinfo = Pa_GetHostApiInfo(info->hostApi);
+ if (info->maxOutputChannels > 0)
+ {
+ const PaHostApiInfo* apiinfo = Pa_GetHostApiInfo(info->hostApi);
- fprintf(stderr, " *** Device %d: '%s' (%s)", j, info->name, apiinfo->name);
+ fprintf(stderr, " *** Device %d: '%s' (%s)", j, info->name, apiinfo->name);
- if (apiinfo->type == m_ApiId) {
- if (m_Device == wxString::FromUTF8(info->name)) {
- deviceIndex = i;
- fprintf(stderr, " (selected)");
- }
- }
- fprintf(stderr, "\n");
+ if (apiinfo->type == m_ApiId)
+ {
+ if (m_Device == wxString::FromUTF8(info->name))
+ {
+ deviceIndex = i;
+ fprintf(stderr, " (selected)");
+ }
+ }
+ fprintf(stderr, "\n");
- j++;
- }
- }
- fflush(stderr);
+ j++;
+ }
+ }
+ fflush(stderr);
- if (deviceIndex < 0 && m_ApiId >= 0) {
- for (int i = 0; i < Pa_GetHostApiCount(); i++) {
- const PaHostApiInfo *apiinfo = Pa_GetHostApiInfo(i);
- if (apiinfo->type == m_ApiId) {
- deviceIndex = apiinfo->defaultOutputDevice;
- }
- }
- }
+ if (deviceIndex < 0 && m_ApiId >= 0)
+ {
+ for (int i = 0; i < Pa_GetHostApiCount(); i++)
+ {
+ const PaHostApiInfo* apiinfo = Pa_GetHostApiInfo(i);
+ if (apiinfo->type == m_ApiId)
+ {
+ deviceIndex = apiinfo->defaultOutputDevice;
+ }
+ }
+ }
- if (deviceIndex >= 0) {
- void *infoPtr = NULL;
+ if (deviceIndex >= 0)
+ {
+ void* infoPtr = NULL;
- const PaDeviceInfo *devinfo = Pa_GetDeviceInfo(deviceIndex);
+ const PaDeviceInfo* devinfo = Pa_GetDeviceInfo(deviceIndex);
- int speakers;
- switch (numSpeakers) // speakers = (numSpeakers + 1) *2; ?
- {
- case 0:
- speakers = 2;
- break; // Stereo
- case 1:
- speakers = 4;
- break; // Quadrafonic
- case 2:
- speakers = 6;
- break; // Surround 5.1
- case 3:
- speakers = 8;
- break; // Surround 7.1
- default:
- speakers = 2;
- }
- actualUsedChannels = std::min(speakers, devinfo->maxOutputChannels);
+ int speakers;
+ switch (numSpeakers) // speakers = (numSpeakers + 1) *2; ?
+ {
+ case 0:
+ speakers = 2;
+ break; // Stereo
+ case 1:
+ speakers = 4;
+ break; // Quadrafonic
+ case 2:
+ speakers = 6;
+ break; // Surround 5.1
+ case 3:
+ speakers = 8;
+ break; // Surround 7.1
+ default:
+ speakers = 2;
+ }
+ actualUsedChannels = std::min(speakers, devinfo->maxOutputChannels);
- switch (actualUsedChannels) {
- case 2:
- ConLog("* SPU2 > Using normal 2 speaker stereo output.\n");
- ActualPaCallback = new ConvertedSampleReader(&writtenSoFar);
- break;
+ switch (actualUsedChannels)
+ {
+ case 2:
+ ConLog("* SPU2 > Using normal 2 speaker stereo output.\n");
+ ActualPaCallback = new ConvertedSampleReader(&writtenSoFar);
+ break;
- case 3:
- ConLog("* SPU2 > 2.1 speaker expansion enabled.\n");
- ActualPaCallback = new ConvertedSampleReader(&writtenSoFar);
- break;
+ case 3:
+ ConLog("* SPU2 > 2.1 speaker expansion enabled.\n");
+ ActualPaCallback = new ConvertedSampleReader(&writtenSoFar);
+ break;
- case 4:
- ConLog("* SPU2 > 4 speaker expansion enabled [quadraphenia]\n");
- ActualPaCallback = new ConvertedSampleReader(&writtenSoFar);
- break;
+ case 4:
+ ConLog("* SPU2 > 4 speaker expansion enabled [quadraphenia]\n");
+ ActualPaCallback = new ConvertedSampleReader(&writtenSoFar);
+ break;
- case 5:
- ConLog("* SPU2 > 4.1 speaker expansion enabled.\n");
- ActualPaCallback = new ConvertedSampleReader(&writtenSoFar);
- break;
+ case 5:
+ ConLog("* SPU2 > 4.1 speaker expansion enabled.\n");
+ ActualPaCallback = new ConvertedSampleReader(&writtenSoFar);
+ break;
- case 6:
- case 7:
- switch (dplLevel) {
- case 0:
- ConLog("* SPU2 > 5.1 speaker expansion enabled.\n");
- ActualPaCallback = new ConvertedSampleReader(&writtenSoFar); //"normal" stereo upmix
- break;
- case 1:
- ConLog("* SPU2 > 5.1 speaker expansion with basic ProLogic dematrixing enabled.\n");
- ActualPaCallback = new ConvertedSampleReader(&writtenSoFar); // basic Dpl decoder without rear stereo balancing
- break;
- case 2:
- ConLog("* SPU2 > 5.1 speaker expansion with experimental ProLogicII dematrixing enabled.\n");
- ActualPaCallback = new ConvertedSampleReader(&writtenSoFar); //gigas PLII
- break;
- }
- actualUsedChannels = 6; // we do not support 7.0 or 6.2 configurations, downgrade to 5.1
- break;
+ case 6:
+ case 7:
+ switch (dplLevel)
+ {
+ case 0:
+ ConLog("* SPU2 > 5.1 speaker expansion enabled.\n");
+ ActualPaCallback = new ConvertedSampleReader(&writtenSoFar); //"normal" stereo upmix
+ break;
+ case 1:
+ ConLog("* SPU2 > 5.1 speaker expansion with basic ProLogic dematrixing enabled.\n");
+ ActualPaCallback = new ConvertedSampleReader(&writtenSoFar); // basic Dpl decoder without rear stereo balancing
+ break;
+ case 2:
+ ConLog("* SPU2 > 5.1 speaker expansion with experimental ProLogicII dematrixing enabled.\n");
+ ActualPaCallback = new ConvertedSampleReader(&writtenSoFar); //gigas PLII
+ break;
+ }
+ actualUsedChannels = 6; // we do not support 7.0 or 6.2 configurations, downgrade to 5.1
+ break;
- default: // anything 8 or more gets the 7.1 treatment!
- ConLog("* SPU2 > 7.1 speaker expansion enabled.\n");
- ActualPaCallback = new ConvertedSampleReader(&writtenSoFar);
- actualUsedChannels = 8; // we do not support 7.2 or more, downgrade to 7.1
- break;
- }
+ default: // anything 8 or more gets the 7.1 treatment!
+ ConLog("* SPU2 > 7.1 speaker expansion enabled.\n");
+ ActualPaCallback = new ConvertedSampleReader(&writtenSoFar);
+ actualUsedChannels = 8; // we do not support 7.2 or more, downgrade to 7.1
+ break;
+ }
#ifdef _WIN32
- PaWasapiStreamInfo info = {
- sizeof(PaWasapiStreamInfo),
- paWASAPI,
- 1,
- paWinWasapiExclusive};
+ PaWasapiStreamInfo info = {
+ sizeof(PaWasapiStreamInfo),
+ paWASAPI,
+ 1,
+ paWinWasapiExclusive};
- if ((m_ApiId == paWASAPI) && m_WasapiExclusiveMode) {
- // Pass it the Exclusive mode enable flag
- infoPtr = &info;
- }
+ if ((m_ApiId == paWASAPI) && m_WasapiExclusiveMode)
+ {
+ // Pass it the Exclusive mode enable flag
+ infoPtr = &info;
+ }
#endif
- PaStreamParameters outParams = {
+ PaStreamParameters outParams = {
- // PaDeviceIndex device;
- // int channelCount;
- // PaSampleFormat sampleFormat;
- // PaTime suggestedLatency;
- // void *hostApiSpecificStreamInfo;
- deviceIndex,
- actualUsedChannels,
- paInt32,
- m_SuggestedLatencyMinimal ? (SndOutPacketSize / (float)SampleRate) : (m_SuggestedLatencyMS / 1000.0f),
- infoPtr};
+ // PaDeviceIndex device;
+ // int channelCount;
+ // PaSampleFormat sampleFormat;
+ // PaTime suggestedLatency;
+ // void *hostApiSpecificStreamInfo;
+ deviceIndex,
+ actualUsedChannels,
+ paInt32,
+ m_SuggestedLatencyMinimal ? (SndOutPacketSize / (float)SampleRate) : (m_SuggestedLatencyMS / 1000.0f),
+ infoPtr};
- err = Pa_OpenStream(&stream,
- NULL, &outParams, SampleRate,
- SndOutPacketSize,
- paNoFlag,
- PaCallback,
+ err = Pa_OpenStream(&stream,
+ NULL, &outParams, SampleRate,
+ SndOutPacketSize,
+ paNoFlag,
+ PaCallback,
- NULL);
- } else {
- err = Pa_OpenDefaultStream(&stream,
- 0, actualUsedChannels, paInt32, 48000,
- SndOutPacketSize,
- PaCallback,
- NULL);
- }
- if (err != paNoError) {
- fprintf(stderr, "* SPU2-X: PortAudio error: %s\n", Pa_GetErrorText(err));
- Pa_Terminate();
- return -1;
- }
+ NULL);
+ }
+ else
+ {
+ err = Pa_OpenDefaultStream(&stream,
+ 0, actualUsedChannels, paInt32, 48000,
+ SndOutPacketSize,
+ PaCallback,
+ NULL);
+ }
+ if (err != paNoError)
+ {
+ fprintf(stderr, "* SPU2-X: PortAudio error: %s\n", Pa_GetErrorText(err));
+ Pa_Terminate();
+ return -1;
+ }
- err = Pa_StartStream(stream);
- if (err != paNoError) {
- fprintf(stderr, "* SPU2-X: PortAudio error: %s\n", Pa_GetErrorText(err));
- Pa_CloseStream(stream);
- stream = NULL;
- Pa_Terminate();
- return -1;
- }
+ err = Pa_StartStream(stream);
+ if (err != paNoError)
+ {
+ fprintf(stderr, "* SPU2-X: PortAudio error: %s\n", Pa_GetErrorText(err));
+ Pa_CloseStream(stream);
+ stream = NULL;
+ Pa_Terminate();
+ return -1;
+ }
- return 0;
- }
+ return 0;
+ }
- void Close()
- {
- PaError err;
- if (started) {
- if (stream) {
- if (Pa_IsStreamActive(stream)) {
- err = Pa_StopStream(stream);
- if (err != paNoError)
- fprintf(stderr, "* SPU2-X: PortAudio error: %s\n", Pa_GetErrorText(err));
- }
+ void Close()
+ {
+ PaError err;
+ if (started)
+ {
+ if (stream)
+ {
+ if (Pa_IsStreamActive(stream))
+ {
+ err = Pa_StopStream(stream);
+ if (err != paNoError)
+ fprintf(stderr, "* SPU2-X: PortAudio error: %s\n", Pa_GetErrorText(err));
+ }
- err = Pa_CloseStream(stream);
- if (err != paNoError)
- fprintf(stderr, "* SPU2-X: PortAudio error: %s\n", Pa_GetErrorText(err));
+ err = Pa_CloseStream(stream);
+ if (err != paNoError)
+ fprintf(stderr, "* SPU2-X: PortAudio error: %s\n", Pa_GetErrorText(err));
- stream = NULL;
- }
+ stream = NULL;
+ }
- // Seems to do more harm than good.
- //PaError err = Pa_Terminate();
- //if( err != paNoError )
- // fprintf(stderr,"* SPU2-X: PortAudio error: %s\n", Pa_GetErrorText( err ) );
+ // Seems to do more harm than good.
+ //PaError err = Pa_Terminate();
+ //if( err != paNoError )
+ // fprintf(stderr,"* SPU2-X: PortAudio error: %s\n", Pa_GetErrorText( err ) );
- started = false;
- }
- }
+ started = false;
+ }
+ }
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
#ifdef _WIN32
private:
- bool _ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- int wmId, wmEvent;
- int tSel = 0;
+ bool _ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+ {
+ int wmId, wmEvent;
+ int tSel = 0;
- switch (uMsg) {
- case WM_INITDIALOG: {
- wchar_t temp[128];
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ wchar_t temp[128];
- SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_RESETCONTENT, 0, 0);
- SendMessageA(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_ADDSTRING, 0, (LPARAM) "Default Device");
- SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_SETCURSEL, 0, 0);
+ SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_RESETCONTENT, 0, 0);
+ SendMessageA(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_ADDSTRING, 0, (LPARAM) "Default Device");
+ SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_SETCURSEL, 0, 0);
- SendMessage(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_RESETCONTENT, 0, 0);
- SendMessageA(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_ADDSTRING, 0, (LPARAM) "Unspecified");
- int idx = 0;
- for (int i = 0; i < Pa_GetHostApiCount(); i++) {
- const PaHostApiInfo *apiinfo = Pa_GetHostApiInfo(i);
- if (apiinfo->deviceCount > 0) {
- SendMessageA(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_ADDSTRING, 0, (LPARAM)apiinfo->name);
- SendMessageA(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_SETITEMDATA, i + 1, apiinfo->type);
- }
- if (apiinfo->type == m_ApiId) {
- idx = i + 1;
- }
- }
- SendMessage(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_SETCURSEL, idx, 0);
+ SendMessage(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_RESETCONTENT, 0, 0);
+ SendMessageA(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_ADDSTRING, 0, (LPARAM) "Unspecified");
+ int idx = 0;
+ for (int i = 0; i < Pa_GetHostApiCount(); i++)
+ {
+ const PaHostApiInfo* apiinfo = Pa_GetHostApiInfo(i);
+ if (apiinfo->deviceCount > 0)
+ {
+ SendMessageA(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_ADDSTRING, 0, (LPARAM)apiinfo->name);
+ SendMessageA(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_SETITEMDATA, i + 1, apiinfo->type);
+ }
+ if (apiinfo->type == m_ApiId)
+ {
+ idx = i + 1;
+ }
+ }
+ SendMessage(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_SETCURSEL, idx, 0);
- if (idx > 0) {
- int api_idx = idx - 1;
- SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_RESETCONTENT, 0, 0);
- SendMessageA(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_ADDSTRING, 0, (LPARAM) "Default Device");
- SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_SETITEMDATA, 0, 0);
- int _idx = 0;
- int i = 1;
- for (int j = 0; j < Pa_GetDeviceCount(); j++) {
- const PaDeviceInfo *info = Pa_GetDeviceInfo(j);
- if (info->hostApi == api_idx && info->maxOutputChannels > 0) {
- SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_ADDSTRING, 0, (LPARAM)wxString::FromUTF8(info->name).wc_str());
- SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_SETITEMDATA, i, (LPARAM)info);
- if (wxString::FromUTF8(info->name) == m_Device) {
- _idx = i;
- }
- i++;
- }
- }
- SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_SETCURSEL, _idx, 0);
- }
+ if (idx > 0)
+ {
+ int api_idx = idx - 1;
+ SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_RESETCONTENT, 0, 0);
+ SendMessageA(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_ADDSTRING, 0, (LPARAM) "Default Device");
+ SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_SETITEMDATA, 0, 0);
+ int _idx = 0;
+ int i = 1;
+ for (int j = 0; j < Pa_GetDeviceCount(); j++)
+ {
+ const PaDeviceInfo* info = Pa_GetDeviceInfo(j);
+ if (info->hostApi == api_idx && info->maxOutputChannels > 0)
+ {
+ SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_ADDSTRING, 0, (LPARAM)wxString::FromUTF8(info->name).wc_str());
+ SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_SETITEMDATA, i, (LPARAM)info);
+ if (wxString::FromUTF8(info->name) == m_Device)
+ {
+ _idx = i;
+ }
+ i++;
+ }
+ }
+ SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_SETCURSEL, _idx, 0);
+ }
- INIT_SLIDER(IDC_LATENCY, 10, 200, 10, 1, 1);
- SendMessage(GetDlgItem(hWnd, IDC_LATENCY), TBM_SETPOS, TRUE, m_SuggestedLatencyMS);
- swprintf_s(temp, L"%d ms", m_SuggestedLatencyMS);
- SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp);
+ INIT_SLIDER(IDC_LATENCY, 10, 200, 10, 1, 1);
+ SendMessage(GetDlgItem(hWnd, IDC_LATENCY), TBM_SETPOS, TRUE, m_SuggestedLatencyMS);
+ swprintf_s(temp, L"%d ms", m_SuggestedLatencyMS);
+ SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp);
- if (m_SuggestedLatencyMinimal)
- SET_CHECK(IDC_MINIMIZE, true);
- else
- SET_CHECK(IDC_MANUAL, true);
+ if (m_SuggestedLatencyMinimal)
+ SET_CHECK(IDC_MINIMIZE, true);
+ else
+ SET_CHECK(IDC_MANUAL, true);
- SET_CHECK(IDC_EXCLUSIVE, m_WasapiExclusiveMode);
- } break;
+ SET_CHECK(IDC_EXCLUSIVE, m_WasapiExclusiveMode);
+ }
+ break;
- case WM_COMMAND: {
- //wchar_t temp[128];
+ case WM_COMMAND:
+ {
+ //wchar_t temp[128];
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // Parse the menu selections:
- switch (wmId) {
- case IDOK: {
- int idx = (int)SendMessage(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_GETCURSEL, 0, 0);
- m_ApiId = SendMessage(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_GETITEMDATA, idx, 0);
+ wmId = LOWORD(wParam);
+ wmEvent = HIWORD(wParam);
+ // Parse the menu selections:
+ switch (wmId)
+ {
+ case IDOK:
+ {
+ int idx = (int)SendMessage(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_GETCURSEL, 0, 0);
+ m_ApiId = SendMessage(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_GETITEMDATA, idx, 0);
- idx = (int)SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_GETCURSEL, 0, 0);
- const PaDeviceInfo *info = (const PaDeviceInfo *)SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_GETITEMDATA, idx, 0);
- if (info)
- m_Device = wxString::FromUTF8(info->name);
- else
- m_Device = L"default";
+ idx = (int)SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_GETCURSEL, 0, 0);
+ const PaDeviceInfo* info = (const PaDeviceInfo*)SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_GETITEMDATA, idx, 0);
+ if (info)
+ m_Device = wxString::FromUTF8(info->name);
+ else
+ m_Device = L"default";
- m_SuggestedLatencyMS = (int)SendMessage(GetDlgItem(hWnd, IDC_LATENCY), TBM_GETPOS, 0, 0);
+ m_SuggestedLatencyMS = (int)SendMessage(GetDlgItem(hWnd, IDC_LATENCY), TBM_GETPOS, 0, 0);
- if (m_SuggestedLatencyMS < 10)
- m_SuggestedLatencyMS = 10;
- if (m_SuggestedLatencyMS > 200)
- m_SuggestedLatencyMS = 200;
+ if (m_SuggestedLatencyMS < 10)
+ m_SuggestedLatencyMS = 10;
+ if (m_SuggestedLatencyMS > 200)
+ m_SuggestedLatencyMS = 200;
- m_SuggestedLatencyMinimal = SendMessage(GetDlgItem(hWnd, IDC_MINIMIZE), BM_GETCHECK, 0, 0) == BST_CHECKED;
+ m_SuggestedLatencyMinimal = SendMessage(GetDlgItem(hWnd, IDC_MINIMIZE), BM_GETCHECK, 0, 0) == BST_CHECKED;
- m_WasapiExclusiveMode = SendMessage(GetDlgItem(hWnd, IDC_EXCLUSIVE), BM_GETCHECK, 0, 0) == BST_CHECKED;
+ m_WasapiExclusiveMode = SendMessage(GetDlgItem(hWnd, IDC_EXCLUSIVE), BM_GETCHECK, 0, 0) == BST_CHECKED;
- EndDialog(hWnd, 0);
- } break;
+ EndDialog(hWnd, 0);
+ }
+ break;
- case IDCANCEL:
- EndDialog(hWnd, 0);
- break;
+ case IDCANCEL:
+ EndDialog(hWnd, 0);
+ break;
- case IDC_PA_HOSTAPI: {
- if (wmEvent == CBN_SELCHANGE) {
- int api_idx = (int)SendMessage(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_GETCURSEL, 0, 0) - 1;
- int apiId = SendMessageA(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_GETITEMDATA, api_idx, 0);
- SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_RESETCONTENT, 0, 0);
- SendMessageA(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_ADDSTRING, 0, (LPARAM) "Default Device");
- SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_SETITEMDATA, 0, 0);
- int idx = 0;
- int i = 1;
- for (int j = 0; j < Pa_GetDeviceCount(); j++) {
- const PaDeviceInfo *info = Pa_GetDeviceInfo(j);
- if (info->hostApi == api_idx && info->maxOutputChannels > 0) {
- SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_ADDSTRING, 0, (LPARAM)wxString::FromUTF8(info->name).wc_str());
- SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_SETITEMDATA, i, (LPARAM)info);
- i++;
- }
- }
- SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_SETCURSEL, idx, 0);
- }
- } break;
+ case IDC_PA_HOSTAPI:
+ {
+ if (wmEvent == CBN_SELCHANGE)
+ {
+ int api_idx = (int)SendMessage(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_GETCURSEL, 0, 0) - 1;
+ int apiId = SendMessageA(GetDlgItem(hWnd, IDC_PA_HOSTAPI), CB_GETITEMDATA, api_idx, 0);
+ SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_RESETCONTENT, 0, 0);
+ SendMessageA(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_ADDSTRING, 0, (LPARAM) "Default Device");
+ SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_SETITEMDATA, 0, 0);
+ int idx = 0;
+ int i = 1;
+ for (int j = 0; j < Pa_GetDeviceCount(); j++)
+ {
+ const PaDeviceInfo* info = Pa_GetDeviceInfo(j);
+ if (info->hostApi == api_idx && info->maxOutputChannels > 0)
+ {
+ SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_ADDSTRING, 0, (LPARAM)wxString::FromUTF8(info->name).wc_str());
+ SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_SETITEMDATA, i, (LPARAM)info);
+ i++;
+ }
+ }
+ SendMessage(GetDlgItem(hWnd, IDC_PA_DEVICE), CB_SETCURSEL, idx, 0);
+ }
+ }
+ break;
- default:
- return FALSE;
- }
- } break;
+ default:
+ return FALSE;
+ }
+ }
+ break;
- case WM_HSCROLL: {
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- switch (wmId) {
- case TB_LINEUP:
- case TB_LINEDOWN:
- case TB_PAGEUP:
- case TB_PAGEDOWN:
- case TB_TOP:
- case TB_BOTTOM:
- wmEvent = (int)SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);
- case TB_THUMBPOSITION:
- case TB_THUMBTRACK: {
- wchar_t temp[128];
- if (wmEvent < 10)
- wmEvent = 10;
- if (wmEvent > 200)
- wmEvent = 200;
- SendMessage((HWND)lParam, TBM_SETPOS, TRUE, wmEvent);
- swprintf_s(temp, L"%d ms", wmEvent);
- SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp);
- break;
- }
- default:
- return FALSE;
- }
- } break;
+ case WM_HSCROLL:
+ {
+ wmId = LOWORD(wParam);
+ wmEvent = HIWORD(wParam);
+ switch (wmId)
+ {
+ case TB_LINEUP:
+ case TB_LINEDOWN:
+ case TB_PAGEUP:
+ case TB_PAGEDOWN:
+ case TB_TOP:
+ case TB_BOTTOM:
+ wmEvent = (int)SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);
+ case TB_THUMBPOSITION:
+ case TB_THUMBTRACK:
+ {
+ wchar_t temp[128];
+ if (wmEvent < 10)
+ wmEvent = 10;
+ if (wmEvent > 200)
+ wmEvent = 200;
+ SendMessage((HWND)lParam, TBM_SETPOS, TRUE, wmEvent);
+ swprintf_s(temp, L"%d ms", wmEvent);
+ SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp);
+ break;
+ }
+ default:
+ return FALSE;
+ }
+ }
+ break;
- default:
- return FALSE;
- }
- return TRUE;
- }
+ default:
+ return FALSE;
+ }
+ return TRUE;
+ }
- static BOOL CALLBACK ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
- static BOOL CALLBACK DSEnumCallback(LPGUID lpGuid, LPCTSTR lpcstrDescription, LPCTSTR lpcstrModule, LPVOID lpContext);
+ static BOOL CALLBACK ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+ static BOOL CALLBACK DSEnumCallback(LPGUID lpGuid, LPCTSTR lpcstrDescription, LPCTSTR lpcstrModule, LPVOID lpContext);
public:
- virtual void Configure(uptr parent)
- {
- PaError err = Pa_Initialize(); // Initialization can be done multiple times, PA keeps a counter
- if (err != paNoError) {
- fprintf(stderr, "* SPU2-X: PortAudio error: %s\n", Pa_GetErrorText(err));
- return;
- }
- // keep portaudio initialized until the dialog closes
+ virtual void Configure(uptr parent)
+ {
+ PaError err = Pa_Initialize(); // Initialization can be done multiple times, PA keeps a counter
+ if (err != paNoError)
+ {
+ fprintf(stderr, "* SPU2-X: PortAudio error: %s\n", Pa_GetErrorText(err));
+ return;
+ }
+ // keep portaudio initialized until the dialog closes
- INT_PTR ret;
- ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_PORTAUDIO), (HWND)parent, (DLGPROC)ConfigProc, 1);
- if (ret == -1) {
- MessageBox((HWND)parent, L"Error Opening the config dialog.", L"OMG ERROR!", MB_OK | MB_SETFOREGROUND);
- return;
- }
+ INT_PTR ret;
+ ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_PORTAUDIO), (HWND)parent, (DLGPROC)ConfigProc, 1);
+ if (ret == -1)
+ {
+ MessageBox((HWND)parent, L"Error Opening the config dialog.", L"OMG ERROR!", MB_OK | MB_SETFOREGROUND);
+ return;
+ }
- Pa_Terminate();
- }
+ Pa_Terminate();
+ }
#else
- virtual void Configure(uptr parent)
- {
- }
+ virtual void Configure(uptr parent)
+ {
+ }
#endif
- s32 Test() const
- {
- return 0;
- }
+ s32 Test() const
+ {
+ return 0;
+ }
- int GetEmptySampleCount()
- {
- long availableNow = Pa_GetStreamWriteAvailable(stream);
+ int GetEmptySampleCount()
+ {
+ long availableNow = Pa_GetStreamWriteAvailable(stream);
- int playedSinceLastTime = (writtenSoFar - writtenLastTime) + (availableNow - availableLastTime);
- writtenLastTime = writtenSoFar;
- availableLastTime = availableNow;
+ int playedSinceLastTime = (writtenSoFar - writtenLastTime) + (availableNow - availableLastTime);
+ writtenLastTime = writtenSoFar;
+ availableLastTime = availableNow;
- // Lowest resolution here is the SndOutPacketSize we use.
- return playedSinceLastTime;
- }
+ // Lowest resolution here is the SndOutPacketSize we use.
+ return playedSinceLastTime;
+ }
- const wchar_t *GetIdent() const
- {
- return L"portaudio";
- }
+ const wchar_t* GetIdent() const
+ {
+ return L"portaudio";
+ }
- const wchar_t *GetLongName() const
- {
- return L"PortAudio (Cross-platform)";
- }
+ const wchar_t* GetLongName() const
+ {
+ return L"PortAudio (Cross-platform)";
+ }
- void ReadSettings()
- {
- wxString api(L"EMPTYEMPTYEMPTY");
- m_Device = L"EMPTYEMPTYEMPTY";
+ void ReadSettings()
+ {
+ wxString api(L"EMPTYEMPTYEMPTY");
+ m_Device = L"EMPTYEMPTYEMPTY";
#ifdef __linux__
- // By default on linux use the ALSA API (+99% users) -- Gregory
- CfgReadStr(L"PORTAUDIO", L"HostApi", api, L"ALSA");
+ // By default on linux use the ALSA API (+99% users) -- Gregory
+ CfgReadStr(L"PORTAUDIO", L"HostApi", api, L"ALSA");
#elif defined(__APPLE__)
- // Suppose OSX only has CoreAudio...
- CfgReadStr(L"PORTAUDIO", L"HostApi", api, L"CoreAudio");
+ // Suppose OSX only has CoreAudio...
+ CfgReadStr(L"PORTAUDIO", L"HostApi", api, L"CoreAudio");
#else
- CfgReadStr(L"PORTAUDIO", L"HostApi", api, L"WASAPI");
+ CfgReadStr(L"PORTAUDIO", L"HostApi", api, L"WASAPI");
#endif
- CfgReadStr(L"PORTAUDIO", L"Device", m_Device, L"default");
+ CfgReadStr(L"PORTAUDIO", L"Device", m_Device, L"default");
- SetApiSettings(api);
+ SetApiSettings(api);
- m_WasapiExclusiveMode = CfgReadBool(L"PORTAUDIO", L"Wasapi_Exclusive_Mode", false);
- m_SuggestedLatencyMinimal = CfgReadBool(L"PORTAUDIO", L"Minimal_Suggested_Latency", true);
- m_SuggestedLatencyMS = CfgReadInt(L"PORTAUDIO", L"Manual_Suggested_Latency_MS", 20);
+ m_WasapiExclusiveMode = CfgReadBool(L"PORTAUDIO", L"Wasapi_Exclusive_Mode", false);
+ m_SuggestedLatencyMinimal = CfgReadBool(L"PORTAUDIO", L"Minimal_Suggested_Latency", true);
+ m_SuggestedLatencyMS = CfgReadInt(L"PORTAUDIO", L"Manual_Suggested_Latency_MS", 20);
- if (m_SuggestedLatencyMS < 10)
- m_SuggestedLatencyMS = 10;
- if (m_SuggestedLatencyMS > 200)
- m_SuggestedLatencyMS = 200;
- }
+ if (m_SuggestedLatencyMS < 10)
+ m_SuggestedLatencyMS = 10;
+ if (m_SuggestedLatencyMS > 200)
+ m_SuggestedLatencyMS = 200;
+ }
- void SetApiSettings(wxString api)
- {
- m_ApiId = -1;
- if (api == L"InDevelopment")
- m_ApiId = paInDevelopment; /* use while developing support for a new host API */
- if (api == L"DirectSound")
- m_ApiId = paDirectSound;
- if (api == L"MME")
- m_ApiId = paMME;
- if (api == L"ASIO")
- m_ApiId = paASIO;
- if (api == L"SoundManager")
- m_ApiId = paSoundManager;
- if (api == L"CoreAudio")
- m_ApiId = paCoreAudio;
- if (api == L"OSS")
- m_ApiId = paOSS;
- if (api == L"ALSA")
- m_ApiId = paALSA;
- if (api == L"AL")
- m_ApiId = paAL;
- if (api == L"BeOS")
- m_ApiId = paBeOS;
- if (api == L"WDMKS")
- m_ApiId = paWDMKS;
- if (api == L"JACK")
- m_ApiId = paJACK;
- if (api == L"WASAPI")
- m_ApiId = paWASAPI;
- if (api == L"AudioScienceHPI")
- m_ApiId = paAudioScienceHPI;
- }
+ void SetApiSettings(wxString api)
+ {
+ m_ApiId = -1;
+ if (api == L"InDevelopment")
+ m_ApiId = paInDevelopment; /* use while developing support for a new host API */
+ if (api == L"DirectSound")
+ m_ApiId = paDirectSound;
+ if (api == L"MME")
+ m_ApiId = paMME;
+ if (api == L"ASIO")
+ m_ApiId = paASIO;
+ if (api == L"SoundManager")
+ m_ApiId = paSoundManager;
+ if (api == L"CoreAudio")
+ m_ApiId = paCoreAudio;
+ if (api == L"OSS")
+ m_ApiId = paOSS;
+ if (api == L"ALSA")
+ m_ApiId = paALSA;
+ if (api == L"AL")
+ m_ApiId = paAL;
+ if (api == L"BeOS")
+ m_ApiId = paBeOS;
+ if (api == L"WDMKS")
+ m_ApiId = paWDMKS;
+ if (api == L"JACK")
+ m_ApiId = paJACK;
+ if (api == L"WASAPI")
+ m_ApiId = paWASAPI;
+ if (api == L"AudioScienceHPI")
+ m_ApiId = paAudioScienceHPI;
+ }
- void WriteSettings() const
- {
- wxString api;
- switch (m_ApiId) {
- case paInDevelopment:
- api = L"InDevelopment";
- break; /* use while developing support for a new host API */
- case paDirectSound:
- api = L"DirectSound";
- break;
- case paMME:
- api = L"MME";
- break;
- case paASIO:
- api = L"ASIO";
- break;
- case paSoundManager:
- api = L"SoundManager";
- break;
- case paCoreAudio:
- api = L"CoreAudio";
- break;
- case paOSS:
- api = L"OSS";
- break;
- case paALSA:
- api = L"ALSA";
- break;
- case paAL:
- api = L"AL";
- break;
- case paBeOS:
- api = L"BeOS";
- break;
- case paWDMKS:
- api = L"WDMKS";
- break;
- case paJACK:
- api = L"JACK";
- break;
- case paWASAPI:
- api = L"WASAPI";
- break;
- case paAudioScienceHPI:
- api = L"AudioScienceHPI";
- break;
- default:
- api = L"Unknown";
- }
+ void WriteSettings() const
+ {
+ wxString api;
+ switch (m_ApiId)
+ {
+ case paInDevelopment:
+ api = L"InDevelopment";
+ break; /* use while developing support for a new host API */
+ case paDirectSound:
+ api = L"DirectSound";
+ break;
+ case paMME:
+ api = L"MME";
+ break;
+ case paASIO:
+ api = L"ASIO";
+ break;
+ case paSoundManager:
+ api = L"SoundManager";
+ break;
+ case paCoreAudio:
+ api = L"CoreAudio";
+ break;
+ case paOSS:
+ api = L"OSS";
+ break;
+ case paALSA:
+ api = L"ALSA";
+ break;
+ case paAL:
+ api = L"AL";
+ break;
+ case paBeOS:
+ api = L"BeOS";
+ break;
+ case paWDMKS:
+ api = L"WDMKS";
+ break;
+ case paJACK:
+ api = L"JACK";
+ break;
+ case paWASAPI:
+ api = L"WASAPI";
+ break;
+ case paAudioScienceHPI:
+ api = L"AudioScienceHPI";
+ break;
+ default:
+ api = L"Unknown";
+ }
- CfgWriteStr(L"PORTAUDIO", L"HostApi", api);
- CfgWriteStr(L"PORTAUDIO", L"Device", m_Device);
+ CfgWriteStr(L"PORTAUDIO", L"HostApi", api);
+ CfgWriteStr(L"PORTAUDIO", L"Device", m_Device);
- CfgWriteBool(L"PORTAUDIO", L"Wasapi_Exclusive_Mode", m_WasapiExclusiveMode);
- CfgWriteBool(L"PORTAUDIO", L"Minimal_Suggested_Latency", m_SuggestedLatencyMinimal);
- CfgWriteInt(L"PORTAUDIO", L"Manual_Suggested_Latency_MS", m_SuggestedLatencyMS);
- }
+ CfgWriteBool(L"PORTAUDIO", L"Wasapi_Exclusive_Mode", m_WasapiExclusiveMode);
+ CfgWriteBool(L"PORTAUDIO", L"Minimal_Suggested_Latency", m_SuggestedLatencyMinimal);
+ CfgWriteInt(L"PORTAUDIO", L"Manual_Suggested_Latency_MS", m_SuggestedLatencyMS);
+ }
} static PA;
-int PaCallback(const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo *timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData)
+int PaCallback(const void* inputBuffer, void* outputBuffer,
+ unsigned long framesPerBuffer,
+ const PaStreamCallbackTimeInfo* timeInfo,
+ PaStreamCallbackFlags statusFlags,
+ void* userData)
{
- return PA.ActualPaCallback->ReadSamples(inputBuffer, outputBuffer, framesPerBuffer, timeInfo, statusFlags, userData);
+ return PA.ActualPaCallback->ReadSamples(inputBuffer, outputBuffer, framesPerBuffer, timeInfo, statusFlags, userData);
}
#ifdef _WIN32
BOOL CALLBACK Portaudio::ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- return PA._ConfigProc(hWnd, uMsg, wParam, lParam);
+ return PA._ConfigProc(hWnd, uMsg, wParam, lParam);
}
#endif
-SndOutModule *PortaudioOut = &PA;
+SndOutModule* PortaudioOut = &PA;
diff --git a/pcsx2/SPU2/SndOut_SDL.cpp b/pcsx2/SPU2/SndOut_SDL.cpp
index 2ad4e74020..76af9845c7 100644
--- a/pcsx2/SPU2/SndOut_SDL.cpp
+++ b/pcsx2/SPU2/SndOut_SDL.cpp
@@ -35,159 +35,168 @@ typedef StereoOut16 StereoOut_SDL;
namespace
{
-/* Since spu2 only ever outputs stereo, we don't worry about emitting surround sound
+ /* Since spu2 only ever outputs stereo, we don't worry about emitting surround sound
* even though SDL2 supports it */
-const Uint8 channels = 2;
-/* SDL2 supports s32 audio */
-/* Samples should vary from [512,8192] according to SDL spec. Take note this is the desired
+ const Uint8 channels = 2;
+ /* SDL2 supports s32 audio */
+ /* Samples should vary from [512,8192] according to SDL spec. Take note this is the desired
* sample count and SDL may provide otherwise. Pulseaudio will cut this value in half if
* PA_STREAM_ADJUST_LATENCY is set in the backened, for example. */
-const Uint16 desiredSamples = 2048;
-const Uint16 format = AUDIO_S16SYS;
+ const Uint16 desiredSamples = 2048;
+ const Uint16 format = AUDIO_S16SYS;
-Uint16 samples = desiredSamples;
+ Uint16 samples = desiredSamples;
-std::unique_ptr buffer;
+ std::unique_ptr buffer;
-void callback_fillBuffer(void *userdata, Uint8 *stream, int len)
-{
- Uint16 sdl_samples = samples;
+ void callback_fillBuffer(void* userdata, Uint8* stream, int len)
+ {
+ Uint16 sdl_samples = samples;
#if SDL_MAJOR_VERSION >= 2
- memset(stream, 0, len);
- // As of SDL 2.0.4 the buffer is too small to contains all samples
- // len is 2048, samples is 1024 and sizeof(StereoOut_SDL) is 4
- sdl_samples = len / sizeof(StereoOut_SDL);
+ memset(stream, 0, len);
+ // As of SDL 2.0.4 the buffer is too small to contains all samples
+ // len is 2048, samples is 1024 and sizeof(StereoOut_SDL) is 4
+ sdl_samples = len / sizeof(StereoOut_SDL);
#endif
- // Length should always be samples in bytes.
- assert(len / sizeof(StereoOut_SDL) == sdl_samples);
+ // Length should always be samples in bytes.
+ assert(len / sizeof(StereoOut_SDL) == sdl_samples);
- for (Uint16 i = 0; i < sdl_samples; i += SndOutPacketSize)
- SndBuffer::ReadSamples(&buffer[i]);
- SDL_MixAudio(stream, (Uint8 *)buffer.get(), len, SDL_MIX_MAXVOLUME);
-}
-}
+ for (Uint16 i = 0; i < sdl_samples; i += SndOutPacketSize)
+ SndBuffer::ReadSamples(&buffer[i]);
+ SDL_MixAudio(stream, (Uint8*)buffer.get(), len, SDL_MIX_MAXVOLUME);
+ }
+} // namespace
struct SDLAudioMod : public SndOutModule
{
- static SDLAudioMod mod;
- std::string m_api;
+ static SDLAudioMod mod;
+ std::string m_api;
- s32 Init()
- {
- ReadSettings();
+ s32 Init()
+ {
+ ReadSettings();
#if SDL_MAJOR_VERSION >= 2
- std::cerr << "Request SDL audio driver: " << m_api.c_str() << std::endl;
+ std::cerr << "Request SDL audio driver: " << m_api.c_str() << std::endl;
#endif
- /* SDL backends will mangle the AudioSpec and change the sample count. If we reopen
+ /* SDL backends will mangle the AudioSpec and change the sample count. If we reopen
* the audio backend, we need to make sure we keep our desired samples in the spec */
- spec.samples = desiredSamples;
+ spec.samples = desiredSamples;
- // Mandatory otherwise, init will be redone in SDL_OpenAudio
- if (SDL_Init(SDL_INIT_AUDIO) < 0) {
- std::cerr << "SPU2-X: SDL INIT audio error: " << SDL_GetError() << std::endl;
- return -1;
- }
+ // Mandatory otherwise, init will be redone in SDL_OpenAudio
+ if (SDL_Init(SDL_INIT_AUDIO) < 0)
+ {
+ std::cerr << "SPU2-X: SDL INIT audio error: " << SDL_GetError() << std::endl;
+ return -1;
+ }
#if SDL_MAJOR_VERSION >= 2
- if (m_api.compare("pulseaudio")) {
- // Close the audio, but keep the subsystem open
- SDL_AudioQuit();
- // Reopen the audio
- if (SDL_AudioInit(m_api.c_str()) < 0) {
- std::cerr << "SPU2-X: SDL audio init error: " << SDL_GetError() << std::endl;
- return -1;
- }
- }
+ if (m_api.compare("pulseaudio"))
+ {
+ // Close the audio, but keep the subsystem open
+ SDL_AudioQuit();
+ // Reopen the audio
+ if (SDL_AudioInit(m_api.c_str()) < 0)
+ {
+ std::cerr << "SPU2-X: SDL audio init error: " << SDL_GetError() << std::endl;
+ return -1;
+ }
+ }
#endif
- if (SDL_OpenAudio(&spec, NULL) < 0) {
- std::cerr << "SPU2-X: SDL audio error: " << SDL_GetError() << std::endl;
- return -1;
- }
+ if (SDL_OpenAudio(&spec, NULL) < 0)
+ {
+ std::cerr << "SPU2-X: SDL audio error: " << SDL_GetError() << std::endl;
+ return -1;
+ }
#if SDL_MAJOR_VERSION >= 2
- std::cerr << "Opened SDL audio driver: " << SDL_GetCurrentAudioDriver() << std::endl;
+ std::cerr << "Opened SDL audio driver: " << SDL_GetCurrentAudioDriver() << std::endl;
#endif
- /* This is so ugly. It is hilariously ugly. I didn't use a vector to save reallocs. */
- if (samples != spec.samples || buffer == NULL)
- buffer = std::unique_ptr(new StereoOut_SDL[spec.samples]);
- if (samples != spec.samples) {
- fprintf(stderr, "SPU2-X: SDL failed to get desired samples (%d) got %d samples instead\n", samples, spec.samples);
+ /* This is so ugly. It is hilariously ugly. I didn't use a vector to save reallocs. */
+ if (samples != spec.samples || buffer == NULL)
+ buffer = std::unique_ptr(new StereoOut_SDL[spec.samples]);
+ if (samples != spec.samples)
+ {
+ fprintf(stderr, "SPU2-X: SDL failed to get desired samples (%d) got %d samples instead\n", samples, spec.samples);
- // Samples must always be a multiple of packet size.
- assert(spec.samples % SndOutPacketSize == 0);
- samples = spec.samples;
- }
- SDL_PauseAudio(0);
- return 0;
- }
+ // Samples must always be a multiple of packet size.
+ assert(spec.samples % SndOutPacketSize == 0);
+ samples = spec.samples;
+ }
+ SDL_PauseAudio(0);
+ return 0;
+ }
- const wchar_t *GetIdent() const { return L"SDLAudio"; }
- const wchar_t *GetLongName() const { return L"SDL Audio"; }
+ const wchar_t* GetIdent() const { return L"SDLAudio"; }
+ const wchar_t* GetLongName() const { return L"SDL Audio"; }
- void Close()
- {
- // Related to SDL_Init(SDL_INIT_AUDIO)
- SDL_QuitSubSystem(SDL_INIT_AUDIO);
- }
+ void Close()
+ {
+ // Related to SDL_Init(SDL_INIT_AUDIO)
+ SDL_QuitSubSystem(SDL_INIT_AUDIO);
+ }
- ~SDLAudioMod() { Close(); }
+ ~SDLAudioMod() { Close(); }
- s32 Test() const { return 0; }
- int GetEmptySampleCount() { return 0; }
+ s32 Test() const { return 0; }
+ int GetEmptySampleCount() { return 0; }
- void Configure(uptr parent) {}
+ void Configure(uptr parent) {}
- void ReadSettings()
- {
- wxString api(L"EMPTYEMPTYEMPTY");
- CfgReadStr(L"SDL", L"HostApi", api, L"pulseaudio");
- SetApiSettings(api);
- }
+ void ReadSettings()
+ {
+ wxString api(L"EMPTYEMPTYEMPTY");
+ CfgReadStr(L"SDL", L"HostApi", api, L"pulseaudio");
+ SetApiSettings(api);
+ }
- void WriteSettings() const
- {
- CfgWriteStr(L"SDL", L"HostApi", wxString(m_api.c_str(), wxConvUTF8));
- };
+ void WriteSettings() const
+ {
+ CfgWriteStr(L"SDL", L"HostApi", wxString(m_api.c_str(), wxConvUTF8));
+ };
- void SetApiSettings(wxString api)
- {
+ void SetApiSettings(wxString api)
+ {
#if SDL_MAJOR_VERSION >= 2
- // Validate the api name
- bool valid = false;
- std::string api_name = std::string(api.utf8_str());
- for (int i = 0; i < SDL_GetNumAudioDrivers(); ++i) {
- valid |= (api_name.compare(SDL_GetAudioDriver(i)) == 0);
- }
- if (valid) {
- m_api = api.utf8_str();
- } else {
- std::cerr << "SDL audio driver configuration is invalid!" << std::endl
- << "It will be replaced by pulseaudio!" << std::endl;
- m_api = "pulseaudio";
- }
+ // Validate the api name
+ bool valid = false;
+ std::string api_name = std::string(api.utf8_str());
+ for (int i = 0; i < SDL_GetNumAudioDrivers(); ++i)
+ {
+ valid |= (api_name.compare(SDL_GetAudioDriver(i)) == 0);
+ }
+ if (valid)
+ {
+ m_api = api.utf8_str();
+ }
+ else
+ {
+ std::cerr << "SDL audio driver configuration is invalid!" << std::endl
+ << "It will be replaced by pulseaudio!" << std::endl;
+ m_api = "pulseaudio";
+ }
#endif
- }
+ }
private:
- SDL_AudioSpec spec;
+ SDL_AudioSpec spec;
- SDLAudioMod()
- : m_api("pulseaudio")
- , spec({SampleRate, format, channels, 0,
- desiredSamples, 0, 0, &callback_fillBuffer, nullptr})
- {
- // Number of samples must be a multiple of packet size.
- assert(samples % SndOutPacketSize == 0);
- }
+ SDLAudioMod()
+ : m_api("pulseaudio")
+ , spec({SampleRate, format, channels, 0,
+ desiredSamples, 0, 0, &callback_fillBuffer, nullptr})
+ {
+ // Number of samples must be a multiple of packet size.
+ assert(samples % SndOutPacketSize == 0);
+ }
};
SDLAudioMod SDLAudioMod::mod;
-SndOutModule *const SDLOut = &SDLAudioMod::mod;
+SndOutModule* const SDLOut = &SDLAudioMod::mod;
diff --git a/pcsx2/SPU2/Timestretcher.cpp b/pcsx2/SPU2/Timestretcher.cpp
index 631e2853e2..6475e75ded 100644
--- a/pcsx2/SPU2/Timestretcher.cpp
+++ b/pcsx2/SPU2/Timestretcher.cpp
@@ -21,7 +21,7 @@
//Uncomment the next line to use the old time stretcher
//#define SPU2X_USE_OLD_STRETCHER
-static soundtouch::SoundTouch *pSoundTouch = NULL;
+static soundtouch::SoundTouch* pSoundTouch = NULL;
// data prediction amount, used to "commit" data that hasn't
// finished timestretch processing.
@@ -36,7 +36,7 @@ float SndBuffer::eTempo = 1;
void SndBuffer::PredictDataWrite(int samples)
{
- m_predictData += samples;
+ m_predictData += samples;
}
// Calculate the buffer status percentage.
@@ -46,17 +46,17 @@ void SndBuffer::PredictDataWrite(int samples)
// -1.0 = buffer underflow!
float SndBuffer::GetStatusPct()
{
- // Get the buffer status of the output driver too, so that we can
- // obtain a more accurate overall buffer status.
+ // Get the buffer status of the output driver too, so that we can
+ // obtain a more accurate overall buffer status.
- int drvempty = mods[OutputModule]->GetEmptySampleCount(); // / 2;
+ int drvempty = mods[OutputModule]->GetEmptySampleCount(); // / 2;
- //ConLog( "Data %d >>> driver: %d predict: %d\n", m_data, drvempty, m_predictData );
+ //ConLog( "Data %d >>> driver: %d predict: %d\n", m_data, drvempty, m_predictData );
- int data = _GetApproximateDataInBuffer();
- float result = (float)(data + m_predictData - drvempty) - (m_size / 16);
- result /= (m_size / 16);
- return result;
+ int data = _GetApproximateDataInBuffer();
+ float result = (float)(data + m_predictData - drvempty) - (m_size / 16);
+ result /= (m_size / 16);
+ return result;
}
@@ -108,266 +108,278 @@ int gRequestStretcherReset = STRETCHER_RESET_THRESHOLD;
//Adds a value to the running average buffer, and return the new running average.
float addToAvg(float val)
{
- static float avg_fullness[AVERAGING_BUFFER_SIZE];
- static unsigned int nextAvgPos = 0;
- static unsigned int available = 0; // Make sure we're not averaging AVERAGING_WINDOW items if we inserted less.
- if (gRequestStretcherReset >= STRETCHER_RESET_THRESHOLD)
- available = 0;
+ static float avg_fullness[AVERAGING_BUFFER_SIZE];
+ static unsigned int nextAvgPos = 0;
+ static unsigned int available = 0; // Make sure we're not averaging AVERAGING_WINDOW items if we inserted less.
+ if (gRequestStretcherReset >= STRETCHER_RESET_THRESHOLD)
+ available = 0;
- if (available < AVERAGING_BUFFER_SIZE)
- available++;
+ if (available < AVERAGING_BUFFER_SIZE)
+ available++;
- avg_fullness[nextAvgPos] = val;
- nextAvgPos = (nextAvgPos + 1U) % AVERAGING_BUFFER_SIZE;
+ avg_fullness[nextAvgPos] = val;
+ nextAvgPos = (nextAvgPos + 1U) % AVERAGING_BUFFER_SIZE;
- unsigned int actualWindow = std::min(available, AVERAGING_WINDOW);
- unsigned int first = (nextAvgPos - actualWindow + AVERAGING_BUFFER_SIZE) % AVERAGING_BUFFER_SIZE;
+ unsigned int actualWindow = std::min(available, AVERAGING_WINDOW);
+ unsigned int first = (nextAvgPos - actualWindow + AVERAGING_BUFFER_SIZE) % AVERAGING_BUFFER_SIZE;
- // Possible optimization: if we know that actualWindow hasn't changed since
- // last invocation, we could calculate the running average in O(1) instead of O(N)
- // by keeping a running sum between invocations, and then
- // do "runningSum = runningSum + val - avg_fullness[(first-1)%...]" instead of the following loop.
- // Few gotchas: val overwrites first-1, handling actualWindow changes, etc.
- // However, this isn't hot code, so unless proven otherwise, we can live with unoptimized code.
- float sum = 0;
- for (unsigned int i = first; i < first + actualWindow; i++) {
- sum += avg_fullness[i % AVERAGING_BUFFER_SIZE];
- }
- sum = sum / actualWindow;
+ // Possible optimization: if we know that actualWindow hasn't changed since
+ // last invocation, we could calculate the running average in O(1) instead of O(N)
+ // by keeping a running sum between invocations, and then
+ // do "runningSum = runningSum + val - avg_fullness[(first-1)%...]" instead of the following loop.
+ // Few gotchas: val overwrites first-1, handling actualWindow changes, etc.
+ // However, this isn't hot code, so unless proven otherwise, we can live with unoptimized code.
+ float sum = 0;
+ for (unsigned int i = first; i < first + actualWindow; i++)
+ {
+ sum += avg_fullness[i % AVERAGING_BUFFER_SIZE];
+ }
+ sum = sum / actualWindow;
- return sum ? sum : 1; // 1 because that's the 100% perfect speed value
+ return sum ? sum : 1; // 1 because that's the 100% perfect speed value
}
template
-bool IsInRange(const T &val, const T &min, const T &max)
+bool IsInRange(const T& val, const T& min, const T& max)
{
- return (min <= val && val <= max);
+ return (min <= val && val <= max);
}
//actual stretch algorithm implementation
void SndBuffer::UpdateTempoChangeSoundTouch2()
{
- long targetSamplesReservoir = 48 * SndOutLatencyMS; //48000*SndOutLatencyMS/1000
- //base aim at buffer filled %
- float baseTargetFullness = (double)targetSamplesReservoir; ///(double)m_size;//0.05;
+ long targetSamplesReservoir = 48 * SndOutLatencyMS; //48000*SndOutLatencyMS/1000
+ //base aim at buffer filled %
+ float baseTargetFullness = (double)targetSamplesReservoir; ///(double)m_size;//0.05;
- //state vars
- static bool inside_hysteresis; //=false;
- static int hys_ok_count; //=0;
- static float dynamicTargetFullness; //=baseTargetFullness;
- if (gRequestStretcherReset >= STRETCHER_RESET_THRESHOLD) {
- ConLog("______> stretch: Reset.\n");
- inside_hysteresis = false;
- hys_ok_count = 0;
- dynamicTargetFullness = baseTargetFullness;
- }
+ //state vars
+ static bool inside_hysteresis; //=false;
+ static int hys_ok_count; //=0;
+ static float dynamicTargetFullness; //=baseTargetFullness;
+ if (gRequestStretcherReset >= STRETCHER_RESET_THRESHOLD)
+ {
+ ConLog("______> stretch: Reset.\n");
+ inside_hysteresis = false;
+ hys_ok_count = 0;
+ dynamicTargetFullness = baseTargetFullness;
+ }
- int data = _GetApproximateDataInBuffer();
- float bufferFullness = (float)data; ///(float)m_size;
+ int data = _GetApproximateDataInBuffer();
+ float bufferFullness = (float)data; ///(float)m_size;
#ifdef NEWSTRETCHER_USE_DYNAMIC_TUNING
- { //test current iterations/sec every 0.5s, and change algo params accordingly if different than previous IPS more than 30%
- static long iters = 0;
- static wxDateTime last = wxDateTime::UNow();
- wxDateTime unow = wxDateTime::UNow();
- wxTimeSpan delta = unow.Subtract(last);
- if (delta.GetMilliseconds() > 500) {
- int pot_targetIPS = 1000.0 / delta.GetMilliseconds().ToDouble() * iters;
- if (!IsInRange(pot_targetIPS, int((float)targetIPS / 1.3f), int((float)targetIPS * 1.3f))) {
- if (MsgOverruns())
- ConLog("Stretcher: setting iters/sec from %d to %d\n", targetIPS, pot_targetIPS);
- targetIPS = pot_targetIPS;
- AVERAGING_WINDOW = GetClamped((int)(50.0f * (float)targetIPS / 750.0f), 3, (int)AVERAGING_BUFFER_SIZE);
- }
- last = unow;
- iters = 0;
- }
- iters++;
- }
+ { //test current iterations/sec every 0.5s, and change algo params accordingly if different than previous IPS more than 30%
+ static long iters = 0;
+ static wxDateTime last = wxDateTime::UNow();
+ wxDateTime unow = wxDateTime::UNow();
+ wxTimeSpan delta = unow.Subtract(last);
+ if (delta.GetMilliseconds() > 500)
+ {
+ int pot_targetIPS = 1000.0 / delta.GetMilliseconds().ToDouble() * iters;
+ if (!IsInRange(pot_targetIPS, int((float)targetIPS / 1.3f), int((float)targetIPS * 1.3f)))
+ {
+ if (MsgOverruns())
+ ConLog("Stretcher: setting iters/sec from %d to %d\n", targetIPS, pot_targetIPS);
+ targetIPS = pot_targetIPS;
+ AVERAGING_WINDOW = GetClamped((int)(50.0f * (float)targetIPS / 750.0f), 3, (int)AVERAGING_BUFFER_SIZE);
+ }
+ last = unow;
+ iters = 0;
+ }
+ iters++;
+ }
#endif
- //Algorithm params: (threshold params (hysteresis), etc)
- const float hys_ok_factor = 1.04f;
- const float hys_bad_factor = 1.2f;
- int hys_min_ok_count = GetClamped((int)(50.0 * (float)targetIPS / 750.0), 2, 100); //consecutive iterations within hys_ok before going to 1:1 mode
- int compensationDivider = GetClamped((int)(100.0 * (float)targetIPS / 750), 15, 150);
+ //Algorithm params: (threshold params (hysteresis), etc)
+ const float hys_ok_factor = 1.04f;
+ const float hys_bad_factor = 1.2f;
+ int hys_min_ok_count = GetClamped((int)(50.0 * (float)targetIPS / 750.0), 2, 100); //consecutive iterations within hys_ok before going to 1:1 mode
+ int compensationDivider = GetClamped((int)(100.0 * (float)targetIPS / 750), 15, 150);
- float tempoAdjust = bufferFullness / dynamicTargetFullness;
- float avgerage = addToAvg(tempoAdjust);
- tempoAdjust = avgerage;
+ float tempoAdjust = bufferFullness / dynamicTargetFullness;
+ float avgerage = addToAvg(tempoAdjust);
+ tempoAdjust = avgerage;
- // Dampen the adjustment to avoid overshoots (this means the average will compensate to the other side).
- // This is different than simply bigger averaging window since bigger window also has bigger "momentum",
- // so it's slower to slow down when it gets close to the equilibrium state and can therefore resonate.
- // The dampening (sqrt was chosen for no very good reason) manages to mostly prevent that.
- tempoAdjust = sqrt(tempoAdjust);
+ // Dampen the adjustment to avoid overshoots (this means the average will compensate to the other side).
+ // This is different than simply bigger averaging window since bigger window also has bigger "momentum",
+ // so it's slower to slow down when it gets close to the equilibrium state and can therefore resonate.
+ // The dampening (sqrt was chosen for no very good reason) manages to mostly prevent that.
+ tempoAdjust = sqrt(tempoAdjust);
- tempoAdjust = GetClamped(tempoAdjust, 0.05f, 10.0f);
+ tempoAdjust = GetClamped(tempoAdjust, 0.05f, 10.0f);
- if (tempoAdjust < 1)
- baseTargetFullness /= sqrt(tempoAdjust); // slightly increase latency when running slow.
+ if (tempoAdjust < 1)
+ baseTargetFullness /= sqrt(tempoAdjust); // slightly increase latency when running slow.
- dynamicTargetFullness += (baseTargetFullness / tempoAdjust - dynamicTargetFullness) / (double)compensationDivider;
- if (IsInRange(tempoAdjust, 0.9f, 1.1f) && IsInRange(dynamicTargetFullness, baseTargetFullness * 0.9f, baseTargetFullness * 1.1f))
- dynamicTargetFullness = baseTargetFullness;
+ dynamicTargetFullness += (baseTargetFullness / tempoAdjust - dynamicTargetFullness) / (double)compensationDivider;
+ if (IsInRange(tempoAdjust, 0.9f, 1.1f) && IsInRange(dynamicTargetFullness, baseTargetFullness * 0.9f, baseTargetFullness * 1.1f))
+ dynamicTargetFullness = baseTargetFullness;
- if (!inside_hysteresis) {
- if (IsInRange(tempoAdjust, 1.0f / hys_ok_factor, hys_ok_factor))
- hys_ok_count++;
- else
- hys_ok_count = 0;
+ if (!inside_hysteresis)
+ {
+ if (IsInRange(tempoAdjust, 1.0f / hys_ok_factor, hys_ok_factor))
+ hys_ok_count++;
+ else
+ hys_ok_count = 0;
- if (hys_ok_count >= hys_min_ok_count) {
- inside_hysteresis = true;
- if (MsgOverruns())
- ConLog("======> stretch: None (1:1)\n");
- }
+ if (hys_ok_count >= hys_min_ok_count)
+ {
+ inside_hysteresis = true;
+ if (MsgOverruns())
+ ConLog("======> stretch: None (1:1)\n");
+ }
+ }
+ else if (!IsInRange(tempoAdjust, 1.0f / hys_bad_factor, hys_bad_factor))
+ {
+ if (MsgOverruns())
+ ConLog("~~~~~~> stretch: Dynamic\n");
+ inside_hysteresis = false;
+ hys_ok_count = 0;
+ }
- } else if (!IsInRange(tempoAdjust, 1.0f / hys_bad_factor, hys_bad_factor)) {
- if (MsgOverruns())
- ConLog("~~~~~~> stretch: Dynamic\n");
- inside_hysteresis = false;
- hys_ok_count = 0;
- }
+ if (inside_hysteresis)
+ tempoAdjust = 1.0;
- if (inside_hysteresis)
- tempoAdjust = 1.0;
+ if (MsgOverruns())
+ {
+ static int iters = 0;
+ static wxDateTime last = wxDateTime::UNow();
+ wxDateTime unow = wxDateTime::UNow();
+ wxTimeSpan delta = unow.Subtract(last);
- if (MsgOverruns()) {
- static int iters = 0;
- static wxDateTime last = wxDateTime::UNow();
- wxDateTime unow = wxDateTime::UNow();
- wxTimeSpan delta = unow.Subtract(last);
+ if (delta.GetMilliseconds() > 1000)
+ { //report buffers state and tempo adjust every second
+ ConLog("buffers: %4d ms (%3.0f%%), tempo: %f, comp: %2.3f, iters: %d, (N-IPS:%d -> avg:%d, minokc:%d, div:%d) reset:%d\n",
+ (int)(data / 48), (double)(100.0 * bufferFullness / baseTargetFullness), (double)tempoAdjust, (double)(dynamicTargetFullness / baseTargetFullness), iters, (int)targetIPS, AVERAGING_WINDOW, hys_min_ok_count, compensationDivider, gRequestStretcherReset);
+ last = unow;
+ iters = 0;
+ }
+ iters++;
+ }
- if (delta.GetMilliseconds() > 1000) { //report buffers state and tempo adjust every second
- ConLog("buffers: %4d ms (%3.0f%%), tempo: %f, comp: %2.3f, iters: %d, (N-IPS:%d -> avg:%d, minokc:%d, div:%d) reset:%d\n",
- (int)(data / 48), (double)(100.0 * bufferFullness / baseTargetFullness), (double)tempoAdjust, (double)(dynamicTargetFullness / baseTargetFullness), iters, (int)targetIPS, AVERAGING_WINDOW, hys_min_ok_count, compensationDivider, gRequestStretcherReset);
- last = unow;
- iters = 0;
- }
- iters++;
- }
+ pSoundTouch->setTempo(tempoAdjust);
+ if (gRequestStretcherReset >= STRETCHER_RESET_THRESHOLD)
+ gRequestStretcherReset = 0;
- pSoundTouch->setTempo(tempoAdjust);
- if (gRequestStretcherReset >= STRETCHER_RESET_THRESHOLD)
- gRequestStretcherReset = 0;
-
- return;
+ return;
}
void SndBuffer::UpdateTempoChangeSoundTouch()
{
- float statusPct = GetStatusPct();
- float pctChange = statusPct - lastPct;
+ float statusPct = GetStatusPct();
+ float pctChange = statusPct - lastPct;
- float tempoChange;
- float emergencyAdj = 0;
- float newcee = cTempo; // workspace var. for cTempo
+ float tempoChange;
+ float emergencyAdj = 0;
+ float newcee = cTempo; // workspace var. for cTempo
- // IMPORTANT!
- // If you plan to tweak these values, make sure you're using a release build
- // OUTSIDE THE DEBUGGER to test it! The Visual Studio debugger can really cause
- // erratic behavior in the audio buffers, and makes the timestretcher seem a
- // lot more inconsistent than it really is.
+ // IMPORTANT!
+ // If you plan to tweak these values, make sure you're using a release build
+ // OUTSIDE THE DEBUGGER to test it! The Visual Studio debugger can really cause
+ // erratic behavior in the audio buffers, and makes the timestretcher seem a
+ // lot more inconsistent than it really is.
- // We have two factors.
- // * Distance from nominal buffer status (50% full)
- // * The change from previous update to this update.
+ // We have two factors.
+ // * Distance from nominal buffer status (50% full)
+ // * The change from previous update to this update.
- // Prediction based on the buffer change:
- // (linear seems to work better here)
+ // Prediction based on the buffer change:
+ // (linear seems to work better here)
- tempoChange = pctChange * 0.75f;
+ tempoChange = pctChange * 0.75f;
- if (statusPct * tempoChange < 0.0f) {
- // only apply tempo change if it is in synch with the buffer status.
- // In other words, if the buffer is high (over 0%), and is decreasing,
- // ignore it. It'll just muck things up.
+ if (statusPct * tempoChange < 0.0f)
+ {
+ // only apply tempo change if it is in synch with the buffer status.
+ // In other words, if the buffer is high (over 0%), and is decreasing,
+ // ignore it. It'll just muck things up.
- tempoChange = 0;
- }
+ tempoChange = 0;
+ }
- // Sudden spikes in framerate can cause the nominal buffer status
- // to go critical, in which case we have to enact an emergency
- // stretch. The following cubic formulas do that. Values near
- // the extremeites give much larger results than those near 0.
- // And the value is added only this time, and does not accumulate.
- // (otherwise a large value like this would cause problems down the road)
+ // Sudden spikes in framerate can cause the nominal buffer status
+ // to go critical, in which case we have to enact an emergency
+ // stretch. The following cubic formulas do that. Values near
+ // the extremeites give much larger results than those near 0.
+ // And the value is added only this time, and does not accumulate.
+ // (otherwise a large value like this would cause problems down the road)
- // Constants:
- // Weight - weights the statusPct's "emergency" consideration.
- // higher values here will make the buffer perform more drastic
- // compensations at the outer edges of the buffer (at -75 or +75%
- // or beyond, for example).
+ // Constants:
+ // Weight - weights the statusPct's "emergency" consideration.
+ // higher values here will make the buffer perform more drastic
+ // compensations at the outer edges of the buffer (at -75 or +75%
+ // or beyond, for example).
- // Range - scales the adjustment to the given range (more or less).
- // The actual range is dependent on the weight used, so if you increase
- // Weight you'll usually want to decrease Range somewhat to compensate.
+ // Range - scales the adjustment to the given range (more or less).
+ // The actual range is dependent on the weight used, so if you increase
+ // Weight you'll usually want to decrease Range somewhat to compensate.
- // Prediction based on the buffer fill status:
+ // Prediction based on the buffer fill status:
- const float statusWeight = 2.99f;
- const float statusRange = 0.068f;
+ const float statusWeight = 2.99f;
+ const float statusRange = 0.068f;
- // "non-emergency" deadzone: In this area stretching will be strongly discouraged.
- // Note: due tot he nature of timestretch latency, it's always a wee bit harder to
- // cope with low fps (underruns) than it is high fps (overruns). So to help out a
- // little, the low-end portions of this check are less forgiving than the high-sides.
+ // "non-emergency" deadzone: In this area stretching will be strongly discouraged.
+ // Note: due tot he nature of timestretch latency, it's always a wee bit harder to
+ // cope with low fps (underruns) than it is high fps (overruns). So to help out a
+ // little, the low-end portions of this check are less forgiving than the high-sides.
- if (cTempo < 0.965f || cTempo > 1.060f ||
- pctChange < -0.38f || pctChange > 0.54f ||
- statusPct < -0.42f || statusPct > 0.70f ||
- eTempo < 0.89f || eTempo > 1.19f) {
- //printf("Emergency stretch: cTempo = %f eTempo = %f pctChange = %f statusPct = %f\n",cTempo,eTempo,pctChange,statusPct);
- emergencyAdj = (pow(statusPct * statusWeight, 3.0f) * statusRange);
- }
+ if (cTempo < 0.965f || cTempo > 1.060f ||
+ pctChange < -0.38f || pctChange > 0.54f ||
+ statusPct < -0.42f || statusPct > 0.70f ||
+ eTempo < 0.89f || eTempo > 1.19f)
+ {
+ //printf("Emergency stretch: cTempo = %f eTempo = %f pctChange = %f statusPct = %f\n",cTempo,eTempo,pctChange,statusPct);
+ emergencyAdj = (pow(statusPct * statusWeight, 3.0f) * statusRange);
+ }
- // Smooth things out by factoring our previous adjustment into this one.
- // It helps make the system 'feel' a little smarter by giving it at least
- // one packet worth of history to help work off of:
+ // Smooth things out by factoring our previous adjustment into this one.
+ // It helps make the system 'feel' a little smarter by giving it at least
+ // one packet worth of history to help work off of:
- emergencyAdj = (emergencyAdj * 0.75f) + (lastEmergencyAdj * 0.25f);
+ emergencyAdj = (emergencyAdj * 0.75f) + (lastEmergencyAdj * 0.25f);
- lastEmergencyAdj = emergencyAdj;
- lastPct = statusPct;
+ lastEmergencyAdj = emergencyAdj;
+ lastPct = statusPct;
- // Accumulate a fraction of the tempo change into the tempo itself.
- // This helps the system run "smarter" to games that run consistently
- // fast or slow by altering the base tempo to something closer to the
- // game's active speed. In tests most games normalize within 2 seconds
- // at 100ms latency, which is pretty good (larger buffers normalize even
- // quicker).
+ // Accumulate a fraction of the tempo change into the tempo itself.
+ // This helps the system run "smarter" to games that run consistently
+ // fast or slow by altering the base tempo to something closer to the
+ // game's active speed. In tests most games normalize within 2 seconds
+ // at 100ms latency, which is pretty good (larger buffers normalize even
+ // quicker).
- newcee += newcee * (tempoChange + emergencyAdj) * 0.03f;
+ newcee += newcee * (tempoChange + emergencyAdj) * 0.03f;
- // Apply tempoChange as a scale of cTempo. That way the effect is proportional
- // to the current tempo. (otherwise tempos rate of change at the extremes would
- // be too drastic)
+ // Apply tempoChange as a scale of cTempo. That way the effect is proportional
+ // to the current tempo. (otherwise tempos rate of change at the extremes would
+ // be too drastic)
- float newTempo = newcee + (emergencyAdj * cTempo);
+ float newTempo = newcee + (emergencyAdj * cTempo);
- // ... and as a final optimization, only stretch if the new tempo is outside
- // a nominal threshold. Keep this threshold check small, because it could
- // cause some serious side effects otherwise. (enlarging the cTempo check above
- // is usually better/safer)
- if (newTempo < 0.970f || newTempo > 1.045f) {
- cTempo = (float)newcee;
+ // ... and as a final optimization, only stretch if the new tempo is outside
+ // a nominal threshold. Keep this threshold check small, because it could
+ // cause some serious side effects otherwise. (enlarging the cTempo check above
+ // is usually better/safer)
+ if (newTempo < 0.970f || newTempo > 1.045f)
+ {
+ cTempo = (float)newcee;
- if (newTempo < 0.10f)
- newTempo = 0.10f;
- else if (newTempo > 10.0f)
- newTempo = 10.0f;
+ if (newTempo < 0.10f)
+ newTempo = 0.10f;
+ else if (newTempo > 10.0f)
+ newTempo = 10.0f;
- if (cTempo < 0.15f)
- cTempo = 0.15f;
- else if (cTempo > 7.5f)
- cTempo = 7.5f;
+ if (cTempo < 0.15f)
+ cTempo = 0.15f;
+ else if (cTempo > 7.5f)
+ cTempo = 7.5f;
- pSoundTouch->setTempo(eTempo = (float)newTempo);
+ pSoundTouch->setTempo(eTempo = (float)newTempo);
- /*ConLog("* SPU2-X: [Nominal %d%%] [Emergency: %d%%] (baseTempo: %d%% ) (newTempo: %d%%) (buffer: %d%%)\n",
+ /*ConLog("* SPU2-X: [Nominal %d%%] [Emergency: %d%%] (baseTempo: %d%% ) (newTempo: %d%%) (buffer: %d%%)\n",
//(relation < 0.0) ? "Normalize" : "",
(int)(tempoChange * 100.0 * 0.03),
(int)(emergencyAdj * 100.0),
@@ -375,164 +387,174 @@ void SndBuffer::UpdateTempoChangeSoundTouch()
(int)(newTempo * 100.0),
(int)(statusPct * 100.0)
);*/
- } else {
- // Nominal operation -- turn off stretching.
- // note: eTempo 'slides' toward 1.0 for smoother audio and better
- // protection against spikes.
- if (cTempo != 1.0f) {
- cTempo = 1.0f;
- eTempo = (1.0f + eTempo) * 0.5f;
- pSoundTouch->setTempo(eTempo);
- } else {
- if (eTempo != cTempo)
- pSoundTouch->setTempo(eTempo = cTempo);
- }
- }
+ }
+ else
+ {
+ // Nominal operation -- turn off stretching.
+ // note: eTempo 'slides' toward 1.0 for smoother audio and better
+ // protection against spikes.
+ if (cTempo != 1.0f)
+ {
+ cTempo = 1.0f;
+ eTempo = (1.0f + eTempo) * 0.5f;
+ pSoundTouch->setTempo(eTempo);
+ }
+ else
+ {
+ if (eTempo != cTempo)
+ pSoundTouch->setTempo(eTempo = cTempo);
+ }
+ }
}
extern uint TickInterval;
void SndBuffer::UpdateTempoChangeAsyncMixing()
{
- float statusPct = GetStatusPct();
+ float statusPct = GetStatusPct();
- lastPct = statusPct;
- if (statusPct < -0.1f) {
- TickInterval -= 4;
- if (statusPct < -0.3f)
- TickInterval = 64;
- if (TickInterval < 64)
- TickInterval = 64;
- //printf("-- %d, %f\n",TickInterval,statusPct);
- } else if (statusPct > 0.2f) {
- TickInterval += 1;
- if (TickInterval >= 7000)
- TickInterval = 7000;
- //printf("++ %d, %f\n",TickInterval,statusPct);
- } else
- TickInterval = 768;
+ lastPct = statusPct;
+ if (statusPct < -0.1f)
+ {
+ TickInterval -= 4;
+ if (statusPct < -0.3f)
+ TickInterval = 64;
+ if (TickInterval < 64)
+ TickInterval = 64;
+ //printf("-- %d, %f\n",TickInterval,statusPct);
+ }
+ else if (statusPct > 0.2f)
+ {
+ TickInterval += 1;
+ if (TickInterval >= 7000)
+ TickInterval = 7000;
+ //printf("++ %d, %f\n",TickInterval,statusPct);
+ }
+ else
+ TickInterval = 768;
}
void SndBuffer::timeStretchUnderrun()
{
- gRequestStretcherReset++;
- // timeStretcher failed it's job. We need to slow down the audio some.
+ gRequestStretcherReset++;
+ // timeStretcher failed it's job. We need to slow down the audio some.
- cTempo -= (cTempo * 0.12f);
- eTempo -= (eTempo * 0.30f);
- if (eTempo < 0.1f)
- eTempo = 0.1f;
- // pSoundTouch->setTempo( eTempo );
- //pSoundTouch->setTempoChange(-30); // temporary (until stretcher is called) slow down
+ cTempo -= (cTempo * 0.12f);
+ eTempo -= (eTempo * 0.30f);
+ if (eTempo < 0.1f)
+ eTempo = 0.1f;
+ // pSoundTouch->setTempo( eTempo );
+ //pSoundTouch->setTempoChange(-30); // temporary (until stretcher is called) slow down
}
s32 SndBuffer::timeStretchOverrun()
{
- // If we overran it means the timestretcher failed. We need to speed
- // up audio playback.
- cTempo += cTempo * 0.12f;
- eTempo += eTempo * 0.40f;
- if (eTempo > 7.5f)
- eTempo = 7.5f;
- //pSoundTouch->setTempo( eTempo );
- //pSoundTouch->setTempoChange(30);// temporary (until stretcher is called) speed up
+ // If we overran it means the timestretcher failed. We need to speed
+ // up audio playback.
+ cTempo += cTempo * 0.12f;
+ eTempo += eTempo * 0.40f;
+ if (eTempo > 7.5f)
+ eTempo = 7.5f;
+ //pSoundTouch->setTempo( eTempo );
+ //pSoundTouch->setTempoChange(30);// temporary (until stretcher is called) speed up
- // Throw out just a little bit (two packets worth) to help
- // give the TS some room to work:
- gRequestStretcherReset++;
- return SndOutPacketSize * 2;
+ // Throw out just a little bit (two packets worth) to help
+ // give the TS some room to work:
+ gRequestStretcherReset++;
+ return SndOutPacketSize * 2;
}
-static void CvtPacketToFloat(StereoOut32 *srcdest)
+static void CvtPacketToFloat(StereoOut32* srcdest)
{
- StereoOutFloat *dest = (StereoOutFloat *)srcdest;
- const StereoOut32 *src = (StereoOut32 *)srcdest;
- for (uint i = 0; i < SndOutPacketSize; ++i, ++dest, ++src)
- *dest = (StereoOutFloat)*src;
+ StereoOutFloat* dest = (StereoOutFloat*)srcdest;
+ const StereoOut32* src = (StereoOut32*)srcdest;
+ for (uint i = 0; i < SndOutPacketSize; ++i, ++dest, ++src)
+ *dest = (StereoOutFloat)*src;
}
// Parameter note: Size should always be a multiple of 128, thanks!
-static void CvtPacketToInt(StereoOut32 *srcdest, uint size)
+static void CvtPacketToInt(StereoOut32* srcdest, uint size)
{
- //pxAssume( (size & 127) == 0 );
+ //pxAssume( (size & 127) == 0 );
- const StereoOutFloat *src = (StereoOutFloat *)srcdest;
- StereoOut32 *dest = srcdest;
+ const StereoOutFloat* src = (StereoOutFloat*)srcdest;
+ StereoOut32* dest = srcdest;
- for (uint i = 0; i < size; ++i, ++dest, ++src)
- *dest = (StereoOut32)*src;
+ for (uint i = 0; i < size; ++i, ++dest, ++src)
+ *dest = (StereoOut32)*src;
}
void SndBuffer::timeStretchWrite()
{
- // data prediction helps keep the tempo adjustments more accurate.
- // The timestretcher returns packets in belated "clump" form.
- // Meaning that most of the time we'll get nothing back, and then
- // suddenly we'll get several chunks back at once. Thus we use
- // data prediction to make the timestretcher more responsive.
+ // data prediction helps keep the tempo adjustments more accurate.
+ // The timestretcher returns packets in belated "clump" form.
+ // Meaning that most of the time we'll get nothing back, and then
+ // suddenly we'll get several chunks back at once. Thus we use
+ // data prediction to make the timestretcher more responsive.
- PredictDataWrite((int)(SndOutPacketSize / eTempo));
- CvtPacketToFloat(sndTempBuffer);
+ PredictDataWrite((int)(SndOutPacketSize / eTempo));
+ CvtPacketToFloat(sndTempBuffer);
- pSoundTouch->putSamples((float *)sndTempBuffer, SndOutPacketSize);
+ pSoundTouch->putSamples((float*)sndTempBuffer, SndOutPacketSize);
- int tempProgress;
- while (tempProgress = pSoundTouch->receiveSamples((float *)sndTempBuffer, SndOutPacketSize),
- tempProgress != 0) {
- // Hint: It's assumed that pSoundTouch will return chunks of 128 bytes (it always does as
- // long as the SSE optimizations are enabled), which means we can do our own SSE opts here.
+ int tempProgress;
+ while (tempProgress = pSoundTouch->receiveSamples((float*)sndTempBuffer, SndOutPacketSize),
+ tempProgress != 0)
+ {
+ // Hint: It's assumed that pSoundTouch will return chunks of 128 bytes (it always does as
+ // long as the SSE optimizations are enabled), which means we can do our own SSE opts here.
- CvtPacketToInt(sndTempBuffer, tempProgress);
- _WriteSamples(sndTempBuffer, tempProgress);
- }
+ CvtPacketToInt(sndTempBuffer, tempProgress);
+ _WriteSamples(sndTempBuffer, tempProgress);
+ }
#ifdef SPU2X_USE_OLD_STRETCHER
- UpdateTempoChangeSoundTouch();
+ UpdateTempoChangeSoundTouch();
#else
- UpdateTempoChangeSoundTouch2();
+ UpdateTempoChangeSoundTouch2();
#endif
}
void SndBuffer::soundtouchInit()
{
- pSoundTouch = new soundtouch::SoundTouch();
- pSoundTouch->setSampleRate(SampleRate);
- pSoundTouch->setChannels(2);
+ pSoundTouch = new soundtouch::SoundTouch();
+ pSoundTouch->setSampleRate(SampleRate);
+ pSoundTouch->setChannels(2);
- pSoundTouch->setSetting(SETTING_USE_QUICKSEEK, 0);
- pSoundTouch->setSetting(SETTING_USE_AA_FILTER, 0);
+ pSoundTouch->setSetting(SETTING_USE_QUICKSEEK, 0);
+ pSoundTouch->setSetting(SETTING_USE_AA_FILTER, 0);
- SoundtouchCfg::ApplySettings(*pSoundTouch);
+ SoundtouchCfg::ApplySettings(*pSoundTouch);
- pSoundTouch->setTempo(1);
+ pSoundTouch->setTempo(1);
- // some timestretch management vars:
+ // some timestretch management vars:
- cTempo = 1.0;
- eTempo = 1.0;
- lastPct = 0;
- lastEmergencyAdj = 0;
+ cTempo = 1.0;
+ eTempo = 1.0;
+ lastPct = 0;
+ lastEmergencyAdj = 0;
- m_predictData = 0;
+ m_predictData = 0;
}
// reset timestretch management vars, and delay updates a bit:
void SndBuffer::soundtouchClearContents()
{
- if (pSoundTouch == NULL)
- return;
+ if (pSoundTouch == NULL)
+ return;
- pSoundTouch->clear();
- pSoundTouch->setTempo(1);
+ pSoundTouch->clear();
+ pSoundTouch->setTempo(1);
- cTempo = 1.0;
- eTempo = 1.0;
- lastPct = 0;
- lastEmergencyAdj = 0;
+ cTempo = 1.0;
+ eTempo = 1.0;
+ lastPct = 0;
+ lastEmergencyAdj = 0;
- m_predictData = 0;
+ m_predictData = 0;
}
void SndBuffer::soundtouchCleanup()
{
- safe_delete(pSoundTouch);
+ safe_delete(pSoundTouch);
}
diff --git a/pcsx2/SPU2/WavFile.cpp b/pcsx2/SPU2/WavFile.cpp
index e4c5a27323..88c2f76ddd 100644
--- a/pcsx2/SPU2/WavFile.cpp
+++ b/pcsx2/SPU2/WavFile.cpp
@@ -37,109 +37,113 @@ static const char dataStr[] = "data";
// Class WavOutFile
//
-WavOutFile::WavOutFile(const char *fileName, int sampleRate, int bits, int channels)
+WavOutFile::WavOutFile(const char* fileName, int sampleRate, int bits, int channels)
{
- bytesWritten = 0;
- fptr = fopen(fileName, "wb");
- if (fptr == NULL) {
- string msg = "Error : Unable to open file \"";
- msg += fileName;
- msg += "\" for writing.";
- //pmsg = msg.c_str;
- throw runtime_error(msg);
- }
+ bytesWritten = 0;
+ fptr = fopen(fileName, "wb");
+ if (fptr == NULL)
+ {
+ string msg = "Error : Unable to open file \"";
+ msg += fileName;
+ msg += "\" for writing.";
+ //pmsg = msg.c_str;
+ throw runtime_error(msg);
+ }
- fillInHeader(sampleRate, bits, channels);
- writeHeader();
+ fillInHeader(sampleRate, bits, channels);
+ writeHeader();
}
WavOutFile::~WavOutFile()
{
- if (fptr) {
- finishHeader();
- fclose(fptr);
- }
+ if (fptr)
+ {
+ finishHeader();
+ fclose(fptr);
+ }
}
void WavOutFile::fillInHeader(uint sampleRate, uint bits, uint channels)
{
- // fill in the 'riff' part..
+ // fill in the 'riff' part..
- // copy string 'RIFF' to riff_char
- memcpy(&(header.riff.riff_char), riffStr, 4);
- // package_len unknown so far
- header.riff.package_len = 0;
- // copy string 'WAVE' to wave
- memcpy(&(header.riff.wave), waveStr, 4);
+ // copy string 'RIFF' to riff_char
+ memcpy(&(header.riff.riff_char), riffStr, 4);
+ // package_len unknown so far
+ header.riff.package_len = 0;
+ // copy string 'WAVE' to wave
+ memcpy(&(header.riff.wave), waveStr, 4);
- // fill in the 'format' part..
+ // fill in the 'format' part..
- // copy string 'fmt ' to fmt
- memcpy(&(header.format.fmt), fmtStr, 4);
+ // copy string 'fmt ' to fmt
+ memcpy(&(header.format.fmt), fmtStr, 4);
- header.format.format_len = 0x10;
- header.format.fixed = 1;
- header.format.channel_number = (short)channels;
- header.format.sample_rate = (int)sampleRate;
- header.format.bits_per_sample = (short)bits;
- header.format.byte_per_sample = (short)(bits * channels / 8);
- header.format.byte_rate = header.format.byte_per_sample * (int)sampleRate;
- header.format.sample_rate = (int)sampleRate;
+ header.format.format_len = 0x10;
+ header.format.fixed = 1;
+ header.format.channel_number = (short)channels;
+ header.format.sample_rate = (int)sampleRate;
+ header.format.bits_per_sample = (short)bits;
+ header.format.byte_per_sample = (short)(bits * channels / 8);
+ header.format.byte_rate = header.format.byte_per_sample * (int)sampleRate;
+ header.format.sample_rate = (int)sampleRate;
- // fill in the 'data' part..
+ // fill in the 'data' part..
- // copy string 'data' to data_field
- memcpy(&(header.data.data_field), dataStr, 4);
- // data_len unknown so far
- header.data.data_len = 0;
+ // copy string 'data' to data_field
+ memcpy(&(header.data.data_field), dataStr, 4);
+ // data_len unknown so far
+ header.data.data_len = 0;
}
void WavOutFile::finishHeader()
{
- // supplement the file length into the header structure
- header.riff.package_len = bytesWritten + 36;
- header.data.data_len = bytesWritten;
+ // supplement the file length into the header structure
+ header.riff.package_len = bytesWritten + 36;
+ header.data.data_len = bytesWritten;
- writeHeader();
+ writeHeader();
}
void WavOutFile::writeHeader()
{
- int res;
+ int res;
- // write the supplemented header in the beginning of the file
- fseek(fptr, 0, SEEK_SET);
- res = fwrite(&header, sizeof(header), 1, fptr);
- if (res != 1) {
- throw runtime_error("Error while writing to a wav file.");
- }
+ // write the supplemented header in the beginning of the file
+ fseek(fptr, 0, SEEK_SET);
+ res = fwrite(&header, sizeof(header), 1, fptr);
+ if (res != 1)
+ {
+ throw runtime_error("Error while writing to a wav file.");
+ }
- // jump back to the end of the file
- fseek(fptr, 0, SEEK_END);
+ // jump back to the end of the file
+ fseek(fptr, 0, SEEK_END);
}
-void WavOutFile::write(const short *buffer, int numElems)
+void WavOutFile::write(const short* buffer, int numElems)
{
- int res;
+ int res;
- // 16bit format & 16 bit samples
+ // 16bit format & 16 bit samples
- assert(header.format.bits_per_sample == 16);
- if (numElems < 1)
- return; // nothing to do
+ assert(header.format.bits_per_sample == 16);
+ if (numElems < 1)
+ return; // nothing to do
- res = fwrite(buffer, 2, numElems, fptr);
+ res = fwrite(buffer, 2, numElems, fptr);
- if (res != numElems) {
- throw runtime_error("Error while writing to a wav file.");
- }
- bytesWritten += 2 * numElems;
+ if (res != numElems)
+ {
+ throw runtime_error("Error while writing to a wav file.");
+ }
+ bytesWritten += 2 * numElems;
}
diff --git a/pcsx2/SPU2/WavFile.h b/pcsx2/SPU2/WavFile.h
index d413610d96..65565b3fa8 100644
--- a/pcsx2/SPU2/WavFile.h
+++ b/pcsx2/SPU2/WavFile.h
@@ -29,38 +29,38 @@ typedef unsigned int uint;
/// WAV audio file 'riff' section header
typedef struct
{
- char riff_char[4];
- int package_len;
- char wave[4];
+ char riff_char[4];
+ int package_len;
+ char wave[4];
} WavRiff;
/// WAV audio file 'format' section header
typedef struct
{
- char fmt[4];
- int format_len;
- short fixed;
- short channel_number;
- int sample_rate;
- int byte_rate;
- short byte_per_sample;
- short bits_per_sample;
+ char fmt[4];
+ int format_len;
+ short fixed;
+ short channel_number;
+ int sample_rate;
+ int byte_rate;
+ short byte_per_sample;
+ short bits_per_sample;
} WavFormat;
/// WAV audio file 'data' section header
typedef struct
{
- char data_field[4];
- uint data_len;
+ char data_field[4];
+ uint data_len;
} WavData;
/// WAV audio file header
typedef struct
{
- WavRiff riff;
- WavFormat format;
- WavData data;
+ WavRiff riff;
+ WavFormat format;
+ WavData data;
} WavHeader;
@@ -68,42 +68,42 @@ typedef struct
class WavOutFile
{
private:
- /// Pointer to the WAV file
- FILE *fptr;
+ /// Pointer to the WAV file
+ FILE* fptr;
- /// WAV file header data.
- WavHeader header;
+ /// WAV file header data.
+ WavHeader header;
- /// Counter of how many bytes have been written to the file so far.
- int bytesWritten;
+ /// Counter of how many bytes have been written to the file so far.
+ int bytesWritten;
- /// Fills in WAV file header information.
- void fillInHeader(const uint sampleRate, const uint bits, const uint channels);
+ /// Fills in WAV file header information.
+ void fillInHeader(const uint sampleRate, const uint bits, const uint channels);
- /// Finishes the WAV file header by supplementing information of amount of
- /// data written to file etc
- void finishHeader();
+ /// Finishes the WAV file header by supplementing information of amount of
+ /// data written to file etc
+ void finishHeader();
- /// Writes the WAV file header.
- void writeHeader();
+ /// Writes the WAV file header.
+ void writeHeader();
public:
- /// Constructor: Creates a new WAV file. Throws a 'runtime_error' exception
- /// if file creation fails.
- WavOutFile(const char *fileName, ///< Filename
- int sampleRate, ///< Sample rate (e.g. 44100 etc)
- int bits, ///< Bits per sample (8 or 16 bits)
- int channels ///< Number of channels (1=mono, 2=stereo)
- );
+ /// Constructor: Creates a new WAV file. Throws a 'runtime_error' exception
+ /// if file creation fails.
+ WavOutFile(const char* fileName, ///< Filename
+ int sampleRate, ///< Sample rate (e.g. 44100 etc)
+ int bits, ///< Bits per sample (8 or 16 bits)
+ int channels ///< Number of channels (1=mono, 2=stereo)
+ );
- /// Destructor: Finalizes & closes the WAV file.
- ~WavOutFile();
+ /// Destructor: Finalizes & closes the WAV file.
+ ~WavOutFile();
- /// Write data to WAV file. Throws a 'runtime_error' exception if writing to
- /// file fails.
- void write(const short *buffer, ///< Pointer to sample data buffer.
- int numElems ///< How many array items are to be written to file.
- );
+ /// Write data to WAV file. Throws a 'runtime_error' exception if writing to
+ /// file fails.
+ void write(const short* buffer, ///< Pointer to sample data buffer.
+ int numElems ///< How many array items are to be written to file.
+ );
};
#endif
diff --git a/pcsx2/SPU2/Wavedump_wav.cpp b/pcsx2/SPU2/Wavedump_wav.cpp
index 3e8163c34c..8059179c30 100644
--- a/pcsx2/SPU2/Wavedump_wav.cpp
+++ b/pcsx2/SPU2/Wavedump_wav.cpp
@@ -20,78 +20,85 @@
#include "soundtouch/source/SoundStretch/WavFile.h"
#endif
-static WavOutFile *_new_WavOutFile(const char *destfile)
+static WavOutFile* _new_WavOutFile(const char* destfile)
{
- return new WavOutFile(destfile, 48000, 16, 2);
+ return new WavOutFile(destfile, 48000, 16, 2);
}
namespace WaveDump
{
-static WavOutFile *m_CoreWav[2][CoreSrc_Count];
+ static WavOutFile* m_CoreWav[2][CoreSrc_Count];
-static const char *m_tbl_CoreOutputTypeNames[CoreSrc_Count] =
- {
- "Input",
- "DryVoiceMix",
- "WetVoiceMix",
- "PreReverb",
- "PostReverb",
- "External"};
+ static const char* m_tbl_CoreOutputTypeNames[CoreSrc_Count] =
+ {
+ "Input",
+ "DryVoiceMix",
+ "WetVoiceMix",
+ "PreReverb",
+ "PostReverb",
+ "External"};
-void Open()
-{
- if (!IsDevBuild)
- return;
- if (!WaveLog())
- return;
+ void Open()
+ {
+ if (!IsDevBuild)
+ return;
+ if (!WaveLog())
+ return;
- char wavfilename[256];
+ char wavfilename[256];
- for (uint cidx = 0; cidx < 2; cidx++) {
- for (int srcidx = 0; srcidx < CoreSrc_Count; srcidx++) {
- safe_delete(m_CoreWav[cidx][srcidx]);
+ for (uint cidx = 0; cidx < 2; cidx++)
+ {
+ for (int srcidx = 0; srcidx < CoreSrc_Count; srcidx++)
+ {
+ safe_delete(m_CoreWav[cidx][srcidx]);
#ifdef __POSIX__
- sprintf(wavfilename, "logs/spu2x-Core%ud-%s.wav",
- cidx, m_tbl_CoreOutputTypeNames[srcidx]);
+ sprintf(wavfilename, "logs/spu2x-Core%ud-%s.wav",
+ cidx, m_tbl_CoreOutputTypeNames[srcidx]);
#else
- sprintf(wavfilename, "logs\\spu2x-Core%ud-%s.wav",
- cidx, m_tbl_CoreOutputTypeNames[srcidx]);
+ sprintf(wavfilename, "logs\\spu2x-Core%ud-%s.wav",
+ cidx, m_tbl_CoreOutputTypeNames[srcidx]);
#endif
- try {
- m_CoreWav[cidx][srcidx] = _new_WavOutFile(wavfilename);
- } catch (std::runtime_error &ex) {
- printf("SPU2-X > %s.\n\tWave Log for this core source disabled.", ex.what());
- m_CoreWav[cidx][srcidx] = NULL;
- }
- }
- }
-}
+ try
+ {
+ m_CoreWav[cidx][srcidx] = _new_WavOutFile(wavfilename);
+ }
+ catch (std::runtime_error& ex)
+ {
+ printf("SPU2-X > %s.\n\tWave Log for this core source disabled.", ex.what());
+ m_CoreWav[cidx][srcidx] = NULL;
+ }
+ }
+ }
+ }
-void Close()
-{
- if (!IsDevBuild)
- return;
- for (uint cidx = 0; cidx < 2; cidx++) {
- for (int srcidx = 0; srcidx < CoreSrc_Count; srcidx++) {
- safe_delete(m_CoreWav[cidx][srcidx]);
- }
- }
-}
+ void Close()
+ {
+ if (!IsDevBuild)
+ return;
+ for (uint cidx = 0; cidx < 2; cidx++)
+ {
+ for (int srcidx = 0; srcidx < CoreSrc_Count; srcidx++)
+ {
+ safe_delete(m_CoreWav[cidx][srcidx]);
+ }
+ }
+ }
-void WriteCore(uint coreidx, CoreSourceType src, const StereoOut16 &sample)
-{
- if (!IsDevBuild)
- return;
- if (m_CoreWav[coreidx][src] != NULL)
- m_CoreWav[coreidx][src]->write((s16 *)&sample, 2);
-}
+ void WriteCore(uint coreidx, CoreSourceType src, const StereoOut16& sample)
+ {
+ if (!IsDevBuild)
+ return;
+ if (m_CoreWav[coreidx][src] != NULL)
+ m_CoreWav[coreidx][src]->write((s16*)&sample, 2);
+ }
-void WriteCore(uint coreidx, CoreSourceType src, s16 left, s16 right)
-{
- WriteCore(coreidx, src, StereoOut16(left, right));
-}
-}
+ void WriteCore(uint coreidx, CoreSourceType src, s16 left, s16 right)
+ {
+ WriteCore(coreidx, src, StereoOut16(left, right));
+ }
+} // namespace WaveDump
#include "Utilities/Threading.h"
@@ -99,42 +106,45 @@ using namespace Threading;
bool WavRecordEnabled = false;
-static WavOutFile *m_wavrecord = NULL;
+static WavOutFile* m_wavrecord = NULL;
static Mutex WavRecordMutex;
void RecordStart(std::wstring* filename)
{
- WavRecordEnabled = false;
+ WavRecordEnabled = false;
- try {
- ScopedLock lock(WavRecordMutex);
- safe_delete(m_wavrecord);
+ try
+ {
+ ScopedLock lock(WavRecordMutex);
+ safe_delete(m_wavrecord);
#ifdef _WIN32
- if (filename)
- m_wavrecord = new WavOutFile((*filename) + "wav", 48000, 16, 2);
- else
- m_wavrecord = new WavOutFile("audio_recording.wav", 48000, 16, 2);
+ if (filename)
+ m_wavrecord = new WavOutFile((*filename) + "wav", 48000, 16, 2);
+ else
+ m_wavrecord = new WavOutFile("audio_recording.wav", 48000, 16, 2);
#elif defined(__unix__)
- m_wavrecord = new WavOutFile("audio_recording.wav", 48000, 16, 2);
+ m_wavrecord = new WavOutFile("audio_recording.wav", 48000, 16, 2);
#endif
- WavRecordEnabled = true;
- } catch (std::runtime_error &) {
- m_wavrecord = NULL; // not needed, but what the heck. :)
- SysMessage("SPU2-X couldn't open file for recording: %s.\nRecording to wavfile disabled.", "audio_recording.wav");
- }
+ WavRecordEnabled = true;
+ }
+ catch (std::runtime_error&)
+ {
+ m_wavrecord = NULL; // not needed, but what the heck. :)
+ SysMessage("SPU2-X couldn't open file for recording: %s.\nRecording to wavfile disabled.", "audio_recording.wav");
+ }
}
void RecordStop()
{
- WavRecordEnabled = false;
- ScopedLock lock(WavRecordMutex);
- safe_delete(m_wavrecord);
+ WavRecordEnabled = false;
+ ScopedLock lock(WavRecordMutex);
+ safe_delete(m_wavrecord);
}
-void RecordWrite(const StereoOut16 &sample)
+void RecordWrite(const StereoOut16& sample)
{
- ScopedLock lock(WavRecordMutex);
- if (m_wavrecord == NULL)
- return;
- m_wavrecord->write((s16 *)&sample, 2);
+ ScopedLock lock(WavRecordMutex);
+ if (m_wavrecord == NULL)
+ return;
+ m_wavrecord->write((s16*)&sample, 2);
}
diff --git a/pcsx2/SPU2/Windows/CfgHelpers.cpp b/pcsx2/SPU2/Windows/CfgHelpers.cpp
index f225ad6fc3..c1af4f1e4d 100644
--- a/pcsx2/SPU2/Windows/CfgHelpers.cpp
+++ b/pcsx2/SPU2/Windows/CfgHelpers.cpp
@@ -20,29 +20,29 @@
extern uptr gsWindowHandle;
-void SysMessage(const char *fmt, ...)
+void SysMessage(const char* fmt, ...)
{
- va_list list;
- char tmp[512];
- wchar_t wtmp[512];
+ va_list list;
+ char tmp[512];
+ wchar_t wtmp[512];
- va_start(list, fmt);
- vsprintf_s(tmp, fmt, list);
- va_end(list);
- swprintf_s(wtmp, L"%S", tmp);
- MessageBox((!!gsWindowHandle) ? (HWND)gsWindowHandle : GetActiveWindow(), wtmp,
- L"SPU2-X System Message", MB_OK | MB_SETFOREGROUND);
+ va_start(list, fmt);
+ vsprintf_s(tmp, fmt, list);
+ va_end(list);
+ swprintf_s(wtmp, L"%S", tmp);
+ MessageBox((!!gsWindowHandle) ? (HWND)gsWindowHandle : GetActiveWindow(), wtmp,
+ L"SPU2-X System Message", MB_OK | MB_SETFOREGROUND);
}
-void SysMessage(const wchar_t *fmt, ...)
+void SysMessage(const wchar_t* fmt, ...)
{
- va_list list;
- va_start(list, fmt);
- wxString wtmp;
- wtmp.PrintfV(fmt, list);
- va_end(list);
- MessageBox((!!gsWindowHandle) ? (HWND)gsWindowHandle : GetActiveWindow(), wtmp,
- L"SPU2-X System Message", MB_OK | MB_SETFOREGROUND);
+ va_list list;
+ va_start(list, fmt);
+ wxString wtmp;
+ wtmp.PrintfV(fmt, list);
+ va_end(list);
+ MessageBox((!!gsWindowHandle) ? (HWND)gsWindowHandle : GetActiveWindow(), wtmp,
+ L"SPU2-X System Message", MB_OK | MB_SETFOREGROUND);
}
//////
@@ -51,9 +51,9 @@ void SysMessage(const wchar_t *fmt, ...)
static wxString CfgFile(L"inis/SPU2.ini");
-void CfgSetSettingsDir(const char *dir)
+void CfgSetSettingsDir(const char* dir)
{
- CfgFile = Path::Combine((dir == NULL) ? wxString(L"inis") : wxString::FromUTF8(dir), L"SPU2.ini");
+ CfgFile = Path::Combine((dir == NULL) ? wxString(L"inis") : wxString::FromUTF8(dir), L"SPU2.ini");
}
@@ -72,24 +72,24 @@ void CfgSetSettingsDir(const char *dir)
\*_____________________________________________*/
-void CfgWriteBool(const TCHAR *Section, const TCHAR *Name, bool Value)
+void CfgWriteBool(const TCHAR* Section, const TCHAR* Name, bool Value)
{
- const TCHAR *Data = Value ? L"TRUE" : L"FALSE";
- WritePrivateProfileString(Section, Name, Data, CfgFile);
+ const TCHAR* Data = Value ? L"TRUE" : L"FALSE";
+ WritePrivateProfileString(Section, Name, Data, CfgFile);
}
-void CfgWriteInt(const TCHAR *Section, const TCHAR *Name, int Value)
+void CfgWriteInt(const TCHAR* Section, const TCHAR* Name, int Value)
{
- TCHAR Data[32];
- _itow(Value, Data, 10);
- WritePrivateProfileString(Section, Name, Data, CfgFile);
+ TCHAR Data[32];
+ _itow(Value, Data, 10);
+ WritePrivateProfileString(Section, Name, Data, CfgFile);
}
-void CfgWriteFloat(const TCHAR *Section, const TCHAR *Name, float Value)
+void CfgWriteFloat(const TCHAR* Section, const TCHAR* Name, float Value)
{
- TCHAR Data[32];
- _swprintf(Data, L"%f", Value);
- WritePrivateProfileString(Section, Name, Data, CfgFile);
+ TCHAR Data[32];
+ _swprintf(Data, L"%f", Value);
+ WritePrivateProfileString(Section, Name, Data, CfgFile);
}
/*void CfgWriteStr(const TCHAR* Section, const TCHAR* Name, const TCHAR *Data)
@@ -97,99 +97,104 @@ void CfgWriteFloat(const TCHAR *Section, const TCHAR *Name, float Value)
WritePrivateProfileString( Section, Name, Data, CfgFile );
}*/
-void CfgWriteStr(const TCHAR *Section, const TCHAR *Name, const wxString &Data)
+void CfgWriteStr(const TCHAR* Section, const TCHAR* Name, const wxString& Data)
{
- WritePrivateProfileString(Section, Name, Data, CfgFile);
+ WritePrivateProfileString(Section, Name, Data, CfgFile);
}
/*****************************************************************************/
-bool CfgReadBool(const TCHAR *Section, const TCHAR *Name, bool Default)
+bool CfgReadBool(const TCHAR* Section, const TCHAR* Name, bool Default)
{
- TCHAR Data[255] = {0};
+ TCHAR Data[255] = {0};
- GetPrivateProfileString(Section, Name, L"", Data, 255, CfgFile);
- Data[254] = 0;
- if (wcslen(Data) == 0) {
- CfgWriteBool(Section, Name, Default);
- return Default;
- }
+ GetPrivateProfileString(Section, Name, L"", Data, 255, CfgFile);
+ Data[254] = 0;
+ if (wcslen(Data) == 0)
+ {
+ CfgWriteBool(Section, Name, Default);
+ return Default;
+ }
- if (wcscmp(Data, L"1") == 0)
- return true;
- if (wcscmp(Data, L"Y") == 0)
- return true;
- if (wcscmp(Data, L"T") == 0)
- return true;
- if (wcscmp(Data, L"YES") == 0)
- return true;
- if (wcscmp(Data, L"TRUE") == 0)
- return true;
- return false;
+ if (wcscmp(Data, L"1") == 0)
+ return true;
+ if (wcscmp(Data, L"Y") == 0)
+ return true;
+ if (wcscmp(Data, L"T") == 0)
+ return true;
+ if (wcscmp(Data, L"YES") == 0)
+ return true;
+ if (wcscmp(Data, L"TRUE") == 0)
+ return true;
+ return false;
}
-int CfgReadInt(const TCHAR *Section, const TCHAR *Name, int Default)
+int CfgReadInt(const TCHAR* Section, const TCHAR* Name, int Default)
{
- TCHAR Data[255] = {0};
- GetPrivateProfileString(Section, Name, L"", Data, 255, CfgFile);
- Data[254] = 0;
+ TCHAR Data[255] = {0};
+ GetPrivateProfileString(Section, Name, L"", Data, 255, CfgFile);
+ Data[254] = 0;
- if (wcslen(Data) == 0) {
- CfgWriteInt(Section, Name, Default);
- return Default;
- }
+ if (wcslen(Data) == 0)
+ {
+ CfgWriteInt(Section, Name, Default);
+ return Default;
+ }
- return _wtoi(Data);
+ return _wtoi(Data);
}
-float CfgReadFloat(const TCHAR *Section, const TCHAR *Name, float Default)
+float CfgReadFloat(const TCHAR* Section, const TCHAR* Name, float Default)
{
- TCHAR Data[255] = {0};
- GetPrivateProfileString(Section, Name, L"", Data, 255, CfgFile);
- Data[254] = 0;
+ TCHAR Data[255] = {0};
+ GetPrivateProfileString(Section, Name, L"", Data, 255, CfgFile);
+ Data[254] = 0;
- if (wcslen(Data) == 0) {
- CfgWriteFloat(Section, Name, Default);
- return Default;
- }
+ if (wcslen(Data) == 0)
+ {
+ CfgWriteFloat(Section, Name, Default);
+ return Default;
+ }
- return (float)_wtof(Data);
+ return (float)_wtof(Data);
}
-void CfgReadStr(const TCHAR *Section, const TCHAR *Name, TCHAR *Data, int DataSize, const TCHAR *Default)
+void CfgReadStr(const TCHAR* Section, const TCHAR* Name, TCHAR* Data, int DataSize, const TCHAR* Default)
{
- GetPrivateProfileString(Section, Name, L"", Data, DataSize, CfgFile);
+ GetPrivateProfileString(Section, Name, L"", Data, DataSize, CfgFile);
- if (wcslen(Data) == 0) {
- swprintf_s(Data, DataSize, L"%s", Default);
- CfgWriteStr(Section, Name, Data);
- }
+ if (wcslen(Data) == 0)
+ {
+ swprintf_s(Data, DataSize, L"%s", Default);
+ CfgWriteStr(Section, Name, Data);
+ }
}
-void CfgReadStr(const TCHAR *Section, const TCHAR *Name, wxString &Data, const TCHAR *Default)
+void CfgReadStr(const TCHAR* Section, const TCHAR* Name, wxString& Data, const TCHAR* Default)
{
- wchar_t workspace[512];
- GetPrivateProfileString(Section, Name, L"", workspace, ArraySize(workspace), CfgFile);
+ wchar_t workspace[512];
+ GetPrivateProfileString(Section, Name, L"", workspace, ArraySize(workspace), CfgFile);
- Data = workspace;
+ Data = workspace;
- if (Data.empty()) {
- Data = Default;
- CfgWriteStr(Section, Name, Default);
- }
+ if (Data.empty())
+ {
+ Data = Default;
+ CfgWriteStr(Section, Name, Default);
+ }
}
// Tries to read the requested value.
// Returns FALSE if the value isn't found.
-bool CfgFindName(const TCHAR *Section, const TCHAR *Name)
+bool CfgFindName(const TCHAR* Section, const TCHAR* Name)
{
- // Only load 24 characters. No need to load more.
- TCHAR Data[24] = {0};
- GetPrivateProfileString(Section, Name, L"", Data, 24, CfgFile);
- Data[23] = 0;
+ // Only load 24 characters. No need to load more.
+ TCHAR Data[24] = {0};
+ GetPrivateProfileString(Section, Name, L"", Data, 24, CfgFile);
+ Data[23] = 0;
- if (wcslen(Data) == 0)
- return false;
- return true;
+ if (wcslen(Data) == 0)
+ return false;
+ return true;
}
diff --git a/pcsx2/SPU2/Windows/Config.cpp b/pcsx2/SPU2/Windows/Config.cpp
index 8dd67983b9..693ae859c4 100644
--- a/pcsx2/SPU2/Windows/Config.cpp
+++ b/pcsx2/SPU2/Windows/Config.cpp
@@ -83,344 +83,366 @@ int dplLevel = 0;
void ReadSettings()
{
- Interpolation = CfgReadInt(L"MIXING", L"Interpolation", 4);
+ Interpolation = CfgReadInt(L"MIXING", L"Interpolation", 4);
- EffectsDisabled = CfgReadBool(L"MIXING", L"Disable_Effects", false);
- postprocess_filter_dealias = CfgReadBool(L"MIXING", L"DealiasFilter", false);
- FinalVolume = ((float)CfgReadInt(L"MIXING", L"FinalVolume", 100)) / 100;
- if (FinalVolume > 1.0f)
- FinalVolume = 1.0f;
+ EffectsDisabled = CfgReadBool(L"MIXING", L"Disable_Effects", false);
+ postprocess_filter_dealias = CfgReadBool(L"MIXING", L"DealiasFilter", false);
+ FinalVolume = ((float)CfgReadInt(L"MIXING", L"FinalVolume", 100)) / 100;
+ if (FinalVolume > 1.0f)
+ FinalVolume = 1.0f;
- AdvancedVolumeControl = CfgReadBool(L"MIXING", L"AdvancedVolumeControl", false);
- VolumeAdjustCdb = CfgReadFloat(L"MIXING", L"VolumeAdjustC(dB)", 0);
- VolumeAdjustFLdb = CfgReadFloat(L"MIXING", L"VolumeAdjustFL(dB)", 0);
- VolumeAdjustFRdb = CfgReadFloat(L"MIXING", L"VolumeAdjustFR(dB)", 0);
- VolumeAdjustBLdb = CfgReadFloat(L"MIXING", L"VolumeAdjustBL(dB)", 0);
- VolumeAdjustBRdb = CfgReadFloat(L"MIXING", L"VolumeAdjustBR(dB)", 0);
- VolumeAdjustSLdb = CfgReadFloat(L"MIXING", L"VolumeAdjustSL(dB)", 0);
- VolumeAdjustSRdb = CfgReadFloat(L"MIXING", L"VolumeAdjustSR(dB)", 0);
- VolumeAdjustLFEdb = CfgReadFloat(L"MIXING", L"VolumeAdjustLFE(dB)", 0);
- delayCycles = CfgReadInt(L"DEBUG", L"DelayCycles", 4);
- VolumeAdjustC = powf(10, VolumeAdjustCdb / 10);
- VolumeAdjustFL = powf(10, VolumeAdjustFLdb / 10);
- VolumeAdjustFR = powf(10, VolumeAdjustFRdb / 10);
- VolumeAdjustBL = powf(10, VolumeAdjustBLdb / 10);
- VolumeAdjustBR = powf(10, VolumeAdjustBRdb / 10);
- VolumeAdjustSL = powf(10, VolumeAdjustSLdb / 10);
- VolumeAdjustSR = powf(10, VolumeAdjustSRdb / 10);
- VolumeAdjustLFE = powf(10, VolumeAdjustLFEdb / 10);
+ AdvancedVolumeControl = CfgReadBool(L"MIXING", L"AdvancedVolumeControl", false);
+ VolumeAdjustCdb = CfgReadFloat(L"MIXING", L"VolumeAdjustC(dB)", 0);
+ VolumeAdjustFLdb = CfgReadFloat(L"MIXING", L"VolumeAdjustFL(dB)", 0);
+ VolumeAdjustFRdb = CfgReadFloat(L"MIXING", L"VolumeAdjustFR(dB)", 0);
+ VolumeAdjustBLdb = CfgReadFloat(L"MIXING", L"VolumeAdjustBL(dB)", 0);
+ VolumeAdjustBRdb = CfgReadFloat(L"MIXING", L"VolumeAdjustBR(dB)", 0);
+ VolumeAdjustSLdb = CfgReadFloat(L"MIXING", L"VolumeAdjustSL(dB)", 0);
+ VolumeAdjustSRdb = CfgReadFloat(L"MIXING", L"VolumeAdjustSR(dB)", 0);
+ VolumeAdjustLFEdb = CfgReadFloat(L"MIXING", L"VolumeAdjustLFE(dB)", 0);
+ delayCycles = CfgReadInt(L"DEBUG", L"DelayCycles", 4);
+ VolumeAdjustC = powf(10, VolumeAdjustCdb / 10);
+ VolumeAdjustFL = powf(10, VolumeAdjustFLdb / 10);
+ VolumeAdjustFR = powf(10, VolumeAdjustFRdb / 10);
+ VolumeAdjustBL = powf(10, VolumeAdjustBLdb / 10);
+ VolumeAdjustBR = powf(10, VolumeAdjustBRdb / 10);
+ VolumeAdjustSL = powf(10, VolumeAdjustSLdb / 10);
+ VolumeAdjustSR = powf(10, VolumeAdjustSRdb / 10);
+ VolumeAdjustLFE = powf(10, VolumeAdjustLFEdb / 10);
- SynchMode = CfgReadInt(L"OUTPUT", L"Synch_Mode", 0);
- numSpeakers = CfgReadInt(L"OUTPUT", L"SpeakerConfiguration", 0);
- dplLevel = CfgReadInt(L"OUTPUT", L"DplDecodingLevel", 0);
- SndOutLatencyMS = CfgReadInt(L"OUTPUT", L"Latency", 100);
+ SynchMode = CfgReadInt(L"OUTPUT", L"Synch_Mode", 0);
+ numSpeakers = CfgReadInt(L"OUTPUT", L"SpeakerConfiguration", 0);
+ dplLevel = CfgReadInt(L"OUTPUT", L"DplDecodingLevel", 0);
+ SndOutLatencyMS = CfgReadInt(L"OUTPUT", L"Latency", 100);
- if ((SynchMode == 0) && (SndOutLatencyMS < LATENCY_MIN_TS)) // can't use low-latency with timestretcher atm
- SndOutLatencyMS = LATENCY_MIN_TS;
- else if (SndOutLatencyMS < LATENCY_MIN)
- SndOutLatencyMS = LATENCY_MIN;
+ if ((SynchMode == 0) && (SndOutLatencyMS < LATENCY_MIN_TS)) // can't use low-latency with timestretcher atm
+ SndOutLatencyMS = LATENCY_MIN_TS;
+ else if (SndOutLatencyMS < LATENCY_MIN)
+ SndOutLatencyMS = LATENCY_MIN;
- wchar_t omodid[128];
+ wchar_t omodid[128];
- // portaudio occasionally has issues selecting the proper default audio device.
- // let's use xaudio2 until this is sorted (rama)
+ // portaudio occasionally has issues selecting the proper default audio device.
+ // let's use xaudio2 until this is sorted (rama)
- // CfgReadStr(L"OUTPUT", L"Output_Module", omodid, 127, PortaudioOut->GetIdent());
- CfgReadStr(L"OUTPUT", L"Output_Module", omodid, 127, XAudio2Out->GetIdent());
+ // CfgReadStr(L"OUTPUT", L"Output_Module", omodid, 127, PortaudioOut->GetIdent());
+ CfgReadStr(L"OUTPUT", L"Output_Module", omodid, 127, XAudio2Out->GetIdent());
- // find the driver index of this module:
- OutputModule = FindOutputModuleById(omodid);
+ // find the driver index of this module:
+ OutputModule = FindOutputModuleById(omodid);
- CfgReadStr(L"DSP PLUGIN", L"Filename", dspPlugin, 255, L"");
- dspPluginModule = CfgReadInt(L"DSP PLUGIN", L"ModuleNum", 0);
- dspPluginEnabled = CfgReadBool(L"DSP PLUGIN", L"Enabled", false);
+ CfgReadStr(L"DSP PLUGIN", L"Filename", dspPlugin, 255, L"");
+ dspPluginModule = CfgReadInt(L"DSP PLUGIN", L"ModuleNum", 0);
+ dspPluginEnabled = CfgReadBool(L"DSP PLUGIN", L"Enabled", false);
- // Read DSOUNDOUT and WAVEOUT configs:
- CfgReadStr(L"WAVEOUT", L"Device", Config_WaveOut.Device, L"default");
- Config_WaveOut.NumBuffers = CfgReadInt(L"WAVEOUT", L"Buffer_Count", 4);
+ // Read DSOUNDOUT and WAVEOUT configs:
+ CfgReadStr(L"WAVEOUT", L"Device", Config_WaveOut.Device, L"default");
+ Config_WaveOut.NumBuffers = CfgReadInt(L"WAVEOUT", L"Buffer_Count", 4);
- DSoundOut->ReadSettings();
- PortaudioOut->ReadSettings();
+ DSoundOut->ReadSettings();
+ PortaudioOut->ReadSettings();
- SoundtouchCfg::ReadSettings();
- DebugConfig::ReadSettings();
+ SoundtouchCfg::ReadSettings();
+ DebugConfig::ReadSettings();
- // Sanity Checks
- // -------------
+ // Sanity Checks
+ // -------------
- Clampify(SndOutLatencyMS, LATENCY_MIN, LATENCY_MAX);
+ Clampify(SndOutLatencyMS, LATENCY_MIN, LATENCY_MAX);
- if (mods[OutputModule] == NULL) {
- // Unsupported or legacy module.
- fwprintf(stderr, L"* SPU2-X: Unknown output module '%s' specified in configuration file.\n", omodid);
- fprintf(stderr, "* SPU2-X: Defaulting to DirectSound (%S).\n", DSoundOut->GetIdent());
- OutputModule = FindOutputModuleById(DSoundOut->GetIdent());
- }
+ if (mods[OutputModule] == NULL)
+ {
+ // Unsupported or legacy module.
+ fwprintf(stderr, L"* SPU2-X: Unknown output module '%s' specified in configuration file.\n", omodid);
+ fprintf(stderr, "* SPU2-X: Defaulting to DirectSound (%S).\n", DSoundOut->GetIdent());
+ OutputModule = FindOutputModuleById(DSoundOut->GetIdent());
+ }
}
/*****************************************************************************/
void WriteSettings()
{
- CfgWriteInt(L"MIXING", L"Interpolation", Interpolation);
+ CfgWriteInt(L"MIXING", L"Interpolation", Interpolation);
- CfgWriteBool(L"MIXING", L"Disable_Effects", EffectsDisabled);
- CfgWriteBool(L"MIXING", L"DealiasFilter", postprocess_filter_dealias);
- CfgWriteInt(L"MIXING", L"FinalVolume", (int)(FinalVolume * 100 + 0.5f));
+ CfgWriteBool(L"MIXING", L"Disable_Effects", EffectsDisabled);
+ CfgWriteBool(L"MIXING", L"DealiasFilter", postprocess_filter_dealias);
+ CfgWriteInt(L"MIXING", L"FinalVolume", (int)(FinalVolume * 100 + 0.5f));
- CfgWriteBool(L"MIXING", L"AdvancedVolumeControl", AdvancedVolumeControl);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustC(dB)", VolumeAdjustCdb);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustFL(dB)", VolumeAdjustFLdb);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustFR(dB)", VolumeAdjustFRdb);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustBL(dB)", VolumeAdjustBLdb);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustBR(dB)", VolumeAdjustBRdb);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustSL(dB)", VolumeAdjustSLdb);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustSR(dB)", VolumeAdjustSRdb);
- CfgWriteFloat(L"MIXING", L"VolumeAdjustLFE(dB)", VolumeAdjustLFEdb);
+ CfgWriteBool(L"MIXING", L"AdvancedVolumeControl", AdvancedVolumeControl);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustC(dB)", VolumeAdjustCdb);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustFL(dB)", VolumeAdjustFLdb);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustFR(dB)", VolumeAdjustFRdb);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustBL(dB)", VolumeAdjustBLdb);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustBR(dB)", VolumeAdjustBRdb);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustSL(dB)", VolumeAdjustSLdb);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustSR(dB)", VolumeAdjustSRdb);
+ CfgWriteFloat(L"MIXING", L"VolumeAdjustLFE(dB)", VolumeAdjustLFEdb);
- CfgWriteStr(L"OUTPUT", L"Output_Module", mods[OutputModule]->GetIdent());
- CfgWriteInt(L"OUTPUT", L"Latency", SndOutLatencyMS);
- CfgWriteInt(L"OUTPUT", L"Synch_Mode", SynchMode);
- CfgWriteInt(L"OUTPUT", L"SpeakerConfiguration", numSpeakers);
- CfgWriteInt(L"OUTPUT", L"DplDecodingLevel", dplLevel);
- CfgWriteInt(L"DEBUG", L"DelayCycles", delayCycles);
+ CfgWriteStr(L"OUTPUT", L"Output_Module", mods[OutputModule]->GetIdent());
+ CfgWriteInt(L"OUTPUT", L"Latency", SndOutLatencyMS);
+ CfgWriteInt(L"OUTPUT", L"Synch_Mode", SynchMode);
+ CfgWriteInt(L"OUTPUT", L"SpeakerConfiguration", numSpeakers);
+ CfgWriteInt(L"OUTPUT", L"DplDecodingLevel", dplLevel);
+ CfgWriteInt(L"DEBUG", L"DelayCycles", delayCycles);
- if (Config_WaveOut.Device.empty())
- Config_WaveOut.Device = L"default";
- CfgWriteStr(L"WAVEOUT", L"Device", Config_WaveOut.Device);
- CfgWriteInt(L"WAVEOUT", L"Buffer_Count", Config_WaveOut.NumBuffers);
+ if (Config_WaveOut.Device.empty())
+ Config_WaveOut.Device = L"default";
+ CfgWriteStr(L"WAVEOUT", L"Device", Config_WaveOut.Device);
+ CfgWriteInt(L"WAVEOUT", L"Buffer_Count", Config_WaveOut.NumBuffers);
- CfgWriteStr(L"DSP PLUGIN", L"Filename", dspPlugin);
- CfgWriteInt(L"DSP PLUGIN", L"ModuleNum", dspPluginModule);
- CfgWriteBool(L"DSP PLUGIN", L"Enabled", dspPluginEnabled);
+ CfgWriteStr(L"DSP PLUGIN", L"Filename", dspPlugin);
+ CfgWriteInt(L"DSP PLUGIN", L"ModuleNum", dspPluginModule);
+ CfgWriteBool(L"DSP PLUGIN", L"Enabled", dspPluginEnabled);
- PortaudioOut->WriteSettings();
- DSoundOut->WriteSettings();
- SoundtouchCfg::WriteSettings();
- DebugConfig::WriteSettings();
+ PortaudioOut->WriteSettings();
+ DSoundOut->WriteSettings();
+ SoundtouchCfg::WriteSettings();
+ DebugConfig::WriteSettings();
}
void CheckOutputModule(HWND window)
{
- OutputModule = SendMessage(GetDlgItem(window, IDC_OUTPUT), CB_GETCURSEL, 0, 0);
- const bool IsConfigurable =
- mods[OutputModule] == PortaudioOut ||
- mods[OutputModule] == WaveOut ||
- mods[OutputModule] == DSoundOut;
+ OutputModule = SendMessage(GetDlgItem(window, IDC_OUTPUT), CB_GETCURSEL, 0, 0);
+ const bool IsConfigurable =
+ mods[OutputModule] == PortaudioOut ||
+ mods[OutputModule] == WaveOut ||
+ mods[OutputModule] == DSoundOut;
- const bool AudioExpansion =
- mods[OutputModule] == XAudio2Out ||
- mods[OutputModule] == PortaudioOut;
+ const bool AudioExpansion =
+ mods[OutputModule] == XAudio2Out ||
+ mods[OutputModule] == PortaudioOut;
- EnableWindow(GetDlgItem(window, IDC_OUTCONF), IsConfigurable);
- EnableWindow(GetDlgItem(window, IDC_SPEAKERS), AudioExpansion);
- EnableWindow(GetDlgItem(window, IDC_SPEAKERS_TEXT), AudioExpansion);
+ EnableWindow(GetDlgItem(window, IDC_OUTCONF), IsConfigurable);
+ EnableWindow(GetDlgItem(window, IDC_SPEAKERS), AudioExpansion);
+ EnableWindow(GetDlgItem(window, IDC_SPEAKERS_TEXT), AudioExpansion);
}
BOOL CALLBACK ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- int wmId, wmEvent;
- wchar_t temp[384] = {0};
+ int wmId, wmEvent;
+ wchar_t temp[384] = {0};
- switch (uMsg) {
- case WM_PAINT:
- return FALSE;
+ switch (uMsg)
+ {
+ case WM_PAINT:
+ return FALSE;
- case WM_INITDIALOG: {
- SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_RESETCONTENT, 0, 0);
- SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_ADDSTRING, 0, (LPARAM)L"0 - Nearest (Fastest/bad quality)");
- SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_ADDSTRING, 0, (LPARAM)L"1 - Linear (Simple/okay sound)");
- SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_ADDSTRING, 0, (LPARAM)L"2 - Cubic (Artificial highs)");
- SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_ADDSTRING, 0, (LPARAM)L"3 - Hermite (Better highs)");
- SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_ADDSTRING, 0, (LPARAM)L"4 - Catmull-Rom (PS2-like/slow)");
- SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_SETCURSEL, Interpolation, 0);
+ case WM_INITDIALOG:
+ {
+ SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_RESETCONTENT, 0, 0);
+ SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_ADDSTRING, 0, (LPARAM)L"0 - Nearest (Fastest/bad quality)");
+ SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_ADDSTRING, 0, (LPARAM)L"1 - Linear (Simple/okay sound)");
+ SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_ADDSTRING, 0, (LPARAM)L"2 - Cubic (Artificial highs)");
+ SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_ADDSTRING, 0, (LPARAM)L"3 - Hermite (Better highs)");
+ SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_ADDSTRING, 0, (LPARAM)L"4 - Catmull-Rom (PS2-like/slow)");
+ SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_SETCURSEL, Interpolation, 0);
- SendDialogMsg(hWnd, IDC_SYNCHMODE, CB_RESETCONTENT, 0, 0);
- SendDialogMsg(hWnd, IDC_SYNCHMODE, CB_ADDSTRING, 0, (LPARAM)L"TimeStretch (Recommended)");
- SendDialogMsg(hWnd, IDC_SYNCHMODE, CB_ADDSTRING, 0, (LPARAM)L"Async Mix (Breaks some games!)");
- SendDialogMsg(hWnd, IDC_SYNCHMODE, CB_ADDSTRING, 0, (LPARAM)L"None (Audio can skip.)");
- SendDialogMsg(hWnd, IDC_SYNCHMODE, CB_SETCURSEL, SynchMode, 0);
+ SendDialogMsg(hWnd, IDC_SYNCHMODE, CB_RESETCONTENT, 0, 0);
+ SendDialogMsg(hWnd, IDC_SYNCHMODE, CB_ADDSTRING, 0, (LPARAM)L"TimeStretch (Recommended)");
+ SendDialogMsg(hWnd, IDC_SYNCHMODE, CB_ADDSTRING, 0, (LPARAM)L"Async Mix (Breaks some games!)");
+ SendDialogMsg(hWnd, IDC_SYNCHMODE, CB_ADDSTRING, 0, (LPARAM)L"None (Audio can skip.)");
+ SendDialogMsg(hWnd, IDC_SYNCHMODE, CB_SETCURSEL, SynchMode, 0);
- SendDialogMsg(hWnd, IDC_SPEAKERS, CB_RESETCONTENT, 0, 0);
- SendDialogMsg(hWnd, IDC_SPEAKERS, CB_ADDSTRING, 0, (LPARAM)L"Stereo (None, Default)");
- SendDialogMsg(hWnd, IDC_SPEAKERS, CB_ADDSTRING, 0, (LPARAM)L"Quadrafonic");
- SendDialogMsg(hWnd, IDC_SPEAKERS, CB_ADDSTRING, 0, (LPARAM)L"Surround 5.1");
- SendDialogMsg(hWnd, IDC_SPEAKERS, CB_ADDSTRING, 0, (LPARAM)L"Surround 7.1");
- SendDialogMsg(hWnd, IDC_SPEAKERS, CB_SETCURSEL, numSpeakers, 0);
+ SendDialogMsg(hWnd, IDC_SPEAKERS, CB_RESETCONTENT, 0, 0);
+ SendDialogMsg(hWnd, IDC_SPEAKERS, CB_ADDSTRING, 0, (LPARAM)L"Stereo (None, Default)");
+ SendDialogMsg(hWnd, IDC_SPEAKERS, CB_ADDSTRING, 0, (LPARAM)L"Quadrafonic");
+ SendDialogMsg(hWnd, IDC_SPEAKERS, CB_ADDSTRING, 0, (LPARAM)L"Surround 5.1");
+ SendDialogMsg(hWnd, IDC_SPEAKERS, CB_ADDSTRING, 0, (LPARAM)L"Surround 7.1");
+ SendDialogMsg(hWnd, IDC_SPEAKERS, CB_SETCURSEL, numSpeakers, 0);
- SendDialogMsg(hWnd, IDC_OUTPUT, CB_RESETCONTENT, 0, 0);
+ SendDialogMsg(hWnd, IDC_OUTPUT, CB_RESETCONTENT, 0, 0);
- int modidx = 0;
- while (mods[modidx] != NULL) {
- swprintf_s(temp, 72, L"%d - %s", modidx, mods[modidx]->GetLongName());
- SendDialogMsg(hWnd, IDC_OUTPUT, CB_ADDSTRING, 0, (LPARAM)temp);
- ++modidx;
- }
- SendDialogMsg(hWnd, IDC_OUTPUT, CB_SETCURSEL, OutputModule, 0);
+ int modidx = 0;
+ while (mods[modidx] != NULL)
+ {
+ swprintf_s(temp, 72, L"%d - %s", modidx, mods[modidx]->GetLongName());
+ SendDialogMsg(hWnd, IDC_OUTPUT, CB_ADDSTRING, 0, (LPARAM)temp);
+ ++modidx;
+ }
+ SendDialogMsg(hWnd, IDC_OUTPUT, CB_SETCURSEL, OutputModule, 0);
- double minlat = (SynchMode == 0) ? LATENCY_MIN_TS : LATENCY_MIN;
- int minexp = (int)(pow(minlat + 1, 1.0 / 3.0) * 128.0);
- int maxexp = (int)(pow((double)LATENCY_MAX + 2, 1.0 / 3.0) * 128.0);
- INIT_SLIDER(IDC_LATENCY_SLIDER, minexp, maxexp, 200, 42, 1);
+ double minlat = (SynchMode == 0) ? LATENCY_MIN_TS : LATENCY_MIN;
+ int minexp = (int)(pow(minlat + 1, 1.0 / 3.0) * 128.0);
+ int maxexp = (int)(pow((double)LATENCY_MAX + 2, 1.0 / 3.0) * 128.0);
+ INIT_SLIDER(IDC_LATENCY_SLIDER, minexp, maxexp, 200, 42, 1);
- SendDialogMsg(hWnd, IDC_LATENCY_SLIDER, TBM_SETPOS, TRUE, (int)((pow((double)SndOutLatencyMS, 1.0 / 3.0) * 128.0) + 1));
- swprintf_s(temp, L"%d ms (avg)", SndOutLatencyMS);
- SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp);
+ SendDialogMsg(hWnd, IDC_LATENCY_SLIDER, TBM_SETPOS, TRUE, (int)((pow((double)SndOutLatencyMS, 1.0 / 3.0) * 128.0) + 1));
+ swprintf_s(temp, L"%d ms (avg)", SndOutLatencyMS);
+ SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp);
- int configvol = (int)(FinalVolume * 100 + 0.5f);
- INIT_SLIDER(IDC_VOLUME_SLIDER, 0, 100, 10, 42, 1);
+ int configvol = (int)(FinalVolume * 100 + 0.5f);
+ INIT_SLIDER(IDC_VOLUME_SLIDER, 0, 100, 10, 42, 1);
- SendDialogMsg(hWnd, IDC_VOLUME_SLIDER, TBM_SETPOS, TRUE, configvol);
- swprintf_s(temp, L"%d%%", configvol);
- SetWindowText(GetDlgItem(hWnd, IDC_VOLUME_LABEL), temp);
+ SendDialogMsg(hWnd, IDC_VOLUME_SLIDER, TBM_SETPOS, TRUE, configvol);
+ swprintf_s(temp, L"%d%%", configvol);
+ SetWindowText(GetDlgItem(hWnd, IDC_VOLUME_LABEL), temp);
- CheckOutputModule(hWnd);
+ CheckOutputModule(hWnd);
- EnableWindow(GetDlgItem(hWnd, IDC_OPEN_CONFIG_SOUNDTOUCH), (SynchMode == 0));
- EnableWindow(GetDlgItem(hWnd, IDC_OPEN_CONFIG_DEBUG), DebugEnabled);
+ EnableWindow(GetDlgItem(hWnd, IDC_OPEN_CONFIG_SOUNDTOUCH), (SynchMode == 0));
+ EnableWindow(GetDlgItem(hWnd, IDC_OPEN_CONFIG_DEBUG), DebugEnabled);
- SET_CHECK(IDC_EFFECTS_DISABLE, EffectsDisabled);
- SET_CHECK(IDC_DEALIASFILTER, postprocess_filter_dealias);
- SET_CHECK(IDC_DEBUG_ENABLE, DebugEnabled);
- SET_CHECK(IDC_DSP_ENABLE, dspPluginEnabled);
- } break;
+ SET_CHECK(IDC_EFFECTS_DISABLE, EffectsDisabled);
+ SET_CHECK(IDC_DEALIASFILTER, postprocess_filter_dealias);
+ SET_CHECK(IDC_DEBUG_ENABLE, DebugEnabled);
+ SET_CHECK(IDC_DSP_ENABLE, dspPluginEnabled);
+ }
+ break;
- case WM_COMMAND:
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // Parse the menu selections:
- switch (wmId) {
- case IDOK: {
- double res = ((int)SendDialogMsg(hWnd, IDC_LATENCY_SLIDER, TBM_GETPOS, 0, 0)) / 128.0;
- SndOutLatencyMS = (int)pow(res, 3.0);
- Clampify(SndOutLatencyMS, LATENCY_MIN, LATENCY_MAX);
- FinalVolume = (float)(SendDialogMsg(hWnd, IDC_VOLUME_SLIDER, TBM_GETPOS, 0, 0)) / 100;
- Interpolation = (int)SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_GETCURSEL, 0, 0);
- OutputModule = (int)SendDialogMsg(hWnd, IDC_OUTPUT, CB_GETCURSEL, 0, 0);
- SynchMode = (int)SendDialogMsg(hWnd, IDC_SYNCHMODE, CB_GETCURSEL, 0, 0);
- numSpeakers = (int)SendDialogMsg(hWnd, IDC_SPEAKERS, CB_GETCURSEL, 0, 0);
+ case WM_COMMAND:
+ wmId = LOWORD(wParam);
+ wmEvent = HIWORD(wParam);
+ // Parse the menu selections:
+ switch (wmId)
+ {
+ case IDOK:
+ {
+ double res = ((int)SendDialogMsg(hWnd, IDC_LATENCY_SLIDER, TBM_GETPOS, 0, 0)) / 128.0;
+ SndOutLatencyMS = (int)pow(res, 3.0);
+ Clampify(SndOutLatencyMS, LATENCY_MIN, LATENCY_MAX);
+ FinalVolume = (float)(SendDialogMsg(hWnd, IDC_VOLUME_SLIDER, TBM_GETPOS, 0, 0)) / 100;
+ Interpolation = (int)SendDialogMsg(hWnd, IDC_INTERPOLATE, CB_GETCURSEL, 0, 0);
+ OutputModule = (int)SendDialogMsg(hWnd, IDC_OUTPUT, CB_GETCURSEL, 0, 0);
+ SynchMode = (int)SendDialogMsg(hWnd, IDC_SYNCHMODE, CB_GETCURSEL, 0, 0);
+ numSpeakers = (int)SendDialogMsg(hWnd, IDC_SPEAKERS, CB_GETCURSEL, 0, 0);
- WriteSettings();
- EndDialog(hWnd, 0);
- } break;
+ WriteSettings();
+ EndDialog(hWnd, 0);
+ }
+ break;
- case IDCANCEL:
- EndDialog(hWnd, 0);
- break;
+ case IDCANCEL:
+ EndDialog(hWnd, 0);
+ break;
- case IDC_OUTPUT:
- if (wmEvent == CBN_SELCHANGE) {
- CheckOutputModule(hWnd);
- }
- break;
+ case IDC_OUTPUT:
+ if (wmEvent == CBN_SELCHANGE)
+ {
+ CheckOutputModule(hWnd);
+ }
+ break;
- case IDC_OUTCONF: {
- const int module = (int)SendMessage(GetDlgItem(hWnd, IDC_OUTPUT), CB_GETCURSEL, 0, 0);
- if (mods[module] == NULL)
- break;
- mods[module]->Configure((uptr)hWnd);
- } break;
+ case IDC_OUTCONF:
+ {
+ const int module = (int)SendMessage(GetDlgItem(hWnd, IDC_OUTPUT), CB_GETCURSEL, 0, 0);
+ if (mods[module] == NULL)
+ break;
+ mods[module]->Configure((uptr)hWnd);
+ }
+ break;
- case IDC_OPEN_CONFIG_DEBUG: {
- // Quick Hack -- DebugEnabled is re-loaded with the DebugConfig's API,
- // so we need to override it here:
+ case IDC_OPEN_CONFIG_DEBUG:
+ {
+ // Quick Hack -- DebugEnabled is re-loaded with the DebugConfig's API,
+ // so we need to override it here:
- bool dbgtmp = DebugEnabled;
- DebugConfig::OpenDialog();
- DebugEnabled = dbgtmp;
- } break;
+ bool dbgtmp = DebugEnabled;
+ DebugConfig::OpenDialog();
+ DebugEnabled = dbgtmp;
+ }
+ break;
- case IDC_SYNCHMODE: {
- if (wmEvent == CBN_SELCHANGE) {
- int sMode = (int)SendDialogMsg(hWnd, IDC_SYNCHMODE, CB_GETCURSEL, 0, 0);
- double minlat = (sMode == 0) ? LATENCY_MIN_TS : LATENCY_MIN;
- int minexp = (int)(pow(minlat + 1, 1.0 / 3.0) * 128.0);
- int maxexp = (int)(pow((double)LATENCY_MAX + 2, 1.0 / 3.0) * 128.0);
- INIT_SLIDER(IDC_LATENCY_SLIDER, minexp, maxexp, 200, 42, 1);
+ case IDC_SYNCHMODE:
+ {
+ if (wmEvent == CBN_SELCHANGE)
+ {
+ int sMode = (int)SendDialogMsg(hWnd, IDC_SYNCHMODE, CB_GETCURSEL, 0, 0);
+ double minlat = (sMode == 0) ? LATENCY_MIN_TS : LATENCY_MIN;
+ int minexp = (int)(pow(minlat + 1, 1.0 / 3.0) * 128.0);
+ int maxexp = (int)(pow((double)LATENCY_MAX + 2, 1.0 / 3.0) * 128.0);
+ INIT_SLIDER(IDC_LATENCY_SLIDER, minexp, maxexp, 200, 42, 1);
- int curpos = (int)SendMessage(GetDlgItem(hWnd, IDC_LATENCY_SLIDER), TBM_GETPOS, 0, 0);
- double res = pow(curpos / 128.0, 3.0);
- curpos = (int)res;
- swprintf_s(temp, L"%d ms (avg)", curpos);
- SetDlgItemText(hWnd, IDC_LATENCY_LABEL, temp);
- bool soundtouch = sMode == 0;
- EnableWindow(GetDlgItem(hWnd, IDC_OPEN_CONFIG_SOUNDTOUCH), soundtouch);
- }
- } break;
+ int curpos = (int)SendMessage(GetDlgItem(hWnd, IDC_LATENCY_SLIDER), TBM_GETPOS, 0, 0);
+ double res = pow(curpos / 128.0, 3.0);
+ curpos = (int)res;
+ swprintf_s(temp, L"%d ms (avg)", curpos);
+ SetDlgItemText(hWnd, IDC_LATENCY_LABEL, temp);
+ bool soundtouch = sMode == 0;
+ EnableWindow(GetDlgItem(hWnd, IDC_OPEN_CONFIG_SOUNDTOUCH), soundtouch);
+ }
+ }
+ break;
- case IDC_OPEN_CONFIG_SOUNDTOUCH:
- SoundtouchCfg::OpenDialog(hWnd);
- break;
+ case IDC_OPEN_CONFIG_SOUNDTOUCH:
+ SoundtouchCfg::OpenDialog(hWnd);
+ break;
- HANDLE_CHECK(IDC_EFFECTS_DISABLE, EffectsDisabled);
- HANDLE_CHECK(IDC_DEALIASFILTER, postprocess_filter_dealias);
- HANDLE_CHECK(IDC_DSP_ENABLE, dspPluginEnabled);
- HANDLE_CHECKNB(IDC_DEBUG_ENABLE, DebugEnabled);
- DebugConfig::EnableControls(hWnd);
- EnableWindow(GetDlgItem(hWnd, IDC_OPEN_CONFIG_DEBUG), DebugEnabled);
- break;
+ HANDLE_CHECK(IDC_EFFECTS_DISABLE, EffectsDisabled);
+ HANDLE_CHECK(IDC_DEALIASFILTER, postprocess_filter_dealias);
+ HANDLE_CHECK(IDC_DSP_ENABLE, dspPluginEnabled);
+ HANDLE_CHECKNB(IDC_DEBUG_ENABLE, DebugEnabled);
+ DebugConfig::EnableControls(hWnd);
+ EnableWindow(GetDlgItem(hWnd, IDC_OPEN_CONFIG_DEBUG), DebugEnabled);
+ break;
- default:
- return FALSE;
- }
- break;
+ default:
+ return FALSE;
+ }
+ break;
- case WM_HSCROLL: {
- wmEvent = LOWORD(wParam);
- HWND hwndDlg = (HWND)lParam;
+ case WM_HSCROLL:
+ {
+ wmEvent = LOWORD(wParam);
+ HWND hwndDlg = (HWND)lParam;
- int curpos = HIWORD(wParam);
+ int curpos = HIWORD(wParam);
- switch (wmEvent) {
- case TB_LINEUP:
- case TB_LINEDOWN:
- case TB_PAGEUP:
- case TB_PAGEDOWN:
- case TB_TOP:
- case TB_BOTTOM:
- curpos = (int)SendMessage(hwndDlg, TBM_GETPOS, 0, 0);
+ switch (wmEvent)
+ {
+ case TB_LINEUP:
+ case TB_LINEDOWN:
+ case TB_PAGEUP:
+ case TB_PAGEDOWN:
+ case TB_TOP:
+ case TB_BOTTOM:
+ curpos = (int)SendMessage(hwndDlg, TBM_GETPOS, 0, 0);
- case TB_THUMBPOSITION:
- case TB_THUMBTRACK:
- Clampify(curpos,
- (int)SendMessage(hwndDlg, TBM_GETRANGEMIN, 0, 0),
- (int)SendMessage(hwndDlg, TBM_GETRANGEMAX, 0, 0));
+ case TB_THUMBPOSITION:
+ case TB_THUMBTRACK:
+ Clampify(curpos,
+ (int)SendMessage(hwndDlg, TBM_GETRANGEMIN, 0, 0),
+ (int)SendMessage(hwndDlg, TBM_GETRANGEMAX, 0, 0));
- SendMessage((HWND)lParam, TBM_SETPOS, TRUE, curpos);
+ SendMessage((HWND)lParam, TBM_SETPOS, TRUE, curpos);
- if (hwndDlg == GetDlgItem(hWnd, IDC_LATENCY_SLIDER)) {
- double res = pow(curpos / 128.0, 3.0);
- curpos = (int)res;
- swprintf_s(temp, L"%d ms (avg)", curpos);
- SetDlgItemText(hWnd, IDC_LATENCY_LABEL, temp);
- }
+ if (hwndDlg == GetDlgItem(hWnd, IDC_LATENCY_SLIDER))
+ {
+ double res = pow(curpos / 128.0, 3.0);
+ curpos = (int)res;
+ swprintf_s(temp, L"%d ms (avg)", curpos);
+ SetDlgItemText(hWnd, IDC_LATENCY_LABEL, temp);
+ }
- if (hwndDlg == GetDlgItem(hWnd, IDC_VOLUME_SLIDER)) {
- swprintf_s(temp, L"%d%%", curpos);
- SetDlgItemText(hWnd, IDC_VOLUME_LABEL, temp);
- }
- break;
+ if (hwndDlg == GetDlgItem(hWnd, IDC_VOLUME_SLIDER))
+ {
+ swprintf_s(temp, L"%d%%", curpos);
+ SetDlgItemText(hWnd, IDC_VOLUME_LABEL, temp);
+ }
+ break;
- default:
- return FALSE;
- }
- } break;
+ default:
+ return FALSE;
+ }
+ }
+ break;
- default:
- return FALSE;
- }
- return TRUE;
+ default:
+ return FALSE;
+ }
+ return TRUE;
}
void configure()
{
- INT_PTR ret;
- ReadSettings();
- ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_CONFIG), GetActiveWindow(), (DLGPROC)ConfigProc, 1);
- if (ret == -1) {
- MessageBox(GetActiveWindow(), L"Error Opening the config dialog.", L"OMG ERROR!", MB_OK | MB_SETFOREGROUND);
- return;
- }
- ReadSettings();
+ INT_PTR ret;
+ ReadSettings();
+ ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_CONFIG), GetActiveWindow(), (DLGPROC)ConfigProc, 1);
+ if (ret == -1)
+ {
+ MessageBox(GetActiveWindow(), L"Error Opening the config dialog.", L"OMG ERROR!", MB_OK | MB_SETFOREGROUND);
+ return;
+ }
+ ReadSettings();
}
diff --git a/pcsx2/SPU2/Windows/ConfigDebug.cpp b/pcsx2/SPU2/Windows/ConfigDebug.cpp
index 3841c9853a..97530317c6 100644
--- a/pcsx2/SPU2/Windows/ConfigDebug.cpp
+++ b/pcsx2/SPU2/Windows/ConfigDebug.cpp
@@ -55,213 +55,219 @@ wxString CoresDumpFileName;
wxString MemDumpFileName;
wxString RegDumpFileName;
-void CfgSetLogDir(const char *dir)
+void CfgSetLogDir(const char* dir)
{
- LogsFolder = (dir == NULL) ? wxString(L"logs") : wxString(dir, wxConvFile);
- DumpsFolder = (dir == NULL) ? wxString(L"logs") : wxString(dir, wxConvFile);
- LogLocationSetByPcsx2 = (dir != NULL);
+ LogsFolder = (dir == NULL) ? wxString(L"logs") : wxString(dir, wxConvFile);
+ DumpsFolder = (dir == NULL) ? wxString(L"logs") : wxString(dir, wxConvFile);
+ LogLocationSetByPcsx2 = (dir != NULL);
}
-FILE *OpenBinaryLog(const wxString &logfile)
+FILE* OpenBinaryLog(const wxString& logfile)
{
- return wxFopen(Path::Combine(LogsFolder, logfile), L"wb");
+ return wxFopen(Path::Combine(LogsFolder, logfile), L"wb");
}
-FILE *OpenLog(const wxString &logfile)
+FILE* OpenLog(const wxString& logfile)
{
- return wxFopen(Path::Combine(LogsFolder, logfile), L"w");
+ return wxFopen(Path::Combine(LogsFolder, logfile), L"w");
}
-FILE *OpenDump(const wxString &logfile)
+FILE* OpenDump(const wxString& logfile)
{
- return wxFopen(Path::Combine(DumpsFolder, logfile), L"w");
+ return wxFopen(Path::Combine(DumpsFolder, logfile), L"w");
}
namespace DebugConfig
{
-static const wxChar *Section = L"DEBUG";
+ static const wxChar* Section = L"DEBUG";
-void ReadSettings()
-{
- DebugEnabled = CfgReadBool(Section, L"Global_Enable", 0);
- _MsgToConsole = CfgReadBool(Section, L"Show_Messages", 0);
- _MsgKeyOnOff = CfgReadBool(Section, L"Show_Messages_Key_On_Off", 0);
- _MsgVoiceOff = CfgReadBool(Section, L"Show_Messages_Voice_Off", 0);
- _MsgDMA = CfgReadBool(Section, L"Show_Messages_DMA_Transfer", 0);
- _MsgAutoDMA = CfgReadBool(Section, L"Show_Messages_AutoDMA", 0);
- _MsgOverruns = CfgReadBool(Section, L"Show_Messages_Overruns", 0);
- _MsgCache = CfgReadBool(Section, L"Show_Messages_CacheStats", 0);
+ void ReadSettings()
+ {
+ DebugEnabled = CfgReadBool(Section, L"Global_Enable", 0);
+ _MsgToConsole = CfgReadBool(Section, L"Show_Messages", 0);
+ _MsgKeyOnOff = CfgReadBool(Section, L"Show_Messages_Key_On_Off", 0);
+ _MsgVoiceOff = CfgReadBool(Section, L"Show_Messages_Voice_Off", 0);
+ _MsgDMA = CfgReadBool(Section, L"Show_Messages_DMA_Transfer", 0);
+ _MsgAutoDMA = CfgReadBool(Section, L"Show_Messages_AutoDMA", 0);
+ _MsgOverruns = CfgReadBool(Section, L"Show_Messages_Overruns", 0);
+ _MsgCache = CfgReadBool(Section, L"Show_Messages_CacheStats", 0);
- _AccessLog = CfgReadBool(Section, L"Log_Register_Access", 0);
- _DMALog = CfgReadBool(Section, L"Log_DMA_Transfers", 0);
- _WaveLog = CfgReadBool(Section, L"Log_WAVE_Output", 0);
+ _AccessLog = CfgReadBool(Section, L"Log_Register_Access", 0);
+ _DMALog = CfgReadBool(Section, L"Log_DMA_Transfers", 0);
+ _WaveLog = CfgReadBool(Section, L"Log_WAVE_Output", 0);
- _CoresDump = CfgReadBool(Section, L"Dump_Info", 0);
- _MemDump = CfgReadBool(Section, L"Dump_Memory", 0);
- _RegDump = CfgReadBool(Section, L"Dump_Regs", 0);
+ _CoresDump = CfgReadBool(Section, L"Dump_Info", 0);
+ _MemDump = CfgReadBool(Section, L"Dump_Memory", 0);
+ _RegDump = CfgReadBool(Section, L"Dump_Regs", 0);
- _visual_debug_enabled = CfgReadBool(Section, L"Visual_Debug_Enabled", 0);
+ _visual_debug_enabled = CfgReadBool(Section, L"Visual_Debug_Enabled", 0);
- CfgReadStr(Section, L"Logs_Folder", CfgLogsFolder, L"logs");
- CfgReadStr(Section, L"Dumps_Folder", CfgDumpsFolder, L"logs");
+ CfgReadStr(Section, L"Logs_Folder", CfgLogsFolder, L"logs");
+ CfgReadStr(Section, L"Dumps_Folder", CfgDumpsFolder, L"logs");
- CfgReadStr(Section, L"Access_Log_Filename", AccessLogFileName, L"SPU2Log.txt");
- CfgReadStr(Section, L"DMA4Log_Filename", DMA4LogFileName, L"SPU2dma4.dat");
- CfgReadStr(Section, L"DMA7Log_Filename", DMA7LogFileName, L"SPU2dma7.dat");
+ CfgReadStr(Section, L"Access_Log_Filename", AccessLogFileName, L"SPU2Log.txt");
+ CfgReadStr(Section, L"DMA4Log_Filename", DMA4LogFileName, L"SPU2dma4.dat");
+ CfgReadStr(Section, L"DMA7Log_Filename", DMA7LogFileName, L"SPU2dma7.dat");
- CfgReadStr(Section, L"Info_Dump_Filename", CoresDumpFileName, L"SPU2Cores.txt");
- CfgReadStr(Section, L"Mem_Dump_Filename", MemDumpFileName, L"SPU2mem.dat");
- CfgReadStr(Section, L"Reg_Dump_Filename", RegDumpFileName, L"SPU2regs.dat");
+ CfgReadStr(Section, L"Info_Dump_Filename", CoresDumpFileName, L"SPU2Cores.txt");
+ CfgReadStr(Section, L"Mem_Dump_Filename", MemDumpFileName, L"SPU2mem.dat");
+ CfgReadStr(Section, L"Reg_Dump_Filename", RegDumpFileName, L"SPU2regs.dat");
- if (!LogLocationSetByPcsx2) {
- LogsFolder = CfgLogsFolder;
- DumpsFolder = CfgLogsFolder;
- }
-}
+ if (!LogLocationSetByPcsx2)
+ {
+ LogsFolder = CfgLogsFolder;
+ DumpsFolder = CfgLogsFolder;
+ }
+ }
-void WriteSettings()
-{
- CfgWriteBool(Section, L"Global_Enable", DebugEnabled);
+ void WriteSettings()
+ {
+ CfgWriteBool(Section, L"Global_Enable", DebugEnabled);
- CfgWriteBool(Section, L"Show_Messages", _MsgToConsole);
- CfgWriteBool(Section, L"Show_Messages_Key_On_Off", _MsgKeyOnOff);
- CfgWriteBool(Section, L"Show_Messages_Voice_Off", _MsgVoiceOff);
- CfgWriteBool(Section, L"Show_Messages_DMA_Transfer", _MsgDMA);
- CfgWriteBool(Section, L"Show_Messages_AutoDMA", _MsgAutoDMA);
- CfgWriteBool(Section, L"Show_Messages_Overruns", _MsgOverruns);
- CfgWriteBool(Section, L"Show_Messages_CacheStats", _MsgCache);
+ CfgWriteBool(Section, L"Show_Messages", _MsgToConsole);
+ CfgWriteBool(Section, L"Show_Messages_Key_On_Off", _MsgKeyOnOff);
+ CfgWriteBool(Section, L"Show_Messages_Voice_Off", _MsgVoiceOff);
+ CfgWriteBool(Section, L"Show_Messages_DMA_Transfer", _MsgDMA);
+ CfgWriteBool(Section, L"Show_Messages_AutoDMA", _MsgAutoDMA);
+ CfgWriteBool(Section, L"Show_Messages_Overruns", _MsgOverruns);
+ CfgWriteBool(Section, L"Show_Messages_CacheStats", _MsgCache);
- CfgWriteBool(Section, L"Log_Register_Access", _AccessLog);
- CfgWriteBool(Section, L"Log_DMA_Transfers", _DMALog);
- CfgWriteBool(Section, L"Log_WAVE_Output", _WaveLog);
+ CfgWriteBool(Section, L"Log_Register_Access", _AccessLog);
+ CfgWriteBool(Section, L"Log_DMA_Transfers", _DMALog);
+ CfgWriteBool(Section, L"Log_WAVE_Output", _WaveLog);
- CfgWriteBool(Section, L"Dump_Info", _CoresDump);
- CfgWriteBool(Section, L"Dump_Memory", _MemDump);
- CfgWriteBool(Section, L"Dump_Regs", _RegDump);
+ CfgWriteBool(Section, L"Dump_Info", _CoresDump);
+ CfgWriteBool(Section, L"Dump_Memory", _MemDump);
+ CfgWriteBool(Section, L"Dump_Regs", _RegDump);
- CfgWriteBool(Section, L"Visual_Debug_Enabled", _visual_debug_enabled);
+ CfgWriteBool(Section, L"Visual_Debug_Enabled", _visual_debug_enabled);
- // None of the logs strings are changable via GUI, so no point in bothering to
- // write them back out.
- CfgWriteStr(Section, L"Logs_Folder", CfgLogsFolder);
- CfgWriteStr(Section, L"Dumps_Folder", CfgDumpsFolder);
+ // None of the logs strings are changable via GUI, so no point in bothering to
+ // write them back out.
+ CfgWriteStr(Section, L"Logs_Folder", CfgLogsFolder);
+ CfgWriteStr(Section, L"Dumps_Folder", CfgDumpsFolder);
- CfgWriteStr(Section, L"Access_Log_Filename", AccessLogFileName);
- CfgWriteStr(Section, L"DMA4Log_Filename", DMA4LogFileName);
- CfgWriteStr(Section, L"DMA7Log_Filename", DMA7LogFileName);
+ CfgWriteStr(Section, L"Access_Log_Filename", AccessLogFileName);
+ CfgWriteStr(Section, L"DMA4Log_Filename", DMA4LogFileName);
+ CfgWriteStr(Section, L"DMA7Log_Filename", DMA7LogFileName);
- CfgWriteStr(Section, L"Info_Dump_Filename", CoresDumpFileName);
- CfgWriteStr(Section, L"Mem_Dump_Filename", MemDumpFileName);
- CfgWriteStr(Section, L"Reg_Dump_Filename", RegDumpFileName);
-}
+ CfgWriteStr(Section, L"Info_Dump_Filename", CoresDumpFileName);
+ CfgWriteStr(Section, L"Mem_Dump_Filename", MemDumpFileName);
+ CfgWriteStr(Section, L"Reg_Dump_Filename", RegDumpFileName);
+ }
-static void EnableMessages(HWND hWnd)
-{
- ENABLE_CONTROL(IDC_MSGSHOW, DebugEnabled);
- ENABLE_CONTROL(IDC_MSGKEY, MsgToConsole());
- ENABLE_CONTROL(IDC_MSGVOICE, MsgToConsole());
- ENABLE_CONTROL(IDC_MSGDMA, MsgToConsole());
- ENABLE_CONTROL(IDC_MSGADMA, MsgToConsole());
- ENABLE_CONTROL(IDC_DBG_OVERRUNS, MsgToConsole());
- ENABLE_CONTROL(IDC_DBG_CACHE, MsgToConsole());
-}
+ static void EnableMessages(HWND hWnd)
+ {
+ ENABLE_CONTROL(IDC_MSGSHOW, DebugEnabled);
+ ENABLE_CONTROL(IDC_MSGKEY, MsgToConsole());
+ ENABLE_CONTROL(IDC_MSGVOICE, MsgToConsole());
+ ENABLE_CONTROL(IDC_MSGDMA, MsgToConsole());
+ ENABLE_CONTROL(IDC_MSGADMA, MsgToConsole());
+ ENABLE_CONTROL(IDC_DBG_OVERRUNS, MsgToConsole());
+ ENABLE_CONTROL(IDC_DBG_CACHE, MsgToConsole());
+ }
-void EnableControls(HWND hWnd)
-{
- EnableMessages(hWnd);
- ENABLE_CONTROL(IDC_LOGDMA, DebugEnabled);
- ENABLE_CONTROL(IDC_LOGREGS, IsDevBuild ? DebugEnabled : false);
- ENABLE_CONTROL(IDC_LOGWAVE, IsDevBuild ? DebugEnabled : false);
- ENABLE_CONTROL(IDC_DUMPCORE, DebugEnabled);
- ENABLE_CONTROL(IDC_DUMPMEM, DebugEnabled);
- ENABLE_CONTROL(IDC_DUMPREGS, DebugEnabled);
- ENABLE_CONTROL(IDC_DEBUG_VISUAL, IsDevBuild ? DebugEnabled : false);
-}
+ void EnableControls(HWND hWnd)
+ {
+ EnableMessages(hWnd);
+ ENABLE_CONTROL(IDC_LOGDMA, DebugEnabled);
+ ENABLE_CONTROL(IDC_LOGREGS, IsDevBuild ? DebugEnabled : false);
+ ENABLE_CONTROL(IDC_LOGWAVE, IsDevBuild ? DebugEnabled : false);
+ ENABLE_CONTROL(IDC_DUMPCORE, DebugEnabled);
+ ENABLE_CONTROL(IDC_DUMPMEM, DebugEnabled);
+ ENABLE_CONTROL(IDC_DUMPREGS, DebugEnabled);
+ ENABLE_CONTROL(IDC_DEBUG_VISUAL, IsDevBuild ? DebugEnabled : false);
+ }
-static BOOL CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- int wmId;
- //wchar_t temp[384]={0};
+ static BOOL CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+ {
+ int wmId;
+ //wchar_t temp[384]={0};
- switch (uMsg) {
- case WM_PAINT:
- return FALSE;
+ switch (uMsg)
+ {
+ case WM_PAINT:
+ return FALSE;
- case WM_INITDIALOG: {
- EnableControls(hWnd);
+ case WM_INITDIALOG:
+ {
+ EnableControls(hWnd);
- // Debugging / Logging Flags:
- SET_CHECK(IDC_DEBUG, DebugEnabled);
- SET_CHECK(IDC_MSGSHOW, _MsgToConsole);
- SET_CHECK(IDC_MSGKEY, _MsgKeyOnOff);
- SET_CHECK(IDC_MSGVOICE, _MsgVoiceOff);
- SET_CHECK(IDC_MSGDMA, _MsgDMA);
- SET_CHECK(IDC_MSGADMA, _MsgAutoDMA);
- SET_CHECK(IDC_DBG_OVERRUNS, _MsgOverruns);
- SET_CHECK(IDC_DBG_CACHE, _MsgCache);
- SET_CHECK(IDC_LOGREGS, _AccessLog);
- SET_CHECK(IDC_LOGDMA, _DMALog);
- SET_CHECK(IDC_LOGWAVE, _WaveLog);
- SET_CHECK(IDC_DUMPCORE, _CoresDump);
- SET_CHECK(IDC_DUMPMEM, _MemDump);
- SET_CHECK(IDC_DUMPREGS, _RegDump);
- SET_CHECK(IDC_DEBUG_VISUAL, _visual_debug_enabled);
+ // Debugging / Logging Flags:
+ SET_CHECK(IDC_DEBUG, DebugEnabled);
+ SET_CHECK(IDC_MSGSHOW, _MsgToConsole);
+ SET_CHECK(IDC_MSGKEY, _MsgKeyOnOff);
+ SET_CHECK(IDC_MSGVOICE, _MsgVoiceOff);
+ SET_CHECK(IDC_MSGDMA, _MsgDMA);
+ SET_CHECK(IDC_MSGADMA, _MsgAutoDMA);
+ SET_CHECK(IDC_DBG_OVERRUNS, _MsgOverruns);
+ SET_CHECK(IDC_DBG_CACHE, _MsgCache);
+ SET_CHECK(IDC_LOGREGS, _AccessLog);
+ SET_CHECK(IDC_LOGDMA, _DMALog);
+ SET_CHECK(IDC_LOGWAVE, _WaveLog);
+ SET_CHECK(IDC_DUMPCORE, _CoresDump);
+ SET_CHECK(IDC_DUMPMEM, _MemDump);
+ SET_CHECK(IDC_DUMPREGS, _RegDump);
+ SET_CHECK(IDC_DEBUG_VISUAL, _visual_debug_enabled);
- ShowWindow(GetDlgItem(hWnd, IDC_MSG_PUBLIC_BUILD), !IsDevBuild);
- } break;
+ ShowWindow(GetDlgItem(hWnd, IDC_MSG_PUBLIC_BUILD), !IsDevBuild);
+ }
+ break;
- case WM_COMMAND:
- wmId = LOWORD(wParam);
- // Parse the menu selections:
- switch (wmId) {
- case IDOK:
- WriteSettings();
- EndDialog(hWnd, 0);
- break;
+ case WM_COMMAND:
+ wmId = LOWORD(wParam);
+ // Parse the menu selections:
+ switch (wmId)
+ {
+ case IDOK:
+ WriteSettings();
+ EndDialog(hWnd, 0);
+ break;
- case IDCANCEL:
- EndDialog(hWnd, 0);
- break;
+ case IDCANCEL:
+ EndDialog(hWnd, 0);
+ break;
- HANDLE_CHECKNB(IDC_MSGSHOW, _MsgToConsole);
- EnableMessages(hWnd);
- break;
+ HANDLE_CHECKNB(IDC_MSGSHOW, _MsgToConsole);
+ EnableMessages(hWnd);
+ break;
- HANDLE_CHECK(IDC_MSGKEY, _MsgKeyOnOff);
- HANDLE_CHECK(IDC_MSGVOICE, _MsgVoiceOff);
- HANDLE_CHECK(IDC_MSGDMA, _MsgDMA);
- HANDLE_CHECK(IDC_MSGADMA, _MsgAutoDMA);
- break;
+ HANDLE_CHECK(IDC_MSGKEY, _MsgKeyOnOff);
+ HANDLE_CHECK(IDC_MSGVOICE, _MsgVoiceOff);
+ HANDLE_CHECK(IDC_MSGDMA, _MsgDMA);
+ HANDLE_CHECK(IDC_MSGADMA, _MsgAutoDMA);
+ break;
- HANDLE_CHECK(IDC_DBG_OVERRUNS, _MsgOverruns);
- HANDLE_CHECK(IDC_DBG_CACHE, _MsgCache);
- HANDLE_CHECK(IDC_LOGREGS, _AccessLog);
- HANDLE_CHECK(IDC_LOGDMA, _DMALog);
- HANDLE_CHECK(IDC_LOGWAVE, _WaveLog);
- HANDLE_CHECK(IDC_DUMPCORE, _CoresDump);
- HANDLE_CHECK(IDC_DUMPMEM, _MemDump);
- HANDLE_CHECK(IDC_DUMPREGS, _RegDump);
- HANDLE_CHECK(IDC_DEBUG_VISUAL, _visual_debug_enabled);
- default:
- return FALSE;
- }
- break;
+ HANDLE_CHECK(IDC_DBG_OVERRUNS, _MsgOverruns);
+ HANDLE_CHECK(IDC_DBG_CACHE, _MsgCache);
+ HANDLE_CHECK(IDC_LOGREGS, _AccessLog);
+ HANDLE_CHECK(IDC_LOGDMA, _DMALog);
+ HANDLE_CHECK(IDC_LOGWAVE, _WaveLog);
+ HANDLE_CHECK(IDC_DUMPCORE, _CoresDump);
+ HANDLE_CHECK(IDC_DUMPMEM, _MemDump);
+ HANDLE_CHECK(IDC_DUMPREGS, _RegDump);
+ HANDLE_CHECK(IDC_DEBUG_VISUAL, _visual_debug_enabled);
+ default:
+ return FALSE;
+ }
+ break;
- default:
- return FALSE;
- }
- return TRUE;
-}
+ default:
+ return FALSE;
+ }
+ return TRUE;
+ }
-void OpenDialog()
-{
- INT_PTR ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_CONFIG_DEBUG), GetActiveWindow(), (DLGPROC)DialogProc, 1);
- if (ret == -1) {
- MessageBox(GetActiveWindow(), L"Error Opening the debug configuration dialog.", L"OMG ERROR!", MB_OK | MB_SETFOREGROUND);
- return;
- }
- ReadSettings();
-}
-}
+ void OpenDialog()
+ {
+ INT_PTR ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_CONFIG_DEBUG), GetActiveWindow(), (DLGPROC)DialogProc, 1);
+ if (ret == -1)
+ {
+ MessageBox(GetActiveWindow(), L"Error Opening the debug configuration dialog.", L"OMG ERROR!", MB_OK | MB_SETFOREGROUND);
+ return;
+ }
+ ReadSettings();
+ }
+} // namespace DebugConfig
diff --git a/pcsx2/SPU2/Windows/ConfigSoundtouch.cpp b/pcsx2/SPU2/Windows/ConfigSoundtouch.cpp
index 7f43f2371d..196e2b5289 100644
--- a/pcsx2/SPU2/Windows/ConfigSoundtouch.cpp
+++ b/pcsx2/SPU2/Windows/ConfigSoundtouch.cpp
@@ -32,98 +32,106 @@ static const int SeekWindow_Max = 30;
static const int Overlap_Min = 5;
static const int Overlap_Max = 15;
-void SoundtouchCfg::ApplySettings(soundtouch::SoundTouch &sndtouch)
+void SoundtouchCfg::ApplySettings(soundtouch::SoundTouch& sndtouch)
{
- sndtouch.setSetting(SETTING_SEQUENCE_MS, SequenceLenMS);
- sndtouch.setSetting(SETTING_SEEKWINDOW_MS, SeekWindowMS);
- sndtouch.setSetting(SETTING_OVERLAP_MS, OverlapMS);
+ sndtouch.setSetting(SETTING_SEQUENCE_MS, SequenceLenMS);
+ sndtouch.setSetting(SETTING_SEEKWINDOW_MS, SeekWindowMS);
+ sndtouch.setSetting(SETTING_OVERLAP_MS, OverlapMS);
}
static void ClampValues()
{
- Clampify(SequenceLenMS, SequenceLen_Min, SequenceLen_Max);
- Clampify(SeekWindowMS, SeekWindow_Min, SeekWindow_Max);
- Clampify(OverlapMS, Overlap_Min, Overlap_Max);
+ Clampify(SequenceLenMS, SequenceLen_Min, SequenceLen_Max);
+ Clampify(SeekWindowMS, SeekWindow_Min, SeekWindow_Max);
+ Clampify(OverlapMS, Overlap_Min, Overlap_Max);
}
void SoundtouchCfg::ReadSettings()
{
- SequenceLenMS = CfgReadInt(L"SOUNDTOUCH", L"SequenceLengthMS", 30);
- SeekWindowMS = CfgReadInt(L"SOUNDTOUCH", L"SeekWindowMS", 20);
- OverlapMS = CfgReadInt(L"SOUNDTOUCH", L"OverlapMS", 10);
+ SequenceLenMS = CfgReadInt(L"SOUNDTOUCH", L"SequenceLengthMS", 30);
+ SeekWindowMS = CfgReadInt(L"SOUNDTOUCH", L"SeekWindowMS", 20);
+ OverlapMS = CfgReadInt(L"SOUNDTOUCH", L"OverlapMS", 10);
- ClampValues();
+ ClampValues();
}
void SoundtouchCfg::WriteSettings()
{
- CfgWriteInt(L"SOUNDTOUCH", L"SequenceLengthMS", SequenceLenMS);
- CfgWriteInt(L"SOUNDTOUCH", L"SeekWindowMS", SeekWindowMS);
- CfgWriteInt(L"SOUNDTOUCH", L"OverlapMS", OverlapMS);
+ CfgWriteInt(L"SOUNDTOUCH", L"SequenceLengthMS", SequenceLenMS);
+ CfgWriteInt(L"SOUNDTOUCH", L"SeekWindowMS", SeekWindowMS);
+ CfgWriteInt(L"SOUNDTOUCH", L"OverlapMS", OverlapMS);
}
BOOL CALLBACK SoundtouchCfg::DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- int wmId;
- //wchar_t temp[384]={0};
+ int wmId;
+ //wchar_t temp[384]={0};
- switch (uMsg) {
- case WM_PAINT:
- return FALSE;
+ switch (uMsg)
+ {
+ case WM_PAINT:
+ return FALSE;
- case WM_INITDIALOG: {
- INIT_SLIDER(IDC_SEQLEN_SLIDER, SequenceLen_Min, SequenceLen_Max, 20, 5, 1);
- INIT_SLIDER(IDC_SEEKWIN_SLIDER, SeekWindow_Min, SeekWindow_Max, 5, 2, 1);
- INIT_SLIDER(IDC_OVERLAP_SLIDER, Overlap_Min, Overlap_Max, 3, 2, 1);
+ case WM_INITDIALOG:
+ {
+ INIT_SLIDER(IDC_SEQLEN_SLIDER, SequenceLen_Min, SequenceLen_Max, 20, 5, 1);
+ INIT_SLIDER(IDC_SEEKWIN_SLIDER, SeekWindow_Min, SeekWindow_Max, 5, 2, 1);
+ INIT_SLIDER(IDC_OVERLAP_SLIDER, Overlap_Min, Overlap_Max, 3, 2, 1);
- SendDialogMsg(hWnd, IDC_SEQLEN_SLIDER, TBM_SETPOS, TRUE, SequenceLenMS);
- SendDialogMsg(hWnd, IDC_SEEKWIN_SLIDER, TBM_SETPOS, TRUE, SeekWindowMS);
- SendDialogMsg(hWnd, IDC_OVERLAP_SLIDER, TBM_SETPOS, TRUE, OverlapMS);
- }
+ SendDialogMsg(hWnd, IDC_SEQLEN_SLIDER, TBM_SETPOS, TRUE, SequenceLenMS);
+ SendDialogMsg(hWnd, IDC_SEEKWIN_SLIDER, TBM_SETPOS, TRUE, SeekWindowMS);
+ SendDialogMsg(hWnd, IDC_OVERLAP_SLIDER, TBM_SETPOS, TRUE, OverlapMS);
+ }
- case WM_COMMAND:
- wmId = LOWORD(wParam);
- // Parse the menu selections:
- if (wmId == IDOK) {
- SequenceLenMS = (int)SendDialogMsg(hWnd, IDC_SEQLEN_SLIDER, TBM_GETPOS, 0, 0);
- SeekWindowMS = (int)SendDialogMsg(hWnd, IDC_SEEKWIN_SLIDER, TBM_GETPOS, 0, 0);
- OverlapMS = (int)SendDialogMsg(hWnd, IDC_OVERLAP_SLIDER, TBM_GETPOS, 0, 0);
+ case WM_COMMAND:
+ wmId = LOWORD(wParam);
+ // Parse the menu selections:
+ if (wmId == IDOK)
+ {
+ SequenceLenMS = (int)SendDialogMsg(hWnd, IDC_SEQLEN_SLIDER, TBM_GETPOS, 0, 0);
+ SeekWindowMS = (int)SendDialogMsg(hWnd, IDC_SEEKWIN_SLIDER, TBM_GETPOS, 0, 0);
+ OverlapMS = (int)SendDialogMsg(hWnd, IDC_OVERLAP_SLIDER, TBM_GETPOS, 0, 0);
- ClampValues();
- WriteSettings();
- EndDialog(hWnd, 0);
- } else if (wmId == IDC_RESET_DEFAULTS) {
- SequenceLenMS = 30;
- SeekWindowMS = 20;
- OverlapMS = 10;
+ ClampValues();
+ WriteSettings();
+ EndDialog(hWnd, 0);
+ }
+ else if (wmId == IDC_RESET_DEFAULTS)
+ {
+ SequenceLenMS = 30;
+ SeekWindowMS = 20;
+ OverlapMS = 10;
- SendDialogMsg(hWnd, IDC_SEQLEN_SLIDER, TBM_SETPOS, TRUE, SequenceLenMS);
- SendDialogMsg(hWnd, IDC_SEEKWIN_SLIDER, TBM_SETPOS, TRUE, SeekWindowMS);
- SendDialogMsg(hWnd, IDC_OVERLAP_SLIDER, TBM_SETPOS, TRUE, OverlapMS);
+ SendDialogMsg(hWnd, IDC_SEQLEN_SLIDER, TBM_SETPOS, TRUE, SequenceLenMS);
+ SendDialogMsg(hWnd, IDC_SEEKWIN_SLIDER, TBM_SETPOS, TRUE, SeekWindowMS);
+ SendDialogMsg(hWnd, IDC_OVERLAP_SLIDER, TBM_SETPOS, TRUE, OverlapMS);
- AssignSliderValue((HWND)lParam, hWnd, SequenceLenMS);
- } else if (wmId == IDCANCEL) {
- EndDialog(hWnd, 0);
- }
- break;
+ AssignSliderValue((HWND)lParam, hWnd, SequenceLenMS);
+ }
+ else if (wmId == IDCANCEL)
+ {
+ EndDialog(hWnd, 0);
+ }
+ break;
- case WM_HSCROLL:
- DoHandleScrollMessage(hWnd, wParam, lParam);
- break;
+ case WM_HSCROLL:
+ DoHandleScrollMessage(hWnd, wParam, lParam);
+ break;
- default:
- return FALSE;
- }
- return TRUE;
+ default:
+ return FALSE;
+ }
+ return TRUE;
}
void SoundtouchCfg::OpenDialog(HWND hWnd)
{
- INT_PTR ret;
- ret = DialogBox(hInstance, MAKEINTRESOURCE(IDD_CONFIG_SOUNDTOUCH), hWnd, (DLGPROC)DialogProc);
- if (ret == -1) {
- MessageBox(GetActiveWindow(), L"Error Opening the Soundtouch advanced dialog.", L"OMG ERROR!", MB_OK | MB_SETFOREGROUND);
- return;
- }
- ReadSettings();
+ INT_PTR ret;
+ ret = DialogBox(hInstance, MAKEINTRESOURCE(IDD_CONFIG_SOUNDTOUCH), hWnd, (DLGPROC)DialogProc);
+ if (ret == -1)
+ {
+ MessageBox(GetActiveWindow(), L"Error Opening the Soundtouch advanced dialog.", L"OMG ERROR!", MB_OK | MB_SETFOREGROUND);
+ return;
+ }
+ ReadSettings();
}
diff --git a/pcsx2/SPU2/Windows/Dialogs.h b/pcsx2/SPU2/Windows/Dialogs.h
index a3a881e6a0..c99f07b17d 100644
--- a/pcsx2/SPU2/Windows/Dialogs.h
+++ b/pcsx2/SPU2/Windows/Dialogs.h
@@ -23,19 +23,19 @@
namespace DebugConfig
{
-extern void ReadSettings();
-extern void WriteSettings();
-extern void OpenDialog();
-extern void EnableControls(HWND hWnd);
-}
+ extern void ReadSettings();
+ extern void WriteSettings();
+ extern void OpenDialog();
+ extern void EnableControls(HWND hWnd);
+} // namespace DebugConfig
namespace SoundtouchCfg
{
-extern void ReadSettings();
-extern void WriteSettings();
-extern void OpenDialog(HWND hWnd);
-extern BOOL CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
-}
+ extern void ReadSettings();
+ extern void WriteSettings();
+ extern void OpenDialog(HWND hWnd);
+ extern BOOL CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+} // namespace SoundtouchCfg
extern int SendDialogMsg(HWND hwnd, int dlgId, UINT code, WPARAM wParam, LPARAM lParam);
@@ -44,31 +44,31 @@ extern void AssignSliderValue(HWND hWnd, int idc, int editbox, int value);
extern int GetSliderValue(HWND hWnd, int idc);
extern BOOL DoHandleScrollMessage(HWND hwndDisplay, WPARAM wParam, LPARAM lParam);
-extern void CfgSetSettingsDir(const char *dir);
-extern void CfgSetLogDir(const char *dir);
+extern void CfgSetSettingsDir(const char* dir);
+extern void CfgSetLogDir(const char* dir);
-extern bool CfgFindName(const TCHAR *Section, const TCHAR *Name);
+extern bool CfgFindName(const TCHAR* Section, const TCHAR* Name);
-extern void CfgWriteBool(const TCHAR *Section, const TCHAR *Name, bool Value);
-extern void CfgWriteInt(const TCHAR *Section, const TCHAR *Name, int Value);
-extern void CfgWriteFloat(const TCHAR *Section, const TCHAR *Name, float Value);
-extern void CfgWriteStr(const TCHAR *Section, const TCHAR *Name, const wxString &Data);
+extern void CfgWriteBool(const TCHAR* Section, const TCHAR* Name, bool Value);
+extern void CfgWriteInt(const TCHAR* Section, const TCHAR* Name, int Value);
+extern void CfgWriteFloat(const TCHAR* Section, const TCHAR* Name, float Value);
+extern void CfgWriteStr(const TCHAR* Section, const TCHAR* Name, const wxString& Data);
-extern bool CfgReadBool(const TCHAR *Section, const TCHAR *Name, bool Default);
-extern void CfgReadStr(const TCHAR *Section, const TCHAR *Name, wxString &Data, const TCHAR *Default);
-extern void CfgReadStr(const TCHAR *Section, const TCHAR *Name, TCHAR *Data, int DataSize, const TCHAR *Default);
-extern int CfgReadInt(const TCHAR *Section, const TCHAR *Name, int Default);
-extern float CfgReadFloat(const TCHAR *Section, const TCHAR *Name, float Default);
+extern bool CfgReadBool(const TCHAR* Section, const TCHAR* Name, bool Default);
+extern void CfgReadStr(const TCHAR* Section, const TCHAR* Name, wxString& Data, const TCHAR* Default);
+extern void CfgReadStr(const TCHAR* Section, const TCHAR* Name, TCHAR* Data, int DataSize, const TCHAR* Default);
+extern int CfgReadInt(const TCHAR* Section, const TCHAR* Name, int Default);
+extern float CfgReadFloat(const TCHAR* Section, const TCHAR* Name, float Default);
// Items Specific to DirectSound
#define STRFY(x) #x
#define verifyc(x) Verifyc(x, STRFY(x))
-extern void Verifyc(HRESULT hr, const char *fn);
+extern void Verifyc(HRESULT hr, const char* fn);
struct ds_device_data
{
- wxString name;
- GUID guid;
- bool hasGuid;
+ wxString name;
+ GUID guid;
+ bool hasGuid;
};
diff --git a/pcsx2/SPU2/Windows/RealtimeDebugger.cpp b/pcsx2/SPU2/Windows/RealtimeDebugger.cpp
index e54d7cbf51..6272cfaf74 100644
--- a/pcsx2/SPU2/Windows/RealtimeDebugger.cpp
+++ b/pcsx2/SPU2/Windows/RealtimeDebugger.cpp
@@ -23,24 +23,24 @@ HWND hDebugDialog = NULL;
int FillRectangle(HDC dc, int left, int top, int width, int height)
{
- RECT r = {left, top, left + width, top + height};
+ RECT r = {left, top, left + width, top + height};
- return FillRect(dc, &r, (HBRUSH)GetStockObject(DC_BRUSH));
+ return FillRect(dc, &r, (HBRUSH)GetStockObject(DC_BRUSH));
}
BOOL DrawRectangle(HDC dc, int left, int top, int width, int height)
{
- RECT r = {left, top, left + width, top + height};
+ RECT r = {left, top, left + width, top + height};
- POINT p[5] = {
- {r.left, r.top},
- {r.right, r.top},
- {r.right, r.bottom},
- {r.left, r.bottom},
- {r.left, r.top},
- };
+ POINT p[5] = {
+ {r.left, r.top},
+ {r.right, r.top},
+ {r.right, r.bottom},
+ {r.left, r.bottom},
+ {r.left, r.top},
+ };
- return Polyline(dc, p, 5);
+ return Polyline(dc, p, 5);
}
@@ -48,46 +48,52 @@ HFONT hf = NULL;
int lCount = 0;
void UpdateDebugDialog()
{
- if (!debugDialogOpen)
- return;
+ if (!debugDialogOpen)
+ return;
- lCount++;
- if (lCount >= (SampleRate / 100)) // Increase to SampleRate/200 for smooth display.
- {
- HDC hdc = GetDC(hDebugDialog);
+ lCount++;
+ if (lCount >= (SampleRate / 100)) // Increase to SampleRate/200 for smooth display.
+ {
+ HDC hdc = GetDC(hDebugDialog);
- if (!hf) {
- hf = CreateFont(12, 0, 0, 0, 0, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
- DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, L"Lucida Console");
- }
+ if (!hf)
+ {
+ hf = CreateFont(12, 0, 0, 0, 0, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
+ DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, L"Lucida Console");
+ }
- SelectObject(hdc, hf);
- SelectObject(hdc, GetStockObject(DC_BRUSH));
- SelectObject(hdc, GetStockObject(DC_PEN));
+ SelectObject(hdc, hf);
+ SelectObject(hdc, GetStockObject(DC_BRUSH));
+ SelectObject(hdc, GetStockObject(DC_PEN));
- for (int c = 0; c < 2; c++) {
- V_Core &cx(Cores[c]);
- V_CoreDebug &cd(DebugCores[c]);
+ for (int c = 0; c < 2; c++)
+ {
+ V_Core& cx(Cores[c]);
+ V_CoreDebug& cd(DebugCores[c]);
- for (int v = 0; v < 24; v++) {
- int cc = c * 2 + (v / 12);
- int vv = v % 12;
- int IX = 8 + 128 * cc;
- int IY = 8 + 48 * vv;
- V_Voice &vc(cx.Voices[v]);
- V_VoiceDebug &vcd(cd.Voices[v]);
+ for (int v = 0; v < 24; v++)
+ {
+ int cc = c * 2 + (v / 12);
+ int vv = v % 12;
+ int IX = 8 + 128 * cc;
+ int IY = 8 + 48 * vv;
+ V_Voice& vc(cx.Voices[v]);
+ V_VoiceDebug& vcd(cd.Voices[v]);
- SetDCBrushColor(hdc, RGB(0, 0, 0));
- if ((vc.ADSR.Phase > 0) && (vc.ADSR.Phase < 6)) {
- SetDCBrushColor(hdc, RGB(0, 0, 128)); // light blue for playing voice
- if (vc.Modulated) {
- SetDCBrushColor(hdc, RGB(0, 128, 0)); // light green for playing voice with modulation enabled
- }
- if (vc.Noise) {
- SetDCBrushColor(hdc, RGB(128, 0, 0)); // light red for playing voice with noise enabled
- }
- }
- /*
+ SetDCBrushColor(hdc, RGB(0, 0, 0));
+ if ((vc.ADSR.Phase > 0) && (vc.ADSR.Phase < 6))
+ {
+ SetDCBrushColor(hdc, RGB(0, 0, 128)); // light blue for playing voice
+ if (vc.Modulated)
+ {
+ SetDCBrushColor(hdc, RGB(0, 128, 0)); // light green for playing voice with modulation enabled
+ }
+ if (vc.Noise)
+ {
+ SetDCBrushColor(hdc, RGB(128, 0, 0)); // light red for playing voice with noise enabled
+ }
+ }
+ /*
else
{
if(vcd.lastStopReason==1)
@@ -100,168 +106,181 @@ void UpdateDebugDialog()
}
}*/
- FillRectangle(hdc, IX, IY, 124, 46);
+ FillRectangle(hdc, IX, IY, 124, 46);
- SetDCPenColor(hdc, RGB(255, 128, 32));
+ SetDCPenColor(hdc, RGB(255, 128, 32));
- DrawRectangle(hdc, IX, IY, 124, 46);
+ DrawRectangle(hdc, IX, IY, 124, 46);
- SetDCBrushColor(hdc, RGB(0, 255, 0));
+ SetDCBrushColor(hdc, RGB(0, 255, 0));
- int vl = abs(((vc.Volume.Left.Value >> 16) * 38) >> 15);
- int vr = abs(((vc.Volume.Right.Value >> 16) * 38) >> 15);
+ int vl = abs(((vc.Volume.Left.Value >> 16) * 38) >> 15);
+ int vr = abs(((vc.Volume.Right.Value >> 16) * 38) >> 15);
- FillRectangle(hdc, IX + 58, IY + 42 - vl, 4, vl);
- FillRectangle(hdc, IX + 62, IY + 42 - vr, 4, vr);
+ FillRectangle(hdc, IX + 58, IY + 42 - vl, 4, vl);
+ FillRectangle(hdc, IX + 62, IY + 42 - vr, 4, vr);
- int adsr = ((vc.ADSR.Value >> 16) * 38) / 32768;
+ int adsr = ((vc.ADSR.Value >> 16) * 38) / 32768;
- FillRectangle(hdc, IX + 66, IY + 42 - adsr, 4, adsr);
+ FillRectangle(hdc, IX + 66, IY + 42 - adsr, 4, adsr);
- int peak = (vcd.displayPeak * 38) / 32768;
+ int peak = (vcd.displayPeak * 38) / 32768;
- if (vcd.displayPeak >= 32700) // leave a little bit of margin
- {
- SetDCBrushColor(hdc, RGB(255, 0, 0));
- }
+ if (vcd.displayPeak >= 32700) // leave a little bit of margin
+ {
+ SetDCBrushColor(hdc, RGB(255, 0, 0));
+ }
- FillRectangle(hdc, IX + 70, IY + 42 - peak, 4, peak);
+ FillRectangle(hdc, IX + 70, IY + 42 - peak, 4, peak);
- if (vc.ADSR.Value > 0) {
- if (vc.SBuffer)
- for (int i = 0; i < 28; i++) {
- int val = ((int)vc.SBuffer[i] * 20) / 32768;
+ if (vc.ADSR.Value > 0)
+ {
+ if (vc.SBuffer)
+ for (int i = 0; i < 28; i++)
+ {
+ int val = ((int)vc.SBuffer[i] * 20) / 32768;
- int y = 0;
+ int y = 0;
- if (val > 0) {
- y = val;
- } else
- val = -val;
+ if (val > 0)
+ {
+ y = val;
+ }
+ else
+ val = -val;
- if (val != 0) {
- FillRectangle(hdc, IX + 90 + i, IY + 24 - y, 1, val);
- }
- }
- }
+ if (val != 0)
+ {
+ FillRectangle(hdc, IX + 90 + i, IY + 24 - y, 1, val);
+ }
+ }
+ }
- SetTextColor(hdc, RGB(0, 255, 0));
- SetBkColor(hdc, RGB(0, 0, 0));
+ SetTextColor(hdc, RGB(0, 255, 0));
+ SetBkColor(hdc, RGB(0, 0, 0));
- static wchar_t t[256];
+ static wchar_t t[256];
- swprintf_s(t, L"%06x", vc.StartA);
- TextOut(hdc, IX + 4, IY + 4, t, 6);
+ swprintf_s(t, L"%06x", vc.StartA);
+ TextOut(hdc, IX + 4, IY + 4, t, 6);
- swprintf_s(t, L"%06x", vc.NextA);
- TextOut(hdc, IX + 4, IY + 18, t, 6);
+ swprintf_s(t, L"%06x", vc.NextA);
+ TextOut(hdc, IX + 4, IY + 18, t, 6);
- swprintf_s(t, L"%06x", vc.LoopStartA);
- TextOut(hdc, IX + 4, IY + 32, t, 6);
+ swprintf_s(t, L"%06x", vc.LoopStartA);
+ TextOut(hdc, IX + 4, IY + 32, t, 6);
- vcd.displayPeak = 0;
- }
+ vcd.displayPeak = 0;
+ }
- // top now: 400
- int JX = 8 + c * 256;
- int JY = 584;
+ // top now: 400
+ int JX = 8 + c * 256;
+ int JY = 584;
- SetDCBrushColor(hdc, RGB(0, 0, 0));
- SetDCPenColor(hdc, RGB(255, 128, 32));
+ SetDCBrushColor(hdc, RGB(0, 0, 0));
+ SetDCPenColor(hdc, RGB(255, 128, 32));
- FillRectangle(hdc, JX, JY, 252, 60);
- DrawRectangle(hdc, JX, JY, 252, 60);
+ FillRectangle(hdc, JX, JY, 252, 60);
+ DrawRectangle(hdc, JX, JY, 252, 60);
- SetTextColor(hdc, RGB(255, 255, 255));
- SetBkColor(hdc, RGB(0, 0, 0));
+ SetTextColor(hdc, RGB(255, 255, 255));
+ SetBkColor(hdc, RGB(0, 0, 0));
- static wchar_t t[256];
- TextOut(hdc, JX + 4, JY + 4, L"REVB", 4);
- TextOut(hdc, JX + 4, JY + 18, L"IRQE", 4);
- TextOut(hdc, JX + 4, JY + 32, L"ADMA", 4);
- swprintf_s(t, L"DMA%s", c == 0 ? L"4" : L"7");
- TextOut(hdc, JX + 4, JY + 46, t, 4);
+ static wchar_t t[256];
+ TextOut(hdc, JX + 4, JY + 4, L"REVB", 4);
+ TextOut(hdc, JX + 4, JY + 18, L"IRQE", 4);
+ TextOut(hdc, JX + 4, JY + 32, L"ADMA", 4);
+ swprintf_s(t, L"DMA%s", c == 0 ? L"4" : L"7");
+ TextOut(hdc, JX + 4, JY + 46, t, 4);
- SetTextColor(hdc, RGB(0, 255, 0));
- memset(t, 0, sizeof(t));
- swprintf_s(t, L"ESA %x", cx.EffectsStartA);
- TextOut(hdc, JX + 56, JY + 4, t, 9);
- memset(t, 0, sizeof(t));
- swprintf_s(t, L"EEA %x", cx.EffectsEndA);
- TextOut(hdc, JX + 128, JY + 4, t, 9);
- memset(t, 0, sizeof(t));
- swprintf_s(t, L"(%x)", cx.EffectsBufferSize);
- TextOut(hdc, JX + 200, JY + 4, t, 7);
+ SetTextColor(hdc, RGB(0, 255, 0));
+ memset(t, 0, sizeof(t));
+ swprintf_s(t, L"ESA %x", cx.EffectsStartA);
+ TextOut(hdc, JX + 56, JY + 4, t, 9);
+ memset(t, 0, sizeof(t));
+ swprintf_s(t, L"EEA %x", cx.EffectsEndA);
+ TextOut(hdc, JX + 128, JY + 4, t, 9);
+ memset(t, 0, sizeof(t));
+ swprintf_s(t, L"(%x)", cx.EffectsBufferSize);
+ TextOut(hdc, JX + 200, JY + 4, t, 7);
- memset(t, 0, sizeof(t));
- swprintf_s(t, L"IRQA %x", cx.IRQA);
- TextOut(hdc, JX + 56, JY + 18, t, 12);
+ memset(t, 0, sizeof(t));
+ swprintf_s(t, L"IRQA %x", cx.IRQA);
+ TextOut(hdc, JX + 56, JY + 18, t, 12);
- SetTextColor(hdc, RGB(255, 255, 255));
- SetDCBrushColor(hdc, RGB(255, 0, 0));
+ SetTextColor(hdc, RGB(255, 255, 255));
+ SetDCBrushColor(hdc, RGB(255, 0, 0));
- if (cx.FxEnable) {
- FillRectangle(hdc, JX + 40, JY + 4, 10, 10);
- }
- if (cx.IRQEnable) {
- FillRectangle(hdc, JX + 40, JY + 18, 10, 10);
- }
- if (cx.AutoDMACtrl != 0) {
- FillRectangle(hdc, JX + 40, JY + 32, 10, 10);
+ if (cx.FxEnable)
+ {
+ FillRectangle(hdc, JX + 40, JY + 4, 10, 10);
+ }
+ if (cx.IRQEnable)
+ {
+ FillRectangle(hdc, JX + 40, JY + 18, 10, 10);
+ }
+ if (cx.AutoDMACtrl != 0)
+ {
+ FillRectangle(hdc, JX + 40, JY + 32, 10, 10);
- for (int j = 0; j < 64; j++) {
- int i = j * 256 / 64;
- int val = (cd.admaWaveformL[i] * 26) / 32768;
- int y = 0;
+ for (int j = 0; j < 64; j++)
+ {
+ int i = j * 256 / 64;
+ int val = (cd.admaWaveformL[i] * 26) / 32768;
+ int y = 0;
- if (val > 0)
- y = val;
- else
- val = -val;
+ if (val > 0)
+ y = val;
+ else
+ val = -val;
- if (val != 0) {
- FillRectangle(hdc, JX + 60 + j, JY + 30 - y, 1, val);
- }
- }
+ if (val != 0)
+ {
+ FillRectangle(hdc, JX + 60 + j, JY + 30 - y, 1, val);
+ }
+ }
- for (int j = 0; j < 64; j++) {
- int i = j * 256 / 64;
- int val = (cd.admaWaveformR[i] * 26) / 32768;
- int y = 0;
+ for (int j = 0; j < 64; j++)
+ {
+ int i = j * 256 / 64;
+ int val = (cd.admaWaveformR[i] * 26) / 32768;
+ int y = 0;
- if (val > 0)
- y = val;
- else
- val = -val;
+ if (val > 0)
+ y = val;
+ else
+ val = -val;
- if (val != 0) {
- FillRectangle(hdc, JX + 136 + j, JY + 30 - y, 1, val);
- }
- }
- }
- if (cd.dmaFlag > 0) // So it shows x times this is called, since dmas are so fast
- {
- swprintf_s(t, L"size = %d", cd.lastsize);
+ if (val != 0)
+ {
+ FillRectangle(hdc, JX + 136 + j, JY + 30 - y, 1, val);
+ }
+ }
+ }
+ if (cd.dmaFlag > 0) // So it shows x times this is called, since dmas are so fast
+ {
+ swprintf_s(t, L"size = %d", cd.lastsize);
- TextOut(hdc, JX + 64, JY + 46, t, wcslen(t));
- FillRectangle(hdc, JX + 40, JY + 46, 10, 10);
- cd.dmaFlag--;
- }
- }
+ TextOut(hdc, JX + 64, JY + 46, t, wcslen(t));
+ FillRectangle(hdc, JX + 40, JY + 46, 10, 10);
+ cd.dmaFlag--;
+ }
+ }
- ReleaseDC(hDebugDialog, hdc);
- lCount = 0;
- }
+ ReleaseDC(hDebugDialog, hdc);
+ lCount = 0;
+ }
- MSG msg;
- while (PeekMessage(&msg, hDebugDialog, 0, 0, PM_REMOVE)) {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
+ MSG msg;
+ while (PeekMessage(&msg, hDebugDialog, 0, 0, PM_REMOVE))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
}
#else
void UpdateDebugDialog()
{
- // Release mode. Nothing to do
+ // Release mode. Nothing to do
}
#endif
diff --git a/pcsx2/SPU2/Windows/SndOut_DSound.cpp b/pcsx2/SPU2/Windows/SndOut_DSound.cpp
index 4d33cac842..496cb8e4f5 100644
--- a/pcsx2/SPU2/Windows/SndOut_DSound.cpp
+++ b/pcsx2/SPU2/Windows/SndOut_DSound.cpp
@@ -24,432 +24,462 @@
class DSound : public SndOutModule
{
private:
- static const uint MAX_BUFFER_COUNT = 8;
- static const int PacketsPerBuffer = 8;
- static const int BufferSize = SndOutPacketSize * PacketsPerBuffer;
+ static const uint MAX_BUFFER_COUNT = 8;
+ static const int PacketsPerBuffer = 8;
+ static const int BufferSize = SndOutPacketSize * PacketsPerBuffer;
- //////////////////////////////////////////////////////////////////////////////////////////
- // Configuration Vars
+ //////////////////////////////////////////////////////////////////////////////////////////
+ // Configuration Vars
- wxString m_Device;
- u8 m_NumBuffers;
- bool m_DisableGlobalFocus;
- bool m_UseHardware;
+ wxString m_Device;
+ u8 m_NumBuffers;
+ bool m_DisableGlobalFocus;
+ bool m_UseHardware;
- ds_device_data m_devices[32];
- int ndevs;
- GUID DevGuid; // currently employed GUID.
- bool haveGuid;
+ ds_device_data m_devices[32];
+ int ndevs;
+ GUID DevGuid; // currently employed GUID.
+ bool haveGuid;
- //////////////////////////////////////////////////////////////////////////////////////////
- // Instance vars
+ //////////////////////////////////////////////////////////////////////////////////////////
+ // Instance vars
- int channel;
- int myLastWrite; // last write position, in bytes
+ int channel;
+ int myLastWrite; // last write position, in bytes
- bool dsound_running;
- HANDLE thread;
- DWORD tid;
+ bool dsound_running;
+ HANDLE thread;
+ DWORD tid;
- IDirectSound8 *dsound;
- IDirectSoundBuffer8 *buffer;
- IDirectSoundNotify8 *buffer_notify;
- HANDLE buffer_events[MAX_BUFFER_COUNT];
+ IDirectSound8* dsound;
+ IDirectSoundBuffer8* buffer;
+ IDirectSoundNotify8* buffer_notify;
+ HANDLE buffer_events[MAX_BUFFER_COUNT];
- WAVEFORMATEX wfx;
+ WAVEFORMATEX wfx;
- HANDLE waitEvent;
+ HANDLE waitEvent;
- template
- static DWORD CALLBACK RThread(DSound *obj)
- {
- return obj->Thread();
- }
+ template
+ static DWORD CALLBACK RThread(DSound* obj)
+ {
+ return obj->Thread();
+ }
- template
- DWORD CALLBACK Thread()
- {
- static const int BufferSizeBytes = BufferSize * sizeof(T);
+ template
+ DWORD CALLBACK Thread()
+ {
+ static const int BufferSizeBytes = BufferSize * sizeof(T);
- while (dsound_running) {
- u32 rv = WaitForMultipleObjects(m_NumBuffers, buffer_events, FALSE, 200);
+ while (dsound_running)
+ {
+ u32 rv = WaitForMultipleObjects(m_NumBuffers, buffer_events, FALSE, 200);
- T *p1, *oldp1;
- LPVOID p2;
- DWORD s1, s2;
+ T *p1, *oldp1;
+ LPVOID p2;
+ DWORD s1, s2;
- u32 poffset = BufferSizeBytes * rv;
+ u32 poffset = BufferSizeBytes * rv;
- if (FAILED(buffer->Lock(poffset, BufferSizeBytes, (LPVOID *)&p1, &s1, &p2, &s2, 0))) {
- assert(0);
- fputs("* SPU2-X: Directsound Warning > Buffer lock failure. You may need to increase\n\tyour configured DSound buffer count.\n", stderr);
- continue;
- }
- oldp1 = p1;
+ if (FAILED(buffer->Lock(poffset, BufferSizeBytes, (LPVOID*)&p1, &s1, &p2, &s2, 0)))
+ {
+ assert(0);
+ fputs("* SPU2-X: Directsound Warning > Buffer lock failure. You may need to increase\n\tyour configured DSound buffer count.\n", stderr);
+ continue;
+ }
+ oldp1 = p1;
- for (int p = 0; p < PacketsPerBuffer; p++, p1 += SndOutPacketSize)
- SndBuffer::ReadSamples(p1);
+ for (int p = 0; p < PacketsPerBuffer; p++, p1 += SndOutPacketSize)
+ SndBuffer::ReadSamples(p1);
- buffer->Unlock(oldp1, s1, p2, s2);
+ buffer->Unlock(oldp1, s1, p2, s2);
- // Set the write pointer to the beginning of the next block.
- myLastWrite = (poffset + BufferSizeBytes) & ~BufferSizeBytes;
- }
- return 0;
- }
+ // Set the write pointer to the beginning of the next block.
+ myLastWrite = (poffset + BufferSizeBytes) & ~BufferSizeBytes;
+ }
+ return 0;
+ }
public:
- s32 Init()
- {
- CoInitializeEx(NULL, COINIT_MULTITHREADED);
+ s32 Init()
+ {
+ CoInitializeEx(NULL, COINIT_MULTITHREADED);
- //
- // Initialize DSound
- //
- GUID cGuid;
+ //
+ // Initialize DSound
+ //
+ GUID cGuid;
- try {
- if (m_Device.empty())
- throw std::runtime_error("screw it");
+ try
+ {
+ if (m_Device.empty())
+ throw std::runtime_error("screw it");
- if ((FAILED(IIDFromString(m_Device, &cGuid))) ||
- FAILED(DirectSoundCreate8(&cGuid, &dsound, NULL)))
- throw std::runtime_error("try again?");
- } catch (std::runtime_error &) {
- // if the GUID failed, just open up the default dsound driver:
- if (FAILED(DirectSoundCreate8(NULL, &dsound, NULL)))
- throw std::runtime_error("DirectSound failed to initialize!");
- }
+ if ((FAILED(IIDFromString(m_Device, &cGuid))) ||
+ FAILED(DirectSoundCreate8(&cGuid, &dsound, NULL)))
+ throw std::runtime_error("try again?");
+ }
+ catch (std::runtime_error&)
+ {
+ // if the GUID failed, just open up the default dsound driver:
+ if (FAILED(DirectSoundCreate8(NULL, &dsound, NULL)))
+ throw std::runtime_error("DirectSound failed to initialize!");
+ }
- if (FAILED(dsound->SetCooperativeLevel(GetDesktopWindow(), DSSCL_PRIORITY)))
- throw std::runtime_error("DirectSound Error: Cooperative level could not be set.");
+ if (FAILED(dsound->SetCooperativeLevel(GetDesktopWindow(), DSSCL_PRIORITY)))
+ throw std::runtime_error("DirectSound Error: Cooperative level could not be set.");
- // Determine the user's speaker configuration, and select an expansion option as needed.
- // FAIL : Directsound doesn't appear to support audio expansion >_<
+ // Determine the user's speaker configuration, and select an expansion option as needed.
+ // FAIL : Directsound doesn't appear to support audio expansion >_<
- DWORD speakerConfig = 2;
- //dsound->GetSpeakerConfig( &speakerConfig );
+ DWORD speakerConfig = 2;
+ //dsound->GetSpeakerConfig( &speakerConfig );
- IDirectSoundBuffer *buffer_;
- DSBUFFERDESC desc;
+ IDirectSoundBuffer* buffer_;
+ DSBUFFERDESC desc;
- // Set up WAV format structure.
+ // Set up WAV format structure.
- memset(&wfx, 0, sizeof(WAVEFORMATEX));
- wfx.wFormatTag = WAVE_FORMAT_PCM;
- wfx.nSamplesPerSec = SampleRate;
- wfx.nChannels = (WORD)speakerConfig;
- wfx.wBitsPerSample = 16;
- wfx.nBlockAlign = 2 * (WORD)speakerConfig;
- wfx.nAvgBytesPerSec = SampleRate * wfx.nBlockAlign;
- wfx.cbSize = 0;
+ memset(&wfx, 0, sizeof(WAVEFORMATEX));
+ wfx.wFormatTag = WAVE_FORMAT_PCM;
+ wfx.nSamplesPerSec = SampleRate;
+ wfx.nChannels = (WORD)speakerConfig;
+ wfx.wBitsPerSample = 16;
+ wfx.nBlockAlign = 2 * (WORD)speakerConfig;
+ wfx.nAvgBytesPerSec = SampleRate * wfx.nBlockAlign;
+ wfx.cbSize = 0;
- uint BufferSizeBytes = BufferSize * wfx.nBlockAlign;
+ uint BufferSizeBytes = BufferSize * wfx.nBlockAlign;
- // Set up DSBUFFERDESC structure.
+ // Set up DSBUFFERDESC structure.
- memset(&desc, 0, sizeof(DSBUFFERDESC));
- desc.dwSize = sizeof(DSBUFFERDESC);
- desc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLPOSITIONNOTIFY;
- desc.dwBufferBytes = BufferSizeBytes * m_NumBuffers;
- desc.lpwfxFormat = &wfx;
+ memset(&desc, 0, sizeof(DSBUFFERDESC));
+ desc.dwSize = sizeof(DSBUFFERDESC);
+ desc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLPOSITIONNOTIFY;
+ desc.dwBufferBytes = BufferSizeBytes * m_NumBuffers;
+ desc.lpwfxFormat = &wfx;
- // Try a hardware buffer first, and then fall back on a software buffer if
- // that one fails.
+ // Try a hardware buffer first, and then fall back on a software buffer if
+ // that one fails.
- desc.dwFlags |= m_UseHardware ? DSBCAPS_LOCHARDWARE : DSBCAPS_LOCSOFTWARE;
- desc.dwFlags |= m_DisableGlobalFocus ? DSBCAPS_STICKYFOCUS : DSBCAPS_GLOBALFOCUS;
+ desc.dwFlags |= m_UseHardware ? DSBCAPS_LOCHARDWARE : DSBCAPS_LOCSOFTWARE;
+ desc.dwFlags |= m_DisableGlobalFocus ? DSBCAPS_STICKYFOCUS : DSBCAPS_GLOBALFOCUS;
- if (FAILED(dsound->CreateSoundBuffer(&desc, &buffer_, 0))) {
- if (m_UseHardware) {
- desc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_LOCSOFTWARE;
- desc.dwFlags |= m_DisableGlobalFocus ? DSBCAPS_STICKYFOCUS : DSBCAPS_GLOBALFOCUS;
+ if (FAILED(dsound->CreateSoundBuffer(&desc, &buffer_, 0)))
+ {
+ if (m_UseHardware)
+ {
+ desc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_LOCSOFTWARE;
+ desc.dwFlags |= m_DisableGlobalFocus ? DSBCAPS_STICKYFOCUS : DSBCAPS_GLOBALFOCUS;
- if (FAILED(dsound->CreateSoundBuffer(&desc, &buffer_, 0)))
- throw std::runtime_error("DirectSound Error: Buffer could not be created.");
- }
+ if (FAILED(dsound->CreateSoundBuffer(&desc, &buffer_, 0)))
+ throw std::runtime_error("DirectSound Error: Buffer could not be created.");
+ }
- throw std::runtime_error("DirectSound Error: Buffer could not be created.");
- }
- if (FAILED(buffer_->QueryInterface(IID_IDirectSoundBuffer8, (void **)&buffer)) || buffer == NULL)
- throw std::runtime_error("DirectSound Error: Interface could not be queried.");
+ throw std::runtime_error("DirectSound Error: Buffer could not be created.");
+ }
+ if (FAILED(buffer_->QueryInterface(IID_IDirectSoundBuffer8, (void**)&buffer)) || buffer == NULL)
+ throw std::runtime_error("DirectSound Error: Interface could not be queried.");
- buffer_->Release();
- verifyc(buffer->QueryInterface(IID_IDirectSoundNotify8, (void **)&buffer_notify));
+ buffer_->Release();
+ verifyc(buffer->QueryInterface(IID_IDirectSoundNotify8, (void**)&buffer_notify));
- DSBPOSITIONNOTIFY not[MAX_BUFFER_COUNT];
+ DSBPOSITIONNOTIFY not[MAX_BUFFER_COUNT];
- for (uint i = 0; i < m_NumBuffers; i++) {
- buffer_events[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
- not[i].dwOffset = (wfx.nBlockAlign + BufferSizeBytes * (i + 1)) % desc.dwBufferBytes;
- not[i].hEventNotify = buffer_events[i];
- }
+ for (uint i = 0; i < m_NumBuffers; i++)
+ {
+ buffer_events[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
+ not[i].dwOffset = (wfx.nBlockAlign + BufferSizeBytes * (i + 1)) % desc.dwBufferBytes;
+ not[i].hEventNotify = buffer_events[i];
+ }
- buffer_notify->SetNotificationPositions(m_NumBuffers, not);
+ buffer_notify->SetNotificationPositions(m_NumBuffers, not);
- LPVOID p1 = 0, p2 = 0;
- DWORD s1 = 0, s2 = 0;
+ LPVOID p1 = 0, p2 = 0;
+ DWORD s1 = 0, s2 = 0;
- verifyc(buffer->Lock(0, desc.dwBufferBytes, &p1, &s1, &p2, &s2, 0));
- assert(p2 == 0);
- memset(p1, 0, s1);
- verifyc(buffer->Unlock(p1, s1, p2, s2));
+ verifyc(buffer->Lock(0, desc.dwBufferBytes, &p1, &s1, &p2, &s2, 0));
+ assert(p2 == 0);
+ memset(p1, 0, s1);
+ verifyc(buffer->Unlock(p1, s1, p2, s2));
- //Play the buffer !
- verifyc(buffer->Play(0, 0, DSBPLAY_LOOPING));
+ //Play the buffer !
+ verifyc(buffer->Play(0, 0, DSBPLAY_LOOPING));
- // Start Thread
- myLastWrite = 0;
- dsound_running = true;
- thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RThread, this, 0, &tid);
- SetThreadPriority(thread, THREAD_PRIORITY_ABOVE_NORMAL);
+ // Start Thread
+ myLastWrite = 0;
+ dsound_running = true;
+ thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RThread, this, 0, &tid);
+ SetThreadPriority(thread, THREAD_PRIORITY_ABOVE_NORMAL);
- return 0;
- }
+ return 0;
+ }
- void Close()
- {
- // Stop Thread
- fprintf(stderr, "* SPU2-X: Waiting for DSound thread to finish...");
- dsound_running = false;
+ void Close()
+ {
+ // Stop Thread
+ fprintf(stderr, "* SPU2-X: Waiting for DSound thread to finish...");
+ dsound_running = false;
- WaitForSingleObject(thread, INFINITE);
- CloseHandle(thread);
+ WaitForSingleObject(thread, INFINITE);
+ CloseHandle(thread);
- fprintf(stderr, " Done.\n");
+ fprintf(stderr, " Done.\n");
- //
- // Clean up
- //
- if (buffer != NULL) {
- buffer->Stop();
+ //
+ // Clean up
+ //
+ if (buffer != NULL)
+ {
+ buffer->Stop();
- for (u32 i = 0; i < m_NumBuffers; i++) {
- if (buffer_events[i] != NULL)
- CloseHandle(buffer_events[i]);
- buffer_events[i] = NULL;
- }
+ for (u32 i = 0; i < m_NumBuffers; i++)
+ {
+ if (buffer_events[i] != NULL)
+ CloseHandle(buffer_events[i]);
+ buffer_events[i] = NULL;
+ }
- safe_release(buffer_notify);
- safe_release(buffer);
- }
+ safe_release(buffer_notify);
+ safe_release(buffer);
+ }
- safe_release(dsound);
- CoUninitialize();
- }
+ safe_release(dsound);
+ CoUninitialize();
+ }
private:
- bool _DSEnumCallback(LPGUID lpGuid, LPCTSTR lpcstrDescription, LPCTSTR lpcstrModule, LPVOID lpContext)
- {
- m_devices[ndevs].name = lpcstrDescription;
+ bool _DSEnumCallback(LPGUID lpGuid, LPCTSTR lpcstrDescription, LPCTSTR lpcstrModule, LPVOID lpContext)
+ {
+ m_devices[ndevs].name = lpcstrDescription;
- if (lpGuid) {
- m_devices[ndevs].guid = *lpGuid;
- m_devices[ndevs].hasGuid = true;
- } else {
- m_devices[ndevs].hasGuid = false;
- }
- ndevs++;
+ if (lpGuid)
+ {
+ m_devices[ndevs].guid = *lpGuid;
+ m_devices[ndevs].hasGuid = true;
+ }
+ else
+ {
+ m_devices[ndevs].hasGuid = false;
+ }
+ ndevs++;
- if (ndevs < 32)
- return TRUE;
- return FALSE;
- }
+ if (ndevs < 32)
+ return TRUE;
+ return FALSE;
+ }
- bool _ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- int wmId, wmEvent;
- int tSel = 0;
+ bool _ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+ {
+ int wmId, wmEvent;
+ int tSel = 0;
- switch (uMsg) {
- case WM_INITDIALOG: {
- wchar_t temp[128];
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ wchar_t temp[128];
- haveGuid = !FAILED(IIDFromString(m_Device, &DevGuid));
- SendMessage(GetDlgItem(hWnd, IDC_DS_DEVICE), CB_RESETCONTENT, 0, 0);
+ haveGuid = !FAILED(IIDFromString(m_Device, &DevGuid));
+ SendMessage(GetDlgItem(hWnd, IDC_DS_DEVICE), CB_RESETCONTENT, 0, 0);
- ndevs = 0;
- DirectSoundEnumerate(DSEnumCallback, NULL);
+ ndevs = 0;
+ DirectSoundEnumerate(DSEnumCallback, NULL);
- tSel = -1;
- for (int i = 0; i < ndevs; i++) {
- SendMessage(GetDlgItem(hWnd, IDC_DS_DEVICE), CB_ADDSTRING, 0, (LPARAM)m_devices[i].name.wc_str());
- if (haveGuid && IsEqualGUID(m_devices[i].guid, DevGuid) || tSel < 0 && !m_devices[i].hasGuid)
- tSel = i;
- }
+ tSel = -1;
+ for (int i = 0; i < ndevs; i++)
+ {
+ SendMessage(GetDlgItem(hWnd, IDC_DS_DEVICE), CB_ADDSTRING, 0, (LPARAM)m_devices[i].name.wc_str());
+ if (haveGuid && IsEqualGUID(m_devices[i].guid, DevGuid) || tSel < 0 && !m_devices[i].hasGuid)
+ tSel = i;
+ }
- if (tSel >= 0)
- SendMessage(GetDlgItem(hWnd, IDC_DS_DEVICE), CB_SETCURSEL, tSel, 0);
+ if (tSel >= 0)
+ SendMessage(GetDlgItem(hWnd, IDC_DS_DEVICE), CB_SETCURSEL, tSel, 0);
- INIT_SLIDER(IDC_BUFFERS_SLIDER, 2, MAX_BUFFER_COUNT, 2, 1, 1);
- SendMessage(GetDlgItem(hWnd, IDC_BUFFERS_SLIDER), TBM_SETPOS, TRUE, m_NumBuffers);
- swprintf_s(temp, L"%d (%d ms latency)", m_NumBuffers, 1000 / (96000 / (m_NumBuffers * BufferSize)));
- SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp);
+ INIT_SLIDER(IDC_BUFFERS_SLIDER, 2, MAX_BUFFER_COUNT, 2, 1, 1);
+ SendMessage(GetDlgItem(hWnd, IDC_BUFFERS_SLIDER), TBM_SETPOS, TRUE, m_NumBuffers);
+ swprintf_s(temp, L"%d (%d ms latency)", m_NumBuffers, 1000 / (96000 / (m_NumBuffers * BufferSize)));
+ SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp);
- SET_CHECK(IDC_GLOBALFOCUS_DISABLE, m_DisableGlobalFocus);
- SET_CHECK(IDC_USE_HARDWARE, m_UseHardware);
- } break;
+ SET_CHECK(IDC_GLOBALFOCUS_DISABLE, m_DisableGlobalFocus);
+ SET_CHECK(IDC_USE_HARDWARE, m_UseHardware);
+ }
+ break;
- case WM_COMMAND: {
- wchar_t temp[128];
+ case WM_COMMAND:
+ {
+ wchar_t temp[128];
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // Parse the menu selections:
- switch (wmId) {
- case IDOK: {
- int i = (int)SendMessage(GetDlgItem(hWnd, IDC_DS_DEVICE), CB_GETCURSEL, 0, 0);
+ wmId = LOWORD(wParam);
+ wmEvent = HIWORD(wParam);
+ // Parse the menu selections:
+ switch (wmId)
+ {
+ case IDOK:
+ {
+ int i = (int)SendMessage(GetDlgItem(hWnd, IDC_DS_DEVICE), CB_GETCURSEL, 0, 0);
- if (!m_devices[i].hasGuid) {
- m_Device[0] = 0; // clear device name to ""
- } else {
- swprintf_s(temp, L"{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
- m_devices[i].guid.Data1,
- m_devices[i].guid.Data2,
- m_devices[i].guid.Data3,
- m_devices[i].guid.Data4[0],
- m_devices[i].guid.Data4[1],
- m_devices[i].guid.Data4[2],
- m_devices[i].guid.Data4[3],
- m_devices[i].guid.Data4[4],
- m_devices[i].guid.Data4[5],
- m_devices[i].guid.Data4[6],
- m_devices[i].guid.Data4[7]);
- m_Device = temp;
- }
+ if (!m_devices[i].hasGuid)
+ {
+ m_Device[0] = 0; // clear device name to ""
+ }
+ else
+ {
+ swprintf_s(temp, L"{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
+ m_devices[i].guid.Data1,
+ m_devices[i].guid.Data2,
+ m_devices[i].guid.Data3,
+ m_devices[i].guid.Data4[0],
+ m_devices[i].guid.Data4[1],
+ m_devices[i].guid.Data4[2],
+ m_devices[i].guid.Data4[3],
+ m_devices[i].guid.Data4[4],
+ m_devices[i].guid.Data4[5],
+ m_devices[i].guid.Data4[6],
+ m_devices[i].guid.Data4[7]);
+ m_Device = temp;
+ }
- m_NumBuffers = (int)SendMessage(GetDlgItem(hWnd, IDC_BUFFERS_SLIDER), TBM_GETPOS, 0, 0);
+ m_NumBuffers = (int)SendMessage(GetDlgItem(hWnd, IDC_BUFFERS_SLIDER), TBM_GETPOS, 0, 0);
- if (m_NumBuffers < 2)
- m_NumBuffers = 2;
- if (m_NumBuffers > MAX_BUFFER_COUNT)
- m_NumBuffers = MAX_BUFFER_COUNT;
+ if (m_NumBuffers < 2)
+ m_NumBuffers = 2;
+ if (m_NumBuffers > MAX_BUFFER_COUNT)
+ m_NumBuffers = MAX_BUFFER_COUNT;
- EndDialog(hWnd, 0);
- } break;
+ EndDialog(hWnd, 0);
+ }
+ break;
- case IDCANCEL:
- EndDialog(hWnd, 0);
- break;
+ case IDCANCEL:
+ EndDialog(hWnd, 0);
+ break;
- HANDLE_CHECK(IDC_GLOBALFOCUS_DISABLE, m_DisableGlobalFocus);
- HANDLE_CHECK(IDC_USE_HARDWARE, m_UseHardware);
+ HANDLE_CHECK(IDC_GLOBALFOCUS_DISABLE, m_DisableGlobalFocus);
+ HANDLE_CHECK(IDC_USE_HARDWARE, m_UseHardware);
- default:
- return FALSE;
- }
- } break;
+ default:
+ return FALSE;
+ }
+ }
+ break;
- case WM_HSCROLL: {
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- switch (wmId) {
- case TB_LINEUP:
- case TB_LINEDOWN:
- case TB_PAGEUP:
- case TB_PAGEDOWN:
- case TB_TOP:
- case TB_BOTTOM:
- wmEvent = (int)SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);
- case TB_THUMBPOSITION:
- case TB_THUMBTRACK: {
- wchar_t temp[128];
- if (wmEvent < 2)
- wmEvent = 2;
- if (wmEvent > MAX_BUFFER_COUNT)
- wmEvent = MAX_BUFFER_COUNT;
- SendMessage((HWND)lParam, TBM_SETPOS, TRUE, wmEvent);
- swprintf_s(temp, L"%d (%d ms latency)", wmEvent, 1000 / (96000 / (wmEvent * BufferSize)));
- SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp);
- break;
- }
- default:
- return FALSE;
- }
- } break;
+ case WM_HSCROLL:
+ {
+ wmId = LOWORD(wParam);
+ wmEvent = HIWORD(wParam);
+ switch (wmId)
+ {
+ case TB_LINEUP:
+ case TB_LINEDOWN:
+ case TB_PAGEUP:
+ case TB_PAGEDOWN:
+ case TB_TOP:
+ case TB_BOTTOM:
+ wmEvent = (int)SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);
+ case TB_THUMBPOSITION:
+ case TB_THUMBTRACK:
+ {
+ wchar_t temp[128];
+ if (wmEvent < 2)
+ wmEvent = 2;
+ if (wmEvent > MAX_BUFFER_COUNT)
+ wmEvent = MAX_BUFFER_COUNT;
+ SendMessage((HWND)lParam, TBM_SETPOS, TRUE, wmEvent);
+ swprintf_s(temp, L"%d (%d ms latency)", wmEvent, 1000 / (96000 / (wmEvent * BufferSize)));
+ SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp);
+ break;
+ }
+ default:
+ return FALSE;
+ }
+ }
+ break;
- default:
- return FALSE;
- }
- return TRUE;
- }
+ default:
+ return FALSE;
+ }
+ return TRUE;
+ }
- static BOOL CALLBACK ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
- static BOOL CALLBACK DSEnumCallback(LPGUID lpGuid, LPCTSTR lpcstrDescription, LPCTSTR lpcstrModule, LPVOID lpContext);
+ static BOOL CALLBACK ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+ static BOOL CALLBACK DSEnumCallback(LPGUID lpGuid, LPCTSTR lpcstrDescription, LPCTSTR lpcstrModule, LPVOID lpContext);
public:
- virtual void Configure(uptr parent)
- {
- INT_PTR ret;
- ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DSOUND), (HWND)parent, (DLGPROC)ConfigProc, 1);
- if (ret == -1) {
- MessageBox((HWND)parent, L"Error Opening the config dialog.", L"OMG ERROR!", MB_OK | MB_SETFOREGROUND);
- return;
- }
- }
+ virtual void Configure(uptr parent)
+ {
+ INT_PTR ret;
+ ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DSOUND), (HWND)parent, (DLGPROC)ConfigProc, 1);
+ if (ret == -1)
+ {
+ MessageBox((HWND)parent, L"Error Opening the config dialog.", L"OMG ERROR!", MB_OK | MB_SETFOREGROUND);
+ return;
+ }
+ }
- s32 Test() const
- {
- return 0;
- }
+ s32 Test() const
+ {
+ return 0;
+ }
- int GetEmptySampleCount()
- {
- DWORD play, write;
- buffer->GetCurrentPosition(&play, &write);
+ int GetEmptySampleCount()
+ {
+ DWORD play, write;
+ buffer->GetCurrentPosition(&play, &write);
- // Note: Dsound's write cursor is bogus. Use our own instead:
+ // Note: Dsound's write cursor is bogus. Use our own instead:
- int empty = play - myLastWrite;
- if (empty < 0)
- empty = -empty;
+ int empty = play - myLastWrite;
+ if (empty < 0)
+ empty = -empty;
- return empty / 2;
- }
+ return empty / 2;
+ }
- const wchar_t *GetIdent() const
- {
- return L"dsound";
- }
+ const wchar_t* GetIdent() const
+ {
+ return L"dsound";
+ }
- const wchar_t *GetLongName() const
- {
- return L"DirectSound (Nice)";
- }
+ const wchar_t* GetLongName() const
+ {
+ return L"DirectSound (Nice)";
+ }
- void ReadSettings()
- {
- CfgReadStr(L"DSOUNDOUT", L"Device", m_Device, L"default");
- m_NumBuffers = CfgReadInt(L"DSOUNDOUT", L"Buffer_Count", 5);
- m_DisableGlobalFocus = CfgReadBool(L"DSOUNDOUT", L"Disable_Global_Focus", false);
- m_UseHardware = CfgReadBool(L"DSOUNDOUT", L"Use_Hardware", false);
+ void ReadSettings()
+ {
+ CfgReadStr(L"DSOUNDOUT", L"Device", m_Device, L"default");
+ m_NumBuffers = CfgReadInt(L"DSOUNDOUT", L"Buffer_Count", 5);
+ m_DisableGlobalFocus = CfgReadBool(L"DSOUNDOUT", L"Disable_Global_Focus", false);
+ m_UseHardware = CfgReadBool(L"DSOUNDOUT", L"Use_Hardware", false);
- Clampify(m_NumBuffers, (u8)3, (u8)8);
- }
+ Clampify(m_NumBuffers, (u8)3, (u8)8);
+ }
- void SetApiSettings(wxString api)
- {
- }
+ void SetApiSettings(wxString api)
+ {
+ }
- void WriteSettings() const
- {
- CfgWriteStr(L"DSOUNDOUT", L"Device", m_Device.empty() ? L"default" : m_Device);
- CfgWriteInt(L"DSOUNDOUT", L"Buffer_Count", m_NumBuffers);
- CfgWriteBool(L"DSOUNDOUT", L"Disable_Global_Focus", m_DisableGlobalFocus);
- CfgWriteBool(L"DSOUNDOUT", L"Use_Hardware", m_UseHardware);
- }
+ void WriteSettings() const
+ {
+ CfgWriteStr(L"DSOUNDOUT", L"Device", m_Device.empty() ? L"default" : m_Device);
+ CfgWriteInt(L"DSOUNDOUT", L"Buffer_Count", m_NumBuffers);
+ CfgWriteBool(L"DSOUNDOUT", L"Disable_Global_Focus", m_DisableGlobalFocus);
+ CfgWriteBool(L"DSOUNDOUT", L"Use_Hardware", m_UseHardware);
+ }
} static DS;
BOOL CALLBACK DSound::ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- return DS._ConfigProc(hWnd, uMsg, wParam, lParam);
+ return DS._ConfigProc(hWnd, uMsg, wParam, lParam);
}
BOOL CALLBACK DSound::DSEnumCallback(LPGUID lpGuid, LPCTSTR lpcstrDescription, LPCTSTR lpcstrModule, LPVOID lpContext)
{
- pxAssume(DSoundOut != NULL);
- return DS._DSEnumCallback(lpGuid, lpcstrDescription, lpcstrModule, lpContext);
+ pxAssume(DSoundOut != NULL);
+ return DS._DSEnumCallback(lpGuid, lpcstrDescription, lpcstrModule, lpContext);
}
-SndOutModule *DSoundOut = &DS;
+SndOutModule* DSoundOut = &DS;
diff --git a/pcsx2/SPU2/Windows/SndOut_XAudio2.cpp b/pcsx2/SPU2/Windows/SndOut_XAudio2.cpp
index 2a919e7d1e..8eccbbd819 100644
--- a/pcsx2/SPU2/Windows/SndOut_XAudio2.cpp
+++ b/pcsx2/SPU2/Windows/SndOut_XAudio2.cpp
@@ -27,395 +27,408 @@
namespace Exception
{
-class XAudio2Error : public std::runtime_error
-{
-private:
- static std::string CreateErrorMessage(const HRESULT result, const std::string &msg)
- {
- std::stringstream ss;
- ss << " (code 0x" << std::hex << result << ")\n\n";
- switch (result) {
- case XAUDIO2_E_INVALID_CALL:
- ss << "Invalid call for the XA2 object state.";
- break;
- case XAUDIO2_E_DEVICE_INVALIDATED:
- ss << "Device is unavailable, unplugged, unsupported, or has been consumed by The Nothing.";
- break;
- default:
- ss << "Unknown error code!";
- break;
- }
- return msg + ss.str();
- }
+ class XAudio2Error : public std::runtime_error
+ {
+ private:
+ static std::string CreateErrorMessage(const HRESULT result, const std::string& msg)
+ {
+ std::stringstream ss;
+ ss << " (code 0x" << std::hex << result << ")\n\n";
+ switch (result)
+ {
+ case XAUDIO2_E_INVALID_CALL:
+ ss << "Invalid call for the XA2 object state.";
+ break;
+ case XAUDIO2_E_DEVICE_INVALIDATED:
+ ss << "Device is unavailable, unplugged, unsupported, or has been consumed by The Nothing.";
+ break;
+ default:
+ ss << "Unknown error code!";
+ break;
+ }
+ return msg + ss.str();
+ }
-public:
- explicit XAudio2Error(const HRESULT result, const std::string &msg)
- : std::runtime_error(CreateErrorMessage(result, msg))
- {
- }
-};
-}
+ public:
+ explicit XAudio2Error(const HRESULT result, const std::string& msg)
+ : std::runtime_error(CreateErrorMessage(result, msg))
+ {
+ }
+ };
+} // namespace Exception
static const double SndOutNormalizer = (double)(1UL << (SndOutVolumeShift + 16));
class XAudio2Mod : public SndOutModule
{
private:
- static const int PacketsPerBuffer = 8;
- static const int MAX_BUFFER_COUNT = 3;
+ static const int PacketsPerBuffer = 8;
+ static const int MAX_BUFFER_COUNT = 3;
- class BaseStreamingVoice : public IXAudio2VoiceCallback
- {
- protected:
- IXAudio2SourceVoice *pSourceVoice;
- std::unique_ptr m_buffer;
+ class BaseStreamingVoice : public IXAudio2VoiceCallback
+ {
+ protected:
+ IXAudio2SourceVoice* pSourceVoice;
+ std::unique_ptr m_buffer;
- const uint m_nBuffers;
- const uint m_nChannels;
- const uint m_BufferSize;
- const uint m_BufferSizeBytes;
+ const uint m_nBuffers;
+ const uint m_nChannels;
+ const uint m_BufferSize;
+ const uint m_BufferSizeBytes;
- CRITICAL_SECTION cs;
+ CRITICAL_SECTION cs;
- public:
- int GetEmptySampleCount()
- {
- XAUDIO2_VOICE_STATE state;
- pSourceVoice->GetState(&state);
- return state.SamplesPlayed & (m_BufferSize - 1);
- }
+ public:
+ int GetEmptySampleCount()
+ {
+ XAUDIO2_VOICE_STATE state;
+ pSourceVoice->GetState(&state);
+ return state.SamplesPlayed & (m_BufferSize - 1);
+ }
- virtual ~BaseStreamingVoice()
- {
- DeleteCriticalSection(&cs);
- }
+ virtual ~BaseStreamingVoice()
+ {
+ DeleteCriticalSection(&cs);
+ }
- BaseStreamingVoice(uint numChannels)
- : pSourceVoice(nullptr)
- , m_nBuffers(Config_XAudio2.NumBuffers)
- , m_nChannels(numChannels)
- , m_BufferSize(SndOutPacketSize * m_nChannels * PacketsPerBuffer)
- , m_BufferSizeBytes(m_BufferSize * sizeof(s16))
- {
- InitializeCriticalSection(&cs);
- }
+ BaseStreamingVoice(uint numChannels)
+ : pSourceVoice(nullptr)
+ , m_nBuffers(Config_XAudio2.NumBuffers)
+ , m_nChannels(numChannels)
+ , m_BufferSize(SndOutPacketSize * m_nChannels * PacketsPerBuffer)
+ , m_BufferSizeBytes(m_BufferSize * sizeof(s16))
+ {
+ InitializeCriticalSection(&cs);
+ }
- virtual void Init(IXAudio2 *pXAudio2) = 0;
+ virtual void Init(IXAudio2* pXAudio2) = 0;
- protected:
- // Several things must be initialized separate of the constructor, due to the fact that
- // virtual calls can't be made from the constructor's context.
- void _init(IXAudio2 *pXAudio2, uint chanConfig)
- {
- WAVEFORMATEXTENSIBLE wfx;
+ protected:
+ // Several things must be initialized separate of the constructor, due to the fact that
+ // virtual calls can't be made from the constructor's context.
+ void _init(IXAudio2* pXAudio2, uint chanConfig)
+ {
+ WAVEFORMATEXTENSIBLE wfx;
- memset(&wfx, 0, sizeof(WAVEFORMATEXTENSIBLE));
- wfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
- wfx.Format.nSamplesPerSec = SampleRate;
- wfx.Format.nChannels = m_nChannels;
- wfx.Format.wBitsPerSample = 16;
- wfx.Format.nBlockAlign = wfx.Format.nChannels * wfx.Format.wBitsPerSample / 8;
- wfx.Format.nAvgBytesPerSec = SampleRate * wfx.Format.nBlockAlign;
- wfx.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
- wfx.Samples.wValidBitsPerSample = 16;
- wfx.dwChannelMask = chanConfig;
- wfx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
+ memset(&wfx, 0, sizeof(WAVEFORMATEXTENSIBLE));
+ wfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+ wfx.Format.nSamplesPerSec = SampleRate;
+ wfx.Format.nChannels = m_nChannels;
+ wfx.Format.wBitsPerSample = 16;
+ wfx.Format.nBlockAlign = wfx.Format.nChannels * wfx.Format.wBitsPerSample / 8;
+ wfx.Format.nAvgBytesPerSec = SampleRate * wfx.Format.nBlockAlign;
+ wfx.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
+ wfx.Samples.wValidBitsPerSample = 16;
+ wfx.dwChannelMask = chanConfig;
+ wfx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
- HRESULT hr;
- if (FAILED(hr = pXAudio2->CreateSourceVoice(&pSourceVoice, (WAVEFORMATEX *)&wfx,
- XAUDIO2_VOICE_NOSRC, 1.0f, this))) {
- throw Exception::XAudio2Error(hr, "XAudio2 CreateSourceVoice failure: ");
- }
+ HRESULT hr;
+ if (FAILED(hr = pXAudio2->CreateSourceVoice(&pSourceVoice, (WAVEFORMATEX*)&wfx,
+ XAUDIO2_VOICE_NOSRC, 1.0f, this)))
+ {
+ throw Exception::XAudio2Error(hr, "XAudio2 CreateSourceVoice failure: ");
+ }
- EnterCriticalSection(&cs);
+ EnterCriticalSection(&cs);
- pSourceVoice->FlushSourceBuffers();
- pSourceVoice->Start(0, 0);
+ pSourceVoice->FlushSourceBuffers();
+ pSourceVoice->Start(0, 0);
- m_buffer = std::make_unique(m_nBuffers * m_BufferSize);
+ m_buffer = std::make_unique(m_nBuffers * m_BufferSize);
- // Start some buffers.
- for (uint i = 0; i < m_nBuffers; i++) {
- XAUDIO2_BUFFER buf = {0};
- buf.AudioBytes = m_BufferSizeBytes;
- buf.pContext = &m_buffer[i * m_BufferSize];
- buf.pAudioData = (BYTE *)buf.pContext;
- pSourceVoice->SubmitSourceBuffer(&buf);
- }
+ // Start some buffers.
+ for (uint i = 0; i < m_nBuffers; i++)
+ {
+ XAUDIO2_BUFFER buf = {0};
+ buf.AudioBytes = m_BufferSizeBytes;
+ buf.pContext = &m_buffer[i * m_BufferSize];
+ buf.pAudioData = (BYTE*)buf.pContext;
+ pSourceVoice->SubmitSourceBuffer(&buf);
+ }
- LeaveCriticalSection(&cs);
- }
+ LeaveCriticalSection(&cs);
+ }
- STDMETHOD_(void, OnVoiceProcessingPassStart)
- () {}
- STDMETHOD_(void, OnVoiceProcessingPassStart)
- (UINT32) {}
- STDMETHOD_(void, OnVoiceProcessingPassEnd)
- () {}
- STDMETHOD_(void, OnStreamEnd)
- () {}
- STDMETHOD_(void, OnBufferStart)
- (void *) {}
- STDMETHOD_(void, OnLoopEnd)
- (void *) {}
- STDMETHOD_(void, OnVoiceError)
- (THIS_ void *pBufferContext, HRESULT Error) {}
- };
+ STDMETHOD_(void, OnVoiceProcessingPassStart)
+ () {}
+ STDMETHOD_(void, OnVoiceProcessingPassStart)
+ (UINT32) {}
+ STDMETHOD_(void, OnVoiceProcessingPassEnd)
+ () {}
+ STDMETHOD_(void, OnStreamEnd)
+ () {}
+ STDMETHOD_(void, OnBufferStart)
+ (void*) {}
+ STDMETHOD_(void, OnLoopEnd)
+ (void*) {}
+ STDMETHOD_(void, OnVoiceError)
+ (THIS_ void* pBufferContext, HRESULT Error) {}
+ };
- template
- class StreamingVoice : public BaseStreamingVoice
- {
- public:
- StreamingVoice()
- : BaseStreamingVoice(sizeof(T) / sizeof(s16))
- {
- }
+ template
+ class StreamingVoice : public BaseStreamingVoice
+ {
+ public:
+ StreamingVoice()
+ : BaseStreamingVoice(sizeof(T) / sizeof(s16))
+ {
+ }
- virtual ~StreamingVoice()
- {
- IXAudio2SourceVoice *killMe = pSourceVoice;
- // XXX: Potentially leads to a race condition that causes a nullptr
- // dereference when SubmitSourceBuffer is called in OnBufferEnd?
- pSourceVoice = nullptr;
- if (killMe != nullptr) {
- killMe->FlushSourceBuffers();
- killMe->DestroyVoice();
- }
+ virtual ~StreamingVoice()
+ {
+ IXAudio2SourceVoice* killMe = pSourceVoice;
+ // XXX: Potentially leads to a race condition that causes a nullptr
+ // dereference when SubmitSourceBuffer is called in OnBufferEnd?
+ pSourceVoice = nullptr;
+ if (killMe != nullptr)
+ {
+ killMe->FlushSourceBuffers();
+ killMe->DestroyVoice();
+ }
- // XXX: Not sure we even need a critical section - DestroyVoice is
- // blocking, and the documentation states no callbacks are called
- // or audio data is read after it returns, so it's safe to free up
- // resources.
- EnterCriticalSection(&cs);
- m_buffer = nullptr;
- LeaveCriticalSection(&cs);
- }
+ // XXX: Not sure we even need a critical section - DestroyVoice is
+ // blocking, and the documentation states no callbacks are called
+ // or audio data is read after it returns, so it's safe to free up
+ // resources.
+ EnterCriticalSection(&cs);
+ m_buffer = nullptr;
+ LeaveCriticalSection(&cs);
+ }
- void Init(IXAudio2 *pXAudio2)
- {
- int chanMask = 0;
- switch (m_nChannels) {
- case 1:
- chanMask |= SPEAKER_FRONT_CENTER;
- break;
- case 2:
- chanMask |= SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT;
- break;
- case 3:
- chanMask |= SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY;
- break;
- case 4:
- chanMask |= SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT;
- break;
- case 5:
- chanMask |= SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT;
- break;
- case 6:
- chanMask |= SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_LOW_FREQUENCY;
- break;
- case 8:
- chanMask |= SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT | SPEAKER_LOW_FREQUENCY;
- break;
- }
- _init(pXAudio2, chanMask);
- }
+ void Init(IXAudio2* pXAudio2)
+ {
+ int chanMask = 0;
+ switch (m_nChannels)
+ {
+ case 1:
+ chanMask |= SPEAKER_FRONT_CENTER;
+ break;
+ case 2:
+ chanMask |= SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT;
+ break;
+ case 3:
+ chanMask |= SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY;
+ break;
+ case 4:
+ chanMask |= SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT;
+ break;
+ case 5:
+ chanMask |= SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT;
+ break;
+ case 6:
+ chanMask |= SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_LOW_FREQUENCY;
+ break;
+ case 8:
+ chanMask |= SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT | SPEAKER_LOW_FREQUENCY;
+ break;
+ }
+ _init(pXAudio2, chanMask);
+ }
- protected:
- STDMETHOD_(void, OnBufferEnd)
- (void *context)
- {
- EnterCriticalSection(&cs);
+ protected:
+ STDMETHOD_(void, OnBufferEnd)
+ (void* context)
+ {
+ EnterCriticalSection(&cs);
- // All of these checks are necessary because XAudio2 is wonky shizat.
- // XXX: The pSourceVoice nullptr check seems a bit self-inflicted
- // due to the destructor logic.
- if (pSourceVoice == nullptr || context == nullptr) {
- LeaveCriticalSection(&cs);
- return;
- }
+ // All of these checks are necessary because XAudio2 is wonky shizat.
+ // XXX: The pSourceVoice nullptr check seems a bit self-inflicted
+ // due to the destructor logic.
+ if (pSourceVoice == nullptr || context == nullptr)
+ {
+ LeaveCriticalSection(&cs);
+ return;
+ }
- T *qb = (T *)context;
+ T* qb = (T*)context;
- for (int p = 0; p < PacketsPerBuffer; p++, qb += SndOutPacketSize)
- SndBuffer::ReadSamples(qb);
+ for (int p = 0; p < PacketsPerBuffer; p++, qb += SndOutPacketSize)
+ SndBuffer::ReadSamples(qb);
- XAUDIO2_BUFFER buf = {0};
- buf.AudioBytes = m_BufferSizeBytes;
- buf.pAudioData = (BYTE *)context;
- buf.pContext = context;
+ XAUDIO2_BUFFER buf = {0};
+ buf.AudioBytes = m_BufferSizeBytes;
+ buf.pAudioData = (BYTE*)context;
+ buf.pContext = context;
- pSourceVoice->SubmitSourceBuffer(&buf);
- LeaveCriticalSection(&cs);
- }
- };
+ pSourceVoice->SubmitSourceBuffer(&buf);
+ LeaveCriticalSection(&cs);
+ }
+ };
- HMODULE xAudio2DLL = nullptr;
- decltype(&XAudio2Create) pXAudio2Create = nullptr;
- CComPtr pXAudio2;
- IXAudio2MasteringVoice *pMasteringVoice = nullptr;
- std::unique_ptr m_voiceContext;
+ HMODULE xAudio2DLL = nullptr;
+ decltype(&XAudio2Create) pXAudio2Create = nullptr;
+ CComPtr pXAudio2;
+ IXAudio2MasteringVoice* pMasteringVoice = nullptr;
+ std::unique_ptr m_voiceContext;
public:
- s32 Init()
- {
- CoInitializeEx(nullptr, COINIT_MULTITHREADED);
+ s32 Init()
+ {
+ CoInitializeEx(nullptr, COINIT_MULTITHREADED);
- try {
- HRESULT hr;
+ try
+ {
+ HRESULT hr;
- xAudio2DLL = LoadLibraryEx(XAUDIO2_DLL, nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32);
- if (xAudio2DLL == nullptr)
- throw std::runtime_error("Could not load " XAUDIO2_DLL_A ". Error code:" + std::to_string(GetLastError()));
+ xAudio2DLL = LoadLibraryEx(XAUDIO2_DLL, nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32);
+ if (xAudio2DLL == nullptr)
+ throw std::runtime_error("Could not load " XAUDIO2_DLL_A ". Error code:" + std::to_string(GetLastError()));
- pXAudio2Create = reinterpret_cast(GetProcAddress(xAudio2DLL, "XAudio2Create"));
- if (pXAudio2Create == nullptr)
- throw std::runtime_error("XAudio2Create not found. Error code: " + std::to_string(GetLastError()));
+ pXAudio2Create = reinterpret_cast(GetProcAddress(xAudio2DLL, "XAudio2Create"));
+ if (pXAudio2Create == nullptr)
+ throw std::runtime_error("XAudio2Create not found. Error code: " + std::to_string(GetLastError()));
- if (FAILED(hr = pXAudio2Create(&pXAudio2, 0, XAUDIO2_DEFAULT_PROCESSOR)))
- throw Exception::XAudio2Error(hr, "Failed to init XAudio2 engine. Error Details:");
+ if (FAILED(hr = pXAudio2Create(&pXAudio2, 0, XAUDIO2_DEFAULT_PROCESSOR)))
+ throw Exception::XAudio2Error(hr, "Failed to init XAudio2 engine. Error Details:");
- // Stereo Expansion was planned to grab the currently configured number of
- // Speakers from Windows's audio config.
- // This doesn't always work though, so let it be a user configurable option.
+ // Stereo Expansion was planned to grab the currently configured number of
+ // Speakers from Windows's audio config.
+ // This doesn't always work though, so let it be a user configurable option.
- int speakers;
- // speakers = (numSpeakers + 1) *2; ?
- switch (numSpeakers) {
- case 0: // Stereo
- speakers = 2;
- break;
- case 1: // Quadrafonic
- speakers = 4;
- break;
- case 2: // Surround 5.1
- speakers = 6;
- break;
- case 3: // Surround 7.1
- speakers = 8;
- break;
- default:
- speakers = 2;
- }
+ int speakers;
+ // speakers = (numSpeakers + 1) *2; ?
+ switch (numSpeakers)
+ {
+ case 0: // Stereo
+ speakers = 2;
+ break;
+ case 1: // Quadrafonic
+ speakers = 4;
+ break;
+ case 2: // Surround 5.1
+ speakers = 6;
+ break;
+ case 3: // Surround 7.1
+ speakers = 8;
+ break;
+ default:
+ speakers = 2;
+ }
- if (FAILED(hr = pXAudio2->CreateMasteringVoice(&pMasteringVoice, speakers, SampleRate)))
- throw Exception::XAudio2Error(hr, "Failed creating mastering voice: ");
+ if (FAILED(hr = pXAudio2->CreateMasteringVoice(&pMasteringVoice, speakers, SampleRate)))
+ throw Exception::XAudio2Error(hr, "Failed creating mastering voice: ");
- switch (speakers) {
- case 2:
- ConLog("* SPU2 > Using normal 2 speaker stereo output.\n");
- m_voiceContext = std::make_unique>();
- break;
- case 3:
- ConLog("* SPU2 > 2.1 speaker expansion enabled.\n");
- m_voiceContext = std::make_unique>();
- break;
- case 4:
- ConLog("* SPU2 > 4 speaker expansion enabled [quadraphenia]\n");
- m_voiceContext = std::make_unique>();
- break;
- case 5:
- ConLog("* SPU2 > 4.1 speaker expansion enabled.\n");
- m_voiceContext = std::make_unique>();
- break;
- case 6:
- case 7:
- switch (dplLevel) {
- case 0: // "normal" stereo upmix
- ConLog("* SPU2 > 5.1 speaker expansion enabled.\n");
- m_voiceContext = std::make_unique>();
- break;
- case 1: // basic Dpl decoder without rear stereo balancing
- ConLog("* SPU2 > 5.1 speaker expansion with basic ProLogic dematrixing enabled.\n");
- m_voiceContext = std::make_unique>();
- break;
- case 2: // gigas PLII
- ConLog("* SPU2 > 5.1 speaker expansion with experimental ProLogicII dematrixing enabled.\n");
- m_voiceContext = std::make_unique>();
- break;
- }
- break;
- default: // anything 8 or more gets the 7.1 treatment!
- ConLog("* SPU2 > 7.1 speaker expansion enabled.\n");
- m_voiceContext = std::make_unique>();
- break;
- }
+ switch (speakers)
+ {
+ case 2:
+ ConLog("* SPU2 > Using normal 2 speaker stereo output.\n");
+ m_voiceContext = std::make_unique>();
+ break;
+ case 3:
+ ConLog("* SPU2 > 2.1 speaker expansion enabled.\n");
+ m_voiceContext = std::make_unique>();
+ break;
+ case 4:
+ ConLog("* SPU2 > 4 speaker expansion enabled [quadraphenia]\n");
+ m_voiceContext = std::make_unique>();
+ break;
+ case 5:
+ ConLog("* SPU2 > 4.1 speaker expansion enabled.\n");
+ m_voiceContext = std::make_unique>();
+ break;
+ case 6:
+ case 7:
+ switch (dplLevel)
+ {
+ case 0: // "normal" stereo upmix
+ ConLog("* SPU2 > 5.1 speaker expansion enabled.\n");
+ m_voiceContext = std::make_unique>();
+ break;
+ case 1: // basic Dpl decoder without rear stereo balancing
+ ConLog("* SPU2 > 5.1 speaker expansion with basic ProLogic dematrixing enabled.\n");
+ m_voiceContext = std::make_unique>();
+ break;
+ case 2: // gigas PLII
+ ConLog("* SPU2 > 5.1 speaker expansion with experimental ProLogicII dematrixing enabled.\n");
+ m_voiceContext = std::make_unique>();
+ break;
+ }
+ break;
+ default: // anything 8 or more gets the 7.1 treatment!
+ ConLog("* SPU2 > 7.1 speaker expansion enabled.\n");
+ m_voiceContext = std::make_unique>();
+ break;
+ }
- m_voiceContext->Init(pXAudio2);
- } catch (std::runtime_error &ex) {
- SysMessage(ex.what());
- Close();
- return -1;
- }
+ m_voiceContext->Init(pXAudio2);
+ }
+ catch (std::runtime_error& ex)
+ {
+ SysMessage(ex.what());
+ Close();
+ return -1;
+ }
- return 0;
- }
+ return 0;
+ }
- void Close()
- {
- // Clean up?
- // All XAudio2 interfaces are released when the engine is destroyed,
- // but being tidy never hurt.
+ void Close()
+ {
+ // Clean up?
+ // All XAudio2 interfaces are released when the engine is destroyed,
+ // but being tidy never hurt.
- // Actually it can hurt. As of DXSDK Aug 2008, doing a full cleanup causes
- // XA2 on Vista to crash. Even if you copy/paste code directly from Microsoft.
- // But doing no cleanup at all causes XA2 under XP to crash. So after much trial
- // and error we found a happy compromise as follows:
+ // Actually it can hurt. As of DXSDK Aug 2008, doing a full cleanup causes
+ // XA2 on Vista to crash. Even if you copy/paste code directly from Microsoft.
+ // But doing no cleanup at all causes XA2 under XP to crash. So after much trial
+ // and error we found a happy compromise as follows:
- m_voiceContext = nullptr;
+ m_voiceContext = nullptr;
- if (pMasteringVoice != nullptr)
- pMasteringVoice->DestroyVoice();
+ if (pMasteringVoice != nullptr)
+ pMasteringVoice->DestroyVoice();
- pMasteringVoice = nullptr;
+ pMasteringVoice = nullptr;
- pXAudio2.Release();
- CoUninitialize();
+ pXAudio2.Release();
+ CoUninitialize();
- if (xAudio2DLL) {
- FreeLibrary(xAudio2DLL);
- xAudio2DLL = nullptr;
- pXAudio2Create = nullptr;
- }
- }
+ if (xAudio2DLL)
+ {
+ FreeLibrary(xAudio2DLL);
+ xAudio2DLL = nullptr;
+ pXAudio2Create = nullptr;
+ }
+ }
- virtual void Configure(uptr parent)
- {
- }
+ virtual void Configure(uptr parent)
+ {
+ }
- s32 Test() const
- {
- return 0;
- }
+ s32 Test() const
+ {
+ return 0;
+ }
- int GetEmptySampleCount()
- {
- if (m_voiceContext == nullptr)
- return 0;
- return m_voiceContext->GetEmptySampleCount();
- }
+ int GetEmptySampleCount()
+ {
+ if (m_voiceContext == nullptr)
+ return 0;
+ return m_voiceContext->GetEmptySampleCount();
+ }
- const wchar_t *GetIdent() const
- {
- return L"xaudio2";
- }
+ const wchar_t* GetIdent() const
+ {
+ return L"xaudio2";
+ }
- const wchar_t *GetLongName() const
- {
- return L"XAudio 2 (Recommended)";
- }
+ const wchar_t* GetLongName() const
+ {
+ return L"XAudio 2 (Recommended)";
+ }
- void ReadSettings()
- {
- }
+ void ReadSettings()
+ {
+ }
- void SetApiSettings(wxString api)
- {
- }
+ void SetApiSettings(wxString api)
+ {
+ }
- void WriteSettings() const
- {
- }
+ void WriteSettings() const
+ {
+ }
} static XA2;
-SndOutModule *XAudio2Out = &XA2;
+SndOutModule* XAudio2Out = &XA2;
diff --git a/pcsx2/SPU2/Windows/SndOut_waveOut.cpp b/pcsx2/SPU2/Windows/SndOut_waveOut.cpp
index ab067bd828..82f56691db 100644
--- a/pcsx2/SPU2/Windows/SndOut_waveOut.cpp
+++ b/pcsx2/SPU2/Windows/SndOut_waveOut.cpp
@@ -20,75 +20,77 @@
class WaveOutModule : public SndOutModule
{
private:
- static const uint MAX_BUFFER_COUNT = 8;
+ static const uint MAX_BUFFER_COUNT = 8;
- static const int PacketsPerBuffer = (1024 / SndOutPacketSize);
- static const int BufferSize = SndOutPacketSize * PacketsPerBuffer;
+ static const int PacketsPerBuffer = (1024 / SndOutPacketSize);
+ static const int BufferSize = SndOutPacketSize * PacketsPerBuffer;
- u32 numBuffers;
- HWAVEOUT hwodevice;
- WAVEFORMATEX wformat;
- WAVEHDR whbuffer[MAX_BUFFER_COUNT];
+ u32 numBuffers;
+ HWAVEOUT hwodevice;
+ WAVEFORMATEX wformat;
+ WAVEHDR whbuffer[MAX_BUFFER_COUNT];
- StereoOut16 *qbuffer;
+ StereoOut16* qbuffer;
#define QBUFFER(x) (qbuffer + BufferSize * (x))
- bool waveout_running;
- HANDLE thread;
- DWORD tid;
+ bool waveout_running;
+ HANDLE thread;
+ DWORD tid;
- wchar_t ErrText[256];
+ wchar_t ErrText[256];
- template
- DWORD CALLBACK Thread()
- {
- static const int BufferSizeBytes = BufferSize * sizeof(T);
+ template
+ DWORD CALLBACK Thread()
+ {
+ static const int BufferSizeBytes = BufferSize * sizeof(T);
- while (waveout_running) {
- bool didsomething = false;
- for (u32 i = 0; i < numBuffers; i++) {
- if (!(whbuffer[i].dwFlags & WHDR_DONE))
- continue;
+ while (waveout_running)
+ {
+ bool didsomething = false;
+ for (u32 i = 0; i < numBuffers; i++)
+ {
+ if (!(whbuffer[i].dwFlags & WHDR_DONE))
+ continue;
- WAVEHDR *buf = whbuffer + i;
+ WAVEHDR* buf = whbuffer + i;
- buf->dwBytesRecorded = buf->dwBufferLength;
+ buf->dwBytesRecorded = buf->dwBufferLength;
- T *t = (T *)buf->lpData;
- for (int p = 0; p < PacketsPerBuffer; p++, t += SndOutPacketSize)
- SndBuffer::ReadSamples(t);
+ T* t = (T*)buf->lpData;
+ for (int p = 0; p < PacketsPerBuffer; p++, t += SndOutPacketSize)
+ SndBuffer::ReadSamples(t);
- whbuffer[i].dwFlags &= ~WHDR_DONE;
- waveOutWrite(hwodevice, buf, sizeof(WAVEHDR));
- didsomething = true;
- }
+ whbuffer[i].dwFlags &= ~WHDR_DONE;
+ waveOutWrite(hwodevice, buf, sizeof(WAVEHDR));
+ didsomething = true;
+ }
- if (didsomething)
- Sleep(1);
- else
- Sleep(0);
- }
- return 0;
- }
+ if (didsomething)
+ Sleep(1);
+ else
+ Sleep(0);
+ }
+ return 0;
+ }
- template
- static DWORD CALLBACK RThread(WaveOutModule *obj)
- {
- return obj->Thread();
- }
+ template
+ static DWORD CALLBACK RThread(WaveOutModule* obj)
+ {
+ return obj->Thread();
+ }
public:
- s32 Init()
- {
- numBuffers = Config_WaveOut.NumBuffers;
+ s32 Init()
+ {
+ numBuffers = Config_WaveOut.NumBuffers;
- MMRESULT woores;
+ MMRESULT woores;
- if (Test())
- return -1;
+ if (Test())
+ return -1;
-// TODO : Use dsound to determine the speaker configuration, and expand audio from there.
+ // TODO : Use dsound to determine the speaker configuration, and expand audio from there.
#if 0
int speakerConfig;
@@ -129,193 +131,203 @@ public:
}
#endif
- wformat.wFormatTag = WAVE_FORMAT_PCM;
- wformat.nSamplesPerSec = SampleRate;
- wformat.wBitsPerSample = 16;
- wformat.nChannels = 2;
- wformat.nBlockAlign = ((wformat.wBitsPerSample * wformat.nChannels) / 8);
- wformat.nAvgBytesPerSec = (wformat.nSamplesPerSec * wformat.nBlockAlign);
- wformat.cbSize = 0;
+ wformat.wFormatTag = WAVE_FORMAT_PCM;
+ wformat.nSamplesPerSec = SampleRate;
+ wformat.wBitsPerSample = 16;
+ wformat.nChannels = 2;
+ wformat.nBlockAlign = ((wformat.wBitsPerSample * wformat.nChannels) / 8);
+ wformat.nAvgBytesPerSec = (wformat.nSamplesPerSec * wformat.nBlockAlign);
+ wformat.cbSize = 0;
- qbuffer = new StereoOut16[BufferSize * numBuffers];
+ qbuffer = new StereoOut16[BufferSize * numBuffers];
- woores = waveOutOpen(&hwodevice, WAVE_MAPPER, &wformat, 0, 0, 0);
- if (woores != MMSYSERR_NOERROR) {
- waveOutGetErrorText(woores, (wchar_t *)&ErrText, 255);
- SysMessage("WaveOut Error: %s", ErrText);
- return -1;
- }
+ woores = waveOutOpen(&hwodevice, WAVE_MAPPER, &wformat, 0, 0, 0);
+ if (woores != MMSYSERR_NOERROR)
+ {
+ waveOutGetErrorText(woores, (wchar_t*)&ErrText, 255);
+ SysMessage("WaveOut Error: %s", ErrText);
+ return -1;
+ }
- const int BufferSizeBytes = wformat.nBlockAlign * BufferSize;
+ const int BufferSizeBytes = wformat.nBlockAlign * BufferSize;
- for (u32 i = 0; i < numBuffers; i++) {
- whbuffer[i].dwBufferLength = BufferSizeBytes;
- whbuffer[i].dwBytesRecorded = BufferSizeBytes;
- whbuffer[i].dwFlags = 0;
- whbuffer[i].dwLoops = 0;
- whbuffer[i].dwUser = 0;
- whbuffer[i].lpData = (LPSTR)QBUFFER(i);
- whbuffer[i].lpNext = 0;
- whbuffer[i].reserved = 0;
- waveOutPrepareHeader(hwodevice, whbuffer + i, sizeof(WAVEHDR));
- whbuffer[i].dwFlags |= WHDR_DONE; //avoid deadlock
- }
+ for (u32 i = 0; i < numBuffers; i++)
+ {
+ whbuffer[i].dwBufferLength = BufferSizeBytes;
+ whbuffer[i].dwBytesRecorded = BufferSizeBytes;
+ whbuffer[i].dwFlags = 0;
+ whbuffer[i].dwLoops = 0;
+ whbuffer[i].dwUser = 0;
+ whbuffer[i].lpData = (LPSTR)QBUFFER(i);
+ whbuffer[i].lpNext = 0;
+ whbuffer[i].reserved = 0;
+ waveOutPrepareHeader(hwodevice, whbuffer + i, sizeof(WAVEHDR));
+ whbuffer[i].dwFlags |= WHDR_DONE; //avoid deadlock
+ }
- // Start Thread
- // [Air]: The waveout code does not use wait objects, so setting a time critical
- // priority level is a bad idea. Standard priority will do fine. The buffer will get the
- // love it needs and won't suck resources idling pointlessly. Just don't try to
- // run it in uber-low-latency mode.
- waveout_running = true;
- thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RThread, this, 0, &tid);
+ // Start Thread
+ // [Air]: The waveout code does not use wait objects, so setting a time critical
+ // priority level is a bad idea. Standard priority will do fine. The buffer will get the
+ // love it needs and won't suck resources idling pointlessly. Just don't try to
+ // run it in uber-low-latency mode.
+ waveout_running = true;
+ thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RThread, this, 0, &tid);
- return 0;
- }
+ return 0;
+ }
- void Close()
- {
- // Stop Thread
- fprintf(stderr, "* SPU2-X: Waiting for waveOut thread to finish...");
- waveout_running = false;
+ void Close()
+ {
+ // Stop Thread
+ fprintf(stderr, "* SPU2-X: Waiting for waveOut thread to finish...");
+ waveout_running = false;
- WaitForSingleObject(thread, INFINITE);
- CloseHandle(thread);
+ WaitForSingleObject(thread, INFINITE);
+ CloseHandle(thread);
- fprintf(stderr, " Done.\n");
+ fprintf(stderr, " Done.\n");
- //
- // Clean up
- //
- waveOutReset(hwodevice);
- for (u32 i = 0; i < numBuffers; i++) {
- waveOutUnprepareHeader(hwodevice, &whbuffer[i], sizeof(WAVEHDR));
- }
- waveOutClose(hwodevice);
+ //
+ // Clean up
+ //
+ waveOutReset(hwodevice);
+ for (u32 i = 0; i < numBuffers; i++)
+ {
+ waveOutUnprepareHeader(hwodevice, &whbuffer[i], sizeof(WAVEHDR));
+ }
+ waveOutClose(hwodevice);
- safe_delete_array(qbuffer);
- }
+ safe_delete_array(qbuffer);
+ }
private:
- static BOOL CALLBACK ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- int wmId, wmEvent;
+ static BOOL CALLBACK ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+ {
+ int wmId, wmEvent;
- switch (uMsg) {
- case WM_INITDIALOG:
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
- wchar_t temp[128];
- INIT_SLIDER(IDC_BUFFERS_SLIDER, 3, MAX_BUFFER_COUNT, 2, 1, 1);
- SendMessage(GetDlgItem(hWnd, IDC_BUFFERS_SLIDER), TBM_SETPOS, TRUE, Config_WaveOut.NumBuffers);
- swprintf_s(temp, 128, L"%d (%d ms latency)", Config_WaveOut.NumBuffers, 1000 / (96000 / (Config_WaveOut.NumBuffers * BufferSize)));
- SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp);
- break;
+ wchar_t temp[128];
+ INIT_SLIDER(IDC_BUFFERS_SLIDER, 3, MAX_BUFFER_COUNT, 2, 1, 1);
+ SendMessage(GetDlgItem(hWnd, IDC_BUFFERS_SLIDER), TBM_SETPOS, TRUE, Config_WaveOut.NumBuffers);
+ swprintf_s(temp, 128, L"%d (%d ms latency)", Config_WaveOut.NumBuffers, 1000 / (96000 / (Config_WaveOut.NumBuffers * BufferSize)));
+ SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp);
+ break;
- case WM_COMMAND:
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // Parse the menu selections:
- switch (wmId) {
- case IDOK: {
- Config_WaveOut.NumBuffers = (int)SendMessage(GetDlgItem(hWnd, IDC_BUFFERS_SLIDER), TBM_GETPOS, 0, 0);
+ case WM_COMMAND:
+ wmId = LOWORD(wParam);
+ wmEvent = HIWORD(wParam);
+ // Parse the menu selections:
+ switch (wmId)
+ {
+ case IDOK:
+ {
+ Config_WaveOut.NumBuffers = (int)SendMessage(GetDlgItem(hWnd, IDC_BUFFERS_SLIDER), TBM_GETPOS, 0, 0);
- if (Config_WaveOut.NumBuffers < 3)
- Config_WaveOut.NumBuffers = 3;
- if (Config_WaveOut.NumBuffers > MAX_BUFFER_COUNT)
- Config_WaveOut.NumBuffers = MAX_BUFFER_COUNT;
- }
- EndDialog(hWnd, 0);
- break;
- case IDCANCEL:
- EndDialog(hWnd, 0);
- break;
- default:
- return FALSE;
- }
- break;
+ if (Config_WaveOut.NumBuffers < 3)
+ Config_WaveOut.NumBuffers = 3;
+ if (Config_WaveOut.NumBuffers > MAX_BUFFER_COUNT)
+ Config_WaveOut.NumBuffers = MAX_BUFFER_COUNT;
+ }
+ EndDialog(hWnd, 0);
+ break;
+ case IDCANCEL:
+ EndDialog(hWnd, 0);
+ break;
+ default:
+ return FALSE;
+ }
+ break;
- case WM_HSCROLL:
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- switch (wmId) {
- case TB_LINEUP:
- case TB_LINEDOWN:
- case TB_PAGEUP:
- case TB_PAGEDOWN:
- case TB_TOP:
- case TB_BOTTOM:
- wmEvent = (int)SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);
- case TB_THUMBPOSITION:
- case TB_THUMBTRACK:
- if (wmEvent < 3)
- wmEvent = 3;
- if (wmEvent > MAX_BUFFER_COUNT)
- wmEvent = MAX_BUFFER_COUNT;
- SendMessage((HWND)lParam, TBM_SETPOS, TRUE, wmEvent);
- swprintf_s(temp, L"%d (%d ms latency)", wmEvent, 1000 / (96000 / (wmEvent * BufferSize)));
- SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp);
- break;
- default:
- return FALSE;
- }
- break;
+ case WM_HSCROLL:
+ wmId = LOWORD(wParam);
+ wmEvent = HIWORD(wParam);
+ switch (wmId)
+ {
+ case TB_LINEUP:
+ case TB_LINEDOWN:
+ case TB_PAGEUP:
+ case TB_PAGEDOWN:
+ case TB_TOP:
+ case TB_BOTTOM:
+ wmEvent = (int)SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);
+ case TB_THUMBPOSITION:
+ case TB_THUMBTRACK:
+ if (wmEvent < 3)
+ wmEvent = 3;
+ if (wmEvent > MAX_BUFFER_COUNT)
+ wmEvent = MAX_BUFFER_COUNT;
+ SendMessage((HWND)lParam, TBM_SETPOS, TRUE, wmEvent);
+ swprintf_s(temp, L"%d (%d ms latency)", wmEvent, 1000 / (96000 / (wmEvent * BufferSize)));
+ SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp);
+ break;
+ default:
+ return FALSE;
+ }
+ break;
- default:
- return FALSE;
- }
- return TRUE;
- }
+ default:
+ return FALSE;
+ }
+ return TRUE;
+ }
public:
- virtual void Configure(uptr parent)
- {
- INT_PTR ret;
- ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_WAVEOUT), (HWND)parent, (DLGPROC)ConfigProc, 1);
- if (ret == -1) {
- MessageBox((HWND)parent, L"Error Opening the config dialog.", L"OMG ERROR!", MB_OK | MB_SETFOREGROUND);
- return;
- }
- }
+ virtual void Configure(uptr parent)
+ {
+ INT_PTR ret;
+ ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_WAVEOUT), (HWND)parent, (DLGPROC)ConfigProc, 1);
+ if (ret == -1)
+ {
+ MessageBox((HWND)parent, L"Error Opening the config dialog.", L"OMG ERROR!", MB_OK | MB_SETFOREGROUND);
+ return;
+ }
+ }
- s32 Test() const
- {
- if (waveOutGetNumDevs() == 0) {
- SysMessage("No waveOut Devices Present\n");
- return -1;
- }
- return 0;
- }
+ s32 Test() const
+ {
+ if (waveOutGetNumDevs() == 0)
+ {
+ SysMessage("No waveOut Devices Present\n");
+ return -1;
+ }
+ return 0;
+ }
- int GetEmptySampleCount()
- {
- int result = 0;
- for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
- result += (whbuffer[i].dwFlags & WHDR_DONE) ? BufferSize : 0;
- }
- return result;
- }
+ int GetEmptySampleCount()
+ {
+ int result = 0;
+ for (int i = 0; i < MAX_BUFFER_COUNT; i++)
+ {
+ result += (whbuffer[i].dwFlags & WHDR_DONE) ? BufferSize : 0;
+ }
+ return result;
+ }
- const wchar_t *GetIdent() const
- {
- return L"waveout";
- }
+ const wchar_t* GetIdent() const
+ {
+ return L"waveout";
+ }
- const wchar_t *GetLongName() const
- {
- return L"WaveOut (Laggy)";
- }
+ const wchar_t* GetLongName() const
+ {
+ return L"WaveOut (Laggy)";
+ }
- void ReadSettings()
- {
- }
+ void ReadSettings()
+ {
+ }
- void SetApiSettings(wxString api)
- {
- }
+ void SetApiSettings(wxString api)
+ {
+ }
- void WriteSettings() const
- {
- }
+ void WriteSettings() const
+ {
+ }
} static WO;
-SndOutModule *WaveOut = &WO;
+SndOutModule* WaveOut = &WO;
diff --git a/pcsx2/SPU2/Windows/UIHelpers.cpp b/pcsx2/SPU2/Windows/UIHelpers.cpp
index f2d3e9e6e3..95d24c2f89 100644
--- a/pcsx2/SPU2/Windows/UIHelpers.cpp
+++ b/pcsx2/SPU2/Windows/UIHelpers.cpp
@@ -18,30 +18,31 @@
int SendDialogMsg(HWND hwnd, int dlgId, UINT code, WPARAM wParam, LPARAM lParam)
{
- return SendMessage(GetDlgItem(hwnd, dlgId), code, wParam, lParam);
+ return SendMessage(GetDlgItem(hwnd, dlgId), code, wParam, lParam);
}
-__forceinline void Verifyc(HRESULT hr, const char *fn)
+__forceinline void Verifyc(HRESULT hr, const char* fn)
{
- if (FAILED(hr)) {
- assert(0);
- throw std::runtime_error("DirectSound returned an error from %s");
- }
+ if (FAILED(hr))
+ {
+ assert(0);
+ throw std::runtime_error("DirectSound returned an error from %s");
+ }
}
void AssignSliderValue(HWND idcwnd, HWND hwndDisplay, int value)
{
- value = std::min(std::max(value, 0), 512);
- SendMessage(idcwnd, TBM_SETPOS, TRUE, value);
+ value = std::min(std::max(value, 0), 512);
+ SendMessage(idcwnd, TBM_SETPOS, TRUE, value);
- wchar_t tbox[32];
- swprintf_s(tbox, L"%d", value);
- SetWindowText(hwndDisplay, tbox);
+ wchar_t tbox[32];
+ swprintf_s(tbox, L"%d", value);
+ SetWindowText(hwndDisplay, tbox);
}
void AssignSliderValue(HWND hWnd, int idc, int editbox, int value)
{
- AssignSliderValue(GetDlgItem(hWnd, idc), GetDlgItem(hWnd, editbox), value);
+ AssignSliderValue(GetDlgItem(hWnd, idc), GetDlgItem(hWnd, editbox), value);
}
// Generic slider/scroller message handler. This is succient so long as you
@@ -49,29 +50,30 @@ void AssignSliderValue(HWND hWnd, int idc, int editbox, int value)
// updating a custom label.
BOOL DoHandleScrollMessage(HWND hwndDisplay, WPARAM wParam, LPARAM lParam)
{
- int wmId = LOWORD(wParam);
- int wmEvent = HIWORD(wParam);
+ int wmId = LOWORD(wParam);
+ int wmEvent = HIWORD(wParam);
- switch (wmId) {
- //case TB_ENDTRACK:
- //case TB_THUMBPOSITION:
- case TB_LINEUP:
- case TB_LINEDOWN:
- case TB_PAGEUP:
- case TB_PAGEDOWN:
- wmEvent = (int)SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);
- case TB_THUMBTRACK:
- AssignSliderValue((HWND)lParam, hwndDisplay, wmEvent);
- break;
+ switch (wmId)
+ {
+ //case TB_ENDTRACK:
+ //case TB_THUMBPOSITION:
+ case TB_LINEUP:
+ case TB_LINEDOWN:
+ case TB_PAGEUP:
+ case TB_PAGEDOWN:
+ wmEvent = (int)SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);
+ case TB_THUMBTRACK:
+ AssignSliderValue((HWND)lParam, hwndDisplay, wmEvent);
+ break;
- default:
- return FALSE;
- }
- return TRUE;
+ default:
+ return FALSE;
+ }
+ return TRUE;
}
int GetSliderValue(HWND hWnd, int idc)
{
- int retval = (int)SendMessage(GetDlgItem(hWnd, idc), TBM_GETPOS, 0, 0);
- return GetClamped(retval, 0, 512);
+ int retval = (int)SendMessage(GetDlgItem(hWnd, idc), TBM_GETPOS, 0, 0);
+ return GetClamped(retval, 0, 512);
}
diff --git a/pcsx2/SPU2/Windows/WinConfig.h b/pcsx2/SPU2/Windows/WinConfig.h
index 7a7b254dac..9df0f96737 100644
--- a/pcsx2/SPU2/Windows/WinConfig.h
+++ b/pcsx2/SPU2/Windows/WinConfig.h
@@ -31,26 +31,26 @@ extern HINSTANCE hInstance;
#define SET_CHECK(idc, value) SendMessage(GetDlgItem(hWnd, idc), BM_SETCHECK, ((value) == 0) ? BST_UNCHECKED : BST_CHECKED, 0)
#define HANDLE_CHECK(idc, hvar) \
- case idc: \
- (hvar) = !(hvar); \
- SendMessage(GetDlgItem(hWnd, idc), BM_SETCHECK, (hvar) ? BST_CHECKED : BST_UNCHECKED, 0); \
- break
+ case idc: \
+ (hvar) = !(hvar); \
+ SendMessage(GetDlgItem(hWnd, idc), BM_SETCHECK, (hvar) ? BST_CHECKED : BST_UNCHECKED, 0); \
+ break
#define HANDLE_CHECKNB(idc, hvar) \
- case idc: \
- (hvar) = !(hvar); \
- SendMessage(GetDlgItem(hWnd, idc), BM_SETCHECK, (hvar) ? BST_CHECKED : BST_UNCHECKED, 0)
+ case idc: \
+ (hvar) = !(hvar); \
+ SendMessage(GetDlgItem(hWnd, idc), BM_SETCHECK, (hvar) ? BST_CHECKED : BST_UNCHECKED, 0)
#define ENABLE_CONTROL(idc, value) EnableWindow(GetDlgItem(hWnd, idc), value)
#define INIT_SLIDER(idc, minrange, maxrange, tickfreq, pagesize, linesize) \
- SendMessage(GetDlgItem(hWnd, idc), TBM_SETRANGEMIN, FALSE, minrange); \
- SendMessage(GetDlgItem(hWnd, idc), TBM_SETRANGEMAX, FALSE, maxrange); \
- SendMessage(GetDlgItem(hWnd, idc), TBM_SETTICFREQ, tickfreq, 0); \
- SendMessage(GetDlgItem(hWnd, idc), TBM_SETPAGESIZE, 0, pagesize); \
- SendMessage(GetDlgItem(hWnd, idc), TBM_SETLINESIZE, 0, linesize)
+ SendMessage(GetDlgItem(hWnd, idc), TBM_SETRANGEMIN, FALSE, minrange); \
+ SendMessage(GetDlgItem(hWnd, idc), TBM_SETRANGEMAX, FALSE, maxrange); \
+ SendMessage(GetDlgItem(hWnd, idc), TBM_SETTICFREQ, tickfreq, 0); \
+ SendMessage(GetDlgItem(hWnd, idc), TBM_SETPAGESIZE, 0, pagesize); \
+ SendMessage(GetDlgItem(hWnd, idc), TBM_SETLINESIZE, 0, linesize)
#define HANDLE_SCROLL_MESSAGE(idc, idcDisplay) \
- if ((HWND)lParam == GetDlgItem(hWnd, idc)) \
- return DoHandleScrollMessage(GetDlgItem(hWnd, idcDisplay), wParam, lParam)
+ if ((HWND)lParam == GetDlgItem(hWnd, idc)) \
+ return DoHandleScrollMessage(GetDlgItem(hWnd, idcDisplay), wParam, lParam)
// *** BEGIN DRIVER-SPECIFIC CONFIGURATION ***
@@ -58,26 +58,26 @@ extern HINSTANCE hInstance;
struct CONFIG_XAUDIO2
{
- wxString Device;
- s8 NumBuffers;
+ wxString Device;
+ s8 NumBuffers;
- CONFIG_XAUDIO2()
- : Device()
- , NumBuffers(2)
- {
- }
+ CONFIG_XAUDIO2()
+ : Device()
+ , NumBuffers(2)
+ {
+ }
};
struct CONFIG_WAVEOUT
{
- wxString Device;
- s8 NumBuffers;
+ wxString Device;
+ s8 NumBuffers;
- CONFIG_WAVEOUT()
- : Device()
- , NumBuffers(4)
- {
- }
+ CONFIG_WAVEOUT()
+ : Device()
+ , NumBuffers(4)
+ {
+ }
};
extern CONFIG_WAVEOUT Config_WaveOut;
diff --git a/pcsx2/SPU2/Windows/dsp.cpp b/pcsx2/SPU2/Windows/dsp.cpp
index bbdeac23e2..75ceb85a41 100644
--- a/pcsx2/SPU2/Windows/dsp.cpp
+++ b/pcsx2/SPU2/Windows/dsp.cpp
@@ -23,14 +23,14 @@
extern "C" {
#include "dsp.h"
-typedef winampDSPHeader *(*pWinampDSPGetHeader2)();
+typedef winampDSPHeader* (*pWinampDSPGetHeader2)();
}
HMODULE hLib = NULL;
pWinampDSPGetHeader2 pGetHeader = NULL;
-winampDSPHeader *pHeader = NULL;
+winampDSPHeader* pHeader = NULL;
-winampDSPModule *pModule = NULL;
+winampDSPModule* pModule = NULL;
HWND hTemp;
@@ -44,94 +44,100 @@ bool running;
DWORD WINAPI DspUpdateThread(PVOID param);
#endif
-s32 DspLoadLibrary(wchar_t *fileName, int modNum)
+s32 DspLoadLibrary(wchar_t* fileName, int modNum)
#ifdef USE_A_THREAD
{
- if (!dspPluginEnabled)
- return -1;
+ if (!dspPluginEnabled)
+ return -1;
- running = true;
- hUpdateThread = CreateThread(NULL, 0, DspUpdateThread, NULL, 0, &UpdateThreadId);
- return (hUpdateThread == INVALID_HANDLE_VALUE);
+ running = true;
+ hUpdateThread = CreateThread(NULL, 0, DspUpdateThread, NULL, 0, &UpdateThreadId);
+ return (hUpdateThread == INVALID_HANDLE_VALUE);
}
-s32 DspLoadLibrary2(wchar_t *fileName, int modNum)
+s32 DspLoadLibrary2(wchar_t* fileName, int modNum)
#endif
{
- if (!dspPluginEnabled)
- return -1;
+ if (!dspPluginEnabled)
+ return -1;
- hLib = LoadLibraryW(fileName);
- if (!hLib) {
- return 1;
- }
+ hLib = LoadLibraryW(fileName);
+ if (!hLib)
+ {
+ return 1;
+ }
- pGetHeader = (pWinampDSPGetHeader2)GetProcAddress(hLib, "winampDSPGetHeader2");
+ pGetHeader = (pWinampDSPGetHeader2)GetProcAddress(hLib, "winampDSPGetHeader2");
- if (!pGetHeader) {
- FreeLibrary(hLib);
- hLib = NULL;
- return 1;
- }
+ if (!pGetHeader)
+ {
+ FreeLibrary(hLib);
+ hLib = NULL;
+ return 1;
+ }
- pHeader = pGetHeader();
+ pHeader = pGetHeader();
- pModule = pHeader->getModule(modNum);
+ pModule = pHeader->getModule(modNum);
- if (!pModule) {
- pGetHeader = NULL;
- pHeader = NULL;
- FreeLibrary(hLib);
- hLib = NULL;
- return -1;
- }
+ if (!pModule)
+ {
+ pGetHeader = NULL;
+ pHeader = NULL;
+ FreeLibrary(hLib);
+ hLib = NULL;
+ return -1;
+ }
- pModule->hDllInstance = hLib;
- pModule->hwndParent = 0;
- pModule->Init(pModule);
+ pModule->hDllInstance = hLib;
+ pModule->hwndParent = 0;
+ pModule->Init(pModule);
- return 0;
+ return 0;
}
void DspCloseLibrary()
#ifdef USE_A_THREAD
{
- if (!dspPluginEnabled)
- return;
+ if (!dspPluginEnabled)
+ return;
- PostThreadMessage(UpdateThreadId, WM_QUIT, 0, 0);
- running = false;
- if (WaitForSingleObject(hUpdateThread, 1000) == WAIT_TIMEOUT) {
- ConLog("SPU2-X: WARNING: DSP Thread did not close itself in time. Assuming hung. Terminating.\n");
- TerminateThread(hUpdateThread, 1);
- }
+ PostThreadMessage(UpdateThreadId, WM_QUIT, 0, 0);
+ running = false;
+ if (WaitForSingleObject(hUpdateThread, 1000) == WAIT_TIMEOUT)
+ {
+ ConLog("SPU2-X: WARNING: DSP Thread did not close itself in time. Assuming hung. Terminating.\n");
+ TerminateThread(hUpdateThread, 1);
+ }
}
void DspCloseLibrary2()
#endif
{
- if (!dspPluginEnabled)
- return;
+ if (!dspPluginEnabled)
+ return;
- if (hLib) {
- pModule->Quit(pModule);
- FreeLibrary(hLib);
- }
- pModule = NULL;
- pHeader = NULL;
- pGetHeader = NULL;
- hLib = NULL;
+ if (hLib)
+ {
+ pModule->Quit(pModule);
+ FreeLibrary(hLib);
+ }
+ pModule = NULL;
+ pHeader = NULL;
+ pGetHeader = NULL;
+ hLib = NULL;
}
-int DspProcess(s16 *buffer, int samples)
+int DspProcess(s16* buffer, int samples)
{
- if (!dspPluginEnabled)
- return samples;
+ if (!dspPluginEnabled)
+ return samples;
- if (hLib) {
- return pModule->ModifySamples(pModule, buffer, samples, 16, 2, SampleRate);
- }
- return samples;
+ if (hLib)
+ {
+ return pModule->ModifySamples(pModule, buffer, samples, 16, 2, SampleRate);
+ }
+ return samples;
}
void DspUpdate()
@@ -141,36 +147,39 @@ void DspUpdate()
DWORD WINAPI DspUpdateThread(PVOID param)
{
- if (!dspPluginEnabled)
- return -1;
+ if (!dspPluginEnabled)
+ return -1;
- if (DspLoadLibrary2(dspPlugin, dspPluginModule))
- return -1;
+ if (DspLoadLibrary2(dspPlugin, dspPluginModule))
+ return -1;
- MSG msg;
- while (running) {
- GetMessage(&msg, 0, 0, 0);
- if ((msg.hwnd == NULL) && (msg.message == WM_QUIT)) {
- break;
- }
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
+ MSG msg;
+ while (running)
+ {
+ GetMessage(&msg, 0, 0, 0);
+ if ((msg.hwnd == NULL) && (msg.message == WM_QUIT))
+ {
+ break;
+ }
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
- DspCloseLibrary2();
- return 0;
+ DspCloseLibrary2();
+ return 0;
}
#else
{
- if (!dspPluginEnabled)
- return;
+ if (!dspPluginEnabled)
+ return;
- MSG msg;
- while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
+ MSG msg;
+ while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
}
#endif
diff --git a/pcsx2/SPU2/Windows/dsp.h b/pcsx2/SPU2/Windows/dsp.h
index b3fc073651..67eeffa857 100644
--- a/pcsx2/SPU2/Windows/dsp.h
+++ b/pcsx2/SPU2/Windows/dsp.h
@@ -26,32 +26,32 @@
typedef struct winampDSPModule
{
- char *description; // description
- HWND hwndParent; // parent window (filled in by calling app)
- HINSTANCE hDllInstance; // instance handle to this DLL (filled in by calling app)
+ char* description; // description
+ HWND hwndParent; // parent window (filled in by calling app)
+ HINSTANCE hDllInstance; // instance handle to this DLL (filled in by calling app)
- void (*Config)(struct winampDSPModule *this_mod); // configuration dialog (if needed)
- int (*Init)(struct winampDSPModule *this_mod); // 0 on success, creates window, etc (if needed)
+ void (*Config)(struct winampDSPModule* this_mod); // configuration dialog (if needed)
+ int (*Init)(struct winampDSPModule* this_mod); // 0 on success, creates window, etc (if needed)
- // modify waveform samples: returns number of samples to actually write
- // (typically numsamples, but no more than twice numsamples, and no less than half numsamples)
- // numsamples should always be at least 128. should, but I'm not sure
- int (*ModifySamples)(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate);
+ // modify waveform samples: returns number of samples to actually write
+ // (typically numsamples, but no more than twice numsamples, and no less than half numsamples)
+ // numsamples should always be at least 128. should, but I'm not sure
+ int (*ModifySamples)(struct winampDSPModule* this_mod, short int* samples, int numsamples, int bps, int nch, int srate);
- void (*Quit)(struct winampDSPModule *this_mod); // called when unloading
+ void (*Quit)(struct winampDSPModule* this_mod); // called when unloading
- void *userData; // user data, optional
+ void* userData; // user data, optional
} winampDSPModule;
typedef struct
{
- int version; // DSP_HDRVER
- char *description; // description of library
- winampDSPModule *(*getModule)(int); // module retrieval function
+ int version; // DSP_HDRVER
+ char* description; // description of library
+ winampDSPModule* (*getModule)(int); // module retrieval function
} winampDSPHeader;
// exported symbols
-typedef winampDSPHeader *(*winampDSPGetHeaderType)();
+typedef winampDSPHeader* (*winampDSPGetHeaderType)();
// header version: 0x20 == 0.20 == winamp 2.0
#define DSP_HDRVER 0x20
diff --git a/pcsx2/SPU2/Windows/resource.h b/pcsx2/SPU2/Windows/resource.h
index 990cd750cd..8c02126ff7 100644
--- a/pcsx2/SPU2/Windows/resource.h
+++ b/pcsx2/SPU2/Windows/resource.h
@@ -2,72 +2,72 @@
// Microsoft Visual C++ generated include file.
// Used by Spu2-X.rc
//
-#define IDD_CONFIG 9
-#define IDD_DEBUG 105
-#define IDD_DSOUND 106
-#define IDD_WAVEOUT 109
-#define IDB_SPU2X_SMALL 116
-#define IDD_CONFIG_SOUNDTOUCH 117
-#define IDD_CONFIG_DEBUG 118
-#define IDD_PORTAUDIO 119
-#define IDC_EFFECTS_DISABLE 1001
-#define IDC_DUMPREGS 1003
-#define IDC_DUMPMEM 1004
-#define IDC_DUMPCORE 1005
-#define IDC_LOGWAVE 1006
-#define IDC_LOGDMA 1007
-#define IDC_LOGREGS 1008
-#define IDC_DEBUG 1009
-#define IDC_DEBUG_ENABLE 1010
-#define IDC_INTERPOLATE 1011
-#define IDC_DEALIASFILTER 1012
-#define IDC_OUTPUT 1013
-#define IDC_BUFFERS_SLIDER 1014
-#define IDC_SPEAKERS 1015
-#define IDC_SPEAKERS_TEXT 1016
-#define IDC_MSGKEY 1020
-#define IDC_MSGDMA 1021
-#define IDC_MSGADMA 1022
-#define IDC_MSGVOICE 1023
-#define IDC_MSGSHOW 1024
-#define IDC_OUTCONF 1028
-#define IDC_DSP_ENABLE 1029
-#define IDC_DS_DEVICE 1032
-#define IDC_PA_DEVICE 1033
-#define IDC_DBG_OVERRUNS 1038
-#define IDC_DBG_CACHE 1039
-#define IDC_LATENCY_SLIDER 1040
-#define IDC_LATENCY_LABEL 1041
-#define ICD_LR_CENTER_SLIDER 1042
-#define IDC_SEQLEN_SLIDER 1043
-#define IDC_SEEKWIN_SLIDER 1044
-#define IDC_OVERLAP_SLIDER 1045
-#define IDC_MSG_PUBLIC_BUILD 1048
-#define IDC_RESET_DEFAULTS 1057
-#define IDC_OPEN_CONFIG_SOUNDTOUCH 1058
-#define IDC_OPEN_CONFIG_DEBUG 1059
-#define IDC_GLOBALFOCUS_DISABLE 1060
-#define IDC_GLOBALFOCUS_DISABLE2 1061
-#define IDC_USE_HARDWARE 1062
-#define IDC_COMBO1 1063
-#define IDC_SYNCHMODE 1064
-#define IDC_DEBUG_OTHERS 1065
-#define IDC_DEBUG_VISUAL 1066
-#define IDC_VOLUME_LABEL 1067
-#define IDC_VOLUME_SLIDER 1068
-#define IDC_MINIMIZE 1069
-#define IDC_MANUAL 1070
-#define IDC_PA_HOSTAPI 1071
-#define IDC_LATENCY 1072
-#define IDC_EXCLUSIVE 1073
+#define IDD_CONFIG 9
+#define IDD_DEBUG 105
+#define IDD_DSOUND 106
+#define IDD_WAVEOUT 109
+#define IDB_SPU2X_SMALL 116
+#define IDD_CONFIG_SOUNDTOUCH 117
+#define IDD_CONFIG_DEBUG 118
+#define IDD_PORTAUDIO 119
+#define IDC_EFFECTS_DISABLE 1001
+#define IDC_DUMPREGS 1003
+#define IDC_DUMPMEM 1004
+#define IDC_DUMPCORE 1005
+#define IDC_LOGWAVE 1006
+#define IDC_LOGDMA 1007
+#define IDC_LOGREGS 1008
+#define IDC_DEBUG 1009
+#define IDC_DEBUG_ENABLE 1010
+#define IDC_INTERPOLATE 1011
+#define IDC_DEALIASFILTER 1012
+#define IDC_OUTPUT 1013
+#define IDC_BUFFERS_SLIDER 1014
+#define IDC_SPEAKERS 1015
+#define IDC_SPEAKERS_TEXT 1016
+#define IDC_MSGKEY 1020
+#define IDC_MSGDMA 1021
+#define IDC_MSGADMA 1022
+#define IDC_MSGVOICE 1023
+#define IDC_MSGSHOW 1024
+#define IDC_OUTCONF 1028
+#define IDC_DSP_ENABLE 1029
+#define IDC_DS_DEVICE 1032
+#define IDC_PA_DEVICE 1033
+#define IDC_DBG_OVERRUNS 1038
+#define IDC_DBG_CACHE 1039
+#define IDC_LATENCY_SLIDER 1040
+#define IDC_LATENCY_LABEL 1041
+#define ICD_LR_CENTER_SLIDER 1042
+#define IDC_SEQLEN_SLIDER 1043
+#define IDC_SEEKWIN_SLIDER 1044
+#define IDC_OVERLAP_SLIDER 1045
+#define IDC_MSG_PUBLIC_BUILD 1048
+#define IDC_RESET_DEFAULTS 1057
+#define IDC_OPEN_CONFIG_SOUNDTOUCH 1058
+#define IDC_OPEN_CONFIG_DEBUG 1059
+#define IDC_GLOBALFOCUS_DISABLE 1060
+#define IDC_GLOBALFOCUS_DISABLE2 1061
+#define IDC_USE_HARDWARE 1062
+#define IDC_COMBO1 1063
+#define IDC_SYNCHMODE 1064
+#define IDC_DEBUG_OTHERS 1065
+#define IDC_DEBUG_VISUAL 1066
+#define IDC_VOLUME_LABEL 1067
+#define IDC_VOLUME_SLIDER 1068
+#define IDC_MINIMIZE 1069
+#define IDC_MANUAL 1070
+#define IDC_PA_HOSTAPI 1071
+#define IDC_LATENCY 1072
+#define IDC_EXCLUSIVE 1073
// Next default values for new objects
-//
+//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 120
-#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1074
-#define _APS_NEXT_SYMED_VALUE 101
+#define _APS_NEXT_RESOURCE_VALUE 120
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1074
+#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
diff --git a/pcsx2/SPU2/defs.h b/pcsx2/SPU2/defs.h
index c4f1472d23..6889d5f8f5 100644
--- a/pcsx2/SPU2/defs.h
+++ b/pcsx2/SPU2/defs.h
@@ -22,10 +22,10 @@
// SPU2 Memory Indexers
// --------------------------------------------------------------------------------------
-#define spu2Rs16(mmem) (*(s16 *)((s8 *)spu2regs + ((mmem)&0x1fff)))
-#define spu2Ru16(mmem) (*(u16 *)((s8 *)spu2regs + ((mmem)&0x1fff)))
+#define spu2Rs16(mmem) (*(s16*)((s8*)spu2regs + ((mmem)&0x1fff)))
+#define spu2Ru16(mmem) (*(u16*)((s8*)spu2regs + ((mmem)&0x1fff)))
-extern s16 *GetMemPtr(u32 addr);
+extern s16* GetMemPtr(u32 addr);
extern s16 spu2M_Read(u32 addr);
extern void spu2M_Write(u32 addr, s16 value);
extern void spu2M_Write(u32 addr, u16 value);
@@ -33,164 +33,164 @@ extern void spu2M_Write(u32 addr, u16 value);
struct V_VolumeLR
{
- static V_VolumeLR Max;
+ static V_VolumeLR Max;
- s32 Left;
- s32 Right;
+ s32 Left;
+ s32 Right;
- V_VolumeLR() = default;
- V_VolumeLR(s32 both)
- : Left(both)
- , Right(both)
- {
- }
+ V_VolumeLR() = default;
+ V_VolumeLR(s32 both)
+ : Left(both)
+ , Right(both)
+ {
+ }
- void DebugDump(FILE *dump, const char *title);
+ void DebugDump(FILE* dump, const char* title);
};
struct V_VolumeSlide
{
- // Holds the "original" value of the volume for this voice, prior to slides.
- // (ie, the volume as written to the register)
+ // Holds the "original" value of the volume for this voice, prior to slides.
+ // (ie, the volume as written to the register)
- s16 Reg_VOL;
- s32 Value;
- s8 Increment;
- s8 Mode;
+ s16 Reg_VOL;
+ s32 Value;
+ s8 Increment;
+ s8 Mode;
public:
- V_VolumeSlide() = default;
- V_VolumeSlide(s16 regval, s32 fullvol)
- : Reg_VOL(regval)
- , Value(fullvol)
- , Increment(0)
- , Mode(0)
- {
- }
+ V_VolumeSlide() = default;
+ V_VolumeSlide(s16 regval, s32 fullvol)
+ : Reg_VOL(regval)
+ , Value(fullvol)
+ , Increment(0)
+ , Mode(0)
+ {
+ }
- void Update();
- void RegSet(u16 src); // used to set the volume from a register source (16 bit signed)
- void DebugDump(FILE *dump, const char *title, const char *nameLR);
+ void Update();
+ void RegSet(u16 src); // used to set the volume from a register source (16 bit signed)
+ void DebugDump(FILE* dump, const char* title, const char* nameLR);
};
struct V_VolumeSlideLR
{
- static V_VolumeSlideLR Max;
+ static V_VolumeSlideLR Max;
- V_VolumeSlide Left;
- V_VolumeSlide Right;
+ V_VolumeSlide Left;
+ V_VolumeSlide Right;
public:
- V_VolumeSlideLR() = default;
- V_VolumeSlideLR(s16 regval, s32 bothval)
- : Left(regval, bothval)
- , Right(regval, bothval)
- {
- }
+ V_VolumeSlideLR() = default;
+ V_VolumeSlideLR(s16 regval, s32 bothval)
+ : Left(regval, bothval)
+ , Right(regval, bothval)
+ {
+ }
- void Update()
- {
- Left.Update();
- Right.Update();
- }
+ void Update()
+ {
+ Left.Update();
+ Right.Update();
+ }
- void DebugDump(FILE *dump, const char *title);
+ void DebugDump(FILE* dump, const char* title);
};
struct V_ADSR
{
- union
- {
- u32 reg32;
+ union
+ {
+ u32 reg32;
- struct
- {
- u16 regADSR1;
- u16 regADSR2;
- };
+ struct
+ {
+ u16 regADSR1;
+ u16 regADSR2;
+ };
- struct
- {
- u32 SustainLevel : 4,
- DecayRate : 4,
- AttackRate : 7,
- AttackMode : 1, // 0 for linear (+lin), 1 for pseudo exponential (+exp)
+ struct
+ {
+ u32 SustainLevel : 4,
+ DecayRate : 4,
+ AttackRate : 7,
+ AttackMode : 1, // 0 for linear (+lin), 1 for pseudo exponential (+exp)
- ReleaseRate : 5,
- ReleaseMode : 1, // 0 for linear (-lin), 1 for exponential (-exp)
- SustainRate : 7,
- SustainMode : 3; // 0 = +lin, 1 = -lin, 2 = +exp, 3 = -exp
- };
- };
+ ReleaseRate : 5,
+ ReleaseMode : 1, // 0 for linear (-lin), 1 for exponential (-exp)
+ SustainRate : 7,
+ SustainMode : 3; // 0 = +lin, 1 = -lin, 2 = +exp, 3 = -exp
+ };
+ };
- s32 Value; // Ranges from 0 to 0x7fffffff (signed values are clamped to 0) [Reg_ENVX]
- u8 Phase; // monitors current phase of ADSR envelope
- bool Releasing; // Ready To Release, triggered by Voice.Stop();
+ s32 Value; // Ranges from 0 to 0x7fffffff (signed values are clamped to 0) [Reg_ENVX]
+ u8 Phase; // monitors current phase of ADSR envelope
+ bool Releasing; // Ready To Release, triggered by Voice.Stop();
public:
- bool Calculate();
+ bool Calculate();
};
struct V_Voice
{
- u32 PlayCycle; // SPU2 cycle where the Playing started
+ u32 PlayCycle; // SPU2 cycle where the Playing started
- V_VolumeSlideLR Volume;
+ V_VolumeSlideLR Volume;
- // Envelope
- V_ADSR ADSR;
- // Pitch (also Reg_PITCH)
- u16 Pitch;
- // Loop Start address (also Reg_LSAH/L)
- u32 LoopStartA;
- // Sound Start address (also Reg_SSAH/L)
- u32 StartA;
- // Next Read Data address (also Reg_NAXH/L)
- u32 NextA;
- // Voice Decoding State
- s32 Prev1;
- s32 Prev2;
+ // Envelope
+ V_ADSR ADSR;
+ // Pitch (also Reg_PITCH)
+ u16 Pitch;
+ // Loop Start address (also Reg_LSAH/L)
+ u32 LoopStartA;
+ // Sound Start address (also Reg_SSAH/L)
+ u32 StartA;
+ // Next Read Data address (also Reg_NAXH/L)
+ u32 NextA;
+ // Voice Decoding State
+ s32 Prev1;
+ s32 Prev2;
- // Pitch Modulated by previous voice
- bool Modulated;
- // Source (Wave/Noise)
- bool Noise;
+ // Pitch Modulated by previous voice
+ bool Modulated;
+ // Source (Wave/Noise)
+ bool Noise;
- s8 LoopMode;
- s8 LoopFlags;
+ s8 LoopMode;
+ s8 LoopFlags;
- // Sample pointer (19:12 bit fixed point)
- s32 SP;
+ // Sample pointer (19:12 bit fixed point)
+ s32 SP;
- // Sample pointer for Cubic Interpolation
- // Cubic interpolation mixes a sample behind Linear, so that it
- // can have sample data to either side of the end points from which
- // to extrapolate. This SP represents that late sample position.
- s32 SPc;
+ // Sample pointer for Cubic Interpolation
+ // Cubic interpolation mixes a sample behind Linear, so that it
+ // can have sample data to either side of the end points from which
+ // to extrapolate. This SP represents that late sample position.
+ s32 SPc;
- // Previous sample values - used for interpolation
- // Inverted order of these members to match the access order in the
- // code (might improve cache hits).
- s32 PV4;
- s32 PV3;
- s32 PV2;
- s32 PV1;
+ // Previous sample values - used for interpolation
+ // Inverted order of these members to match the access order in the
+ // code (might improve cache hits).
+ s32 PV4;
+ s32 PV3;
+ s32 PV2;
+ s32 PV1;
- // Last outputted audio value, used for voice modulation.
- s32 OutX;
- s32 NextCrest; // temp value for Crest calculation
+ // Last outputted audio value, used for voice modulation.
+ s32 OutX;
+ s32 NextCrest; // temp value for Crest calculation
- // SBuffer now points directly to an ADPCM cache entry.
- s16 *SBuffer;
+ // SBuffer now points directly to an ADPCM cache entry.
+ s16* SBuffer;
- // sample position within the current decoded packet.
- s32 SCurrent;
+ // sample position within the current decoded packet.
+ s32 SCurrent;
- // it takes a few ticks for voices to start on the real SPU2?
- void QueueStart();
- bool Start();
- void Stop();
+ // it takes a few ticks for voices to start on the real SPU2?
+ void QueueStart();
+ bool Start();
+ void Stop();
};
// ** Begin Debug-only variables section **
@@ -198,25 +198,25 @@ struct V_Voice
// the Public Release build.
struct V_VoiceDebug
{
- s8 FirstBlock;
- s32 SampleData;
- s32 PeakX;
- s32 displayPeak;
- s32 lastSetStartA;
+ s8 FirstBlock;
+ s32 SampleData;
+ s32 PeakX;
+ s32 displayPeak;
+ s32 lastSetStartA;
};
struct V_CoreDebug
{
- V_VoiceDebug Voices[24];
- // Last Transfer Size
- u32 lastsize;
+ V_VoiceDebug Voices[24];
+ // Last Transfer Size
+ u32 lastsize;
- // draw adma waveform in the visual debugger
- s32 admaWaveformL[0x100];
- s32 admaWaveformR[0x100];
+ // draw adma waveform in the visual debugger
+ s32 admaWaveformL[0x100];
+ s32 admaWaveformR[0x100];
- // Enabled when a dma write starts, disabled when the visual debugger showed it once
- s32 dmaFlag;
+ // Enabled when a dma write starts, disabled when the visual debugger showed it once
+ s32 dmaFlag;
};
// Debug tracking information - 24 voices and 2 cores.
@@ -224,310 +224,310 @@ extern V_CoreDebug DebugCores[2];
struct V_Reverb
{
- s16 IN_COEF_L;
- s16 IN_COEF_R;
+ s16 IN_COEF_L;
+ s16 IN_COEF_R;
- u32 APF1_SIZE;
- u32 APF2_SIZE;
+ u32 APF1_SIZE;
+ u32 APF2_SIZE;
- s16 APF1_VOL;
- s16 APF2_VOL;
+ s16 APF1_VOL;
+ s16 APF2_VOL;
- u32 SAME_L_SRC;
- u32 SAME_R_SRC;
- u32 DIFF_L_SRC;
- u32 DIFF_R_SRC;
- u32 SAME_L_DST;
- u32 SAME_R_DST;
- u32 DIFF_L_DST;
- u32 DIFF_R_DST;
+ u32 SAME_L_SRC;
+ u32 SAME_R_SRC;
+ u32 DIFF_L_SRC;
+ u32 DIFF_R_SRC;
+ u32 SAME_L_DST;
+ u32 SAME_R_DST;
+ u32 DIFF_L_DST;
+ u32 DIFF_R_DST;
- s16 IIR_VOL;
- s16 WALL_VOL;
+ s16 IIR_VOL;
+ s16 WALL_VOL;
- u32 COMB1_L_SRC;
- u32 COMB1_R_SRC;
- u32 COMB2_L_SRC;
- u32 COMB2_R_SRC;
- u32 COMB3_L_SRC;
- u32 COMB3_R_SRC;
- u32 COMB4_L_SRC;
- u32 COMB4_R_SRC;
+ u32 COMB1_L_SRC;
+ u32 COMB1_R_SRC;
+ u32 COMB2_L_SRC;
+ u32 COMB2_R_SRC;
+ u32 COMB3_L_SRC;
+ u32 COMB3_R_SRC;
+ u32 COMB4_L_SRC;
+ u32 COMB4_R_SRC;
- s16 COMB1_VOL;
- s16 COMB2_VOL;
- s16 COMB3_VOL;
- s16 COMB4_VOL;
+ s16 COMB1_VOL;
+ s16 COMB2_VOL;
+ s16 COMB3_VOL;
+ s16 COMB4_VOL;
- u32 APF1_L_DST;
- u32 APF1_R_DST;
- u32 APF2_L_DST;
- u32 APF2_R_DST;
+ u32 APF1_L_DST;
+ u32 APF1_R_DST;
+ u32 APF2_L_DST;
+ u32 APF2_R_DST;
};
struct V_ReverbBuffers
{
- s32 SAME_L_SRC;
- s32 SAME_R_SRC;
- s32 DIFF_R_SRC;
- s32 DIFF_L_SRC;
- s32 SAME_L_DST;
- s32 SAME_R_DST;
- s32 DIFF_L_DST;
- s32 DIFF_R_DST;
+ s32 SAME_L_SRC;
+ s32 SAME_R_SRC;
+ s32 DIFF_R_SRC;
+ s32 DIFF_L_SRC;
+ s32 SAME_L_DST;
+ s32 SAME_R_DST;
+ s32 DIFF_L_DST;
+ s32 DIFF_R_DST;
- s32 COMB1_L_SRC;
- s32 COMB1_R_SRC;
- s32 COMB2_L_SRC;
- s32 COMB2_R_SRC;
- s32 COMB3_L_SRC;
- s32 COMB3_R_SRC;
- s32 COMB4_L_SRC;
- s32 COMB4_R_SRC;
+ s32 COMB1_L_SRC;
+ s32 COMB1_R_SRC;
+ s32 COMB2_L_SRC;
+ s32 COMB2_R_SRC;
+ s32 COMB3_L_SRC;
+ s32 COMB3_R_SRC;
+ s32 COMB4_L_SRC;
+ s32 COMB4_R_SRC;
- s32 APF1_L_DST;
- s32 APF1_R_DST;
- s32 APF2_L_DST;
- s32 APF2_R_DST;
+ s32 APF1_L_DST;
+ s32 APF1_R_DST;
+ s32 APF2_L_DST;
+ s32 APF2_R_DST;
- s32 SAME_L_PRV;
- s32 SAME_R_PRV;
- s32 DIFF_L_PRV;
- s32 DIFF_R_PRV;
+ s32 SAME_L_PRV;
+ s32 SAME_R_PRV;
+ s32 DIFF_L_PRV;
+ s32 DIFF_R_PRV;
- s32 APF1_L_SRC;
- s32 APF1_R_SRC;
- s32 APF2_L_SRC;
- s32 APF2_R_SRC;
+ s32 APF1_L_SRC;
+ s32 APF1_R_SRC;
+ s32 APF2_L_SRC;
+ s32 APF2_R_SRC;
- bool NeedsUpdated;
+ bool NeedsUpdated;
};
struct V_SPDIF
{
- u16 Out;
- u16 Info;
- u16 Unknown1;
- u16 Mode;
- u16 Media;
- u16 Unknown2;
- u16 Protection;
+ u16 Out;
+ u16 Info;
+ u16 Unknown1;
+ u16 Mode;
+ u16 Media;
+ u16 Unknown2;
+ u16 Protection;
};
struct V_CoreRegs
{
- u32 PMON;
- u32 NON;
- u32 VMIXL;
- u32 VMIXR;
- u32 VMIXEL;
- u32 VMIXER;
- u32 ENDX;
+ u32 PMON;
+ u32 NON;
+ u32 VMIXL;
+ u32 VMIXR;
+ u32 VMIXEL;
+ u32 VMIXER;
+ u32 ENDX;
- u16 MMIX;
- u16 STATX;
- u16 ATTR;
- u16 _1AC;
+ u16 MMIX;
+ u16 STATX;
+ u16 ATTR;
+ u16 _1AC;
};
struct V_VoiceGates
{
- s16 DryL; // 'AND Gate' for Direct Output to Left Channel
- s16 DryR; // 'AND Gate' for Direct Output for Right Channel
- s16 WetL; // 'AND Gate' for Effect Output for Left Channel
- s16 WetR; // 'AND Gate' for Effect Output for Right Channel
+ s16 DryL; // 'AND Gate' for Direct Output to Left Channel
+ s16 DryR; // 'AND Gate' for Direct Output for Right Channel
+ s16 WetL; // 'AND Gate' for Effect Output for Left Channel
+ s16 WetR; // 'AND Gate' for Effect Output for Right Channel
};
struct V_CoreGates
{
- union
- {
- u128 v128;
+ union
+ {
+ u128 v128;
- struct
- {
- s16 InpL; // Sound Data Input to Direct Output (Left)
- s16 InpR; // Sound Data Input to Direct Output (Right)
- s16 SndL; // Voice Data to Direct Output (Left)
- s16 SndR; // Voice Data to Direct Output (Right)
- s16 ExtL; // External Input to Direct Output (Left)
- s16 ExtR; // External Input to Direct Output (Right)
- };
- };
+ struct
+ {
+ s16 InpL; // Sound Data Input to Direct Output (Left)
+ s16 InpR; // Sound Data Input to Direct Output (Right)
+ s16 SndL; // Voice Data to Direct Output (Left)
+ s16 SndR; // Voice Data to Direct Output (Right)
+ s16 ExtL; // External Input to Direct Output (Left)
+ s16 ExtR; // External Input to Direct Output (Right)
+ };
+ };
};
struct VoiceMixSet
{
- static const VoiceMixSet Empty;
- StereoOut32 Dry, Wet;
+ static const VoiceMixSet Empty;
+ StereoOut32 Dry, Wet;
- VoiceMixSet() {}
- VoiceMixSet(const StereoOut32 &dry, const StereoOut32 &wet)
- : Dry(dry)
- , Wet(wet)
- {
- }
+ VoiceMixSet() {}
+ VoiceMixSet(const StereoOut32& dry, const StereoOut32& wet)
+ : Dry(dry)
+ , Wet(wet)
+ {
+ }
};
struct V_Core
{
- static const uint NumVoices = 24;
+ static const uint NumVoices = 24;
- int Index; // Core index identifier.
+ int Index; // Core index identifier.
- // Voice Gates -- These are SSE-related values, and must always be
- // first to ensure 16 byte alignment
+ // Voice Gates -- These are SSE-related values, and must always be
+ // first to ensure 16 byte alignment
- V_VoiceGates VoiceGates[NumVoices];
- V_CoreGates DryGate;
- V_CoreGates WetGate;
+ V_VoiceGates VoiceGates[NumVoices];
+ V_CoreGates DryGate;
+ V_CoreGates WetGate;
- V_VolumeSlideLR MasterVol; // Master Volume
- V_VolumeLR ExtVol; // Volume for External Data Input
- V_VolumeLR InpVol; // Volume for Sound Data Input
- V_VolumeLR FxVol; // Volume for Output from Effects
+ V_VolumeSlideLR MasterVol; // Master Volume
+ V_VolumeLR ExtVol; // Volume for External Data Input
+ V_VolumeLR InpVol; // Volume for Sound Data Input
+ V_VolumeLR FxVol; // Volume for Output from Effects
- V_Voice Voices[NumVoices];
+ V_Voice Voices[NumVoices];
- u32 IRQA; // Interrupt Address
- u32 TSA; // DMA Transfer Start Address
+ u32 IRQA; // Interrupt Address
+ u32 TSA; // DMA Transfer Start Address
- bool IRQEnable; // Interrupt Enable
- bool FxEnable; // Effect Enable
- bool Mute; // Mute
- bool AdmaInProgress;
+ bool IRQEnable; // Interrupt Enable
+ bool FxEnable; // Effect Enable
+ bool Mute; // Mute
+ bool AdmaInProgress;
- s8 DMABits; // DMA related?
- s8 NoiseClk; // Noise Clock
- u16 AutoDMACtrl; // AutoDMA Status
- s32 DMAICounter; // DMA Interrupt Counter
- u32 InputDataLeft; // Input Buffer
- u32 InputPosRead;
- u32 InputPosWrite;
- u32 InputDataProgress;
+ s8 DMABits; // DMA related?
+ s8 NoiseClk; // Noise Clock
+ u16 AutoDMACtrl; // AutoDMA Status
+ s32 DMAICounter; // DMA Interrupt Counter
+ u32 InputDataLeft; // Input Buffer
+ u32 InputPosRead;
+ u32 InputPosWrite;
+ u32 InputDataProgress;
- V_Reverb Revb; // Reverb Registers
- V_ReverbBuffers RevBuffers; // buffer pointers for reverb, pre-calculated and pre-clipped.
- u32 EffectsStartA;
- u32 EffectsEndA;
- u32 ExtEffectsStartA;
- u32 ExtEffectsEndA;
- u32 ReverbX;
+ V_Reverb Revb; // Reverb Registers
+ V_ReverbBuffers RevBuffers; // buffer pointers for reverb, pre-calculated and pre-clipped.
+ u32 EffectsStartA;
+ u32 EffectsEndA;
+ u32 ExtEffectsStartA;
+ u32 ExtEffectsEndA;
+ u32 ReverbX;
- // Current size of and position of the effects buffer. Pre-caculated when the effects start
- // or end position registers are written. CAN BE NEGATIVE OR ZERO, in which
- // case reverb should be disabled.
- s32 EffectsBufferSize;
- u32 EffectsBufferStart;
+ // Current size of and position of the effects buffer. Pre-caculated when the effects start
+ // or end position registers are written. CAN BE NEGATIVE OR ZERO, in which
+ // case reverb should be disabled.
+ s32 EffectsBufferSize;
+ u32 EffectsBufferStart;
- V_CoreRegs Regs; // Registers
+ V_CoreRegs Regs; // Registers
- // Preserves the channel processed last cycle
- StereoOut32 LastEffect;
+ // Preserves the channel processed last cycle
+ StereoOut32 LastEffect;
- u8 CoreEnabled;
+ u8 CoreEnabled;
- u8 AttrBit0;
- u8 DmaMode;
+ u8 AttrBit0;
+ u8 DmaMode;
- // new dma only
- bool DmaStarted;
- u32 AutoDmaFree;
+ // new dma only
+ bool DmaStarted;
+ u32 AutoDmaFree;
- // old dma only
- u16 *DMAPtr;
- u32 MADR;
- u32 TADR;
+ // old dma only
+ u16* DMAPtr;
+ u32 MADR;
+ u32 TADR;
- u32 KeyOn; // not the KON register (though maybe it is)
+ u32 KeyOn; // not the KON register (though maybe it is)
- // psxmode caches
- u16 psxSoundDataTransferControl;
- u16 psxSPUSTAT;
+ // psxmode caches
+ u16 psxSoundDataTransferControl;
+ u16 psxSPUSTAT;
- // HACK -- This is a temp buffer which is (or isn't?) used to circumvent some memory
- // corruption that originates elsewhere in the plugin. >_< The actual ADMA buffer
- // is an area mapped to SPU2 main memory.
- //s16 ADMATempBuffer[0x1000];
+ // HACK -- This is a temp buffer which is (or isn't?) used to circumvent some memory
+ // corruption that originates elsewhere in the plugin. >_< The actual ADMA buffer
+ // is an area mapped to SPU2 main memory.
+ //s16 ADMATempBuffer[0x1000];
- // ----------------------------------------------------------------------------------
- // V_Core Methods
- // ----------------------------------------------------------------------------------
+ // ----------------------------------------------------------------------------------
+ // V_Core Methods
+ // ----------------------------------------------------------------------------------
- // uninitialized constructor
- V_Core()
- : Index(-1)
- , DMAPtr(NULL)
- {
- }
- V_Core(int idx); // our badass constructor
- ~V_Core() throw();
+ // uninitialized constructor
+ V_Core()
+ : Index(-1)
+ , DMAPtr(NULL)
+ {
+ }
+ V_Core(int idx); // our badass constructor
+ ~V_Core() throw();
- void Init(int index);
- void UpdateEffectsBufferSize();
- void AnalyzeReverbPreset();
+ void Init(int index);
+ void UpdateEffectsBufferSize();
+ void AnalyzeReverbPreset();
- s32 EffectsBufferIndexer(s32 offset) const;
+ s32 EffectsBufferIndexer(s32 offset) const;
- void WriteRegPS1(u32 mem, u16 value);
- u16 ReadRegPS1(u32 mem);
+ void WriteRegPS1(u32 mem, u16 value);
+ u16 ReadRegPS1(u32 mem);
- // --------------------------------------------------------------------------------------
- // Mixer Section
- // --------------------------------------------------------------------------------------
+ // --------------------------------------------------------------------------------------
+ // Mixer Section
+ // --------------------------------------------------------------------------------------
- StereoOut32 Mix(const VoiceMixSet &inVoices, const StereoOut32 &Input, const StereoOut32 &Ext);
- void Reverb_AdvanceBuffer();
- StereoOut32 DoReverb(const StereoOut32 &Input);
- s32 RevbGetIndexer(s32 offset);
+ StereoOut32 Mix(const VoiceMixSet& inVoices, const StereoOut32& Input, const StereoOut32& Ext);
+ void Reverb_AdvanceBuffer();
+ StereoOut32 DoReverb(const StereoOut32& Input);
+ s32 RevbGetIndexer(s32 offset);
- StereoOut32 ReadInput();
- StereoOut32 ReadInput_HiFi();
+ StereoOut32 ReadInput();
+ StereoOut32 ReadInput_HiFi();
- // --------------------------------------------------------------------------
- // DMA Section
- // --------------------------------------------------------------------------
+ // --------------------------------------------------------------------------
+ // DMA Section
+ // --------------------------------------------------------------------------
- // Returns the index of the DMA channel (4 for Core 0, or 7 for Core 1)
- int GetDmaIndex() const
- {
- return (Index == 0) ? 4 : 7;
- }
+ // Returns the index of the DMA channel (4 for Core 0, or 7 for Core 1)
+ int GetDmaIndex() const
+ {
+ return (Index == 0) ? 4 : 7;
+ }
- // returns either '4' or '7'
- char GetDmaIndexChar() const
- {
- return 0x30 + GetDmaIndex();
- }
+ // returns either '4' or '7'
+ char GetDmaIndexChar() const
+ {
+ return 0x30 + GetDmaIndex();
+ }
- __forceinline u16 DmaRead()
- {
- const u16 ret = (u16)spu2M_Read(TSA);
- ++TSA;
- TSA &= 0xfffff;
- return ret;
- }
+ __forceinline u16 DmaRead()
+ {
+ const u16 ret = (u16)spu2M_Read(TSA);
+ ++TSA;
+ TSA &= 0xfffff;
+ return ret;
+ }
- __forceinline void DmaWrite(u16 value)
- {
- spu2M_Write(TSA, value);
- ++TSA;
- TSA &= 0xfffff;
- }
+ __forceinline void DmaWrite(u16 value)
+ {
+ spu2M_Write(TSA, value);
+ ++TSA;
+ TSA &= 0xfffff;
+ }
- void LogAutoDMA(FILE *fp);
+ void LogAutoDMA(FILE* fp);
- s32 NewDmaRead(u32 *data, u32 bytesLeft, u32 *bytesProcessed);
- s32 NewDmaWrite(u32 *data, u32 bytesLeft, u32 *bytesProcessed);
- void NewDmaInterrupt();
+ s32 NewDmaRead(u32* data, u32 bytesLeft, u32* bytesProcessed);
+ s32 NewDmaWrite(u32* data, u32 bytesLeft, u32* bytesProcessed);
+ void NewDmaInterrupt();
- // old dma only
- void DoDMAwrite(u16 *pMem, u32 size);
- void DoDMAread(u16 *pMem, u32 size);
+ // old dma only
+ void DoDMAwrite(u16* pMem, u32 size);
+ void DoDMAread(u16* pMem, u32 size);
- void AutoDMAReadBuffer(int mode);
- void StartADMAWrite(u16 *pMem, u32 sz);
- void PlainDMAWrite(u16 *pMem, u32 sz);
+ void AutoDMAReadBuffer(int mode);
+ void StartADMAWrite(u16* pMem, u32 sz);
+ void PlainDMAWrite(u16* pMem, u32 sz);
};
extern V_Core Cores[2];
@@ -540,25 +540,25 @@ extern s16 InputPos;
// SPU Mixing Cycles ("Ticks mixed" counter)
extern u32 Cycles;
-extern s16 *spu2regs;
-extern s16 *_spu2mem;
+extern s16* spu2regs;
+extern s16* _spu2mem;
extern int PlayMode;
extern void SetIrqCall(int core);
extern void StartVoices(int core, u32 value);
extern void StopVoices(int core, u32 value);
extern void InitADSR();
-extern void CalculateADSR(V_Voice &vc);
+extern void CalculateADSR(V_Voice& vc);
extern void UpdateSpdifMode();
namespace SPU2Savestate
{
-struct DataBlock;
+ struct DataBlock;
-extern s32 __fastcall FreezeIt(DataBlock &spud);
-extern s32 __fastcall ThawIt(DataBlock &spud);
-extern s32 __fastcall SizeIt();
-}
+ extern s32 __fastcall FreezeIt(DataBlock& spud);
+ extern s32 __fastcall ThawIt(DataBlock& spud);
+ extern s32 __fastcall SizeIt();
+} // namespace SPU2Savestate
// --------------------------------------------------------------------------------------
// ADPCM Decoder Cache
@@ -580,8 +580,8 @@ static const int pcm_DecodedSamplesPerBlock = 28;
struct PcmCacheEntry
{
- bool Validated;
- s16 Sampledata[pcm_DecodedSamplesPerBlock];
+ bool Validated;
+ s16 Sampledata[pcm_DecodedSamplesPerBlock];
};
-extern PcmCacheEntry *pcm_cache_data;
+extern PcmCacheEntry* pcm_cache_data;
diff --git a/pcsx2/SPU2/regs.h b/pcsx2/SPU2/regs.h
index 72405bf222..e3530691a2 100644
--- a/pcsx2/SPU2/regs.h
+++ b/pcsx2/SPU2/regs.h
@@ -184,10 +184,10 @@ Core attributes (SD_C)
// SPU2-X Register Table LUT
// --------------------------------------------------------------------------------------
-#define U16P(x) ((u16 *)&(x))
+#define U16P(x) ((u16*)&(x))
// Returns the hiword of a 32 bit integer.
-#define U16P_HI(x) (((u16 *)&(x)) + 1)
+#define U16P_HI(x) (((u16*)&(x)) + 1)
-extern u16 *regtable[0x401];
-extern u16 const *const regtable_original[0x401];
+extern u16* regtable[0x401];
+extern u16 const* const regtable_original[0x401];
diff --git a/pcsx2/SPU2/spdif.h b/pcsx2/SPU2/spdif.h
index 4332e9cfff..c355dad23c 100644
--- a/pcsx2/SPU2/spdif.h
+++ b/pcsx2/SPU2/spdif.h
@@ -67,13 +67,13 @@ Preamble W: Marks a word containing data for channel B.
typedef struct _subframe
{
- u32 preamble : 4;
- u32 aux_data : 4;
- u32 snd_data : 20;
- u32 validity : 1;
- u32 subcode : 1;
- u32 chstatus : 1;
- u32 parity : 1;
+ u32 preamble : 4;
+ u32 aux_data : 4;
+ u32 snd_data : 20;
+ u32 validity : 1;
+ u32 subcode : 1;
+ u32 chstatus : 1;
+ u32 parity : 1;
} subframe;
/*
@@ -100,8 +100,8 @@ typedef struct _subframe
typedef struct _chstatus
{
- u8 ctrlbits : 4;
- u8 reservd1 : 4;
- u8 category;
- u8 reservd2[22];
+ u8 ctrlbits : 4;
+ u8 reservd1 : 4;
+ u8 category;
+ u8 reservd2[22];
} chstatus:
diff --git a/pcsx2/SPU2/spu2.cpp b/pcsx2/SPU2/spu2.cpp
index d8378b4176..8c636e10fa 100644
--- a/pcsx2/SPU2/spu2.cpp
+++ b/pcsx2/SPU2/spu2.cpp
@@ -26,7 +26,7 @@
using namespace Threading;
-MutexRecursive mtx_SPU2Status;
+MutexRecursive mtx_SPU2Status;
bool SPU2_dummy_callback = false;
#include "svnrev.h"
@@ -41,7 +41,7 @@ static bool IsInitialized = false;
static u32 pClocks = 0;
-u32 *cyclePtr = NULL;
+u32* cyclePtr = NULL;
u32 lClocks = 0;
@@ -49,7 +49,7 @@ u32 lClocks = 0;
static bool CheckSSE()
{
- return true;
+ return true;
#if 0
if( !cpu_detected )
@@ -68,216 +68,225 @@ static bool CheckSSE()
void SPU2configure()
{
- if (!CheckSSE())
- return;
- configure();
+ if (!CheckSSE())
+ return;
+ configure();
}
// --------------------------------------------------------------------------------------
// DMA 4/7 Callbacks from Core Emulator
// --------------------------------------------------------------------------------------
-u16 *DMABaseAddr;
+u16* DMABaseAddr;
u32 SPU2ReadMemAddr(int core)
{
- return Cores[core].MADR;
+ return Cores[core].MADR;
}
void SPU2WriteMemAddr(int core, u32 value)
{
- Cores[core].MADR = value;
+ Cores[core].MADR = value;
}
void SPU2setDMABaseAddr(uptr baseaddr)
{
- DMABaseAddr = (u16 *)baseaddr;
+ DMABaseAddr = (u16*)baseaddr;
}
-void SPU2setSettingsDir(const char *dir)
+void SPU2setSettingsDir(const char* dir)
{
- CfgSetSettingsDir(dir);
+ CfgSetSettingsDir(dir);
}
-void SPU2setLogDir(const char *dir)
+void SPU2setLogDir(const char* dir)
{
- CfgSetLogDir(dir);
+ CfgSetLogDir(dir);
}
-void SPU2readDMA4Mem(u16 *pMem, u32 size) // size now in 16bit units
+void SPU2readDMA4Mem(u16* pMem, u32 size) // size now in 16bit units
{
- if (cyclePtr != NULL)
- TimeUpdate(*cyclePtr);
+ if (cyclePtr != NULL)
+ TimeUpdate(*cyclePtr);
- FileLog("[%10d] SPU2 readDMA4Mem size %x\n", Cycles, size << 1);
- Cores[0].DoDMAread(pMem, size);
+ FileLog("[%10d] SPU2 readDMA4Mem size %x\n", Cycles, size << 1);
+ Cores[0].DoDMAread(pMem, size);
}
-void SPU2writeDMA4Mem(u16 *pMem, u32 size) // size now in 16bit units
+void SPU2writeDMA4Mem(u16* pMem, u32 size) // size now in 16bit units
{
- if (cyclePtr != NULL)
- TimeUpdate(*cyclePtr);
+ if (cyclePtr != NULL)
+ TimeUpdate(*cyclePtr);
- FileLog("[%10d] SPU2 writeDMA4Mem size %x at address %x\n", Cycles, size << 1, Cores[0].TSA);
+ FileLog("[%10d] SPU2 writeDMA4Mem size %x at address %x\n", Cycles, size << 1, Cores[0].TSA);
#ifdef S2R_ENABLE
- if (!replay_mode)
- s2r_writedma4(Cycles, pMem, size);
+ if (!replay_mode)
+ s2r_writedma4(Cycles, pMem, size);
#endif
- Cores[0].DoDMAwrite(pMem, size);
+ Cores[0].DoDMAwrite(pMem, size);
}
void SPU2interruptDMA4()
{
- FileLog("[%10d] SPU2 interruptDMA4\n", Cycles);
- Cores[0].Regs.STATX |= 0x80;
- //Cores[0].Regs.ATTR &= ~0x30;
+ FileLog("[%10d] SPU2 interruptDMA4\n", Cycles);
+ Cores[0].Regs.STATX |= 0x80;
+ //Cores[0].Regs.ATTR &= ~0x30;
}
void SPU2interruptDMA7()
{
- FileLog("[%10d] SPU2 interruptDMA7\n", Cycles);
- Cores[1].Regs.STATX |= 0x80;
- //Cores[1].Regs.ATTR &= ~0x30;
+ FileLog("[%10d] SPU2 interruptDMA7\n", Cycles);
+ Cores[1].Regs.STATX |= 0x80;
+ //Cores[1].Regs.ATTR &= ~0x30;
}
-void SPU2readDMA7Mem(u16 *pMem, u32 size)
+void SPU2readDMA7Mem(u16* pMem, u32 size)
{
- if (cyclePtr != NULL)
- TimeUpdate(*cyclePtr);
+ if (cyclePtr != NULL)
+ TimeUpdate(*cyclePtr);
- FileLog("[%10d] SPU2 readDMA7Mem size %x\n", Cycles, size << 1);
- Cores[1].DoDMAread(pMem, size);
+ FileLog("[%10d] SPU2 readDMA7Mem size %x\n", Cycles, size << 1);
+ Cores[1].DoDMAread(pMem, size);
}
-void SPU2writeDMA7Mem(u16 *pMem, u32 size)
+void SPU2writeDMA7Mem(u16* pMem, u32 size)
{
- if (cyclePtr != NULL)
- TimeUpdate(*cyclePtr);
+ if (cyclePtr != NULL)
+ TimeUpdate(*cyclePtr);
- FileLog("[%10d] SPU2 writeDMA7Mem size %x at address %x\n", Cycles, size << 1, Cores[1].TSA);
+ FileLog("[%10d] SPU2 writeDMA7Mem size %x at address %x\n", Cycles, size << 1, Cores[1].TSA);
#ifdef S2R_ENABLE
- if (!replay_mode)
- s2r_writedma7(Cycles, pMem, size);
+ if (!replay_mode)
+ s2r_writedma7(Cycles, pMem, size);
#endif
- Cores[1].DoDMAwrite(pMem, size);
+ Cores[1].DoDMAwrite(pMem, size);
}
s32 SPU2reset()
{
- if (SndBuffer::Test() == 0 && SampleRate != 48000)
- {
- SampleRate = 48000;
- SndBuffer::Cleanup();
+ if (SndBuffer::Test() == 0 && SampleRate != 48000)
+ {
+ SampleRate = 48000;
+ SndBuffer::Cleanup();
- try {
- SndBuffer::Init();
- }
- catch (std::exception& ex) {
- fprintf(stderr, "SPU2-X Error: Could not initialize device, or something.\nReason: %s", ex.what());
- SPU2close();
- return -1;
- }
- }
- else
- SampleRate = 48000;
+ try
+ {
+ SndBuffer::Init();
+ }
+ catch (std::exception& ex)
+ {
+ fprintf(stderr, "SPU2-X Error: Could not initialize device, or something.\nReason: %s", ex.what());
+ SPU2close();
+ return -1;
+ }
+ }
+ else
+ SampleRate = 48000;
- memset(spu2regs, 0, 0x010000);
- memset(_spu2mem, 0, 0x200000);
- memset(_spu2mem + 0x2800, 7, 0x10); // from BIOS reversal. Locks the voices so they don't run free.
- Cores[0].Init(0);
- Cores[1].Init(1);
- return 0;
+ memset(spu2regs, 0, 0x010000);
+ memset(_spu2mem, 0, 0x200000);
+ memset(_spu2mem + 0x2800, 7, 0x10); // from BIOS reversal. Locks the voices so they don't run free.
+ Cores[0].Init(0);
+ Cores[1].Init(1);
+ return 0;
}
s32 SPU2ps1reset()
{
- printf("RESET PS1 \n");
+ printf("RESET PS1 \n");
- if (SndBuffer::Test() == 0 && SampleRate != 44100)
- {
- SampleRate = 44100;
- SndBuffer::Cleanup();
+ if (SndBuffer::Test() == 0 && SampleRate != 44100)
+ {
+ SampleRate = 44100;
+ SndBuffer::Cleanup();
- try {
- SndBuffer::Init();
- }
- catch (std::exception& ex) {
- fprintf(stderr, "SPU2-X Error: Could not initialize device, or something.\nReason: %s", ex.what());
- SPU2close();
- return -1;
- }
- }
- else
- SampleRate = 44100;
+ try
+ {
+ SndBuffer::Init();
+ }
+ catch (std::exception& ex)
+ {
+ fprintf(stderr, "SPU2-X Error: Could not initialize device, or something.\nReason: %s", ex.what());
+ SPU2close();
+ return -1;
+ }
+ }
+ else
+ SampleRate = 44100;
- /* memset(spu2regs, 0, 0x010000);
+ /* memset(spu2regs, 0, 0x010000);
memset(_spu2mem, 0, 0x200000);
memset(_spu2mem + 0x2800, 7, 0x10); // from BIOS reversal. Locks the voices so they don't run free.
Cores[0].Init(0);
Cores[1].Init(1);*/
- return 0;
+ return 0;
}
s32 SPU2init()
{
- assert(regtable[0x400] == NULL);
+ assert(regtable[0x400] == NULL);
- if (IsInitialized) {
- printf(" * SPU2-X: Already initialized - Ignoring SPU2init signal.");
- return 0;
- }
+ if (IsInitialized)
+ {
+ printf(" * SPU2-X: Already initialized - Ignoring SPU2init signal.");
+ return 0;
+ }
- IsInitialized = true;
- SPU2_dummy_callback = false;
+ IsInitialized = true;
+ SPU2_dummy_callback = false;
- ReadSettings();
+ ReadSettings();
#ifdef SPU2_LOG
- if (AccessLog()) {
- spu2Log = OpenLog(AccessLogFileName);
- setvbuf(spu2Log, NULL, _IONBF, 0);
- FileLog("SPU2init\n");
- }
+ if (AccessLog())
+ {
+ spu2Log = OpenLog(AccessLogFileName);
+ setvbuf(spu2Log, NULL, _IONBF, 0);
+ FileLog("SPU2init\n");
+ }
#endif
- srand((unsigned)time(NULL));
+ srand((unsigned)time(NULL));
- spu2regs = (s16 *)malloc(0x010000);
- _spu2mem = (s16 *)malloc(0x200000);
+ spu2regs = (s16*)malloc(0x010000);
+ _spu2mem = (s16*)malloc(0x200000);
- // adpcm decoder cache:
- // the cache data size is determined by taking the number of adpcm blocks
- // (2MB / 16) and multiplying it by the decoded block size (28 samples).
- // Thus: pcm_cache_data = 7,340,032 bytes (ouch!)
- // Expanded: 16 bytes expands to 56 bytes [3.5:1 ratio]
- // Resulting in 2MB * 3.5.
+ // adpcm decoder cache:
+ // the cache data size is determined by taking the number of adpcm blocks
+ // (2MB / 16) and multiplying it by the decoded block size (28 samples).
+ // Thus: pcm_cache_data = 7,340,032 bytes (ouch!)
+ // Expanded: 16 bytes expands to 56 bytes [3.5:1 ratio]
+ // Resulting in 2MB * 3.5.
- pcm_cache_data = (PcmCacheEntry *)calloc(pcm_BlockCount, sizeof(PcmCacheEntry));
+ pcm_cache_data = (PcmCacheEntry*)calloc(pcm_BlockCount, sizeof(PcmCacheEntry));
- if ((spu2regs == NULL) || (_spu2mem == NULL) || (pcm_cache_data == NULL)) {
- SysMessage("SPU2-X: Error allocating Memory\n");
- return -1;
- }
+ if ((spu2regs == NULL) || (_spu2mem == NULL) || (pcm_cache_data == NULL))
+ {
+ SysMessage("SPU2-X: Error allocating Memory\n");
+ return -1;
+ }
- // Patch up a copy of regtable that directly maps "NULLs" to SPU2 memory.
+ // Patch up a copy of regtable that directly maps "NULLs" to SPU2 memory.
- memcpy(regtable, regtable_original, sizeof(regtable));
+ memcpy(regtable, regtable_original, sizeof(regtable));
- for (uint mem = 0; mem < 0x800; mem++) {
- u16 *ptr = regtable[mem >> 1];
- if (!ptr) {
- regtable[mem >> 1] = &(spu2Ru16(mem));
- }
- }
+ for (uint mem = 0; mem < 0x800; mem++)
+ {
+ u16* ptr = regtable[mem >> 1];
+ if (!ptr)
+ {
+ regtable[mem >> 1] = &(spu2Ru16(mem));
+ }
+ }
- SPU2reset();
+ SPU2reset();
- DMALogOpen();
- InitADSR();
+ DMALogOpen();
+ InitADSR();
#ifdef S2R_ENABLE
- if (!replay_mode)
- s2r_open(Cycles, "replay_dump.s2r");
+ if (!replay_mode)
+ s2r_open(Cycles, "replay_dump.s2r");
#endif
- return 0;
+ return 0;
}
#ifdef _MSC_VER
@@ -287,147 +296,158 @@ extern HWND hDebugDialog;
static INT_PTR CALLBACK DebugProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- int wmId;
+ int wmId;
- switch (uMsg) {
- case WM_PAINT:
- return FALSE;
- case WM_INITDIALOG: {
- debugDialogOpen = true;
- } break;
+ switch (uMsg)
+ {
+ case WM_PAINT:
+ return FALSE;
+ case WM_INITDIALOG:
+ {
+ debugDialogOpen = true;
+ }
+ break;
- case WM_COMMAND:
- wmId = LOWORD(wParam);
- // Parse the menu selections:
- switch (wmId) {
- case IDOK:
- case IDCANCEL:
- debugDialogOpen = false;
- EndDialog(hWnd, 0);
- break;
- default:
- return FALSE;
- }
- break;
+ case WM_COMMAND:
+ wmId = LOWORD(wParam);
+ // Parse the menu selections:
+ switch (wmId)
+ {
+ case IDOK:
+ case IDCANCEL:
+ debugDialogOpen = false;
+ EndDialog(hWnd, 0);
+ break;
+ default:
+ return FALSE;
+ }
+ break;
- default:
- return FALSE;
- }
- return TRUE;
+ default:
+ return FALSE;
+ }
+ return TRUE;
}
#endif
uptr gsWindowHandle = 0;
-s32 SPU2open(void *pDsp)
+s32 SPU2open(void* pDsp)
{
- ScopedLock lock( mtx_SPU2Status );
- if (IsOpened)
- return 0;
+ ScopedLock lock(mtx_SPU2Status);
+ if (IsOpened)
+ return 0;
- FileLog("[%10d] SPU2 Open\n", Cycles);
+ FileLog("[%10d] SPU2 Open\n", Cycles);
- if (pDsp != NULL)
- gsWindowHandle = *(uptr *)pDsp;
- else
- gsWindowHandle = 0;
+ if (pDsp != NULL)
+ gsWindowHandle = *(uptr*)pDsp;
+ else
+ gsWindowHandle = 0;
#ifdef _MSC_VER
#ifdef PCSX2_DEVBUILD // Define may not be needed but not tested yet. Better make sure.
- if (IsDevBuild && VisualDebug()) {
- if (debugDialogOpen == 0) {
- hDebugDialog = CreateDialogParam(hInstance, MAKEINTRESOURCE(IDD_DEBUG), 0, DebugProc, 0);
- ShowWindow(hDebugDialog, SW_SHOWNORMAL);
- debugDialogOpen = 1;
- }
- } else if (debugDialogOpen) {
- DestroyWindow(hDebugDialog);
- debugDialogOpen = 0;
- }
+ if (IsDevBuild && VisualDebug())
+ {
+ if (debugDialogOpen == 0)
+ {
+ hDebugDialog = CreateDialogParam(hInstance, MAKEINTRESOURCE(IDD_DEBUG), 0, DebugProc, 0);
+ ShowWindow(hDebugDialog, SW_SHOWNORMAL);
+ debugDialogOpen = 1;
+ }
+ }
+ else if (debugDialogOpen)
+ {
+ DestroyWindow(hDebugDialog);
+ debugDialogOpen = 0;
+ }
#endif
#endif
- IsOpened = true;
- lClocks = (cyclePtr != NULL) ? *cyclePtr : 0;
+ IsOpened = true;
+ lClocks = (cyclePtr != NULL) ? *cyclePtr : 0;
- try {
- SndBuffer::Init();
+ try
+ {
+ SndBuffer::Init();
#ifndef __POSIX__
- DspLoadLibrary(dspPlugin, dspPluginModule);
+ DspLoadLibrary(dspPlugin, dspPluginModule);
#endif
- WaveDump::Open();
- } catch (std::exception &ex) {
- fprintf(stderr, "SPU2-X Error: Could not initialize device, or something.\nReason: %s", ex.what());
- SPU2close();
- return -1;
- }
- SPU2setDMABaseAddr((uptr)iopMem->Main);
+ WaveDump::Open();
+ }
+ catch (std::exception& ex)
+ {
+ fprintf(stderr, "SPU2-X Error: Could not initialize device, or something.\nReason: %s", ex.what());
+ SPU2close();
+ return -1;
+ }
+ SPU2setDMABaseAddr((uptr)iopMem->Main);
SPU2setClockPtr(&psxRegs.cycle);
- return 0;
+ return 0;
}
void SPU2close()
{
- ScopedLock lock( mtx_SPU2Status );
- if (!IsOpened)
- return;
- IsOpened = false;
+ ScopedLock lock(mtx_SPU2Status);
+ if (!IsOpened)
+ return;
+ IsOpened = false;
- FileLog("[%10d] SPU2 Close\n", Cycles);
+ FileLog("[%10d] SPU2 Close\n", Cycles);
#ifndef __POSIX__
- DspCloseLibrary();
+ DspCloseLibrary();
#endif
- SndBuffer::Cleanup();
+ SndBuffer::Cleanup();
}
void SPU2shutdown()
{
- if (!IsInitialized)
- return;
- IsInitialized = false;
- SPU2_dummy_callback = false;
+ if (!IsInitialized)
+ return;
+ IsInitialized = false;
+ SPU2_dummy_callback = false;
- ConLog("* SPU2-X: Shutting down.\n");
+ ConLog("* SPU2-X: Shutting down.\n");
- SPU2close();
+ SPU2close();
#ifdef S2R_ENABLE
- if (!replay_mode)
- s2r_close();
+ if (!replay_mode)
+ s2r_close();
#endif
- DoFullDump();
+ DoFullDump();
#ifdef STREAM_DUMP
- fclose(il0);
- fclose(il1);
+ fclose(il0);
+ fclose(il1);
#endif
#ifdef EFFECTS_DUMP
- fclose(el0);
- fclose(el1);
+ fclose(el0);
+ fclose(el1);
#endif
- WaveDump::Close();
+ WaveDump::Close();
- DMALogClose();
+ DMALogClose();
- safe_free(spu2regs);
- safe_free(_spu2mem);
- safe_free(pcm_cache_data);
+ safe_free(spu2regs);
+ safe_free(_spu2mem);
+ safe_free(pcm_cache_data);
#ifdef SPU2_LOG
- if (!AccessLog())
- return;
- FileLog("[%10d] SPU2shutdown\n", Cycles);
- if (spu2Log)
- fclose(spu2Log);
+ if (!AccessLog())
+ return;
+ FileLog("[%10d] SPU2shutdown\n", Cycles);
+ if (spu2Log)
+ fclose(spu2Log);
#endif
}
-void SPU2setClockPtr(u32 *ptr)
+void SPU2setClockPtr(u32* ptr)
{
- cyclePtr = ptr;
+ cyclePtr = ptr;
}
#ifdef DEBUG_KEYS
@@ -437,116 +457,134 @@ static bool lState[6];
void SPU2async(u32 cycles)
{
- DspUpdate();
+ DspUpdate();
- if (cyclePtr != NULL) {
- TimeUpdate(*cyclePtr);
- } else {
- pClocks += cycles;
- TimeUpdate(pClocks);
- }
+ if (cyclePtr != NULL)
+ {
+ TimeUpdate(*cyclePtr);
+ }
+ else
+ {
+ pClocks += cycles;
+ TimeUpdate(pClocks);
+ }
#ifdef DEBUG_KEYS
- u32 curTicks = GetTickCount();
- if ((curTicks - lastTicks) >= 50) {
- int oldI = Interpolation;
- bool cState[6];
- for (int i = 0; i < 6; i++) {
- cState[i] = !!(GetAsyncKeyState(VK_NUMPAD0 + i) & 0x8000);
+ u32 curTicks = GetTickCount();
+ if ((curTicks - lastTicks) >= 50)
+ {
+ int oldI = Interpolation;
+ bool cState[6];
+ for (int i = 0; i < 6; i++)
+ {
+ cState[i] = !!(GetAsyncKeyState(VK_NUMPAD0 + i) & 0x8000);
- if ((cState[i] && !lState[i]) && i != 5)
- Interpolation = i;
+ if ((cState[i] && !lState[i]) && i != 5)
+ Interpolation = i;
- if ((cState[i] && !lState[i]) && i == 5) {
- postprocess_filter_enabled = !postprocess_filter_enabled;
- printf("Post process filters %s \n", postprocess_filter_enabled ? "enabled" : "disabled");
- }
+ if ((cState[i] && !lState[i]) && i == 5)
+ {
+ postprocess_filter_enabled = !postprocess_filter_enabled;
+ printf("Post process filters %s \n", postprocess_filter_enabled ? "enabled" : "disabled");
+ }
- lState[i] = cState[i];
- }
+ lState[i] = cState[i];
+ }
- if (Interpolation != oldI) {
- printf("Interpolation set to %d", Interpolation);
- switch (Interpolation) {
- case 0:
- printf(" - Nearest.\n");
- break;
- case 1:
- printf(" - Linear.\n");
- break;
- case 2:
- printf(" - Cubic.\n");
- break;
- case 3:
- printf(" - Hermite.\n");
- break;
- case 4:
- printf(" - Catmull-Rom.\n");
- break;
- default:
- printf(" (unknown).\n");
- break;
- }
- }
+ if (Interpolation != oldI)
+ {
+ printf("Interpolation set to %d", Interpolation);
+ switch (Interpolation)
+ {
+ case 0:
+ printf(" - Nearest.\n");
+ break;
+ case 1:
+ printf(" - Linear.\n");
+ break;
+ case 2:
+ printf(" - Cubic.\n");
+ break;
+ case 3:
+ printf(" - Hermite.\n");
+ break;
+ case 4:
+ printf(" - Catmull-Rom.\n");
+ break;
+ default:
+ printf(" (unknown).\n");
+ break;
+ }
+ }
- lastTicks = curTicks;
- }
+ lastTicks = curTicks;
+ }
#endif
}
u16 SPU2read(u32 rmem)
{
- // if(!replay_mode)
- // s2r_readreg(Cycles,rmem);
+ // if(!replay_mode)
+ // s2r_readreg(Cycles,rmem);
- u16 ret = 0xDEAD;
- u32 core = 0, mem = rmem & 0xFFFF, omem = mem;
- if (mem & 0x400) {
- omem ^= 0x400;
- core = 1;
- }
+ u16 ret = 0xDEAD;
+ u32 core = 0, mem = rmem & 0xFFFF, omem = mem;
+ if (mem & 0x400)
+ {
+ omem ^= 0x400;
+ core = 1;
+ }
- if (omem == 0x1f9001AC) {
- ret = Cores[core].DmaRead();
- } else {
- if (cyclePtr != NULL)
- TimeUpdate(*cyclePtr);
+ if (omem == 0x1f9001AC)
+ {
+ ret = Cores[core].DmaRead();
+ }
+ else
+ {
+ if (cyclePtr != NULL)
+ TimeUpdate(*cyclePtr);
- if (rmem >> 16 == 0x1f80) {
- ret = Cores[0].ReadRegPS1(rmem);
- } else if (mem >= 0x800) {
- ret = spu2Ru16(mem);
- ConLog("* SPU2-X: Read from reg>=0x800: %x value %x\n", mem, ret);
- } else {
- ret = *(regtable[(mem >> 1)]);
- //FileLog("[%10d] SPU2 read mem %x (core %d, register %x): %x\n",Cycles, mem, core, (omem & 0x7ff), ret);
- SPU2writeLog("read", rmem, ret);
- }
- }
+ if (rmem >> 16 == 0x1f80)
+ {
+ ret = Cores[0].ReadRegPS1(rmem);
+ }
+ else if (mem >= 0x800)
+ {
+ ret = spu2Ru16(mem);
+ ConLog("* SPU2-X: Read from reg>=0x800: %x value %x\n", mem, ret);
+ }
+ else
+ {
+ ret = *(regtable[(mem >> 1)]);
+ //FileLog("[%10d] SPU2 read mem %x (core %d, register %x): %x\n",Cycles, mem, core, (omem & 0x7ff), ret);
+ SPU2writeLog("read", rmem, ret);
+ }
+ }
- return ret;
+ return ret;
}
void SPU2write(u32 rmem, u16 value)
{
#ifdef S2R_ENABLE
- if (!replay_mode)
- s2r_writereg(Cycles, rmem, value);
+ if (!replay_mode)
+ s2r_writereg(Cycles, rmem, value);
#endif
- // Note: Reverb/Effects are very sensitive to having precise update timings.
- // If the SPU2 isn't in in sync with the IOP, samples can end up playing at rather
- // incorrect pitches and loop lengths.
+ // Note: Reverb/Effects are very sensitive to having precise update timings.
+ // If the SPU2 isn't in in sync with the IOP, samples can end up playing at rather
+ // incorrect pitches and loop lengths.
- if (cyclePtr != NULL)
- TimeUpdate(*cyclePtr);
+ if (cyclePtr != NULL)
+ TimeUpdate(*cyclePtr);
- if (rmem >> 16 == 0x1f80)
- Cores[0].WriteRegPS1(rmem, value);
- else {
- SPU2writeLog("write", rmem, value);
- SPU2_FastWrite(rmem, value);
- }
+ if (rmem >> 16 == 0x1f80)
+ Cores[0].WriteRegPS1(rmem, value);
+ else
+ {
+ SPU2writeLog("write", rmem, value);
+ SPU2_FastWrite(rmem, value);
+ }
}
// if start is 1, starts recording spu2 data, else stops
@@ -554,80 +592,86 @@ void SPU2write(u32 rmem, u16 value)
// for now, pData is not used
int SPU2setupRecording(int start, std::wstring* filename)
{
- if (start == 0)
- RecordStop();
- else if (start == 1)
- RecordStart(filename);
+ if (start == 0)
+ RecordStop();
+ else if (start == 1)
+ RecordStart(filename);
- return 0;
+ return 0;
}
-s32 SPU2freeze(int mode, freezeData *data)
+s32 SPU2freeze(int mode, freezeData* data)
{
- pxAssume(data != NULL);
- if (!data) {
- printf("SPU2-X savestate null pointer!\n");
- return -1;
- }
+ pxAssume(data != NULL);
+ if (!data)
+ {
+ printf("SPU2-X savestate null pointer!\n");
+ return -1;
+ }
- if (mode == FREEZE_SIZE) {
- data->size = SPU2Savestate::SizeIt();
- return 0;
- }
+ if (mode == FREEZE_SIZE)
+ {
+ data->size = SPU2Savestate::SizeIt();
+ return 0;
+ }
- pxAssume(mode == FREEZE_LOAD || mode == FREEZE_SAVE);
+ pxAssume(mode == FREEZE_LOAD || mode == FREEZE_SAVE);
- if (data->data == NULL) {
- printf("SPU2-X savestate null pointer!\n");
- return -1;
- }
+ if (data->data == NULL)
+ {
+ printf("SPU2-X savestate null pointer!\n");
+ return -1;
+ }
- SPU2Savestate::DataBlock &spud = (SPU2Savestate::DataBlock &)*(data->data);
+ SPU2Savestate::DataBlock& spud = (SPU2Savestate::DataBlock&)*(data->data);
- switch (mode) {
- case FREEZE_LOAD:
- return SPU2Savestate::ThawIt(spud);
- case FREEZE_SAVE:
- return SPU2Savestate::FreezeIt(spud);
+ switch (mode)
+ {
+ case FREEZE_LOAD:
+ return SPU2Savestate::ThawIt(spud);
+ case FREEZE_SAVE:
+ return SPU2Savestate::FreezeIt(spud);
- jNO_DEFAULT;
- }
+ jNO_DEFAULT;
+ }
- // technically unreachable, but kills a warning:
- return 0;
+ // technically unreachable, but kills a warning:
+ return 0;
}
-void SPU2DoFreezeOut( void* dest )
+void SPU2DoFreezeOut(void* dest)
{
- ScopedLock lock( mtx_SPU2Status );
+ ScopedLock lock(mtx_SPU2Status);
- freezeData fP = { 0, (s8*)dest };
- if (SPU2freeze( FREEZE_SIZE, &fP)!=0) return;
- if (!fP.size) return;
+ freezeData fP = {0, (s8*)dest};
+ if (SPU2freeze(FREEZE_SIZE, &fP) != 0)
+ return;
+ if (!fP.size)
+ return;
- Console.Indent().WriteLn( "Saving SPU-2");
+ Console.Indent().WriteLn("Saving SPU-2");
- if (SPU2freeze(FREEZE_SAVE, &fP)!=0)
- throw std::runtime_error(" * SPU-2: Error saving state!\n");
+ if (SPU2freeze(FREEZE_SAVE, &fP) != 0)
+ throw std::runtime_error(" * SPU-2: Error saving state!\n");
}
-void SPU2DoFreezeIn( pxInputStream& infp )
+void SPU2DoFreezeIn(pxInputStream& infp)
{
- ScopedLock lock( mtx_SPU2Status );
+ ScopedLock lock(mtx_SPU2Status);
- freezeData fP = { 0, NULL };
- if (SPU2freeze( FREEZE_SIZE, &fP )!=0)
+ freezeData fP = {0, NULL};
+ if (SPU2freeze(FREEZE_SIZE, &fP) != 0)
fP.size = 0;
- Console.Indent().WriteLn( "Loading SPU-2");
+ Console.Indent().WriteLn("Loading SPU-2");
if (!infp.IsOk() || !infp.Length())
{
// no state data to read, but SPU-2 expects some state data?
// Issue a warning to console...
- if( fP.size != 0 )
- Console.Indent().Warning( "Warning: No data for SPU-2 found. Status may be unpredictable." );
+ if (fP.size != 0)
+ Console.Indent().Warning("Warning: No data for SPU-2 found. Status may be unpredictable.");
return;
@@ -637,10 +681,10 @@ void SPU2DoFreezeIn( pxInputStream& infp )
// on the status of the plugin when loading, so let's ignore it.
}
- ScopedAlloc data( fP.size );
+ ScopedAlloc data(fP.size);
fP.data = data.GetPtr();
- infp.Read( fP.data, fP.size );
- if (SPU2freeze(FREEZE_LOAD, &fP)!=0)
- throw std::runtime_error(" * SPU-2: Error loading state!\n");
+ infp.Read(fP.data, fP.size);
+ if (SPU2freeze(FREEZE_LOAD, &fP) != 0)
+ throw std::runtime_error(" * SPU-2: Error loading state!\n");
}
diff --git a/pcsx2/SPU2/spu2.h b/pcsx2/SPU2/spu2.h
index 19d310fe1f..0c2b416df0 100644
--- a/pcsx2/SPU2/spu2.h
+++ b/pcsx2/SPU2/spu2.h
@@ -19,14 +19,14 @@
#include "Utilities/Threading.h"
#include "SaveState.h"
-extern Threading::MutexRecursive mtx_SPU2Status;
+extern Threading::MutexRecursive mtx_SPU2Status;
extern bool SPU2_dummy_callback;
s32 SPU2init();
s32 SPU2reset();
s32 SPU2ps1reset();
-s32 SPU2open(void *pDsp);
+s32 SPU2open(void* pDsp);
void SPU2close();
void SPU2shutdown();
void SPU2write(u32 mem, u16 value);
@@ -38,40 +38,40 @@ u16 SPU2read(u32 mem);
// for now, pData is not used
int SPU2setupRecording(int start, std::wstring* filename);
-void SPU2setClockPtr(u32 *ptr);
+void SPU2setClockPtr(u32* ptr);
void SPU2async(u32 cycles);
-s32 SPU2freeze(int mode, freezeData *data);
-void SPU2DoFreezeIn( pxInputStream& infp );
-void SPU2DoFreezeOut( void* dest );
+s32 SPU2freeze(int mode, freezeData* data);
+void SPU2DoFreezeIn(pxInputStream& infp);
+void SPU2DoFreezeOut(void* dest);
void SPU2configure();
u32 SPU2ReadMemAddr(int core);
void SPU2WriteMemAddr(int core, u32 value);
void SPU2setDMABaseAddr(uptr baseaddr);
-void SPU2setSettingsDir(const char *dir);
-void SPU2setLogDir(const char *dir);
-void SPU2readDMA4Mem(u16 *pMem, u32 size);
-void SPU2writeDMA4Mem(u16 *pMem, u32 size);
+void SPU2setSettingsDir(const char* dir);
+void SPU2setLogDir(const char* dir);
+void SPU2readDMA4Mem(u16* pMem, u32 size);
+void SPU2writeDMA4Mem(u16* pMem, u32 size);
void SPU2interruptDMA4();
void SPU2interruptDMA7();
-void SPU2readDMA7Mem(u16 *pMem, u32 size);
-void SPU2writeDMA7Mem(u16 *pMem, u32 size);
+void SPU2readDMA7Mem(u16* pMem, u32 size);
+void SPU2writeDMA7Mem(u16* pMem, u32 size);
#include "spu2replay.h"
extern u8 callirq;
-extern s16 *input_data;
+extern s16* input_data;
extern u32 input_data_ptr;
extern double srate_pv;
extern int recording;
extern u32 lClocks;
-extern u32 *cyclePtr;
+extern u32* cyclePtr;
-extern void SPU2writeLog(const char *action, u32 rmem, u16 value);
+extern void SPU2writeLog(const char* action, u32 rmem, u16 value);
extern void TimeUpdate(u32 cClocks);
extern void SPU2_FastWrite(u32 rmem, u16 value);
diff --git a/pcsx2/SPU2/spu2freeze.cpp b/pcsx2/SPU2/spu2freeze.cpp
index 9478ebc9d9..997dbbf086 100644
--- a/pcsx2/SPU2/spu2freeze.cpp
+++ b/pcsx2/SPU2/spu2freeze.cpp
@@ -18,128 +18,133 @@
namespace SPU2Savestate
{
-// Arbitrary ID to identify SPU2-X saves.
-static const u32 SAVE_ID = 0x1227521;
+ // Arbitrary ID to identify SPU2-X saves.
+ static const u32 SAVE_ID = 0x1227521;
-// versioning for saves.
-// Increment this when changes to the savestate system are made.
-static const u32 SAVE_VERSION = 0x000e;
+ // versioning for saves.
+ // Increment this when changes to the savestate system are made.
+ static const u32 SAVE_VERSION = 0x000e;
-static void wipe_the_cache()
-{
- memset(pcm_cache_data, 0, pcm_BlockCount * sizeof(PcmCacheEntry));
-}
-}
+ static void wipe_the_cache()
+ {
+ memset(pcm_cache_data, 0, pcm_BlockCount * sizeof(PcmCacheEntry));
+ }
+} // namespace SPU2Savestate
struct SPU2Savestate::DataBlock
{
- u32 spu2id; // SPU2-X state identifier lets ZeroGS/PeopsSPU2 know this isn't their state)
- u8 unkregs[0x10000]; // SPU2 raw register memory
- u8 mem[0x200000]; // SPU2 raw sample memory
+ u32 spu2id; // SPU2-X state identifier lets ZeroGS/PeopsSPU2 know this isn't their state)
+ u8 unkregs[0x10000]; // SPU2 raw register memory
+ u8 mem[0x200000]; // SPU2 raw sample memory
- u32 version; // SPU2-X version identifier
- V_Core Cores[2];
- V_SPDIF Spdif;
- s16 OutPos;
- s16 InputPos;
- u32 Cycles;
- u32 lClocks;
- int PlayMode;
+ u32 version; // SPU2-X version identifier
+ V_Core Cores[2];
+ V_SPDIF Spdif;
+ s16 OutPos;
+ s16 InputPos;
+ u32 Cycles;
+ u32 lClocks;
+ int PlayMode;
};
-s32 __fastcall SPU2Savestate::FreezeIt(DataBlock &spud)
+s32 __fastcall SPU2Savestate::FreezeIt(DataBlock& spud)
{
- spud.spu2id = SAVE_ID;
- spud.version = SAVE_VERSION;
+ spud.spu2id = SAVE_ID;
+ spud.version = SAVE_VERSION;
- pxAssertMsg(spu2regs && _spu2mem, "Looks like PCSX2 is trying to savestate while components are shut down. That's a no-no! It shouldn't crash, but the savestate will probably be corrupted.");
+ pxAssertMsg(spu2regs && _spu2mem, "Looks like PCSX2 is trying to savestate while components are shut down. That's a no-no! It shouldn't crash, but the savestate will probably be corrupted.");
- if (spu2regs != NULL)
- memcpy(spud.unkregs, spu2regs, sizeof(spud.unkregs));
- if (_spu2mem != NULL)
- memcpy(spud.mem, _spu2mem, sizeof(spud.mem));
+ if (spu2regs != NULL)
+ memcpy(spud.unkregs, spu2regs, sizeof(spud.unkregs));
+ if (_spu2mem != NULL)
+ memcpy(spud.mem, _spu2mem, sizeof(spud.mem));
- memcpy(spud.Cores, Cores, sizeof(Cores));
- memcpy(&spud.Spdif, &Spdif, sizeof(Spdif));
+ memcpy(spud.Cores, Cores, sizeof(Cores));
+ memcpy(&spud.Spdif, &Spdif, sizeof(Spdif));
- spud.OutPos = OutPos;
- spud.InputPos = InputPos;
- spud.Cycles = Cycles;
- spud.lClocks = lClocks;
- spud.PlayMode = PlayMode;
+ spud.OutPos = OutPos;
+ spud.InputPos = InputPos;
+ spud.Cycles = Cycles;
+ spud.lClocks = lClocks;
+ spud.PlayMode = PlayMode;
- // note: Don't save the cache. PCSX2 doesn't offer a safe method of predicting
- // the required size of the savestate prior to saving, plus this is just too
- // "implementation specific" for the intended spec of a savestate. Let's just
- // force the user to rebuild their cache instead.
+ // note: Don't save the cache. PCSX2 doesn't offer a safe method of predicting
+ // the required size of the savestate prior to saving, plus this is just too
+ // "implementation specific" for the intended spec of a savestate. Let's just
+ // force the user to rebuild their cache instead.
- return 0;
+ return 0;
}
-s32 __fastcall SPU2Savestate::ThawIt(DataBlock &spud)
+s32 __fastcall SPU2Savestate::ThawIt(DataBlock& spud)
{
- if (spud.spu2id != SAVE_ID || spud.version < SAVE_VERSION) {
- fprintf(stderr, "\n*** SPU2-X Warning:\n");
- if (spud.spu2id == SAVE_ID)
- fprintf(stderr, "\tSavestate version is from an older version of PCSX2.\n");
- else
- fprintf(stderr, "\tThe savestate you are trying to load is incorrect or corrupted.\n");
+ if (spud.spu2id != SAVE_ID || spud.version < SAVE_VERSION)
+ {
+ fprintf(stderr, "\n*** SPU2-X Warning:\n");
+ if (spud.spu2id == SAVE_ID)
+ fprintf(stderr, "\tSavestate version is from an older version of PCSX2.\n");
+ else
+ fprintf(stderr, "\tThe savestate you are trying to load is incorrect or corrupted.\n");
- fprintf(stderr,
- "\tAudio may not recover correctly. Save your game to memorycard, reset,\n\n"
- "\tand then continue from there.\n\n");
+ fprintf(stderr,
+ "\tAudio may not recover correctly. Save your game to memorycard, reset,\n\n"
+ "\tand then continue from there.\n\n");
- // Do *not* reset the cores.
- // We'll need some "hints" as to how the cores should be initialized, and the
- // only way to get that is to use the game's existing core settings and hope
- // they kinda match the settings for the savestate (IRQ enables and such).
+ // Do *not* reset the cores.
+ // We'll need some "hints" as to how the cores should be initialized, and the
+ // only way to get that is to use the game's existing core settings and hope
+ // they kinda match the settings for the savestate (IRQ enables and such).
- // adpcm cache : Clear all the cache flags and buffers.
+ // adpcm cache : Clear all the cache flags and buffers.
- wipe_the_cache();
- } else {
- SndBuffer::ClearContents();
+ wipe_the_cache();
+ }
+ else
+ {
+ SndBuffer::ClearContents();
- pxAssertMsg(spu2regs && _spu2mem, "Looks like PCSX2 is trying to loadstate while components are shut down. That's a no-no! It shouldn't crash, but the savestate will probably be corrupted.");
+ pxAssertMsg(spu2regs && _spu2mem, "Looks like PCSX2 is trying to loadstate while components are shut down. That's a no-no! It shouldn't crash, but the savestate will probably be corrupted.");
- // base stuff
- if (spu2regs)
- memcpy(spu2regs, spud.unkregs, sizeof(spud.unkregs));
- if (_spu2mem)
- memcpy(_spu2mem, spud.mem, sizeof(spud.mem));
+ // base stuff
+ if (spu2regs)
+ memcpy(spu2regs, spud.unkregs, sizeof(spud.unkregs));
+ if (_spu2mem)
+ memcpy(_spu2mem, spud.mem, sizeof(spud.mem));
- memcpy(Cores, spud.Cores, sizeof(Cores));
- memcpy(&Spdif, &spud.Spdif, sizeof(Spdif));
+ memcpy(Cores, spud.Cores, sizeof(Cores));
+ memcpy(&Spdif, &spud.Spdif, sizeof(Spdif));
- OutPos = spud.OutPos;
- InputPos = spud.InputPos;
- Cycles = spud.Cycles;
- lClocks = spud.lClocks;
- PlayMode = spud.PlayMode;
+ OutPos = spud.OutPos;
+ InputPos = spud.InputPos;
+ Cycles = spud.Cycles;
+ lClocks = spud.lClocks;
+ PlayMode = spud.PlayMode;
- wipe_the_cache();
+ wipe_the_cache();
- // Go through the V_Voice structs and recalculate SBuffer pointer from
- // the NextA setting.
+ // Go through the V_Voice structs and recalculate SBuffer pointer from
+ // the NextA setting.
- for (int c = 0; c < 2; c++) {
- for (int v = 0; v < 24; v++) {
- const int cacheIdx = Cores[c].Voices[v].NextA / pcm_WordsPerBlock;
- Cores[c].Voices[v].SBuffer = pcm_cache_data[cacheIdx].Sampledata;
- }
- }
+ for (int c = 0; c < 2; c++)
+ {
+ for (int v = 0; v < 24; v++)
+ {
+ const int cacheIdx = Cores[c].Voices[v].NextA / pcm_WordsPerBlock;
+ Cores[c].Voices[v].SBuffer = pcm_cache_data[cacheIdx].Sampledata;
+ }
+ }
- // HACKFIX!! DMAPtr can be invalid after a savestate load, so force it to NULL and
- // ignore it on any pending ADMA writes. (the DMAPtr concept used to work in old VM
- // editions of PCSX2 with fixed addressing, but new PCSX2s have dynamic memory
- // addressing).
+ // HACKFIX!! DMAPtr can be invalid after a savestate load, so force it to NULL and
+ // ignore it on any pending ADMA writes. (the DMAPtr concept used to work in old VM
+ // editions of PCSX2 with fixed addressing, but new PCSX2s have dynamic memory
+ // addressing).
- Cores[0].DMAPtr = Cores[1].DMAPtr = NULL;
- }
- return 0;
+ Cores[0].DMAPtr = Cores[1].DMAPtr = NULL;
+ }
+ return 0;
}
s32 __fastcall SPU2Savestate::SizeIt()
{
- return sizeof(DataBlock);
+ return sizeof(DataBlock);
}
diff --git a/pcsx2/SPU2/spu2replay.cpp b/pcsx2/SPU2/spu2replay.cpp
index 130c10ce49..ed918cacb5 100644
--- a/pcsx2/SPU2/spu2replay.cpp
+++ b/pcsx2/SPU2/spu2replay.cpp
@@ -20,75 +20,75 @@
#include "Windows.h"
#endif
-FILE *s2rfile;
+FILE* s2rfile;
void s2r_write16(s16 data)
{
- fwrite(&data, 2, 1, s2rfile);
+ fwrite(&data, 2, 1, s2rfile);
}
void s2r_write32(u32 data)
{
- fwrite(&data, 4, 1, s2rfile);
+ fwrite(&data, 4, 1, s2rfile);
}
static void EMITC(u32 i, u32 a)
{
- s2r_write32(((i & 0x7u) << 29u) | (a & 0x1FFFFFFFu));
+ s2r_write32(((i & 0x7u) << 29u) | (a & 0x1FFFFFFFu));
}
-int s2r_open(u32 ticks, char *filename)
+int s2r_open(u32 ticks, char* filename)
{
- s2rfile = fopen(filename, "wb");
- if (s2rfile)
- s2r_write32(ticks);
- return s2rfile ? 0 : -1;
+ s2rfile = fopen(filename, "wb");
+ if (s2rfile)
+ s2r_write32(ticks);
+ return s2rfile ? 0 : -1;
}
void s2r_readreg(u32 ticks, u32 addr)
{
- if (!s2rfile)
- return;
- s2r_write32(ticks);
- EMITC(0, addr);
+ if (!s2rfile)
+ return;
+ s2r_write32(ticks);
+ EMITC(0, addr);
}
void s2r_writereg(u32 ticks, u32 addr, s16 value)
{
- if (!s2rfile)
- return;
- s2r_write32(ticks);
- EMITC(1, addr);
- s2r_write16(value);
+ if (!s2rfile)
+ return;
+ s2r_write32(ticks);
+ EMITC(1, addr);
+ s2r_write16(value);
}
-void s2r_writedma4(u32 ticks, u16 *data, u32 len)
+void s2r_writedma4(u32 ticks, u16* data, u32 len)
{
- u32 i;
- if (!s2rfile)
- return;
- s2r_write32(ticks);
- EMITC(2, len);
- for (i = 0; i < len; i++, data++)
- s2r_write16(*data);
+ u32 i;
+ if (!s2rfile)
+ return;
+ s2r_write32(ticks);
+ EMITC(2, len);
+ for (i = 0; i < len; i++, data++)
+ s2r_write16(*data);
}
-void s2r_writedma7(u32 ticks, u16 *data, u32 len)
+void s2r_writedma7(u32 ticks, u16* data, u32 len)
{
- u32 i;
- if (!s2rfile)
- return;
- s2r_write32(ticks);
- EMITC(3, len);
- for (i = 0; i < len; i++, data++)
- s2r_write16(*data);
+ u32 i;
+ if (!s2rfile)
+ return;
+ s2r_write32(ticks);
+ EMITC(3, len);
+ for (i = 0; i < len; i++, data++)
+ s2r_write16(*data);
}
void s2r_close()
{
- if (!s2rfile)
- return;
- fclose(s2rfile);
+ if (!s2rfile)
+ return;
+ fclose(s2rfile);
}
///////////////////////////////////////////////////////////////
@@ -112,89 +112,89 @@ bool Running = false;
#ifdef _MSC_VER
-int conprintf(const char *fmt, ...)
+int conprintf(const char* fmt, ...)
{
#ifdef _WIN32
- char s[1024];
- va_list list;
+ char s[1024];
+ va_list list;
- va_start(list, fmt);
- vsprintf(s, fmt, list);
- va_end(list);
+ va_start(list, fmt);
+ vsprintf(s, fmt, list);
+ va_end(list);
- HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
- if (handle == INVALID_HANDLE_VALUE)
- return 0;
+ HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
+ if (handle == INVALID_HANDLE_VALUE)
+ return 0;
- DWORD written = 0;
- WriteConsoleA(handle, s, strlen(s), &written, 0);
- FlushFileBuffers(handle);
+ DWORD written = 0;
+ WriteConsoleA(handle, s, strlen(s), &written, 0);
+ FlushFileBuffers(handle);
- return written;
+ return written;
#else
- va_list list;
- va_start(list, fmt);
- int ret = vsprintf(stderr, fmt, list);
- va_end(list);
- return ret;
+ va_list list;
+ va_start(list, fmt);
+ int ret = vsprintf(stderr, fmt, list);
+ va_end(list);
+ return ret;
#endif
}
u64 HighResFrequency()
{
- u64 freq;
+ u64 freq;
#ifdef _WIN32
- QueryPerformanceFrequency((LARGE_INTEGER *)&freq);
+ QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
#else
// TODO
#endif
- return freq;
+ return freq;
}
u64 HighResCounter()
{
- u64 time;
+ u64 time;
#ifdef _WIN32
- QueryPerformanceCounter((LARGE_INTEGER *)&time);
+ QueryPerformanceCounter((LARGE_INTEGER*)&time);
#else
// TODO
#endif
- return time;
+ return time;
}
void InitWaitSync() // not extremely accurate but enough.
{
- HighResFreq = HighResFrequency();
- HighResPrev = HighResCounter();
- HighResScale = (double)HighResFreq / (double)IOP_CLK;
+ HighResFreq = HighResFrequency();
+ HighResPrev = HighResCounter();
+ HighResScale = (double)HighResFreq / (double)IOP_CLK;
}
u32 WaitSync(u32 TargetCycle)
{
- u32 WaitCycles = (TargetCycle - CurrentIOPCycle);
- u32 WaitTime = WaitCycles / IOPCiclesPerMS;
- if (WaitTime > 10)
- WaitTime = 10;
- if (WaitTime == 0)
- WaitTime = 1;
- SleepEx(WaitTime, TRUE);
+ u32 WaitCycles = (TargetCycle - CurrentIOPCycle);
+ u32 WaitTime = WaitCycles / IOPCiclesPerMS;
+ if (WaitTime > 10)
+ WaitTime = 10;
+ if (WaitTime == 0)
+ WaitTime = 1;
+ SleepEx(WaitTime, TRUE);
- // Refresh current time after sleeping
- u64 Current = HighResCounter();
- u32 delta = (u32)floor((Current - HighResPrev) / HighResScale + 0.5); // We lose some precision here, cycles might drift away over long periods of time ;P
+ // Refresh current time after sleeping
+ u64 Current = HighResCounter();
+ u32 delta = (u32)floor((Current - HighResPrev) / HighResScale + 0.5); // We lose some precision here, cycles might drift away over long periods of time ;P
- // Calculate time delta
- CurrentIOPCycle += delta;
- HighResPrev += (u64)floor(delta * HighResScale + 0.5); // Trying to compensate drifting mentioned above, not necessarily useful.
+ // Calculate time delta
+ CurrentIOPCycle += delta;
+ HighResPrev += (u64)floor(delta * HighResScale + 0.5); // Trying to compensate drifting mentioned above, not necessarily useful.
- return delta;
+ return delta;
}
#ifdef _WIN32
BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
{
- Running = false;
- return TRUE;
+ Running = false;
+ return TRUE;
}
#endif
@@ -202,103 +202,108 @@ BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
EXPORT_C_(void)
s2r_replay(HWND hwnd, HINSTANCE hinst, LPSTR filename, int nCmdShow)
{
- int events = 0;
+ int events = 0;
- Running = true;
+ Running = true;
#ifdef _WIN32
- AllocConsole();
- SetConsoleCtrlHandler(HandlerRoutine, TRUE);
+ AllocConsole();
+ SetConsoleCtrlHandler(HandlerRoutine, TRUE);
- conprintf("Playing %s file on %x...", filename, hwnd);
+ conprintf("Playing %s file on %x...", filename, hwnd);
#endif
- // load file
- FILE *file = fopen(filename, "rb");
+ // load file
+ FILE* file = fopen(filename, "rb");
- if (!file) {
- conprintf("Could not open the replay file.");
- return;
- }
-// if successful, init the plugin
+ if (!file)
+ {
+ conprintf("Could not open the replay file.");
+ return;
+ }
+ // if successful, init the plugin
#define TryRead(dest, size, count, file) \
- if (fread(dest, size, count, file) < count) { \
- conprintf("Error reading from file."); \
- goto Finish; /* Need to exit the while() loop and maybe also the switch */ \
- }
+ if (fread(dest, size, count, file) < count) \
+ { \
+ conprintf("Error reading from file."); \
+ goto Finish; /* Need to exit the while() loop and maybe also the switch */ \
+ }
- TryRead(&CurrentIOPCycle, 4, 1, file);
+ TryRead(&CurrentIOPCycle, 4, 1, file);
- replay_mode = true;
+ replay_mode = true;
- InitWaitSync(); // Initialize the WaitSync stuff
+ InitWaitSync(); // Initialize the WaitSync stuff
- SPU2init();
- SPU2_dummy_callback = true;
- SPU2setClockPtr(&CurrentIOPCycle);
- SPU2open(&hwnd);
+ SPU2init();
+ SPU2_dummy_callback = true;
+ SPU2setClockPtr(&CurrentIOPCycle);
+ SPU2open(&hwnd);
- CurrentIOPCycle = 0;
+ CurrentIOPCycle = 0;
- SPU2async(0);
+ SPU2async(0);
- while (!feof(file) && Running) {
- u32 ccycle = 0;
- u32 evid = 0;
- u32 sval = 0;
- u32 tval = 0;
+ while (!feof(file) && Running)
+ {
+ u32 ccycle = 0;
+ u32 evid = 0;
+ u32 sval = 0;
+ u32 tval = 0;
- TryRead(&ccycle, 4, 1, file);
- TryRead(&sval, 4, 1, file);
+ TryRead(&ccycle, 4, 1, file);
+ TryRead(&sval, 4, 1, file);
- evid = sval >> 29;
- sval &= 0x1FFFFFFF;
+ evid = sval >> 29;
+ sval &= 0x1FFFFFFF;
- u32 TargetCycle = ccycle * 768;
+ u32 TargetCycle = ccycle * 768;
- while (TargetCycle > CurrentIOPCycle) {
- u32 delta = WaitSync(TargetCycle);
- SPU2async(delta);
- }
+ while (TargetCycle > CurrentIOPCycle)
+ {
+ u32 delta = WaitSync(TargetCycle);
+ SPU2async(delta);
+ }
- switch (evid) {
- case 0:
- SPU2read(sval);
- break;
- case 1:
- TryRead(&tval, 2, 1, file);
- SPU2write(sval, tval);
- break;
- case 2:
- TryRead(dmabuffer, sval, 2, file);
- SPU2writeDMA4Mem(dmabuffer, sval);
- break;
- case 3:
- TryRead(dmabuffer, sval, 2, file);
- SPU2writeDMA7Mem(dmabuffer, sval);
- break;
- default:
- // not implemented
- return;
- break;
- }
- events++;
- }
+ switch (evid)
+ {
+ case 0:
+ SPU2read(sval);
+ break;
+ case 1:
+ TryRead(&tval, 2, 1, file);
+ SPU2write(sval, tval);
+ break;
+ case 2:
+ TryRead(dmabuffer, sval, 2, file);
+ SPU2writeDMA4Mem(dmabuffer, sval);
+ break;
+ case 3:
+ TryRead(dmabuffer, sval, 2, file);
+ SPU2writeDMA7Mem(dmabuffer, sval);
+ break;
+ default:
+ // not implemented
+ return;
+ break;
+ }
+ events++;
+ }
Finish:
- //shutdown
- SPU2close();
- SPU2shutdown();
- fclose(file);
+ //shutdown
+ SPU2close();
+ SPU2shutdown();
+ fclose(file);
- conprintf("Finished playing %s file (%d cycles, %d events).", filename, CurrentIOPCycle, events);
+ conprintf("Finished playing %s file (%d cycles, %d events).", filename, CurrentIOPCycle, events);
#ifdef _WIN32
- FreeConsole();
+ FreeConsole();
#endif
- replay_mode = false;
+ replay_mode = false;
}
#endif
diff --git a/pcsx2/SPU2/spu2replay.h b/pcsx2/SPU2/spu2replay.h
index a3c1864b3e..b07e2bf510 100644
--- a/pcsx2/SPU2/spu2replay.h
+++ b/pcsx2/SPU2/spu2replay.h
@@ -18,11 +18,11 @@
//#define S2R_ENABLE
// s2r dumping
-int s2r_open(u32 ticks, char *filename);
+int s2r_open(u32 ticks, char* filename);
void s2r_readreg(u32 ticks, u32 addr);
void s2r_writereg(u32 ticks, u32 addr, s16 value);
-void s2r_writedma4(u32 ticks, u16 *data, u32 len);
-void s2r_writedma7(u32 ticks, u16 *data, u32 len);
+void s2r_writedma4(u32 ticks, u16* data, u32 len);
+void s2r_writedma7(u32 ticks, u16* data, u32 len);
void s2r_close();
extern bool replay_mode;
diff --git a/pcsx2/SPU2/spu2sys.cpp b/pcsx2/SPU2/spu2sys.cpp
index 6afacc756c..53c5b8b4fe 100644
--- a/pcsx2/SPU2/spu2sys.cpp
+++ b/pcsx2/SPU2/spu2sys.cpp
@@ -26,8 +26,8 @@
#include "spu2.h" // needed until I figure out a nice solution for irqcallback dependencies.
-s16 *spu2regs = NULL;
-s16 *_spu2mem = NULL;
+s16* spu2regs = NULL;
+s16* _spu2mem = NULL;
V_CoreDebug DebugCores[2];
V_Core Cores[2];
@@ -45,69 +45,70 @@ bool psxmode = false;
void SetIrqCall(int core)
{
- // reset by an irq disable/enable cycle, behaviour found by
- // test programs that bizarrely only fired one interrupt
- if (Spdif.Info & 4 << core)
- return;
- Spdif.Info |= 4 << core;
- has_to_call_irq = true;
+ // reset by an irq disable/enable cycle, behaviour found by
+ // test programs that bizarrely only fired one interrupt
+ if (Spdif.Info & 4 << core)
+ return;
+ Spdif.Info |= 4 << core;
+ has_to_call_irq = true;
}
-__forceinline s16 *GetMemPtr(u32 addr)
+__forceinline s16* GetMemPtr(u32 addr)
{
#ifndef DEBUG_FAST
- // In case you're wondering, this assert is the reason SPU2-X
- // runs so incrediously slow in Debug mode. :P
- pxAssume(addr < 0x100000);
+ // In case you're wondering, this assert is the reason SPU2-X
+ // runs so incrediously slow in Debug mode. :P
+ pxAssume(addr < 0x100000);
#endif
- return (_spu2mem + addr);
+ return (_spu2mem + addr);
}
__forceinline s16 spu2M_Read(u32 addr)
{
- return *GetMemPtr(addr & 0xfffff);
+ return *GetMemPtr(addr & 0xfffff);
}
// writes a signed value to the SPU2 ram
// Invalidates the ADPCM cache in the process.
__forceinline void spu2M_Write(u32 addr, s16 value)
{
- // Make sure the cache is invalidated:
- // (note to self : addr address WORDs, not bytes)
+ // Make sure the cache is invalidated:
+ // (note to self : addr address WORDs, not bytes)
- addr &= 0xfffff;
- if (addr >= SPU2_DYN_MEMLINE) {
- const int cacheIdx = addr / pcm_WordsPerBlock;
- pcm_cache_data[cacheIdx].Validated = false;
+ addr &= 0xfffff;
+ if (addr >= SPU2_DYN_MEMLINE)
+ {
+ const int cacheIdx = addr / pcm_WordsPerBlock;
+ pcm_cache_data[cacheIdx].Validated = false;
- if (MsgToConsole() && MsgCache())
- ConLog("* SPU2-X: PcmCache Block Clear at 0x%x (cacheIdx=0x%x)\n", addr, cacheIdx);
- }
- *GetMemPtr(addr) = value;
+ if (MsgToConsole() && MsgCache())
+ ConLog("* SPU2-X: PcmCache Block Clear at 0x%x (cacheIdx=0x%x)\n", addr, cacheIdx);
+ }
+ *GetMemPtr(addr) = value;
}
// writes an unsigned value to the SPU2 ram
__forceinline void spu2M_Write(u32 addr, u16 value)
{
- spu2M_Write(addr, (s16)value);
+ spu2M_Write(addr, (s16)value);
}
V_VolumeLR V_VolumeLR::Max(0x7FFFFFFF);
V_VolumeSlideLR V_VolumeSlideLR::Max(0x3FFF, 0x7FFFFFFF);
V_Core::V_Core(int coreidx)
- : Index(coreidx)
+ : Index(coreidx)
//LogFile_AutoDMA( NULL )
{
- /*char fname[128];
+ /*char fname[128];
sprintf( fname, "logs/adma%d.raw", GetDmaIndex() );
LogFile_AutoDMA = fopen( fname, "wb" );*/
}
V_Core::~V_Core() throw()
{
- // Can't use this yet because we dumb V_Core into savestates >_<
- /*if( LogFile_AutoDMA != NULL )
+ // Can't use this yet because we dumb V_Core into savestates >_<
+ /*if( LogFile_AutoDMA != NULL )
{
fclose( LogFile_AutoDMA );
LogFile_AutoDMA = NULL;
@@ -116,253 +117,259 @@ V_Core::~V_Core() throw()
void V_Core::Init(int index)
{
- ConLog("* SPU2-X: Init SPU2 core %d \n", index);
- //memset(this, 0, sizeof(V_Core));
- // Explicitly initializing variables instead.
- Mute = false;
- DMABits = 0;
- NoiseClk = 0;
- AutoDMACtrl = 0;
- InputDataLeft = 0;
- InputPosRead = 0;
- InputPosWrite = 0;
- InputDataProgress = 0;
- ReverbX = 0;
- LastEffect.Left = 0;
- LastEffect.Right = 0;
- CoreEnabled = 0;
- AttrBit0 = 0;
- DmaMode = 0;
- DMAPtr = nullptr;
- MADR = 0;
- TADR = 0;
- KeyOn = 0;
+ ConLog("* SPU2-X: Init SPU2 core %d \n", index);
+ //memset(this, 0, sizeof(V_Core));
+ // Explicitly initializing variables instead.
+ Mute = false;
+ DMABits = 0;
+ NoiseClk = 0;
+ AutoDMACtrl = 0;
+ InputDataLeft = 0;
+ InputPosRead = 0;
+ InputPosWrite = 0;
+ InputDataProgress = 0;
+ ReverbX = 0;
+ LastEffect.Left = 0;
+ LastEffect.Right = 0;
+ CoreEnabled = 0;
+ AttrBit0 = 0;
+ DmaMode = 0;
+ DMAPtr = nullptr;
+ MADR = 0;
+ TADR = 0;
+ KeyOn = 0;
- psxmode = false;
- psxSoundDataTransferControl = 0;
- psxSPUSTAT = 0;
+ psxmode = false;
+ psxSoundDataTransferControl = 0;
+ psxSPUSTAT = 0;
- const int c = Index = index;
+ const int c = Index = index;
- Regs.STATX = 0;
- Regs.ATTR = 0;
- ExtVol = V_VolumeLR::Max;
- InpVol = V_VolumeLR::Max;
- FxVol = V_VolumeLR(0);
+ Regs.STATX = 0;
+ Regs.ATTR = 0;
+ ExtVol = V_VolumeLR::Max;
+ InpVol = V_VolumeLR::Max;
+ FxVol = V_VolumeLR(0);
- MasterVol = V_VolumeSlideLR(0, 0);
+ MasterVol = V_VolumeSlideLR(0, 0);
- memset(&DryGate, -1, sizeof(DryGate));
- memset(&WetGate, -1, sizeof(WetGate));
- DryGate.ExtL = 0;
- DryGate.ExtR = 0;
- if (!c) {
- WetGate.ExtL = 0;
- WetGate.ExtR = 0;
- }
+ memset(&DryGate, -1, sizeof(DryGate));
+ memset(&WetGate, -1, sizeof(WetGate));
+ DryGate.ExtL = 0;
+ DryGate.ExtR = 0;
+ if (!c)
+ {
+ WetGate.ExtL = 0;
+ WetGate.ExtR = 0;
+ }
- Regs.MMIX = c ? 0xFFC : 0xFF0; // PS2 confirmed (f3c and f30 after BIOS ran, ffc and ff0 after sdinit)
- Regs.VMIXL = 0xFFFFFF;
- Regs.VMIXR = 0xFFFFFF;
- Regs.VMIXEL = 0xFFFFFF;
- Regs.VMIXER = 0xFFFFFF;
- EffectsStartA = c ? 0xFFFF8 : 0xEFFF8;
- EffectsEndA = c ? 0xFFFFF : 0xEFFFF;
- ExtEffectsStartA = EffectsStartA;
- ExtEffectsEndA = EffectsEndA;
+ Regs.MMIX = c ? 0xFFC : 0xFF0; // PS2 confirmed (f3c and f30 after BIOS ran, ffc and ff0 after sdinit)
+ Regs.VMIXL = 0xFFFFFF;
+ Regs.VMIXR = 0xFFFFFF;
+ Regs.VMIXEL = 0xFFFFFF;
+ Regs.VMIXER = 0xFFFFFF;
+ EffectsStartA = c ? 0xFFFF8 : 0xEFFF8;
+ EffectsEndA = c ? 0xFFFFF : 0xEFFFF;
+ ExtEffectsStartA = EffectsStartA;
+ ExtEffectsEndA = EffectsEndA;
- FxEnable = false; // Uninitialized it's 0 for both cores. Resetting libs however may set this to 0 or 1.
- // These are real PS2 values, mainly constant apart from a few bits: 0x3220EAA4, 0x40505E9C.
- // These values mean nothing. They do not reflect the actual address the SPU2 is testing,
- // it would seem that reading the IRQA register returns the last written value, not the
- // value of the internal register. Rewriting the registers with their current values changes
- // whether interrupts fire (they do while uninitialised, but do not when rewritten).
- // The exact boot value is unknown and probably unknowable, but it seems to be somewhere
- // in the input or output areas, so we're using 0x800.
- // F1 2005 is known to rely on an uninitialised IRQA being an address which will be hit.
- IRQA = 0x800;
- IRQEnable = false; // PS2 confirmed
+ FxEnable = false; // Uninitialized it's 0 for both cores. Resetting libs however may set this to 0 or 1.
+ // These are real PS2 values, mainly constant apart from a few bits: 0x3220EAA4, 0x40505E9C.
+ // These values mean nothing. They do not reflect the actual address the SPU2 is testing,
+ // it would seem that reading the IRQA register returns the last written value, not the
+ // value of the internal register. Rewriting the registers with their current values changes
+ // whether interrupts fire (they do while uninitialised, but do not when rewritten).
+ // The exact boot value is unknown and probably unknowable, but it seems to be somewhere
+ // in the input or output areas, so we're using 0x800.
+ // F1 2005 is known to rely on an uninitialised IRQA being an address which will be hit.
+ IRQA = 0x800;
+ IRQEnable = false; // PS2 confirmed
- for (uint v = 0; v < NumVoices; ++v) {
- VoiceGates[v].DryL = -1;
- VoiceGates[v].DryR = -1;
- VoiceGates[v].WetL = -1;
- VoiceGates[v].WetR = -1;
+ for (uint v = 0; v < NumVoices; ++v)
+ {
+ VoiceGates[v].DryL = -1;
+ VoiceGates[v].DryR = -1;
+ VoiceGates[v].WetL = -1;
+ VoiceGates[v].WetR = -1;
- Voices[v].Volume = V_VolumeSlideLR(0, 0); // V_VolumeSlideLR::Max;
- Voices[v].SCurrent = 28;
+ Voices[v].Volume = V_VolumeSlideLR(0, 0); // V_VolumeSlideLR::Max;
+ Voices[v].SCurrent = 28;
- Voices[v].ADSR.Value = 0;
- Voices[v].ADSR.Phase = 0;
- Voices[v].Pitch = 0x3FFF;
- Voices[v].NextA = 0x2801;
- Voices[v].StartA = 0x2800;
- Voices[v].LoopStartA = 0x2800;
- }
+ Voices[v].ADSR.Value = 0;
+ Voices[v].ADSR.Phase = 0;
+ Voices[v].Pitch = 0x3FFF;
+ Voices[v].NextA = 0x2801;
+ Voices[v].StartA = 0x2800;
+ Voices[v].LoopStartA = 0x2800;
+ }
- DMAICounter = 0;
- AutoDmaFree = 0;
- AdmaInProgress = false;
- DmaStarted = false;
+ DMAICounter = 0;
+ AutoDmaFree = 0;
+ AdmaInProgress = false;
+ DmaStarted = false;
- Regs.STATX = 0x80;
- Regs.ENDX = 0xffffff; // PS2 confirmed
+ Regs.STATX = 0x80;
+ Regs.ENDX = 0xffffff; // PS2 confirmed
- RevBuffers.NeedsUpdated = true;
- UpdateEffectsBufferSize();
+ RevBuffers.NeedsUpdated = true;
+ UpdateEffectsBufferSize();
}
void V_Core::AnalyzeReverbPreset()
{
- ConLog("Reverb Parameter Update for Core %d:\n", Index);
- ConLog("----------------------------------------------------------\n");
+ ConLog("Reverb Parameter Update for Core %d:\n", Index);
+ ConLog("----------------------------------------------------------\n");
- ConLog(" IN_COEF_L, IN_COEF_R 0x%08x, 0x%08x\n", Revb.IN_COEF_L, Revb.IN_COEF_R);
- ConLog(" APF1_SIZE, APF2_SIZE 0x%08x, 0x%08x\n", Revb.APF1_SIZE, Revb.APF2_SIZE);
- ConLog(" APF1_VOL, APF2_VOL 0x%08x, 0x%08x\n", Revb.APF1_VOL, Revb.APF2_VOL);
+ ConLog(" IN_COEF_L, IN_COEF_R 0x%08x, 0x%08x\n", Revb.IN_COEF_L, Revb.IN_COEF_R);
+ ConLog(" APF1_SIZE, APF2_SIZE 0x%08x, 0x%08x\n", Revb.APF1_SIZE, Revb.APF2_SIZE);
+ ConLog(" APF1_VOL, APF2_VOL 0x%08x, 0x%08x\n", Revb.APF1_VOL, Revb.APF2_VOL);
- ConLog(" COMB1_VOL 0x%08x\n", Revb.COMB1_VOL);
- ConLog(" COMB2_VOL 0x%08x\n", Revb.COMB2_VOL);
- ConLog(" COMB3_VOL 0x%08x\n", Revb.COMB3_VOL);
- ConLog(" COMB4_VOL 0x%08x\n", Revb.COMB4_VOL);
+ ConLog(" COMB1_VOL 0x%08x\n", Revb.COMB1_VOL);
+ ConLog(" COMB2_VOL 0x%08x\n", Revb.COMB2_VOL);
+ ConLog(" COMB3_VOL 0x%08x\n", Revb.COMB3_VOL);
+ ConLog(" COMB4_VOL 0x%08x\n", Revb.COMB4_VOL);
- ConLog(" COMB1_L_SRC, COMB1_R_SRC 0x%08x, 0x%08x\n", Revb.COMB1_L_SRC, Revb.COMB1_R_SRC);
- ConLog(" COMB2_L_SRC, COMB2_R_SRC 0x%08x, 0x%08x\n", Revb.COMB2_L_SRC, Revb.COMB2_R_SRC);
- ConLog(" COMB3_L_SRC, COMB3_R_SRC 0x%08x, 0x%08x\n", Revb.COMB3_L_SRC, Revb.COMB3_R_SRC);
- ConLog(" COMB4_L_SRC, COMB4_R_SRC 0x%08x, 0x%08x\n", Revb.COMB4_L_SRC, Revb.COMB4_R_SRC);
+ ConLog(" COMB1_L_SRC, COMB1_R_SRC 0x%08x, 0x%08x\n", Revb.COMB1_L_SRC, Revb.COMB1_R_SRC);
+ ConLog(" COMB2_L_SRC, COMB2_R_SRC 0x%08x, 0x%08x\n", Revb.COMB2_L_SRC, Revb.COMB2_R_SRC);
+ ConLog(" COMB3_L_SRC, COMB3_R_SRC 0x%08x, 0x%08x\n", Revb.COMB3_L_SRC, Revb.COMB3_R_SRC);
+ ConLog(" COMB4_L_SRC, COMB4_R_SRC 0x%08x, 0x%08x\n", Revb.COMB4_L_SRC, Revb.COMB4_R_SRC);
- ConLog(" SAME_L_SRC, SAME_R_SRC 0x%08x, 0x%08x\n", Revb.SAME_L_SRC, Revb.SAME_R_SRC);
- ConLog(" DIFF_L_SRC, DIFF_R_SRC 0x%08x, 0x%08x\n", Revb.DIFF_L_SRC, Revb.DIFF_R_SRC);
- ConLog(" SAME_L_DST, SAME_R_DST 0x%08x, 0x%08x\n", Revb.SAME_L_DST, Revb.SAME_R_DST);
- ConLog(" DIFF_L_DST, DIFF_R_DST 0x%08x, 0x%08x\n", Revb.DIFF_L_DST, Revb.DIFF_R_DST);
- ConLog(" IIR_VOL, WALL_VOL 0x%08x, 0x%08x\n", Revb.IIR_VOL, Revb.WALL_VOL);
+ ConLog(" SAME_L_SRC, SAME_R_SRC 0x%08x, 0x%08x\n", Revb.SAME_L_SRC, Revb.SAME_R_SRC);
+ ConLog(" DIFF_L_SRC, DIFF_R_SRC 0x%08x, 0x%08x\n", Revb.DIFF_L_SRC, Revb.DIFF_R_SRC);
+ ConLog(" SAME_L_DST, SAME_R_DST 0x%08x, 0x%08x\n", Revb.SAME_L_DST, Revb.SAME_R_DST);
+ ConLog(" DIFF_L_DST, DIFF_R_DST 0x%08x, 0x%08x\n", Revb.DIFF_L_DST, Revb.DIFF_R_DST);
+ ConLog(" IIR_VOL, WALL_VOL 0x%08x, 0x%08x\n", Revb.IIR_VOL, Revb.WALL_VOL);
- ConLog(" APF1_L_DST 0x%08x\n", Revb.APF1_L_DST);
- ConLog(" APF1_R_DST 0x%08x\n", Revb.APF1_R_DST);
- ConLog(" APF2_L_DST 0x%08x\n", Revb.APF2_L_DST);
- ConLog(" APF2_R_DST 0x%08x\n", Revb.APF2_R_DST);
+ ConLog(" APF1_L_DST 0x%08x\n", Revb.APF1_L_DST);
+ ConLog(" APF1_R_DST 0x%08x\n", Revb.APF1_R_DST);
+ ConLog(" APF2_L_DST 0x%08x\n", Revb.APF2_L_DST);
+ ConLog(" APF2_R_DST 0x%08x\n", Revb.APF2_R_DST);
- ConLog(" EffectsBufferSize 0x%x\n", EffectsBufferSize);
- ConLog("----------------------------------------------------------\n");
+ ConLog(" EffectsBufferSize 0x%x\n", EffectsBufferSize);
+ ConLog("----------------------------------------------------------\n");
}
s32 V_Core::EffectsBufferIndexer(s32 offset) const
{
- // Should offsets be multipled by 4 or not? Reverse-engineering of IOP code reveals
- // that it *4's all addresses before upping them to the SPU2 -- so our buffers are
- // already x4'd. It doesn't really make sense that we should x4 them again, and this
- // seems to work. (feedback-free in bios and DDS) --air
+ // Should offsets be multipled by 4 or not? Reverse-engineering of IOP code reveals
+ // that it *4's all addresses before upping them to the SPU2 -- so our buffers are
+ // already x4'd. It doesn't really make sense that we should x4 them again, and this
+ // seems to work. (feedback-free in bios and DDS) --air
- // Need to use modulus here, because games can and will drop the buffer size
- // without notice, and it leads to offsets several times past the end of the buffer.
+ // Need to use modulus here, because games can and will drop the buffer size
+ // without notice, and it leads to offsets several times past the end of the buffer.
- if ((u32)offset >= (u32)EffectsBufferSize)
- return EffectsStartA + (offset % EffectsBufferSize) + (offset < 0 ? EffectsBufferSize : 0);
- else
- return EffectsStartA + offset;
+ if ((u32)offset >= (u32)EffectsBufferSize)
+ return EffectsStartA + (offset % EffectsBufferSize) + (offset < 0 ? EffectsBufferSize : 0);
+ else
+ return EffectsStartA + offset;
}
void V_Core::UpdateEffectsBufferSize()
{
- const s32 newbufsize = EffectsEndA - EffectsStartA + 1;
+ const s32 newbufsize = EffectsEndA - EffectsStartA + 1;
- if ((newbufsize * 2) > 0x20000) // max 128kb per core
- {
- //printf("too big, returning\n");
- //return;
- }
+ if ((newbufsize * 2) > 0x20000) // max 128kb per core
+ {
+ //printf("too big, returning\n");
+ //return;
+ }
- // bad optimization?
- //if (newbufsize == EffectsBufferSize && EffectsStartA == EffectsBufferStart) return;
+ // bad optimization?
+ //if (newbufsize == EffectsBufferSize && EffectsStartA == EffectsBufferStart) return;
- //printf("Rvb Area change: ESA = %x, EEA = %x, Size(dec) = %d, Size(hex) = %x FxEnable = %d\n", EffectsStartA, EffectsEndA, newbufsize * 2, newbufsize * 2, FxEnable);
+ //printf("Rvb Area change: ESA = %x, EEA = %x, Size(dec) = %d, Size(hex) = %x FxEnable = %d\n", EffectsStartA, EffectsEndA, newbufsize * 2, newbufsize * 2, FxEnable);
- RevBuffers.NeedsUpdated = false;
- EffectsBufferSize = newbufsize;
- EffectsBufferStart = EffectsStartA;
+ RevBuffers.NeedsUpdated = false;
+ EffectsBufferSize = newbufsize;
+ EffectsBufferStart = EffectsStartA;
- if (EffectsBufferSize <= 0)
- return;
+ if (EffectsBufferSize <= 0)
+ return;
- // debug: shows reverb parameters in console
- if (MsgToConsole())
- AnalyzeReverbPreset();
+ // debug: shows reverb parameters in console
+ if (MsgToConsole())
+ AnalyzeReverbPreset();
- // Rebuild buffer indexers.
- RevBuffers.COMB1_L_SRC = EffectsBufferIndexer(Revb.COMB1_L_SRC);
- RevBuffers.COMB1_R_SRC = EffectsBufferIndexer(Revb.COMB1_R_SRC);
- RevBuffers.COMB2_L_SRC = EffectsBufferIndexer(Revb.COMB2_L_SRC);
- RevBuffers.COMB2_R_SRC = EffectsBufferIndexer(Revb.COMB2_R_SRC);
- RevBuffers.COMB3_L_SRC = EffectsBufferIndexer(Revb.COMB3_L_SRC);
- RevBuffers.COMB3_R_SRC = EffectsBufferIndexer(Revb.COMB3_R_SRC);
- RevBuffers.COMB4_L_SRC = EffectsBufferIndexer(Revb.COMB4_L_SRC);
- RevBuffers.COMB4_R_SRC = EffectsBufferIndexer(Revb.COMB4_R_SRC);
+ // Rebuild buffer indexers.
+ RevBuffers.COMB1_L_SRC = EffectsBufferIndexer(Revb.COMB1_L_SRC);
+ RevBuffers.COMB1_R_SRC = EffectsBufferIndexer(Revb.COMB1_R_SRC);
+ RevBuffers.COMB2_L_SRC = EffectsBufferIndexer(Revb.COMB2_L_SRC);
+ RevBuffers.COMB2_R_SRC = EffectsBufferIndexer(Revb.COMB2_R_SRC);
+ RevBuffers.COMB3_L_SRC = EffectsBufferIndexer(Revb.COMB3_L_SRC);
+ RevBuffers.COMB3_R_SRC = EffectsBufferIndexer(Revb.COMB3_R_SRC);
+ RevBuffers.COMB4_L_SRC = EffectsBufferIndexer(Revb.COMB4_L_SRC);
+ RevBuffers.COMB4_R_SRC = EffectsBufferIndexer(Revb.COMB4_R_SRC);
- RevBuffers.SAME_L_DST = EffectsBufferIndexer(Revb.SAME_L_DST);
- RevBuffers.SAME_R_DST = EffectsBufferIndexer(Revb.SAME_R_DST);
- RevBuffers.DIFF_L_DST = EffectsBufferIndexer(Revb.DIFF_L_DST);
- RevBuffers.DIFF_R_DST = EffectsBufferIndexer(Revb.DIFF_R_DST);
+ RevBuffers.SAME_L_DST = EffectsBufferIndexer(Revb.SAME_L_DST);
+ RevBuffers.SAME_R_DST = EffectsBufferIndexer(Revb.SAME_R_DST);
+ RevBuffers.DIFF_L_DST = EffectsBufferIndexer(Revb.DIFF_L_DST);
+ RevBuffers.DIFF_R_DST = EffectsBufferIndexer(Revb.DIFF_R_DST);
- RevBuffers.SAME_L_SRC = EffectsBufferIndexer(Revb.SAME_L_SRC);
- RevBuffers.SAME_R_SRC = EffectsBufferIndexer(Revb.SAME_R_SRC);
- RevBuffers.DIFF_L_SRC = EffectsBufferIndexer(Revb.DIFF_L_SRC);
- RevBuffers.DIFF_R_SRC = EffectsBufferIndexer(Revb.DIFF_R_SRC);
+ RevBuffers.SAME_L_SRC = EffectsBufferIndexer(Revb.SAME_L_SRC);
+ RevBuffers.SAME_R_SRC = EffectsBufferIndexer(Revb.SAME_R_SRC);
+ RevBuffers.DIFF_L_SRC = EffectsBufferIndexer(Revb.DIFF_L_SRC);
+ RevBuffers.DIFF_R_SRC = EffectsBufferIndexer(Revb.DIFF_R_SRC);
- RevBuffers.APF1_L_DST = EffectsBufferIndexer(Revb.APF1_L_DST);
- RevBuffers.APF1_R_DST = EffectsBufferIndexer(Revb.APF1_R_DST);
- RevBuffers.APF2_L_DST = EffectsBufferIndexer(Revb.APF2_L_DST);
- RevBuffers.APF2_R_DST = EffectsBufferIndexer(Revb.APF2_R_DST);
+ RevBuffers.APF1_L_DST = EffectsBufferIndexer(Revb.APF1_L_DST);
+ RevBuffers.APF1_R_DST = EffectsBufferIndexer(Revb.APF1_R_DST);
+ RevBuffers.APF2_L_DST = EffectsBufferIndexer(Revb.APF2_L_DST);
+ RevBuffers.APF2_R_DST = EffectsBufferIndexer(Revb.APF2_R_DST);
- RevBuffers.SAME_L_PRV = EffectsBufferIndexer(Revb.SAME_L_DST - 1);
- RevBuffers.SAME_R_PRV = EffectsBufferIndexer(Revb.SAME_R_DST - 1);
- RevBuffers.DIFF_L_PRV = EffectsBufferIndexer(Revb.DIFF_L_DST - 1);
- RevBuffers.DIFF_R_PRV = EffectsBufferIndexer(Revb.DIFF_R_DST - 1);
+ RevBuffers.SAME_L_PRV = EffectsBufferIndexer(Revb.SAME_L_DST - 1);
+ RevBuffers.SAME_R_PRV = EffectsBufferIndexer(Revb.SAME_R_DST - 1);
+ RevBuffers.DIFF_L_PRV = EffectsBufferIndexer(Revb.DIFF_L_DST - 1);
+ RevBuffers.DIFF_R_PRV = EffectsBufferIndexer(Revb.DIFF_R_DST - 1);
- RevBuffers.APF1_L_SRC = EffectsBufferIndexer(Revb.APF1_L_DST - Revb.APF1_SIZE);
- RevBuffers.APF1_R_SRC = EffectsBufferIndexer(Revb.APF1_R_DST - Revb.APF1_SIZE);
- RevBuffers.APF2_L_SRC = EffectsBufferIndexer(Revb.APF2_L_DST - Revb.APF2_SIZE);
- RevBuffers.APF2_R_SRC = EffectsBufferIndexer(Revb.APF2_R_DST - Revb.APF2_SIZE);
+ RevBuffers.APF1_L_SRC = EffectsBufferIndexer(Revb.APF1_L_DST - Revb.APF1_SIZE);
+ RevBuffers.APF1_R_SRC = EffectsBufferIndexer(Revb.APF1_R_DST - Revb.APF1_SIZE);
+ RevBuffers.APF2_L_SRC = EffectsBufferIndexer(Revb.APF2_L_DST - Revb.APF2_SIZE);
+ RevBuffers.APF2_R_SRC = EffectsBufferIndexer(Revb.APF2_R_DST - Revb.APF2_SIZE);
}
void V_Voice::QueueStart()
{
- if (Cycles - PlayCycle < delayCycles) {
- // Required by The Legend of Spyro: The Eternal Night (probably the other two legend games too)
- ConLog(" *** KeyOn after less than %d T disregarded.\n", delayCycles);
- return;
- }
- PlayCycle = Cycles;
+ if (Cycles - PlayCycle < delayCycles)
+ {
+ // Required by The Legend of Spyro: The Eternal Night (probably the other two legend games too)
+ ConLog(" *** KeyOn after less than %d T disregarded.\n", delayCycles);
+ return;
+ }
+ PlayCycle = Cycles;
}
bool V_Voice::Start()
{
- if ((Cycles - PlayCycle) >= delayCycles) {
- if (StartA & 7) {
- fprintf(stderr, " *** Misaligned StartA %05x!\n", StartA);
- StartA = (StartA + 0xFFFF8) + 0x8;
- }
+ if ((Cycles - PlayCycle) >= delayCycles)
+ {
+ if (StartA & 7)
+ {
+ fprintf(stderr, " *** Misaligned StartA %05x!\n", StartA);
+ StartA = (StartA + 0xFFFF8) + 0x8;
+ }
- ADSR.Releasing = false;
- ADSR.Value = 1;
- ADSR.Phase = 1;
- SCurrent = 28;
- LoopMode = 0;
- LoopFlags = 0;
- NextA = StartA | 1;
- Prev1 = 0;
- Prev2 = 0;
+ ADSR.Releasing = false;
+ ADSR.Value = 1;
+ ADSR.Phase = 1;
+ SCurrent = 28;
+ LoopMode = 0;
+ LoopFlags = 0;
+ NextA = StartA | 1;
+ Prev1 = 0;
+ Prev2 = 0;
- PV1 = PV2 = 0;
- PV3 = PV4 = 0;
- NextCrest = -0x8000;
- return true;
- } else
- return false;
+ PV1 = PV2 = 0;
+ PV3 = PV4 = 0;
+ NextCrest = -0x8000;
+ return true;
+ }
+ else
+ return false;
}
void V_Voice::Stop()
{
- ADSR.Value = 0;
- ADSR.Phase = 0;
+ ADSR.Value = 0;
+ ADSR.Phase = 0;
}
uint TickInterval = 768;
@@ -371,1139 +378,1197 @@ extern void UpdateDebugDialog();
__forceinline void TimeUpdate(u32 cClocks)
{
- u32 dClocks = cClocks - lClocks;
+ u32 dClocks = cClocks - lClocks;
- // Sanity Checks:
- // It's not totally uncommon for the IOP's clock to jump backwards a cycle or two, and in
- // such cases we just want to ignore the TimeUpdate call.
+ // Sanity Checks:
+ // It's not totally uncommon for the IOP's clock to jump backwards a cycle or two, and in
+ // such cases we just want to ignore the TimeUpdate call.
- if (dClocks > (u32)-15)
- return;
+ if (dClocks > (u32)-15)
+ return;
- // But if for some reason our clock value seems way off base (typically due to bad dma
- // timings from PCSX2), just mix out a little bit, skip the rest, and hope the ship
- // "rights" itself later on.
+ // But if for some reason our clock value seems way off base (typically due to bad dma
+ // timings from PCSX2), just mix out a little bit, skip the rest, and hope the ship
+ // "rights" itself later on.
- if (dClocks > (u32)(TickInterval * SanityInterval)) {
- if (MsgToConsole())
- ConLog(" * SPU2 > TimeUpdate Sanity Check (Tick Delta: %d) (PS2 Ticks: %d)\n", dClocks / TickInterval, cClocks / TickInterval);
- dClocks = TickInterval * SanityInterval;
- lClocks = cClocks - dClocks;
- }
+ if (dClocks > (u32)(TickInterval * SanityInterval))
+ {
+ if (MsgToConsole())
+ ConLog(" * SPU2 > TimeUpdate Sanity Check (Tick Delta: %d) (PS2 Ticks: %d)\n", dClocks / TickInterval, cClocks / TickInterval);
+ dClocks = TickInterval * SanityInterval;
+ lClocks = cClocks - dClocks;
+ }
// Visual debug display showing all core's activity! Disabled via #define on release builds.
#ifdef _WIN32
- UpdateDebugDialog();
+ UpdateDebugDialog();
#endif
- if (SynchMode == 1) // AsyncMix on
- SndBuffer::UpdateTempoChangeAsyncMixing();
- else
- TickInterval = 768; // Reset to default, in case the user hotswitched from async to something else.
+ if (SynchMode == 1) // AsyncMix on
+ SndBuffer::UpdateTempoChangeAsyncMixing();
+ else
+ TickInterval = 768; // Reset to default, in case the user hotswitched from async to something else.
- //Update Mixing Progress
- while (dClocks >= TickInterval) {
- if (has_to_call_irq) {
- //ConLog("* SPU2-X: Irq Called (%04x) at cycle %d.\n", Spdif.Info, Cycles);
- has_to_call_irq = false;
- if(!SPU2_dummy_callback)
- spu2Irq();
- }
+ //Update Mixing Progress
+ while (dClocks >= TickInterval)
+ {
+ if (has_to_call_irq)
+ {
+ //ConLog("* SPU2-X: Irq Called (%04x) at cycle %d.\n", Spdif.Info, Cycles);
+ has_to_call_irq = false;
+ if (!SPU2_dummy_callback)
+ spu2Irq();
+ }
- //Update DMA4 interrupt delay counter
- if (Cores[0].DMAICounter > 0) {
- Cores[0].DMAICounter -= TickInterval;
- if (Cores[0].DMAICounter <= 0) {
- //ConLog("counter set and callback!\n");
- Cores[0].MADR = Cores[0].TADR;
- Cores[0].DMAICounter = 0;
- if(!SPU2_dummy_callback)
- spu2DMA4Irq();
- else
- SPU2interruptDMA4();
- } else {
- Cores[0].MADR += TickInterval << 1;
- }
- }
+ //Update DMA4 interrupt delay counter
+ if (Cores[0].DMAICounter > 0)
+ {
+ Cores[0].DMAICounter -= TickInterval;
+ if (Cores[0].DMAICounter <= 0)
+ {
+ //ConLog("counter set and callback!\n");
+ Cores[0].MADR = Cores[0].TADR;
+ Cores[0].DMAICounter = 0;
+ if (!SPU2_dummy_callback)
+ spu2DMA4Irq();
+ else
+ SPU2interruptDMA4();
+ }
+ else
+ {
+ Cores[0].MADR += TickInterval << 1;
+ }
+ }
- //Update DMA7 interrupt delay counter
- if (Cores[1].DMAICounter > 0) {
- Cores[1].DMAICounter -= TickInterval;
- if (Cores[1].DMAICounter <= 0) {
- Cores[1].MADR = Cores[1].TADR;
- Cores[1].DMAICounter = 0;
- //ConLog( "* SPU2 > DMA 7 Callback! %d\n", Cycles );
- if(!SPU2_dummy_callback)
- spu2DMA7Irq();
- else
- SPU2interruptDMA7();
- } else {
- Cores[1].MADR += TickInterval << 1;
- }
- }
+ //Update DMA7 interrupt delay counter
+ if (Cores[1].DMAICounter > 0)
+ {
+ Cores[1].DMAICounter -= TickInterval;
+ if (Cores[1].DMAICounter <= 0)
+ {
+ Cores[1].MADR = Cores[1].TADR;
+ Cores[1].DMAICounter = 0;
+ //ConLog( "* SPU2 > DMA 7 Callback! %d\n", Cycles );
+ if (!SPU2_dummy_callback)
+ spu2DMA7Irq();
+ else
+ SPU2interruptDMA7();
+ }
+ else
+ {
+ Cores[1].MADR += TickInterval << 1;
+ }
+ }
- dClocks -= TickInterval;
- lClocks += TickInterval;
- Cycles++;
+ dClocks -= TickInterval;
+ lClocks += TickInterval;
+ Cycles++;
- for (int i = 0; i < 2; i++)
- if (Cores[i].KeyOn)
- for (int j = 0; j < 24; j++)
- if (Cores[i].KeyOn >> j & 1)
- if (Cores[i].Voices[j].Start())
- Cores[i].KeyOn &= ~(1 << j);
+ for (int i = 0; i < 2; i++)
+ if (Cores[i].KeyOn)
+ for (int j = 0; j < 24; j++)
+ if (Cores[i].KeyOn >> j & 1)
+ if (Cores[i].Voices[j].Start())
+ Cores[i].KeyOn &= ~(1 << j);
- // Note: IOP does not use MMX regs, so no need to save them.
- //SaveMMXRegs();
- Mix();
- //RestoreMMXRegs();
- }
+ // Note: IOP does not use MMX regs, so no need to save them.
+ //SaveMMXRegs();
+ Mix();
+ //RestoreMMXRegs();
+ }
}
__forceinline void UpdateSpdifMode()
{
- int OPM = PlayMode;
+ int OPM = PlayMode;
- if (Spdif.Out & 0x4) // use 24/32bit PCM data streaming
- {
- PlayMode = 8;
- ConLog("* SPU2-X: WARNING: Possibly CDDA mode set!\n");
- return;
- }
+ if (Spdif.Out & 0x4) // use 24/32bit PCM data streaming
+ {
+ PlayMode = 8;
+ ConLog("* SPU2-X: WARNING: Possibly CDDA mode set!\n");
+ return;
+ }
- if (Spdif.Out & SPDIF_OUT_BYPASS) {
- PlayMode = 2;
- if (!(Spdif.Mode & SPDIF_MODE_BYPASS_BITSTREAM))
- PlayMode = 4; //bitstream bypass
- } else {
- PlayMode = 0; //normal processing
- if (Spdif.Out & SPDIF_OUT_PCM) {
- PlayMode = 1;
- }
- }
- if (OPM != PlayMode) {
- ConLog("* SPU2-X: Play Mode Set to %s (%d).\n",
- (PlayMode == 0) ? "Normal" : ((PlayMode == 1) ? "PCM Clone" : ((PlayMode == 2) ? "PCM Bypass" : "BitStream Bypass")), PlayMode);
- }
+ if (Spdif.Out & SPDIF_OUT_BYPASS)
+ {
+ PlayMode = 2;
+ if (!(Spdif.Mode & SPDIF_MODE_BYPASS_BITSTREAM))
+ PlayMode = 4; //bitstream bypass
+ }
+ else
+ {
+ PlayMode = 0; //normal processing
+ if (Spdif.Out & SPDIF_OUT_PCM)
+ {
+ PlayMode = 1;
+ }
+ }
+ if (OPM != PlayMode)
+ {
+ ConLog("* SPU2-X: Play Mode Set to %s (%d).\n",
+ (PlayMode == 0) ? "Normal" : ((PlayMode == 1) ? "PCM Clone" : ((PlayMode == 2) ? "PCM Bypass" : "BitStream Bypass")), PlayMode);
+ }
}
// Converts an SPU2 register volume write into a 32 bit SPU2-X volume. The value is extended
// properly into the lower 16 bits of the value to provide a full spectrum of volumes.
static s32 GetVol32(u16 src)
{
- return (((s32)src) << 16) | ((src << 1) & 0xffff);
+ return (((s32)src) << 16) | ((src << 1) & 0xffff);
}
void V_VolumeSlide::RegSet(u16 src)
{
- Value = GetVol32(src);
+ Value = GetVol32(src);
}
static u32 map_spu1to2(u32 addr)
{
- return addr * 4 + (addr >= 0x200 ? 0xc0000 : 0);
+ return addr * 4 + (addr >= 0x200 ? 0xc0000 : 0);
}
static u32 map_spu2to1(u32 addr)
{
- // if (addr >= 0x800 && addr < 0xc0000) oh dear
- return (addr - (addr >= 0xc0000 ? 0xc0000 : 0)) / 4;
+ // if (addr >= 0x800 && addr < 0xc0000) oh dear
+ return (addr - (addr >= 0xc0000 ? 0xc0000 : 0)) / 4;
}
void V_Core::WriteRegPS1(u32 mem, u16 value)
{
- pxAssume(Index == 0); // Valid on Core 0 only!
+ pxAssume(Index == 0); // Valid on Core 0 only!
- bool show = true;
- u32 reg = mem & 0xffff;
+ bool show = true;
+ u32 reg = mem & 0xffff;
- if ((reg >= 0x1c00) && (reg < 0x1d80)) {
- //voice values
- u8 voice = ((reg - 0x1c00) >> 4);
- u8 vval = reg & 0xf;
- switch (vval) {
- case 0x0: //VOLL (Volume L)
- case 0x2: //VOLR (Volume R)
- {
- V_VolumeSlide &thisvol = vval == 0 ? Voices[voice].Volume.Left : Voices[voice].Volume.Right;
- thisvol.Reg_VOL = value;
+ if ((reg >= 0x1c00) && (reg < 0x1d80))
+ {
+ //voice values
+ u8 voice = ((reg - 0x1c00) >> 4);
+ u8 vval = reg & 0xf;
+ switch (vval)
+ {
+ case 0x0: //VOLL (Volume L)
+ case 0x2: //VOLR (Volume R)
+ {
+ V_VolumeSlide& thisvol = vval == 0 ? Voices[voice].Volume.Left : Voices[voice].Volume.Right;
+ thisvol.Reg_VOL = value;
- if (value & 0x8000) // +Lin/-Lin/+Exp/-Exp
- {
- thisvol.Mode = (value & 0xF000) >> 12;
- thisvol.Increment = (value & 0x7F);
- // We're not sure slides work 100%
- if (IsDevBuild)
- ConLog("* SPU2: Voice uses Slides in Mode = %x, Increment = %x\n", thisvol.Mode, thisvol.Increment);
- } else {
- // Constant Volume mode (no slides or envelopes)
- // Volumes range from 0x3fff to 0x7fff, with 0x4000 serving as
- // the "sign" bit, so a simple bitwise extension will do the trick:
+ if (value & 0x8000) // +Lin/-Lin/+Exp/-Exp
+ {
+ thisvol.Mode = (value & 0xF000) >> 12;
+ thisvol.Increment = (value & 0x7F);
+ // We're not sure slides work 100%
+ if (IsDevBuild)
+ ConLog("* SPU2: Voice uses Slides in Mode = %x, Increment = %x\n", thisvol.Mode, thisvol.Increment);
+ }
+ else
+ {
+ // Constant Volume mode (no slides or envelopes)
+ // Volumes range from 0x3fff to 0x7fff, with 0x4000 serving as
+ // the "sign" bit, so a simple bitwise extension will do the trick:
- thisvol.RegSet(value << 1);
- thisvol.Mode = 0;
- thisvol.Increment = 0;
- }
- //ConLog("voice %x VOL%c write: %x\n", voice, vval == 0 ? 'L' : 'R', value);
- break;
- }
- case 0x4:
- if (value > 0x3fff)
- ConLog("* SPU2: Pitch setting too big: 0x%x\n", value);
- Voices[voice].Pitch = value & 0x3fff;
- //ConLog("voice %x Pitch write: %x\n", voice, Voices[voice].Pitch);
- break;
- case 0x6:
- Voices[voice].StartA = map_spu1to2(value);
- //ConLog("voice %x StartA write: %x\n", voice, Voices[voice].StartA);
- break;
+ thisvol.RegSet(value << 1);
+ thisvol.Mode = 0;
+ thisvol.Increment = 0;
+ }
+ //ConLog("voice %x VOL%c write: %x\n", voice, vval == 0 ? 'L' : 'R', value);
+ break;
+ }
+ case 0x4:
+ if (value > 0x3fff)
+ ConLog("* SPU2: Pitch setting too big: 0x%x\n", value);
+ Voices[voice].Pitch = value & 0x3fff;
+ //ConLog("voice %x Pitch write: %x\n", voice, Voices[voice].Pitch);
+ break;
+ case 0x6:
+ Voices[voice].StartA = map_spu1to2(value);
+ //ConLog("voice %x StartA write: %x\n", voice, Voices[voice].StartA);
+ break;
- case 0x8: // ADSR1 (Envelope)
- Voices[voice].ADSR.regADSR1 = value;
- //ConLog("voice %x regADSR1 write: %x\n", voice, Voices[voice].ADSR.regADSR1);
- break;
+ case 0x8: // ADSR1 (Envelope)
+ Voices[voice].ADSR.regADSR1 = value;
+ //ConLog("voice %x regADSR1 write: %x\n", voice, Voices[voice].ADSR.regADSR1);
+ break;
- case 0xa: // ADSR2 (Envelope)
- Voices[voice].ADSR.regADSR2 = value;
- //ConLog("voice %x regADSR2 write: %x\n", voice, Voices[voice].ADSR.regADSR2);
- break;
- case 0xc: // Voice 0..23 ADSR Current Volume
- // not commonly set by games
- Voices[voice].ADSR.Value = value * 0x10001U;
- ConLog("voice %x ADSR.Value write: %x\n", voice, Voices[voice].ADSR.Value);
- break;
- case 0xe:
- Voices[voice].LoopStartA = map_spu1to2(value);
- //ConLog("voice %x LoopStartA write: %x\n", voice, Voices[voice].LoopStartA);
- break;
+ case 0xa: // ADSR2 (Envelope)
+ Voices[voice].ADSR.regADSR2 = value;
+ //ConLog("voice %x regADSR2 write: %x\n", voice, Voices[voice].ADSR.regADSR2);
+ break;
+ case 0xc: // Voice 0..23 ADSR Current Volume
+ // not commonly set by games
+ Voices[voice].ADSR.Value = value * 0x10001U;
+ ConLog("voice %x ADSR.Value write: %x\n", voice, Voices[voice].ADSR.Value);
+ break;
+ case 0xe:
+ Voices[voice].LoopStartA = map_spu1to2(value);
+ //ConLog("voice %x LoopStartA write: %x\n", voice, Voices[voice].LoopStartA);
+ break;
- jNO_DEFAULT;
- }
- }
+ jNO_DEFAULT;
+ }
+ }
- else
- switch (reg) {
- case 0x1d80: // Mainvolume left
- MasterVol.Left.Mode = 0;
- MasterVol.Left.RegSet(value);
- break;
+ else
+ switch (reg)
+ {
+ case 0x1d80: // Mainvolume left
+ MasterVol.Left.Mode = 0;
+ MasterVol.Left.RegSet(value);
+ break;
- case 0x1d82: // Mainvolume right
- MasterVol.Right.Mode = 0;
- MasterVol.Right.RegSet(value);
- break;
+ case 0x1d82: // Mainvolume right
+ MasterVol.Right.Mode = 0;
+ MasterVol.Right.RegSet(value);
+ break;
- case 0x1d84: // Reverberation depth left
- FxVol.Left = GetVol32(value);
- break;
+ case 0x1d84: // Reverberation depth left
+ FxVol.Left = GetVol32(value);
+ break;
- case 0x1d86: // Reverberation depth right
- FxVol.Right = GetVol32(value);
- break;
+ case 0x1d86: // Reverberation depth right
+ FxVol.Right = GetVol32(value);
+ break;
- case 0x1d88: // Voice ON (0-15)
- SPU2_FastWrite(REG_S_KON, value);
- break;
- case 0x1d8a: // Voice ON (16-23)
- SPU2_FastWrite(REG_S_KON + 2, value);
- break;
+ case 0x1d88: // Voice ON (0-15)
+ SPU2_FastWrite(REG_S_KON, value);
+ break;
+ case 0x1d8a: // Voice ON (16-23)
+ SPU2_FastWrite(REG_S_KON + 2, value);
+ break;
- case 0x1d8c: // Voice OFF (0-15)
- SPU2_FastWrite(REG_S_KOFF, value);
- break;
- case 0x1d8e: // Voice OFF (16-23)
- SPU2_FastWrite(REG_S_KOFF + 2, value);
- break;
+ case 0x1d8c: // Voice OFF (0-15)
+ SPU2_FastWrite(REG_S_KOFF, value);
+ break;
+ case 0x1d8e: // Voice OFF (16-23)
+ SPU2_FastWrite(REG_S_KOFF + 2, value);
+ break;
- case 0x1d90: // Channel FM (pitch lfo) mode (0-15)
- SPU2_FastWrite(REG_S_PMON, value);
- if (value != 0)
- ConLog("spu2x warning: wants to set Pitch Modulation reg1 to %x \n", value);
- break;
+ case 0x1d90: // Channel FM (pitch lfo) mode (0-15)
+ SPU2_FastWrite(REG_S_PMON, value);
+ if (value != 0)
+ ConLog("spu2x warning: wants to set Pitch Modulation reg1 to %x \n", value);
+ break;
- case 0x1d92: // Channel FM (pitch lfo) mode (16-23)
- SPU2_FastWrite(REG_S_PMON + 2, value);
- if (value != 0)
- ConLog("spu2x warning: wants to set Pitch Modulation reg2 to %x \n", value);
- break;
+ case 0x1d92: // Channel FM (pitch lfo) mode (16-23)
+ SPU2_FastWrite(REG_S_PMON + 2, value);
+ if (value != 0)
+ ConLog("spu2x warning: wants to set Pitch Modulation reg2 to %x \n", value);
+ break;
- case 0x1d94: // Channel Noise mode (0-15)
- SPU2_FastWrite(REG_S_NON, value);
- if (value != 0)
- ConLog("spu2x warning: wants to set Channel Noise mode reg1 to %x\n", value);
- break;
+ case 0x1d94: // Channel Noise mode (0-15)
+ SPU2_FastWrite(REG_S_NON, value);
+ if (value != 0)
+ ConLog("spu2x warning: wants to set Channel Noise mode reg1 to %x\n", value);
+ break;
- case 0x1d96: // Channel Noise mode (16-23)
- SPU2_FastWrite(REG_S_NON + 2, value);
- if (value != 0)
- ConLog("spu2x warning: wants to set Channel Noise mode reg2 to %x\n", value);
- break;
+ case 0x1d96: // Channel Noise mode (16-23)
+ SPU2_FastWrite(REG_S_NON + 2, value);
+ if (value != 0)
+ ConLog("spu2x warning: wants to set Channel Noise mode reg2 to %x\n", value);
+ break;
- case 0x1d98: // 1F801D98h - Voice 0..23 Reverb mode aka Echo On (EON) (R/W)
- //Regs.VMIXEL = value & 0xFFFF;
- SPU2_FastWrite(REG_S_VMIXEL, value);
- SPU2_FastWrite(REG_S_VMIXER, value);
- //ConLog("spu2x warning: setting reverb mode reg1 to %x \n", Regs.VMIXEL);
- break;
+ case 0x1d98: // 1F801D98h - Voice 0..23 Reverb mode aka Echo On (EON) (R/W)
+ //Regs.VMIXEL = value & 0xFFFF;
+ SPU2_FastWrite(REG_S_VMIXEL, value);
+ SPU2_FastWrite(REG_S_VMIXER, value);
+ //ConLog("spu2x warning: setting reverb mode reg1 to %x \n", Regs.VMIXEL);
+ break;
- case 0x1d9a: // 1F801D98h + 2 - Voice 0..23 Reverb mode aka Echo On (EON) (R/W)
- //Regs.VMIXEL = value << 16;
- SPU2_FastWrite(REG_S_VMIXEL + 2, value);
- SPU2_FastWrite(REG_S_VMIXER + 2, value);
- //ConLog("spu2x warning: setting reverb mode reg2 to %x \n", Regs.VMIXEL);
- break;
+ case 0x1d9a: // 1F801D98h + 2 - Voice 0..23 Reverb mode aka Echo On (EON) (R/W)
+ //Regs.VMIXEL = value << 16;
+ SPU2_FastWrite(REG_S_VMIXEL + 2, value);
+ SPU2_FastWrite(REG_S_VMIXER + 2, value);
+ //ConLog("spu2x warning: setting reverb mode reg2 to %x \n", Regs.VMIXEL);
+ break;
- // this was wrong? // edit: appears so!
- //case 0x1d9c:// Channel Reverb mode (0-15)
- // SPU2_FastWrite(REG_S_VMIXL,value);
- // SPU2_FastWrite(REG_S_VMIXR,value);
- //break;
+ // this was wrong? // edit: appears so!
+ //case 0x1d9c:// Channel Reverb mode (0-15)
+ // SPU2_FastWrite(REG_S_VMIXL,value);
+ // SPU2_FastWrite(REG_S_VMIXR,value);
+ //break;
- //case 0x1d9e:// Channel Reverb mode (16-23)
- // SPU2_FastWrite(REG_S_VMIXL+2,value);
- // SPU2_FastWrite(REG_S_VMIXR+2,value);
- //break;
- case 0x1d9c: // Voice 0..15 ON/OFF (status) (ENDX) (R) // writeable but hw overrides it shortly after
- //Regs.ENDX &= 0xff0000;
- ConLog("spu2x warning: wants to set ENDX reg1 to %x \n", value);
- break;
+ //case 0x1d9e:// Channel Reverb mode (16-23)
+ // SPU2_FastWrite(REG_S_VMIXL+2,value);
+ // SPU2_FastWrite(REG_S_VMIXR+2,value);
+ //break;
+ case 0x1d9c: // Voice 0..15 ON/OFF (status) (ENDX) (R) // writeable but hw overrides it shortly after
+ //Regs.ENDX &= 0xff0000;
+ ConLog("spu2x warning: wants to set ENDX reg1 to %x \n", value);
+ break;
- case 0x1d9e: // // Voice 15..23 ON/OFF (status) (ENDX) (R) // writeable but hw overrides it shortly after
- //Regs.ENDX &= 0xffff;
- ConLog("spu2x warning: wants to set ENDX reg2 to %x \n", value);
- break;
+ case 0x1d9e: // // Voice 15..23 ON/OFF (status) (ENDX) (R) // writeable but hw overrides it shortly after
+ //Regs.ENDX &= 0xffff;
+ ConLog("spu2x warning: wants to set ENDX reg2 to %x \n", value);
+ break;
- case 0x1da2: // Reverb work area start
- {
- EffectsStartA = map_spu1to2(value);
- //EffectsEndA = 0xFFFFF; // fixed EndA in psx mode
- Cores[0].RevBuffers.NeedsUpdated = true;
- ReverbX = 0;
- } break;
+ case 0x1da2: // Reverb work area start
+ {
+ EffectsStartA = map_spu1to2(value);
+ //EffectsEndA = 0xFFFFF; // fixed EndA in psx mode
+ Cores[0].RevBuffers.NeedsUpdated = true;
+ ReverbX = 0;
+ }
+ break;
- case 0x1da4:
- IRQA = map_spu1to2(value);
- //ConLog("SPU2-X Setting IRQA to %x \n", IRQA);
- break;
+ case 0x1da4:
+ IRQA = map_spu1to2(value);
+ //ConLog("SPU2-X Setting IRQA to %x \n", IRQA);
+ break;
- case 0x1da6:
- TSA = map_spu1to2(value);
- //ConLog("SPU2-X Setting TSA to %x \n", TSA);
- break;
+ case 0x1da6:
+ TSA = map_spu1to2(value);
+ //ConLog("SPU2-X Setting TSA to %x \n", TSA);
+ break;
- case 0x1da8: // Spu Write to Memory
- //ConLog("SPU direct DMA Write. Current TSA = %x\n", TSA);
- if (Cores[0].IRQEnable && (Cores[0].IRQA <= Cores[0].TSA)) {
- SetIrqCall(0);
- if(!SPU2_dummy_callback)
- spu2Irq();
- }
- DmaWrite(value);
- show = false;
- break;
+ case 0x1da8: // Spu Write to Memory
+ //ConLog("SPU direct DMA Write. Current TSA = %x\n", TSA);
+ if (Cores[0].IRQEnable && (Cores[0].IRQA <= Cores[0].TSA))
+ {
+ SetIrqCall(0);
+ if (!SPU2_dummy_callback)
+ spu2Irq();
+ }
+ DmaWrite(value);
+ show = false;
+ break;
- case 0x1daa:
- SPU2_FastWrite(REG_C_ATTR, value);
- break;
+ case 0x1daa:
+ SPU2_FastWrite(REG_C_ATTR, value);
+ break;
- case 0x1dac: // 1F801DACh - Sound RAM Data Transfer Control (should be 0004h)
- ConLog("SPU Sound RAM Data Transfer Control (should be 4) : value = %x \n", value);
- psxSoundDataTransferControl = value;
- break;
+ case 0x1dac: // 1F801DACh - Sound RAM Data Transfer Control (should be 0004h)
+ ConLog("SPU Sound RAM Data Transfer Control (should be 4) : value = %x \n", value);
+ psxSoundDataTransferControl = value;
+ break;
- case 0x1dae: // 1F801DAEh - SPU Status Register (SPUSTAT) (R)
- // The SPUSTAT register should be treated read-only (writing is possible in so far that the written
- // value can be read-back for a short moment, however, thereafter the hardware is overwriting that value).
- //Regs.STATX = value;
- break;
+ case 0x1dae: // 1F801DAEh - SPU Status Register (SPUSTAT) (R)
+ // The SPUSTAT register should be treated read-only (writing is possible in so far that the written
+ // value can be read-back for a short moment, however, thereafter the hardware is overwriting that value).
+ //Regs.STATX = value;
+ break;
- case 0x1DB0: // 1F801DB0h 4 CD Volume Left/Right
- break; // cd left?
- case 0x1DB2:
- break; // cd right?
- case 0x1DB4: // 1F801DB4h 4 Extern Volume Left / Right
- break; // Extern left?
- case 0x1DB6:
- break; // Extern right?
- case 0x1DB8: // 1F801DB8h 4 Current Main Volume Left/Right
- break; // Current left?
- case 0x1DBA:
- break; // Current right?
- case 0x1DBC: // 1F801DBCh 4 Unknown? (R/W)
- break;
- case 0x1DBE:
- break;
+ case 0x1DB0: // 1F801DB0h 4 CD Volume Left/Right
+ break; // cd left?
+ case 0x1DB2:
+ break; // cd right?
+ case 0x1DB4: // 1F801DB4h 4 Extern Volume Left / Right
+ break; // Extern left?
+ case 0x1DB6:
+ break; // Extern right?
+ case 0x1DB8: // 1F801DB8h 4 Current Main Volume Left/Right
+ break; // Current left?
+ case 0x1DBA:
+ break; // Current right?
+ case 0x1DBC: // 1F801DBCh 4 Unknown? (R/W)
+ break;
+ case 0x1DBE:
+ break;
- case 0x1DC0:
- Revb.APF1_SIZE = value * 4;
- break;
- case 0x1DC2:
- Revb.APF2_SIZE = value * 4;
- break;
- case 0x1DC4:
- Revb.IIR_VOL = value;
- break;
- case 0x1DC6:
- Revb.COMB1_VOL = value;
- break;
- case 0x1DC8:
- Revb.COMB2_VOL = value;
- break;
- case 0x1DCA:
- Revb.COMB3_VOL = value;
- break;
- case 0x1DCC:
- Revb.COMB4_VOL = value;
- break;
- case 0x1DCE:
- Revb.WALL_VOL = value;
- break;
- case 0x1DD0:
- Revb.APF1_VOL = value;
- break;
- case 0x1DD2:
- Revb.APF2_VOL = value;
- break;
- case 0x1DD4:
- Revb.SAME_L_DST = value * 4;
- break;
- case 0x1DD6:
- Revb.SAME_R_DST = value * 4;
- break;
- case 0x1DD8:
- Revb.COMB1_L_SRC = value * 4;
- break;
- case 0x1DDA:
- Revb.COMB1_R_SRC = value * 4;
- break;
- case 0x1DDC:
- Revb.COMB2_L_SRC = value * 4;
- break;
- case 0x1DDE:
- Revb.COMB2_R_SRC = value * 4;
- break;
- case 0x1DE0:
- Revb.SAME_L_SRC = value * 4;
- break;
- case 0x1DE2:
- Revb.SAME_R_SRC = value * 4;
- break;
- case 0x1DE4:
- Revb.DIFF_L_DST = value * 4;
- break;
- case 0x1DE6:
- Revb.DIFF_R_DST = value * 4;
- break;
- case 0x1DE8:
- Revb.COMB3_L_SRC = value * 4;
- break;
- case 0x1DEA:
- Revb.COMB3_R_SRC = value * 4;
- break;
- case 0x1DEC:
- Revb.COMB4_L_SRC = value * 4;
- break;
- case 0x1DEE:
- Revb.COMB4_R_SRC = value * 4;
- break;
- case 0x1DF0:
- Revb.DIFF_L_SRC = value * 4;
- break; // DIFF_R_SRC and DIFF_L_SRC supposedly swapped on SPU2
- case 0x1DF2:
- Revb.DIFF_R_SRC = value * 4;
- break; // but I don't believe it! (games in psxmode sound better unswapped)
- case 0x1DF4:
- Revb.APF1_L_DST = value * 4;
- break;
- case 0x1DF6:
- Revb.APF1_R_DST = value * 4;
- break;
- case 0x1DF8:
- Revb.APF2_L_DST = value * 4;
- break;
- case 0x1DFA:
- Revb.APF2_R_DST = value * 4;
- break;
- case 0x1DFC:
- Revb.IN_COEF_L = value;
- break;
- case 0x1DFE:
- Revb.IN_COEF_R = value;
- break;
- }
+ case 0x1DC0:
+ Revb.APF1_SIZE = value * 4;
+ break;
+ case 0x1DC2:
+ Revb.APF2_SIZE = value * 4;
+ break;
+ case 0x1DC4:
+ Revb.IIR_VOL = value;
+ break;
+ case 0x1DC6:
+ Revb.COMB1_VOL = value;
+ break;
+ case 0x1DC8:
+ Revb.COMB2_VOL = value;
+ break;
+ case 0x1DCA:
+ Revb.COMB3_VOL = value;
+ break;
+ case 0x1DCC:
+ Revb.COMB4_VOL = value;
+ break;
+ case 0x1DCE:
+ Revb.WALL_VOL = value;
+ break;
+ case 0x1DD0:
+ Revb.APF1_VOL = value;
+ break;
+ case 0x1DD2:
+ Revb.APF2_VOL = value;
+ break;
+ case 0x1DD4:
+ Revb.SAME_L_DST = value * 4;
+ break;
+ case 0x1DD6:
+ Revb.SAME_R_DST = value * 4;
+ break;
+ case 0x1DD8:
+ Revb.COMB1_L_SRC = value * 4;
+ break;
+ case 0x1DDA:
+ Revb.COMB1_R_SRC = value * 4;
+ break;
+ case 0x1DDC:
+ Revb.COMB2_L_SRC = value * 4;
+ break;
+ case 0x1DDE:
+ Revb.COMB2_R_SRC = value * 4;
+ break;
+ case 0x1DE0:
+ Revb.SAME_L_SRC = value * 4;
+ break;
+ case 0x1DE2:
+ Revb.SAME_R_SRC = value * 4;
+ break;
+ case 0x1DE4:
+ Revb.DIFF_L_DST = value * 4;
+ break;
+ case 0x1DE6:
+ Revb.DIFF_R_DST = value * 4;
+ break;
+ case 0x1DE8:
+ Revb.COMB3_L_SRC = value * 4;
+ break;
+ case 0x1DEA:
+ Revb.COMB3_R_SRC = value * 4;
+ break;
+ case 0x1DEC:
+ Revb.COMB4_L_SRC = value * 4;
+ break;
+ case 0x1DEE:
+ Revb.COMB4_R_SRC = value * 4;
+ break;
+ case 0x1DF0:
+ Revb.DIFF_L_SRC = value * 4;
+ break; // DIFF_R_SRC and DIFF_L_SRC supposedly swapped on SPU2
+ case 0x1DF2:
+ Revb.DIFF_R_SRC = value * 4;
+ break; // but I don't believe it! (games in psxmode sound better unswapped)
+ case 0x1DF4:
+ Revb.APF1_L_DST = value * 4;
+ break;
+ case 0x1DF6:
+ Revb.APF1_R_DST = value * 4;
+ break;
+ case 0x1DF8:
+ Revb.APF2_L_DST = value * 4;
+ break;
+ case 0x1DFA:
+ Revb.APF2_R_DST = value * 4;
+ break;
+ case 0x1DFC:
+ Revb.IN_COEF_L = value;
+ break;
+ case 0x1DFE:
+ Revb.IN_COEF_R = value;
+ break;
+ }
- if (show)
- FileLog("[%10d] (!) SPU write mem %08x value %04x\n", Cycles, mem, value);
+ if (show)
+ FileLog("[%10d] (!) SPU write mem %08x value %04x\n", Cycles, mem, value);
- spu2Ru16(mem) = value;
+ spu2Ru16(mem) = value;
}
u16 V_Core::ReadRegPS1(u32 mem)
{
- pxAssume(Index == 0); // Valid on Core 0 only!
+ pxAssume(Index == 0); // Valid on Core 0 only!
- bool show = true;
- u16 value = spu2Ru16(mem);
+ bool show = true;
+ u16 value = spu2Ru16(mem);
- u32 reg = mem & 0xffff;
+ u32 reg = mem & 0xffff;
- if ((reg >= 0x1c00) && (reg < 0x1d80)) {
- //voice values
- u8 voice = ((reg - 0x1c00) >> 4);
- u8 vval = reg & 0xf;
- switch (vval) {
- case 0x0: //VOLL (Volume L)
- //value=Voices[voice].VolumeL.Mode;
- //value=Voices[voice].VolumeL.Value;
- value = Voices[voice].Volume.Left.Reg_VOL;
- break;
+ if ((reg >= 0x1c00) && (reg < 0x1d80))
+ {
+ //voice values
+ u8 voice = ((reg - 0x1c00) >> 4);
+ u8 vval = reg & 0xf;
+ switch (vval)
+ {
+ case 0x0: //VOLL (Volume L)
+ //value=Voices[voice].VolumeL.Mode;
+ //value=Voices[voice].VolumeL.Value;
+ value = Voices[voice].Volume.Left.Reg_VOL;
+ break;
- case 0x2: //VOLR (Volume R)
- //value=Voices[voice].VolumeR.Mode;
- //value=Voices[voice].VolumeR.Value;
- value = Voices[voice].Volume.Right.Reg_VOL;
- break;
+ case 0x2: //VOLR (Volume R)
+ //value=Voices[voice].VolumeR.Mode;
+ //value=Voices[voice].VolumeR.Value;
+ value = Voices[voice].Volume.Right.Reg_VOL;
+ break;
- case 0x4:
- value = Voices[voice].Pitch;
- //ConLog("voice %d read pitch result = %x\n", voice, value);
- break;
- case 0x6:
- value = map_spu2to1(Voices[voice].StartA);
- //ConLog("voice %d read StartA result = %x\n", voice, value);
- break;
- case 0x8:
- value = Voices[voice].ADSR.regADSR1;
- break;
- case 0xa:
- value = Voices[voice].ADSR.regADSR2;
- break;
- case 0xc: // Voice 0..23 ADSR Current Volume
- value = Voices[voice].ADSR.Value >> 16; // no clue
- //if (value != 0) ConLog("voice %d read ADSR.Value result = %x\n", voice, value);
- break;
- case 0xe:
- value = map_spu2to1(Voices[voice].LoopStartA);
- //ConLog("voice %d read LoopStartA result = %x\n", voice, value);
- break;
+ case 0x4:
+ value = Voices[voice].Pitch;
+ //ConLog("voice %d read pitch result = %x\n", voice, value);
+ break;
+ case 0x6:
+ value = map_spu2to1(Voices[voice].StartA);
+ //ConLog("voice %d read StartA result = %x\n", voice, value);
+ break;
+ case 0x8:
+ value = Voices[voice].ADSR.regADSR1;
+ break;
+ case 0xa:
+ value = Voices[voice].ADSR.regADSR2;
+ break;
+ case 0xc: // Voice 0..23 ADSR Current Volume
+ value = Voices[voice].ADSR.Value >> 16; // no clue
+ //if (value != 0) ConLog("voice %d read ADSR.Value result = %x\n", voice, value);
+ break;
+ case 0xe:
+ value = map_spu2to1(Voices[voice].LoopStartA);
+ //ConLog("voice %d read LoopStartA result = %x\n", voice, value);
+ break;
- jNO_DEFAULT;
- }
- } else
- switch (reg) {
- case 0x1d80:
- value = MasterVol.Left.Value >> 16;
- break;
- case 0x1d82:
- value = MasterVol.Right.Value >> 16;
- break;
- case 0x1d84:
- value = FxVol.Left >> 16;
- break;
- case 0x1d86:
- value = FxVol.Right >> 16;
- break;
+ jNO_DEFAULT;
+ }
+ }
+ else
+ switch (reg)
+ {
+ case 0x1d80:
+ value = MasterVol.Left.Value >> 16;
+ break;
+ case 0x1d82:
+ value = MasterVol.Right.Value >> 16;
+ break;
+ case 0x1d84:
+ value = FxVol.Left >> 16;
+ break;
+ case 0x1d86:
+ value = FxVol.Right >> 16;
+ break;
- case 0x1d88:
- value = 0;
- break; // Voice 0..23 Key ON(Start Attack / Decay / Sustain) (W)
- case 0x1d8a:
- value = 0;
- break;
- case 0x1d8c:
- value = 0;
- break; // Voice 0..23 Key OFF (Start Release) (W)
- case 0x1d8e:
- value = 0;
- break;
+ case 0x1d88:
+ value = 0;
+ break; // Voice 0..23 Key ON(Start Attack / Decay / Sustain) (W)
+ case 0x1d8a:
+ value = 0;
+ break;
+ case 0x1d8c:
+ value = 0;
+ break; // Voice 0..23 Key OFF (Start Release) (W)
+ case 0x1d8e:
+ value = 0;
+ break;
- case 0x1d90:
- value = Regs.PMON & 0xFFFF;
- break; // Voice 0..23 Channel FM(pitch lfo) mode(R / W)
- case 0x1d92:
- value = Regs.PMON >> 16;
- break;
+ case 0x1d90:
+ value = Regs.PMON & 0xFFFF;
+ break; // Voice 0..23 Channel FM(pitch lfo) mode(R / W)
+ case 0x1d92:
+ value = Regs.PMON >> 16;
+ break;
- case 0x1d94:
- value = Regs.NON & 0xFFFF;
- break; // Voice 0..23 Channel Noise mode (R/W)
- case 0x1d96:
- value = Regs.NON >> 16;
- break;
+ case 0x1d94:
+ value = Regs.NON & 0xFFFF;
+ break; // Voice 0..23 Channel Noise mode (R/W)
+ case 0x1d96:
+ value = Regs.NON >> 16;
+ break;
- case 0x1d98:
- value = Regs.VMIXEL & 0xFFFF;
- break; // Voice 0..23 Channel Reverb mode (R/W)
- case 0x1d9a:
- value = Regs.VMIXEL >> 16;
- break;
- /*case 0x1d9c: value = Regs.VMIXL&0xFFFF; break;*/ // this is wrong?
- /*case 0x1d9e: value = Regs.VMIXL >> 16; break;*/
- case 0x1d9c:
- value = Regs.ENDX & 0xFFFF;
- break; // Voice 0..23 Channel ON / OFF(status) (R) (ENDX)
- case 0x1d9e:
- value = Regs.ENDX >> 16;
- break;
- case 0x1da2:
- value = map_spu2to1(EffectsStartA);
- break;
- case 0x1da4:
- value = map_spu2to1(IRQA);
- //ConLog("SPU2-X IRQA read: 0x1da4 = %x , (IRQA = %x)\n", value, IRQA);
- break;
- case 0x1da6:
- value = map_spu2to1(TSA);
- //ConLog("SPU2-X TSA read: 0x1da6 = %x , (TSA = %x)\n", value, TSA);
- break;
- case 0x1da8:
- value = DmaRead();
- show = false;
- break;
- case 0x1daa:
- value = Cores[0].Regs.ATTR;
- //ConLog("SPU2-X ps1 reg psxSPUCNT read return value: %x\n", value);
- break;
- case 0x1dac: // 1F801DACh - Sound RAM Data Transfer Control (should be 0004h)
- value = psxSoundDataTransferControl;
- break;
- case 0x1dae:
- value = Cores[0].Regs.STATX;
- //ConLog("SPU2-X ps1 reg REG_P_STATX read return value: %x\n", value);
- break;
- }
+ case 0x1d98:
+ value = Regs.VMIXEL & 0xFFFF;
+ break; // Voice 0..23 Channel Reverb mode (R/W)
+ case 0x1d9a:
+ value = Regs.VMIXEL >> 16;
+ break;
+ /*case 0x1d9c: value = Regs.VMIXL&0xFFFF; break;*/ // this is wrong?
+ /*case 0x1d9e: value = Regs.VMIXL >> 16; break;*/
+ case 0x1d9c:
+ value = Regs.ENDX & 0xFFFF;
+ break; // Voice 0..23 Channel ON / OFF(status) (R) (ENDX)
+ case 0x1d9e:
+ value = Regs.ENDX >> 16;
+ break;
+ case 0x1da2:
+ value = map_spu2to1(EffectsStartA);
+ break;
+ case 0x1da4:
+ value = map_spu2to1(IRQA);
+ //ConLog("SPU2-X IRQA read: 0x1da4 = %x , (IRQA = %x)\n", value, IRQA);
+ break;
+ case 0x1da6:
+ value = map_spu2to1(TSA);
+ //ConLog("SPU2-X TSA read: 0x1da6 = %x , (TSA = %x)\n", value, TSA);
+ break;
+ case 0x1da8:
+ value = DmaRead();
+ show = false;
+ break;
+ case 0x1daa:
+ value = Cores[0].Regs.ATTR;
+ //ConLog("SPU2-X ps1 reg psxSPUCNT read return value: %x\n", value);
+ break;
+ case 0x1dac: // 1F801DACh - Sound RAM Data Transfer Control (should be 0004h)
+ value = psxSoundDataTransferControl;
+ break;
+ case 0x1dae:
+ value = Cores[0].Regs.STATX;
+ //ConLog("SPU2-X ps1 reg REG_P_STATX read return value: %x\n", value);
+ break;
+ }
- if (show)
- FileLog("[%10d] (!) SPU read mem %08x value %04x\n", Cycles, mem, value);
- return value;
+ if (show)
+ FileLog("[%10d] (!) SPU read mem %08x value %04x\n", Cycles, mem, value);
+ return value;
}
// Ah the joys of endian-specific code! :D
-static __forceinline void SetHiWord(u32 &src, u16 value)
+static __forceinline void SetHiWord(u32& src, u16 value)
{
- ((u16 *)&src)[1] = value;
+ ((u16*)&src)[1] = value;
}
-static __forceinline void SetLoWord(u32 &src, u16 value)
+static __forceinline void SetLoWord(u32& src, u16 value)
{
- ((u16 *)&src)[0] = value;
+ ((u16*)&src)[0] = value;
}
-static __forceinline u16 GetHiWord(u32 &src)
+static __forceinline u16 GetHiWord(u32& src)
{
- return ((u16 *)&src)[1];
+ return ((u16*)&src)[1];
}
-static __forceinline u16 GetLoWord(u32 &src)
+static __forceinline u16 GetLoWord(u32& src)
{
- return ((u16 *)&src)[0];
+ return ((u16*)&src)[0];
}
template
static void __fastcall RegWrite_VoiceParams(u16 value)
{
- const int core = CoreIdx;
- const int voice = VoiceIdx;
+ const int core = CoreIdx;
+ const int voice = VoiceIdx;
- V_Voice &thisvoice = Cores[core].Voices[voice];
+ V_Voice& thisvoice = Cores[core].Voices[voice];
- switch (param) {
- case 0: //VOLL (Volume L)
- case 1: //VOLR (Volume R)
- {
- V_VolumeSlide &thisvol = (param == 0) ? thisvoice.Volume.Left : thisvoice.Volume.Right;
- thisvol.Reg_VOL = value;
+ switch (param)
+ {
+ case 0: //VOLL (Volume L)
+ case 1: //VOLR (Volume R)
+ {
+ V_VolumeSlide& thisvol = (param == 0) ? thisvoice.Volume.Left : thisvoice.Volume.Right;
+ thisvol.Reg_VOL = value;
- if (value & 0x8000) // +Lin/-Lin/+Exp/-Exp
- {
- thisvol.Mode = (value & 0xF000) >> 12;
- thisvol.Increment = (value & 0x7F);
- // We're not sure slides work 100%
- if (IsDevBuild)
- ConLog("* SPU2: Voice uses Slides in Mode = %x, Increment = %x\n", thisvol.Mode, thisvol.Increment);
- } else {
- // Constant Volume mode (no slides or envelopes)
- // Volumes range from 0x3fff to 0x7fff, with 0x4000 serving as
- // the "sign" bit, so a simple bitwise extension will do the trick:
+ if (value & 0x8000) // +Lin/-Lin/+Exp/-Exp
+ {
+ thisvol.Mode = (value & 0xF000) >> 12;
+ thisvol.Increment = (value & 0x7F);
+ // We're not sure slides work 100%
+ if (IsDevBuild)
+ ConLog("* SPU2: Voice uses Slides in Mode = %x, Increment = %x\n", thisvol.Mode, thisvol.Increment);
+ }
+ else
+ {
+ // Constant Volume mode (no slides or envelopes)
+ // Volumes range from 0x3fff to 0x7fff, with 0x4000 serving as
+ // the "sign" bit, so a simple bitwise extension will do the trick:
- thisvol.RegSet(value << 1);
- thisvol.Mode = 0;
- thisvol.Increment = 0;
- }
- } break;
+ thisvol.RegSet(value << 1);
+ thisvol.Mode = 0;
+ thisvol.Increment = 0;
+ }
+ }
+ break;
- case 2:
- if (value > 0x3fff)
- ConLog("* SPU2: Pitch setting too big: 0x%x\n", value);
- thisvoice.Pitch = value & 0x3fff;
- break;
+ case 2:
+ if (value > 0x3fff)
+ ConLog("* SPU2: Pitch setting too big: 0x%x\n", value);
+ thisvoice.Pitch = value & 0x3fff;
+ break;
- case 3: // ADSR1 (Envelope)
- thisvoice.ADSR.regADSR1 = value;
- break;
+ case 3: // ADSR1 (Envelope)
+ thisvoice.ADSR.regADSR1 = value;
+ break;
- case 4: // ADSR2 (Envelope)
- thisvoice.ADSR.regADSR2 = value;
- break;
+ case 4: // ADSR2 (Envelope)
+ thisvoice.ADSR.regADSR2 = value;
+ break;
- // REG_VP_ENVX, REG_VP_VOLXL and REG_VP_VOLXR have been confirmed to not be allowed to be written to, so code has been commented out.
- // Colin McRae Rally 2005 triggers case 5 (ADSR), but it doesn't produce issues enabled or disabled.
+ // REG_VP_ENVX, REG_VP_VOLXL and REG_VP_VOLXR have been confirmed to not be allowed to be written to, so code has been commented out.
+ // Colin McRae Rally 2005 triggers case 5 (ADSR), but it doesn't produce issues enabled or disabled.
- case 5:
- // [Air] : Mysterious ADSR set code. Too bad none of my games ever use it.
- // (as usual... )
- //thisvoice.ADSR.Value = (value << 16) | value;
- //ConLog("* SPU2: Mysterious ADSR Volume Set to 0x%x\n", value);
- break;
+ case 5:
+ // [Air] : Mysterious ADSR set code. Too bad none of my games ever use it.
+ // (as usual... )
+ //thisvoice.ADSR.Value = (value << 16) | value;
+ //ConLog("* SPU2: Mysterious ADSR Volume Set to 0x%x\n", value);
+ break;
- case 6:
- //thisvoice.Volume.Left.RegSet(value);
- break;
- case 7:
- //thisvoice.Volume.Right.RegSet(value);
- break;
+ case 6:
+ //thisvoice.Volume.Left.RegSet(value);
+ break;
+ case 7:
+ //thisvoice.Volume.Right.RegSet(value);
+ break;
- jNO_DEFAULT;
- }
+ jNO_DEFAULT;
+ }
}
template
static void __fastcall RegWrite_VoiceAddr(u16 value)
{
- const int core = CoreIdx;
- const int voice = VoiceIdx;
+ const int core = CoreIdx;
+ const int voice = VoiceIdx;
- V_Voice &thisvoice = Cores[core].Voices[voice];
+ V_Voice& thisvoice = Cores[core].Voices[voice];
- switch (address) {
- case 0: // SSA (Waveform Start Addr) (hiword, 4 bits only)
- thisvoice.StartA = ((value & 0x0F) << 16) | (thisvoice.StartA & 0xFFF8);
- if (IsDevBuild)
- DebugCores[core].Voices[voice].lastSetStartA = thisvoice.StartA;
- break;
+ switch (address)
+ {
+ case 0: // SSA (Waveform Start Addr) (hiword, 4 bits only)
+ thisvoice.StartA = ((value & 0x0F) << 16) | (thisvoice.StartA & 0xFFF8);
+ if (IsDevBuild)
+ DebugCores[core].Voices[voice].lastSetStartA = thisvoice.StartA;
+ break;
- case 1: // SSA (loword)
- thisvoice.StartA = (thisvoice.StartA & 0x0F0000) | (value & 0xFFF8);
- if (IsDevBuild)
- DebugCores[core].Voices[voice].lastSetStartA = thisvoice.StartA;
- break;
+ case 1: // SSA (loword)
+ thisvoice.StartA = (thisvoice.StartA & 0x0F0000) | (value & 0xFFF8);
+ if (IsDevBuild)
+ DebugCores[core].Voices[voice].lastSetStartA = thisvoice.StartA;
+ break;
- case 2:
- thisvoice.LoopStartA = ((value & 0x0F) << 16) | (thisvoice.LoopStartA & 0xFFF8);
- thisvoice.LoopMode = 1;
- break;
+ case 2:
+ thisvoice.LoopStartA = ((value & 0x0F) << 16) | (thisvoice.LoopStartA & 0xFFF8);
+ thisvoice.LoopMode = 1;
+ break;
- case 3:
- thisvoice.LoopStartA = (thisvoice.LoopStartA & 0x0F0000) | (value & 0xFFF8);
- thisvoice.LoopMode = 1;
- break;
+ case 3:
+ thisvoice.LoopStartA = (thisvoice.LoopStartA & 0x0F0000) | (value & 0xFFF8);
+ thisvoice.LoopMode = 1;
+ break;
- // Note that there's no proof that I know of that writing to NextA is
- // even allowed or handled by the SPU2 (it might be disabled or ignored,
- // for example). Tests should be done to find games that write to this
- // reg, and see if they're buggy or not. --air
+ // Note that there's no proof that I know of that writing to NextA is
+ // even allowed or handled by the SPU2 (it might be disabled or ignored,
+ // for example). Tests should be done to find games that write to this
+ // reg, and see if they're buggy or not. --air
- // FlatOut & Soul Reaver 2 trigger these cases, but don't produce issues enabled or disabled.
- // Wallace And Gromit: Curse Of The Were-Rabbit triggers case 4 and 5 to produce proper sound,
- // without it some sound effects get cut off so we need the two NextA cases enabled.
+ // FlatOut & Soul Reaver 2 trigger these cases, but don't produce issues enabled or disabled.
+ // Wallace And Gromit: Curse Of The Were-Rabbit triggers case 4 and 5 to produce proper sound,
+ // without it some sound effects get cut off so we need the two NextA cases enabled.
- case 4:
- thisvoice.NextA = ((value & 0x0F) << 16) | (thisvoice.NextA & 0xFFF8) | 1;
- thisvoice.SCurrent = 28;
- break;
+ case 4:
+ thisvoice.NextA = ((value & 0x0F) << 16) | (thisvoice.NextA & 0xFFF8) | 1;
+ thisvoice.SCurrent = 28;
+ break;
- case 5:
- thisvoice.NextA = (thisvoice.NextA & 0x0F0000) | (value & 0xFFF8) | 1;
- thisvoice.SCurrent = 28;
- break;
- }
+ case 5:
+ thisvoice.NextA = (thisvoice.NextA & 0x0F0000) | (value & 0xFFF8) | 1;
+ thisvoice.SCurrent = 28;
+ break;
+ }
}
template
static void __fastcall RegWrite_Core(u16 value)
{
- const int omem = cAddr;
- const int core = CoreIdx;
- V_Core &thiscore = Cores[core];
+ const int omem = cAddr;
+ const int core = CoreIdx;
+ V_Core& thiscore = Cores[core];
- switch (omem) {
- case REG__1AC:
- // ----------------------------------------------------------------------------
- // 0x1ac / 0x5ac : direct-write to DMA address : special register (undocumented)
- // ----------------------------------------------------------------------------
- // On the GS, DMAs are actually pushed through a hardware register. Chances are the
- // SPU works the same way, and "technically" *all* DMA data actually passes through
- // the HW registers at 0x1ac (core0) and 0x5ac (core1). We handle normal DMAs in
- // optimized block copy fashion elsewhere, but some games will write this register
- // directly, so handle those here:
+ switch (omem)
+ {
+ case REG__1AC:
+ // ----------------------------------------------------------------------------
+ // 0x1ac / 0x5ac : direct-write to DMA address : special register (undocumented)
+ // ----------------------------------------------------------------------------
+ // On the GS, DMAs are actually pushed through a hardware register. Chances are the
+ // SPU works the same way, and "technically" *all* DMA data actually passes through
+ // the HW registers at 0x1ac (core0) and 0x5ac (core1). We handle normal DMAs in
+ // optimized block copy fashion elsewhere, but some games will write this register
+ // directly, so handle those here:
- // Performance Note: The PS2 Bios uses this extensively right before booting games,
- // causing massive slowdown if we don't shortcut it here.
+ // Performance Note: The PS2 Bios uses this extensively right before booting games,
+ // causing massive slowdown if we don't shortcut it here.
- for (int i = 0; i < 2; i++) {
- if (Cores[i].IRQEnable && (Cores[i].IRQA == thiscore.TSA)) {
- SetIrqCall(i);
- }
- }
- thiscore.DmaWrite(value);
- break;
+ for (int i = 0; i < 2; i++)
+ {
+ if (Cores[i].IRQEnable && (Cores[i].IRQA == thiscore.TSA))
+ {
+ SetIrqCall(i);
+ }
+ }
+ thiscore.DmaWrite(value);
+ break;
- case REG_C_ATTR: {
- bool irqe = thiscore.IRQEnable;
- int bit0 = thiscore.AttrBit0;
- bool fxenable = thiscore.FxEnable;
- u8 oldDmaMode = thiscore.DmaMode;
+ case REG_C_ATTR:
+ {
+ bool irqe = thiscore.IRQEnable;
+ int bit0 = thiscore.AttrBit0;
+ bool fxenable = thiscore.FxEnable;
+ u8 oldDmaMode = thiscore.DmaMode;
- thiscore.AttrBit0 = (value >> 0) & 0x01; //1 bit
- thiscore.DMABits = (value >> 1) & 0x07; //3 bits
- thiscore.DmaMode = (value >> 4) & 0x03; //2 bit (not necessary, we get the direction from the iop)
- thiscore.IRQEnable = (value >> 6) & 0x01; //1 bit
- thiscore.FxEnable = (value >> 7) & 0x01; //1 bit
- thiscore.NoiseClk = (value >> 8) & 0x3f; //6 bits
- //thiscore.Mute =(value>>14) & 0x01; //1 bit
- thiscore.Mute = 0;
- //thiscore.CoreEnabled=(value>>15) & 0x01; //1 bit
- // no clue
- if (value >> 15)
- thiscore.Regs.STATX = 0;
- thiscore.Regs.ATTR = value & 0x7fff;
+ thiscore.AttrBit0 = (value >> 0) & 0x01; //1 bit
+ thiscore.DMABits = (value >> 1) & 0x07; //3 bits
+ thiscore.DmaMode = (value >> 4) & 0x03; //2 bit (not necessary, we get the direction from the iop)
+ thiscore.IRQEnable = (value >> 6) & 0x01; //1 bit
+ thiscore.FxEnable = (value >> 7) & 0x01; //1 bit
+ thiscore.NoiseClk = (value >> 8) & 0x3f; //6 bits
+ //thiscore.Mute =(value>>14) & 0x01; //1 bit
+ thiscore.Mute = 0;
+ //thiscore.CoreEnabled=(value>>15) & 0x01; //1 bit
+ // no clue
+ if (value >> 15)
+ thiscore.Regs.STATX = 0;
+ thiscore.Regs.ATTR = value & 0x7fff;
- if (fxenable && !thiscore.FxEnable && (thiscore.EffectsStartA != thiscore.ExtEffectsStartA || thiscore.EffectsEndA != thiscore.ExtEffectsEndA)) {
- thiscore.EffectsStartA = thiscore.ExtEffectsStartA;
- thiscore.EffectsEndA = thiscore.ExtEffectsEndA;
- thiscore.ReverbX = 0;
- thiscore.RevBuffers.NeedsUpdated = true;
- }
+ if (fxenable && !thiscore.FxEnable && (thiscore.EffectsStartA != thiscore.ExtEffectsStartA || thiscore.EffectsEndA != thiscore.ExtEffectsEndA))
+ {
+ thiscore.EffectsStartA = thiscore.ExtEffectsStartA;
+ thiscore.EffectsEndA = thiscore.ExtEffectsEndA;
+ thiscore.ReverbX = 0;
+ thiscore.RevBuffers.NeedsUpdated = true;
+ }
- if (oldDmaMode != thiscore.DmaMode) {
- // FIXME... maybe: if this mode was cleared in the middle of a DMA, should we interrupt it?
- thiscore.Regs.STATX &= ~0x400; // ready to transfer
- }
+ if (oldDmaMode != thiscore.DmaMode)
+ {
+ // FIXME... maybe: if this mode was cleared in the middle of a DMA, should we interrupt it?
+ thiscore.Regs.STATX &= ~0x400; // ready to transfer
+ }
- if (value & 0x000E) {
- if (MsgToConsole())
- ConLog("* SPU2-X: Core %d ATTR unknown bits SET! value=%04x\n", core, value);
- }
+ if (value & 0x000E)
+ {
+ if (MsgToConsole())
+ ConLog("* SPU2-X: Core %d ATTR unknown bits SET! value=%04x\n", core, value);
+ }
- if (thiscore.AttrBit0 != bit0) {
- if (MsgToConsole())
- ConLog("* SPU2-X: ATTR bit 0 set to %d\n", thiscore.AttrBit0);
- }
- if (thiscore.IRQEnable != irqe) {
- //ConLog("* SPU2-X: Core%d IRQ %s at cycle %d. Current IRQA = %x Current EffectA = %x\n",
- // core, ((thiscore.IRQEnable==0)?"disabled":"enabled"), Cycles, thiscore.IRQA, thiscore.EffectsStartA);
+ if (thiscore.AttrBit0 != bit0)
+ {
+ if (MsgToConsole())
+ ConLog("* SPU2-X: ATTR bit 0 set to %d\n", thiscore.AttrBit0);
+ }
+ if (thiscore.IRQEnable != irqe)
+ {
+ //ConLog("* SPU2-X: Core%d IRQ %s at cycle %d. Current IRQA = %x Current EffectA = %x\n",
+ // core, ((thiscore.IRQEnable==0)?"disabled":"enabled"), Cycles, thiscore.IRQA, thiscore.EffectsStartA);
- if (!thiscore.IRQEnable)
- Spdif.Info &= ~(4 << thiscore.Index);
- }
+ if (!thiscore.IRQEnable)
+ Spdif.Info &= ~(4 << thiscore.Index);
+ }
+ }
+ break;
- } break;
+ case REG_S_PMON:
+ for (int vc = 1; vc < 16; ++vc)
+ thiscore.Voices[vc].Modulated = (value >> vc) & 1;
+ SetLoWord(thiscore.Regs.PMON, value);
+ break;
- case REG_S_PMON:
- for (int vc = 1; vc < 16; ++vc)
- thiscore.Voices[vc].Modulated = (value >> vc) & 1;
- SetLoWord(thiscore.Regs.PMON, value);
- break;
+ case (REG_S_PMON + 2):
+ for (int vc = 0; vc < 8; ++vc)
+ thiscore.Voices[vc + 16].Modulated = (value >> vc) & 1;
+ SetHiWord(thiscore.Regs.PMON, value);
+ break;
- case (REG_S_PMON + 2):
- for (int vc = 0; vc < 8; ++vc)
- thiscore.Voices[vc + 16].Modulated = (value >> vc) & 1;
- SetHiWord(thiscore.Regs.PMON, value);
- break;
+ case REG_S_NON:
+ for (int vc = 0; vc < 16; ++vc)
+ thiscore.Voices[vc].Noise = (value >> vc) & 1;
+ SetLoWord(thiscore.Regs.NON, value);
+ break;
- case REG_S_NON:
- for (int vc = 0; vc < 16; ++vc)
- thiscore.Voices[vc].Noise = (value >> vc) & 1;
- SetLoWord(thiscore.Regs.NON, value);
- break;
-
- case (REG_S_NON + 2):
- for (int vc = 0; vc < 8; ++vc)
- thiscore.Voices[vc + 16].Noise = (value >> vc) & 1;
- SetHiWord(thiscore.Regs.NON, value);
- break;
+ case (REG_S_NON + 2):
+ for (int vc = 0; vc < 8; ++vc)
+ thiscore.Voices[vc + 16].Noise = (value >> vc) & 1;
+ SetHiWord(thiscore.Regs.NON, value);
+ break;
// Games like to repeatedly write these regs over and over with the same value, hence
// the shortcut that skips the bitloop if the values are equal.
#define vx_SetSomeBits(reg_out, mask_out, hiword) \
- { \
- const u32 result = thiscore.Regs.reg_out; \
- if (hiword) \
- SetHiWord(thiscore.Regs.reg_out, value); \
- else \
- SetLoWord(thiscore.Regs.reg_out, value); \
- if (result == thiscore.Regs.reg_out) \
- break; \
+ { \
+ const u32 result = thiscore.Regs.reg_out; \
+ if (hiword) \
+ SetHiWord(thiscore.Regs.reg_out, value); \
+ else \
+ SetLoWord(thiscore.Regs.reg_out, value); \
+ if (result == thiscore.Regs.reg_out) \
+ break; \
\
- const uint start_bit = (hiword) ? 16 : 0; \
- const uint end_bit = (hiword) ? 24 : 16; \
- for (uint vc = start_bit, vx = 1; vc < end_bit; ++vc, vx <<= 1) \
- thiscore.VoiceGates[vc].mask_out = (value & vx) ? -1 : 0; \
- }
+ const uint start_bit = (hiword) ? 16 : 0; \
+ const uint end_bit = (hiword) ? 24 : 16; \
+ for (uint vc = start_bit, vx = 1; vc < end_bit; ++vc, vx <<= 1) \
+ thiscore.VoiceGates[vc].mask_out = (value & vx) ? -1 : 0; \
+ }
- case REG_S_VMIXL:
- vx_SetSomeBits(VMIXL, DryL, false);
- break;
+ case REG_S_VMIXL:
+ vx_SetSomeBits(VMIXL, DryL, false);
+ break;
- case (REG_S_VMIXL + 2):
- vx_SetSomeBits(VMIXL, DryL, true);
- break;
+ case (REG_S_VMIXL + 2):
+ vx_SetSomeBits(VMIXL, DryL, true);
+ break;
- case REG_S_VMIXEL:
- vx_SetSomeBits(VMIXEL, WetL, false);
- break;
+ case REG_S_VMIXEL:
+ vx_SetSomeBits(VMIXEL, WetL, false);
+ break;
- case (REG_S_VMIXEL + 2):
- vx_SetSomeBits(VMIXEL, WetL, true);
- break;
+ case (REG_S_VMIXEL + 2):
+ vx_SetSomeBits(VMIXEL, WetL, true);
+ break;
- case REG_S_VMIXR:
- vx_SetSomeBits(VMIXR, DryR, false);
- break;
+ case REG_S_VMIXR:
+ vx_SetSomeBits(VMIXR, DryR, false);
+ break;
- case (REG_S_VMIXR + 2):
- vx_SetSomeBits(VMIXR, DryR, true);
- break;
+ case (REG_S_VMIXR + 2):
+ vx_SetSomeBits(VMIXR, DryR, true);
+ break;
- case REG_S_VMIXER:
- vx_SetSomeBits(VMIXER, WetR, false);
- break;
+ case REG_S_VMIXER:
+ vx_SetSomeBits(VMIXER, WetR, false);
+ break;
- case (REG_S_VMIXER + 2):
- vx_SetSomeBits(VMIXER, WetR, true);
- break;
+ case (REG_S_VMIXER + 2):
+ vx_SetSomeBits(VMIXER, WetR, true);
+ break;
- case REG_P_MMIX: {
- // Each MMIX gate is assigned either 0 or 0xffffffff depending on the status
- // of the MMIX bits. I use -1 below as a shorthand for 0xffffffff. :)
+ case REG_P_MMIX:
+ {
+ // Each MMIX gate is assigned either 0 or 0xffffffff depending on the status
+ // of the MMIX bits. I use -1 below as a shorthand for 0xffffffff. :)
- const int vx = value & ((core == 0) ? 0xFF0 : 0xFFF);
- thiscore.WetGate.ExtR = (vx & 0x001) ? -1 : 0;
- thiscore.WetGate.ExtL = (vx & 0x002) ? -1 : 0;
- thiscore.DryGate.ExtR = (vx & 0x004) ? -1 : 0;
- thiscore.DryGate.ExtL = (vx & 0x008) ? -1 : 0;
- thiscore.WetGate.InpR = (vx & 0x010) ? -1 : 0;
- thiscore.WetGate.InpL = (vx & 0x020) ? -1 : 0;
- thiscore.DryGate.InpR = (vx & 0x040) ? -1 : 0;
- thiscore.DryGate.InpL = (vx & 0x080) ? -1 : 0;
- thiscore.WetGate.SndR = (vx & 0x100) ? -1 : 0;
- thiscore.WetGate.SndL = (vx & 0x200) ? -1 : 0;
- thiscore.DryGate.SndR = (vx & 0x400) ? -1 : 0;
- thiscore.DryGate.SndL = (vx & 0x800) ? -1 : 0;
- thiscore.Regs.MMIX = value;
- } break;
+ const int vx = value & ((core == 0) ? 0xFF0 : 0xFFF);
+ thiscore.WetGate.ExtR = (vx & 0x001) ? -1 : 0;
+ thiscore.WetGate.ExtL = (vx & 0x002) ? -1 : 0;
+ thiscore.DryGate.ExtR = (vx & 0x004) ? -1 : 0;
+ thiscore.DryGate.ExtL = (vx & 0x008) ? -1 : 0;
+ thiscore.WetGate.InpR = (vx & 0x010) ? -1 : 0;
+ thiscore.WetGate.InpL = (vx & 0x020) ? -1 : 0;
+ thiscore.DryGate.InpR = (vx & 0x040) ? -1 : 0;
+ thiscore.DryGate.InpL = (vx & 0x080) ? -1 : 0;
+ thiscore.WetGate.SndR = (vx & 0x100) ? -1 : 0;
+ thiscore.WetGate.SndL = (vx & 0x200) ? -1 : 0;
+ thiscore.DryGate.SndR = (vx & 0x400) ? -1 : 0;
+ thiscore.DryGate.SndL = (vx & 0x800) ? -1 : 0;
+ thiscore.Regs.MMIX = value;
+ }
+ break;
- case (REG_S_KON + 2):
- StartVoices(core, ((u32)value) << 16);
- spu2regs[omem >> 1 | core * 0x200] = value;
- break;
+ case (REG_S_KON + 2):
+ StartVoices(core, ((u32)value) << 16);
+ spu2regs[omem >> 1 | core * 0x200] = value;
+ break;
- case REG_S_KON:
- StartVoices(core, ((u32)value));
- spu2regs[omem >> 1 | core * 0x200] = value;
- break;
+ case REG_S_KON:
+ StartVoices(core, ((u32)value));
+ spu2regs[omem >> 1 | core * 0x200] = value;
+ break;
- case (REG_S_KOFF + 2):
- StopVoices(core, ((u32)value) << 16);
- spu2regs[omem >> 1 | core * 0x200] = value;
- break;
+ case (REG_S_KOFF + 2):
+ StopVoices(core, ((u32)value) << 16);
+ spu2regs[omem >> 1 | core * 0x200] = value;
+ break;
- case REG_S_KOFF:
- StopVoices(core, ((u32)value));
- spu2regs[omem >> 1 | core * 0x200] = value;
- break;
+ case REG_S_KOFF:
+ StopVoices(core, ((u32)value));
+ spu2regs[omem >> 1 | core * 0x200] = value;
+ break;
- case REG_S_ENDX:
- thiscore.Regs.ENDX &= 0xff0000;
- break;
+ case REG_S_ENDX:
+ thiscore.Regs.ENDX &= 0xff0000;
+ break;
- case (REG_S_ENDX + 2):
- thiscore.Regs.ENDX &= 0xffff;
- break;
+ case (REG_S_ENDX + 2):
+ thiscore.Regs.ENDX &= 0xffff;
+ break;
- // Reverb Start and End Address Writes!
- // * These regs are only writable when Effects are *DISABLED* (FxEnable is false).
- // Writes while enabled should be ignored.
- // NOTE: Above is false by testing but there are references saying this, so for
- // now we think that writing is allowed but the internal register doesn't reflect
- // the value until effects area writing is disabled.
- // * Yes, these are backwards from all the volumes -- the hiword comes FIRST (wtf!)
- // * End position is a hiword only! Loword is always ffff.
- // * The Reverb buffer position resets on writes to StartA. It probably resets
- // on writes to End too. Docs don't say, but they're for PSX, which couldn't
- // change the end address anyway.
- //
- case REG_A_ESA:
- SetHiWord(thiscore.ExtEffectsStartA, value);
- if (!thiscore.FxEnable) {
- thiscore.EffectsStartA = thiscore.ExtEffectsStartA;
- thiscore.ReverbX = 0;
- thiscore.RevBuffers.NeedsUpdated = true;
- }
- break;
+ // Reverb Start and End Address Writes!
+ // * These regs are only writable when Effects are *DISABLED* (FxEnable is false).
+ // Writes while enabled should be ignored.
+ // NOTE: Above is false by testing but there are references saying this, so for
+ // now we think that writing is allowed but the internal register doesn't reflect
+ // the value until effects area writing is disabled.
+ // * Yes, these are backwards from all the volumes -- the hiword comes FIRST (wtf!)
+ // * End position is a hiword only! Loword is always ffff.
+ // * The Reverb buffer position resets on writes to StartA. It probably resets
+ // on writes to End too. Docs don't say, but they're for PSX, which couldn't
+ // change the end address anyway.
+ //
+ case REG_A_ESA:
+ SetHiWord(thiscore.ExtEffectsStartA, value);
+ if (!thiscore.FxEnable)
+ {
+ thiscore.EffectsStartA = thiscore.ExtEffectsStartA;
+ thiscore.ReverbX = 0;
+ thiscore.RevBuffers.NeedsUpdated = true;
+ }
+ break;
- case (REG_A_ESA + 2):
- SetLoWord(thiscore.ExtEffectsStartA, value);
- if (!thiscore.FxEnable) {
- thiscore.EffectsStartA = thiscore.ExtEffectsStartA;
- thiscore.ReverbX = 0;
- thiscore.RevBuffers.NeedsUpdated = true;
- }
- break;
+ case (REG_A_ESA + 2):
+ SetLoWord(thiscore.ExtEffectsStartA, value);
+ if (!thiscore.FxEnable)
+ {
+ thiscore.EffectsStartA = thiscore.ExtEffectsStartA;
+ thiscore.ReverbX = 0;
+ thiscore.RevBuffers.NeedsUpdated = true;
+ }
+ break;
- case REG_A_EEA:
- thiscore.ExtEffectsEndA = ((u32)value << 16) | 0xFFFF;
- if (!thiscore.FxEnable) {
- thiscore.EffectsEndA = thiscore.ExtEffectsEndA;
- thiscore.ReverbX = 0;
- thiscore.RevBuffers.NeedsUpdated = true;
- }
- break;
+ case REG_A_EEA:
+ thiscore.ExtEffectsEndA = ((u32)value << 16) | 0xFFFF;
+ if (!thiscore.FxEnable)
+ {
+ thiscore.EffectsEndA = thiscore.ExtEffectsEndA;
+ thiscore.ReverbX = 0;
+ thiscore.RevBuffers.NeedsUpdated = true;
+ }
+ break;
- case REG_S_ADMAS:
- if (MsgToConsole())
- ConLog("* SPU2-X: Core %d AutoDMAControl set to %d (at cycle %d)\n", core, value, Cycles);
+ case REG_S_ADMAS:
+ if (MsgToConsole())
+ ConLog("* SPU2-X: Core %d AutoDMAControl set to %d (at cycle %d)\n", core, value, Cycles);
- if (psxmode)
- ConLog("* SPU2-X: Writing to REG_S_ADMAS while in PSX mode! value: %x", value);
- // hack for ps1driver which writes -1 (and never turns the adma off after psxlogo).
- // adma isn't available in psx mode either
- if (value == 32767) {
- psxmode = true;
- //memset(_spu2mem, 0, 0x200000);
- Cores[1].FxEnable = 0;
- Cores[1].EffectsStartA = 0x7FFF8; // park core1 effect area in inaccessible mem
- Cores[1].EffectsEndA = 0x7FFFF;
- Cores[1].ExtEffectsStartA = 0x7FFF8;
- Cores[1].ExtEffectsEndA = 0x7FFFF;
- Cores[1].ReverbX = 0;
- Cores[1].RevBuffers.NeedsUpdated = true;
- Cores[0].ReverbX = 0;
- Cores[0].RevBuffers.NeedsUpdated = true;
- for (uint v = 0; v < 24; ++v) {
- Cores[1].Voices[v].Volume = V_VolumeSlideLR(0, 0); // V_VolumeSlideLR::Max;
- Cores[1].Voices[v].SCurrent = 28;
+ if (psxmode)
+ ConLog("* SPU2-X: Writing to REG_S_ADMAS while in PSX mode! value: %x", value);
+ // hack for ps1driver which writes -1 (and never turns the adma off after psxlogo).
+ // adma isn't available in psx mode either
+ if (value == 32767)
+ {
+ psxmode = true;
+ //memset(_spu2mem, 0, 0x200000);
+ Cores[1].FxEnable = 0;
+ Cores[1].EffectsStartA = 0x7FFF8; // park core1 effect area in inaccessible mem
+ Cores[1].EffectsEndA = 0x7FFFF;
+ Cores[1].ExtEffectsStartA = 0x7FFF8;
+ Cores[1].ExtEffectsEndA = 0x7FFFF;
+ Cores[1].ReverbX = 0;
+ Cores[1].RevBuffers.NeedsUpdated = true;
+ Cores[0].ReverbX = 0;
+ Cores[0].RevBuffers.NeedsUpdated = true;
+ for (uint v = 0; v < 24; ++v)
+ {
+ Cores[1].Voices[v].Volume = V_VolumeSlideLR(0, 0); // V_VolumeSlideLR::Max;
+ Cores[1].Voices[v].SCurrent = 28;
- Cores[1].Voices[v].ADSR.Value = 0;
- Cores[1].Voices[v].ADSR.Phase = 0;
- Cores[1].Voices[v].Pitch = 0x0;
- Cores[1].Voices[v].NextA = 0x6FFFF;
- Cores[1].Voices[v].StartA = 0x6FFFF;
- Cores[1].Voices[v].LoopStartA = 0x6FFFF;
- Cores[1].Voices[v].Modulated = 0;
- }
- return;
- }
- thiscore.AutoDMACtrl = value;
+ Cores[1].Voices[v].ADSR.Value = 0;
+ Cores[1].Voices[v].ADSR.Phase = 0;
+ Cores[1].Voices[v].Pitch = 0x0;
+ Cores[1].Voices[v].NextA = 0x6FFFF;
+ Cores[1].Voices[v].StartA = 0x6FFFF;
+ Cores[1].Voices[v].LoopStartA = 0x6FFFF;
+ Cores[1].Voices[v].Modulated = 0;
+ }
+ return;
+ }
+ thiscore.AutoDMACtrl = value;
- if (value == 0) {
- thiscore.AdmaInProgress = 0;
- }
- break;
+ if (value == 0)
+ {
+ thiscore.AdmaInProgress = 0;
+ }
+ break;
- default: {
- const int addr = omem | ((core == 1) ? 0x400 : 0);
- *(regtable[addr >> 1]) = value;
- } break;
- }
+ default:
+ {
+ const int addr = omem | ((core == 1) ? 0x400 : 0);
+ *(regtable[addr >> 1]) = value;
+ }
+ break;
+ }
}
template
static void __fastcall RegWrite_CoreExt(u16 value)
{
- V_Core &thiscore = Cores[CoreIdx];
- const int core = CoreIdx;
+ V_Core& thiscore = Cores[CoreIdx];
+ const int core = CoreIdx;
- switch (addr) {
- // Master Volume Address Write!
+ switch (addr)
+ {
+ // Master Volume Address Write!
- case REG_P_MVOLL:
- case REG_P_MVOLR: {
- V_VolumeSlide &thisvol = (addr == REG_P_MVOLL) ? thiscore.MasterVol.Left : thiscore.MasterVol.Right;
+ case REG_P_MVOLL:
+ case REG_P_MVOLR:
+ {
+ V_VolumeSlide& thisvol = (addr == REG_P_MVOLL) ? thiscore.MasterVol.Left : thiscore.MasterVol.Right;
- if (value & 0x8000) // +Lin/-Lin/+Exp/-Exp
- {
- thisvol.Mode = (value & 0xF000) >> 12;
- thisvol.Increment = (value & 0x7F);
- //printf("slides Mode = %x, Increment = %x\n",thisvol.Mode,thisvol.Increment);
- } else {
- // Constant Volume mode (no slides or envelopes)
- // Volumes range from 0x3fff to 0x7fff, with 0x4000 serving as
- // the "sign" bit, so a simple bitwise extension will do the trick:
+ if (value & 0x8000) // +Lin/-Lin/+Exp/-Exp
+ {
+ thisvol.Mode = (value & 0xF000) >> 12;
+ thisvol.Increment = (value & 0x7F);
+ //printf("slides Mode = %x, Increment = %x\n",thisvol.Mode,thisvol.Increment);
+ }
+ else
+ {
+ // Constant Volume mode (no slides or envelopes)
+ // Volumes range from 0x3fff to 0x7fff, with 0x4000 serving as
+ // the "sign" bit, so a simple bitwise extension will do the trick:
- thisvol.Value = GetVol32(value << 1);
- thisvol.Mode = 0;
- thisvol.Increment = 0;
- }
- thisvol.Reg_VOL = value;
- } break;
+ thisvol.Value = GetVol32(value << 1);
+ thisvol.Mode = 0;
+ thisvol.Increment = 0;
+ }
+ thisvol.Reg_VOL = value;
+ }
+ break;
- case REG_P_EVOLL:
- thiscore.FxVol.Left = GetVol32(value);
- break;
+ case REG_P_EVOLL:
+ thiscore.FxVol.Left = GetVol32(value);
+ break;
- case REG_P_EVOLR:
- thiscore.FxVol.Right = GetVol32(value);
- break;
+ case REG_P_EVOLR:
+ thiscore.FxVol.Right = GetVol32(value);
+ break;
- case REG_P_AVOLL:
- thiscore.ExtVol.Left = GetVol32(value);
- break;
+ case REG_P_AVOLL:
+ thiscore.ExtVol.Left = GetVol32(value);
+ break;
- case REG_P_AVOLR:
- thiscore.ExtVol.Right = GetVol32(value);
- break;
+ case REG_P_AVOLR:
+ thiscore.ExtVol.Right = GetVol32(value);
+ break;
- case REG_P_BVOLL:
- thiscore.InpVol.Left = GetVol32(value);
- break;
+ case REG_P_BVOLL:
+ thiscore.InpVol.Left = GetVol32(value);
+ break;
- case REG_P_BVOLR:
- thiscore.InpVol.Right = GetVol32(value);
- break;
+ case REG_P_BVOLR:
+ thiscore.InpVol.Right = GetVol32(value);
+ break;
- // MVOLX has been confirmed to not be allowed to be written to, so cases have been added as a no-op.
- // Tokyo Xtreme Racer Zero triggers this code, caused left side volume to be reduced.
+ // MVOLX has been confirmed to not be allowed to be written to, so cases have been added as a no-op.
+ // Tokyo Xtreme Racer Zero triggers this code, caused left side volume to be reduced.
- case REG_P_MVOLXL:
- case REG_P_MVOLXR:
- break;
+ case REG_P_MVOLXL:
+ case REG_P_MVOLXR:
+ break;
- default: {
- const int raddr = addr + ((core == 1) ? 0x28 : 0);
- *(regtable[raddr >> 1]) = value;
- } break;
- }
+ default:
+ {
+ const int raddr = addr + ((core == 1) ? 0x28 : 0);
+ *(regtable[raddr >> 1]) = value;
+ }
+ break;
+ }
}
template
static void __fastcall RegWrite_Reverb(u16 value)
{
- // Signal to the Reverb code that the effects buffers need to be re-aligned.
- // This is both simple, efficient, and safe, since we only want to re-align
- // buffers after both hi and lo words have been written.
+ // Signal to the Reverb code that the effects buffers need to be re-aligned.
+ // This is both simple, efficient, and safe, since we only want to re-align
+ // buffers after both hi and lo words have been written.
- // Update: This may have been written when it wasn't yet known that games
- // have to disable the Reverb Engine to change settings.
- // As such we only need to update buffers and parameters when we see
- // the FxEnable bit go down, then high again. (rama)
- *(regtable[addr >> 1]) = value;
- //Cores[core].RevBuffers.NeedsUpdated = true; // See update above
+ // Update: This may have been written when it wasn't yet known that games
+ // have to disable the Reverb Engine to change settings.
+ // As such we only need to update buffers and parameters when we see
+ // the FxEnable bit go down, then high again. (rama)
+ *(regtable[addr >> 1]) = value;
+ //Cores[core].RevBuffers.NeedsUpdated = true; // See update above
}
template
static void __fastcall RegWrite_SPDIF(u16 value)
{
- *(regtable[addr >> 1]) = value;
- UpdateSpdifMode();
+ *(regtable[addr >> 1]) = value;
+ UpdateSpdifMode();
}
template
static void __fastcall RegWrite_Raw(u16 value)
{
- *(regtable[addr >> 1]) = value;
+ *(regtable[addr >> 1]) = value;
}
static void __fastcall RegWrite_Null(u16 value)
@@ -1514,30 +1579,30 @@ static void __fastcall RegWrite_Null(u16 value)
// Macros for tbl_reg_writes
// --------------------------------------------------------------------------------------
#define VoiceParamsSet(core, voice) \
- RegWrite_VoiceParams, RegWrite_VoiceParams, \
- RegWrite_VoiceParams, RegWrite_VoiceParams, \
- RegWrite_VoiceParams, RegWrite_VoiceParams, \
- RegWrite_VoiceParams, RegWrite_VoiceParams
+ RegWrite_VoiceParams, RegWrite_VoiceParams, \
+ RegWrite_VoiceParams, RegWrite_VoiceParams, \
+ RegWrite_VoiceParams, RegWrite_VoiceParams, \
+ RegWrite_VoiceParams, RegWrite_VoiceParams
#define VoiceParamsCore(core) \
- VoiceParamsSet(core, 0), VoiceParamsSet(core, 1), VoiceParamsSet(core, 2), VoiceParamsSet(core, 3), \
- VoiceParamsSet(core, 4), VoiceParamsSet(core, 5), VoiceParamsSet(core, 6), VoiceParamsSet(core, 7), \
- VoiceParamsSet(core, 8), VoiceParamsSet(core, 9), VoiceParamsSet(core, 10), VoiceParamsSet(core, 11), \
- VoiceParamsSet(core, 12), VoiceParamsSet(core, 13), VoiceParamsSet(core, 14), VoiceParamsSet(core, 15), \
- VoiceParamsSet(core, 16), VoiceParamsSet(core, 17), VoiceParamsSet(core, 18), VoiceParamsSet(core, 19), \
- VoiceParamsSet(core, 20), VoiceParamsSet(core, 21), VoiceParamsSet(core, 22), VoiceParamsSet(core, 23)
+ VoiceParamsSet(core, 0), VoiceParamsSet(core, 1), VoiceParamsSet(core, 2), VoiceParamsSet(core, 3), \
+ VoiceParamsSet(core, 4), VoiceParamsSet(core, 5), VoiceParamsSet(core, 6), VoiceParamsSet(core, 7), \
+ VoiceParamsSet(core, 8), VoiceParamsSet(core, 9), VoiceParamsSet(core, 10), VoiceParamsSet(core, 11), \
+ VoiceParamsSet(core, 12), VoiceParamsSet(core, 13), VoiceParamsSet(core, 14), VoiceParamsSet(core, 15), \
+ VoiceParamsSet(core, 16), VoiceParamsSet(core, 17), VoiceParamsSet(core, 18), VoiceParamsSet(core, 19), \
+ VoiceParamsSet(core, 20), VoiceParamsSet(core, 21), VoiceParamsSet(core, 22), VoiceParamsSet(core, 23)
#define VoiceAddrSet(core, voice) \
- RegWrite_VoiceAddr, RegWrite_VoiceAddr, \
- RegWrite_VoiceAddr, RegWrite_VoiceAddr, \
- RegWrite_VoiceAddr, RegWrite_VoiceAddr
+ RegWrite_VoiceAddr, RegWrite_VoiceAddr, \
+ RegWrite_VoiceAddr, RegWrite_VoiceAddr, \
+ RegWrite_VoiceAddr, RegWrite_VoiceAddr
#define CoreParamsPair(core, omem) \
- RegWrite_Core, RegWrite_Core
+ RegWrite_Core, RegWrite_Core
#define ReverbPair(core, mem) \
- RegWrite_Reverb, RegWrite_Core
+ RegWrite_Reverb, RegWrite_Core
#define REGRAW(addr) RegWrite_Raw
@@ -1546,287 +1611,290 @@ static void __fastcall RegWrite_Null(u16 value)
// --------------------------------------------------------------------------------------
typedef void __fastcall RegWriteHandler(u16 value);
-static RegWriteHandler *const tbl_reg_writes[0x401] =
- {
- VoiceParamsCore(0), // 0x000 -> 0x180
- CoreParamsPair(0, REG_S_PMON),
- CoreParamsPair(0, REG_S_NON),
- CoreParamsPair(0, REG_S_VMIXL),
- CoreParamsPair(0, REG_S_VMIXEL),
- CoreParamsPair(0, REG_S_VMIXR),
- CoreParamsPair(0, REG_S_VMIXER),
+static RegWriteHandler* const tbl_reg_writes[0x401] =
+ {
+ VoiceParamsCore(0), // 0x000 -> 0x180
+ CoreParamsPair(0, REG_S_PMON),
+ CoreParamsPair(0, REG_S_NON),
+ CoreParamsPair(0, REG_S_VMIXL),
+ CoreParamsPair(0, REG_S_VMIXEL),
+ CoreParamsPair(0, REG_S_VMIXR),
+ CoreParamsPair(0, REG_S_VMIXER),
- RegWrite_Core<0, REG_P_MMIX>,
- RegWrite_Core<0, REG_C_ATTR>,
+ RegWrite_Core<0, REG_P_MMIX>,
+ RegWrite_Core<0, REG_C_ATTR>,
- CoreParamsPair(0, REG_A_IRQA),
- CoreParamsPair(0, REG_S_KON),
- CoreParamsPair(0, REG_S_KOFF),
- CoreParamsPair(0, REG_A_TSA),
- CoreParamsPair(0, REG__1AC),
+ CoreParamsPair(0, REG_A_IRQA),
+ CoreParamsPair(0, REG_S_KON),
+ CoreParamsPair(0, REG_S_KOFF),
+ CoreParamsPair(0, REG_A_TSA),
+ CoreParamsPair(0, REG__1AC),
- RegWrite_Core<0, REG_S_ADMAS>,
- REGRAW(0x1b2),
+ RegWrite_Core<0, REG_S_ADMAS>,
+ REGRAW(0x1b2),
- REGRAW(0x1b4), REGRAW(0x1b6),
- REGRAW(0x1b8), REGRAW(0x1ba),
- REGRAW(0x1bc), REGRAW(0x1be),
+ REGRAW(0x1b4), REGRAW(0x1b6),
+ REGRAW(0x1b8), REGRAW(0x1ba),
+ REGRAW(0x1bc), REGRAW(0x1be),
- // 0x1c0!
+ // 0x1c0!
- VoiceAddrSet(0, 0), VoiceAddrSet(0, 1), VoiceAddrSet(0, 2), VoiceAddrSet(0, 3), VoiceAddrSet(0, 4), VoiceAddrSet(0, 5),
- VoiceAddrSet(0, 6), VoiceAddrSet(0, 7), VoiceAddrSet(0, 8), VoiceAddrSet(0, 9), VoiceAddrSet(0, 10), VoiceAddrSet(0, 11),
- VoiceAddrSet(0, 12), VoiceAddrSet(0, 13), VoiceAddrSet(0, 14), VoiceAddrSet(0, 15), VoiceAddrSet(0, 16), VoiceAddrSet(0, 17),
- VoiceAddrSet(0, 18), VoiceAddrSet(0, 19), VoiceAddrSet(0, 20), VoiceAddrSet(0, 21), VoiceAddrSet(0, 22), VoiceAddrSet(0, 23),
+ VoiceAddrSet(0, 0), VoiceAddrSet(0, 1), VoiceAddrSet(0, 2), VoiceAddrSet(0, 3), VoiceAddrSet(0, 4), VoiceAddrSet(0, 5),
+ VoiceAddrSet(0, 6), VoiceAddrSet(0, 7), VoiceAddrSet(0, 8), VoiceAddrSet(0, 9), VoiceAddrSet(0, 10), VoiceAddrSet(0, 11),
+ VoiceAddrSet(0, 12), VoiceAddrSet(0, 13), VoiceAddrSet(0, 14), VoiceAddrSet(0, 15), VoiceAddrSet(0, 16), VoiceAddrSet(0, 17),
+ VoiceAddrSet(0, 18), VoiceAddrSet(0, 19), VoiceAddrSet(0, 20), VoiceAddrSet(0, 21), VoiceAddrSet(0, 22), VoiceAddrSet(0, 23),
- CoreParamsPair(0, REG_A_ESA),
+ CoreParamsPair(0, REG_A_ESA),
- ReverbPair(0, R_APF1_SIZE), // 0x02E4 // Feedback Source A
- ReverbPair(0, R_APF2_SIZE), // 0x02E8 // Feedback Source B
- ReverbPair(0, R_SAME_L_DST), // 0x02EC
- ReverbPair(0, R_SAME_R_DST), // 0x02F0
- ReverbPair(0, R_COMB1_L_SRC), // 0x02F4
- ReverbPair(0, R_COMB1_R_SRC), // 0x02F8
- ReverbPair(0, R_COMB2_L_SRC), // 0x02FC
- ReverbPair(0, R_COMB2_R_SRC), // 0x0300
- ReverbPair(0, R_SAME_L_SRC), // 0x0304
- ReverbPair(0, R_SAME_R_SRC), // 0x0308
- ReverbPair(0, R_DIFF_L_DST), // 0x030C
- ReverbPair(0, R_DIFF_R_DST), // 0x0310
- ReverbPair(0, R_COMB3_L_SRC), // 0x0314
- ReverbPair(0, R_COMB3_R_SRC), // 0x0318
- ReverbPair(0, R_COMB4_L_SRC), // 0x031C
- ReverbPair(0, R_COMB4_R_SRC), // 0x0320
- ReverbPair(0, R_DIFF_L_SRC), // 0x0324
- ReverbPair(0, R_DIFF_R_SRC), // 0x0328
- ReverbPair(0, R_APF1_L_DST), // 0x032C
- ReverbPair(0, R_APF1_R_DST), // 0x0330
- ReverbPair(0, R_APF2_L_DST), // 0x0334
- ReverbPair(0, R_APF2_R_DST), // 0x0338
+ ReverbPair(0, R_APF1_SIZE), // 0x02E4 // Feedback Source A
+ ReverbPair(0, R_APF2_SIZE), // 0x02E8 // Feedback Source B
+ ReverbPair(0, R_SAME_L_DST), // 0x02EC
+ ReverbPair(0, R_SAME_R_DST), // 0x02F0
+ ReverbPair(0, R_COMB1_L_SRC), // 0x02F4
+ ReverbPair(0, R_COMB1_R_SRC), // 0x02F8
+ ReverbPair(0, R_COMB2_L_SRC), // 0x02FC
+ ReverbPair(0, R_COMB2_R_SRC), // 0x0300
+ ReverbPair(0, R_SAME_L_SRC), // 0x0304
+ ReverbPair(0, R_SAME_R_SRC), // 0x0308
+ ReverbPair(0, R_DIFF_L_DST), // 0x030C
+ ReverbPair(0, R_DIFF_R_DST), // 0x0310
+ ReverbPair(0, R_COMB3_L_SRC), // 0x0314
+ ReverbPair(0, R_COMB3_R_SRC), // 0x0318
+ ReverbPair(0, R_COMB4_L_SRC), // 0x031C
+ ReverbPair(0, R_COMB4_R_SRC), // 0x0320
+ ReverbPair(0, R_DIFF_L_SRC), // 0x0324
+ ReverbPair(0, R_DIFF_R_SRC), // 0x0328
+ ReverbPair(0, R_APF1_L_DST), // 0x032C
+ ReverbPair(0, R_APF1_R_DST), // 0x0330
+ ReverbPair(0, R_APF2_L_DST), // 0x0334
+ ReverbPair(0, R_APF2_R_DST), // 0x0338
- RegWrite_Core<0, REG_A_EEA>, RegWrite_Null,
+ RegWrite_Core<0, REG_A_EEA>, RegWrite_Null,
- CoreParamsPair(0, REG_S_ENDX), // 0x0340 // End Point passed flag
- RegWrite_Core<0, REG_P_STATX>, // 0x0344 // Status register?
+ CoreParamsPair(0, REG_S_ENDX), // 0x0340 // End Point passed flag
+ RegWrite_Core<0, REG_P_STATX>, // 0x0344 // Status register?
- //0x346 here
- REGRAW(0x346),
- REGRAW(0x348), REGRAW(0x34A), REGRAW(0x34C), REGRAW(0x34E),
- REGRAW(0x350), REGRAW(0x352), REGRAW(0x354), REGRAW(0x356),
- REGRAW(0x358), REGRAW(0x35A), REGRAW(0x35C), REGRAW(0x35E),
- REGRAW(0x360), REGRAW(0x362), REGRAW(0x364), REGRAW(0x366),
- REGRAW(0x368), REGRAW(0x36A), REGRAW(0x36C), REGRAW(0x36E),
- REGRAW(0x370), REGRAW(0x372), REGRAW(0x374), REGRAW(0x376),
- REGRAW(0x378), REGRAW(0x37A), REGRAW(0x37C), REGRAW(0x37E),
- REGRAW(0x380), REGRAW(0x382), REGRAW(0x384), REGRAW(0x386),
- REGRAW(0x388), REGRAW(0x38A), REGRAW(0x38C), REGRAW(0x38E),
- REGRAW(0x390), REGRAW(0x392), REGRAW(0x394), REGRAW(0x396),
- REGRAW(0x398), REGRAW(0x39A), REGRAW(0x39C), REGRAW(0x39E),
- REGRAW(0x3A0), REGRAW(0x3A2), REGRAW(0x3A4), REGRAW(0x3A6),
- REGRAW(0x3A8), REGRAW(0x3AA), REGRAW(0x3AC), REGRAW(0x3AE),
- REGRAW(0x3B0), REGRAW(0x3B2), REGRAW(0x3B4), REGRAW(0x3B6),
- REGRAW(0x3B8), REGRAW(0x3BA), REGRAW(0x3BC), REGRAW(0x3BE),
- REGRAW(0x3C0), REGRAW(0x3C2), REGRAW(0x3C4), REGRAW(0x3C6),
- REGRAW(0x3C8), REGRAW(0x3CA), REGRAW(0x3CC), REGRAW(0x3CE),
- REGRAW(0x3D0), REGRAW(0x3D2), REGRAW(0x3D4), REGRAW(0x3D6),
- REGRAW(0x3D8), REGRAW(0x3DA), REGRAW(0x3DC), REGRAW(0x3DE),
- REGRAW(0x3E0), REGRAW(0x3E2), REGRAW(0x3E4), REGRAW(0x3E6),
- REGRAW(0x3E8), REGRAW(0x3EA), REGRAW(0x3EC), REGRAW(0x3EE),
- REGRAW(0x3F0), REGRAW(0x3F2), REGRAW(0x3F4), REGRAW(0x3F6),
- REGRAW(0x3F8), REGRAW(0x3FA), REGRAW(0x3FC), REGRAW(0x3FE),
+ //0x346 here
+ REGRAW(0x346),
+ REGRAW(0x348), REGRAW(0x34A), REGRAW(0x34C), REGRAW(0x34E),
+ REGRAW(0x350), REGRAW(0x352), REGRAW(0x354), REGRAW(0x356),
+ REGRAW(0x358), REGRAW(0x35A), REGRAW(0x35C), REGRAW(0x35E),
+ REGRAW(0x360), REGRAW(0x362), REGRAW(0x364), REGRAW(0x366),
+ REGRAW(0x368), REGRAW(0x36A), REGRAW(0x36C), REGRAW(0x36E),
+ REGRAW(0x370), REGRAW(0x372), REGRAW(0x374), REGRAW(0x376),
+ REGRAW(0x378), REGRAW(0x37A), REGRAW(0x37C), REGRAW(0x37E),
+ REGRAW(0x380), REGRAW(0x382), REGRAW(0x384), REGRAW(0x386),
+ REGRAW(0x388), REGRAW(0x38A), REGRAW(0x38C), REGRAW(0x38E),
+ REGRAW(0x390), REGRAW(0x392), REGRAW(0x394), REGRAW(0x396),
+ REGRAW(0x398), REGRAW(0x39A), REGRAW(0x39C), REGRAW(0x39E),
+ REGRAW(0x3A0), REGRAW(0x3A2), REGRAW(0x3A4), REGRAW(0x3A6),
+ REGRAW(0x3A8), REGRAW(0x3AA), REGRAW(0x3AC), REGRAW(0x3AE),
+ REGRAW(0x3B0), REGRAW(0x3B2), REGRAW(0x3B4), REGRAW(0x3B6),
+ REGRAW(0x3B8), REGRAW(0x3BA), REGRAW(0x3BC), REGRAW(0x3BE),
+ REGRAW(0x3C0), REGRAW(0x3C2), REGRAW(0x3C4), REGRAW(0x3C6),
+ REGRAW(0x3C8), REGRAW(0x3CA), REGRAW(0x3CC), REGRAW(0x3CE),
+ REGRAW(0x3D0), REGRAW(0x3D2), REGRAW(0x3D4), REGRAW(0x3D6),
+ REGRAW(0x3D8), REGRAW(0x3DA), REGRAW(0x3DC), REGRAW(0x3DE),
+ REGRAW(0x3E0), REGRAW(0x3E2), REGRAW(0x3E4), REGRAW(0x3E6),
+ REGRAW(0x3E8), REGRAW(0x3EA), REGRAW(0x3EC), REGRAW(0x3EE),
+ REGRAW(0x3F0), REGRAW(0x3F2), REGRAW(0x3F4), REGRAW(0x3F6),
+ REGRAW(0x3F8), REGRAW(0x3FA), REGRAW(0x3FC), REGRAW(0x3FE),
- // AND... we reached 0x400!
- // Last verse, same as the first:
+ // AND... we reached 0x400!
+ // Last verse, same as the first:
- VoiceParamsCore(1), // 0x000 -> 0x180
- CoreParamsPair(1, REG_S_PMON),
- CoreParamsPair(1, REG_S_NON),
- CoreParamsPair(1, REG_S_VMIXL),
- CoreParamsPair(1, REG_S_VMIXEL),
- CoreParamsPair(1, REG_S_VMIXR),
- CoreParamsPair(1, REG_S_VMIXER),
+ VoiceParamsCore(1), // 0x000 -> 0x180
+ CoreParamsPair(1, REG_S_PMON),
+ CoreParamsPair(1, REG_S_NON),
+ CoreParamsPair(1, REG_S_VMIXL),
+ CoreParamsPair(1, REG_S_VMIXEL),
+ CoreParamsPair(1, REG_S_VMIXR),
+ CoreParamsPair(1, REG_S_VMIXER),
- RegWrite_Core<1, REG_P_MMIX>,
- RegWrite_Core<1, REG_C_ATTR>,
+ RegWrite_Core<1, REG_P_MMIX>,
+ RegWrite_Core<1, REG_C_ATTR>,
- CoreParamsPair(1, REG_A_IRQA),
- CoreParamsPair(1, REG_S_KON),
- CoreParamsPair(1, REG_S_KOFF),
- CoreParamsPair(1, REG_A_TSA),
- CoreParamsPair(1, REG__1AC),
+ CoreParamsPair(1, REG_A_IRQA),
+ CoreParamsPair(1, REG_S_KON),
+ CoreParamsPair(1, REG_S_KOFF),
+ CoreParamsPair(1, REG_A_TSA),
+ CoreParamsPair(1, REG__1AC),
- RegWrite_Core<1, REG_S_ADMAS>,
- REGRAW(0x5b2),
+ RegWrite_Core<1, REG_S_ADMAS>,
+ REGRAW(0x5b2),
- REGRAW(0x5b4), REGRAW(0x5b6),
- REGRAW(0x5b8), REGRAW(0x5ba),
- REGRAW(0x5bc), REGRAW(0x5be),
+ REGRAW(0x5b4), REGRAW(0x5b6),
+ REGRAW(0x5b8), REGRAW(0x5ba),
+ REGRAW(0x5bc), REGRAW(0x5be),
- // 0x1c0!
+ // 0x1c0!
- VoiceAddrSet(1, 0), VoiceAddrSet(1, 1), VoiceAddrSet(1, 2), VoiceAddrSet(1, 3), VoiceAddrSet(1, 4), VoiceAddrSet(1, 5),
- VoiceAddrSet(1, 6), VoiceAddrSet(1, 7), VoiceAddrSet(1, 8), VoiceAddrSet(1, 9), VoiceAddrSet(1, 10), VoiceAddrSet(1, 11),
- VoiceAddrSet(1, 12), VoiceAddrSet(1, 13), VoiceAddrSet(1, 14), VoiceAddrSet(1, 15), VoiceAddrSet(1, 16), VoiceAddrSet(1, 17),
- VoiceAddrSet(1, 18), VoiceAddrSet(1, 19), VoiceAddrSet(1, 20), VoiceAddrSet(1, 21), VoiceAddrSet(1, 22), VoiceAddrSet(1, 23),
+ VoiceAddrSet(1, 0), VoiceAddrSet(1, 1), VoiceAddrSet(1, 2), VoiceAddrSet(1, 3), VoiceAddrSet(1, 4), VoiceAddrSet(1, 5),
+ VoiceAddrSet(1, 6), VoiceAddrSet(1, 7), VoiceAddrSet(1, 8), VoiceAddrSet(1, 9), VoiceAddrSet(1, 10), VoiceAddrSet(1, 11),
+ VoiceAddrSet(1, 12), VoiceAddrSet(1, 13), VoiceAddrSet(1, 14), VoiceAddrSet(1, 15), VoiceAddrSet(1, 16), VoiceAddrSet(1, 17),
+ VoiceAddrSet(1, 18), VoiceAddrSet(1, 19), VoiceAddrSet(1, 20), VoiceAddrSet(1, 21), VoiceAddrSet(1, 22), VoiceAddrSet(1, 23),
- CoreParamsPair(1, REG_A_ESA),
+ CoreParamsPair(1, REG_A_ESA),
- ReverbPair(1, R_APF1_SIZE), // 0x02E4 // Feedback Source A
- ReverbPair(1, R_APF2_SIZE), // 0x02E8 // Feedback Source B
- ReverbPair(1, R_SAME_L_DST), // 0x02EC
- ReverbPair(1, R_SAME_R_DST), // 0x02F0
- ReverbPair(1, R_COMB1_L_SRC), // 0x02F4
- ReverbPair(1, R_COMB1_R_SRC), // 0x02F8
- ReverbPair(1, R_COMB2_L_SRC), // 0x02FC
- ReverbPair(1, R_COMB2_R_SRC), // 0x0300
- ReverbPair(1, R_SAME_L_SRC), // 0x0304
- ReverbPair(1, R_SAME_R_SRC), // 0x0308
- ReverbPair(1, R_DIFF_L_DST), // 0x030C
- ReverbPair(1, R_DIFF_R_DST), // 0x0310
- ReverbPair(1, R_COMB3_L_SRC), // 0x0314
- ReverbPair(1, R_COMB3_R_SRC), // 0x0318
- ReverbPair(1, R_COMB4_L_SRC), // 0x031C
- ReverbPair(1, R_COMB4_R_SRC), // 0x0320
- ReverbPair(1, R_DIFF_R_SRC), // 0x0324
- ReverbPair(1, R_DIFF_L_SRC), // 0x0328
- ReverbPair(1, R_APF1_L_DST), // 0x032C
- ReverbPair(1, R_APF1_R_DST), // 0x0330
- ReverbPair(1, R_APF2_L_DST), // 0x0334
- ReverbPair(1, R_APF2_R_DST), // 0x0338
+ ReverbPair(1, R_APF1_SIZE), // 0x02E4 // Feedback Source A
+ ReverbPair(1, R_APF2_SIZE), // 0x02E8 // Feedback Source B
+ ReverbPair(1, R_SAME_L_DST), // 0x02EC
+ ReverbPair(1, R_SAME_R_DST), // 0x02F0
+ ReverbPair(1, R_COMB1_L_SRC), // 0x02F4
+ ReverbPair(1, R_COMB1_R_SRC), // 0x02F8
+ ReverbPair(1, R_COMB2_L_SRC), // 0x02FC
+ ReverbPair(1, R_COMB2_R_SRC), // 0x0300
+ ReverbPair(1, R_SAME_L_SRC), // 0x0304
+ ReverbPair(1, R_SAME_R_SRC), // 0x0308
+ ReverbPair(1, R_DIFF_L_DST), // 0x030C
+ ReverbPair(1, R_DIFF_R_DST), // 0x0310
+ ReverbPair(1, R_COMB3_L_SRC), // 0x0314
+ ReverbPair(1, R_COMB3_R_SRC), // 0x0318
+ ReverbPair(1, R_COMB4_L_SRC), // 0x031C
+ ReverbPair(1, R_COMB4_R_SRC), // 0x0320
+ ReverbPair(1, R_DIFF_R_SRC), // 0x0324
+ ReverbPair(1, R_DIFF_L_SRC), // 0x0328
+ ReverbPair(1, R_APF1_L_DST), // 0x032C
+ ReverbPair(1, R_APF1_R_DST), // 0x0330
+ ReverbPair(1, R_APF2_L_DST), // 0x0334
+ ReverbPair(1, R_APF2_R_DST), // 0x0338
- RegWrite_Core<1, REG_A_EEA>, RegWrite_Null,
+ RegWrite_Core<1, REG_A_EEA>, RegWrite_Null,
- CoreParamsPair(1, REG_S_ENDX), // 0x0340 // End Point passed flag
- RegWrite_Core<1, REG_P_STATX>, // 0x0344 // Status register?
+ CoreParamsPair(1, REG_S_ENDX), // 0x0340 // End Point passed flag
+ RegWrite_Core<1, REG_P_STATX>, // 0x0344 // Status register?
- REGRAW(0x746),
- REGRAW(0x748), REGRAW(0x74A), REGRAW(0x74C), REGRAW(0x74E),
- REGRAW(0x750), REGRAW(0x752), REGRAW(0x754), REGRAW(0x756),
- REGRAW(0x758), REGRAW(0x75A), REGRAW(0x75C), REGRAW(0x75E),
+ REGRAW(0x746),
+ REGRAW(0x748), REGRAW(0x74A), REGRAW(0x74C), REGRAW(0x74E),
+ REGRAW(0x750), REGRAW(0x752), REGRAW(0x754), REGRAW(0x756),
+ REGRAW(0x758), REGRAW(0x75A), REGRAW(0x75C), REGRAW(0x75E),
- // ------ -------
+ // ------ -------
- RegWrite_CoreExt<0, REG_P_MVOLL>, // 0x0760 // Master Volume Left
- RegWrite_CoreExt<0, REG_P_MVOLR>, // 0x0762 // Master Volume Right
- RegWrite_CoreExt<0, REG_P_EVOLL>, // 0x0764 // Effect Volume Left
- RegWrite_CoreExt<0, REG_P_EVOLR>, // 0x0766 // Effect Volume Right
- RegWrite_CoreExt<0, REG_P_AVOLL>, // 0x0768 // Core External Input Volume Left (Only Core 1)
- RegWrite_CoreExt<0, REG_P_AVOLR>, // 0x076A // Core External Input Volume Right (Only Core 1)
- RegWrite_CoreExt<0, REG_P_BVOLL>, // 0x076C // Sound Data Volume Left
- RegWrite_CoreExt<0, REG_P_BVOLR>, // 0x076E // Sound Data Volume Right
- RegWrite_CoreExt<0, REG_P_MVOLXL>, // 0x0770 // Current Master Volume Left
- RegWrite_CoreExt<0, REG_P_MVOLXR>, // 0x0772 // Current Master Volume Right
+ RegWrite_CoreExt<0, REG_P_MVOLL>, // 0x0760 // Master Volume Left
+ RegWrite_CoreExt<0, REG_P_MVOLR>, // 0x0762 // Master Volume Right
+ RegWrite_CoreExt<0, REG_P_EVOLL>, // 0x0764 // Effect Volume Left
+ RegWrite_CoreExt<0, REG_P_EVOLR>, // 0x0766 // Effect Volume Right
+ RegWrite_CoreExt<0, REG_P_AVOLL>, // 0x0768 // Core External Input Volume Left (Only Core 1)
+ RegWrite_CoreExt<0, REG_P_AVOLR>, // 0x076A // Core External Input Volume Right (Only Core 1)
+ RegWrite_CoreExt<0, REG_P_BVOLL>, // 0x076C // Sound Data Volume Left
+ RegWrite_CoreExt<0, REG_P_BVOLR>, // 0x076E // Sound Data Volume Right
+ RegWrite_CoreExt<0, REG_P_MVOLXL>, // 0x0770 // Current Master Volume Left
+ RegWrite_CoreExt<0, REG_P_MVOLXR>, // 0x0772 // Current Master Volume Right
- RegWrite_CoreExt<0, R_IIR_VOL>, // 0x0774 //IIR alpha (% used)
- RegWrite_CoreExt<0, R_COMB1_VOL>, // 0x0776
- RegWrite_CoreExt<0, R_COMB2_VOL>, // 0x0778
- RegWrite_CoreExt<0, R_COMB3_VOL>, // 0x077A
- RegWrite_CoreExt<0, R_COMB4_VOL>, // 0x077C
- RegWrite_CoreExt<0, R_WALL_VOL>, // 0x077E
- RegWrite_CoreExt<0, R_APF1_VOL>, // 0x0780 //feedback alpha (% used)
- RegWrite_CoreExt<0, R_APF2_VOL>, // 0x0782 //feedback
- RegWrite_CoreExt<0, R_IN_COEF_L>, // 0x0784
- RegWrite_CoreExt<0, R_IN_COEF_R>, // 0x0786
+ RegWrite_CoreExt<0, R_IIR_VOL>, // 0x0774 //IIR alpha (% used)
+ RegWrite_CoreExt<0, R_COMB1_VOL>, // 0x0776
+ RegWrite_CoreExt<0, R_COMB2_VOL>, // 0x0778
+ RegWrite_CoreExt<0, R_COMB3_VOL>, // 0x077A
+ RegWrite_CoreExt<0, R_COMB4_VOL>, // 0x077C
+ RegWrite_CoreExt<0, R_WALL_VOL>, // 0x077E
+ RegWrite_CoreExt<0, R_APF1_VOL>, // 0x0780 //feedback alpha (% used)
+ RegWrite_CoreExt<0, R_APF2_VOL>, // 0x0782 //feedback
+ RegWrite_CoreExt<0, R_IN_COEF_L>, // 0x0784
+ RegWrite_CoreExt<0, R_IN_COEF_R>, // 0x0786
- // ------ -------
+ // ------ -------
- RegWrite_CoreExt<1, REG_P_MVOLL>, // 0x0788 // Master Volume Left
- RegWrite_CoreExt<1, REG_P_MVOLR>, // 0x078A // Master Volume Right
- RegWrite_CoreExt<1, REG_P_EVOLL>, // 0x0764 // Effect Volume Left
- RegWrite_CoreExt<1, REG_P_EVOLR>, // 0x0766 // Effect Volume Right
- RegWrite_CoreExt<1, REG_P_AVOLL>, // 0x0768 // Core External Input Volume Left (Only Core 1)
- RegWrite_CoreExt<1, REG_P_AVOLR>, // 0x076A // Core External Input Volume Right (Only Core 1)
- RegWrite_CoreExt<1, REG_P_BVOLL>, // 0x076C // Sound Data Volume Left
- RegWrite_CoreExt<1, REG_P_BVOLR>, // 0x076E // Sound Data Volume Right
- RegWrite_CoreExt<1, REG_P_MVOLXL>, // 0x0770 // Current Master Volume Left
- RegWrite_CoreExt<1, REG_P_MVOLXR>, // 0x0772 // Current Master Volume Right
+ RegWrite_CoreExt<1, REG_P_MVOLL>, // 0x0788 // Master Volume Left
+ RegWrite_CoreExt<1, REG_P_MVOLR>, // 0x078A // Master Volume Right
+ RegWrite_CoreExt<1, REG_P_EVOLL>, // 0x0764 // Effect Volume Left
+ RegWrite_CoreExt<1, REG_P_EVOLR>, // 0x0766 // Effect Volume Right
+ RegWrite_CoreExt<1, REG_P_AVOLL>, // 0x0768 // Core External Input Volume Left (Only Core 1)
+ RegWrite_CoreExt<1, REG_P_AVOLR>, // 0x076A // Core External Input Volume Right (Only Core 1)
+ RegWrite_CoreExt<1, REG_P_BVOLL>, // 0x076C // Sound Data Volume Left
+ RegWrite_CoreExt<1, REG_P_BVOLR>, // 0x076E // Sound Data Volume Right
+ RegWrite_CoreExt<1, REG_P_MVOLXL>, // 0x0770 // Current Master Volume Left
+ RegWrite_CoreExt<1, REG_P_MVOLXR>, // 0x0772 // Current Master Volume Right
- RegWrite_CoreExt<1, R_IIR_VOL>, // 0x0774 //IIR alpha (% used)
- RegWrite_CoreExt<1, R_COMB1_VOL>, // 0x0776
- RegWrite_CoreExt<1, R_COMB2_VOL>, // 0x0778
- RegWrite_CoreExt<1, R_COMB3_VOL>, // 0x077A
- RegWrite_CoreExt<1, R_COMB4_VOL>, // 0x077C
- RegWrite_CoreExt<1, R_WALL_VOL>, // 0x077E
- RegWrite_CoreExt<1, R_APF1_VOL>, // 0x0780 //feedback alpha (% used)
- RegWrite_CoreExt<1, R_APF2_VOL>, // 0x0782 //feedback
- RegWrite_CoreExt<1, R_IN_COEF_L>, // 0x0784
- RegWrite_CoreExt<1, R_IN_COEF_R>, // 0x0786
+ RegWrite_CoreExt<1, R_IIR_VOL>, // 0x0774 //IIR alpha (% used)
+ RegWrite_CoreExt<1, R_COMB1_VOL>, // 0x0776
+ RegWrite_CoreExt<1, R_COMB2_VOL>, // 0x0778
+ RegWrite_CoreExt<1, R_COMB3_VOL>, // 0x077A
+ RegWrite_CoreExt<1, R_COMB4_VOL>, // 0x077C
+ RegWrite_CoreExt<1, R_WALL_VOL>, // 0x077E
+ RegWrite_CoreExt<1, R_APF1_VOL>, // 0x0780 //feedback alpha (% used)
+ RegWrite_CoreExt<1, R_APF2_VOL>, // 0x0782 //feedback
+ RegWrite_CoreExt<1, R_IN_COEF_L>, // 0x0784
+ RegWrite_CoreExt<1, R_IN_COEF_R>, // 0x0786
- REGRAW(0x7B0), REGRAW(0x7B2), REGRAW(0x7B4), REGRAW(0x7B6),
- REGRAW(0x7B8), REGRAW(0x7BA), REGRAW(0x7BC), REGRAW(0x7BE),
+ REGRAW(0x7B0), REGRAW(0x7B2), REGRAW(0x7B4), REGRAW(0x7B6),
+ REGRAW(0x7B8), REGRAW(0x7BA), REGRAW(0x7BC), REGRAW(0x7BE),
- // SPDIF interface
+ // SPDIF interface
- RegWrite_SPDIF, // 0x07C0 // SPDIF Out: OFF/'PCM'/Bitstream/Bypass
- RegWrite_SPDIF, // 0x07C2
- REGRAW(0x7C4),
- RegWrite_SPDIF, // 0x07C6
- RegWrite_SPDIF, // 0x07C8 // SPDIF Media: 'CD'/DVD
- REGRAW(0x7CA),
- RegWrite_SPDIF, // 0x07CC // SPDIF Copy Protection
+ RegWrite_SPDIF, // 0x07C0 // SPDIF Out: OFF/'PCM'/Bitstream/Bypass
+ RegWrite_SPDIF, // 0x07C2
+ REGRAW(0x7C4),
+ RegWrite_SPDIF, // 0x07C6
+ RegWrite_SPDIF, // 0x07C8 // SPDIF Media: 'CD'/DVD
+ REGRAW(0x7CA),
+ RegWrite_SPDIF, // 0x07CC // SPDIF Copy Protection
- REGRAW(0x7CE),
- REGRAW(0x7D0), REGRAW(0x7D2), REGRAW(0x7D4), REGRAW(0x7D6),
- REGRAW(0x7D8), REGRAW(0x7DA), REGRAW(0x7DC), REGRAW(0x7DE),
- REGRAW(0x7E0), REGRAW(0x7E2), REGRAW(0x7E4), REGRAW(0x7E6),
- REGRAW(0x7E8), REGRAW(0x7EA), REGRAW(0x7EC), REGRAW(0x7EE),
- REGRAW(0x7F0), REGRAW(0x7F2), REGRAW(0x7F4), REGRAW(0x7F6),
- REGRAW(0x7F8), REGRAW(0x7FA), REGRAW(0x7FC), REGRAW(0x7FE),
+ REGRAW(0x7CE),
+ REGRAW(0x7D0), REGRAW(0x7D2), REGRAW(0x7D4), REGRAW(0x7D6),
+ REGRAW(0x7D8), REGRAW(0x7DA), REGRAW(0x7DC), REGRAW(0x7DE),
+ REGRAW(0x7E0), REGRAW(0x7E2), REGRAW(0x7E4), REGRAW(0x7E6),
+ REGRAW(0x7E8), REGRAW(0x7EA), REGRAW(0x7EC), REGRAW(0x7EE),
+ REGRAW(0x7F0), REGRAW(0x7F2), REGRAW(0x7F4), REGRAW(0x7F6),
+ REGRAW(0x7F8), REGRAW(0x7FA), REGRAW(0x7FC), REGRAW(0x7FE),
- NULL // should be at 0x400! (we assert check it on startup)
+ NULL // should be at 0x400! (we assert check it on startup)
};
void SPU2_FastWrite(u32 rmem, u16 value)
{
- tbl_reg_writes[(rmem & 0x7ff) / 2](value);
+ tbl_reg_writes[(rmem & 0x7ff) / 2](value);
}
void StartVoices(int core, u32 value)
{
- // Optimization: Games like to write zero to the KeyOn reg a lot, so shortcut
- // this loop if value is zero.
+ // Optimization: Games like to write zero to the KeyOn reg a lot, so shortcut
+ // this loop if value is zero.
- if (value == 0)
- return;
+ if (value == 0)
+ return;
- Cores[core].Regs.ENDX &= ~value;
+ Cores[core].Regs.ENDX &= ~value;
- Cores[core].KeyOn |= value;
+ Cores[core].KeyOn |= value;
- for (u8 vc = 0; vc < V_Core::NumVoices; vc++) {
- if (!((value >> vc) & 1))
- continue;
+ for (u8 vc = 0; vc < V_Core::NumVoices; vc++)
+ {
+ if (!((value >> vc) & 1))
+ continue;
- Cores[core].Voices[vc].QueueStart();
+ Cores[core].Voices[vc].QueueStart();
- if (IsDevBuild) {
- V_Voice &thisvc(Cores[core].Voices[vc]);
+ if (IsDevBuild)
+ {
+ V_Voice& thisvc(Cores[core].Voices[vc]);
- if (MsgKeyOnOff())
- ConLog("* SPU2-X: KeyOn: C%dV%02d: SSA: %8x; M: %s%s%s%s; H: %04x; P: %04x V: %04x/%04x; ADSR: %04x%04x\n",
- core, vc, thisvc.StartA,
- (Cores[core].VoiceGates[vc].DryL) ? "+" : "-", (Cores[core].VoiceGates[vc].DryR) ? "+" : "-",
- (Cores[core].VoiceGates[vc].WetL) ? "+" : "-", (Cores[core].VoiceGates[vc].WetR) ? "+" : "-",
- *(u16 *)GetMemPtr(thisvc.StartA),
- thisvc.Pitch,
- thisvc.Volume.Left.Value >> 16, thisvc.Volume.Right.Value >> 16,
- thisvc.ADSR.regADSR1, thisvc.ADSR.regADSR2);
- }
- }
+ if (MsgKeyOnOff())
+ ConLog("* SPU2-X: KeyOn: C%dV%02d: SSA: %8x; M: %s%s%s%s; H: %04x; P: %04x V: %04x/%04x; ADSR: %04x%04x\n",
+ core, vc, thisvc.StartA,
+ (Cores[core].VoiceGates[vc].DryL) ? "+" : "-", (Cores[core].VoiceGates[vc].DryR) ? "+" : "-",
+ (Cores[core].VoiceGates[vc].WetL) ? "+" : "-", (Cores[core].VoiceGates[vc].WetR) ? "+" : "-",
+ *(u16*)GetMemPtr(thisvc.StartA),
+ thisvc.Pitch,
+ thisvc.Volume.Left.Value >> 16, thisvc.Volume.Right.Value >> 16,
+ thisvc.ADSR.regADSR1, thisvc.ADSR.regADSR2);
+ }
+ }
}
void StopVoices(int core, u32 value)
{
- if (value == 0)
- return;
- for (u8 vc = 0; vc < V_Core::NumVoices; vc++) {
- if (!((value >> vc) & 1))
- continue;
+ if (value == 0)
+ return;
+ for (u8 vc = 0; vc < V_Core::NumVoices; vc++)
+ {
+ if (!((value >> vc) & 1))
+ continue;
- Cores[core].Voices[vc].ADSR.Releasing = true;
- if (MsgKeyOnOff())
- ConLog("* SPU2-X: KeyOff: Core %d; Voice %d.\n", core, vc);
- }
+ Cores[core].Voices[vc].ADSR.Releasing = true;
+ if (MsgKeyOnOff())
+ ConLog("* SPU2-X: KeyOff: Core %d; Voice %d.\n", core, vc);
+ }
}
diff --git a/pcsx2/SPU2/wx/wxConfig.cpp b/pcsx2/SPU2/wx/wxConfig.cpp
index a44b9d8c1c..0086465d2a 100644
--- a/pcsx2/SPU2/wx/wxConfig.cpp
+++ b/pcsx2/SPU2/wx/wxConfig.cpp
@@ -116,11 +116,11 @@ SyncTab::SyncTab(wxWindow* parent)
auto* adv_box = new wxStaticBoxSizer(wxVERTICAL, this, "Advanced");
- auto* babble_label = new wxStaticText(this, wxID_ANY, \
- "For fine-tuning time stretching.\n"\
- "Larger is better for slowdown, && smaller for speedup (60+ fps).\n"\
- "All options in microseconds.",\
- wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE_HORIZONTAL);
+ auto* babble_label = new wxStaticText(this, wxID_ANY,
+ "For fine-tuning time stretching.\n"
+ "Larger is better for slowdown, && smaller for speedup (60+ fps).\n"
+ "All options in microseconds.",
+ wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE_HORIZONTAL);
babble_label->Wrap(300);
adv_box->Add(babble_label, wxSizerFlags().Centre());