diff options
| -rw-r--r-- | src/audio_core/renderer/command/command_generator.cpp | 2 | ||||
| -rw-r--r-- | src/audio_core/renderer/command/effect/aux_.cpp | 78 | 
2 files changed, 40 insertions, 40 deletions
| diff --git a/src/audio_core/renderer/command/command_generator.cpp b/src/audio_core/renderer/command/command_generator.cpp index 2ea50d128..fba84c7bd 100644 --- a/src/audio_core/renderer/command/command_generator.cpp +++ b/src/audio_core/renderer/command/command_generator.cpp @@ -46,7 +46,7 @@ void CommandGenerator::GenerateDataSourceCommand(VoiceInfo& voice_info,              while (destination != nullptr) {                  if (destination->IsConfigured()) {                      auto mix_id{destination->GetMixId()}; -                    if (mix_id < mix_context.GetCount()) { +                    if (mix_id < mix_context.GetCount() && mix_id != UnusedSplitterId) {                          auto mix_info{mix_context.GetInfo(mix_id)};                          command_buffer.GenerateDepopPrepareCommand(                              voice_info.node_id, voice_state, render_context.depop_buffer, diff --git a/src/audio_core/renderer/command/effect/aux_.cpp b/src/audio_core/renderer/command/effect/aux_.cpp index e76db893f..0c69dcc28 100644 --- a/src/audio_core/renderer/command/effect/aux_.cpp +++ b/src/audio_core/renderer/command/effect/aux_.cpp @@ -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); | 
