in amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/audio/DefaultAudioClientController.kt [130:253]
override fun start(
audioFallbackUrl: String,
audioHostUrl: String,
meetingId: String,
attendeeId: String,
joinToken: String,
audioMode: AudioMode,
audioDeviceCapabilities: AudioDeviceCapabilities,
audioStreamType: AudioStreamType,
audioRecordingPresetOverride: AudioRecordingPresetOverride,
enableAudioRedundancy: Boolean,
reconnectTimeoutMs: Int
) {
// Validate audio client state
if (audioClientState != AudioClientState.INITIALIZED &&
audioClientState != AudioClientState.STOPPED
) {
logger.warn(
TAG,
"Current audio client state $audioClientState is invalid to start audio, ignoring"
)
return
}
if (audioHostUrl.isBlank() || audioFallbackUrl.isBlank()) {
logger.error(
TAG,
"`audioHostUrl` or `audioFallbackUrl` is blank"
)
throw Exception("Audio failed to start")
}
val audioUrlParts: List<String> =
audioHostUrl.split(":".toRegex()).dropLastWhile { it.isEmpty() }
val (host: String, portStr: String) = if (audioUrlParts.size == 2) audioUrlParts else listOf(
audioUrlParts[0],
"$AUDIO_PORT_OFFSET"
)
// We subtract 200 here since audio client will add an offset of 200 for the DTLS port
val port = try {
Integer.parseInt(portStr) - AUDIO_PORT_OFFSET
} catch (exception: Exception) {
logger.warn(
TAG,
"Error parsing int. Using default value. Exception: ${exception.message}"
)
DEFAULT_PORT
}
setUpAudioConfiguration(audioMode)
meetingStatsCollector.updateMeetingStartConnectingTimeMs()
eventAnalyticsController.publishEvent(EventName.meetingStartRequested)
audioClientObserver.notifyAudioClientObserver { observer ->
observer.onAudioSessionStartedConnecting(
false
)
}
logger.info(TAG,
"audioMode: $audioMode, audioStreamType: $audioStreamType, audioRecordingPresetOverride: $audioRecordingPresetOverride, enableAudioRedundancy: $enableAudioRedundancy"
)
audioManager.mode = AudioManager.MODE_IN_COMMUNICATION
val appInfo = AppInfoUtil.initializeAudioClientAppInfo(context)
uiScope.launch {
val audioModeInternal = when (audioMode) {
AudioMode.Mono16K -> AudioModeInternal.MONO_16K
AudioMode.Mono48K -> AudioModeInternal.MONO_48K
AudioMode.Stereo48K -> AudioModeInternal.STEREO_48K
else -> AudioModeInternal.STEREO_48K
}
val audioDeviceCapabilitiesInternal = mapAudioDeviceCapabilitiesToInternal(audioDeviceCapabilities)
val audioStreamTypeInternal = when (audioStreamType) {
AudioStreamType.VoiceCall -> AudioClient.AudioStreamType.VOICE_CALL
AudioStreamType.Music -> AudioClient.AudioStreamType.MUSIC
}
val audioRecordingPresetInternal = when (audioRecordingPresetOverride) {
AudioRecordingPresetOverride.None -> getDefaultRecordingPreset()
AudioRecordingPresetOverride.Generic -> AudioClient.AudioRecordingPreset.GENERIC
AudioRecordingPresetOverride.Camcorder -> AudioClient.AudioRecordingPreset.CAMCORDER
AudioRecordingPresetOverride.VoiceRecognition -> AudioClient.AudioRecordingPreset.VOICE_RECOGNITION
AudioRecordingPresetOverride.VoiceCommunication -> AudioClient.AudioRecordingPreset.VOICE_COMMUNICATION
}
val config = AudioClientSessionConfig.Builder(
host,
port,
joinToken,
meetingId,
attendeeId,
audioFallbackUrl,
appInfo,
audioModeInternal,
audioDeviceCapabilitiesInternal,
audioStreamTypeInternal,
audioRecordingPresetInternal,
enableAudioRedundancy
).withTransportMode(AudioClient.XTL_DEFAULT_TRANSPORT)
.withMicMute(muteMicAndSpeaker)
.withSpkMute(muteMicAndSpeaker)
.withPresenter(DEFAULT_PRESENTER)
.withProxyConfig(null)
.withReconnectTimeoutMs(reconnectTimeoutMs)
.build()
val res = audioClient.startSession(config)
if (res != AUDIO_CLIENT_RESULT_SUCCESS) {
logger.error(TAG, "Failed to start audio session. Response code: $res")
eventAnalyticsController.publishEvent(
EventName.meetingStartFailed,
mutableMapOf(EventAttributeName.meetingStatus to audioClientObserver.currentAudioStatus as MeetingSessionStatusCode)
)
} else {
logger.info(TAG, "Started audio session.")
audioClientState = AudioClientState.STARTED
}
}
}