What Problem Does This Solve?
Delegates let you react to LCK events in real-time:- Recording started/stopped
- Save progress updates
- Button interactions
- Camera mode changes
- Audio callbacks
When to Use This
Reference this when:- Building custom recording UI
- Handling recording lifecycle events
- Responding to user interactions
- Processing audio data
- Tracking save progress
Delegate Types
LCK uses two kinds of delegates:Recording Lifecycle Delegates
FOnRecordingSaveFinished
What it’s for: Know when recording save completesULCKService
Parameters:
Success(bool) — True if save succeeded, false on error
FOnRecordingSaveProgress
What it’s for: Update progress bar during saveULCKService
Parameters:
Progress(float) — Value from 0.0 (start) to 1.0 (complete)
FOnRecordingError
What it’s for: Handle recording errors with contextULCKService
Parameters:
ErrorMessage(FString) — Human-readable error descriptionErrorCode(int32) — Numeric error code (seeELCKError)
Camera & Settings Delegates
FOnTabletCameraModeChanged
What it’s for: React to camera mode switchesULCKTabletDataModel
Parameters:
UClass*— The new camera mode class (e.g.,ULCKSelfieCameraMode,ULCKFirstPersonCameraMode,ULCKThirdPersonCameraMode)
FOnMicStateChanged
What it’s for: Update UI when mic state changesULCKTabletDataModel
Parameters:
ELCKMicState— New microphone state (On, Off, No_Access)
FOnVideoQualityChanged
What it’s for: React to quality profile changesULCKTabletDataModel
Usage:
FOnRecordStateChange
What it’s for: React to recording state changes on the DataModelULCKTabletDataModel
Usage:
FOnScreenOrientationChanged
What it’s for: React to screen orientation changesULCKTabletDataModel
Usage:
UI Interaction Delegates
FOnTapStarted
What it’s for: Handle button pressesLCK buttons include automatic 0.25s cooldown. Don’t add your own debouncing.
FOnStepperValueChanged
What it’s for: Handle stepper control changes (increment/decrement buttons)NewValue(int8) — Direction: -1 (decrease) or +1 (increase)
FOnPad2DChanged
What it’s for: Handle 2D directional pad inputNewValue(FIntPoint) — Direction as (X, Y) where values are -1, 0, or +1
Audio Delegates
FOnRenderAudioDelegate
What it’s for: Process raw audio data from audio sourcesPCM(TArrayView<const float>) — Interleaved audio samples (32-bit float)Channels(int32) — Number of channels (typically 2 for stereo)SampleRate(int32) — Audio sample rate in Hz (typically 48000)Source(ELCKAudioChannel) — Audio source type (Game, Microphone, VoiceChat)
Async Operation Delegates
FOnLCKRecorderBoolResult
What it’s for: Handle async operation resultsFOnLCKRecorderProgress
What it’s for: Track save/encoding progressBinding Patterns
Dynamic Delegates (Blueprint-Compatible)
Used forFOnRecordingSaveFinished, FOnRecordingSaveProgress, FOnRecordingError, and UI delegates like FOnTapStarted.
Non-Dynamic Multicast (C++ Only)
Used for DataModel delegates likeFOnTabletCameraModeChanged, FOnMicStateChanged, FOnVideoQualityChanged, FOnRecordStateChange.
Lambda Binding (C++ Only)
Removing Bindings
Complete Example: Recording UI
Key Takeaways
Use delegates for events — Don’t poll state every frame
Dynamic vs non-dynamic matters — DataModel delegates use AddUObject/AddLambda, Service delegates use AddDynamic
Audio delegates are SINGLE — Use BindLambda, not AddLambda
Thread safety matters — Audio callbacks may come from any thread
Remove bindings on cleanup — Prevent dangling pointers
Dynamic delegates for Blueprint — Use UFUNCTION handlers with AddDynamic
Related
- Error Codes — Error handling patterns
- Service Interface — ULCKService API reference
- Architecture — How delegates flow through the system