[Xbox] kXNotification Additions

- Discovered new unknown kXNotificationID use by XNotifyBroadcast together and wanted to record them before I forget them.
- Changed kXNotificationID  to kXNotification
- Added kXNotificationSystemPXLiveSystemUpdate
This commit is contained in:
The-Little-Wolf 2024-12-30 19:12:42 -08:00 committed by Radosław Gliński
parent b757601f01
commit 95df198d8a
9 changed files with 88 additions and 70 deletions

View File

@ -1405,15 +1405,13 @@ void EmulatorWindow::ToggleDisplayConfigDialog() {
void EmulatorWindow::ToggleProfilesConfigDialog() { void EmulatorWindow::ToggleProfilesConfigDialog() {
if (!profile_config_dialog_) { if (!profile_config_dialog_) {
disable_hotkeys_ = true; disable_hotkeys_ = true;
emulator_->kernel_state()->BroadcastNotification(kXNotificationIDSystemUI, emulator_->kernel_state()->BroadcastNotification(kXNotificationSystemUI, 1);
1);
profile_config_dialog_ = profile_config_dialog_ =
std::make_unique<ProfileConfigDialog>(imgui_drawer_.get(), this); std::make_unique<ProfileConfigDialog>(imgui_drawer_.get(), this);
kernel::xam::xam_dialogs_shown_++; kernel::xam::xam_dialogs_shown_++;
} else { } else {
disable_hotkeys_ = false; disable_hotkeys_ = false;
emulator_->kernel_state()->BroadcastNotification(kXNotificationIDSystemUI, emulator_->kernel_state()->BroadcastNotification(kXNotificationSystemUI, 0);
0);
profile_config_dialog_.reset(); profile_config_dialog_.reset();
kernel::xam::xam_dialogs_shown_--; kernel::xam::xam_dialogs_shown_--;
} }

View File

@ -483,7 +483,7 @@ void AudioMediaPlayer::SetCaptureCallback(uint32_t callback, uint32_t context,
} }
void AudioMediaPlayer::OnStateChanged() { void AudioMediaPlayer::OnStateChanged() {
kernel_state_->BroadcastNotification(kNotificationXmpStateChanged, kernel_state_->BroadcastNotification(kXNotificationXmpStateChanged,
static_cast<uint32_t>(state_)); static_cast<uint32_t>(state_));
} }

View File

@ -835,8 +835,7 @@ X_STATUS Emulator::InstallContentPackage(
return error_code; return error_code;
} }
kernel_state()->BroadcastNotification(kXNotificationIDLiveContentInstalled, kernel_state()->BroadcastNotification(kXNotificationLiveContentInstalled, 0);
0);
return error_code; return error_code;
} }

View File

