Skip to main content

What Problem Does This Solve?

Enums define fixed sets of values used throughout LCK:
  • Recording states (Idle, Recording, Saving)
  • Video quality presets (SD, HD, 2K, 4K)
  • Audio channel types (Game, Microphone, VoiceChat)
  • Camera modes (Selfie, FirstPerson, ThirdPerson)
  • UI states (Default, Hovered, Pressed)
Understanding these enums helps you check states, configure settings, and handle events correctly.

When to Use This

Reference this when:
  • Checking recording state
  • Setting video quality
  • Configuring audio channels
  • Switching camera modes
  • Handling UI interactions
  • Debugging enum-related issues

Recording & Capture

ELCKRecordingState

What it’s for: Current state of the recording system
UENUM(BlueprintType)
enum class ELCKRecordingState : uint8
{
    Idle        UMETA(DisplayName = "Idle"),
    Recording   UMETA(DisplayName = "Recording"),
    Saving      UMETA(DisplayName = "Saving"),
    Processing  UMETA(DisplayName = "Processing"),
    Error       UMETA(DisplayName = "Error"),
    Paused      UMETA(DisplayName = "Paused")
};
StateDescriptionWhat You Can Do
IdleNo recording active, ready to startStart recording, change settings
RecordingActively recording video/audioStop recording, pause, take photo
SavingFinalizing and saving file to diskWait for completion
ProcessingPost-processing video (rare)Wait for completion
ErrorAn error occurredCheck error message, retry
PausedRecording paused (not implemented)Resume or stop
State machine flow:
Idle → Recording → Saving → Idle
         ↓                    ↑
       Error ──────────────────┘
Common usage:
ELCKRecordingState State = DataModel->GetRecordingState();

switch (State)
{
    case ELCKRecordingState::Idle:
        // Show "Start Recording" button
        break;
    case ELCKRecordingState::Recording:
        // Show recording indicator, enable "Stop" button
        break;
    case ELCKRecordingState::Saving:
        // Show progress bar
        break;
    case ELCKRecordingState::Error:
        // Show error message
        break;
}

ELCKVideoQuality

What it’s for: Predefined quality profile selection
UENUM(BlueprintType)
enum class ELCKVideoQuality : uint8
{
    SD      UMETA(DisplayName = "SD"),
    HD      UMETA(DisplayName = "HD"),
    TWO_K   UMETA(DisplayName = "2K"),
    FOUR_K  UMETA(DisplayName = "4K"),
    MAX     UMETA(Hidden)
};
QualityResolutionVideo BitrateAudio BitrateFPSUse Case
SD1280×7204 Mbps128 Kbps30Mobile VR, performance mode
HD1920×10808 Mbps256 Kbps30Standard quality (recommended)
TWO_K2560×144012 Mbps256 Kbps30High quality
FOUR_K3840×216020 Mbps320 Kbps30Maximum quality (PC only)
Quest recommendations:
  • Quest 2: Use HD (1080p) for best balance
  • Quest 3/Pro: Can handle 2K if performance allows
  • Avoid 4K on Quest devices
Usage:
// Set quality profile
Service->SetQualityProfile(ELCKVideoQuality::HD);

// Get current quality
ELCKVideoQuality Current = Service->GetCurrentQuality();

ELCKScreenOrientation

What it’s for: Video output orientation
UENUM(BlueprintType)
enum class ELCKScreenOrientation : uint8
{
    Landscape   UMETA(DisplayName = "Landscape"),
    Portrait    UMETA(DisplayName = "Portrait")
};
OrientationAspect RatioResolution ExampleUse Case
Landscape16:9 (horizontal)1920×1080YouTube, traditional video
Portrait9:16 (vertical)1080×1920TikTok, Instagram Stories
Usage:
// Set orientation
Service->SetOrientation(ELCKScreenOrientation::Portrait);

// Portrait for social media
if (bSharingToTikTok)
{
    Service->SetOrientation(ELCKScreenOrientation::Portrait);
}

Camera Modes

ELCKCameraMode

What it’s for: Select camera view mode
UENUM(BlueprintType)
enum class ELCKCameraMode : uint8
{
    Selfie,
    FirstPerson,
    ThirdPerson
};
ModeDescriptionUse Case
SelfieFront/back facing camera attached to tabletVlog-style, show player’s face
FirstPersonPOV from player’s HMD positionGameplay perspective
ThirdPersonOrbital camera following playerCinematic, show player character
Usage:
// Switch camera mode
Service->SetCameraMode(ELCKCameraMode::ThirdPerson);

// Blueprint-friendly helper
UFUNCTION(BlueprintCallable)
void SwitchToFirstPerson()
{
    Service->SetCameraMode(ELCKCameraMode::FirstPerson);
}

ELCKCameraFacing

What it’s for: Selfie camera direction
UENUM(BlueprintType)
enum class ELCKCameraFacing : uint8
{
    Front   UMETA(DisplayName = "Front"),
    Rear    UMETA(DisplayName = "Rear")
};
ValueDescription
FrontCamera faces toward player (like front camera on phone)
RearCamera faces away from player (like back camera on phone)
Only applies to Selfie mode.

