void OnCameraChangeClicked (NSObject sender)
{
ManualHUD.UserInteractionEnabled = false;
CameraButton.Enabled = false;
RecordButton.Enabled = false;
PhotoButton.Enabled = false;
CaptureModeControl.Enabled = false;
HUDButton.Enabled = false;
sessionQueue.DispatchAsync (() => {
AVCaptureDevicePosition preferredPosition = AVCaptureDevicePosition.Unspecified;
switch (VideoDevice.Position) {
case AVCaptureDevicePosition.Back:
preferredPosition = AVCaptureDevicePosition.Front;
break;
case AVCaptureDevicePosition.Unspecified:
case AVCaptureDevicePosition.Front:
preferredPosition = AVCaptureDevicePosition.Back;
break;
}
AVCaptureDevice newVideoDevice = GetDeviceFrom (AVMediaType.Video, preferredPosition);
AVCaptureDeviceInput newVideoDeviceInput = AVCaptureDeviceInput.FromDevice (newVideoDevice);
Session.BeginConfiguration ();
// Remove the existing device input first, since using the front and back camera simultaneously is not supported
Session.RemoveInput (VideoDeviceInput);
if (Session.CanAddInput (newVideoDeviceInput)) {
subjectAreaDidChangeToken?.Dispose ();
subjectAreaDidChangeToken = NSNotificationCenter.DefaultCenter.AddObserver (AVCaptureDevice.SubjectAreaDidChangeNotification, SubjectAreaDidChange, newVideoDevice);
Session.AddInput (newVideoDeviceInput);
VideoDeviceInput = newVideoDeviceInput;
VideoDevice = newVideoDeviceInput.Device;
} else {
Session.AddInput (VideoDeviceInput);
}
if (movieFileOutput != null) {
AVCaptureConnection connection = movieFileOutput.ConnectionFromMediaType (AVMediaType.Video);
if (connection.SupportsVideoStabilization)
connection.PreferredVideoStabilizationMode = AVCaptureVideoStabilizationMode.Auto;
}
Session.CommitConfiguration ();
DispatchQueue.MainQueue.DispatchAsync (() => {
ConfigureManualHUD ();
CameraButton.Enabled = true;
RecordButton.Enabled = (CaptureModeControl.SelectedSegment == (int)CaptureMode.Movie);
PhotoButton.Enabled = true;
CaptureModeControl.Enabled = true;
HUDButton.Enabled = true;
ManualHUD.UserInteractionEnabled = true;
});
});
}