diff --git a/src/core/libraries/ajm/ajm.cpp b/src/core/libraries/ajm/ajm.cpp index 39e25445e..1c3cc9d96 100644 --- a/src/core/libraries/ajm/ajm.cpp +++ b/src/core/libraries/ajm/ajm.cpp @@ -288,20 +288,24 @@ int PS4_SYSV_ABI sceAjmBatchStartBuffer(u32 context, const u8* batch, u32 batch_ const auto at9_instance = dynamic_cast(dev->instances[instance].get()); const auto in_buffer = reinterpret_cast(job_ptr); - std::memcpy( - at9_instance->config_data, - reinterpret_cast(in_buffer->buffer) - ->config_data, - SCE_AT9_CONFIG_DATA_SIZE); - LOG_INFO( - Lib_Ajm, "Initialize params: {}, config_data: {}, reserved: {}", - fmt::ptr(reinterpret_cast( - in_buffer->buffer)), - fmt::ptr(reinterpret_cast( - in_buffer->buffer) - ->config_data), - reinterpret_cast(in_buffer->buffer) - ->reserved); + const auto params = reinterpret_cast( + in_buffer->buffer); + std::memcpy(at9_instance->config_data, params->config_data, + SCE_AT9_CONFIG_DATA_SIZE); + } + break; + case AjmJobControlFlags::Initialize | AjmJobControlFlags::Reset: + LOG_INFO(Lib_Ajm, "Resetting instance {}", instance); + dev->instances[instance]->Reset(); + LOG_INFO(Lib_Ajm, "Initializing instance {}", instance); + if (dev->instances[instance]->codec_type == AjmCodecType::At9Dec) { + const auto at9_instance = + dynamic_cast(dev->instances[instance].get()); + const auto in_buffer = reinterpret_cast(job_ptr); + const auto params = reinterpret_cast( + in_buffer->buffer); + std::memcpy(at9_instance->config_data, params->config_data, + SCE_AT9_CONFIG_DATA_SIZE); } break; case AjmJobControlFlags::Resample: @@ -393,11 +397,7 @@ int PS4_SYSV_ABI sceAjmBatchWait(const u32 context, const u32 batch_id, const u3 LOG_INFO(Lib_Ajm, "called context = {}, batch_id = {}, timeout = {}", context, batch_id, timeout); - if (batch_id > 0xFF) { - return ORBIS_AJM_ERROR_INVALID_BATCH; - } - - if (batch_id >= dev->batches.size()) { + if (batch_id > 0xFF || batch_id >= dev->batches.size()) { return ORBIS_AJM_ERROR_INVALID_BATCH; } @@ -486,6 +486,7 @@ int PS4_SYSV_ABI sceAjmInstanceCreate(u32 context, AjmCodecType codec_type, AjmI if (dev->curr_cursor == dev->release_cursor) { return ORBIS_AJM_ERROR_OUT_OF_RESOURCES; } + ASSERT_MSG(flags.format == 0, "Only signed 16-bit PCM output is supported currently!"); const u32 index = dev->free_instances[dev->curr_cursor++]; dev->curr_cursor %= MaxInstances; std::unique_ptr instance; diff --git a/src/core/libraries/ajm/ajm_at9.cpp b/src/core/libraries/ajm/ajm_at9.cpp index ddcd8854c..3f40da3fb 100644 --- a/src/core/libraries/ajm/ajm_at9.cpp +++ b/src/core/libraries/ajm/ajm_at9.cpp @@ -61,6 +61,7 @@ std::tuple AjmAt9Decoder::Decode(const u8* in_buf, u32 in_size, u in_size -= bytes_used; std::memcpy(out_buf, pcm_buffer, size); file.write(reinterpret_cast(pcm_buffer), size); + file.flush(); // for easier debugging out_buf += size; out_size -= size; decoded_samples += decoder_handle->Config.FrameSamples;