Audio System

ELCKAudioChannel

What it’s for: Audio source types for capture and mixing
enum ELCKAudioChannel : uint64
{
    None       = 0,           // No audio
    Game       = 1,           // Game audio output
    Microphone = 1 << 1,      // Microphone input
    VoiceChat  = 1 << 2,      // Voice chat (Vivox)
    Max        = 1 << 3       // Marker (don't use)
};
ChannelBitDescriptionSources
None0No audio-
Game1Game audio outputUnrealAudio, FMOD, Wwise, Vivox (incoming)
Microphone2Microphone inputUnrealAudio, Oboe, Vivox (outgoing)
VoiceChat4Voice chat (reserved)Not currently used
LCKVivox mapping:
  • Incoming voice chat → Game channel
  • Outgoing microphone → Microphone channel
Bitwise operations:
// Combine channels
TLCKAudioChannelsMask Channels = 
    ELCKAudioChannel::Game | ELCKAudioChannel::Microphone;

// Check if channel is in mask
bool HasMic = (Channels & ELCKAudioChannel::Microphone) != 0;

// Remove a channel
Channels &= ~ELCKAudioChannel::Microphone;

// Add a channel
Channels |= ELCKAudioChannel::VoiceChat;

ELCKMicState

What it’s for: Microphone state for recording
UENUM(BlueprintType)
enum class ELCKMicState : uint8
{
    On          UMETA(DisplayName = "On"),
    Off         UMETA(DisplayName = "Off"),
    No_Access   UMETA(DisplayName = "No Access")
};
StateDescriptionUI Action
OnMicrophone enabled and capturingShow “Mic On” indicator
OffMicrophone disabledShow “Mic Off” indicator
No_AccessPermission denied (Android)Prompt user to grant permission
On Android, No_Access means the user denied microphone permission. You must guide them to device settings to grant the permission.
Usage:
ELCKMicState MicState = Service->GetMicrophoneState();

switch (MicState)
{
    case ELCKMicState::On:
        MicIcon->SetBrush(MicOnTexture);
        break;
    case ELCKMicState::Off:
        MicIcon->SetBrush(MicOffTexture);
        break;
    case ELCKMicState::No_Access:
        ShowPermissionPrompt();
        break;
}

ELCKGameAudioType

What it’s for: Detected game audio middleware
UENUM(BlueprintType)
enum class ELCKGameAudioType : uint8
{
    None        UMETA(DisplayName = "None"),
    FMOD        UMETA(DisplayName = "FMOD"),
    Wwise       UMETA(DisplayName = "Wwise"),
    UnrealAudio UMETA(DisplayName = "Unreal Audio")
};
TypeDescriptionPriority
NoneNo game audio capture-
FMODFMOD Studio middleware1 (highest)
WwiseAudiokinetic Wwise middleware2
UnrealAudioBuilt-in Unreal Engine audio3 (lowest)
Priority order: FMOD > Wwise > UnrealAudio
Only ONE game audio source is active at a time.
Usage:
// Check which audio middleware is active
ELCKGameAudioType ActiveAudio = Settings->GetActiveGameAudioType();

switch (ActiveAudio)
{
    case ELCKGameAudioType::FMOD:
        UE_LOG(LogLCK, Log, TEXT("Using FMOD for game audio"));
        break;
    case ELCKGameAudioType::Wwise:
        UE_LOG(LogLCK, Log, TEXT("Using Wwise for game audio"));
        break;
    case ELCKGameAudioType::UnrealAudio:
        UE_LOG(LogLCK, Log, TEXT("Using Unreal Audio"));
        break;
}

UI Components

ELCKButtonType

What it’s for: Button shape and size for 3D UI
UENUM(BlueprintType)
enum class ELCKButtonType : uint8
{
    Square      UMETA(DisplayName = "Square"),
    Rectangle   UMETA(DisplayName = "Rectangle"),
    Tab         UMETA(DisplayName = "Tab"),
    Selector    UMETA(DisplayName = "Selector")
};
TypeDimensions (cm)AspectUse Case
Square(0.4, 2.4, 2.4)1:1Icons, single-action
Rectangle(0.4, 6.0, 2.4)2.5:1Text buttons, labels
Tab(0.4, 4.4, 2.4)1.83:1Tab navigation
Selector(2.4, 4.4, 0.8)5.5:1Sliders, selectors

ELCKButtonState

What it’s for: Button visual and interaction state
UENUM(BlueprintType)
enum class ELCKButtonState : uint8
{
    Default,
    Hovered,
    Pressed,
    Disabled
};
StateDescriptionVisual
DefaultNormal idle stateBase color
HoveredPointer/hand over buttonSlightly brighter
PressedButton is being pressedActive color
DisabledButton is inactiveGrayed out
State transitions:
Default ⇄ Hovered ⇄ Pressed

Disabled

ELCKButtonInteractionDirection

