diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_audio_xma.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_audio_xma.cc index d8e959c7d..b02bdbcd4 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_audio_xma.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_audio_xma.cc @@ -57,34 +57,27 @@ using xe::apu::XMA_CONTEXT_DATA; // restrictions of frame/subframe/etc: // https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.xaudio2.xaudio2_buffer(v=vs.85).aspx -SHIM_CALL XMACreateContext_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t context_out_ptr = SHIM_GET_ARG_32(0); - - XELOGD("XMACreateContext(%.8X)", context_out_ptr); - - auto xma_decoder = kernel_state->emulator()->audio_system()->xma_decoder(); +dword_result_t XMACreateContext(lpdword_t context_out_ptr) { + auto xma_decoder = kernel_state()->emulator()->audio_system()->xma_decoder(); uint32_t context_ptr = xma_decoder->AllocateContext(); - SHIM_SET_MEM_32(context_out_ptr, context_ptr); + *context_out_ptr = context_ptr; if (!context_ptr) { - SHIM_SET_RETURN_32(X_STATUS_NO_MEMORY); - return; + return X_STATUS_NO_MEMORY; } - - SHIM_SET_RETURN_32(X_STATUS_SUCCESS); + return X_STATUS_SUCCESS; } +DECLARE_XBOXKRNL_EXPORT(XMACreateContext, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); -SHIM_CALL XMAReleaseContext_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t context_ptr = SHIM_GET_ARG_32(0); - - XELOGD("XMAReleaseContext(%.8X)", context_ptr); - - auto xma_decoder = kernel_state->emulator()->audio_system()->xma_decoder(); +dword_result_t XMAReleaseContext(lpvoid_t context_ptr) { + auto xma_decoder = kernel_state()->emulator()->audio_system()->xma_decoder(); xma_decoder->ReleaseContext(context_ptr); - - SHIM_SET_RETURN_32(0); + return 0; } +DECLARE_XBOXKRNL_EXPORT(XMAReleaseContext, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); void StoreXmaContextIndexedRegister(KernelState* kernel_state, uint32_t base_reg, uint32_t context_ptr) { @@ -154,19 +147,13 @@ dword_result_t XMAInitializeContext(lpvoid_t context_ptr, return 0; } -DECLARE_XBOXKRNL_EXPORT(XMAInitializeContext, - ExportTag::kImplemented | ExportTag::kAudio); +DECLARE_XBOXKRNL_EXPORT(XMAInitializeContext, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); -SHIM_CALL XMASetLoopData_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t context_ptr = SHIM_GET_ARG_32(0); - uint32_t loop_data_ptr = SHIM_GET_ARG_32(1); - - XELOGD("XMASetLoopData(%.8X, %.8X)", context_ptr, loop_data_ptr); - - XMA_CONTEXT_DATA context(SHIM_MEM_ADDR(context_ptr)); - auto loop_data = - reinterpret_cast(SHIM_MEM_ADDR(loop_data_ptr)); +dword_result_t XMASetLoopData(lpvoid_t context_ptr, + pointer_t loop_data) { + XMA_CONTEXT_DATA context(context_ptr); context.loop_start = loop_data->loop_start; context.loop_end = loop_data->loop_end; @@ -174,17 +161,21 @@ SHIM_CALL XMASetLoopData_shim(PPCContext* ppc_context, context.loop_subframe_end = loop_data->loop_subframe_end; context.loop_subframe_skip = loop_data->loop_subframe_skip; - context.Store(SHIM_MEM_ADDR(context_ptr)); + context.Store(context_ptr); - SHIM_SET_RETURN_32(0); + return 0; } +DECLARE_XBOXKRNL_EXPORT(XMASetLoopData, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); dword_result_t XMAGetInputBufferReadOffset(lpvoid_t context_ptr) { XMA_CONTEXT_DATA context(context_ptr); return context.input_buffer_read_offset; } DECLARE_XBOXKRNL_EXPORT(XMAGetInputBufferReadOffset, - ExportTag::kImplemented | ExportTag::kAudio); + ExportTag::kImplemented | ExportTag::kAudio | + ExportTag::kHighFrequency); dword_result_t XMASetInputBufferReadOffset(lpvoid_t context_ptr, dword_t value) { @@ -195,7 +186,8 @@ dword_result_t XMASetInputBufferReadOffset(lpvoid_t context_ptr, return 0; } DECLARE_XBOXKRNL_EXPORT(XMASetInputBufferReadOffset, - ExportTag::kImplemented | ExportTag::kAudio); + ExportTag::kImplemented | ExportTag::kAudio | + ExportTag::kHighFrequency); dword_result_t XMASetInputBuffer0(lpvoid_t context_ptr, lpvoid_t buffer, dword_t packet_count) { @@ -208,15 +200,17 @@ dword_result_t XMASetInputBuffer0(lpvoid_t context_ptr, lpvoid_t buffer, return 0; } -DECLARE_XBOXKRNL_EXPORT(XMASetInputBuffer0, - ExportTag::kImplemented | ExportTag::kAudio); +DECLARE_XBOXKRNL_EXPORT(XMASetInputBuffer0, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); dword_result_t XMAIsInputBuffer0Valid(lpvoid_t context_ptr) { XMA_CONTEXT_DATA context(context_ptr); return context.input_buffer_0_valid; } -DECLARE_XBOXKRNL_EXPORT(XMAIsInputBuffer0Valid, - ExportTag::kImplemented | ExportTag::kAudio); +DECLARE_XBOXKRNL_EXPORT(XMAIsInputBuffer0Valid, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); dword_result_t XMASetInputBuffer0Valid(lpvoid_t context_ptr) { XMA_CONTEXT_DATA context(context_ptr); @@ -225,8 +219,9 @@ dword_result_t XMASetInputBuffer0Valid(lpvoid_t context_ptr) { return 0; } -DECLARE_XBOXKRNL_EXPORT(XMASetInputBuffer0Valid, - ExportTag::kImplemented | ExportTag::kAudio); +DECLARE_XBOXKRNL_EXPORT(XMASetInputBuffer0Valid, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); dword_result_t XMASetInputBuffer1(lpvoid_t context_ptr, lpvoid_t buffer, dword_t packet_count) { @@ -239,15 +234,17 @@ dword_result_t XMASetInputBuffer1(lpvoid_t context_ptr, lpvoid_t buffer, return 0; } -DECLARE_XBOXKRNL_EXPORT(XMASetInputBuffer1, - ExportTag::kImplemented | ExportTag::kAudio); +DECLARE_XBOXKRNL_EXPORT(XMASetInputBuffer1, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); dword_result_t XMAIsInputBuffer1Valid(lpvoid_t context_ptr) { XMA_CONTEXT_DATA context(context_ptr); return context.input_buffer_1_valid; } -DECLARE_XBOXKRNL_EXPORT(XMAIsInputBuffer1Valid, - ExportTag::kImplemented | ExportTag::kAudio); +DECLARE_XBOXKRNL_EXPORT(XMAIsInputBuffer1Valid, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); dword_result_t XMASetInputBuffer1Valid(lpvoid_t context_ptr) { XMA_CONTEXT_DATA context(context_ptr); @@ -256,15 +253,17 @@ dword_result_t XMASetInputBuffer1Valid(lpvoid_t context_ptr) { return 0; } -DECLARE_XBOXKRNL_EXPORT(XMASetInputBuffer1Valid, - ExportTag::kImplemented | ExportTag::kAudio); +DECLARE_XBOXKRNL_EXPORT(XMASetInputBuffer1Valid, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); dword_result_t XMAIsOutputBufferValid(lpvoid_t context_ptr) { XMA_CONTEXT_DATA context(context_ptr); return context.output_buffer_valid; } -DECLARE_XBOXKRNL_EXPORT(XMAIsOutputBufferValid, - ExportTag::kImplemented | ExportTag::kAudio); +DECLARE_XBOXKRNL_EXPORT(XMAIsOutputBufferValid, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); dword_result_t XMASetOutputBufferValid(lpvoid_t context_ptr) { XMA_CONTEXT_DATA context(context_ptr); @@ -273,15 +272,17 @@ dword_result_t XMASetOutputBufferValid(lpvoid_t context_ptr) { return 0; } -DECLARE_XBOXKRNL_EXPORT(XMASetOutputBufferValid, - ExportTag::kImplemented | ExportTag::kAudio); +DECLARE_XBOXKRNL_EXPORT(XMASetOutputBufferValid, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); dword_result_t XMAGetOutputBufferReadOffset(lpvoid_t context_ptr) { XMA_CONTEXT_DATA context(context_ptr); return context.output_buffer_read_offset; } DECLARE_XBOXKRNL_EXPORT(XMAGetOutputBufferReadOffset, - ExportTag::kImplemented | ExportTag::kAudio); + ExportTag::kImplemented | ExportTag::kAudio | + ExportTag::kHighFrequency); dword_result_t XMASetOutputBufferReadOffset(lpvoid_t context_ptr, dword_t value) { @@ -292,14 +293,16 @@ dword_result_t XMASetOutputBufferReadOffset(lpvoid_t context_ptr, return 0; } DECLARE_XBOXKRNL_EXPORT(XMASetOutputBufferReadOffset, - ExportTag::kImplemented | ExportTag::kAudio); + ExportTag::kImplemented | ExportTag::kAudio | + ExportTag::kHighFrequency); dword_result_t XMAGetOutputBufferWriteOffset(lpvoid_t context_ptr) { XMA_CONTEXT_DATA context(context_ptr); return context.output_buffer_write_offset; } DECLARE_XBOXKRNL_EXPORT(XMAGetOutputBufferWriteOffset, - ExportTag::kImplemented | ExportTag::kAudio); + ExportTag::kImplemented | ExportTag::kAudio | + ExportTag::kHighFrequency); dword_result_t XMAGetPacketMetadata(lpvoid_t context_ptr) { XMA_CONTEXT_DATA context(context_ptr); @@ -308,63 +311,46 @@ dword_result_t XMAGetPacketMetadata(lpvoid_t context_ptr) { DECLARE_XBOXKRNL_EXPORT(XMAGetPacketMetadata, ExportTag::kImplemented | ExportTag::kAudio); -SHIM_CALL XMAEnableContext_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t context_ptr = SHIM_GET_ARG_32(0); - - XELOGD("XMAEnableContext(%.8X)", context_ptr); - - StoreXmaContextIndexedRegister(kernel_state, 0x1940, context_ptr); - - SHIM_SET_RETURN_32(0); +dword_result_t XMAEnableContext(lpvoid_t context_ptr) { + StoreXmaContextIndexedRegister(kernel_state(), 0x1940, context_ptr); + return 0; } +DECLARE_XBOXKRNL_EXPORT(XMAEnableContext, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); -SHIM_CALL XMADisableContext_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t context_ptr = SHIM_GET_ARG_32(0); - uint32_t wait = SHIM_GET_ARG_32(1); - - XELOGD("XMADisableContext(%.8X, %d)", context_ptr, wait); - +dword_result_t XMADisableContext(lpvoid_t context_ptr, dword_t wait) { X_HRESULT result = X_E_SUCCESS; - StoreXmaContextIndexedRegister(kernel_state, 0x1A40, context_ptr); - if (!kernel_state->emulator()->audio_system()->xma_decoder()->BlockOnContext( - context_ptr, !wait)) { + StoreXmaContextIndexedRegister(kernel_state(), 0x1A40, context_ptr); + if (!kernel_state() + ->emulator() + ->audio_system() + ->xma_decoder() + ->BlockOnContext(context_ptr, !wait)) { result = X_E_FALSE; } - - SHIM_SET_RETURN_32(result); + return result; } +DECLARE_XBOXKRNL_EXPORT(XMADisableContext, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); -SHIM_CALL XMABlockWhileInUse_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t context_ptr = SHIM_GET_ARG_32(0); - - XELOGD("XMABlockWhileInUse(%.8X)", context_ptr); - +dword_result_t XMABlockWhileInUse(lpvoid_t context_ptr) { do { - XMA_CONTEXT_DATA context(SHIM_MEM_ADDR(context_ptr)); + XMA_CONTEXT_DATA context(context_ptr); if (!context.input_buffer_0_valid && !context.input_buffer_1_valid) { break; } xe::threading::Sleep(std::chrono::milliseconds(1)); } while (true); - - SHIM_SET_RETURN_32(0); + return 0; } +DECLARE_XBOXKRNL_EXPORT(XMABlockWhileInUse, ExportTag::kImplemented | + ExportTag::kAudio | + ExportTag::kHighFrequency); void RegisterAudioXmaExports(xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state) { - // Used for both XMA* methods and direct register access. - SHIM_SET_MAPPING("xboxkrnl.exe", XMACreateContext, state); - SHIM_SET_MAPPING("xboxkrnl.exe", XMAReleaseContext, state); - - // Only used in older games. - SHIM_SET_MAPPING("xboxkrnl.exe", XMASetLoopData, state); - - SHIM_SET_MAPPING("xboxkrnl.exe", XMAEnableContext, state); - SHIM_SET_MAPPING("xboxkrnl.exe", XMADisableContext, state); - SHIM_SET_MAPPING("xboxkrnl.exe", XMABlockWhileInUse, state); } } // namespace xboxkrnl