From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- .../Orbis/Network/SonyVoiceChatParty_Orbis.cpp | 355 +++++++++++++++++++++ 1 file changed, 355 insertions(+) create mode 100644 Minecraft.Client/Orbis/Network/SonyVoiceChatParty_Orbis.cpp (limited to 'Minecraft.Client/Orbis/Network/SonyVoiceChatParty_Orbis.cpp') diff --git a/Minecraft.Client/Orbis/Network/SonyVoiceChatParty_Orbis.cpp b/Minecraft.Client/Orbis/Network/SonyVoiceChatParty_Orbis.cpp new file mode 100644 index 00000000..4777e598 --- /dev/null +++ b/Minecraft.Client/Orbis/Network/SonyVoiceChatParty_Orbis.cpp @@ -0,0 +1,355 @@ +#include "stdafx.h" + +#include "SonyVoiceChat_Orbis.h" + + + +bool m_bIsPartyAPIInitialized; +bool m_bIsPartyBinaryMessageAPIReady; + +SceNpPartyState m_stPartyState; + + SonyVoiceChatParty_Orbis::PartyInfo SonyVoiceChatParty_Orbis::m_partyInfo; + +void SonyVoiceChatParty_Orbis::init() +{ +// m_bIsRunning = false; +// m_pRenderer = NULL; +// m_pPadContext = NULL; +// m_pGraphicsContext = NULL; +// m_iPartyMemberCount = 0; +// m_iPartyLeader = 0; + int ret = SCE_OK; + SceNpPartyInitializeParam stPartyInit; + SceUserServiceLoginUserIdList userIdList; + + + // Run PartyInitializeParamInitialize inline + sceNpPartyInitializeParamInitialize( &stPartyInit ); + + // Initialize the Party API + ret = sceNpPartyInitialize( &stPartyInit ); + if( ret != SCE_OK ) + { + app.DebugPrintf( "Error: sceNpPartyInitialize failed result:0x%x\n", ret ); + return; + } + + // Register handlers for party room events + SceNpPartyEventHandlers stPartyEventHandler; + memset( &stPartyEventHandler, 0, sizeof( SceNpPartyEventHandlers ) ); + stPartyEventHandler.roomEventHandler = partyRoomEventHandler; + stPartyEventHandler.voiceEventHandler = partyVoiceEventHandler; + stPartyEventHandler.binaryMessageEventHandler = partyBinaryMessageEventHandler; + ret = sceNpPartyRegisterHandler( &stPartyEventHandler, NULL ); + if( ret != SCE_OK ) + { + app.DebugPrintf( "Error: sceNpPartyRegisterHandler failed result:0x%x\n", ret ); + return; + } + + + // Get current party state + ret = sceNpPartyGetState( &m_stPartyState ); + if( ret != SCE_OK ) + { + app.DebugPrintf( "Error: sceNpPartyGetState failed result:0x%x\n", ret ); + return; + } + + m_bIsPartyAPIInitialized = true; +} + +void SonyVoiceChatParty_Orbis::shutdown() +{ +} + +void SonyVoiceChatParty_Orbis::setEnabled( bool bEnabled ) +{ +} + + + + +void SonyVoiceChatParty_Orbis::tick() +{ + sceNpPartyCheckCallback(); +} + + + +bool SonyVoiceChatParty_Orbis::hasMicConnected(const PlayerUID& memberUID) +{ + MemberInfo* pInfo = m_partyInfo.getMember(memberUID); + if(pInfo) + { + // in the party, might not have a mic though, still need to check for this + return true; + } + return false; +} + +void SonyVoiceChatParty_Orbis::mute( bool bMute ) +{ +// if(sm_bLoaded && !sm_bUnloading) +// { +// int err = cellSysutilAvc2SetVoiceMuting(bMute); +// assert(err == CELL_OK); +// } +} + +void SonyVoiceChatParty_Orbis::mutePlayer( const SceNpMatching2RoomMemberId member_id, bool bMute ) /*Turn chat audio from a specified player on or off */ +{ +// if(sm_bLoaded && !sm_bUnloading) +// { +// int err = cellSysutilAvc2SetPlayerVoiceMuting(member_id, bMute); +// assert(err == CELL_OK); +// } +} + +void SonyVoiceChatParty_Orbis::muteLocalPlayer( bool bMute ) /*Turn microphone input on or off */ +{ +// if(sm_bLoaded && !sm_bUnloading) +// { +// int err = cellSysutilAvc2SetVoiceMuting(bMute); +// assert(err == CELL_OK); +// } +} + + +bool SonyVoiceChatParty_Orbis::isMuted() +{ +// if(sm_bLoaded && !sm_bUnloading) +// { +// uint8_t bMute; +// int err = cellSysutilAvc2GetVoiceMuting(&bMute); +// assert(err == CELL_OK); +// return bMute; +// } +// return false; +} + +bool SonyVoiceChatParty_Orbis::isMutedPlayer( const PlayerUID& memberUID) +{ + MemberInfo* pInfo = m_partyInfo.getMember(memberUID); + if(pInfo) + return pInfo->m_voiceMuted; + assert(0 && "Didn't find playerUID"); // + return false; +// if(sm_bLoaded && !sm_bUnloading) +// { +// uint8_t bMute; +// int err = cellSysutilAvc2GetPlayerVoiceMuting(member_id, &bMute); +// assert(err == CELL_OK); +// return bMute; +// } +// return false; +} + +bool SonyVoiceChatParty_Orbis::isMutedLocalPlayer() +{ +// if(sm_bLoaded && !sm_bUnloading) +// { +// uint8_t bMute; +// int err = cellSysutilAvc2GetVoiceMuting(&bMute); +// assert(err == CELL_OK); +// return bMute; +// } +// return false; +} + + +bool SonyVoiceChatParty_Orbis::isTalking( const PlayerUID& memberUID) +{ + MemberInfo* pInfo = m_partyInfo.getMember(memberUID); + if(pInfo) + { + DWORD currTime = GetTickCount(); + DWORD timeElapsed = currTime - pInfo->m_lastTimeTalking; + return (timeElapsed < 1000); + } + assert(0 && "Didn't find playerUID"); // + return false; +} + + + + +void SonyVoiceChatParty_Orbis::partyRoomEventHandler(SceNpPartyRoomEventType eventType, const void* data, void* userdata) +{ + + switch(eventType) + { + case SCE_NP_PARTY_ROOM_EVENT_JOINED: + { + // local player joined party + app.DebugPrintf("SCE_NP_PARTY_ROOM_EVENT_JOINED\n"); + SceNpPartyJoinedInfo* pPartyJoinedInfo = (SceNpPartyJoinedInfo*) data; + + m_partyInfo.clear(); + app.DebugPrintf("Local user joined party.\n"); + for(int i=0; imemberNum;i++) + { + m_partyInfo.addMember(pPartyJoinedInfo->memberIds[i], pPartyJoinedInfo->members[i], false, false); + app.DebugPrintf("Member room ID : %d - Member PSN ID : %s\n", pPartyJoinedInfo->memberIds[i], pPartyJoinedInfo->members[i].handle.data); + } + } + break; + + case SCE_NP_PARTY_ROOM_EVENT_MEMBER_JOINED: + { + // remote player joined party + app.DebugPrintf("SCE_NP_PARTY_ROOM_EVENT_MEMBER_JOINED\n"); + SceNpPartyMemberInfo *pNewPartyMemberInfo = (SceNpPartyMemberInfo*) data; + app.DebugPrintf("A remote player[%s] has a joined the party.\n",pNewPartyMemberInfo->npId.handle.data); + + m_partyInfo.addMember(pNewPartyMemberInfo->memberId, pNewPartyMemberInfo->npId, pNewPartyMemberInfo->memberFlags & SCE_NP_PARTY_MEMBER_FLAG_IS_LOCAL, pNewPartyMemberInfo->memberFlags & SCE_NP_PARTY_MEMBER_FLAG_IS_PARTY_LEADER); + } + break; + + case SCE_NP_PARTY_ROOM_EVENT_MEMBER_LEFT: + { + // remote player left party + app.DebugPrintf("SCE_NP_PARTY_ROOM_EVENT_MEMBER_LEFT\n"); + SceNpPartyMemberInfo *pLeavingPartyMemberInfo = (SceNpPartyMemberInfo*) data; + app.DebugPrintf("A remote player[%s] has left the party.\n", pLeavingPartyMemberInfo->npId.handle.data); + m_partyInfo.removeMember(pLeavingPartyMemberInfo->memberId); + } + break; + + case SCE_NP_PARTY_ROOM_EVENT_LEFT: + { + // local player left party + app.DebugPrintf("SCE_NP_PARTY_ROOM_EVENT_LEFT\n"); + SceNpPartyRoomLeftInfo *pLeftInfo = (SceNpPartyRoomLeftInfo*)data; + printf("Local party member[%s] id:%d has left the party. Reason[%d]\n", pLeftInfo->npId.handle.data, pLeftInfo->memberId, pLeftInfo->reason); + m_partyInfo.removeMember(pLeftInfo->memberId); + } + break; + + case SCE_NP_PARTY_ROOM_EVENT_CREATE_RESPONSE: + { + app.DebugPrintf("SCE_NP_PARTY_ROOM_EVENT_CREATE_RESPONSE\n"); + SceNpPartyCreateResponseInfo *pCreateResponseInfo = (SceNpPartyCreateResponseInfo*) data; + + switch( pCreateResponseInfo->status ) + { + case SCE_NP_PARTY_ROOM_CREATE_RESPONSE_STATUS_OK: + app.DebugPrintf( "Local party member userId[0x%x] response for creating a party. Status = SCE_NP_PARTY_ROOM_CREATE_RESPONSE_STATUS_OK\n" , pCreateResponseInfo->userId ); + break; + case SCE_NP_PARTY_ROOM_CREATE_RESPONSE_STATUS_CANCELLED: + app.DebugPrintf( "Local party member userId[0x%x] response for creating a party. Status = SCE_NP_PARTY_ROOM_CREATE_RESPONSE_STATUS_CANCELLED\n" , pCreateResponseInfo->userId ); + break; + default: + app.DebugPrintf( "Warning: Unknown SceNpPartyCreateResponseStatus [%d]. Ignore.\n", pCreateResponseInfo->status ); + break; + } + } + break; + + case SCE_NP_PARTY_ROOM_EVENT_SHOW_INVITATION_RESPONSE: + { + app.DebugPrintf("SCE_NP_PARTY_ROOM_EVENT_SHOW_INVITATION_RESPONSE\n"); + SceNpPartyShowInvitationResponseInfo *pShowInvitationResponseInfo = (SceNpPartyShowInvitationResponseInfo*) data; + + switch( pShowInvitationResponseInfo->status ) + { + case SCE_NP_PARTY_ROOM_SHOW_INVITATION_RESPONSE_STATUS_OK: + app.DebugPrintf( "Local party member userId[0x%x] response for sending an invitation/suggestion. Status = SCE_NP_PARTY_ROOM_SHOW_INVITATION_RESPONSE_STATUS_OK\n" , pShowInvitationResponseInfo->userId ); + break; + case SCE_NP_PARTY_ROOM_SHOW_INVITATION_RESPONSE_STATUS_CANCELLED: + app.DebugPrintf( "Local party member userId[0x%x] response for sending an invitation/suggestion. Status = SCE_NP_PARTY_ROOM_SHOW_INVITATION_RESPONSE_STATUS_CANCELLED\n" , pShowInvitationResponseInfo->userId ); + break; + default: + app.DebugPrintf( "Warning: Unknown SceNpPartyShowInvitationResponseStatus [%d]. Ignore.\n", pShowInvitationResponseInfo->status ); + break; + } + } + break; + + default: + { + app.DebugPrintf( "Warning: Un-handled party event[%d]. Ignore.\n", eventType ); + } + break; + + } + +} + + + +void SonyVoiceChatParty_Orbis::partyVoiceEventHandler( const SceNpPartyMemberVoiceInfo* memberVoiceInfo, void* userdata ) +{ + + switch(memberVoiceInfo->memberVoiceState) + { + case SCE_NP_PARTY_MEMBER_VOICE_STATE_DISCONNECTED: + { + app.DebugPrintf("SCE_NP_PARTY_MEMBER_VOICE_STATE_DISCONNECTED\n"); + MemberInfo* pInfo = m_partyInfo.getMember(memberVoiceInfo->memberId); + assert(pInfo); + if(pInfo) + pInfo->m_voiceConnected = false; + } + break; + case SCE_NP_PARTY_MEMBER_VOICE_STATE_CONNECTED: + { + app.DebugPrintf("SCE_NP_PARTY_MEMBER_VOICE_STATE_CONNECTED\n"); + MemberInfo* pInfo = m_partyInfo.getMember(memberVoiceInfo->memberId); + assert(pInfo); + if(pInfo) + pInfo->m_voiceConnected = true; + } + break; + case SCE_NP_PARTY_MEMBER_VOICE_STATE_TALKING: + { + app.DebugPrintf("SCE_NP_PARTY_MEMBER_VOICE_STATE_TALKING\n"); + MemberInfo* pInfo = m_partyInfo.getMember(memberVoiceInfo->memberId); + assert(pInfo); + if(pInfo) + { + pInfo->m_voiceMuted = false; + pInfo->m_lastTimeTalking = GetTickCount(); + } + } + break; + case SCE_NP_PARTY_MEMBER_VOICE_STATE_MUTED: + { + app.DebugPrintf("SCE_NP_PARTY_MEMBER_VOICE_STATE_MUTED\n"); + MemberInfo* pInfo = m_partyInfo.getMember(memberVoiceInfo->memberId); + assert(pInfo); + if(pInfo) + pInfo->m_voiceMuted = true; + } + break; + case SCE_NP_PARTY_MEMBER_VOICE_STATE_UNKNOWN: + { + app.DebugPrintf("SCE_NP_PARTY_MEMBER_VOICE_STATE_UNKNOWN\n"); + } + break; + default: + { + app.DebugPrintf("Warning: Un-handled voice event. Ignore.\n"); + } + break; + } +} + + +void SonyVoiceChatParty_Orbis::partyBinaryMessageEventHandler( SceNpPartyBinaryMessageEvent event, + const void *data, + void * userdata + ) +{ + switch(event) + { + case SCE_NP_PARTY_BINARY_MESSAGE_EVENT_READY: + case SCE_NP_PARTY_BINARY_MESSAGE_EVENT_DATA: + case SCE_NP_PARTY_BINARY_MESSAGE_EVENT_COMPATIBILITY: + default: +// app.DebugPrintf("partyBinaryMessageEventHandler not supported"); +// assert(0); + break; + } +} -- cgit v1.2.3