141 lines
4.4 KiB
Swift
141 lines
4.4 KiB
Swift
//
|
|
// Agora.swift
|
|
// SodaLive
|
|
//
|
|
// Created by klaus on 2023/08/14.
|
|
//
|
|
|
|
import Foundation
|
|
import AgoraRtcKit
|
|
import AgoraRtmKit
|
|
|
|
final class Agora {
|
|
static let shared = Agora()
|
|
|
|
var rtcEngineDelegate: AgoraRtcEngineDelegate?
|
|
var rtmDelegate: AgoraRtmDelegate?
|
|
|
|
var rtcEngine: AgoraRtcEngineKit?
|
|
|
|
var rtmKit: AgoraRtmKit?
|
|
var rtmChannel: AgoraRtmChannel?
|
|
|
|
func initialize() {
|
|
rtcEngine = AgoraRtcEngineKit.sharedEngine(withAppId: AGORA_APP_ID, delegate: rtcEngineDelegate)
|
|
rtcEngine?.setChannelProfile(.liveBroadcasting)
|
|
rtcEngine?.enableAudio()
|
|
rtcEngine?.enableAudioVolumeIndication(500, smooth: 3, reportVad: true)
|
|
|
|
rtmKit = AgoraRtmKit(appId: AGORA_APP_ID, delegate: rtmDelegate)
|
|
}
|
|
|
|
func deInit() {
|
|
if let rtcEngine = rtcEngine {
|
|
rtcEngine.leaveChannel(nil)
|
|
|
|
DispatchQueue.global(qos: .userInitiated).async {
|
|
AgoraRtcEngineKit.destroy()
|
|
}
|
|
}
|
|
|
|
rtmChannel?.leave(completion: nil)
|
|
rtmKit?.logout(completion: nil)
|
|
rtcEngine = nil
|
|
rtmChannel = nil
|
|
rtmKit = nil
|
|
}
|
|
|
|
func setRole(role: AgoraClientRole) {
|
|
self.rtcEngine?.setClientRole(role)
|
|
}
|
|
|
|
func joinChannel(
|
|
roomInfo: GetRoomInfoResponse,
|
|
rtmChannelDelegate: AgoraRtmChannelDelegate,
|
|
onConnectSuccess: @escaping (Bool) -> Void,
|
|
onConnectFail: @escaping () -> Void
|
|
) {
|
|
if rtmChannel != nil {
|
|
return
|
|
}
|
|
|
|
let userId = UserDefaults.int(forKey: .userId)
|
|
|
|
rtcEngine?.joinChannel(
|
|
byToken: roomInfo.rtcToken,
|
|
channelId: roomInfo.channelName,
|
|
info: nil,
|
|
uid: UInt(userId),
|
|
joinSuccess: nil
|
|
)
|
|
|
|
rtcEngine?.setAudioProfile(.musicHighQualityStereo)
|
|
rtcEngine?.setAudioScenario(.gameStreaming)
|
|
|
|
rtmChannel = rtmKit?.createChannel(
|
|
withId: roomInfo.channelName,
|
|
delegate: rtmChannelDelegate
|
|
)
|
|
|
|
rtmKit?.login(
|
|
byToken: roomInfo.rtmToken,
|
|
user: String(userId),
|
|
completion: { [unowned self] loginErrorCode in
|
|
if loginErrorCode == .ok {
|
|
self.rtmChannel?.join(completion: { joinChannelErrorCode in
|
|
if joinChannelErrorCode == .channelErrorOk {
|
|
if userId == roomInfo.creatorId {
|
|
self.setRole(role: .broadcaster)
|
|
} else {
|
|
self.setRole(role: .audience)
|
|
}
|
|
|
|
onConnectSuccess(userId == roomInfo.creatorId)
|
|
} else {
|
|
onConnectFail()
|
|
}
|
|
})
|
|
} else {
|
|
onConnectFail()
|
|
}
|
|
}
|
|
)
|
|
}
|
|
|
|
func sendMessageToPeer(peerId: String, rawMessage: Data, completion: AgoraRtmSendPeerMessageBlock?) {
|
|
let option = AgoraRtmSendMessageOptions()
|
|
option.enableOfflineMessaging = false
|
|
option.enableHistoricalMessaging = false
|
|
|
|
let message = AgoraRtmRawMessage(rawData: rawMessage, description: "")
|
|
rtmKit?.send(message, toPeer: peerId, completion: completion)
|
|
}
|
|
|
|
func mute(_ isMute: Bool) {
|
|
rtcEngine?.muteLocalAudioStream(isMute)
|
|
}
|
|
|
|
func speakerMute(_ isMute: Bool) {
|
|
rtcEngine?.muteAllRemoteAudioStreams(isMute)
|
|
}
|
|
|
|
func sendMessageToGroup(textMessage: String, completion: @escaping AgoraRtmSendChannelMessageBlock) {
|
|
let message = AgoraRtmMessage(text: textMessage)
|
|
rtmChannel?.send(message, completion: completion)
|
|
}
|
|
|
|
func sendRawMessageToGroup(rawMessage: LiveRoomChatRawMessage, completion: AgoraRtmSendChannelMessageBlock? = nil, fail: (() -> Void)? = nil) {
|
|
let encoder = JSONEncoder()
|
|
let jsonMessageData = try? encoder.encode(rawMessage)
|
|
|
|
if let jsonMessageData = jsonMessageData {
|
|
let message = AgoraRtmRawMessage(rawData: jsonMessageData, description: "")
|
|
rtmChannel?.send(message, completion: completion)
|
|
} else {
|
|
if let fail = fail {
|
|
fail()
|
|
}
|
|
}
|
|
}
|
|
}
|