Play system sound while recording video/audio
avaudiosession, avcapturesession, ios, xamarin, xamarin.ios
Solution
This is what I use in The Harlem Shake:
AudioSession.Initialize();
AudioSession.Category = AudioSessionCategory.MediaPlayback;
AudioSession.OverrideCategoryMixWithOthers = true;
Then to turn it off, I do this:
AudioSession.Initialize();
AudioSession.Category = AudioSessionCategory.AmbientSound;
AudioSession.OverrideCategoryMixWithOthers = false;
This allows me to play "the Harlem Shake" with `AVAudioPlayer` during video capture. It also overrides the silent switch on the iDevice. I don't know if `AudioSession.Initialize()` is required on both parts, you might play around with just calling it once.
Problem
I'm trying to play a "beep" sound as required by apple when I start recording a video. I've found through SO and other sources that you can't play a sound while you have an audio input going without some configuration. Here's my attempt at the configuration method: ``` private void SetupAudio() { beepSound = AssetBank.GetSystemSoundWav("video_record", "video_beep"); AudioSession.Initialize(); AudioSession.Interrupted += delegate { Console.WriteLine("Interrupted handler"); }; AudioSession.Category = AudioSessionCategory.PlayAndRecord; AudioSession.OverrideCategoryMixWithOthers = true; NSError err; AVAudioSession.SharedInstance().SetActive(true, out err); } ``` And here's my code where I setup the recording session: ``` public void SetupVideoCaptureSession(AVCaptureDevicePosition position) { // Setup devices foreach (var device in AVCaptureDevice.Devices) { if (device.HasMediaType(AVMediaType.Video)) { if (device.Position == AVCaptureDevicePosition.Front) { frontCam = device; } else if (device.Position == AVCaptureDevicePosition.Back) { backCam = device; } } } // Create capture session captureSession = new AVCaptureSession(); captureSession.BeginConfiguration(); captureSession.SessionPreset = AVCaptureSession.Preset640x480; // Create capture device switch (position) { case AVCaptureDevicePosition.Back: videoDevice = backCam; break; case AVCaptureDevicePosition.Front: videoDevice = frontCam; break; } if (null == videoDevice) { using (var alert = new UIAlertView { Message = "No camera detected!" }) { alert.AddButton("Okay!"); alert.Show(); } return; } audioDevice = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Audio); // Create capture device input NSError videoError, audioError; videoDeviceInput = new AVCaptureDeviceInput(videoDevice, out videoError); audioDeviceInput = new AVCaptureDeviceInput(audioDevice, out audioError); captureSession.AddInput(videoDeviceInput); captureSession.AddInput(audioDeviceInput); // Create capture device output videoOutput = new AVCaptureMovieFileOutput(); videoOutput.MaxRecordedDuration = new CMTime(10, 1); captureSession.AddOutput(videoOutput); if (null != previewLayer) previewLayer.RemoveFromSuperLayer(); // Create preview layer previewLayer = AVCaptureVideoPreviewLayer.FromSession(captureSession); previewLayer.Orientation = AVCaptureVideoOrientation.Portrait; previewLayer.VideoGravity = "AVLayerVideoGravityResizeAspectFill"; previewLayer.Frame = new RectangleF(new PointF(), ScreenSize); this.ParentScrollView.Layer.InsertSublayer(previewLayer, 0); // Start capture session SetupAudio(); captureSession.CommitConfiguration(); captureSession.StartRunning(); } ``` No matter what I try, I can't get a sound to play after I've started the capture session. Anyone solved this in MonoTouch?