in AmazonChimeSDKDemo/AmazonChimeSDKDemo/MeetingModule.swift [36:124]
func prepareMeeting(meetingId: String,
selfName: String,
audioMode: AudioMode,
audioDeviceCapabilities: AudioDeviceCapabilities,
callKitOption: CallKitOption,
enableAudioRedundancy: Bool,
reconnectTimeoutMs: Int,
overriddenEndpoint: String,
primaryExternalMeetingId: String,
completion: @escaping (Bool) -> Void) {
requestRecordPermission(audioDeviceCapabilities: audioDeviceCapabilities) { success in
guard success else {
completion(false)
return
}
self.cachedOverriddenEndpoint = overriddenEndpoint
self.cachedPrimaryExternalMeetingId = primaryExternalMeetingId
JoinRequestService.postJoinRequest(meetingId: meetingId,
name: selfName,
overriddenEndpoint: overriddenEndpoint,
primaryExternalMeetingId: primaryExternalMeetingId) { joinMeetingResponse in
guard let joinMeetingResponse = joinMeetingResponse else {
DispatchQueue.main.async {
completion(false)
}
return
}
let meetingResp = JoinRequestService.getCreateMeetingResponse(from: joinMeetingResponse)
let attendeeResp = JoinRequestService.getCreateAttendeeResponse(from: joinMeetingResponse)
let meetingSessionConfiguration = MeetingSessionConfiguration(createMeetingResponse: meetingResp,
createAttendeeResponse: attendeeResp,
urlRewriter: self.urlRewriter)
let audioVideoConfig: AudioVideoConfiguration
if (meetingSessionConfiguration.meetingFeatures.videoMaxResolution == VideoResolution.videoDisabled
|| meetingSessionConfiguration.meetingFeatures.videoMaxResolution == VideoResolution.videoResolutionHD
|| meetingSessionConfiguration.meetingFeatures.videoMaxResolution == VideoResolution.videoResolutionFHD
) {
audioVideoConfig = AudioVideoConfiguration(audioMode: audioMode,
audioDeviceCapabilities: audioDeviceCapabilities,
callKitEnabled: callKitOption != .disabled,
enableAudioRedundancy: enableAudioRedundancy,
videoMaxResolution: meetingSessionConfiguration.meetingFeatures.videoMaxResolution,
reconnectTimeoutMs: reconnectTimeoutMs)
} else {
audioVideoConfig = AudioVideoConfiguration(audioMode: audioMode,
audioDeviceCapabilities: audioDeviceCapabilities,
callKitEnabled: callKitOption != .disabled,
enableAudioRedundancy: enableAudioRedundancy,
videoMaxResolution: AudioVideoConfiguration.defaultVideoMaxResolution,
reconnectTimeoutMs: reconnectTimeoutMs)
}
let meetingModel = MeetingModel(meetingSessionConfig: meetingSessionConfiguration,
meetingId: meetingId,
primaryMeetingId: meetingSessionConfiguration.primaryMeetingId ?? "",
primaryExternalMeetingId: joinMeetingResponse.joinInfo.primaryExternalMeetingId ?? "",
selfName: selfName,
audioVideoConfig: audioVideoConfig,
callKitOption: callKitOption,
meetingEndpointUrl: overriddenEndpoint)
self.meetings[meetingModel.uuid] = meetingModel
switch callKitOption {
case .incoming:
guard let call = meetingModel.call else {
completion(false)
return
}
let backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: nil)
DispatchQueue.main.asyncAfter(deadline: .now() + incomingCallKitDelayInSeconds) {
CallKitManager.shared().reportNewIncomingCall(with: call)
UIApplication.shared.endBackgroundTask(backgroundTaskIdentifier)
}
case .outgoing:
guard let call = meetingModel.call else {
completion(false)
return
}
CallKitManager.shared().startOutgoingCall(with: call)
case .disabled:
DispatchQueue.main.async { [weak self] in
self?.selectDevice(meetingModel, completion: completion)
}
}
completion(true)
}
}
}