Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- IEnumerator StartMicRoutineSafe()
- {
- if (micStarted)
- yield break;
- if (statusText)
- statusText.text = "Инициализирую микрофон...";
- // даём системе немного времени после закрытия окна разрешения
- yield return null;
- yield return new WaitForSecondsRealtime(0.25f);
- // ждём, пока приложение реально снова активно
- while (!Application.isFocused)
- yield return null;
- #if UNITY_ANDROID
- if (!Permission.HasUserAuthorizedPermission(Permission.Microphone))
- {
- if (statusText)
- statusText.text = "Нет доступа к микрофону";
- yield break;
- }
- #endif
- if (Microphone.devices.Length == 0)
- {
- // не сдаёмся сразу, а ждём немного
- float waitTime = 2f;
- while (Microphone.devices.Length == 0 && waitTime > 0f)
- {
- waitTime -= Time.unscaledDeltaTime;
- yield return null;
- }
- if (Microphone.devices.Length == 0)
- {
- if (statusText)
- statusText.text = "Микрофон не обнаружен";
- Debug.Log("Microphone not found after waiting");
- yield break;
- }
- }
- micDevice = string.IsNullOrEmpty(microphoneDevice) ? Microphone.devices[0] : microphoneDevice;
- micClip = Microphone.Start(micDevice, true, clipLengthSec, sampleRate);
- if (micClip == null)
- {
- if (statusText)
- statusText.text = "Не удалось включить микрофон";
- yield break;
- }
- float timeout = 2f;
- while (Microphone.GetPosition(micDevice) <= 0 && timeout > 0f)
- {
- timeout -= Time.unscaledDeltaTime;
- yield return null;
- }
- if (timeout <= 0f)
- {
- if (statusText)
- statusText.text = "Микрофон не запустился";
- yield break;
- }
- audioSource.loop = true;
- audioSource.clip = micClip;
- audioSource.mute = true;
- audioSource.Play();
- micStarted = true;
- if (statusText)
- statusText.text = "Микрофон включён";
- Debug.Log("Microphone started successfully");
- }
Advertisement