|
|
|
@ -4,6 +4,7 @@ |
|
|
|
#include "audio_core/renderer/adsp/command_list_processor.h"
|
|
|
|
#include "audio_core/renderer/command/effect/aux_.h"
|
|
|
|
#include "audio_core/renderer/effect/aux_.h"
|
|
|
|
#include "core/core.h"
|
|
|
|
#include "core/memory.h"
|
|
|
|
|
|
|
|
namespace AudioCore::AudioRenderer { |
|
|
|
@ -40,11 +41,10 @@ static void ResetAuxBufferDsp(Core::Memory::Memory& memory, const CpuAddr aux_in |
|
|
|
* @param update_count - If non-zero, send_info_ will be updated. |
|
|
|
* @return Number of samples written. |
|
|
|
*/ |
|
|
|
static u32 WriteAuxBufferDsp(Core::Memory::Memory& memory, const CpuAddr send_info_, |
|
|
|
[[maybe_unused]] u32 sample_count, const CpuAddr send_buffer, |
|
|
|
const u32 count_max, std::span<const s32> input, |
|
|
|
const u32 write_count_, const u32 write_offset, |
|
|
|
const u32 update_count) { |
|
|
|
static u32 WriteAuxBufferDsp(Core::Memory::Memory& memory, CpuAddr send_info_, |
|
|
|
[[maybe_unused]] u32 sample_count, CpuAddr send_buffer, u32 count_max, |
|
|
|
std::span<const s32> input, u32 write_count_, u32 write_offset, |
|
|
|
u32 update_count) { |
|
|
|
if (write_count_ > count_max) { |
|
|
|
LOG_ERROR(Service_Audio, |
|
|
|
"write_count must be smaller than count_max! write_count {}, count_max {}", |
|
|
|
@ -52,6 +52,11 @@ static u32 WriteAuxBufferDsp(Core::Memory::Memory& memory, const CpuAddr send_in |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
if (send_info_ == 0) { |
|
|
|
LOG_ERROR(Service_Audio, "send_info_ is 0!"); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
if (input.empty()) { |
|
|
|
LOG_ERROR(Service_Audio, "input buffer is empty!"); |
|
|
|
return 0; |
|
|
|
@ -66,35 +71,30 @@ static u32 WriteAuxBufferDsp(Core::Memory::Memory& memory, const CpuAddr send_in |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
AuxInfo::AuxInfoDsp send_info{}; |
|
|
|
memory.ReadBlockUnsafe(send_info_, &send_info, sizeof(AuxInfo::AuxInfoDsp)); |
|
|
|
auto send_info{reinterpret_cast<AuxInfo::AuxInfoDsp*>(memory.GetPointer(send_info_))}; |
|
|
|
|
|
|
|
u32 target_write_offset{send_info.write_offset + write_offset}; |
|
|
|
if (target_write_offset > count_max || write_count_ == 0) { |
|
|
|
u32 target_write_offset{send_info->write_offset + write_offset}; |
|
|
|
if (target_write_offset > count_max) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
u32 write_count{write_count_}; |
|
|
|
u32 write_pos{0}; |
|
|
|
u32 read_pos{0}; |
|
|
|
while (write_count > 0) { |
|
|
|
u32 to_write{std::min(count_max - target_write_offset, write_count)}; |
|
|
|
|
|
|
|
if (to_write > 0) { |
|
|
|
if (to_write) { |
|
|
|
memory.WriteBlockUnsafe(send_buffer + target_write_offset * sizeof(s32), |
|
|
|
&input[write_pos], to_write * sizeof(s32)); |
|
|
|
&input[read_pos], to_write * sizeof(s32)); |
|
|
|
} |
|
|
|
|
|
|
|
target_write_offset = (target_write_offset + to_write) % count_max; |
|
|
|
write_count -= to_write; |
|
|
|
write_pos += to_write; |
|
|
|
read_pos += to_write; |
|
|
|
} |
|
|
|
|
|
|
|
if (update_count) { |
|
|
|
send_info.write_offset = (send_info.write_offset + update_count) % count_max; |
|
|
|
send_info->write_offset = (send_info->write_offset + update_count) % count_max; |
|
|
|
} |
|
|
|
|
|
|
|
memory.WriteBlockUnsafe(send_info_, &send_info, sizeof(AuxInfo::AuxInfoDsp)); |
|
|
|
|
|
|
|
return write_count_; |
|
|
|
} |
|
|
|
|
|
|
|
@ -102,7 +102,7 @@ static u32 WriteAuxBufferDsp(Core::Memory::Memory& memory, const CpuAddr send_in |
|
|
|
* Read the given memory at return_buffer into the output mix buffer, and update return_info_ if |
|
|
|
* update_count is set, to notify the game that an update happened. |
|
|
|
* |
|
|
|
* @param memory - Core memory for writing. |
|
|
|
* @param memory - Core memory for reading. |
|
|
|
* @param return_info_ - Meta information for where to read the mix buffer. |
|
|
|
* @param return_buffer - Memory address to read the samples from. |
|
|
|
* @param count_max - Maximum number of samples in the receiving buffer. |
|
|
|
@ -112,16 +112,21 @@ static u32 WriteAuxBufferDsp(Core::Memory::Memory& memory, const CpuAddr send_in |
|
|
|
* @param update_count - If non-zero, send_info_ will be updated. |
|
|
|
* @return Number of samples read. |
|
|
|
*/ |
|
|
|
static u32 ReadAuxBufferDsp(Core::Memory::Memory& memory, const CpuAddr return_info_, |
|
|
|
const CpuAddr return_buffer, const u32 count_max, std::span<s32> output, |
|
|
|
const u32 count_, const u32 read_offset, const u32 update_count) { |
|
|
|
static u32 ReadAuxBufferDsp(Core::Memory::Memory& memory, CpuAddr return_info_, |
|
|
|
CpuAddr return_buffer, u32 count_max, std::span<s32> output, |
|
|
|
u32 read_count_, u32 read_offset, u32 update_count) { |
|
|
|
if (count_max == 0) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
if (count_ > count_max) { |
|
|
|
if (read_count_ > count_max) { |
|
|
|
LOG_ERROR(Service_Audio, "count must be smaller than count_max! count {}, count_max {}", |
|
|
|
count_, count_max); |
|
|
|
read_count_, count_max); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
if (return_info_ == 0) { |
|
|
|
LOG_ERROR(Service_Audio, "return_info_ is 0!"); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
@ -135,36 +140,31 @@ static u32 ReadAuxBufferDsp(Core::Memory::Memory& memory, const CpuAddr return_i |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
AuxInfo::AuxInfoDsp return_info{}; |
|
|
|
memory.ReadBlockUnsafe(return_info_, &return_info, sizeof(AuxInfo::AuxInfoDsp)); |
|
|
|
auto return_info{reinterpret_cast<AuxInfo::AuxInfoDsp*>(memory.GetPointer(return_info_))}; |
|
|
|
|
|
|
|
u32 target_read_offset{return_info.read_offset + read_offset}; |
|
|
|
u32 target_read_offset{return_info->read_offset + read_offset}; |
|
|
|
if (target_read_offset > count_max) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
u32 read_count{count_}; |
|
|
|
u32 read_pos{0}; |
|
|
|
u32 read_count{read_count_}; |
|
|
|
u32 write_pos{0}; |
|
|
|
while (read_count > 0) { |
|
|
|
u32 to_read{std::min(count_max - target_read_offset, read_count)}; |
|
|
|
|
|
|
|
if (to_read > 0) { |
|
|
|
if (to_read) { |
|
|
|
memory.ReadBlockUnsafe(return_buffer + target_read_offset * sizeof(s32), |
|
|
|
&output[read_pos], to_read * sizeof(s32)); |
|
|
|
&output[write_pos], to_read * sizeof(s32)); |
|
|
|
} |
|
|
|
|
|
|
|
target_read_offset = (target_read_offset + to_read) % count_max; |
|
|
|
read_count -= to_read; |
|
|
|
read_pos += to_read; |
|
|
|
write_pos += to_read; |
|
|
|
} |
|
|
|
|
|
|
|
if (update_count) { |
|
|
|
return_info.read_offset = (return_info.read_offset + update_count) % count_max; |
|
|
|
return_info->read_offset = (return_info->read_offset + update_count) % count_max; |
|
|
|
} |
|
|
|
|
|
|
|
memory.WriteBlockUnsafe(return_info_, &return_info, sizeof(AuxInfo::AuxInfoDsp)); |
|
|
|
|
|
|
|
return count_; |
|
|
|
return read_count_; |
|
|
|
} |
|
|
|
|
|
|
|
void AuxCommand::Dump([[maybe_unused]] const ADSP::CommandListProcessor& processor, |
|
|
|
@ -189,7 +189,7 @@ void AuxCommand::Process(const ADSP::CommandListProcessor& processor) { |
|
|
|
update_count)}; |
|
|
|
|
|
|
|
if (read != processor.sample_count) { |
|
|
|
std::memset(&output_buffer[read], 0, processor.sample_count - read); |
|
|
|
std::memset(&output_buffer[read], 0, (processor.sample_count - read) * sizeof(s32)); |
|
|
|
} |
|
|
|
} else { |
|
|
|
ResetAuxBufferDsp(*processor.memory, send_buffer_info); |
|
|
|
|