Esempio n. 1
0
        public IObservable <IWaveBuffer> GetStream(RecordDevice device)
        {
            return
                (Observable.Create <IWaveBuffer>(obs =>
            {
                var disposables = new CompositeDisposable();

                var samples = 512;
                var timeMs = 20;
                var rate = samples * 1000 / timeMs;

                var waveIn = new WaveInEvent()
                {
                    DeviceNumber = device.DeviceNumber,
                    WaveFormat = new WaveFormat(rate, 16, 1),
                    BufferMilliseconds = timeMs
                };

                var subscription =
                    Observable.FromEventPattern <WaveInEventArgs>(
                        h => waveIn.DataAvailable += h,
                        h => waveIn.DataAvailable -= h)
                    .Where(e =>
                           // Remove events where Buffer is not filled completely.
                           // This will happen, when recording is stopped.
                           e.EventArgs.BytesRecorded == e.EventArgs.Buffer.Length)
                    .Select(e =>
                {
                    var buffer = new WaveBuffer(e.EventArgs.Buffer)
                    {
                        ByteBufferCount = e.EventArgs.BytesRecorded
                    };

                    return buffer;
                })
                    .Subscribe(obs);

                disposables.Add(Disposable.Create(() => waveIn.StopRecording()));
                disposables.Add(subscription);
                disposables.Add(waveIn);

                waveIn.StartRecording();

                return disposables;
            }));
        }
Esempio n. 2
0
        /// <summary>
        /// Creates a new synchronizable instance of <see cref="RecordingProvider"/> to be used with an <see cref="IRecorder"/>.
        /// </summary>
        /// <param name="Device">The Recording Device.</param>
        /// <param name="Wf"><see cref="WaveFormat"/> to use.</param>
        /// <param name="FrameRate">The <see cref="IRecorder"/>'s FrameRate.</param>
        public RecordingProvider(RecordDevice Device, WaveFormat Wf, int FrameRate)
        {
            WaveFormat = Wf;

            BASS.RecordInit(Device.Index);

            BASS.CurrentRecordingDevice = Device.Index;

            var flags = BassFlags.RecordPause;

            if (Wf.Encoding == WaveFormatEncoding.Float && Wf.BitsPerSample == 32)
            {
                flags |= BassFlags.Float;
            }

            else if (Wf.Encoding == WaveFormatEncoding.Pcm && Wf.BitsPerSample == 8)
            {
                flags |= BassFlags.Byte;
            }

            else if (!(Wf.Encoding == WaveFormatEncoding.Pcm && Wf.BitsPerSample == 16))
            {
                throw new ArgumentException(nameof(Wf));
            }

            IsSynchronizable = FrameRate != -1;

            if (IsSynchronizable)
            {
                BASS.RecordingBufferLength = 3000 / FrameRate;
            }

            _handle = IsSynchronizable ? BASS.RecordStart(Wf.SampleRate, Wf.Channels, flags, BASS.RecordingBufferLength / 3, Procedure, IntPtr.Zero)
                                      : BASS.RecordStart(Wf.SampleRate, Wf.Channels, flags, Procedure);

            BASS.ChannelSetSync(_handle, SyncFlags.Free, 0, (H, C, D, U) => RecordingStopped?.Invoke(this, new EndEventArgs(null)));
        }
Esempio n. 3
0
 /// <summary>
 /// Creates a new instance of <see cref="RecordingProvider"/>.
 /// </summary>
 /// <param name="Device">The Recording Device.</param>
 /// <param name="Wf"><see cref="WaveFormat"/> to use.</param>
 public RecordingProvider(RecordDevice Device, WaveFormat Wf)
     : this(Device, Wf, -1)
 {
 }
Esempio n. 4
0
 /// <summary>
 /// Creates a new instance of <see cref="RecordingProvider"/> using Default <see cref="WaveFormat"/>.
 /// </summary>
 /// <param name="Device">The Recording Device.</param>
 public RecordingProvider(RecordDevice Device)
     : this(Device, new WaveFormat())
 {
 }