Skip to main content
Version: 2.x

UOdinSubsystem

A subsystem for managing rooms, encoders, and decoders in Odin.

Provides global access to Odin-related operations including room registration, audio data processing, and encoder/decoder management. This class extends UEngineSubsystem to tie its lifecycle to the engine's initialization and deinitialization.

Declaration
UCLASS()
class ODIN_API UOdinSubsystem : public UEngineSubsystem
  • Header: #include "OdinSubsystem.h"
  • Module: Odin
  • Inherits from: UEngineSubsystem
  • Blueprint: Reflected (UCLASS)

Overview​

Functions​

NameDescription
Get
GlobalIsRoomValid
OnWorldBeginTearDownRooms owned by a world that is torn down would be garbage collected without ever leaving gracefully, and their peer left events would reach nobody.
LinkEncoder
UnlinkEncoder
PushAudioToEncoder
GetRoomsForEncoder
RegisterEncoder
DeregisterEncoder
GetEncoderByHandleResolves the owning encoder UObject for a native handle.
GetEncoderRegistrationIdRegistration id of the handle's current registry entry, 0 if not registered.
GetEncoderByRegistrationResolves the owning encoder UObject only if the handle is still registered under the given registration id, so deferred events for a freed handle cannot reach a new encoder that happens to reuse the same handle value.
RegisterRoom
DeregisterRoom
SwapRoomHandle
GetRoomByHandle
GetDecoderByHandle
GetRoomsByName
IsRoomRegistered
LinkDecoderToPeer
RegisterDecoderObject
DeregisterDecoder
GetDecoderHandlesFor
GetDecodersFor
GetAllDecoderHandlesByPeer
GetAllDecodersByPeer
HandleDatagram

Functions​

Get​

Static

static UOdinSubsystem* Get();

Returns UOdinSubsystem*

GlobalIsRoomValid​

Static

static bool GlobalIsRoomValid(const OdinRoom* Handle);
ParameterTypeDescription
Handleconst OdinRoom*

Returns bool

OnWorldBeginTearDown​

Rooms owned by a world that is torn down would be garbage collected without ever leaving gracefully, and their peer left events would reach nobody. Reports the announced peers of every registered room of that world as left while its actors are still alive and starts a graceful close, so our own peer leaves the server before the world goes away.

void OnWorldBeginTearDown(UWorld* World);
ParameterTypeDescription
WorldUWorld*

LinkEncoder​

void LinkEncoder(TWeakObjectPtr<UOdinEncoder> Encoder, TWeakObjectPtr<UOdinRoom> TargetRoom);
ParameterTypeDescription
EncoderTWeakObjectPtr<UOdinEncoder>
TargetRoomTWeakObjectPtr<UOdinRoom>

UnlinkEncoder​

Overload 1

void UnlinkEncoder(TWeakObjectPtr<UOdinEncoder> Encoder);
ParameterTypeDescription
EncoderTWeakObjectPtr<UOdinEncoder>

Overload 2

void UnlinkEncoder(OdinEncoder* Encoder);
ParameterTypeDescription
EncoderOdinEncoder*

PushAudioToEncoder​

void PushAudioToEncoder(OdinEncoder* Encoder, TArray<float>&& Audio);
ParameterTypeDescription
EncoderOdinEncoder*
AudioTArray<float>&&

GetRoomsForEncoder​

Const

TArray<TWeakObjectPtr<UOdinRoom>> GetRoomsForEncoder(OdinEncoder* Encoder) const;
ParameterTypeDescription
EncoderOdinEncoder*

Returns TArray<TWeakObjectPtr<UOdinRoom>>

RegisterEncoder​

void RegisterEncoder(OdinEncoder* Handle, UOdinEncoder* Encoder);
ParameterTypeDescription
HandleOdinEncoder*
EncoderUOdinEncoder*

DeregisterEncoder​

void DeregisterEncoder(OdinEncoder* Handle);
ParameterTypeDescription
HandleOdinEncoder*

GetEncoderByHandle​

Const

Resolves the owning encoder UObject for a native handle. Used by native callbacks that may only carry the handle across threads and resolve the UObject on the game thread.

TWeakObjectPtr<UOdinEncoder> GetEncoderByHandle(OdinEncoder* Handle) const;
ParameterTypeDescription
HandleOdinEncoder*

Returns TWeakObjectPtr<UOdinEncoder>

GetEncoderRegistrationId​

Const

Registration id of the handle's current registry entry, 0 if not registered. Safe to call from any thread; only registry data is touched, no UObjects.

uint64 GetEncoderRegistrationId(OdinEncoder* Handle) const;
ParameterTypeDescription
HandleOdinEncoder*

Returns uint64

GetEncoderByRegistration​

Const

Resolves the owning encoder UObject only if the handle is still registered under the given registration id, so deferred events for a freed handle cannot reach a new encoder that happens to reuse the same handle value.

