Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/prefixed-webrtc-symbols.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@livekit/react-native': major
---

Move to the prefixed WebRTC builds: `io.github.webrtc-sdk:android-prefixed` on Android and the `LiveKitWebRTC` pod on iOS.

Apps that only use the JavaScript API need no other changes. Native integrations must migrate to the prefixed symbols: `org.webrtc.*` becomes `livekit.org.webrtc.*` on Android, and libwebrtc Objective-C types gain an `LK` prefix on iOS (`RTCAudioRenderer` becomes `LKRTCAudioRenderer`, `RTCAudioBuffer` becomes `LKRTCAudioBuffer`, and so on). Custom `-keep class org.webrtc.**` ProGuard rules must be updated to `livekit.org.webrtc.**`.
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ dependencies {
api 'com.facebook.react:react-native:+'
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
api 'com.github.davidliu:audioswitch:89582c47c9a04c62f90aa5e57251af4800a62c9a'
api 'io.github.webrtc-sdk:android:144.7559.04'
api 'io.github.webrtc-sdk:android-prefixed:144.7559.15'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Declared peer installs incompatible WebRTC bridge

The declared peer dependency still accepts an unprefixed bridge after android-prefixed becomes mandatory. Clean Android and iOS consumer builds fail.

Prompt for agents
The prefixed native sources require a prefixed release of @livekit/react-native-webrtc, but package.json still declares ^144.1.2 as both the peer and development dependency. example/package.json and ci/package.json also retain that version, and yarn.lock resolves it to 144.1.2. That release depends on the unprefixed Android artifact and WebRTC-SDK pod, so it cannot provide the prefixed types used by this PR. Update all manifests and the lockfile to the first released prefixed bridge version, keeping the root peer and development ranges synchronized. Regenerate the example Podfile.lock from that dependency rather than editing its resolved pod entries independently.
Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

implementation "io.livekit:noise:2.0.0"
implementation project(':livekit_react-native-webrtc')
implementation "androidx.annotation:annotation:1.9.1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import com.livekit.reactnative.audio.processing.CustomAudioProcessingController
import com.livekit.reactnative.video.CustomVideoDecoderFactory
import com.livekit.reactnative.video.CustomVideoEncoderFactory
import com.oney.WebRTCModule.WebRTCModuleOptions
import org.webrtc.audio.JavaAudioDeviceModule
import livekit.org.webrtc.audio.JavaAudioDeviceModule
import java.util.concurrent.Callable

object LiveKitReactNative {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import com.livekit.reactnative.audio.processing.AudioSinkProcessor
import com.livekit.reactnative.audio.processing.MultibandVolumeProcessor
import com.livekit.reactnative.audio.processing.VolumeProcessor
import com.oney.WebRTCModule.WebRTCModuleOptions
import org.webrtc.audio.WebRtcAudioTrackHelper
import livekit.org.webrtc.audio.WebRtcAudioTrackHelper
import java.lang.Thread.sleep
import kotlin.concurrent.thread
import kotlin.time.Duration.Companion.milliseconds
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ package com.livekit.reactnative.audio.processing

import android.media.AudioFormat
import android.os.SystemClock
import org.webrtc.AudioTrackSink
import org.webrtc.audio.JavaAudioDeviceModule
import livekit.org.webrtc.AudioTrackSink
import livekit.org.webrtc.audio.JavaAudioDeviceModule
import java.nio.ByteBuffer
import java.util.Collections

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package com.livekit.reactnative.audio.processing
import com.facebook.react.bridge.ReactContext
import com.livekit.reactnative.LiveKitReactNative
import com.oney.WebRTCModule.WebRTCModule
import org.webrtc.AudioTrack
import org.webrtc.AudioTrackSink
import livekit.org.webrtc.AudioTrack
import livekit.org.webrtc.AudioTrackSink
import java.util.Collections
import java.util.UUID

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.ReactContext
import com.facebook.react.modules.core.DeviceEventManagerModule
import com.livekit.reactnative.audio.events.Events
import org.webrtc.AudioTrackSink
import livekit.org.webrtc.AudioTrackSink
import java.nio.ByteBuffer
import java.util.Arrays
import kotlin.io.encoding.Base64
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.livekit.reactnative.audio.processing

import org.webrtc.ExternalAudioProcessingFactory
import livekit.org.webrtc.ExternalAudioProcessingFactory
import java.nio.ByteBuffer

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.transform
import kotlinx.coroutines.launch
import org.webrtc.AudioTrackSink
import livekit.org.webrtc.AudioTrackSink
import java.nio.ByteBuffer
import kotlin.math.pow
import kotlin.math.round
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.ReactContext
import com.facebook.react.modules.core.DeviceEventManagerModule
import com.livekit.reactnative.audio.events.Events
import org.webrtc.AudioTrackSink
import livekit.org.webrtc.AudioTrackSink
import java.nio.ByteBuffer
import kotlin.math.round
import kotlin.math.sqrt
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@
package com.livekit.reactnative.video

import com.oney.WebRTCModule.webrtcutils.SoftwareVideoDecoderFactoryProxy
import org.webrtc.EglBase
import org.webrtc.SoftwareVideoDecoderFactory
import org.webrtc.VideoCodecInfo
import org.webrtc.VideoDecoder
import org.webrtc.VideoDecoderFactory
import org.webrtc.WrappedVideoDecoderFactory
import livekit.org.webrtc.EglBase
import livekit.org.webrtc.SoftwareVideoDecoderFactory
import livekit.org.webrtc.VideoCodecInfo
import livekit.org.webrtc.VideoDecoder
import livekit.org.webrtc.VideoDecoderFactory
import livekit.org.webrtc.WrappedVideoDecoderFactory

open class CustomVideoDecoderFactory(
private var forceSWCodec: Boolean = false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@
package com.livekit.reactnative.video

import com.oney.WebRTCModule.webrtcutils.SoftwareVideoEncoderFactoryProxy
import org.webrtc.EglBase
import org.webrtc.SoftwareVideoEncoderFactory
import org.webrtc.VideoCodecInfo
import org.webrtc.VideoEncoder
import org.webrtc.VideoEncoderFactory
import livekit.org.webrtc.EglBase
import livekit.org.webrtc.SoftwareVideoEncoderFactory
import livekit.org.webrtc.VideoCodecInfo
import livekit.org.webrtc.VideoEncoder
import livekit.org.webrtc.VideoEncoderFactory

open class CustomVideoEncoderFactory(
sharedContext: EglBase.Context?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ package com.livekit.reactnative.video

import android.util.Log
import com.oney.WebRTCModule.webrtcutils.SoftwareVideoEncoderFactoryProxy
import org.webrtc.EglBase
import org.webrtc.HardwareVideoEncoderFactory
import org.webrtc.SimulcastVideoEncoderFactory
import org.webrtc.SoftwareVideoEncoderFactory
import org.webrtc.VideoCodecInfo
import org.webrtc.VideoCodecStatus
import org.webrtc.VideoEncoder
import org.webrtc.VideoEncoderFactory
import org.webrtc.VideoEncoderFallback
import org.webrtc.VideoFrame
import org.webrtc.WrappedNativeVideoEncoder
import livekit.org.webrtc.EglBase
import livekit.org.webrtc.HardwareVideoEncoderFactory
import livekit.org.webrtc.SimulcastVideoEncoderFactory
import livekit.org.webrtc.SoftwareVideoEncoderFactory
import livekit.org.webrtc.VideoCodecInfo
import livekit.org.webrtc.VideoCodecStatus
import livekit.org.webrtc.VideoEncoder
import livekit.org.webrtc.VideoEncoderFactory
import livekit.org.webrtc.VideoEncoderFallback
import livekit.org.webrtc.VideoFrame
import livekit.org.webrtc.WrappedNativeVideoEncoder
import java.util.concurrent.Callable
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.livekit.reactnative.video

import com.oney.WebRTCModule.EglUtils
import org.webrtc.VideoCodecInfo
import org.webrtc.VideoDecoder
import org.webrtc.VideoDecoderFactory
import org.webrtc.WrappedVideoDecoderFactory
import livekit.org.webrtc.VideoCodecInfo
import livekit.org.webrtc.VideoDecoder
import livekit.org.webrtc.VideoDecoderFactory
import livekit.org.webrtc.WrappedVideoDecoderFactory

class WrappedVideoDecoderFactoryProxy : VideoDecoderFactory {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.webrtc.audio
package livekit.org.webrtc.audio

import android.media.AudioAttributes

Expand Down
2 changes: 1 addition & 1 deletion eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@ export default defineConfig([
},
},
{
ignores: ['node_modules/', 'lib/', 'docs/', 'src/polyfills/'],
ignores: ['node_modules/', 'lib/', 'docs/', 'src/polyfills/', '**/.yalc/'],
},
]);
Original file line number Diff line number Diff line change
Expand Up @@ -366,12 +366,12 @@
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-LivekitReactNativeExample/Pods-LivekitReactNativeExample-frameworks.sh",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/WebRTC-SDK/WebRTC.framework/WebRTC",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/LiveKitWebRTC/LiveKitWebRTC.framework/LiveKitWebRTC",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermesvm.framework/hermesvm",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebRTC.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LiveKitWebRTC.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermesvm.framework",
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down
18 changes: 9 additions & 9 deletions example/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ PODS:
- hermes-engine (0.82.1):
- hermes-engine/Pre-built (= 0.82.1)
- hermes-engine/Pre-built (0.82.1)
- livekit-react-native (2.11.0):
- livekit-react-native (2.12.0):
- boost
- DoubleConversion
- fast_float
Expand Down Expand Up @@ -38,8 +38,9 @@ PODS:
- SocketRocket
- Yoga
- livekit-react-native-webrtc (144.1.2):
- LiveKitWebRTC (= 144.7559.15)
- React-Core
- WebRTC-SDK (= 144.7559.10)
- LiveKitWebRTC (144.7559.15)
- RCT-Folly (2024.11.18.00):
- boost
- DoubleConversion
Expand Down Expand Up @@ -2530,7 +2531,6 @@ PODS:
- SocketRocket
- Yoga
- SocketRocket (0.7.1)
- WebRTC-SDK (144.7559.10)
- Yoga (0.0.0)

DEPENDENCIES:
Expand Down Expand Up @@ -2618,8 +2618,8 @@ DEPENDENCIES:

SPEC REPOS:
trunk:
- LiveKitWebRTC
- SocketRocket
- WebRTC-SDK

EXTERNAL SOURCES:
boost:
Expand Down Expand Up @@ -2790,9 +2790,10 @@ SPEC CHECKSUMS:
fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
glog: 5683914934d5b6e4240e497e0f4a3b42d1854183
hermes-engine: 273e30e7fb618279934b0b95ffab60ecedb7acf5
livekit-react-native: b8a86fb1c57270437f8a010437c0570585a13625
livekit-react-native-webrtc: 5ff3e8d229a3fcd34f99fe4cb1c2c93f92017b0c
RCT-Folly: 59ec0ac1f2f39672a0c6e6cecdd39383b764646f
livekit-react-native: 27001a5d9454cc8d27894317425aa511801154e2
livekit-react-native-webrtc: 8ac4a8c004158ec95db235b6c6a818dee66df0a4
LiveKitWebRTC: 6abc86e190722e223fc870284547b6f229288c46
RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669
RCTDeprecation: f17e2ebc07876ca9ab8eb6e4b0a4e4647497ae3a
RCTRequired: e2c574c1b45231f7efb0834936bd609d75072b63
RCTTypeSafety: c693294e3993056955c3010eb1ebc574f1fcded6
Expand Down Expand Up @@ -2862,9 +2863,8 @@ SPEC CHECKSUMS:
RNCAsyncStorage: 01e4301688a611936e3644746ffe3325d3181952
RNScreens: 0bbf16c074ae6bb1058a7bf2d1ae017f4306797c
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
WebRTC-SDK: 1d7fc2ae91da6edd63e25f3882ff24f86a8d9d8b
Yoga: 689c8e04277f3ad631e60fe2a08e41d411daf8eb

PODFILE CHECKSUM: a921a659e37cd7dfb12da519493e10c9f38400a1

COCOAPODS: 1.16.2
COCOAPODS: 1.17.0
10 changes: 5 additions & 5 deletions ios/Headers/LKAudioProcessingAdapter.h
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
#import <Foundation/Foundation.h>
#import <WebRTC/WebRTC.h>
#import <LiveKitWebRTC/LiveKitWebRTC.h>

@protocol LKExternalAudioProcessingDelegate

- (void)audioProcessingInitializeWithSampleRate:(size_t)sampleRateHz channels:(size_t)channels;

- (void)audioProcessingProcess:(RTC_OBJC_TYPE(RTCAudioBuffer) * _Nonnull)audioBuffer;
- (void)audioProcessingProcess:(LKRTCAudioBuffer * _Nonnull)audioBuffer;

- (void)audioProcessingRelease;

@end

@interface LKAudioProcessingAdapter : NSObject <RTCAudioCustomProcessingDelegate>
@interface LKAudioProcessingAdapter : NSObject <LKRTCAudioCustomProcessingDelegate>

- (nonnull instancetype)init;

- (void)addProcessing:(id<LKExternalAudioProcessingDelegate> _Nonnull)processor;

- (void)removeProcessing:(id<LKExternalAudioProcessingDelegate> _Nonnull)processor;

- (void)addAudioRenderer:(nonnull id<RTCAudioRenderer>)renderer;
- (void)addAudioRenderer:(nonnull id<LKRTCAudioRenderer>)renderer;

- (void)removeAudioRenderer:(nonnull id<RTCAudioRenderer>)renderer;
- (void)removeAudioRenderer:(nonnull id<LKRTCAudioRenderer>)renderer;

@end
12 changes: 6 additions & 6 deletions ios/Headers/LKAudioProcessingManager.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
#import <Foundation/Foundation.h>
#import <WebRTC/WebRTC.h>
#import <LiveKitWebRTC/LiveKitWebRTC.h>
#import "LKAudioProcessingAdapter.h"

@interface LKAudioProcessingManager : NSObject

@property(nonatomic, strong) RTCDefaultAudioProcessingModule* _Nonnull audioProcessingModule;
@property(nonatomic, strong) LKRTCDefaultAudioProcessingModule* _Nonnull audioProcessingModule;

@property(nonatomic, strong) LKAudioProcessingAdapter* _Nonnull capturePostProcessingAdapter;

Expand All @@ -13,13 +13,13 @@
+ (_Nonnull instancetype)sharedInstance;


- (void)addLocalAudioRenderer:(nonnull id<RTCAudioRenderer>)renderer;
- (void)addLocalAudioRenderer:(nonnull id<LKRTCAudioRenderer>)renderer;

- (void)removeLocalAudioRenderer:(nonnull id<RTCAudioRenderer>)renderer;
- (void)removeLocalAudioRenderer:(nonnull id<LKRTCAudioRenderer>)renderer;

- (void)addRemoteAudioRenderer:(nonnull id<RTCAudioRenderer>)renderer;
- (void)addRemoteAudioRenderer:(nonnull id<LKRTCAudioRenderer>)renderer;

- (void)removeRemoteAudioRenderer:(nonnull id<RTCAudioRenderer>)renderer;
- (void)removeRemoteAudioRenderer:(nonnull id<LKRTCAudioRenderer>)renderer;

- (void)addCapturePostProcessor:(nonnull id<LKExternalAudioProcessingDelegate>)processor;

Expand Down
16 changes: 8 additions & 8 deletions ios/LKAudioProcessingAdapter.m
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#import "LKAudioProcessingAdapter.h"
#import <WebRTC/RTCAudioRenderer.h>
#import <LiveKitWebRTC/RTCAudioRenderer.h>
#import <os/lock.h>

@implementation LKAudioProcessingAdapter {
NSMutableArray<id<RTCAudioRenderer>>* _renderers;
NSMutableArray<id<LKRTCAudioRenderer>>* _renderers;
NSMutableArray<id<LKExternalAudioProcessingDelegate>>* _processors;
os_unfair_lock _lock;
BOOL _isAudioProcessingInitialized;
Expand All @@ -16,7 +16,7 @@ - (instancetype)init {
if (self) {
_isAudioProcessingInitialized = NO;
_lock = OS_UNFAIR_LOCK_INIT;
_renderers = [[NSMutableArray<id<RTCAudioRenderer>> alloc] init];
_renderers = [[NSMutableArray<id<LKRTCAudioRenderer>> alloc] init];
_processors = [[NSMutableArray<id<LKExternalAudioProcessingDelegate>> alloc] init];
}
return self;
Expand All @@ -41,13 +41,13 @@ - (void)removeProcessing:(id<LKExternalAudioProcessingDelegate> _Nonnull)process
os_unfair_lock_unlock(&_lock);
}

- (void)addAudioRenderer:(nonnull id<RTCAudioRenderer>)renderer {
- (void)addAudioRenderer:(nonnull id<LKRTCAudioRenderer>)renderer {
os_unfair_lock_lock(&_lock);
[_renderers addObject:renderer];
os_unfair_lock_unlock(&_lock);
}

- (void)removeAudioRenderer:(nonnull id<RTCAudioRenderer>)renderer {
- (void)removeAudioRenderer:(nonnull id<LKRTCAudioRenderer>)renderer {
os_unfair_lock_lock(&_lock);
_renderers = [[_renderers
filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject,
Expand All @@ -69,7 +69,7 @@ - (void)audioProcessingInitializeWithSampleRate:(size_t)sampleRateHz channels:(s
os_unfair_lock_unlock(&_lock);
}

- (AVAudioPCMBuffer*)toPCMBuffer:(RTC_OBJC_TYPE(RTCAudioBuffer) *)audioBuffer {
- (AVAudioPCMBuffer*)toPCMBuffer:(LKRTCAudioBuffer *)audioBuffer {
AVAudioFormat* format =
[[AVAudioFormat alloc] initWithCommonFormat:AVAudioPCMFormatInt16
sampleRate:audioBuffer.frames * 100.0
Expand All @@ -93,13 +93,13 @@ - (AVAudioPCMBuffer*)toPCMBuffer:(RTC_OBJC_TYPE(RTCAudioBuffer) *)audioBuffer {
return pcmBuffer;
}

- (void)audioProcessingProcess:(RTC_OBJC_TYPE(RTCAudioBuffer) *)audioBuffer {
- (void)audioProcessingProcess:(LKRTCAudioBuffer *)audioBuffer {
os_unfair_lock_lock(&_lock);
for (id<LKExternalAudioProcessingDelegate> processor in _processors) {
[processor audioProcessingProcess:audioBuffer];
}

for (id<RTCAudioRenderer> renderer in _renderers) {
for (id<LKRTCAudioRenderer> renderer in _renderers) {
[renderer renderPCMBuffer:[self toPCMBuffer:audioBuffer]];
}
os_unfair_lock_unlock(&_lock);
Expand Down
Loading
Loading