diff --git a/src/xenia/apu/xma_context.h b/src/xenia/apu/xma_context.h index d52f68897..d7dfa39c8 100644 --- a/src/xenia/apu/xma_context.h +++ b/src/xenia/apu/xma_context.h @@ -146,6 +146,12 @@ struct XMA_CONTEXT_DATA { const uint32_t GetCurrentInputBufferPacketCount() const { return GetInputBufferPacketCount(current_buffer); } + const bool IsStreamingContext() const { + return (input_buffer_0_packet_count | input_buffer_1_packet_count) == 1; + } + const bool IsConsumeOnlyContext() const { + return (input_buffer_0_packet_count | input_buffer_1_packet_count) == 0; + } }; static_assert_size(XMA_CONTEXT_DATA, 64); diff --git a/src/xenia/apu/xma_context_new.cc b/src/xenia/apu/xma_context_new.cc index 4d7034c6c..6dad9704c 100644 --- a/src/xenia/apu/xma_context_new.cc +++ b/src/xenia/apu/xma_context_new.cc @@ -128,6 +128,15 @@ bool XmaContextNew::Work() { RingBuffer output_rb = PrepareOutputRingBuffer(&data); + if (data.IsConsumeOnlyContext()) { + Consume(&output_rb, &data); + if (data.output_buffer_read_offset == data.output_buffer_write_offset) { + Clear(); + } + data.Store(context_ptr); + return true; + } + const int32_t minimum_subframe_decode_count = (data.subframe_decode_count * 2) - 1; @@ -257,7 +266,8 @@ void XmaContextNew::SwapInputBuffer(XMA_CONTEXT_DATA* data) { data->input_buffer_read_offset = kBitsPerPacketHeader; } -void XmaContextNew::Consume(RingBuffer* output_rb, XMA_CONTEXT_DATA* data) { +void XmaContextNew::Consume(RingBuffer* XE_RESTRICT output_rb, + const XMA_CONTEXT_DATA* const XE_RESTRICT data) { if (!current_frame_remaining_subframes_) { return; } diff --git a/src/xenia/apu/xma_context_new.h b/src/xenia/apu/xma_context_new.h index 1d86c7af4..985b2ca9a 100644 --- a/src/xenia/apu/xma_context_new.h +++ b/src/xenia/apu/xma_context_new.h @@ -106,7 +106,8 @@ class XmaContextNew : public XmaContext { static uint32_t GetCurrentInputBufferSize(XMA_CONTEXT_DATA* data); void Decode(XMA_CONTEXT_DATA* data); - void Consume(RingBuffer* output_rb, XMA_CONTEXT_DATA* data); + void Consume(RingBuffer* XE_RESTRICT output_rb, + const XMA_CONTEXT_DATA* const XE_RESTRICT data); void UpdateLoopStatus(XMA_CONTEXT_DATA* data); int PrepareDecoder(int sample_rate, bool is_two_channel); diff --git a/src/xenia/emulator.cc b/src/xenia/emulator.cc index e0ff6e999..b2075ef5f 100644 --- a/src/xenia/emulator.cc +++ b/src/xenia/emulator.cc @@ -886,6 +886,10 @@ X_STATUS Emulator::InstallContentPackage( vfs::XContentContainerDevice::CreateContentDevice("", path); if (!device || !device->Initialize()) { + installation_info.installation_state_ = InstallState::failed; + installation_info.installation_error_message_ = + "Device initialization failed!"; + installation_info.installation_result_ = X_STATUS_ACCESS_DENIED; XELOGE("Failed to initialize device"); return X_STATUS_INVALID_PARAMETER; } diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_strings.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_strings.cc index 1554e30ff..4e5c9c8f3 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_strings.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_strings.cc @@ -1025,8 +1025,9 @@ SHIM_CALL _vsnprintf_entry(PPCContext* ppc_context) { buffer[count] = '\0'; } } else { - // Overflowed buffer. We still return the count we would have written. + // Overflowed buffer. std::memcpy(buffer, data.str().c_str(), buffer_count); + count = -1; } SHIM_SET_RETURN_32(count); }