475 lines
19 KiB
Swift
475 lines
19 KiB
Swift
//
|
|
// MewRoomMicSeatView.swift
|
|
// yinmeng-ios
|
|
//
|
|
// Created by duoban on 2024/1/16.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
|
|
typealias MewSetMicDownSucceed = (_ down:String,_ next:String?)-> Void
|
|
|
|
class MewRoomMicSeatView: UIView {
|
|
|
|
@objc public var mewViewList:[MewRoomMicSeatImageView] = []
|
|
|
|
var succeedDownBlock:MewSetMicDownSucceed?
|
|
var mewMicList:[String:MewMicListModel] = {
|
|
var _mewMicList = [:] as [String:MewMicListModel]
|
|
|
|
for i in 0 ..< 7 {
|
|
let micNum = "\(i-1)"
|
|
let mewMicModel = MewMicListModel()
|
|
mewMicModel.userInfo = nil
|
|
mewMicModel.microState?.position = Int32(i-1)
|
|
mewMicModel.microState = MewSeatMicStateModel()
|
|
_mewMicList[micNum] = mewMicModel
|
|
}
|
|
|
|
|
|
return _mewMicList
|
|
}()
|
|
var chooseView:MewRoomMicSeatImageView?
|
|
var mewRoomData:MewRoomPlayModel?
|
|
var mewUserData:MewPersonInfoModel?
|
|
var isGetListSuccess = false
|
|
var isUpMicSeat = false
|
|
@objc public var mewChooseUid:String?
|
|
override init(frame: CGRect) {
|
|
super.init(frame: frame)
|
|
mewSetUI()
|
|
|
|
|
|
TRTCCloud.sharedInstance().enableAudioVolumeEvaluation(900, enable_vad: true)
|
|
TRTCCloud.setConsoleEnabled(false)
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
private func mewSetUI(){
|
|
for i in 0 ..< 7 {
|
|
let imageView = MewRoomMicSeatImageView()
|
|
mewViewList.append(imageView)
|
|
|
|
addSubview(imageView)
|
|
|
|
imageView.layer.masksToBounds = true
|
|
imageView.layer.borderWidth = 0
|
|
let tap = UITapGestureRecognizer.init(target: self, action: #selector(mewClickMicSeat(sender:)))
|
|
imageView.addGestureRecognizer(tap)
|
|
imageView.layer.borderColor = R.color.mewRoomMicSeatColor()?.cgColor
|
|
imageView.tag = i - 1
|
|
|
|
|
|
if i == 1{
|
|
imageView.mewImage = R.image.mew_room_position_empty()!
|
|
imageView.layer.cornerRadius = 35
|
|
imageView.snp.makeConstraints { make in
|
|
make.width.height.equalTo(70)
|
|
make.left.equalTo(32)
|
|
make.top.equalTo(172)
|
|
}
|
|
}else if i == 2{
|
|
imageView.mewImage = R.image.mew_room_position_empty()!
|
|
imageView.layer.cornerRadius = 35
|
|
imageView.snp.makeConstraints { make in
|
|
make.width.height.equalTo(70)
|
|
make.centerX.equalTo(self)
|
|
make.top.equalTo(172)
|
|
}
|
|
}else if i == 3{
|
|
imageView.mewImage = R.image.mew_room_position_empty()!
|
|
imageView.layer.cornerRadius = 35
|
|
imageView.snp.makeConstraints { make in
|
|
make.width.height.equalTo(70)
|
|
make.right.equalTo(-32)
|
|
make.top.equalTo(172)
|
|
}
|
|
}else if i == 4{
|
|
imageView.mewImage = R.image.mew_room_position_empty()!
|
|
imageView.layer.cornerRadius = 35
|
|
imageView.snp.makeConstraints { make in
|
|
make.width.height.equalTo(70)
|
|
make.left.equalTo(32)
|
|
make.top.equalTo(256)
|
|
}
|
|
}else if i == 5{
|
|
imageView.mewImage = R.image.mew_room_position_empty()!
|
|
imageView.layer.cornerRadius = 35
|
|
imageView.snp.makeConstraints { make in
|
|
make.width.height.equalTo(70)
|
|
make.centerX.equalTo(self)
|
|
make.top.equalTo(256)
|
|
}
|
|
}else if i == 6{
|
|
imageView.mewImage = R.image.mew_room_position_empty()!
|
|
imageView.layer.cornerRadius = 35
|
|
imageView.snp.makeConstraints { make in
|
|
make.width.height.equalTo(70)
|
|
make.right.equalTo(-32)
|
|
make.top.equalTo(256)
|
|
}
|
|
}else{
|
|
imageView.layer.cornerRadius = 10
|
|
imageView.snp.makeConstraints { make in
|
|
make.width.equalTo(130)
|
|
make.height.equalTo(148)
|
|
make.left.equalTo(32)
|
|
make.top.equalTo(0)
|
|
}
|
|
imageView.mewImage = R.image.mew_room_position_first_empty()!
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
func mewGetChooseView(uid:String){
|
|
for subView in self.mewViewList{
|
|
if let u = subView.mewMicInfo?.userInfo {
|
|
let curUid = "\(u.uid)"
|
|
if(uid == curUid){
|
|
self.chooseView = subView
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
func mewDownMic(down:String,next:String?){
|
|
if let roomId = self.mewRoomData?.roomId {
|
|
let mewRequest = NIMChatroomQueueRemoveRequest()
|
|
mewRequest.key = down
|
|
mewRequest.roomId = String(format: "%ld", roomId)
|
|
NIMSDK.shared().chatroomManager.removeChatroomQueueObject(mewRequest) { error, dataInfo in
|
|
if error == nil, let curNext = next{
|
|
|
|
|
|
if(self.isGetListSuccess == false){return}
|
|
let micData = self.mewMicList[curNext]
|
|
if micData?.userInfo != nil{
|
|
MewHUDTool.showError(withMessage: "该麦位已经有人了哦~")
|
|
return
|
|
}
|
|
|
|
if let mewUser = self.mewUserData, let roomId = self.mewRoomData?.roomId{
|
|
let mewRequest = NIMChatroomQueueUpdateRequest()
|
|
mewRequest.key = curNext
|
|
let extData = MewMicExtDataModel()
|
|
extData.avatar = mewUser.avatar
|
|
extData.uid = mewUser.uid
|
|
extData.nick = mewUser.nick
|
|
let dic = extData.mj_keyValues().copy() as! NSDictionary
|
|
mewRequest.value = dic.mj_JSONString()
|
|
mewRequest.roomId = String(format: "%ld", roomId)
|
|
mewRequest.transient = true
|
|
NIMSDK.shared().chatroomManager.updateChatroomQueueObject(mewRequest) { error in
|
|
|
|
self.isGetListSuccess = false
|
|
|
|
|
|
}
|
|
}
|
|
|
|
}else{
|
|
self.isUpMicSeat = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@objc func mewClickMicSeat(sender:UITapGestureRecognizer){
|
|
guard let index = sender.view?.tag else { return }
|
|
let view = sender.view as! MewRoomMicSeatImageView
|
|
if view.mewMicInfo?.userInfo != nil{
|
|
for subView in self.mewViewList{
|
|
if subView == view{
|
|
if subView.layer.borderWidth == 2{
|
|
subView.layer.borderWidth = 0
|
|
|
|
}else{
|
|
|
|
if let uid = view.mewMicInfo?.userInfo?.uid{
|
|
let getUid = "\(uid)"
|
|
if getUid == MewSaveBaseUserModel.share().mewGetUserId(){
|
|
mewDownMic(down: String(index), next: nil)
|
|
}else{
|
|
subView.layer.borderWidth = 2
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}else{
|
|
subView.layer.borderWidth = 0
|
|
self.mewChooseUid = nil
|
|
}
|
|
|
|
}
|
|
return
|
|
}
|
|
if let roomId = self.mewRoomData?.roomId,let uid = self.mewRoomData?.uid{
|
|
let mewRequest = NIMChatroomMembersByIdsRequest()
|
|
mewRequest.roomId = String(format: "%ld", roomId)
|
|
mewRequest.userIds = ["\(uid)"]
|
|
|
|
NIMSDK.shared().chatroomManager.fetchChatroomMembers(byIds: mewRequest) { error, dataList in
|
|
if (dataList?.first) != nil{
|
|
|
|
let getNum = String(index)
|
|
|
|
if(self.isGetListSuccess == false){return}
|
|
let micData = self.mewMicList[getNum]
|
|
if micData?.userInfo != nil{
|
|
MewHUDTool.showError(withMessage: "该麦位已经有人了哦~")
|
|
return
|
|
}
|
|
|
|
if let mewUser = self.mewUserData, let roomId = self.mewRoomData?.roomId{
|
|
let mewRequest = NIMChatroomQueueUpdateRequest()
|
|
mewRequest.key = getNum
|
|
let extData = MewMicExtDataModel()
|
|
extData.avatar = mewUser.avatar
|
|
extData.uid = mewUser.uid
|
|
extData.nick = mewUser.nick
|
|
let dic = extData.mj_keyValues().copy() as! NSDictionary
|
|
mewRequest.value = dic.mj_JSONString()
|
|
mewRequest.roomId = String(format: "%ld", roomId)
|
|
mewRequest.transient = true
|
|
NIMSDK.shared().chatroomManager.updateChatroomQueueObject(mewRequest) { error in
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
public func mewDealWitMicData(msg:NIMMessage){
|
|
var isChanged = false
|
|
var isTRTCChanged = false
|
|
if let mewMsgObj = msg.messageObject as? NIMNotificationObject,let mewContent = mewMsgObj.content as? NIMChatroomNotificationContent{
|
|
|
|
switch mewContent.eventType {
|
|
case NIMChatroomEventType.infoUpdated:
|
|
if let mewdata = mewContent.notifyExt?.mj_JSONObject() as? NSDictionary, let type = mewdata["type"] as? Int{
|
|
|
|
var stateList:[MewSeatMicStateModel] = []
|
|
switch type {
|
|
case 2:
|
|
if let micData = mewdata["micInfo"] as? NSDictionary {
|
|
if let micModel = MewSeatMicStateModel.mj_object(withKeyValues: micData){
|
|
stateList = [micModel]
|
|
}
|
|
|
|
}
|
|
break
|
|
case 3:
|
|
if let micData = mewdata["micInfo"] as? NSDictionary {
|
|
let micModel = MewSeatMicStateModel.mj_objectArray(withKeyValuesArray: micData)
|
|
stateList = micModel as! [MewSeatMicStateModel]
|
|
|
|
|
|
}
|
|
break
|
|
default:
|
|
break
|
|
}
|
|
|
|
for obj in stateList{
|
|
let num = obj.position
|
|
let micQ = self.mewMicList["\(num)"]
|
|
micQ?.microState = obj
|
|
|
|
}
|
|
isChanged = true
|
|
|
|
}
|
|
|
|
|
|
|
|
break
|
|
case NIMChatroomEventType.queueChange:
|
|
|
|
|
|
if let mewData = mewContent.ext as? NSDictionary , let userDic = mewData[NIMChatroomEventInfoQueueChangeItemValueKey] as? String,let type = mewData[NIMChatroomEventInfoQueueChangeTypeKey] as? Int{
|
|
let num = mewData[NIMChatroomEventInfoQueueChangeItemKey] as! String
|
|
if let user = MewPersonInfoModel.mj_object(withKeyValues: userDic ){
|
|
if("\(user.uid)" == MewSaveBaseUserModel.share().mewGetUserId() ){
|
|
isTRTCChanged = true
|
|
}
|
|
for obj in self.mewMicList.values{
|
|
if obj.userInfo?.uid == user.uid{
|
|
obj.userInfo = nil
|
|
}
|
|
}
|
|
|
|
if type == 1 {
|
|
let micInfo = self.mewMicList[num]
|
|
micInfo?.userInfo = user
|
|
if "\(micInfo?.userInfo?.uid ?? 0)" == MewSaveBaseUserModel.share().mewGetUserId(){
|
|
TRTCCloud.sharedInstance().muteLocalAudio(false)
|
|
}
|
|
}
|
|
isChanged = true
|
|
}
|
|
}
|
|
break
|
|
default:
|
|
break
|
|
}
|
|
|
|
}
|
|
|
|
|
|
if isChanged == true{
|
|
mewUpdatedMic(isHaveRTRC: isTRTCChanged)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@objc public func mewEnterRoom(_ roomData:MewRoomPlayModel,_ user:MewPersonInfoModel){
|
|
self.mewRoomData = roomData
|
|
self.mewUserData = user
|
|
self.mewSetTRTC()
|
|
mewSetMicList()
|
|
}
|
|
|
|
func mewSetTRTC(){
|
|
if let roomId = self.mewRoomData?.roomId,let uid = self.mewRoomData?.uid{
|
|
|
|
let curRoomId = roomId > INT_MAX ? uid : roomId
|
|
TRTCCloud.sharedInstance().enableAudioVolumeEvaluation(900, enable_vad: true)
|
|
let mewParams = TRTCParams()
|
|
|
|
if let mewTRTCKey = UserDefaults.standard.value(forKey: MewEncryptManager.mewAESDecryptText("o1/PeEYsNHSpIJ8pkmQkRA==")) as? String{
|
|
if mewTRTCKey.isEmpty{
|
|
let curKey = MewEncryptManager.mewAESDecryptText("KuvNPAVFOJuCIn4wjVeOMw==")
|
|
mewParams.sdkAppId = UInt32(curKey) ?? 0
|
|
}else{
|
|
mewParams.sdkAppId = UInt32(mewTRTCKey) ?? 0
|
|
}
|
|
|
|
mewParams.roomId = UInt32(curRoomId)
|
|
mewParams.userId = MewSaveBaseUserModel.share().mewGetUserId()
|
|
let sign = self.mewRoomData?.trtcSig ?? ""
|
|
mewParams.userSig = sign
|
|
mewParams.role = TRTCRoleType.audience
|
|
TRTCCloud.sharedInstance().enterRoom(mewParams, appScene: TRTCAppScene.LIVE)
|
|
TRTCCloud.sharedInstance().muteAllRemoteAudio(false)
|
|
TRTCCloud.sharedInstance().muteLocalAudio(false)
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
func mewSetMicList(){
|
|
mewGetMicState()
|
|
isGetListSuccess = false
|
|
if let roomId = self.mewRoomData?.roomId{
|
|
NIMSDK.shared().chatroomManager.fetchChatroomQueue(String(format: "%ld", roomId)) { error, dataList in
|
|
if error != nil{return}
|
|
var isRTCChange = false
|
|
for obj in dataList ?? []{
|
|
if let userData = MewPersonInfoModel.mj_object(withKeyValues: obj.values.first ?? ""){
|
|
if let num = obj.keys.first{
|
|
let model = self.mewMicList[num]
|
|
model?.userInfo = userData
|
|
let myUid = Int(MewSaveBaseUserModel.share().mewGetUserId())
|
|
if userData.uid == myUid{
|
|
isRTCChange = true
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
self.mewUpdatedMic(isHaveRTRC: isRTCChange)
|
|
self.isGetListSuccess = true
|
|
}
|
|
}
|
|
}
|
|
func mewUpdatedMic(isHaveRTRC:Bool){
|
|
var mewIsNeedBroadcast = false
|
|
if let uid = self.mewRoomData?.uid{
|
|
for i in 0 ..< 7 {
|
|
|
|
let mewView = mewViewList[i]
|
|
mewView.layer.borderWidth = 0
|
|
let micNum = "\(i-1)"
|
|
let mewModel = self.mewMicList[micNum]
|
|
mewView.mewMicInfo = mewModel
|
|
if uid == mewModel?.userInfo?.uid{
|
|
mewIsNeedBroadcast = mewModel?.microState?.micState == .Open
|
|
}
|
|
if(mewModel?.microState?.micState == .Close){
|
|
TRTCCloud.sharedInstance().muteLocalAudio(true)
|
|
}
|
|
}
|
|
}
|
|
|
|
if(isHaveRTRC == false){
|
|
return
|
|
}
|
|
mewSetBroadcast(isOn: mewIsNeedBroadcast)
|
|
|
|
}
|
|
func mewSetBroadcast(isOn:Bool){
|
|
TRTCCloud.sharedInstance().switch(isOn ? TRTCRoleType.anchor : TRTCRoleType.audience)
|
|
if(isOn == true){
|
|
let tetx = "{\"api\":\"setAudioQualityEx\",\"params\":{\"sampleRate\":48000,\"channel\":2,\"bitrate\":192,\"encodeMode\":1,\"systemVolumeType\":1}}"
|
|
TRTCCloud.sharedInstance().callExperimentalAPI(tetx)
|
|
let aecText = "{\"api\":\"enableAudioAEC\",\"params\":{\"enable\":1,\"level\":100}}"
|
|
TRTCCloud.sharedInstance().callExperimentalAPI(aecText)
|
|
TRTCCloud.sharedInstance().startLocalAudio(TRTCAudioQuality.music)
|
|
}else{
|
|
TRTCCloud.sharedInstance().stopLocalAudio()
|
|
}
|
|
}
|
|
|
|
func mewGetMicState(){
|
|
if let roomId = self.mewRoomData?.roomId{
|
|
NIMSDK.shared().chatroomManager .fetchChatroomInfo(String(format: "%ld", roomId)) { error, chatData in
|
|
if error == nil{
|
|
if let data = chatData?.ext?.mj_JSONObject() as? [String:Any],let stateData = data["micQueue"] as? NSDictionary,let state = stateData.mj_JSONObject() as? NSDictionary {
|
|
for index in state.allKeys{
|
|
if let getIndxe = index as? String{
|
|
if let curStrate = MewSeatMicStateModel.mj_object(withKeyValues: state[index] ?? ""){
|
|
let model:MewMicListModel? = self.mewMicList[getIndxe] ?? nil
|
|
|
|
model?.microState = curStrate
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
self.mewUpdatedMic(isHaveRTRC: false)
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|