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);
        }
Exemple #2
0
        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);
        }