A Kotlin Multiplatform library providing OPUS audio codec functionality for Android and iOS platforms.
- Cross-platform: Supports Android and iOS through Kotlin Multiplatform
 - High-quality audio: Based on the libopus 1.5.2 codec
 - Flexible encoding: Support for multiple sample rates, channels, and application modes
 - Multiple data formats: Encode/decode both 16-bit PCM (Short) and floating-point (Float) audio
 
Add the dependency to your build.gradle.kts:
dependencies {
    implementation("io.voxkit:kopus:$kopus_version")
}import io.voxkit.kopus.*
// Create encoder
val encoder = Opus.encoder(
    sampleRate = SampleRate.RATE_48K,
    channels = Channels.STEREO,
    application = OpusApplication.AUDIO
)
// Create decoder  
val decoder = Opus.decoder(
    sampleRate = SampleRate.RATE_48K,
    channels = Channels.STEREO
)
// Encode PCM data
val pcmInput: ShortArray = // your audio samples
val frameSize = 960 // 20ms at 48kHz
val encodedBuffer = ByteArray(OpusEncoder.DEFAULT_OUTPUT_BUFFER_SIZE)
val encodedLength = encoder.encode(pcmInput, frameSize, encodedBuffer)
// Decode back to PCM
val decodedBuffer = ShortArray(frameSize * 2) // 2 channels
val encodedData = encodedBuffer.copyOf(encodedLength)
val decodedSamples = decoder.decode(encodedData, frameSize, decodedBuffer)
// Don't forget to close resources
encoder.close()
decoder.close()SampleRate.RATE_8K(8 kHz)SampleRate.RATE_12K(12 kHz)SampleRate.RATE_16K(16 kHz)SampleRate.RATE_24K(24 kHz)SampleRate.RATE_48K(48 kHz)
Channels.MONO- Single channelChannels.STEREO- Two channels
OpusApplication.VOIP- Optimize for voice callsOpusApplication.AUDIO- Optimize for music/general audioOpusApplication.LOW_DELAY- Optimize for low-latency applications
// Handle missing packets by passing null data
val missingSamples = decoder.decode(
    data = null, // indicates packet loss
    frameSize = expectedFrameSize,
    pcm = outputBuffer
)// Decode with FEC to recover from errors
val recoveredSamples = decoder.decode(
    data = corruptedPacket,
    frameSize = expectedFrameSize, 
    pcm = outputBuffer,
    decodeFec = true
)| Platform | Status | Implementation | 
|---|---|---|
| Android | ✅ Supported | JNI/NDK with C++ bridge | 
| iOS | ✅ Supported | Kotlin/Native cinterop | 
Contributions are welcome! Please feel free to submit a Pull Request.