public Task <AudioRecordResult> Record(AudioRecordOptions options = null) { _options = options ?? AudioRecordOptions.Empty; _tcs = new TaskCompletionSource <AudioRecordResult>(); _bufferSize = AudioRecord.GetMinBufferSize(_options.SampleRate, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING) * 3; _recorder = new AudioRecord(AudioSource.VoiceRecognition, _options.SampleRate, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, _bufferSize); if (_recorder.State == State.Initialized) { _recorder.StartRecording(); } else { return(Task.FromResult(new AudioRecordResult($"AudioRecord initialisation returned unexpected state ({_recorder.State})"))); } _isRecording = true; _timeoutToken = new CancellationTokenSource(); Task.Run(() => RecordAudio()); Task.Run(() => Timeout()); return(_tcs.Task); }
public Task <AudioRecordResult> Record(AudioRecordOptions options = null) { _options = options ?? AudioRecordOptions.Empty; _tcs = new TaskCompletionSource <AudioRecordResult>(); var audioSession = AVAudioSession.SharedInstance(); var err = audioSession.SetCategory(AVAudioSessionCategory.PlayAndRecord); if (err != null) { return(Task.FromResult(new AudioRecordResult($"AVAudioSession.SetCategory returned error '{err}'"))); } err = audioSession.SetActive(true); if (err != null) { return(Task.FromResult(new AudioRecordResult($"AVAudioSession.SetActive returned error '{err}'"))); } _audioFilePath = Path.Combine(Path.GetTempPath(), $"audiorec_{DateTime.Now.Ticks}.wav"); Console.WriteLine("Audio File Path: " + _audioFilePath); var url = NSUrl.FromFilename(_audioFilePath); var config = new Dictionary <NSObject, NSObject> { { AVAudioSettings.AVSampleRateKey, NSNumber.FromFloat((float)_options.SampleRate) }, { AVAudioSettings.AVFormatIDKey, NSNumber.FromInt32((int)AudioToolbox.AudioFormatType.LinearPCM) }, { AVAudioSettings.AVNumberOfChannelsKey, NSNumber.FromInt32(1) }, { AVAudioSettings.AVLinearPCMBitDepthKey, NSNumber.FromInt32(16) }, { AVAudioSettings.AVLinearPCMIsBigEndianKey, NSNumber.FromBoolean(false) }, { AVAudioSettings.AVLinearPCMIsFloatKey, NSNumber.FromBoolean(false) } }; var settings = NSDictionary.FromObjectsAndKeys(config.Keys.ToArray(), config.Values.ToArray()); _recorder = AVAudioRecorder.Create(url, new AudioSettings(settings), out err); if (err != null) { return(Task.FromResult(new AudioRecordResult($"AVAudioRecorder.Create returned error '{err}'"))); } _recorder.PrepareToRecord(); _recorder.Record(); Task.Run(() => Timeout()); return(_tcs.Task); }