@ -59,7 +59,7 @@ void InputSystem::UpdateUsedSlot(InputDriver* driver, uint8_t slot,
connected_slots.flip(slot); connected_slots.flip(slot);
if (kernel::kernel_state()) { if (kernel::kernel_state()) {
kernel::kernel_state()->BroadcastNotification( kernel::kernel_state()->BroadcastNotification(
kXNotificationIDSystemInputDevicesChanged, 0); kXNotificationSystemInputDevicesChanged, 0);
} }
if (driver) { if (driver) {

View File

@ -867,11 +867,11 @@ void KernelState::RegisterNotifyListener(XNotifyListener* listener) {
if (!has_notified_startup_ && listener->mask() & kXNotifySystem) { if (!has_notified_startup_ && listener->mask() & kXNotifySystem) {
has_notified_startup_ = true; has_notified_startup_ = true;
// XN_SYS_UI (on, off) // XN_SYS_UI (on, off)
listener->EnqueueNotification(kXNotificationIDSystemUI, 1); listener->EnqueueNotification(kXNotificationSystemUI, 1);
listener->EnqueueNotification(kXNotificationIDSystemUI, 0); listener->EnqueueNotification(kXNotificationSystemUI, 0);
// XN_SYS_SIGNINCHANGED x2 // XN_SYS_SIGNINCHANGED x2
listener->EnqueueNotification(kXNotificationIDSystemSignInChanged, 1); listener->EnqueueNotification(kXNotificationSystemSignInChanged, 1);
listener->EnqueueNotification(kXNotificationIDSystemSignInChanged, 1); listener->EnqueueNotification(kXNotificationSystemSignInChanged, 1);
} }
} }

View File

@ -108,7 +108,7 @@ X_HRESULT XmpApp::XMPPlayTitlePlaylist(uint32_t playlist_handle,
XELOGD("XMPPlayTitlePlaylist({:08X}, {:08X})", playlist_handle, song_handle); XELOGD("XMPPlayTitlePlaylist({:08X}, {:08X})", playlist_handle, song_handle);
kernel_state_->emulator()->audio_media_player()->Play(playlist_handle, kernel_state_->emulator()->audio_media_player()->Play(playlist_handle,
song_handle, false); song_handle, false);
kernel_state_->BroadcastNotification(kNotificationXmpPlaybackBehaviorChanged, kernel_state_->BroadcastNotification(kXNotificationXmpPlaybackBehaviorChanged,
1); 1);
return X_E_SUCCESS; return X_E_SUCCESS;
} }
@ -214,7 +214,7 @@ X_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
static_cast<PlaybackFlags>(uint32_t(args->flags))); static_cast<PlaybackFlags>(uint32_t(args->flags)));
kernel_state_->BroadcastNotification( kernel_state_->BroadcastNotification(
kNotificationXmpPlaybackBehaviorChanged, 0); kXNotificationXmpPlaybackBehaviorChanged, 0);
return X_E_SUCCESS; return X_E_SUCCESS;
} }
case 0x00070009: { case 0x00070009: {
@ -359,7 +359,7 @@ X_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
PlaybackClient(uint32_t(args->playback_client))); PlaybackClient(uint32_t(args->playback_client)));
kernel_state_->BroadcastNotification( kernel_state_->BroadcastNotification(
kNotificationXmpPlaybackControllerChanged, kXNotificationXmpPlaybackControllerChanged,
kernel_state_->emulator() kernel_state_->emulator()
->audio_media_player() ->audio_media_player()
->IsTitleInPlaybackControl()); ->IsTitleInPlaybackControl());

View File

@ -324,7 +324,7 @@ void ProfileManager::Login(const uint64_t xuid, const uint8_t user_index,
} }
if (notify) { if (notify) {
kernel_state_->BroadcastNotification(kXNotificationIDSystemSignInChanged, kernel_state_->BroadcastNotification(kXNotificationSystemSignInChanged,
GetUsedUserSlots().to_ulong()); GetUsedUserSlots().to_ulong());
} }
UpdateConfig(xuid, assigned_user_slot); UpdateConfig(xuid, assigned_user_slot);
@ -338,7 +338,7 @@ void ProfileManager::Logout(const uint8_t user_index, bool notify) {
DismountProfile(profile->second->xuid()); DismountProfile(profile->second->xuid());
logged_profiles_.erase(profile); logged_profiles_.erase(profile);
if (notify) { if (notify) {
kernel_state_->BroadcastNotification(kXNotificationIDSystemSignInChanged, kernel_state_->BroadcastNotification(kXNotificationSystemSignInChanged,
GetUsedUserSlots().to_ulong()); GetUsedUserSlots().to_ulong());
} }
UpdateConfig(0, user_index); UpdateConfig(0, user_index);
@ -352,7 +352,7 @@ void ProfileManager::LoginMultiple(
slots_mask |= (1 << slot); slots_mask |= (1 << slot);
} }
kernel_state_->BroadcastNotification(kXNotificationIDSystemSignInChanged, kernel_state_->BroadcastNotification(kXNotificationSystemSignInChanged,
slots_mask); slots_mask);
} }

View File

