Kawe Mazidjatari b3a68ed095 Add EABase, EAThread and DirtySDK to R5sdk
DirtySDK (EA's Dirty Sockets library) will be used for the LiveAPI implementation, and depends on: EABase, EAThread.
2024-04-05 18:29:03 +02:00

163 lines
6.8 KiB
C

/*H********************************************************************************/
/*!
\File voippacket.h
\Description
VoIP data packet definitions.
\Copyright
Copyright (c) Electronic Arts 2004. ALL RIGHTS RESERVED.
\Version 1.0 03/17/2004 (jbrookes) First Version
*/
/********************************************************************************H*/
#ifndef _voippacket_h
#define _voippacket_h
/*** Include files ****************************************************************/
#include "DirtySDK/dirtysock/dirtynet.h"
/*** Defines **********************************************************************/
//! maximum voice payload size
#define VOIP_MAXMICRPKTSIZE (SOCKET_MAXUDPRECV - sizeof(VoipPacketHeadT) - sizeof(VoipMicrInfoT))
//! maximum ping payload size
#define VOIP_MAXPINGPKTSIZE (SOCKET_MAXUDPRECV - sizeof(VoipPacketHeadT) - 4 /* aRemoteClientId */ - 4 /* aChannelUserIndices */)
//! VoIP Flags bit field included in VoIP packets
#define VOIP_PACKET_STATUS_FLAG_METADATA (1) //!< packet contains platform-specific metadata (unreliable)
#define VOIP_PACKET_STATUS_FLAG_STT (2) //!< at least one user on the originating side as requested transcribed text to be sent (Speech-to-text accessibility feature)
#define VOIP_PACKET_RELIABLE_FLAG_ACK_ACKCNF (32) //!< packet contains ACK+ACKCNF protocol components (reliability mechanism)
#define VOIP_PACKET_RELIABLE_FLAG_DATA (64) //!< packet contains DATA protocol component (reliability mechanism)
//! range of supported reliable data types
#define VOIP_RELIABLE_TYPE_USERADD (0) //!< reliable data contains newly added local user on the originating console (used for voip join-in-progress)
#define VOIP_RELIABLE_TYPE_USERREM (1) //!< reliable data contains newly removed local user on the originating console (used for voip leave-in-progress)
#define VOIP_RELIABLE_TYPE_OPAQUE (2) //!< reliable data contains platform-specific data blob that needs to be transmitted reliably
#define VOIP_RELIABLE_TYPE_TEXT (3) //!< reliable data contains transcribed text (Speech-to-Text) that needs to be sent reliably
//! mask used to manipulate ACKCNF bit for uAckedSeq field of ReliableAckT type
#define VOIP_RELIABLE_ACKCNF_MASK (0x80)
/*** Macros ***********************************************************************/
/*** Type Definitions *************************************************************/
//! VoIP data packet header
typedef struct VoipPacketHeadT
{
uint8_t aType[3]; //!< type/version info
uint8_t uFlags; //!< flags
uint8_t aClientId[4]; //!< source clientId
uint8_t aSessionId[4]; //!< session ID
uint8_t aHeadsetStat[2]; //!< headset status bitfield (1 bit per local user)
} VoipPacketHeadT;
//! VoIP channel config
typedef struct VoipPacketChanT
{
uint8_t aChannelId[4]; //!< packet channelId
} VoipPacketChanT;
//! VoIP user packet
typedef struct VoipUserPacketT
{
uint8_t aAccountId[8]; //!< the nucleus account id (unique per account)
uint8_t aPersonaId[8]; //!< the nucleus persona id (globally unique)
uint8_t aFlags[4]; //!< a bit field contaning VOIPUSER_FLAG_*
uint8_t aPlatform[4]; //!< what platform is this user running on
} VoipUserPacketT;
//! VoIP connection packet
typedef struct VoipConnPacketT
{
VoipPacketHeadT Head;
uint8_t aRemoteClientId[4];
uint8_t bConnected;
uint8_t uNumLocalUsers; // this is the max number of users including the extended user
VoipUserPacketT LocalUsers[32];
} VoipConnPacketT;
//! VoIP ping packet
typedef struct VoipPingPacketT
{
VoipPacketHeadT Head;
uint8_t aRemoteClientId[4];
uint8_t aChannelUserIndices[4]; //!< a bitset that corresponds to the user indices for the channel data in aData
uint8_t aData[VOIP_MAXPINGPKTSIZE]; //!< ping packet data (this is where piggy-backed channel & reliable data is added when needed)
} VoipPingPacketT;
//! VoIP disc packet
typedef struct VoipDiscPacketT
{
VoipPacketHeadT Head;
uint8_t aRemoteClientId[4];
} VoipDiscPacketT;
//! VoIP micr packet info
typedef struct VoipMicrInfoT
{
uint8_t aSendMask[4]; //!< lsb->msb, one bit per user, used for voip server
VoipPacketChanT channels; //!< packet channelId
uint8_t uSeqn; //!< voice packet sequence number
uint8_t uNumSubPackets; //!< current number of sub-packets packed in this packet
uint8_t uSubPacketSize; //!< size of sub-packets (same fixed-size for all sub-packets)
uint8_t uUserIndex; //!< index of user that generated all the sub-packets in this packet
} VoipMicrInfoT;
//! VoIP data packet
typedef struct VoipMicrPacketT
{
VoipPacketHeadT Head; //!< packet header
VoipMicrInfoT MicrInfo; //!< micr packet info
uint8_t aData[VOIP_MAXMICRPKTSIZE]; //!< voice packet data (this is where sub-packets are bundled)
} VoipMicrPacketT;
//! VoipPacketBufferT: a buffer that can(does) contain any type of voip packet
typedef union VoipPacketBufferT
{
VoipPacketHeadT VoipPacketHead;
VoipConnPacketT VoipConnPacket;
VoipPingPacketT VoipPingPacket;
VoipDiscPacketT VoipDiscPacket;
VoipMicrPacketT VoipMicrPacket;
} VoipPacketBufferT;
//! reliable data info
typedef struct ReliableDataInfoT
{
uint8_t aRemoteClientId[4]; //!< remote peer to which this data entry is for (required for 1x send to voipserver)
uint8_t uSeq; //!< sequence number
uint8_t uType; //!< type (VOIP_RELIABLE_TYPE_*)
uint8_t uSize[2]; //!< size of payload
} ReliableDataInfoT;
//! reliable mechanism - ack entry
typedef struct ReliableAckT
{
uint8_t aRemoteClientId[4]; //!< remote peer to which this ack entry is for
uint8_t uAckedSeq; //!< bit 7 = ACKCNF flag; bit 0 to 6 = [1,127] seq number (seq nb 0 is invalid - used when only the ACKCNF portion is valid)
} ReliableAckT;
//! maximum size of a single reliable data entry (in bytes) is what can fit in a PING packet (taking into account that there can be up to 32 ReliableAckT entries before it)
//! assumption: very large reliable data entries may not fit in MIC packets (because of prefixed metadata) but will eventually be sent over a PING packet.
#define VOIP_MAXRELIABLEDATA (VOIP_MAXPINGPKTSIZE - (VOIP_MAXCONNECT * sizeof(ReliableAckT)))
//! reliable mechanism - data entry
typedef struct ReliableDataT
{
ReliableDataInfoT info;
uint8_t aData[VOIP_MAXRELIABLEDATA];
} ReliableDataT;
/*** Variables ********************************************************************/
/*** Functions ********************************************************************/
#endif // _voippacket_h