All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.12.47 - 2026-02-10
- update Cargo.toml dependencies
- don't use clamp as the ultimate_kbps can be lower than 300 (#886)
- pre-connect the publisher PC when an RPC handler is registered (#880)
0.12.46 - 2026-02-09
- update Cargo.toml dependencies
0.12.45 - 2026-02-09
- fix the RPC race condition (#865)
- update proto & fix CI (#871)
- add can_manage_agent_session permission (#870)
- Use workspace dependencies & settings (#856)
- Upgrade protocol to v1.44.0 (#857)
- Use dedicated audio_runtime with high priority for audio capture (#854)
- Expose participant's permission to ffi layer (#824)
- Add a request_async_id to the async requests (#842)
- Use the correct download url in webrtc-sys build. (#825)
0.12.44 - 2026-01-15
- ensure Room.creation_time is ms (#822)
- try setting x-google-start-bitrate for vp9 (#820)
0.12.43 - 2025-12-19
- (ParticipantInfo) export kind details (#813)
0.12.42 - 2025-12-17
- Handle server initiated mute request (#812)
0.12.41 - 2025-12-04
- (connector) initial service impl (#790)
- fix mute/unmute events for LocalTrack. (#799)
0.12.40 - 2025-11-20
- change the livekit-ffi to output a static lib for cpp SDK (#781)
- perform full reconnect if resume fails (#792)
- E2E RPC tests (#769)
- Remove unused dependencies (#761)
0.12.39 - 2025-10-27
- fix unable to locate __arm_tpidr2_save for android ffi. (#765)
0.12.38 - 2025-10-23
- add h265 codec support (#762)
0.12.37 - 2025-10-22
- License check (#746)
- Derive from_variants for FFI oneof fields (#738)
- Remove participant check for data packets (#757)
- clamp connection timeout and fixed the comment (#748)
- put examples in root Cargo workspace (#731)
0.12.36 - 2025-10-13
- (e2ee) add data channel encryption (#708)
- fix some potential audio issues, clean up the code a bit, and suppress some warnings (#737)
- do not log 'signal client closed: "stream closed"' on disconnect (#727)
- Upgrade prost, use prost-build (FFI only) (#734)
- Test participant disconnect (#732)
- Increase RPC max RT time to 7s (#729)
- E2E audio test (#724)
- bump libwebrtc libs version for webrtc-sys. (#741)
- Bump reqwest to 0.12 (#711)
0.12.35 - 2025-10-03
- updated the following local packages: webrtc-sys, livekit
0.12.34 - 2025-09-29
- apply original participant fields in data messages (#709)
- Add send_bytes method (#691)
- Implement Display and Error for RpcError (#719)
- Fix intermittently failing E2E reliability test (#718)
- Do not modify raw packets (#714)
- Disable opus red for e2ee enabled clients (#706)
- Upgrade protocol to v1.41.0 (#703)
- Upgrade libwebrtc to m137. (#696)
0.12.33 - 2025-09-09
- Add option to enable audio preconnect buffer in SDK & FFI (#700)
- Optional flags for video hw codec. (#701)
- Data channel reliability (#688)
0.12.32 - 2025-09-03
- updated the following local packages: livekit-api, livekit
0.12.31 - 2025-07-31
- updated the following local packages: livekit-api, livekit
0.12.30 - 2025-07-18
- fix SoxrResampler flush segv (#678)
0.12.29 - 2025-07-16
- remove published tracks when the room is closed (#677)
0.12.28 - 2025-06-23
audio_frame_msdidn't work expectedly (#671)
0.12.27 - 2025-06-17
- (webrtc-sys-build) add temporary workaround to fix ci in Windows (#665)
- (webrtc-sys-build) add error context to debug issues (#664)
- Expose room updates, support MoveParticipant (protocol 15) (#662)
- use path.join instead of hardcoded
/(#663) - bump version for webrtc (fix win CI) (#650)
- try to fix webrtc build for iOS/macOS. (#646)
- remove (#633)
- FFI support for the new high-level data streams API
- Fix several minor issues
- Revert the RPC change, need more robust way
- Move RPC handlers to room
- Fixed metric report issue on audio filter where room_id is sometimes empty
- Ensure RTC session continues even if audio filter initialization fails
- APM
- debugging nanpa
- Fixed a packaging issue
- Depends the latest version of livekit-protocol
- Add audio filter support
- fixed passing disconnect reason on ParticipantDisconnected events
- Fix RPC invocation race bug
- Support for track subscription permissions
- Rename DataStream header properties
- Add DataStream.Trailer support
- Add an API to set buffer_amount_low_threshold for DataChannel
- Update RoomInfo to contain buffer_amount_low_threshold for DataChannel
- Automatically close audio/video stream handles when the associated room is closed
- Fix deadlock issue in nested RPC calls.
- bump libwebrtc to m125
- bump libwebrtc to m125
- Rename user facing APIs for Packet Trailer to Frame Metadata.
- Upgrade protocol to v1.48.0
- fix: escalate to full reconnect if connection failed during a resume - #1175 (@davidzhao)
- Add
LK_DISABLE_NVDECto bypass NVIDIA NVDEC decoder registration when the environment variable is set. - return DeviceNotFound when device is not there for set_recording_devi… - #1155 (@xianshijing-lk)
This includes a minor breaking change for libwebrtc: RtpParameters now
contains additional RTP sender state that must be preserved when round-tripping
through set_parameters().
- Reject oversized data messages before they break the data channel.
- Upgrade dashmap to v6
- Add per-publication video encoder backend selection. Add a video encoder backend availability query. Remove
LIVEKIT_PREFERRED_HW_ENCODERin favor of per-publication backend selection.
- Add rpc max_round_trip_latency and move to builder pattern - #1127 (@1egoman)
- [allow(dead_code)] for dead function in room module - #1128 (@stephen-derosa)
- Send publisher offer with join request to accelerate connection - #996 (@cnderrauber)
- bump protocol to v1.46.4 - #1121 (@lukasIO)
- Introduce pipeline options for remote data tracks, support multiple in-flight frames.
Android requires ContextUtils.initialize(applicationContext) before WebRTC audio components can be created. This change:
- Adds
livekit_ffi_initialize_android_context()C FFI function for Unity and other FFI consumers - Uses
CreateAndroidAudioDeviceModule()instead of genericCreateAudioDeviceModule()on Android - Handles empty device GUIDs on Android (falls back to index 0)
- Documents Android-specific limitations: single default device, no app-level device selection
Platform notes:
- Android device enumeration returns only one "default" device with empty name/GUID
- Audio routing (speaker/earpiece/Bluetooth) is controlled by Android's AudioManager, not WebRTC
- Filter internal data streams out of livekit-ffi interface - #1112 (@1egoman)
- Bugfix: Always emit Disconnected on engine close - #1096 (@MaxHeimbrock)
- (WIP) FFI room event ready signal after initial connection - #1068 (@ladvoc, @stephen-derosa)
- Support for large RPC messages using data streams - #1013 (@1egoman)
- FFI logging improvements
These fields are ignored for AudioSourcePlatform (ADM uses hardware native settings) and for AudioSourceNative fast path (queue_size_ms=0, frame values used directly). Defaults to 48000 Hz and 1 channel when not specified.
- fix: don't fire local_track_subscribed during reconnect - #1099 (@davidzhao)
- Fix LocalTrackPublished handle leak - #1065 (@MaxHeimbrock)
- Return EOS event from data track stream read request
- feat: add scalability mode for AV1/VP9. - #1076 (@cloudwebrtc)
- Add
LIVEKIT_PREFERRED_HW_ENCODERto prefernvencorvaapihardware video encoding when both are available. - Reword audio filter logs to be less confusing - #1092 (@1egoman)
This PR introduces platform audio device management via WebRTC's Audio Device Module (ADM).
- ADM Proxy: New
AdmProxyclass that switches between Dummy ADM (synthetic mode) and Platform ADM (real audio I/O) - PlatformAudio API: High-level Rust API for microphone capture and speaker playout with AEC/AGC/NS
- Device enumeration: List and select recording/playout devices by index or GUID
- Mode switching: Seamlessly switch between synthetic mode (FFI callbacks) and platform mode (native speakers) while audio is active
- FFI platform audio support: Expose platform audio device enumeration and selection through
livekit-ffi - Audio processing: Configure echo cancellation, noise suppression, and auto gain control with platform-specific defaults (hardware on iOS, software elsewhere)
| Mode | Recording | Playout | Use Case |
|---|---|---|---|
| Synthetic | NativeAudioSource | Dummy ADM + FFI | Unity audio, agents |
| Platform | Platform ADM mic | Platform ADM speakers | VoIP with AEC |
// Create PlatformAudio for microphone/speaker access
let audio = PlatformAudio::new()?;
// Enumerate and select devices
for i in 0..audio.recording_devices() as u16 {
println!("Mic {}: {}", i, audio.recording_device_name(i));
}
audio.set_recording_device(0)?;
// Create audio track for publishing
let track = LocalAudioTrack::create_audio_track("mic", audio.rtc_source());- fix: Sync inner.enabled state for E2EE manager. - #1073 (@cloudwebrtc)
- Upgrade protocol to v1.45.8
- chore: add LocalTrackRepublished event for FFI clients - #1072 (@davidzhao)
- Bump
rustls-webpkito 0.103.13, addressing GHSA-82j2-j2ch-gfr8 - Expose error message on EOS for data track subscriptions
- Fix missing
libwebrtc.jarfor Android builds, harden build scripts - fix: derive
simulcastedfrom non-deprecated TrackInfo fields - #1052 (@cloudwebrtc) - fix race in download_webrtc to reduce flaky build - #1047 (@hechen-eng)
- Improve WebRTC build scripts and add external_audio_source patch - #1053 (@xianshijing-lk)
- support SimulateScenario through FFI to improve testing - #1069 (@davidzhao)
- TEL-464: reduce redundant resampling in audio filter - #1019 (@hechen-eng)
##890 by @chenosaurus
- Add support to attach/parse frame level timestamps & frame ID to VideoTracks as a custom payload trailer.
- Breaking change in VideoFrame API, must include
frame_metadataor use VideoFrame::new().
- Add device-info crate and send device_info to telemetry - #982 (@maxheimbrock)
- Fix data track packet format issue breaking E2EE
- Fix unbound send queue that can cause latency in data track messages - #1032 (@chenosaurus)
- Fix for raw stream drop called from non tokio thread like Unity .NET GC - #1016 (@MaxHeimbrock)
- Initial support for data tracks
##956 by @xianshijing-lk
Before this PR, it uses an unbounded buffer for video stream, that will cause multiple problems: 1, video will be lagged behind if rendering is slow or just wake up from background 2, it will be out of sync with audio
This PRs provides options to set a bounded buffer for video stream, and use 1 buffer as the default option.
- Expose participant active event, state, and joined at
- fix unity android build with "livekit" prefixed jni - #983 (@xianshijing-lk)
- Upgrade to thiserror 2
##921 by @onestacked
This PR uses this webrtc-sdk PR to configure the KDF.
I've tested this with https://codeberg.org/esoteric_programmer/matrix-jukebox and it is compatible with Element Call.
Fixed: #796
- Fix H.264 codec matching
##945 by @xianshijing-lk
##952 by @MaxHeimbrock
Adds os_info crate as dependency and sends the data for client connections.
- Update livekit dependencies