diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp index eb2a71969b..176050affa 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp @@ -108,7 +108,16 @@ void CUCode_AX::HandleCommandList() SetupProcessing(HILO_TO_32(addr)); break; - case CMD_UNK_01: curr_idx += 5; break; + case CMD_DL_AND_VOL_MIX: + { + addr_hi = m_cmdlist[curr_idx++]; + addr_lo = m_cmdlist[curr_idx++]; + u16 vol_main = m_cmdlist[curr_idx++]; + u16 vol_auxa = m_cmdlist[curr_idx++]; + u16 vol_auxb = m_cmdlist[curr_idx++]; + DownloadAndMixWithVolume(HILO_TO_32(addr), vol_main, vol_auxa, vol_auxb); + break; + } case CMD_PB_ADDR: addr_hi = m_cmdlist[curr_idx++]; @@ -333,6 +342,30 @@ void CUCode_AX::SetupProcessing(u32 init_addr) } } +void CUCode_AX::DownloadAndMixWithVolume(u32 addr, u16 vol_main, u16 vol_auxa, u16 vol_auxb) +{ + int* buffers_main[3] = { m_samples_left, m_samples_right, m_samples_surround }; + int* buffers_auxa[3] = { m_samples_auxA_left, m_samples_auxA_right, m_samples_auxA_surround }; + int* buffers_auxb[3] = { m_samples_auxB_left, m_samples_auxB_right, m_samples_auxB_surround }; + int** buffers[3] = { buffers_main, buffers_auxa, buffers_auxb }; + u16 volumes[3] = { vol_main, vol_auxa, vol_auxb }; + + for (u32 i = 0; i < 3; ++i) + { + int* ptr = (int*)HLEMemory_Get_Pointer(addr); + s16 volume = (s16)volumes[i]; + for (u32 j = 0; j < 3; ++j) + { + int* buffer = buffers[i][j]; + for (u32 k = 0; k < 5 * 32; ++k) + { + s64 sample = 2 * (s32)Common::swap32(*ptr++) * volume; + buffer[k] += (s32)(sample >> 16); + } + } + } +} + void CUCode_AX::ProcessPBList(u32 pb_addr) { // Samples per millisecond. In theory DSP sampling rate can be changed from diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.h index 7155a245bb..7158c197e8 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.h @@ -131,6 +131,7 @@ protected: virtual void HandleCommandList(); void SetupProcessing(u32 init_addr); + void DownloadAndMixWithVolume(u32 addr, u16 vol_main, u16 vol_auxa, u16 vol_auxb); void ProcessPBList(u32 pb_addr); void MixAUXSamples(int aux_id, u32 write_addr, u32 read_addr); void UploadLRS(u32 dst_addr); @@ -147,7 +148,7 @@ private: enum CmdType { CMD_SETUP = 0x00, - CMD_UNK_01 = 0x01, + CMD_DL_AND_VOL_MIX = 0x01, CMD_PB_ADDR = 0x02, CMD_PROCESS = 0x03, CMD_MIX_AUXA = 0x04,