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")
};
| State | Description | What You Can Do |
|---|
Idle | No recording active, ready to start | Start recording, change settings |
Recording | Actively recording video/audio | Stop recording, pause, take photo |
Saving | Finalizing and saving file to disk | Wait for completion |
Processing | Post-processing video (rare) | Wait for completion |
Error | An error occurred | Check error message, retry |
Paused | Recording 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)
};
| Quality | Resolution | Video Bitrate | Audio Bitrate | FPS | Use Case |
|---|
SD | 1280×720 | 4 Mbps | 128 Kbps | 30 | Mobile VR, performance mode |
HD | 1920×1080 | 8 Mbps | 256 Kbps | 30 | Standard quality (recommended) |
TWO_K | 2560×1440 | 12 Mbps | 256 Kbps | 30 | High quality |
FOUR_K | 3840×2160 | 20 Mbps | 320 Kbps | 30 | Maximum 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")
};
| Orientation | Aspect Ratio | Resolution Example | Use Case |
|---|
Landscape | 16:9 (horizontal) | 1920×1080 | YouTube, traditional video |
Portrait | 9:16 (vertical) | 1080×1920 | TikTok, 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
};
| Mode | Description | Use Case |
|---|
Selfie | Front/back facing camera attached to tablet | Vlog-style, show player’s face |
FirstPerson | POV from player’s HMD position | Gameplay perspective |
ThirdPerson | Orbital camera following player | Cinematic, 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")
};
| Value | Description |
|---|
Front | Camera faces toward player (like front camera on phone) |
Rear | Camera 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)
};
| Channel | Bit | Description | Sources |
|---|
None | 0 | No audio | - |
Game | 1 | Game audio output | UnrealAudio, FMOD, Wwise, Vivox (incoming) |
Microphone | 2 | Microphone input | UnrealAudio, Oboe, Vivox (outgoing) |
VoiceChat | 4 | Voice 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")
};
| State | Description | UI Action |
|---|
On | Microphone enabled and capturing | Show “Mic On” indicator |
Off | Microphone disabled | Show “Mic Off” indicator |
No_Access | Permission 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")
};
| Type | Description | Priority |
|---|
None | No game audio capture | - |
FMOD | FMOD Studio middleware | 1 (highest) |
Wwise | Audiokinetic Wwise middleware | 2 |
UnrealAudio | Built-in Unreal Engine audio | 3 (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
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")
};
| Type | Dimensions (cm) | Aspect | Use Case |
|---|
Square | (0.4, 2.4, 2.4) | 1:1 | Icons, single-action |
Rectangle | (0.4, 6.0, 2.4) | 2.5:1 | Text buttons, labels |
Tab | (0.4, 4.4, 2.4) | 1.83:1 | Tab navigation |
Selector | (2.4, 4.4, 0.8) | 5.5:1 | Sliders, selectors |
What it’s for: Button visual and interaction state
UENUM(BlueprintType)
enum class ELCKButtonState : uint8
{
Default,
Hovered,
Pressed,
Disabled
};
| State | Description | Visual |
|---|
Default | Normal idle state | Base color |
Hovered | Pointer/hand over button | Slightly brighter |
Pressed | Button is being pressed | Active color |
Disabled | Button is inactive | Grayed out |
State transitions:
Default ⇄ Hovered ⇄ Pressed
↕
Disabled
What it’s for: Touch validation direction for buttons
UENUM(BlueprintType)
enum class ELCKButtonInteractionDirection : uint8
{
Forward UMETA(DisplayName = "Forward"),
Up UMETA(DisplayName = "Up")
};
| Value | Description | Use Case |
|---|
Forward | Press from front of button | Standard VR interaction |
Up | Press from above button | Horizontal 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")
};
| Value | Description |
|---|
GameInitialized | Game has initialized the SDK |
ServiceCreated | LCK Service instance created |
ServiceDisposed | LCK Service instance disposed |
CameraEnabled | Camera capture enabled |
CameraDisabled | Camera capture disabled |
RecordingStarted | Recording started |
RecordingStopped | Recording stopped |
PhotoCaptured | Photo captured successfully |
PhotoCaptureError | Photo capture failed |
RecorderError | Recording error occurred |
SdkError | General SDK error |
Performance | Performance 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