davidliu
Committed by GitHub

Add more audio and video overrides (#82)

... ... @@ -2,7 +2,6 @@ package io.livekit.android
import android.content.Context
import io.livekit.android.dagger.DaggerLiveKitComponent
import io.livekit.android.dagger.LiveKitOverrides
import io.livekit.android.dagger.create
import io.livekit.android.room.Room
import io.livekit.android.room.RoomListener
... ...
package io.livekit.android
import okhttp3.OkHttpClient
import org.webrtc.VideoDecoderFactory
import org.webrtc.VideoEncoderFactory
import org.webrtc.audio.AudioDeviceModule
import org.webrtc.audio.JavaAudioDeviceModule
/**
* Overrides to replace LiveKit internally used component with custom implementations.
*/
data class LiveKitOverrides(
/**
* Override the [OkHttpClient] used by the library.
*/
val okHttpClient: OkHttpClient? = null,
/**
* Override the default [AudioDeviceModule].
*/
val audioDeviceModule: AudioDeviceModule? = null,
/**
* Called after default setup to allow for customizations on the [JavaAudioDeviceModule].
*
* Not used if [audioDeviceModule] is provided.
*/
val javaAudioDeviceModuleCustomizer: ((builder: JavaAudioDeviceModule.Builder) -> Unit)? = null,
/**
* Override the [VideoEncoderFactory] used by the library.
*/
val videoEncoderFactory: VideoEncoderFactory? = null,
/**
* Override the [VideoDecoderFactory] used by the library.
*/
val videoDecoderFactory: VideoDecoderFactory? = null,
)
\ No newline at end of file
... ...
... ... @@ -26,5 +26,8 @@ object InjectionNames {
// Overrides
internal const val OVERRIDE_OKHTTP = "override_okhttp"
internal const val OVERRIDE_AUDIO_DEVICE_MODULE = "override_audio_device_module"
internal const val OVERRIDE_JAVA_AUDIO_DEVICE_MODULE_CUSTOMIZER = "override_java_audio_device_module_customizer"
internal const val OVERRIDE_VIDEO_ENCODER_FACTORY = "override_video_encoder_factory"
internal const val OVERRIDE_VIDEO_DECODER_FACTORY = "override_video_decoder_factory"
}
\ No newline at end of file
... ...
package io.livekit.android.dagger
import android.content.Context
import androidx.annotation.Nullable
import dagger.BindsInstance
import dagger.Component
import io.livekit.android.LiveKitOverrides
import io.livekit.android.room.Room
import okhttp3.OkHttpClient
import org.webrtc.EglBase
import org.webrtc.PeerConnectionFactory
import org.webrtc.VideoEncoderFactory
import javax.inject.Named
import javax.inject.Singleton
@Singleton
... ... @@ -19,6 +16,7 @@ import javax.inject.Singleton
RTCModule::class,
WebModule::class,
JsonFormatModule::class,
OverridesModule::class,
]
)
internal interface LiveKitComponent {
... ... @@ -33,16 +31,7 @@ internal interface LiveKitComponent {
interface Factory {
fun create(
@BindsInstance appContext: Context,
@BindsInstance
@Named(InjectionNames.OVERRIDE_OKHTTP)
@Nullable
okHttpClientOverride: OkHttpClient?,
@BindsInstance
@Named(InjectionNames.OVERRIDE_VIDEO_ENCODER_FACTORY)
@Nullable
videoEncoderFactory: VideoEncoderFactory?,
overridesModule: OverridesModule
): LiveKitComponent
}
}
... ... @@ -53,15 +42,7 @@ internal fun LiveKitComponent.Factory.create(
): LiveKitComponent {
return create(
appContext = context,
okHttpClientOverride = overrides.okHttpClient,
videoEncoderFactory = overrides.videoEncoderFactory,
overridesModule = OverridesModule(overrides)
)
}
/**
* Overrides to replace LiveKit internally used component with custom implementations.
*/
data class LiveKitOverrides(
val okHttpClient: OkHttpClient? = null,
val videoEncoderFactory: VideoEncoderFactory? = null,
)
\ No newline at end of file
... ...
package io.livekit.android.dagger
import androidx.annotation.Nullable
import dagger.Module
import dagger.Provides
import io.livekit.android.LiveKitOverrides
import javax.inject.Named
@Module
class OverridesModule(private val overrides: LiveKitOverrides) {
@Provides
@Named(InjectionNames.OVERRIDE_OKHTTP)
@Nullable
fun okHttpClient() = overrides.okHttpClient
@Provides
@Named(InjectionNames.OVERRIDE_AUDIO_DEVICE_MODULE)
@Nullable
fun audioDeviceModule() = overrides.audioDeviceModule
@Provides
@Named(InjectionNames.OVERRIDE_JAVA_AUDIO_DEVICE_MODULE_CUSTOMIZER)
@Nullable
fun javaAudioDeviceModuleCustomizer() = overrides.javaAudioDeviceModuleCustomizer
@Provides
@Named(InjectionNames.OVERRIDE_VIDEO_ENCODER_FACTORY)
@Nullable
fun videoEncoderFactory() = overrides.videoEncoderFactory
@Provides
@Named(InjectionNames.OVERRIDE_VIDEO_DECODER_FACTORY)
@Nullable
fun videoDecoderFactory() = overrides.videoDecoderFactory
}
... ...
... ... @@ -20,7 +20,19 @@ import javax.inject.Singleton
object RTCModule {
@Provides
@Singleton
fun audioModule(appContext: Context): AudioDeviceModule {
@JvmSuppressWildcards
fun audioModule(
@Named(InjectionNames.OVERRIDE_AUDIO_DEVICE_MODULE)
@Nullable
audioDeviceModuleOverride: AudioDeviceModule?,
@Named(InjectionNames.OVERRIDE_JAVA_AUDIO_DEVICE_MODULE_CUSTOMIZER)
@Nullable
moduleCustomizer: ((builder: JavaAudioDeviceModule.Builder) -> Unit)?,
appContext: Context
): AudioDeviceModule {
if (audioDeviceModuleOverride != null) {
return audioDeviceModuleOverride
}
// Set audio record error callbacks.
val audioRecordErrorCallback = object : JavaAudioDeviceModule.AudioRecordErrorCallback {
... ... @@ -80,14 +92,16 @@ object RTCModule {
}
}
return JavaAudioDeviceModule.builder(appContext)
val builder = JavaAudioDeviceModule.builder(appContext)
.setUseHardwareAcousticEchoCanceler(true)
.setUseHardwareNoiseSuppressor(true)
.setAudioRecordErrorCallback(audioRecordErrorCallback)
.setAudioTrackErrorCallback(audioTrackErrorCallback)
.setAudioRecordStateCallback(audioRecordStateCallback)
.setAudioTrackStateCallback(audioTrackStateCallback)
.createAudioDeviceModule()
moduleCustomizer?.invoke(builder)
return builder.createAudioDeviceModule()
}
@Provides
... ... @@ -124,8 +138,11 @@ object RTCModule {
@Named(InjectionNames.OPTIONS_VIDEO_HW_ACCEL)
videoHwAccel: Boolean,
eglContext: EglBase.Context,
@Named(InjectionNames.OVERRIDE_VIDEO_DECODER_FACTORY)
@Nullable
videoDecoderFactoryOverride: VideoDecoderFactory?
): VideoDecoderFactory {
return if (videoHwAccel) {
return videoDecoderFactoryOverride ?: if (videoHwAccel) {
DefaultVideoDecoderFactory(eglContext)
} else {
SoftwareVideoDecoderFactory()
... ...
... ... @@ -8,7 +8,7 @@ import androidx.lifecycle.viewModelScope
import com.github.ajalt.timberkt.Timber
import io.livekit.android.LiveKit
import io.livekit.android.RoomOptions
import io.livekit.android.dagger.LiveKitOverrides
import io.livekit.android.LiveKitOverrides
import io.livekit.android.room.Room
import io.livekit.android.room.participant.Participant
import io.livekit.android.room.participant.VideoTrackPublishDefaults
... ...