openMic method

Future<void> openMic(
  1. String from, {
  2. bool needUIDisabled = true,
  3. bool needToast = true,
  4. bool byTap = false,
})

Implementation

Future<void> openMic(String from, {bool needUIDisabled = true, bool needToast = true, bool byTap = false}) async {
  if (!_trtcStreamInfoObs.isSelfEnterRoom.value) {
    TCICLog.error("isSelfEnterRoom is false", actionModule: ActionModule.tcicController.name, actionName: ActionName.openMic.name);
    _trtcStreamInfoObs.updateNeedOpenMic(true);
    return;
  }
  if (_trtcStreamInfoObs.currentMicrophoneId.isEmpty && TcicScreen.isDeskTop()) {
    TCICLog.error("currentMicrophoneId is empty", actionModule: ActionModule.tcicController.name, actionName: ActionName.openMic.name);
    await networkService.selfStatusReport(StateReportBody(classId: _config.classId, state: StateStatusValueEnum.unknown, type: StateTypeEnum.mic));
    if (needToast) {
      TCICToast.show(StringEnum.openMicFailed);
    }
    return;
  }
  final microphonePermission = await checkMicrophonePermission();
  if (!microphonePermission) {
    TCICLog.error("microphone permission not granted", actionModule: ActionModule.tcicController.name, actionName: ActionName.openMic.name);
    TCICToast.show(StringEnum.noMicPermission);

    if (byTap) {
      final neverTips = sharedPreferences.getBool("never_tips_mic") ?? false;
      if (!neverTips) {
        TCICTips.warningWidget(_rootContext!, title: BaseText(StringEnum.warning), message: const PermissionTips(permissionType: PermissionType.mic));
      }
    }
    await networkService.selfStatusReport(StateReportBody(classId: _config.classId, state: StateStatusValueEnum.noPermission, type: StateTypeEnum.mic));
    return;
  }

  final isSlefOnStage = _membersInfoObs.getMemberInfoByUserId(_config.userId)?.stage == 1;
  if (!isSlefOnStage) {
    TCICLog.error("self is not on stage, open mic failed", actionModule: ActionModule.tcicController.name, actionName: ActionName.openMic.name);
    TCICToast.show(StringEnum.selfNotOnStageTips);
    return;
  }
  if (needUIDisabled) {
    _trtcStreamInfoObs.updateSelfMicDeviceDisabled(true);
  }

  // try/finally 守住 selfMicDeviceDisabled,避免 TRTC/网络异常把按钮锁死。
  try {
    await TRTC.openMic(from);
    // await TRTC.startLocalAudio(from);
    var res = await networkService.selfStatusReport(StateReportBody(classId: _config.classId, state: StateStatusValueEnum.on, type: StateTypeEnum.mic));
    if (res?.errorCode == 0) {
      _trtcStreamInfoObs.updateIsMicAvailable(true);
      _pendingMicRestoreAfterScreenShare = false;
      _membersInfoObs.updateSelfMemberInfoByAction(MemberActionType.micOpen, StateStatusValueEnum.on);
      TCICLog.info("打开麦克风成功", actionModule: ActionModule.tcicController.name, actionName: ActionName.openMic.name);
      if (needToast) {
        TCICToast.show(StringEnum.openMicSuccess);
      }
    } else {
      TCICLog.error("打开麦克风失败", actionModule: ActionModule.tcicController.name, actionName: ActionName.openMic.name);
      if (needToast) {
        TCICToast.show(StringEnum.openMicFailed);
      }
    }
  } catch (e) {
    TCICLog.error("打开麦克风异常: $e", actionModule: ActionModule.tcicController.name, actionName: ActionName.openMic.name);
    if (needToast) {
      TCICToast.show(StringEnum.openMicFailed);
    }
  } finally {
    if (needUIDisabled) {
      _trtcStreamInfoObs.updateSelfMicDeviceDisabled(false);
    }
    _trtcStreamInfoObs.updateNeedOpenMicAfterStartLocalPreview(false);
  }
}