#pragma once #include #include #include #include #include #include #include #include "p2p.h" #include "rbx/threadsafe.h" #include "VoiceChatBase.h" using namespace Microsoft::Xbox::Services; namespace RBX { struct VoicePacket : public Xp2p::PacketHeader { unsigned int getDataSize() { return size - sizeof(Xp2p::PacketHeader); } unsigned char data[Xp2p::PacketStorage::MaxPayloadSize]; }; struct ControlVoicePacket : public Xp2p::PacketHeader { uint8 subscribe; }; class VoiceChatMaxNet : public boost::enable_shared_from_this, public VoiceChatBase { private: VoiceChatMaxNet(Microsoft::Xbox::Services::Multiplayer::MultiplayerSessionMember^ currentUser, XboxLiveContext^ xboxLiveContext); public: static boost::shared_ptr create(Microsoft::Xbox::Services::Multiplayer::MultiplayerSessionMember^ currentUser, XboxLiveContext^ xboxLiveContext) { boost::shared_ptr sp(new VoiceChatMaxNet(currentUser, xboxLiveContext)); sp->init(); return sp; } virtual ~VoiceChatMaxNet(); typedef Platform::Box ConsoleId; typedef Platform::Box TalkingState; // local user void headsetConnected(Windows::Xbox::System::User^ user); virtual void addLocalUserToChannel(uint8 channelIndex, Windows::Xbox::System::User^ user); virtual void removeLocalUserFromChannel(); // remote users virtual void addConnections(Windows::Foundation::Collections::IVectorView^ members); virtual void removeConnections(Windows::Foundation::Collections::IVectorView^ members); // remote users virtual void multiplayerUserAdded(Microsoft::Xbox::Services::Multiplayer::MultiplayerSessionMember^ member); virtual void multiplayerUserRemoved(Microsoft::Xbox::Services::Multiplayer::MultiplayerSessionMember^ member); // receive/send void onOutgoingChatPacketReady(Microsoft::Xbox::GameChat::ChatPacketEventArgs^ args); void onDebugMessageReceived(Microsoft::Xbox::GameChat::DebugMessageEventArgs^ args); // muting virtual void setMuteState(bool muted, Microsoft::Xbox::GameChat::ChatUser^ chatUser); virtual unsigned getMuteState(unsigned memberId); virtual void muteAll(); virtual void unmuteAll(); virtual void muteUser(unsigned memberId); virtual void unmuteUser(unsigned memberId); virtual void updateMember(unsigned memberId, float distance, TalkingDelta* talkingDeltaOut); void receive(); void sendVoiceControlPacket(Xp2p::PeerPtr peer, bool subscribe); void unsubscribeToChatMessages_NoLock(); void subscribeToChatMessages_NoLock(); void handleNewRemoteConnection(ConsoleId^ consoleId); private: enum PacketType { PacketType_VoicePacket = 1, PacketType_ControlPacket = 2 }; void init(); void removeLocalUserFromChannel_NoLock(); Microsoft::Xbox::GameChat::ChatUser^ getUserByMemberId(unsigned id); Microsoft::Xbox::GameChat::ChatManager^ chatManager; int currentChannel; Windows::Xbox::System::User^ currentUser; void sendData(Xp2p::PeerPtr peer, Windows::Storage::Streams::IBuffer^ buffer, unsigned int flags); boost::scoped_ptr network; XboxLiveContext^ xbLiveContext; RBX::mutex channelsLock; RBX::mutex peersLock; RBX::mutex subscribedPeersLock; boost::unordered_map peers; boost::unordered_set subscibedPeers; Windows::Foundation::EventRegistrationToken onDebugMessageEvtToken; Windows::Foundation::EventRegistrationToken onOutgoingChatPacketReadyEvtToken; Windows::Foundation::EventRegistrationToken onCompareUniqueConsoleIdentifiersEvtToken; Windows::Foundation::EventRegistrationToken onResourceAvailabilityChangedEvtToken; Windows::Foundation::EventRegistrationToken onAudioAdded; Windows::Foundation::EventRegistrationToken onAudioRemoved; }; }