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

  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) {
    _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);
    }
  }
  if (needUIDisabled) {
    _trtcStreamInfoObs.updateSelfMicDeviceDisabled(false);
  }
  _trtcStreamInfoObs.updateNeedOpenMicAfterStartLocalPreview(false);
}