From c6de694e6e6419089f168cae0ace9c0ed1058a69 Mon Sep 17 00:00:00 2001 From: rahullohra Date: Mon, 29 Sep 2025 20:18:55 +0530 Subject: [PATCH 1/3] fix: dynamically resolve audio-usage --- .../api/stream-video-android-core.api | 9 ++++----- .../kotlin/io/getstream/video/android/core/Call.kt | 2 +- .../io/getstream/video/android/core/MediaManager.kt | 10 ++++++++-- .../call/connection/StreamPeerConnectionFactory.kt | 10 ++++++++-- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/stream-video-android-core/api/stream-video-android-core.api b/stream-video-android-core/api/stream-video-android-core.api index a348240a442..29c1566942a 100644 --- a/stream-video-android-core/api/stream-video-android-core.api +++ b/stream-video-android-core/api/stream-video-android-core.api @@ -5901,12 +5901,11 @@ public final class io/getstream/video/android/core/LocalStats { } public final class io/getstream/video/android/core/MediaManagerImpl { - public fun (Landroid/content/Context;Lio/getstream/video/android/core/Call;Lkotlinx/coroutines/CoroutineScope;Lorg/webrtc/EglBase$Context;I)V - public synthetic fun (Landroid/content/Context;Lio/getstream/video/android/core/Call;Lkotlinx/coroutines/CoroutineScope;Lorg/webrtc/EglBase$Context;IILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Landroid/content/Context;Lio/getstream/video/android/core/Call;Lkotlinx/coroutines/CoroutineScope;Lorg/webrtc/EglBase$Context;ILkotlin/jvm/functions/Function0;)V + public synthetic fun (Landroid/content/Context;Lio/getstream/video/android/core/Call;Lkotlinx/coroutines/CoroutineScope;Lorg/webrtc/EglBase$Context;ILkotlin/jvm/functions/Function0;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun cleanup ()V public final fun getAudioSource ()Lorg/webrtc/AudioSource; public final fun getAudioTrack ()Lorg/webrtc/AudioTrack; - public final fun getAudioUsage ()I public final fun getCall ()Lio/getstream/video/android/core/Call; public final fun getContext ()Landroid/content/Context; public final fun getEglBaseContext ()Lorg/webrtc/EglBase$Context; @@ -6576,8 +6575,8 @@ public class io/getstream/video/android/core/call/connection/StreamPeerConnectio } public final class io/getstream/video/android/core/call/connection/StreamPeerConnectionFactory { - public fun (Landroid/content/Context;ILorg/webrtc/ManagedAudioProcessingFactory;)V - public synthetic fun (Landroid/content/Context;ILorg/webrtc/ManagedAudioProcessingFactory;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Landroid/content/Context;ILkotlin/jvm/functions/Function0;Lorg/webrtc/ManagedAudioProcessingFactory;)V + public synthetic fun (Landroid/content/Context;ILkotlin/jvm/functions/Function0;Lorg/webrtc/ManagedAudioProcessingFactory;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getEglBase ()Lorg/webrtc/EglBase; public final fun getSenderCapabilities (Lorg/webrtc/MediaStreamTrack$MediaType;)Lorg/webrtc/RtpCapabilities; public final fun isAudioProcessingEnabled ()Z diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/Call.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/Call.kt index cd3767cd252..a17bdd6eaf9 100644 --- a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/Call.kt +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/Call.kt @@ -232,7 +232,7 @@ public class Call( internal var peerConnectionFactory: StreamPeerConnectionFactory = StreamPeerConnectionFactory( context = clientImpl.context, audioProcessing = clientImpl.audioProcessing, - audioUsage = clientImpl.callServiceConfigRegistry.get(type).audioUsage, + audioUsageProvider = { clientImpl.callServiceConfigRegistry.get(type).audioUsage }, ) internal val clientCapabilities = ConcurrentHashMap().apply { diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/MediaManager.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/MediaManager.kt index 0b588619422..328693d6ff5 100644 --- a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/MediaManager.kt +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/MediaManager.kt @@ -1005,7 +1005,13 @@ class MediaManagerImpl( val call: Call, val scope: CoroutineScope, val eglBaseContext: EglBase.Context, - val audioUsage: Int = defaultAudioUsage, + @Deprecated( + "Use audioUsageProvider instead", + replaceWith = ReplaceWith("audioUsageProvider"), + level = DeprecationLevel.ERROR, + ) + private val audioUsage: Int = defaultAudioUsage, + private val audioUsageProvider: (() -> Int) = { defaultAudioUsage }, ) { private val filterVideoProcessor = FilterVideoProcessor({ call.videoFilter }, { camera.surfaceTextureHelper }) @@ -1040,7 +1046,7 @@ class MediaManagerImpl( internal val camera = CameraManager(this, eglBaseContext, DefaultCameraCharacteristicsValidator()) - internal val microphone = MicrophoneManager(this, audioUsage) + internal val microphone = MicrophoneManager(this, audioUsageProvider.invoke()) internal val speaker = SpeakerManager(this, microphone) internal val screenShare = ScreenShareManager(this, eglBaseContext) diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/StreamPeerConnectionFactory.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/StreamPeerConnectionFactory.kt index bcbdf02ff1e..8e15e16e763 100644 --- a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/StreamPeerConnectionFactory.kt +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/StreamPeerConnectionFactory.kt @@ -62,7 +62,13 @@ import java.nio.ByteBuffer */ public class StreamPeerConnectionFactory( private val context: Context, + @Deprecated( + "Use audioUsageProvider instead", + replaceWith = ReplaceWith("audioUsageProvider"), + level = DeprecationLevel.ERROR, + ) private val audioUsage: Int = defaultAudioUsage, + private val audioUsageProvider: (() -> Int) = { defaultAudioUsage }, private var audioProcessing: ManagedAudioProcessingFactory? = null, ) { @@ -174,9 +180,9 @@ public class StreamPeerConnectionFactory( .setUseHardwareAcousticEchoCanceler( Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q, ).apply { - if (audioUsage != defaultAudioUsage) { + if (audioUsageProvider.invoke() != defaultAudioUsage) { setAudioAttributes( - AudioAttributes.Builder().setUsage(audioUsage) + AudioAttributes.Builder().setUsage(audioUsageProvider.invoke()) .build(), ) } From bd4e2f1463bf810eb64ada02ebb45eeaf0be56bf Mon Sep 17 00:00:00 2001 From: rahullohra Date: Mon, 29 Sep 2025 20:42:53 +0530 Subject: [PATCH 2/3] fix: update tutorial --- .../io/getstream/video/android/tutorial/livestream/LiveGuest.kt | 1 + .../io/getstream/video/android/tutorial/livestream/LiveHost.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/tutorials/tutorial-livestream/src/main/kotlin/io/getstream/video/android/tutorial/livestream/LiveGuest.kt b/tutorials/tutorial-livestream/src/main/kotlin/io/getstream/video/android/tutorial/livestream/LiveGuest.kt index c8ea4b29b7c..1c413f57bcb 100644 --- a/tutorials/tutorial-livestream/src/main/kotlin/io/getstream/video/android/tutorial/livestream/LiveGuest.kt +++ b/tutorials/tutorial-livestream/src/main/kotlin/io/getstream/video/android/tutorial/livestream/LiveGuest.kt @@ -48,6 +48,7 @@ fun LiveAudience( // Step 2 - join a call, which type is `default` and id is `123`. val call = remember(callId) { client.call("livestream", callId) } + call.speaker.setEnabled(enabled = true) suspend fun performJoin() { call.join() diff --git a/tutorials/tutorial-livestream/src/main/kotlin/io/getstream/video/android/tutorial/livestream/LiveHost.kt b/tutorials/tutorial-livestream/src/main/kotlin/io/getstream/video/android/tutorial/livestream/LiveHost.kt index d6b3bf3940e..e332af164c5 100644 --- a/tutorials/tutorial-livestream/src/main/kotlin/io/getstream/video/android/tutorial/livestream/LiveHost.kt +++ b/tutorials/tutorial-livestream/src/main/kotlin/io/getstream/video/android/tutorial/livestream/LiveHost.kt @@ -72,6 +72,7 @@ fun LiveHost( // Step 2 - join a call, which type is `default` and id is `123`. val call = client.call("livestream", callId) + call.speaker.setEnabled(enabled = false) LaunchCallPermissions(call = call) { val result = call.join(create = true) From 9eb52ef0a5bcb9e46f2488002dae880a3bf9c5b8 Mon Sep 17 00:00:00 2001 From: rahullohra Date: Mon, 29 Sep 2025 21:10:17 +0530 Subject: [PATCH 3/3] fix: refactor --- .../src/main/kotlin/io/getstream/video/android/core/Call.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/Call.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/Call.kt index 56525d7f274..2c635570ba0 100644 --- a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/Call.kt +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/Call.kt @@ -254,7 +254,7 @@ public class Call( this, scope, peerConnectionFactory.eglBase.eglBaseContext, - clientImpl.callServiceConfigRegistry.get(type).audioUsage, + audioUsageProvider = { clientImpl.callServiceConfigRegistry.get(type).audioUsage }, ) } }