What it’s for: Touch validation direction for buttons
UENUM(BlueprintType)
enum class ELCKButtonInteractionDirection : uint8
{
    Forward     UMETA(DisplayName = "Forward"),
    Up          UMETA(DisplayName = "Up")
};
ValueDescriptionUse Case
ForwardPress from front of buttonStandard VR interaction
UpPress from above buttonHorizontal surfaces (table-mounted)

Telemetry

ELCKTelemetryEventType

What it’s for: Analytics events sent to LCK Dashboard
UENUM(BlueprintType)
enum class ELCKTelemetryEventType : uint8
{
    GameInitialized   UMETA(DisplayName = "Game Initialized"),
    ServiceCreated    UMETA(DisplayName = "Service Created"),
    ServiceDisposed   UMETA(DisplayName = "Service Disposed"),
    CameraEnabled     UMETA(DisplayName = "Camera Enabled"),
    CameraDisabled    UMETA(DisplayName = "Camera Disabled"),
    RecordingStarted  UMETA(DisplayName = "Recording Started"),
    RecordingStopped  UMETA(DisplayName = "Recording Stopped"),
    PhotoCaptured     UMETA(DisplayName = "Photo Captured"),
    PhotoCaptureError UMETA(DisplayName = "Photo Capture Error"),
    RecorderError     UMETA(DisplayName = "Recorder Error"),
    SdkError          UMETA(DisplayName = "SDK Error"),
    Performance       UMETA(DisplayName = "Performance")
};
ValueDescription
GameInitializedGame has initialized the SDK
ServiceCreatedLCK Service instance created
ServiceDisposedLCK Service instance disposed
CameraEnabledCamera capture enabled
CameraDisabledCamera capture disabled
RecordingStartedRecording started
RecordingStoppedRecording stopped
PhotoCapturedPhoto captured successfully
PhotoCaptureErrorPhoto capture failed
RecorderErrorRecording error occurred
SdkErrorGeneral SDK error
PerformancePerformance metrics event
Telemetry is automatic. You don’t need to manually send these events unless building custom analytics.

Enum Comparison Examples

Quality Selection UI

void AQualitySelector::OnQualityButtonPressed(ELCKVideoQuality Quality)
{
    // Visual feedback
    switch (Quality)
    {
        case ELCKVideoQuality::SD:
            QualityLabel->SetText(FText::FromString("SD (720p)"));
            break;
        case ELCKVideoQuality::HD:
            QualityLabel->SetText(FText::FromString("HD (1080p)"));
            break;
        case ELCKVideoQuality::TWO_K:
            QualityLabel->SetText(FText::FromString("2K (1440p)"));
            break;
        case ELCKVideoQuality::FOUR_K:
            QualityLabel->SetText(FText::FromString("4K (2160p)"));
            break;
    }
    
    // Apply to service
    Service->SetQualityProfile(Quality);
}

Audio Channel Toggle

void AAudioControls::ToggleAudioChannel(ELCKAudioChannel Channel)
{
    TLCKAudioChannelsMask CurrentChannels = Service->GetActiveChannels();
    
    // Toggle the channel
    if (CurrentChannels & Channel)
    {
        // Channel is on, turn it off
        CurrentChannels &= ~Channel;
        UE_LOG(LogLCK, Log, TEXT("Disabled audio channel %d"), (int)Channel);
    }
    else
    {
        // Channel is off, turn it on
        CurrentChannels |= Channel;
        UE_LOG(LogLCK, Log, TEXT("Enabled audio channel %d"), (int)Channel);
    }
    
    Service->SetActiveChannels(CurrentChannels);
    UpdateUI();
}

Recording State Handler

void ARecordingUI::OnRecordingStateChanged(ELCKRecordingState NewState)
{
    switch (NewState)
    {
        case ELCKRecordingState::Idle:
            RecordButton->SetEnabled(true);
            RecordButton->SetText(FText::FromString("Start Recording"));
            ProgressBar->SetVisibility(ESlateVisibility::Collapsed);
            break;
            
        case ELCKRecordingState::Recording:
            RecordButton->SetEnabled(true);
            RecordButton->SetText(FText::FromString("Stop Recording"));
            RecordingIndicator->SetVisibility(ESlateVisibility::Visible);
            break;
            
        case ELCKRecordingState::Saving:
            RecordButton->SetEnabled(false);
            ProgressBar->SetVisibility(ESlateVisibility::Visible);
            StatusText->SetText(FText::FromString("Saving..."));
            break;
            
        case ELCKRecordingState::Error:
            RecordButton->SetEnabled(true);
            ShowErrorDialog(ErrorMessage);
            break;
    }
}

Key Takeaways

ELCKRecordingState — Track recording lifecycle (Idle → Recording → Saving)
ELCKVideoQuality — Predefined quality presets (SD, HD, 2K, 4K)
ELCKAudioChannel — Bitwise flags for audio sources (Game, Mic, VoiceChat)
ELCKCameraMode — Switch between Selfie, FirstPerson, ThirdPerson
ELCKMicState — Handle microphone on/off/no access