From 766974c30a335cd6e3053c2d8f694b2d638ace18 Mon Sep 17 00:00:00 2001 From: DrChat Date: Fri, 16 Feb 2018 18:34:13 -0600 Subject: [PATCH] [Kernel] Document XMP[G/S]etPlaybackController --- src/xenia/kernel/xam/apps/xmp_app.cc | 62 +++++++++++++++++----------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/src/xenia/kernel/xam/apps/xmp_app.cc b/src/xenia/kernel/xam/apps/xmp_app.cc index 128d0939d..320e893a1 100644 --- a/src/xenia/kernel/xam/apps/xmp_app.cc +++ b/src/xenia/kernel/xam/apps/xmp_app.cc @@ -268,12 +268,15 @@ X_RESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, } case 0x0007000B: { assert_true(!buffer_length || buffer_length == 8); - uint32_t xmp_client = xe::load_and_swap(buffer + 0); - uint32_t float_ptr = xe::load_and_swap( - buffer + 4); // out ptr to 4b - floating point - assert_true(xmp_client == 0x00000002); - XELOGD("XMPGetVolume(%.8X)", float_ptr); - xe::store_and_swap(memory_->TranslateVirtual(float_ptr), volume_); + struct { + xe::be xmp_client; + xe::be volume_ptr; + }* args = memory_->TranslateVirtual(buffer_ptr); + + assert_true(args->xmp_client == 0x00000002); + XELOGD("XMPGetVolume(%.8X)", uint32_t(args->volume_ptr)); + xe::store_and_swap(memory_->TranslateVirtual(args->volume_ptr), + volume_); return X_ERROR_SUCCESS; } case 0x0007000C: { @@ -349,14 +352,20 @@ X_RESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, return XMPDeleteTitlePlaylist(playlist_handle); } case 0x0007001A: { + // XMPSetPlaybackController assert_true(!buffer_length || buffer_length == 12); - uint32_t xmp_client = xe::load_and_swap(buffer + 0); - uint32_t unk1 = xe::load_and_swap(buffer + 4); - uint32_t enabled = xe::load_and_swap(buffer + 8); - assert_true(xmp_client == 0x00000002); - assert_zero(unk1); - XELOGD("XMPSetEnabled(%.8X, %.8X)", unk1, enabled); - disabled_ = enabled; + struct { + xe::be xmp_client; + xe::be controller; + xe::be locked; + }* args = memory_->TranslateVirtual(buffer_ptr); + + assert_true(args->xmp_client == 0x00000002); + assert_true(args->controller == 0x00000000); + XELOGD("XMPSetPlaybackController(%.8X, %.8X)", uint32_t(args->controller), + uint32_t(args->locked)); + + disabled_ = args->locked; if (disabled_) { XMPStop(0); } @@ -364,22 +373,29 @@ X_RESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, return X_ERROR_SUCCESS; } case 0x0007001B: { + // XMPGetPlaybackController assert_true(!buffer_length || buffer_length == 12); - uint32_t xmp_client = xe::load_and_swap(buffer + 0); - uint32_t unk_ptr = - xe::load_and_swap(buffer + 4); // out ptr to 4b - expect 0 - uint32_t disabled_ptr = xe::load_and_swap( - buffer + 8); // out ptr to 4b - expect 1 (to skip) - assert_true(xmp_client == 0x00000002); - XELOGD("XMPGetEnabled(%.8X, %.8X)", unk_ptr, disabled_ptr); - xe::store_and_swap(memory_->TranslateVirtual(unk_ptr), 0); - xe::store_and_swap(memory_->TranslateVirtual(disabled_ptr), - disabled_); + struct { + xe::be xmp_client; + xe::be controller_ptr; + xe::be locked_ptr; + }* args = memory_->TranslateVirtual(buffer_ptr); + + assert_true(args->xmp_client == 0x00000002); + XELOGD("XMPGetPlaybackController(%.8X, %.8X, %.8X)", + uint32_t(args->xmp_client), uint32_t(args->controller_ptr), + uint32_t(args->locked_ptr)); + xe::store_and_swap( + memory_->TranslateVirtual(args->controller_ptr), 0); + xe::store_and_swap(memory_->TranslateVirtual(args->locked_ptr), + 0); + // Atrain spawns a thread 82437FD0 to call this in a tight loop forever. xe::threading::Sleep(std::chrono::milliseconds(10)); return X_ERROR_SUCCESS; } case 0x00070029: { + // XMPGetPlaybackBehavior assert_true(!buffer_length || buffer_length == 16); uint32_t xmp_client = xe::load_and_swap(buffer + 0); uint32_t playback_mode_ptr = xe::load_and_swap(buffer + 4);