Skip to content

Commit 9d73087

Browse files
authored
Support runtime audio usage resolution (#1544)
* Replace audioUsage with audioUsageProvider * refactor * refactor
1 parent 7acccf4 commit 9d73087

File tree

5 files changed

+30
-18
lines changed

5 files changed

+30
-18
lines changed

stream-video-android-core/api/stream-video-android-core.api

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7618,12 +7618,13 @@ public final class io/getstream/video/android/core/LocalStats {
76187618
}
76197619

76207620
public final class io/getstream/video/android/core/MediaManagerImpl {
7621-
public fun <init> (Landroid/content/Context;Lio/getstream/video/android/core/Call;Lkotlinx/coroutines/CoroutineScope;Lorg/webrtc/EglBase$Context;I)V
7622-
public synthetic fun <init> (Landroid/content/Context;Lio/getstream/video/android/core/Call;Lkotlinx/coroutines/CoroutineScope;Lorg/webrtc/EglBase$Context;IILkotlin/jvm/internal/DefaultConstructorMarker;)V
7621+
public fun <init> (Landroid/content/Context;Lio/getstream/video/android/core/Call;Lkotlinx/coroutines/CoroutineScope;Lorg/webrtc/EglBase$Context;ILkotlin/jvm/functions/Function0;)V
7622+
public synthetic fun <init> (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
76237623
public final fun cleanup ()V
76247624
public final fun getAudioSource ()Lorg/webrtc/AudioSource;
76257625
public final fun getAudioTrack ()Lorg/webrtc/AudioTrack;
76267626
public final fun getAudioUsage ()I
7627+
public final fun getAudioUsageProvider ()Lkotlin/jvm/functions/Function0;
76277628
public final fun getCall ()Lio/getstream/video/android/core/Call;
76287629
public final fun getContext ()Landroid/content/Context;
76297630
public final fun getEglBaseContext ()Lorg/webrtc/EglBase$Context;
@@ -7694,12 +7695,13 @@ public final class io/getstream/video/android/core/MemberState {
76947695
}
76957696

76967697
public final class io/getstream/video/android/core/MicrophoneManager {
7697-
public fun <init> (Lio/getstream/video/android/core/MediaManagerImpl;I)V
7698+
public fun <init> (Lio/getstream/video/android/core/MediaManagerImpl;ILkotlin/jvm/functions/Function0;)V
76987699
public final fun canHandleDeviceSwitch ()Z
76997700
public final fun cleanup ()V
77007701
public final fun disable (Z)V
77017702
public static synthetic fun disable$default (Lio/getstream/video/android/core/MicrophoneManager;ZILjava/lang/Object;)V
77027703
public final fun getAudioUsage ()I
7704+
public final fun getAudioUsageProvider ()Lkotlin/jvm/functions/Function0;
77037705
public final fun getDevices ()Lkotlinx/coroutines/flow/StateFlow;
77047706
public final fun getMediaManager ()Lio/getstream/video/android/core/MediaManagerImpl;
77057707
public final fun getSelectedDevice ()Lkotlinx/coroutines/flow/StateFlow;
@@ -8292,8 +8294,8 @@ public class io/getstream/video/android/core/call/connection/StreamPeerConnectio
82928294
}
82938295

82948296
public final class io/getstream/video/android/core/call/connection/StreamPeerConnectionFactory {
8295-
public fun <init> (Landroid/content/Context;ILorg/webrtc/ManagedAudioProcessingFactory;)V
8296-
public synthetic fun <init> (Landroid/content/Context;ILorg/webrtc/ManagedAudioProcessingFactory;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
8297+
public fun <init> (Landroid/content/Context;ILkotlin/jvm/functions/Function0;Lorg/webrtc/ManagedAudioProcessingFactory;)V
8298+
public synthetic fun <init> (Landroid/content/Context;ILkotlin/jvm/functions/Function0;Lorg/webrtc/ManagedAudioProcessingFactory;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
82978299
public final fun getEglBase ()Lorg/webrtc/EglBase;
82988300
public final fun getSenderCapabilities (Lorg/webrtc/MediaStreamTrack$MediaType;)Lorg/webrtc/RtpCapabilities;
82998301
public final fun isAudioProcessingEnabled ()Z

stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/Call.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -233,11 +233,13 @@ public class Call(
233233
internal var connectStartTime = 0L
234234
internal var reconnectStartTime = 0L
235235

236-
internal var peerConnectionFactory: StreamPeerConnectionFactory = StreamPeerConnectionFactory(
237-
context = clientImpl.context,
238-
audioProcessing = clientImpl.audioProcessing,
239-
audioUsage = clientImpl.callServiceConfigRegistry.get(type).audioUsage,
240-
)
236+
internal var peerConnectionFactory: StreamPeerConnectionFactory =
237+
StreamPeerConnectionFactory(
238+
context = clientImpl.context,
239+
audioProcessing = clientImpl.audioProcessing,
240+
audioUsage = clientImpl.callServiceConfigRegistry.get(type).audioUsage,
241+
audioUsageProvider = { clientImpl.callServiceConfigRegistry.get(type).audioUsage },
242+
)
241243

242244
internal val clientCapabilities = ConcurrentHashMap<String, ClientCapability>().apply {
243245
put(
@@ -256,7 +258,7 @@ public class Call(
256258
scope,
257259
peerConnectionFactory.eglBase.eglBaseContext,
258260
clientImpl.callServiceConfigRegistry.get(type).audioUsage,
259-
)
261+
) { clientImpl.callServiceConfigRegistry.get(type).audioUsage }
260262
}
261263
}
262264

stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/MediaManager.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,9 @@ class ScreenShareManager(
357357
*/
358358
class MicrophoneManager(
359359
val mediaManager: MediaManagerImpl,
360+
@Deprecated("Use audioUsageProvider instead", replaceWith = ReplaceWith("audioUsageProvider"))
360361
val audioUsage: Int,
362+
val audioUsageProvider: (() -> Int),
361363
) {
362364
// Internal data
363365
private val logger by taggedLogger("Media:MicrophoneManager")
@@ -474,7 +476,7 @@ class MicrophoneManager(
474476
setupCompleted = false
475477
}
476478

477-
fun canHandleDeviceSwitch() = audioUsage != AudioAttributes.USAGE_MEDIA
479+
fun canHandleDeviceSwitch() = audioUsageProvider.invoke() != AudioAttributes.USAGE_MEDIA
478480

479481
// Internal logic
480482
internal fun setup(preferSpeaker: Boolean = false, onAudioDevicesUpdate: (() -> Unit)? = null) {
@@ -1005,7 +1007,9 @@ class MediaManagerImpl(
10051007
val call: Call,
10061008
val scope: CoroutineScope,
10071009
val eglBaseContext: EglBase.Context,
1010+
@Deprecated("Use audioUsageProvider instead", replaceWith = ReplaceWith("audioUsageProvider"))
10081011
val audioUsage: Int = defaultAudioUsage,
1012+
val audioUsageProvider: (() -> Int) = { audioUsage },
10091013
) {
10101014
private val filterVideoProcessor =
10111015
FilterVideoProcessor({ call.videoFilter }, { camera.surfaceTextureHelper })
@@ -1040,7 +1044,7 @@ class MediaManagerImpl(
10401044

10411045
internal val camera =
10421046
CameraManager(this, eglBaseContext, DefaultCameraCharacteristicsValidator())
1043-
internal val microphone = MicrophoneManager(this, audioUsage)
1047+
internal val microphone = MicrophoneManager(this, audioUsage, audioUsageProvider)
10441048
internal val speaker = SpeakerManager(this, microphone)
10451049
internal val screenShare = ScreenShareManager(this, eglBaseContext)
10461050

stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/StreamPeerConnectionFactory.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ import java.nio.ByteBuffer
6262
*/
6363
public class StreamPeerConnectionFactory(
6464
private val context: Context,
65+
@Deprecated("Use audioUsageProvider instead")
6566
private val audioUsage: Int = defaultAudioUsage,
67+
private val audioUsageProvider: (() -> Int) = { audioUsage },
6668
private var audioProcessing: ManagedAudioProcessingFactory? = null,
6769
) {
6870

@@ -174,9 +176,9 @@ public class StreamPeerConnectionFactory(
174176
.setUseHardwareAcousticEchoCanceler(
175177
Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q,
176178
).apply {
177-
if (audioUsage != defaultAudioUsage) {
179+
if (audioUsageProvider.invoke() != defaultAudioUsage) {
178180
setAudioAttributes(
179-
AudioAttributes.Builder().setUsage(audioUsage)
181+
AudioAttributes.Builder().setUsage(audioUsageProvider.invoke())
180182
.build(),
181183
)
182184
}

stream-video-android-core/src/test/kotlin/io/getstream/video/android/core/MicrophoneManagerTest.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,13 @@ import org.junit.Test
3434
class MicrophoneManagerTest {
3535

3636
private val audioUsage = AudioAttributes.USAGE_VOICE_COMMUNICATION
37+
private val audioUsageProvider = { AudioAttributes.USAGE_VOICE_COMMUNICATION }
3738

3839
@Test
3940
fun `Ensure setup is called prior to any action onto the microphone manager`() = runTest {
4041
// Given
4142
val mediaManager = mockk<MediaManagerImpl>(relaxed = true)
42-
val actual = MicrophoneManager(mediaManager, audioUsage)
43+
val actual = MicrophoneManager(mediaManager, audioUsage, audioUsageProvider)
4344
val context = mockk<Context>(relaxed = true)
4445
every { mediaManager.context } returns context
4546
every { context.getSystemService(any()) } returns mockk<AudioManager>(relaxed = true)
@@ -86,6 +87,7 @@ class MicrophoneManagerTest {
8687
MicrophoneManager(
8788
mediaManager,
8889
audioUsage = AudioAttributes.USAGE_VOICE_COMMUNICATION,
90+
audioUsageProvider = { AudioAttributes.USAGE_VOICE_COMMUNICATION },
8991
)
9092
val context = mockk<Context>(relaxed = true)
9193
val microphoneManager = spyk(actual)
@@ -106,7 +108,7 @@ class MicrophoneManagerTest {
106108
fun `Ensure setup if ever the manager was cleaned`() {
107109
// Given
108110
val mediaManager = mockk<MediaManagerImpl>(relaxed = true)
109-
val actual = MicrophoneManager(mediaManager, audioUsage)
111+
val actual = MicrophoneManager(mediaManager, audioUsage, audioUsageProvider)
110112
val context = mockk<Context>(relaxed = true)
111113
val microphoneManager = spyk(actual)
112114
every { mediaManager.context } returns context
@@ -137,7 +139,7 @@ class MicrophoneManagerTest {
137139
fun `Resume will call enable only if prior status was DeviceStatus#enabled`() {
138140
// Given
139141
val mediaManager = mockk<MediaManagerImpl>(relaxed = true)
140-
val microphoneManager = MicrophoneManager(mediaManager, audioUsage)
142+
val microphoneManager = MicrophoneManager(mediaManager, audioUsage, audioUsageProvider)
141143
val spyMicrophoneManager = spyk(microphoneManager)
142144
val mockContext = mockk<Context>(relaxed = true)
143145
val mockCallState = mockk<CallState>(relaxed = true)

0 commit comments

Comments
 (0)