diff options
| author | Pierre Bourdon <delroth@gmail.com> | 2017-04-08 17:22:47 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-04-08 17:22:47 +0200 |
| commit | e863604b7ea53c98f3c4ee7bfebea949482d9eae (patch) | |
| tree | b63f640fcf67714b904ec230c2632fb3e1e84588 /Source/Core | |
| parent | f41557b1c3e781d2da2ef2018e5f57d245b5eeb2 (diff) | |
| parent | cd2d0897d6edafcb85763957401ced8004a02aa7 (diff) | |
Merge pull request #5211 from MerryMage/ax
AX: Implement loop_counter and support UCodes without LPF
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp | 4 | ||||
| -rw-r--r-- | Source/Core/Core/HW/DSPHLE/UCodes/AXStructs.h | 5 | ||||
| -rw-r--r-- | Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h | 64 | ||||
| -rw-r--r-- | Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp | 4 |
4 files changed, 65 insertions, 12 deletions
diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp index 7d8e4522f2..7c9e745fd1 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp @@ -422,7 +422,7 @@ void AXUCode::ProcessPBList(u32 pb_addr) m_samples_auxA_right, m_samples_auxA_surround, m_samples_auxB_left, m_samples_auxB_right, m_samples_auxB_surround}}; - ReadPB(pb_addr, pb); + ReadPB(pb_addr, pb, m_crc); u32 updates_addr = HILO_TO_32(pb.updates.data); u16* updates = (u16*)HLEMemory_Get_Pointer(updates_addr); @@ -439,7 +439,7 @@ void AXUCode::ProcessPBList(u32 pb_addr) buffers.ptrs[i] += spms; } - WritePB(pb_addr, pb); + WritePB(pb_addr, pb, m_crc); pb_addr = HILO_TO_32(pb.next_pb); } } diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AXStructs.h b/Source/Core/Core/HW/DSPHLE/UCodes/AXStructs.h index 6ba6b794c7..098e05073f 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/AXStructs.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/AXStructs.h @@ -252,9 +252,10 @@ struct AXPB PBADPCMInfo adpcm; PBSampleRateConverter src; PBADPCMLoopInfo adpcm_loop_info; - PBLowPassFilter lpf; + PBLowPassFilter lpf; // Skipped when writing to/reading from MRAM/ARAM for certain AX UCodes + u16 loop_counter; - u16 padding[25]; + u16 padding[24]; }; struct PBBiquadFilter diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h b/Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h index f4f6c4898e..b7fca29356 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h @@ -80,18 +80,63 @@ union AXBuffers #endif }; +// Determines if this version of the UCode has a PBLowPassFilter in its AXPB layout. +bool HasLpf(u32 crc) +{ + switch (crc) + { + case 0x4E8A8B21: + return false; + default: + return true; + } +} + // Read a PB from MRAM/ARAM -void ReadPB(u32 addr, PB_TYPE& pb) +void ReadPB(u32 addr, PB_TYPE& pb, u32 crc) { - u16* dst = (u16*)&pb; - Memory::CopyFromEmuSwapped<u16>(dst, addr, sizeof(pb)); + if (HasLpf(crc)) + { + u16* dst = (u16*)&pb; + Memory::CopyFromEmuSwapped<u16>(dst, addr, sizeof(pb)); + } + else + { + // The below is a terrible hack in order to support two different AXPB layouts. + // We skip lpf in this layout. + + char* dst = (char*)&pb; + + constexpr size_t lpf_off = offsetof(AXPB, lpf); + constexpr size_t lc_off = offsetof(AXPB, loop_counter); + + Memory::CopyFromEmuSwapped<u16>((u16*)dst, addr, lpf_off); + memset(dst + lpf_off, 0, lc_off - lpf_off); + Memory::CopyFromEmuSwapped<u16>((u16*)(dst + lc_off), addr + lpf_off, sizeof(pb) - lc_off); + } } // Write a PB back to MRAM/ARAM -void WritePB(u32 addr, const PB_TYPE& pb) +void WritePB(u32 addr, const PB_TYPE& pb, u32 crc) { - const u16* src = (const u16*)&pb; - Memory::CopyToEmuSwapped<u16>(addr, src, sizeof(pb)); + if (HasLpf(crc)) + { + const u16* src = (const u16*)&pb; + Memory::CopyToEmuSwapped<u16>(addr, src, sizeof(pb)); + } + else + { + // The below is a terrible hack in order to support two different AXPB layouts. + // We skip lpf in this layout. + + const char* src = (const char*)&pb; + + constexpr size_t lpf_off = offsetof(AXPB, lpf); + constexpr size_t lc_off = offsetof(AXPB, loop_counter); + + Memory::CopyToEmuSwapped<u16>(addr, (const u16*)src, lpf_off); + Memory::CopyToEmuSwapped<u16>(addr + lpf_off, (const u16*)(src + lc_off), sizeof(pb) - lc_off); + } } #if 0 @@ -234,6 +279,13 @@ u16 AcceleratorGetSample() acc_pb->adpcm.yn1 = acc_pb->adpcm_loop_info.yn1; acc_pb->adpcm.yn2 = acc_pb->adpcm_loop_info.yn2; } +#ifdef AX_GC + else + { + // If we're streaming, increment the loop counter. + acc_pb->loop_counter++; + } +#endif } else { diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp index 22e2268168..4c77f35224 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp @@ -451,7 +451,7 @@ void AXWiiUCode::ProcessPBList(u32 pb_addr) m_samples_aux1, m_samples_wm2, m_samples_aux2, m_samples_wm3, m_samples_aux3}}; - ReadPB(pb_addr, pb); + ReadPB(pb_addr, pb, m_crc); u16 num_updates[3]; u16 updates[1024]; @@ -476,7 +476,7 @@ void AXWiiUCode::ProcessPBList(u32 pb_addr) m_coeffs_available ? m_coeffs : nullptr); } - WritePB(pb_addr, pb); + WritePB(pb_addr, pb, m_crc); pb_addr = HILO_TO_32(pb.next_pb); } } |