@ -85,7 +85,7 @@ X_RESULT xeXamDispatchDialog(T* dialog,
std::function<X_RESULT(T*)> close_callback, std::function<X_RESULT(T*)> close_callback,
uint32_t overlapped) { uint32_t overlapped) {
auto pre = []() { auto pre = []() {
kernel_state()->BroadcastNotification(kXNotificationIDSystemUI, true); kernel_state()->BroadcastNotification(kXNotificationSystemUI, true);
}; };
auto run = [dialog, close_callback]() -> X_RESULT { auto run = [dialog, close_callback]() -> X_RESULT {
X_RESULT result; X_RESULT result;
@ -108,7 +108,7 @@ X_RESULT xeXamDispatchDialog(T* dialog,
}; };
auto post = []() { auto post = []() {
xe::threading::Sleep(std::chrono::milliseconds(100)); xe::threading::Sleep(std::chrono::milliseconds(100));
kernel_state()->BroadcastNotification(kXNotificationIDSystemUI, false); kernel_state()->BroadcastNotification(kXNotificationSystemUI, false);
}; };
if (!overlapped) { if (!overlapped) {
pre(); pre();
@ -126,7 +126,7 @@ X_RESULT xeXamDispatchDialogEx(
T* dialog, std::function<X_RESULT(T*, uint32_t&, uint32_t&)> close_callback, T* dialog, std::function<X_RESULT(T*, uint32_t&, uint32_t&)> close_callback,
uint32_t overlapped) { uint32_t overlapped) {
auto pre = []() { auto pre = []() {
kernel_state()->BroadcastNotification(kXNotificationIDSystemUI, true); kernel_state()->BroadcastNotification(kXNotificationSystemUI, true);
}; };
auto run = [dialog, close_callback](uint32_t& extended_error, auto run = [dialog, close_callback](uint32_t& extended_error,
uint32_t& length) -> X_RESULT { uint32_t& length) -> X_RESULT {
@ -150,7 +150,7 @@ X_RESULT xeXamDispatchDialogEx(
}; };
auto post = []() { auto post = []() {
xe::threading::Sleep(std::chrono::milliseconds(100)); xe::threading::Sleep(std::chrono::milliseconds(100));
kernel_state()->BroadcastNotification(kXNotificationIDSystemUI, false); kernel_state()->BroadcastNotification(kXNotificationSystemUI, false);
}; };
if (!overlapped) { if (!overlapped) {
pre(); pre();
@ -168,11 +168,11 @@ X_RESULT xeXamDispatchDialogEx(
X_RESULT xeXamDispatchHeadless(std::function<X_RESULT()> run_callback, X_RESULT xeXamDispatchHeadless(std::function<X_RESULT()> run_callback,
uint32_t overlapped) { uint32_t overlapped) {
auto pre = []() { auto pre = []() {
kernel_state()->BroadcastNotification(kXNotificationIDSystemUI, true); kernel_state()->BroadcastNotification(kXNotificationSystemUI, true);
}; };
auto post = []() { auto post = []() {
xe::threading::Sleep(std::chrono::milliseconds(100)); xe::threading::Sleep(std::chrono::milliseconds(100));
kernel_state()->BroadcastNotification(kXNotificationIDSystemUI, false); kernel_state()->BroadcastNotification(kXNotificationSystemUI, false);
}; };
if (!overlapped) { if (!overlapped) {
pre(); pre();
@ -190,11 +190,11 @@ X_RESULT xeXamDispatchHeadlessEx(
std::function<X_RESULT(uint32_t&, uint32_t&)> run_callback, std::function<X_RESULT(uint32_t&, uint32_t&)> run_callback,
uint32_t overlapped) { uint32_t overlapped) {
auto pre = []() { auto pre = []() {
kernel_state()->BroadcastNotification(kXNotificationIDSystemUI, true); kernel_state()->BroadcastNotification(kXNotificationSystemUI, true);
}; };
auto post = []() { auto post = []() {
xe::threading::Sleep(std::chrono::milliseconds(100)); xe::threading::Sleep(std::chrono::milliseconds(100));
kernel_state()->BroadcastNotification(kXNotificationIDSystemUI, false); kernel_state()->BroadcastNotification(kXNotificationSystemUI, false);
}; };
if (!overlapped) { if (!overlapped) {
pre(); pre();
@ -213,7 +213,7 @@ X_RESULT xeXamDispatchHeadlessEx(
template <typename T> template <typename T>
X_RESULT xeXamDispatchDialogAsync(T* dialog, X_RESULT xeXamDispatchDialogAsync(T* dialog,
std::function<void(T*)> close_callback) { std::function<void(T*)> close_callback) {
kernel_state()->BroadcastNotification(kXNotificationIDSystemUI, true); kernel_state()->BroadcastNotification(kXNotificationSystemUI, true);
++xam_dialogs_shown_; ++xam_dialogs_shown_;
// Important to pass captured vars by value here since we return from this // Important to pass captured vars by value here since we return from this
@ -226,7 +226,7 @@ X_RESULT xeXamDispatchDialogAsync(T* dialog,
auto run = []() -> void { auto run = []() -> void {
xe::threading::Sleep(std::chrono::milliseconds(100)); xe::threading::Sleep(std::chrono::milliseconds(100));
kernel_state()->BroadcastNotification(kXNotificationIDSystemUI, false); kernel_state()->BroadcastNotification(kXNotificationSystemUI, false);
}; };
std::thread thread(run); std::thread thread(run);
@ -237,7 +237,7 @@ X_RESULT xeXamDispatchDialogAsync(T* dialog,
} }
X_RESULT xeXamDispatchHeadlessAsync(std::function<void()> run_callback) { X_RESULT xeXamDispatchHeadlessAsync(std::function<void()> run_callback) {
kernel_state()->BroadcastNotification(kXNotificationIDSystemUI, true); kernel_state()->BroadcastNotification(kXNotificationSystemUI, true);
++xam_dialogs_shown_; ++xam_dialogs_shown_;
auto display_window = kernel_state()->emulator()->display_window(); auto display_window = kernel_state()->emulator()->display_window();
@ -248,7 +248,7 @@ X_RESULT xeXamDispatchHeadlessAsync(std::function<void()> run_callback) {
auto run = []() -> void { auto run = []() -> void {
xe::threading::Sleep(std::chrono::milliseconds(100)); xe::threading::Sleep(std::chrono::milliseconds(100));
kernel_state()->BroadcastNotification(kXNotificationIDSystemUI, false); kernel_state()->BroadcastNotification(kXNotificationSystemUI, false);
}; };
std::thread thread(run); std::thread thread(run);
@ -1295,7 +1295,7 @@ X_HRESULT xeXShowMarketplaceUIEx(dword_t user_index, dword_t ui_type,
cvars::license_mask = 1; cvars::license_mask = 1;
kernel_state()->BroadcastNotification( kernel_state()->BroadcastNotification(
kXNotificationIDLiveContentInstalled, 0); kXNotificationLiveContentInstalled, 0);
} }
} }
}; };

View File

@ -271,60 +271,81 @@ constexpr uint8_t XUserIndexAny = 0xFF;
// https://github.com/ThirteenAG/Ultimate-ASI-Loader/blob/master/source/xlive/xliveless.h // https://github.com/ThirteenAG/Ultimate-ASI-Loader/blob/master/source/xlive/xliveless.h
typedef uint32_t XNotificationID; typedef uint32_t XNotificationID;
enum : XNotificationID { enum : XNotificationID {
/* Notes:
- kXNotificationSystemUnknown, kXNotificationLiveUnknown,
kXNotificationCustomGamercard, kXNotificationDvdDriveUnknown,
kXNotificationXmpUnknown, kXNotificationFriendsUnknown, and
kXNotificationMsgrUnknown are all called together by XNotifyBroadcast
*/
// Notification Areas // Notification Areas
kXNotifySystem = 0x00000001, kXNotifySystem = 0x00000001,
kXNotifyLive = 0x00000002, kXNotifyLive = 0x00000002,
kXNotifyFriends = 0x00000004, kXNotifyFriends = 0x00000004,
kXNotifyCustom = 0x00000008, kXNotifyCustom = 0x00000008,
kXNotifyDvdDrive = 0x00000010, // ?
kXNotifyXmp = 0x00000020, kXNotifyXmp = 0x00000020,
kXNotifyMsgr = 0x00000040, kXNotifyMsgr = 0x00000040,
kXNotifyParty = 0x00000080, kXNotifyParty = 0x00000080,
kXNotifyAll = 0x000000EF, kXNotifyAll = 0x000000EF,
// XNotification System // XNotification System (35 total)
kXNotificationIDSystemUI = 0x00000009, kXNotificationSystemUI = 0x00000009,
kXNotificationIDSystemSignInChanged = 0x0000000A, kXNotificationSystemSignInChanged = 0x0000000A,
kXNotificationIDSystemStorageDevicesChanged = 0x0000000B, kXNotificationSystemStorageDevicesChanged = 0x0000000B,
kXNotificationIDSystemProfileSettingChanged = 0x0000000E, kXNotificationSystemProfileSettingChanged = 0x0000000E,
kXNotificationIDSystemMuteListChanged = 0x00000011, kXNotificationSystemMuteListChanged = 0x00000011,
kXNotificationIDSystemInputDevicesChanged = 0x00000012, kXNotificationSystemInputDevicesChanged = 0x00000012,
kXNotificationIDSystemInputDeviceConfigChanged = 0x00000013, kXNotificationSystemInputDeviceConfigChanged = 0x00000013,
kXNotificationIDSystemPlayerTimerNotice = 0x00000015, kXNotificationSystemPlayerTimerNotice = 0x00000015,
kXNotificationIDSystemAvatarChanged = 0x00000017, kXNotificationSystemPXLiveSystemUpdate = 0x00000016,
kXNotificationIDSystemNUIHardwareStatusChanged = 0x00000019, kXNotificationSystemAvatarChanged = 0x00000017,
kXNotificationIDSystemNUIPause = 0x0000001A, kXNotificationSystemUnknown = 0x00000018,
kXNotificationIDSystemNUIUIApproach = 0x0000001B, kXNotificationSystemNUIHardwareStatusChanged = 0x00000019,
kXNotificationIDSystemDeviceRemap = 0x0000001C, kXNotificationSystemNUIPause = 0x0000001A,
kXNotificationIDSystemNUIBindingChanged = 0x0000001D, kXNotificationSystemNUIUIApproach = 0x0000001B,
kXNotificationIDSystemAudioLatencyChanged = 0x0000001E, kXNotificationSystemDeviceRemap = 0x0000001C,
kXNotificationIDSystemNUIChatBindingChanged = 0x0000001F, kXNotificationSystemNUIBindingChanged = 0x0000001D,
kXNotificationIDSystemInputActivityChanged = 0x00000020, kXNotificationSystemAudioLatencyChanged = 0x0000001E,
kXNotificationSystemNUIChatBindingChanged = 0x0000001F,
kXNotificationSystemInputActivityChanged = 0x00000020,
// XNotification Live // XNotification Live (20 total)
kXNotificationIDLiveConnectionChanged = 0x02000001, kXNotificationLiveConnectionChanged = 0x02000001,
kXNotificationIDLiveInviteAccepted = 0x02000002, kXNotificationLiveInviteAccepted = 0x02000002,
kXNotificationIDLiveLinkStateChanged = 0x02000003, kXNotificationLiveLinkStateChanged = 0x02000003,
kXNotificationIDLiveContentInstalled = 0x02000007, kXNotificationLiveContentInstalled = 0x02000007,
kXNotificationIDLiveMembershipPurchased = 0x02000008, kXNotificationLiveMembershipPurchased = 0x02000008,
kXNotificationIDLiveVoicechatAway = 0x02000009, kXNotificationLiveVoicechatAway = 0x02000009,
kXNotificationIDLivePresenceChanged = 0x0200000A, kXNotificationLivePresenceChanged = 0x0200000A,
kXNotificationLiveUnknown = 0x02000012,
// XNotification Friends // XNotification Friends (9 total)
kXNotificationIDFriendsPresenceChanged = 0x04000001, kXNotificationFriendsPresenceChanged = 0x04000001,
kXNotificationIDFriendsFriendAdded = 0x04000002, kXNotificationFriendsFriendAdded = 0x04000002,
kXNotificationIDFriendsFriendRemoved = 0x04000003, kXNotificationFriendsFriendRemoved = 0x04000003,
kXNotificationFriendsUnknown = 0x04000008,
// XNotification Custom // XNotification Custom (5 total)
kXNotificationIDCustomActionPressed = 0x06000003, kXNotificationCustomActionPressed = 0x06000003,
kXNotificationIDCustomGamercard = 0x06000004, kXNotificationCustomGamercard = 0x06000004,
// XNotification XMP // XNotification Dvd ?
kNotificationXmpStateChanged = 0x0A000001, kXNotificationDvdDriveUnknown = 0x80000003,
kNotificationXmpPlaybackBehaviorChanged = 0x0A000002, kXNotificationDvdDriveTrayStateChanged = 0x8000000D,
kNotificationXmpPlaybackControllerChanged = 0x0A000003,
// XNotification Party // XNotification XMP (13 total)
kXNotificationIDPartyMembersChanged = 0x0E000002, kXNotificationXmpStateChanged = 0x0A000001,
kXNotificationXmpPlaybackBehaviorChanged = 0x0A000002,
kXNotificationXmpPlaybackControllerChanged = 0x0A000003,
kXNotificationXmpUnknown = 0x0A00000C,
// XNotification Party (6 total)
kXNotificationPartyMembersChanged = 0x0E000002,
kXNotificationFriendUnknown = 0x0E000005,
// XNotification Msgr
kXNotificationMsgrUnknown = 0x0C00000E,
}; };
// https://github.com/CodeAsm/ffplay360/blob/master/Common/XTLOnPC.h // https://github.com/CodeAsm/ffplay360/blob/master/Common/XTLOnPC.h