mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
DirtySDK (EA's Dirty Sockets library) will be used for the LiveAPI implementation, and depends on: EABase, EAThread.
163 lines
6.8 KiB
C
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
|
|
|