protected async void OnEnable() { if (Source != null) { return; } #if UNITY_WSA && !UNITY_EDITOR // Request access to audio capture. The OS may show some popup dialog to the // user to request permission. This will succeed only if the user approves it. try { if (UnityEngine.WSA.Application.RunningOnUIThread()) { await RequestAccessAsync(); } else { UnityEngine.WSA.Application.InvokeOnUIThread(() => RequestAccessAsync(), waitUntilDone: true); } } catch (Exception ex) { // Log an error and prevent activation Debug.LogError($"Audio access failure: {ex.Message}."); this.enabled = false; return; } #endif var initConfig = new LocalAudioDeviceInitConfig { AutoGainControl = _autoGainControl, }; Source = await WebRTC.AudioTrackSource.CreateFromDeviceAsync(initConfig); if (Source == null) { throw new Exception("Failed ot create microphone audio source."); } IsStreaming = true; AudioSourceStarted.Invoke(this); }
protected async void OnEnable() { if (Source != null) { return; } #if PLATFORM_ANDROID // Ensure Android binding is initialized before accessing the native implementation Android.Initialize(); // Check for permission to access the camera if (!Permission.HasUserAuthorizedPermission(Permission.Microphone)) { if (!_androidRecordAudioRequestPending) { // Monitor the OnApplicationFocus(true) event during the next 5 minutes, // and check for permission again each time (see below why). _androidRecordAudioRequestPending = true; _androidRecordAudioRequestRetryUntilTime = Time.time + 300; // Display dialog requesting user permission. This will return immediately, // and unfortunately there's no good way to tell when this completes. As a rule // of thumb, application should lose focus, so check when focus resumes should // be sufficient without having to poll every frame. Permission.RequestUserPermission(Permission.Microphone); } return; } #endif #if UNITY_WSA && !UNITY_EDITOR // Request access to audio capture. The OS may show some popup dialog to the // user to request permission. This will succeed only if the user approves it. try { if (UnityEngine.WSA.Application.RunningOnUIThread()) { await RequestAccessAsync(); } else { UnityEngine.WSA.Application.InvokeOnUIThread(() => RequestAccessAsync(), waitUntilDone: true); } } catch (Exception ex) { // Log an error and prevent activation Debug.LogError($"Audio access failure: {ex.Message}."); this.enabled = false; return; } #endif var initConfig = new LocalAudioDeviceInitConfig { AutoGainControl = _autoGainControl, }; try { Source = await DeviceAudioTrackSource.CreateAsync(initConfig); if (Source == null) { throw new Exception("DeviceAudioTrackSource.CreateAsync() returned a NULL source."); } } catch (Exception ex) { Debug.LogError($"Failed to create device track source for {nameof(MicrophoneSource)} component '{name}'."); Debug.LogException(ex, this); return; } IsStreaming = true; AudioSourceStarted.Invoke(this); }