public virtual void Initialize() { _wasapiCapture = new WasapiCapture { Device = _captureDevice }; _wasapiCapture.Initialize(); var soundInSource = new SoundInSource(_wasapiCapture); if (_triggerSingleBlockRead) { var notificationStream = new SingleBlockNotificationStream(soundInSource.ChangeSampleRate(48000).ToMono().ToSampleSource()); notificationStream.SingleBlockRead += NotificationStreamOnSingleBlockRead; _captureSource = notificationStream.ToWaveSource(16); } else { _captureSource = soundInSource .ChangeSampleRate(48000) .ToMono() .ToSampleSource() .ToWaveSource(16); } soundInSource.DataAvailable += SoundInSourceOnDataAvailable; _wasapiCapture.Start(); }
public void InitialiseAudioProgram() { _soundIn = new WasapiLoopbackCapture(); _soundIn.Initialize(); var soundInSource = new SoundInSource(_soundIn); ISampleSource source = soundInSource.ToSampleSource(); var spectrumProvider = new SpectrumProvider(2, 48000, FftSize.Fft4096); _spectrum = new LineSpectrum(spectrumProvider, _barCount); var notificationSource = new SingleBlockNotificationStream(source); notificationSource.SingleBlockRead += (s, a) => spectrumProvider.Add(a.Left, a.Right); _source = notificationSource.ToWaveSource(16); // Read from the source otherwise SingleBlockRead is never called byte[] buffer = new byte[_source.WaveFormat.BytesPerSecond / 2]; soundInSource.DataAvailable += (src, evt) => { int read; while ((read = _source.Read(buffer, 0, buffer.Length)) > 0) { ; } }; _soundIn.Start(); for (int i = 0; i < MatrixCount; i++) { _Programs[i] = i == 0 ? AudioSequence().GetEnumerator() : null; } }
//most of this code is stolen from the example in the CSCore github so idk what it does 40% of the time public void Initialize(FFTSize _size = FFTSize._4096) { size = _size; _soundIn = new WasapiLoopbackCapture(); _soundIn.Initialize(); var soundInSource = new SoundInSource(_soundIn); var source = soundInSource.ToSampleSource(); _fft = new FftProvider(source.WaveFormat.Channels, (FftSize)size); var n = new SingleBlockNotificationStream(source); n.SingleBlockRead += (s, a) => _fft.Add(a.Left, a.Right); _source = n.ToWaveSource(16); byte[] buffer = new byte[_source.WaveFormat.BytesPerSecond]; soundInSource.DataAvailable += (s, aEvent) => { int read; while ((read = _source.Read(buffer, 0, buffer.Length)) > 0) { ; } }; _soundIn.Start(); }
public void Initialize() { _wasapiOut = new WasapiOut(); _opusDecoder = OpusDecoder.Create(48000, 1); //var waveForm = new WaveFormatExtensible(48000, 16, 1, Guid.Parse("00000003-0000-0010-8000-00aa00389b71")); var waveForm = new WaveFormat(48000, 16, 1); _writeableBufferingSource = new WriteableBufferingSource(waveForm) { FillWithZeros = true }; IWaveSource waveSource; if (_triggerSingleBlockRead) { var singleBlockNotificationStream = new SingleBlockNotificationStream(_writeableBufferingSource.ToSampleSource()); singleBlockNotificationStream.SingleBlockRead += SingleBlockNotificationStreamOnSingleBlockRead; waveSource = singleBlockNotificationStream.ToWaveSource(); } else { waveSource = _writeableBufferingSource; } _wasapiOut.Initialize(waveSource); _wasapiOut.Play(); }
public SoundCapture() { // This uses the wasapi api to get any sound data played by the computer capture = new WasapiLoopbackCapture(); capture.Initialize(); // Get our capture as a source IWaveSource source = new SoundInSource(capture); // From https://github.com/filoe/cscore/blob/master/Samples/WinformsVisualization/Form1.cs // This is the typical size, you can change this for higher detail as needed fftSize = FftSize.Fft4096; // Actual fft data fftBuffer = new float[(int)fftSize]; // Tells us when data is available to send to our spectrum var notificationSource = new SingleBlockNotificationStream(source.ToSampleSource()); notificationSource.SingleBlockRead += NotificationSource_SingleBlockRead; // We use this to request data so it actualy flows through (figuring this out took forever...) finalSource = notificationSource.ToWaveSource(); capture.DataAvailable += Capture_DataAvailable; capture.Start(); }
private void CreateLoopback() { try { loopback.Initialize(); } catch (Exception e) { Debug.LogException(e); return; } soundIn = new SoundInSource(loopback); spectrumProvider = new BasicSpectrumProvider(soundIn.WaveFormat.Channels, soundIn.WaveFormat.SampleRate, FftSize.Fft4096); spectrum = new LineSpectrum(FftSize.Fft4096) { SpectrumProvider = spectrumProvider, BarCount = 512, UseAverage = true, IsXLogScale = true, }; loopback.Start(); blockNotifyStream = new SingleBlockNotificationStream(soundIn.ToSampleSource()); realtime = blockNotifyStream.ToWaveSource(); buffer = new float[realtime.WaveFormat.BytesPerSecond / sizeof(float) / 2]; soundIn.DataAvailable += AudioDataAvailable; blockNotifyStream.SingleBlockRead += SingleBlockRead; }
private void SetupSampleSource(ISampleSource aSampleSource) { const FftSize fftSize = FftSize.Fft4096; //create a spectrum provider which provides fft data based on some input var spectrumProvider = new BasicSpectrumProvider(aSampleSource.WaveFormat.Channels, aSampleSource.WaveFormat.SampleRate, fftSize); //linespectrum and voiceprint3dspectrum used for rendering some fft data //in oder to get some fft data, set the previously created spectrumprovider _lineSpectrum = new LineSpectrum(fftSize) { SpectrumProvider = spectrumProvider, UseAverage = true, BarCount = 50, BarSpacing = 2, IsXLogScale = true, ScalingStrategy = ScalingStrategy.Sqrt }; //the SingleBlockNotificationStream is used to intercept the played samples var notificationSource = new SingleBlockNotificationStream(aSampleSource); //pass the intercepted samples as input data to the spectrumprovider (which will calculate a fft based on them) notificationSource.SingleBlockRead += (s, a) => spectrumProvider.Add(a.Left, a.Right); _waveSource = notificationSource.ToWaveSource(16); }
public void Load(Uri uri) { Dispose(); _uri = uri; _waveSource = CSCore.Codecs.CodecFactory.Instance.GetCodec(_uri) .ToSampleSource() .ToMono() .ToWaveSource(); spectrumProvider = new BasicSpectrumProvider(_waveSource.WaveFormat.Channels, _waveSource.WaveFormat.SampleRate, CSCore.DSP.FftSize.Fft4096); //the SingleBlockNotificationStream is used to intercept the played samples var notificationSource = new SingleBlockNotificationStream(_waveSource.ToSampleSource()); //pass the intercepted samples as input data to the spectrumprovider (which will calculate a fft based on them) notificationSource.SingleBlockRead += (s, a) => SpectrumProvider.Add(a.Left, a.Right); _waveSource = notificationSource.ToWaveSource(16); // Load the sample source var ws = CSCore.Codecs.CodecFactory.Instance.GetCodec(_uri); _sampleSource = ws.ToSampleSource(); RaiseSourceEvent(SourceEventType.Loaded); hasMedia = true; LoadSoundOut(); }
private IWaveSource CreateWaveSource(ISampleSource sampleSource, CustomFftProvider fftProvider) { var sampleStream = new SingleBlockNotificationStream(sampleSource); sampleStream.SingleBlockRead += (s, a) => fftProvider.Add(a.Left, a.Right); return(sampleStream.ToWaveSource(16)); }
public FFTDataProvider(FftSize fftSize) { this.fftSize = fftSize; _soundIn = new WasapiLoopbackCapture(); _soundIn.Initialize(); var soundInSource = new SoundInSource(_soundIn); ISampleSource source = soundInSource.ToSampleSource(); fftProvider = new FftProvider(source.WaveFormat.Channels, fftSize); fftProvider2 = new FftProvider(source.WaveFormat.Channels, fftSize); var notificationSource = new SingleBlockNotificationStream(source); SamplesRate = source.WaveFormat.SampleRate; //pass the intercepted samples as input data to the spectrumprovider (which will calculate a fft based on them) notificationSource.SingleBlockRead += addToFFTs; var _source = notificationSource.ToWaveSource(16); byte[] buffer = new byte[_source.WaveFormat.BytesPerSecond / 8];// 1/8 seconds soundInSource.DataAvailable += (s, aEvent) => { int read; while ((read = _source.Read(buffer, 0, buffer.Length)) > 0) { ; } }; _readStarted = false; }
void Start() { fftData = new float[fftSize]; persistentSamples = new FixedQueue <float> [PersSampleUpperIndex - PersSampleLowerIndex]; smoothedSamples = new float[persistentSamples.Length]; for (int i = 0; i < persistentSamples.Length; i++) { persistentSamples[i] = new FixedQueue <float>(PersistenSampleLength); } line = GetComponent <LineRenderer>(); leftChannel = new float[TotalSamples]; capture = new WasapiLoopbackCapture(); capture.Initialize(); var soundInSource = new SoundInSource(capture); var source = soundInSource.ToSampleSource().AppendSource(x => new PitchShifter(x), out pitchShifter); fft1 = new FftTransform(source.WaveFormat.Channels, fftSize); fft2 = new FftProvider(source.WaveFormat.Channels, FftSize.Fft2048); stream = new SingleBlockNotificationStream(pitchShifter); stream.SingleBlockRead += SingleBlockRead; waveSource = stream.ToWaveSource(16); buffer = new byte[waveSource.WaveFormat.BytesPerSecond / 2]; soundInSource.DataAvailable += DataAvailable; capture.DataAvailable += (sender, args) => DataAvailable(sender, args); capture.Start(); }
private void StartCapture() { if (SelectedDevice == null) { return; } if (CaptureMode == "Capture") { _soundIn = new WasapiCapture(); } _soundIn.Device = SelectedDevice; _soundIn.Initialize(); var soundInSource = new SoundInSource(_soundIn); var singleBlockNotificationStream = new SingleBlockNotificationStream(soundInSource.ToSampleSource()); _finalSource = singleBlockNotificationStream.ToWaveSource(); _writer = new WaveWriter("tmp.wav", _finalSource.WaveFormat); byte[] buffer = new byte[_finalSource.WaveFormat.BytesPerSecond / 2]; soundInSource.DataAvailable += (s, e) => { int read; while ((read = _finalSource.Read(buffer, 0, buffer.Length)) > 0) { _writer.Write(buffer, 0, read); } }; //singleBlockNotificationStream.SingleBlockRead += SingleBlockNotificationStreamOnSingleBlockRead; // visualization _soundIn.Start(); }
public Spectrograph() { InitializeComponent(); _soundIn = new WasapiLoopbackCapture(); _soundIn.Initialize(); var soundInSource = new SoundInSource(_soundIn); var singleBlockNotificationStream = new SingleBlockNotificationStream(soundInSource); _source = singleBlockNotificationStream.ToWaveSource(); if (!Directory.Exists(_loopbackDir)) { Directory.CreateDirectory(_loopbackDir); } _writer = new WaveWriter(_loopbackDir + "/loopback.wav", _source.WaveFormat); byte[] buffer = new byte[_source.WaveFormat.BytesPerSecond / 2]; soundInSource.DataAvailable += (s, e) => { int read; while ((read = _source.Read(buffer, 0, buffer.Length)) > 0) { _writer.Write(buffer, 0, read); } }; _lineSpectrumProvider = new BasicSpectrumProvider(_source.WaveFormat.Channels, _source.WaveFormat.SampleRate, fftSize); _spectrogramProvider = new BasicSpectrumProvider(_source.WaveFormat.Channels, _source.WaveFormat.SampleRate, fftSize); singleBlockNotificationStream.SingleBlockRead += SingleBlockNotificationStream_SingleBlockRead; _soundIn.Start(); _lineSpectrum = new LineSpectrum(fftSize) { SpectrumProvider = _lineSpectrumProvider, UseAverage = true, BarCount = 22, BarSpacing = 1, IsXLogScale = true, ScalingStrategy = ScalingStrategy.Sqrt }; _oscilloscope = new Oscilloscope(); _spectrogram = new Spectrogram(fftSize) { SpectrumProvider = _spectrogramProvider, UseAverage = true, BarCount = (int)fftSize, BarSpacing = 0, IsXLogScale = true, ScalingStrategy = ScalingStrategy.Sqrt }; _keyboardVisualizer = new KeyboardVisualizer(); UpdateTimer.Start(); }
static void Main(string[] args) { MMDevice dev = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Render, Role.Multimedia); capture = new WasapiLoopbackCapture(); capture.Device = dev; capture.Initialize(); SoundInSource soundInSource = new SoundInSource(capture); nStream = new SingleBlockNotificationStream(soundInSource.ToSampleSource()); final = nStream.ToWaveSource(); nStream.SingleBlockRead += NStream_SingleBlockRead; soundInSource.DataAvailable += encode; trashBuf = new byte[final.WaveFormat.BytesPerSecond / 2]; Console.WriteLine($"sample rate:{capture.WaveFormat.SampleRate}"); Console.WriteLine($"bits per sample:{capture.WaveFormat.BitsPerSample }"); Console.WriteLine($"channels:{capture.WaveFormat.Channels }"); Console.WriteLine($"bytes per sample:{capture.WaveFormat.BytesPerSample }"); Console.WriteLine($"bytes per second:{capture.WaveFormat.BytesPerSecond }"); Console.WriteLine($"AudioEncoding:{capture.WaveFormat.WaveFormatTag }"); EncodingContext context = FrameEncoder.GetDefaultsContext(); context.Channels = 6; context.SampleRate = capture.WaveFormat.SampleRate; context.AudioCodingMode = AudioCodingMode.Front3Rear2; context.HasLfe = true; context.SampleFormat = A52SampleFormat.Float; enc = new FrameEncoderFloat(ref context); //_writer = new WaveWriter("test.ac3", final.WaveFormat); capture.Start(); wBuffSrc = new WriteableBufferingSource(new WaveFormat(capture.WaveFormat.SampleRate, capture.WaveFormat.BitsPerSample, capture.WaveFormat.Channels, AudioEncoding.WAVE_FORMAT_DOLBY_AC3_SPDIF), (int)capture.WaveFormat.MillisecondsToBytes(20)); w = new WasapiOut2(false, AudioClientShareMode.Shared, 20); w.Device = MMDeviceEnumerator.EnumerateDevices(DataFlow.Render, DeviceState.Active).Where(x => x.FriendlyName.Contains("Digital")).Single(); AudioClient a = AudioClient.FromMMDevice(w.Device); w.Initialize(wBuffSrc); w.Play(); Task.Run(async() => await encoderThread()); //encodeSinus(); Console.ReadLine(); System.Environment.Exit(0); }
/// <summary> /// Initializes a new instance of the recorder class. /// </summary> /// <param name="captureDevice"></param> /// <param name="captureMode"></param> public Recorder(MMDevice captureDevice, DataFlow captureMode) { var wasapiCapture = Convert.ToBoolean(captureMode) ? new WasapiCapture() : new WasapiLoopbackCapture(); wasapiCapture.Device = captureDevice; wasapiCapture.Initialize(); _soundInSource = new SoundInSource(wasapiCapture); NotificationStream = new SingleBlockNotificationStream(_soundInSource.ToSampleSource()); _waveStream = NotificationStream.ToWaveSource(); }
// Start is called before the first frame update void Start() { loopbackCapture = new WasapiLoopbackCapture(); loopbackCapture.Initialize(); soundInSource = new SoundInSource(loopbackCapture); fftBuffer = new float[(int)CFftSize]; basicSpectrumProvider = new BasicSpectrumProvider(soundInSource.WaveFormat.Channels, soundInSource.WaveFormat.SampleRate, CFftSize); lineSpectrum = new LineSpectrum(CFftSize) { SpectrumProvider = basicSpectrumProvider, BarCount = numBars, UseAverage = true, IsXLogScale = false, ScalingStrategy = ScalingStrategy.Linear }; var notificationSource = new SingleBlockNotificationStream(soundInSource.ToSampleSource()); notificationSource.SingleBlockRead += NotificationSource_SingleBlockRead; finalSource = notificationSource.ToWaveSource(); loopbackCapture.DataAvailable += Capture_DataAvailable; loopbackCapture.Start(); //singleBlockNotificationStream = new SingleBlockNotificationStream(soundInSource.ToSampleSource()); //realTimeSource = singleBlockNotificationStream.ToWaveSource(); //byte[] buffer = new byte[realTimeSource.WaveFormat.BytesPerSecond / 2]; //soundInSource.DataAvailable += (s, ea) => //{ // while (realTimeSource.Read(buffer, 0, buffer.Length) > 0) // { // float[] spectrumData = lineSpectrum.GetSpectrumData(10); // receiveAudio(spectrumData); // Debug.Log(receiveAudio); // if (spectrumData != null && receiveAudio != null) // { // receiveAudio(spectrumData); // Debug.Log(receiveAudio); // } // } //}; //singleBlockNotificationStream.SingleBlockRead += SingleBlockNotificationStream_SingleBlockRead; }
void Awake() { barData = new float[numBars]; // This uses the wasapi api to get any sound data played by the computer switch (audioType) { case AudioSourceType.Microphone: capture = new WasapiCapture(); break; case AudioSourceType.Speakers: capture = new WasapiLoopbackCapture(); break; } capture.Initialize(); // Get our capture as a source IWaveSource source = new SoundInSource(capture); // From https://github.com/filoe/cscore/blob/master/Samples/WinformsVisualization/Form1.cs // This is the typical size, you can change this for higher detail as needed fftSize = FftSize.Fft4096; // Actual fft data fftBuffer = new float[(int)fftSize]; // These are the actual classes that give you spectrum data // The specific vars of lineSpectrum are changed below in the editor so most of these aren't that important here spectrumProvider = new BasicSpectrumProvider(capture.WaveFormat.Channels, capture.WaveFormat.SampleRate, fftSize); lineSpectrum = new LineSpectrum(fftSize) { SpectrumProvider = spectrumProvider, UseAverage = isAverage, BarCount = numBars, BarSpacing = 2, IsXLogScale = false, ScalingStrategy = ScalingStrategy.Linear }; // Tells us when data is available to send to our spectrum var notificationSource = new SingleBlockNotificationStream(source.ToSampleSource()); notificationSource.SingleBlockRead += NotificationSource_SingleBlockRead; // We use this to request data so it actualy flows through (figuring this out took forever...) finalSource = notificationSource.ToWaveSource(); capture.DataAvailable += Capture_DataAvailable; capture.Start(); }
/// <summary> /// /// </summary> private void StartAudioVisualization() { //Open the default device iSoundIn = new WasapiLoopbackCapture(); //Our loopback capture opens the default render device by default so the following is not needed //iSoundIn.Device = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Render, Role.Console); iSoundIn.Initialize(); SoundInSource soundInSource = new SoundInSource(iSoundIn); ISampleSource source = soundInSource.ToSampleSource(); const FftSize fftSize = FftSize.Fft2048; //create a spectrum provider which provides fft data based on some input BasicSpectrumProvider spectrumProvider = new BasicSpectrumProvider(source.WaveFormat.Channels, source.WaveFormat.SampleRate, fftSize); //linespectrum and voiceprint3dspectrum used for rendering some fft data //in oder to get some fft data, set the previously created spectrumprovider iLineSpectrum = new LineSpectrum(fftSize) { SpectrumProvider = spectrumProvider, UseAverage = false, // Does not matter since we hacked it BarCount = 16, BarSpacing = 1, IsXLogScale = true, // Does not matter since we hacked it ScalingStrategy = ScalingStrategy.Decibel // Does not matter since we hacked it }; //the SingleBlockNotificationStream is used to intercept the played samples var notificationSource = new SingleBlockNotificationStream(source); //pass the intercepted samples as input data to the spectrumprovider (which will calculate a fft based on them) notificationSource.SingleBlockRead += (s, a) => spectrumProvider.Add(a.Left, a.Right); iWaveSource = notificationSource.ToWaveSource(16); // We need to read from our source otherwise SingleBlockRead is never called and our spectrum provider is not populated byte[] buffer = new byte[iWaveSource.WaveFormat.BytesPerSecond / 2]; soundInSource.DataAvailable += (s, aEvent) => { int read; while ((read = iWaveSource.Read(buffer, 0, buffer.Length)) > 0) { ; } }; //Start recording iSoundIn.Start(); }
private void openToolStripMenuItem_Click(object sender, EventArgs e) { var openFileDialog = new OpenFileDialog() { Filter = CodecFactory.SupportedFilesFilterEn, Title = "Select a file..." }; if (openFileDialog.ShowDialog() == DialogResult.OK) { Stop(); const FftSize fftSize = FftSize.Fft4096; IWaveSource source = CodecFactory.Instance.GetCodec(openFileDialog.FileName); var spectrumProvider = new BasicSpectrumProvider(source.WaveFormat.Channels, source.WaveFormat.SampleRate, fftSize); _lineSpectrum = new LineSpectrum(fftSize) { SpectrumProvider = spectrumProvider, UseAverage = true, BarCount = 50, BarSpacing = 2, IsXLogScale = true, ScalingStrategy = ScalingStrategy.Sqrt }; _voicePrint3DSpectrum = new VoicePrint3DSpectrum(fftSize) { SpectrumProvider = spectrumProvider, UseAverage = true, PointCount = 200, IsXLogScale = true, ScalingStrategy = ScalingStrategy.Sqrt }; var notificationSource = new SingleBlockNotificationStream(source.ToSampleSource()); notificationSource.SingleBlockRead += (s, a) => spectrumProvider.Add(a.Left, a.Right); _source = notificationSource.ToWaveSource(16); _soundOut = new WasapiOut(); _soundOut.Initialize(_source.ToMono()); _soundOut.Play(); timer1.Start(); propertyGridTop.SelectedObject = _lineSpectrum; propertyGridBottom.SelectedObject = _voicePrint3DSpectrum; } }
public Visualizer() { InitializeComponent(); _graphics = DrawPanel.CreateGraphics(); _graphics.SmoothingMode = SmoothingMode.AntiAlias; _graphics.CompositingQuality = CompositingQuality.AssumeLinear; _graphics.PixelOffsetMode = PixelOffsetMode.Default; _graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; _graphics.Clear(Color.Black); _oscilloscope = new Oscilloscope(); for (int i = 0; i < _pens.Length; i++) { _pens[i] = new Pen(Color.FromArgb(i, i, i)); } _fftProvider = new FftProvider(1, FftSize.Fft4096); _soundIn = new WasapiLoopbackCapture(); _soundIn.Initialize(); var soundInSource = new SoundInSource(_soundIn); var singleBlockNotificationStream = new SingleBlockNotificationStream(soundInSource); _source = singleBlockNotificationStream.ToWaveSource(); if (!Directory.Exists("%AppData%/Spectrograph")) { Directory.CreateDirectory("%AppData%/Spectrograph"); } _writer = new WaveWriter("%AppData%/Spectrograph/loopback.wav", _source.WaveFormat); byte[] buffer = new byte[_source.WaveFormat.BytesPerSecond / 2]; soundInSource.DataAvailable += (s, e) => { int read; while ((read = _source.Read(buffer, 0, buffer.Length)) > 0) { _writer.Write(buffer, 0, read); } }; singleBlockNotificationStream.SingleBlockRead += SingleBlockNotificationStreamOnSingleBlockRead; _soundIn.Start(); }
void SetupSampleSource(ISampleSource sampleSource) { FftSize fftSize = FftSize.Fft4096; SpectrumProvider spectrumProvider = new SpectrumProvider(sampleSource.WaveFormat.Channels, sampleSource.WaveFormat.SampleRate, fftSize); //spectrum = new BlobSpectrum(this, spectrumProvider, FftSize.Fft4096); spectrum = new RLSpectrum(this, spectrumProvider, FftSize.Fft4096); SingleBlockNotificationStream notificationSource = new SingleBlockNotificationStream(sampleSource); notificationSource.SingleBlockRead += (s, a) => spectrumProvider.Add(a.Left, a.Right); source = notificationSource.ToWaveSource(16); }
void StartListen() { loopbackCapture = new WasapiLoopbackCapture(); loopbackCapture.Initialize(); soundInSource = new SoundInSource(loopbackCapture); loopbackCapture.Start(); singleBlockNotificationStream = new SingleBlockNotificationStream(soundInSource.ToSampleSource()); realTimeSource = singleBlockNotificationStream.ToWaveSource(); soundInSource.DataAvailable += DataAvailable; singleBlockNotificationStream.SingleBlockRead += SingleBlockNotificationStream_SingleBlockRead; }
public IWaveSource Initialize(ISampleSource OrgWave) { ISampleSource iss = OrgWave; provider = new LpsFFTProvider(iss.WaveFormat.Channels, iss.WaveFormat.SampleRate, size); if (notify == null) { notify = new SingleBlockNotificationStream(iss); } else { notify.BaseSource = iss; } notify.SingleBlockRead += (s, e) => provider.Add(e.Left, e.Right); return(notify.ToWaveSource()); }
public bool StartCapture() { if (mmdevice == null) { return(false); } Console.WriteLine("Prepare to capturing!"); if (mmdevice.DataFlow == DataFlow.Capture) { capture = new WasapiCapture(); } else if (mmdevice.DataFlow == DataFlow.Render) { capture = new WasapiLoopbackCapture(); } if (capture == null) { Console.WriteLine("Not able to open capture mode!"); return(false); } Console.WriteLine("Selected Device: " + mmdevice.FriendlyName); capture.Device = mmdevice; capture.Initialize(); var soundInSource = new SoundInSource(capture); var singleBlockNotificationStream = new SingleBlockNotificationStream(soundInSource.ToSampleSource()); waveSource = singleBlockNotificationStream.ToWaveSource(); singleBlockNotificationStream.SingleBlockRead += SingleBlockNotificationStreamOnSingleBlockRead; byte[] buffer = new byte[waveSource.WaveFormat.BytesPerSecond / 2]; soundInSource.DataAvailable += delegate { int read; while ((read = waveSource.Read(buffer, 0, buffer.Length)) > 0) { } }; capture.Start(); return(true); }
public void Initialize(MMDevice captureDevice) { //BLARG 01.14.2020: Don't need the default when we're given an Audio Enpoint //MMDevice captureDevice = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Render, Role.Console); WaveFormat deviceFormat = captureDevice.DeviceFormat; _audioEndpointVolume = AudioEndpointVolume.FromDevice(captureDevice); //DarthAffe 07.02.2018: This is a really stupid workaround to (hopefully) finally fix the surround driver issues for (int i = 1; i < 13; i++) { try { _capture = new WasapiLoopbackCapture(100, new WaveFormat(deviceFormat.SampleRate, deviceFormat.BitsPerSample, i)); } catch { /* We're just trying ... */ } } if (_capture == null) { throw new NullReferenceException("Failed to initialize WasapiLoopbackCapture"); } //BLARG: Actually setting the Device _capture.Device = captureDevice; _capture.Initialize(); _soundInSource = new SoundInSource(_capture) { FillWithZeros = false }; _source = _soundInSource.WaveFormat.SampleRate == 44100 ? _soundInSource.ToStereo() : _soundInSource.ChangeSampleRate(44100).ToStereo(); _stream = new SingleBlockNotificationStream(_source.ToSampleSource()); _stream.SingleBlockRead += StreamOnSingleBlockRead; _source = _stream.ToWaveSource(); byte[] buffer = new byte[_source.WaveFormat.BytesPerSecond / 2]; _soundInSource.DataAvailable += (s, aEvent) => { while ((_source.Read(buffer, 0, buffer.Length)) > 0) { ; } }; _capture.Start(); }
public void play() { ISampleSource source = CodecFactory.Instance.GetCodec(this.sfxPath).ToSampleSource(); var notificationSource = new SingleBlockNotificationStream(source); _source = notificationSource.ToWaveSource(16); //play the audio _soundOut = new WasapiOut(); _soundOut.Initialize(_source); _soundOut.Play(); }
private void SetupSource(ISampleSource source) { var spectrumProvider = new BasicSpectrumProvider(source.WaveFormat.Channels, source.WaveFormat.SampleRate, FftSize.Fft4096); Spectrum = new LineSpectrum(Frame, FftSize.Fft4096, spectrumProvider) { UseAverage = true, IsXLogScale = true, ScalingStrategy = ScalingStrategy.Decibel }; var notificationSource = new SingleBlockNotificationStream(source); notificationSource.SingleBlockRead += (sender, args) => spectrumProvider.Add(args.Left, args.Right); Source = notificationSource.ToWaveSource(16); }
/* * Initializes WASAPI, initializes the sample handler, and sends captured data to it. */ private void StartCapture() { // Initialize hardware capture wasapiCapture = new WasapiLoopbackCapture(25); wasapiCapture.Initialize(); // Initialize sample handler SampleHandler = new SampleHandler(wasapiCapture.WaveFormat.Channels); // Configure per-block reads rather than per-sample reads notificationSource = new SingleBlockNotificationStream(new SoundInSource(wasapiCapture).ToSampleSource()); notificationSource.SingleBlockRead += (s, e) => SampleHandler.Add(e.Left, e.Right); finalSource = notificationSource.ToWaveSource(); wasapiCapture.DataAvailable += (s, e) => finalSource.Read(e.Data, e.Offset, e.ByteCount); // Start capture wasapiCapture.Start(); }
void StartCapture() { capture = new WasapiLoopbackCapture(); capture.Initialize(); IWaveSource source = new SoundInSource(capture); fftSize = FftSize.Fft2048; fftBuffer = new float[2048]; fftBuffer = new float[(int)fftSize]; fftProvider = new FftProvider(1, fftSize); notificationSource = new SingleBlockNotificationStream(source.ToSampleSource()); notificationSource.SingleBlockRead += SingleBlockRead; finalSource = notificationSource.ToWaveSource(); capture.DataAvailable += CaptureDataAvailable; capture.Start(); initialized = true; }
private void SetupSampleSource(ISampleSource aSampleSource) { const FftSize fftSize = FftSize.Fft128; var spectrumProvider = new BasicSpectrumProvider(aSampleSource.WaveFormat.Channels, aSampleSource.WaveFormat.SampleRate, fftSize); _lineSpectrum = new LineSpectrum(fftSize) { SpectrumProvider = spectrumProvider, UseAverage = true, BarCount = 50, BarSpacing = 2, IsXLogScale = true, ScalingStrategy = ScalingStrategy.Linear }; var notificationSource = new SingleBlockNotificationStream(aSampleSource); notificationSource.SingleBlockRead += (s, a) => spectrumProvider.Add(a.Left, a.Right); _source = notificationSource.ToWaveSource(16); }