override fun start()

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
            }
        }
    }