/// <summary> /// Creates a new instance of <see cref="IRecorder"/> writing to <see cref="IAudioFileWriter"/>. /// </summary> /// <param name="AudioWriter">The <see cref="IAudioFileWriter"/> to write to.</param> /// <param name="AudioProvider">The audio source.</param> public Recorder(IAudioFileWriter AudioWriter, IAudioProvider AudioProvider) { _audioWriter = AudioWriter ?? throw new ArgumentNullException(nameof(AudioWriter)); _audioProvider = AudioProvider ?? throw new ArgumentNullException(nameof(AudioProvider)); _audioProvider.DataAvailable += (s, e) => _audioWriter.Write(e.Buffer, 0, e.Length); }
/// <summary> /// Creates a new instance of <see cref="IRecorder"/> writing to <see cref="IAudioFileWriter"/>. /// </summary> /// <param name="audioWriter">The <see cref="IAudioFileWriter"/> to write to.</param> /// <param name="audioProvider">The audio source.</param> public Recorder(IAudioFileWriter audioWriter, IAudioProvider audioProvider) { _audioWriter = audioWriter ?? throw new ArgumentNullException(nameof(audioWriter)); _audioProvider = audioProvider ?? throw new ArgumentNullException(nameof(audioProvider)); _audioProvider.DataAvailable += AudioProvider_DataAvailable; }
private void Dispose(bool terminateRecord) { if (_disposed) { return; } _disposed = true; if (_audioProvider != null) { _audioProvider.DataAvailable -= AudioProvider_DataAvailable; _audioProvider.Stop(); _audioProvider.Dispose(); _audioProvider = null; } if (_videoWriter != null) { _cancellationTokenSource.Cancel(); // Resume record loop if paused so it can exit _continueCapturing.Set(); if (terminateRecord) { _recordTask.Wait(); } try { if (_task != null && !_task.IsCompleted) { _task.GetAwaiter().GetResult(); } } catch { // Ignored in dispose } _videoWriter.Dispose(); _videoWriter = null; _continueCapturing.Dispose(); } else { _audioWriter.Dispose(); _audioWriter = null; } _imageProvider?.Dispose(); _imageProvider = null; }
public void Dispose() { _continueEvent.Set(); _stopEvent.Set(); _loopTask.Wait(); _buffer = null; _audioWriter.Dispose(); _audioWriter = null; _audioProvider.Dispose(); _audioProvider = null; }
/// <summary> /// Creates a new instance of <see cref="AudioRecorder"/>. /// </summary> /// <param name="Provider">The Audio Source.</param> /// <param name="Writer">The <see cref="IAudioFileWriter"/> to write audio to.</param> /// <exception cref="ArgumentNullException"><paramref name="Provider"/> or <paramref name="Writer"/> is null.</exception> public AudioRecorder(IAudioProvider Provider, IAudioFileWriter Writer) { if (Provider == null) { throw new ArgumentNullException(nameof(Provider)); } if (Writer == null) { throw new ArgumentNullException(nameof(Writer)); } _audioProvider = Provider; _writer = Writer; _audioProvider.DataAvailable += (s, e) => _writer.Write(e.Buffer, 0, e.Length); _audioProvider.RecordingStopped += (s, e) => RaiseRecordingStopped(e.Error); }
public AudioRecorder(IAudioFileWriter AudioWriter, IAudioProvider AudioProvider) { _audioWriter = AudioWriter ?? throw new ArgumentNullException(nameof(AudioWriter)); _audioProvider = AudioProvider ?? throw new ArgumentNullException(nameof(AudioProvider)); var wf = _audioProvider.WaveFormat; var bufferSize = (int) ( (ReadInterval / 1000.0) * wf.SampleRate * wf.Channels * (wf.BitsPerSample / 8.0) ); _buffer = new byte[bufferSize]; _loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning); }
/// <summary> /// Writes all the Data in the decoder to a file /// </summary> /// <param name="Writer">Audio File Writer to write to</param> /// <param name="Offset">+ve for forward, -ve for backward</param> public void Write(IAudioFileWriter Writer, int Offset = 0) { long InitialPosition = Position; Position += Offset; int BlockLength = (int)Seconds2Bytes(2); byte[] Buffer = new byte[BlockLength]; var gch = GCHandle.Alloc(Buffer, GCHandleType.Pinned); while (HasData) { Bass.ChannelGetData(Handle, gch.AddrOfPinnedObject(), BlockLength); Writer.Write(Buffer, BlockLength); } gch.Free(); Writer.Dispose(); Position = InitialPosition; }