예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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;
        }
예제 #3
0
        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;
        }
예제 #4
0
        public void Dispose()
        {
            _continueEvent.Set();
            _stopEvent.Set();

            _loopTask.Wait();

            _buffer = null;

            _audioWriter.Dispose();
            _audioWriter = null;

            _audioProvider.Dispose();
            _audioProvider = null;
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        /// <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;
        }