[XMP] Return success for XMPGetMediaSources with 0 sources
- Renamed XMPDashInIt to XMPDashInit - Added broadcast to XMPDashInit - Renamed some unknown fields of XMP_SET_MEDIA_SOURCE_WORKSPACE
This commit is contained in:
committed by
Radosław Gliński
parent
99fd19d025
commit
49c700b9c5
@@ -71,7 +71,7 @@ class AudioMediaPlayer {
|
|||||||
void SetXMPOverride(bool xmp_override) { xmp_override_ = xmp_override; }
|
void SetXMPOverride(bool xmp_override) { xmp_override_ = xmp_override; }
|
||||||
bool IsXMPOverrideEnabled() const { return xmp_override_; }
|
bool IsXMPOverrideEnabled() const { return xmp_override_; }
|
||||||
|
|
||||||
uint32_t GetDashInItState() const { return dash_init_state; }
|
uint32_t GetDashInitState() const { return dash_init_state; }
|
||||||
|
|
||||||
void SetXMPClient(XMP_CLIENT xmp_client) { xmp_client_ = xmp_client; }
|
void SetXMPClient(XMP_CLIENT xmp_client) { xmp_client_ = xmp_client; }
|
||||||
|
|
||||||
|
|||||||
@@ -486,6 +486,7 @@ X_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
|
|||||||
return X_E_SUCCESS;
|
return X_E_SUCCESS;
|
||||||
}
|
}
|
||||||
case 0x0007002B: {
|
case 0x0007002B: {
|
||||||
|
constexpr uint8_t kMaxSourcesForMediaPlayer = 10;
|
||||||
// XMPGetMediaSources
|
// XMPGetMediaSources
|
||||||
// Called on the NXE and Kinect dashboard after clicking on the picture,
|
// Called on the NXE and Kinect dashboard after clicking on the picture,
|
||||||
// video, and music library
|
// video, and music library
|
||||||
@@ -503,7 +504,38 @@ X_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
|
|||||||
args->get_connected_sources_only.get(),
|
args->get_connected_sources_only.get(),
|
||||||
args->media_resources_ptr.get(), args->max_source.get(),
|
args->media_resources_ptr.get(), args->max_source.get(),
|
||||||
args->sources_returned_ptr.get());
|
args->sources_returned_ptr.get());
|
||||||
return X_E_INVALIDARG;
|
|
||||||
|
if (!args->sources_returned_ptr) {
|
||||||
|
return X_E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!args->media_resources_ptr) {
|
||||||
|
*kernel_state_->memory()->TranslateVirtual<uint32_t*>(
|
||||||
|
args->sources_returned_ptr.get()) = kMaxSourcesForMediaPlayer;
|
||||||
|
return X_E_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args->max_source.get() < kMaxSourcesForMediaPlayer) {
|
||||||
|
return 0x80070008;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < kMaxSourcesForMediaPlayer; ++i) {
|
||||||
|
if (!args->get_connected_sources_only) {
|
||||||
|
// There should be some call to handle it, but we ignore it for now.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Some 0xB4 struct, but no idea what it is.
|
||||||
|
auto entry = kernel_state_->memory()->TranslateVirtual<uint32_t*>(
|
||||||
|
args->media_resources_ptr.get() + (i * 0xB4));
|
||||||
|
|
||||||
|
std::memset(entry, 0x0, 0x28);
|
||||||
|
*entry = xe::byte_swap<uint32_t>(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
// We're returning 0 which means there is no source of media available.
|
||||||
|
*kernel_state_->memory()->TranslateVirtual<uint32_t*>(
|
||||||
|
args->sources_returned_ptr.get()) = 0x0;
|
||||||
|
return X_E_SUCCESS;
|
||||||
}
|
}
|
||||||
case 0x0007002E: {
|
case 0x0007002E: {
|
||||||
assert_true(!buffer_length ||
|
assert_true(!buffer_length ||
|
||||||
@@ -514,7 +546,7 @@ X_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
|
|||||||
args->size_ptr);
|
args->size_ptr);
|
||||||
}
|
}
|
||||||
case 0x0007002F: {
|
case 0x0007002F: {
|
||||||
// XMPDashInIt
|
// XMPDashInit
|
||||||
// Called on the start up of all dashboard versions before kinect
|
// Called on the start up of all dashboard versions before kinect
|
||||||
assert_true(!buffer_length || buffer_length == sizeof(XMP_DASH_INIT));
|
assert_true(!buffer_length || buffer_length == sizeof(XMP_DASH_INIT));
|
||||||
XMP_DASH_INIT* args = reinterpret_cast<XMP_DASH_INIT*>(buffer);
|
XMP_DASH_INIT* args = reinterpret_cast<XMP_DASH_INIT*>(buffer);
|
||||||
@@ -522,12 +554,14 @@ X_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
|
|||||||
assert_true(args->xmp_client == apu::XMP_CLIENT::Game ||
|
assert_true(args->xmp_client == apu::XMP_CLIENT::Game ||
|
||||||
args->xmp_client == apu::XMP_CLIENT::Dash);
|
args->xmp_client == apu::XMP_CLIENT::Dash);
|
||||||
XELOGD(
|
XELOGD(
|
||||||
"XMPDashInIt({:08X}, {:08X}, {:08X}, {:08X}, {:08X}, {:08X}), "
|
"XMPDashInit({:08X}, {:08X}, {:08X}, {:08X}, {:08X}, {:08X}), "
|
||||||
"unimplemented",
|
"unimplemented",
|
||||||
uint32_t(args->xmp_client.get()), args->buffer_ptr.get(),
|
uint32_t(args->xmp_client.get()), args->buffer_ptr.get(),
|
||||||
args->buffer_length.get(), args->unk1.get(), args->unk2.get(),
|
args->buffer_length.get(), args->unk1.get(), args->unk2.get(),
|
||||||
args->storage_ptr.get());
|
args->storage_ptr.get());
|
||||||
return X_E_INVALIDARG;
|
|
||||||
|
kernel_state_->BroadcastNotification(kXNotificationXmpDashInitChanged, 1);
|
||||||
|
return X_E_SUCCESS;
|
||||||
}
|
}
|
||||||
case 0x0007003D: {
|
case 0x0007003D: {
|
||||||
// XMPCaptureOutput
|
// XMPCaptureOutput
|
||||||
@@ -558,21 +592,21 @@ X_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
|
|||||||
XELOGD(
|
XELOGD(
|
||||||
"XMPSetMediaSourceWorkspace({:08X}, {:08X}, {:08X}, {:08X}), "
|
"XMPSetMediaSourceWorkspace({:08X}, {:08X}, {:08X}, {:08X}), "
|
||||||
"unimplemented",
|
"unimplemented",
|
||||||
uint32_t(args->xmp_client.get()), args->unk1.get(),
|
uint32_t(args->xmp_client.get()), args->workspace_type.get(),
|
||||||
args->storage_ptr.get(), args->unk2.get());
|
args->storage_ptr.get(), args->storage_length.get());
|
||||||
return X_E_INVALIDARG;
|
return X_E_SUCCESS;
|
||||||
}
|
}
|
||||||
case 0x00070053: {
|
case 0x00070053: {
|
||||||
// Called on the blades dashboard Version 4532-5787 after clicking on the
|
// Called on the blades dashboard Version 4532-5787 after clicking on the
|
||||||
// picture or video library. It only receives buffer
|
// picture or video library. It only receives buffer
|
||||||
XMP_GET_DASH_INIT_STATE* args =
|
XMP_GET_DASH_INIT_STATE* args =
|
||||||
reinterpret_cast<XMP_GET_DASH_INIT_STATE*>(buffer);
|
reinterpret_cast<XMP_GET_DASH_INIT_STATE*>(buffer);
|
||||||
XELOGD("XMPGetDashInItState({:08X}, {:08X})",
|
XELOGD("XMPGetDashInitState({:08X}, {:08X})",
|
||||||
uint32_t(args->xmp_client.get()), args->dash_init_state_ptr.get());
|
uint32_t(args->xmp_client.get()), args->dash_init_state_ptr.get());
|
||||||
|
|
||||||
xe::store_and_swap<uint32_t>(
|
xe::store_and_swap<uint32_t>(
|
||||||
memory_->TranslateVirtual(args->dash_init_state_ptr),
|
memory_->TranslateVirtual(args->dash_init_state_ptr),
|
||||||
kernel_state_->emulator()->audio_media_player()->GetDashInItState());
|
kernel_state_->emulator()->audio_media_player()->GetDashInitState());
|
||||||
return X_E_SUCCESS;
|
return X_E_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -204,9 +204,9 @@ static_assert_size(XMP_CAPTURE_OUTPUT, 0x10);
|
|||||||
|
|
||||||
struct XMP_SET_MEDIA_SOURCE_WORKSPACE {
|
struct XMP_SET_MEDIA_SOURCE_WORKSPACE {
|
||||||
xe::be<apu::XMP_CLIENT> xmp_client;
|
xe::be<apu::XMP_CLIENT> xmp_client;
|
||||||
xe::be<uint32_t> unk1;
|
xe::be<uint32_t> workspace_type;
|
||||||
xe::be<uint32_t> storage_ptr;
|
xe::be<uint32_t> storage_ptr;
|
||||||
xe::be<uint32_t> unk2;
|
xe::be<uint32_t> storage_length;
|
||||||
};
|
};
|
||||||
static_assert_size(XMP_SET_MEDIA_SOURCE_WORKSPACE, 0x10);
|
static_assert_size(XMP_SET_MEDIA_SOURCE_WORKSPACE, 0x10);
|
||||||
|
|
||||||
|
|||||||
@@ -275,7 +275,7 @@ enum : XNotificationID {
|
|||||||
kXNotificationXmpTitlePlayListContentChanged = 0x8A000005,
|
kXNotificationXmpTitlePlayListContentChanged = 0x8A000005,
|
||||||
kXNotificationXmpLocalMediaContentChanged = 0x8A000006,
|
kXNotificationXmpLocalMediaContentChanged = 0x8A000006,
|
||||||
kXNotificationXmpDashNowPlayingQueueModeChanged = 0x8A000007,
|
kXNotificationXmpDashNowPlayingQueueModeChanged = 0x8A000007,
|
||||||
kXNotificationXmpDashInItChanged = 0x8A000009,
|
kXNotificationXmpDashInitChanged = 0x8A000009,
|
||||||
kXNotificationXmpPlaybackBehaviorChangedEx = 0x8A00000A,
|
kXNotificationXmpPlaybackBehaviorChangedEx = 0x8A00000A,
|
||||||
|
|
||||||
// XNotification Party
|
// XNotification Party
|
||||||
|
|||||||
Reference in New Issue
Block a user