TWeakObjectPtr<UOdinEncoder> GetEncoderByRegistration(OdinEncoder* Handle, uint64 RegistrationId) const;
ParameterTypeDescription
HandleOdinEncoder*
RegistrationIduint64

Returns TWeakObjectPtr<UOdinEncoder>

RegisterRoom​

void RegisterRoom(OdinRoom* Handle, UOdinRoom* Room);
ParameterTypeDescription
HandleOdinRoom*
RoomUOdinRoom*

DeregisterRoom​

void DeregisterRoom(OdinRoom* Handle);
ParameterTypeDescription
HandleOdinRoom*

SwapRoomHandle​

void SwapRoomHandle(OdinRoom* OldHandle, OdinRoom* NewHandle);
ParameterTypeDescription
OldHandleOdinRoom*
NewHandleOdinRoom*

GetRoomByHandle​

Const

TWeakObjectPtr<UOdinRoom> GetRoomByHandle(OdinRoom* Handle) const;
ParameterTypeDescription
HandleOdinRoom*

Returns TWeakObjectPtr<UOdinRoom>

GetDecoderByHandle​

Const

TWeakObjectPtr<UOdinDecoder> GetDecoderByHandle(OdinDecoder* Handle) const;
ParameterTypeDescription
HandleOdinDecoder*

Returns TWeakObjectPtr<UOdinDecoder>

GetRoomsByName​

Const

TArray<TWeakObjectPtr<UOdinRoom>> GetRoomsByName(const FString& RoomId) const;
ParameterTypeDescription
RoomIdconst FString&

Returns TArray<TWeakObjectPtr<UOdinRoom>>

IsRoomRegistered​

Const

bool IsRoomRegistered(const OdinRoom* Handle) const;
ParameterTypeDescription
Handleconst OdinRoom*

Returns bool

LinkDecoderToPeer​

void LinkDecoderToPeer(const UOdinDecoder* Decoder, OdinRoom* TargetRoom, uint32 PeerId);
ParameterTypeDescription
Decoderconst UOdinDecoder*
TargetRoomOdinRoom*
PeerIduint32

RegisterDecoderObject​

void RegisterDecoderObject(const TWeakObjectPtr<UOdinDecoder> Decoder);
ParameterTypeDescription
Decoderconst TWeakObjectPtr<UOdinDecoder>

DeregisterDecoder​

Overload 1

void DeregisterDecoder(const UOdinDecoder* OdinDecoder);
ParameterTypeDescription
OdinDecoderconst UOdinDecoder*

Overload 2

void DeregisterDecoder(const OdinDecoder* Handle);
ParameterTypeDescription
Handleconst OdinDecoder*

GetDecoderHandlesFor​

Overload 1

Const

TArray<OdinDecoder*> GetDecoderHandlesFor(OdinRoom* TargetRoom, uint32 PeerId) const;
ParameterTypeDescription
TargetRoomOdinRoom*
PeerIduint32

Returns TArray<OdinDecoder*>

Overload 2

Const

TArray<OdinDecoder*> GetDecoderHandlesFor(OdinRoom* TargetRoom, uint32 PeerId, uint64 ChannelMask) const;
ParameterTypeDescription
TargetRoomOdinRoom*
PeerIduint32
ChannelMaskuint64

Returns TArray<OdinDecoder*>

GetDecodersFor​

Overload 1

Const

TArray<UOdinDecoder*> GetDecodersFor(OdinRoom* TargetRoom, uint32 PeerId) const;
ParameterTypeDescription
TargetRoomOdinRoom*
PeerIduint32

Returns TArray<UOdinDecoder*>

Overload 2

Const

TArray<UOdinDecoder*> GetDecodersFor(OdinRoom* TargetRoom, uint32 PeerId, uint64 ChannelMask) const;
ParameterTypeDescription
TargetRoomOdinRoom*
PeerIduint32
ChannelMaskuint64

Returns TArray<UOdinDecoder*>

GetAllDecoderHandlesByPeer​

Const

TArray<OdinDecoder*> GetAllDecoderHandlesByPeer(uint32 PeerId) const;
ParameterTypeDescription
PeerIduint32

Returns TArray<OdinDecoder*>

GetAllDecodersByPeer​

Const

TArray<UOdinDecoder*> GetAllDecodersByPeer(uint32 PeerId) const;
ParameterTypeDescription
PeerIduint32

Returns TArray<UOdinDecoder*>

HandleDatagram​

void HandleDatagram(
OdinRoom* RoomHandle,
uint32 PeerId,
uint64 ChannelMask,
uint32 SsrcId,
TArray<uint8>&& Datagram);
ParameterTypeDescription
RoomHandleOdinRoom*
PeerIduint32
ChannelMaskuint64
SsrcIduint32
DatagramTArray<uint8>&&