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; })); }
/// <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))); }
/// <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) { }
/// <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()) { }