Skip to content
Merged
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
Original file line number Diff line number Diff line change
@@ -1,24 +1,27 @@
package com.livekit.reactnative

import android.annotation.SuppressLint
import android.app.Application
import android.content.Context
import android.os.Build
import com.livekit.reactnative.audio.AudioType
import com.livekit.reactnative.video.CustomVideoEncoderFactory
import com.livekit.reactnative.video.CustomVideoDecoderFactory
import com.livekit.reactnative.video.CustomVideoEncoderFactory
import com.oney.WebRTCModule.WebRTCModuleOptions
import org.webrtc.audio.JavaAudioDeviceModule

object LiveKitReactNative {

private lateinit var adm: JavaAudioDeviceModule

private var audioType: AudioType = AudioType.CommunicationAudioType()

@SuppressLint("StaticFieldLeak")
private var adm: JavaAudioDeviceModule? = null

val audioDeviceModule: JavaAudioDeviceModule
get() {
if(!::adm.isInitialized) {
throw IllegalStateException("Audio device module is not initialized! Did you remember to call LiveKitReactNative.setup in your Application.onCreate?")
}

val adm = this.adm
?: throw IllegalStateException("Audio device module is not initialized! Did you remember to call LiveKitReactNative.setup in your Application.onCreate?")
return adm
}

Expand All @@ -34,19 +37,35 @@ object LiveKitReactNative {
context: Context,
audioType: AudioType = AudioType.CommunicationAudioType()
) {
this.audioType = audioType
val options = WebRTCModuleOptions.getInstance()
options.videoEncoderFactory = CustomVideoEncoderFactory(null, true, true)
options.videoDecoderFactory = CustomVideoDecoderFactory()
options.enableMediaProjectionService = true

setupAdm(context)
options.audioDeviceModule = adm
}

private fun setupAdm(context: Context) {
val useHardwareAudioProcessing = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q

adm = JavaAudioDeviceModule.builder(context)
.setUseHardwareAcousticEchoCanceler(useHardwareAudioProcessing)
.setUseHardwareNoiseSuppressor(useHardwareAudioProcessing)
.setAudioAttributes(audioType.audioAttributes)
.createAudioDeviceModule()
}

internal fun invalidate(context: Context) {
val options = WebRTCModuleOptions.getInstance()
if (options.audioDeviceModule == adm) {
options.audioDeviceModule = null
}
adm?.release()
adm = null

setupAdm(context)
options.audioDeviceModule = adm
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.livekit.reactnative

import android.annotation.SuppressLint
import android.content.Context
import android.media.AudioAttributes
import com.facebook.react.bridge.*
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
import com.facebook.react.bridge.ReadableMap
import com.livekit.reactnative.audio.AudioDeviceKind
import com.livekit.reactnative.audio.AudioManagerUtils
import com.livekit.reactnative.audio.AudioSwitchManager
Expand Down Expand Up @@ -120,4 +123,8 @@ class LivekitReactNativeModule(reactContext: ReactApplicationContext) : ReactCon
audioManager.selectAudioOutput(AudioDeviceKind.fromTypeName(deviceId))
promise.resolve(null)
}

override fun invalidate() {
LiveKitReactNative.invalidate(reactApplicationContext)
}
}
Loading