Skip to main content
Module: LCKOboe | Version: 1.0 | Platforms: Android only

Overview

LCKOboe provides high-performance, low-latency microphone capture on Android using Google’s Oboe audio library. It automatically selects the optimal audio API (AAudio on Android 8.1+, OpenSL ES on older versions).

Supported Channels

ChannelSupportedDescription
GameNoUse FMOD or Wwise for game audio
MicrophoneYesLow-latency microphone capture
VoiceChatNoUse LCKVivox for voice chat

Why Use LCKOboe?

Lower Latency

Significantly lower audio latency compared to Unreal’s audio capture

Optimal API

Automatically uses AAudio when available for best performance

VR Optimized

Designed for Meta Quest and other Android VR headsets

Battery Efficient

Efficient native implementation reduces power consumption

Dependencies

// Add to your .Build.cs
PublicDependencyModuleNames.AddRange(new string[] {
    "LCKOboe",
    "LCKAudio"
});

Requirements

  • Android 5.0+ (API 21+)
  • AAudio support recommended (Android 8.1+, API 27+)
  • RECORD_AUDIO permission

Permissions

Add to your AndroidManifest.xml:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

Source Implementation

FLCKOboeSource

The core audio source class that captures microphone input via Google Oboe:
class FLCKOboeSource : public ILCKAudioSource
{
public:
    FLCKOboeSource();
    ~FLCKOboeSource();

    bool StartCapture() noexcept override;
    bool StartCapture(TLCKAudioChannelsMask Channels) noexcept override;
    void StopCapture() noexcept override;
    const FString& GetSourceName() const noexcept override;
    float GetVolume() const noexcept override;

private:
    TUniquePtr<oboe::AudioStream> InputOboeStream;
    TSharedPtr<FLCKOboeCallback, ESPMode::ThreadSafe> OboeCallback;
};
MemberTypeDescription
InputOboeStreamTUniquePtr<oboe::AudioStream>The Oboe audio stream for microphone capture
OboeCallbackTSharedPtr<FLCKOboeCallback, ESPMode::ThreadSafe>Thread-safe audio data callback handler

FLCKOboeCallback

Implements the Oboe audio stream callback interface. When Oboe delivers microphone samples, FLCKOboeCallback converts the data to 32-bit float PCM and fires OnAudioDataDelegate with ELCKAudioChannel::Microphone.

Audio Capture Pipeline

┌─────────────────────────────────────────────┐
│           Android Audio HAL                  │
├─────────────────────────────────────────────┤
│  AAudio (Android 8.1+) │ OpenSL ES (older)  │
└────────────┬────────────┴────────────────────┘

      ┌──────▼──────┐
      │ oboe::Audio │
      │   Stream    │
      └──────┬──────┘

      ┌──────▼──────────┐
      │ FLCKOboeCallback │
      └──────┬──────────┘

      ┌──────▼──────────┐
      │ FLCKOboeSource  │
      │ (Microphone)    │
      └─────────────────┘

Automatic Integration

The plugin automatically:
  1. Detects available audio APIs (AAudio vs OpenSL ES)
  2. Selects optimal configuration for the device
  3. Registers with the LCK audio system

Configuration

Default Settings

SettingValue
Sample Rate48000 Hz
ChannelsMono (1)
FormatFloat32
Performance ModeLowLatency

Project Configuration

For Meta Quest optimization, ensure these settings in your project:
; AndroidEngine.ini
[Audio]
AudioMixerModuleName=AudioMixerAndroid

Performance Characteristics

DeviceAPILatency
Meta Quest 2/3AAudio~20ms
Quest ProAAudio~15ms
Other Android 8.1+AAudio~25ms
Android < 8.1OpenSL ES~40ms
On Meta Quest devices, LCKOboe provides the lowest latency microphone capture available.

Troubleshooting

  1. Verify RECORD_AUDIO permission is granted
  2. Check if another app is using the microphone
  3. Verify microphone hardware is working
  4. Confirm AudioStream is not null in LogLCKOboe
  1. Ensure device supports AAudio (Android 8.1+)
  2. Check for other audio apps that might affect performance
  3. Verify Vulkan rendering is enabled
  1. Verify plugin is enabled in .uproject
  2. Check that platform is Android
  3. Look for errors in LogLCKOboe
  1. Check that RECORD_AUDIO permission is granted at runtime (not just manifest)
  2. Verify no other Oboe streams are active
  3. Check Android logcat for Oboe/AAudio errors

Log Category

DECLARE_LOG_CATEGORY_EXTERN(LogLCKOboe, Log, All);

See Also

Audio Overview

Audio system architecture

Unreal Audio

Cross-platform audio capture