private void FfmpegListener() { AudioFileReader afr = null; Program.WriterMutex.WaitOne(); try { afr = new AudioFileReader(); afr.Open(_source); } catch (Exception ex) { Log.Error("",ex);//MainForm.LogExceptionToFile(ex); } Program.WriterMutex.ReleaseMutex(); if (afr == null || !afr.IsOpen) { if (AudioFinished!=null) AudioFinished(this, ReasonToFinishPlaying.AudioSourceError); return; } RecordingFormat = new WaveFormat(afr.SampleRate, 16, afr.Channels); _waveProvider = new BufferedWaveProvider(RecordingFormat) { DiscardOnBufferOverflow = true }; _sampleChannel = new SampleChannel(_waveProvider); _sampleChannel.PreVolumeMeter += SampleChannelPreVolumeMeter; byte[] data; int mult = afr.BitsPerSample/8; double btrg = Convert.ToDouble(afr.SampleRate*mult*afr.Channels); DateTime lastPacket = DateTime.Now; bool realTime = _source.IndexOf("://") != -1; try { DateTime req = DateTime.Now; while (!_stopEvent.WaitOne(0, false)) { data = afr.ReadAudioFrame(); if (data.Length>0) { lastPacket = DateTime.Now; if (DataAvailable != null) { //forces processing of volume level without piping it out _waveProvider.AddSamples(data, 0, data.Length); var sampleBuffer = new float[data.Length]; _sampleChannel.Read(sampleBuffer, 0, data.Length); if (WaveOutProvider!=null && Listening) { WaveOutProvider.AddSamples(data, 0, data.Length); } var da = new DataAvailableEventArgs((byte[]) data.Clone()); DataAvailable(this, da); } if (realTime) { if (_stopEvent.WaitOne(10, false)) break; } else { double f = (data.Length/btrg)*1000; if (f > 0) { var span = DateTime.Now.Subtract(req); var msec = Convert.ToInt32(f - (int) span.TotalMilliseconds); if ((msec > 0) && (_stopEvent.WaitOne(msec, false))) break; req = DateTime.Now; } } } else { if ((DateTime.Now - lastPacket).TotalMilliseconds > 5000) { afr.Close(); Stop(); throw new Exception("Audio source timeout"); } if (_stopEvent.WaitOne(30, false)) break; } } if (AudioFinished != null) AudioFinished(this, ReasonToFinishPlaying.StoppedByUser); } catch (Exception e) { if (AudioSourceError!=null) AudioSourceError(this, new AudioSourceErrorEventArgs(e.Message)); Log.Error("",e);//MainForm.LogExceptionToFile(e); } }
private void FfmpegListener() { AudioFileReader afr = null; Program.WriterMutex.WaitOne(); try { afr = new AudioFileReader(); afr.Open(_source); } catch (Exception ex) { MainForm.LogExceptionToFile(ex); } Program.WriterMutex.ReleaseMutex(); if (afr == null || !afr.IsOpen) { if (AudioFinished != null) { AudioFinished(this, ReasonToFinishPlaying.AudioSourceError); } return; } RecordingFormat = new WaveFormat(afr.SampleRate, 16, afr.Channels); _waveProvider = new BufferedWaveProvider(RecordingFormat) { DiscardOnBufferOverflow = true }; _sampleChannel = new SampleChannel(_waveProvider); _sampleChannel.PreVolumeMeter += SampleChannelPreVolumeMeter; byte[] data; double brat = (1000d / Convert.ToDouble(afr.SampleRate * afr.Channels * 4)); try { while (!_stopEvent.WaitOne(0, false)) { DateTime start = DateTime.Now; data = afr.ReadAudioFrame(); if (data.Length > 0) { if (DataAvailable != null) { //forces processing of volume level without piping it out _waveProvider.AddSamples(data, 0, data.Length); var sampleBuffer = new float[data.Length]; _sampleChannel.Read(sampleBuffer, 0, data.Length); if (WaveOutProvider != null && Listening) { WaveOutProvider.AddSamples(data, 0, data.Length); } var da = new DataAvailableEventArgs((byte[])data.Clone()); DataAvailable(this, da); } int interval = Convert.ToInt32(Convert.ToDouble(data.Length) * brat); if (interval > 0) { var span = DateTime.Now.Subtract(start); int msec = interval - (int)span.TotalMilliseconds; if ((msec > 0) && (_stopEvent.WaitOne(msec, false))) { break; } } } } if (AudioFinished != null) { AudioFinished(this, ReasonToFinishPlaying.StoppedByUser); } } catch (Exception e) { if (AudioSourceError != null) { AudioSourceError(this, new AudioSourceErrorEventArgs(e.Message)); } MainForm.LogExceptionToFile(e); } }
private void FfmpegListener() { AudioFileReader afr = null; Program.WriterMutex.WaitOne(); try { afr = new AudioFileReader(); afr.Open(_source); } catch (Exception ex) { Log.Error("", ex);//MainForm.LogExceptionToFile(ex); } Program.WriterMutex.ReleaseMutex(); if (afr == null || !afr.IsOpen) { if (AudioFinished != null) { AudioFinished(this, ReasonToFinishPlaying.AudioSourceError); } return; } RecordingFormat = new WaveFormat(afr.SampleRate, 16, afr.Channels); _waveProvider = new BufferedWaveProvider(RecordingFormat) { DiscardOnBufferOverflow = true }; _sampleChannel = new SampleChannel(_waveProvider); _sampleChannel.PreVolumeMeter += SampleChannelPreVolumeMeter; byte[] data; int mult = afr.BitsPerSample / 8; double btrg = Convert.ToDouble(afr.SampleRate * mult * afr.Channels); DateTime lastPacket = DateTime.Now; bool realTime = _source.IndexOf("://") != -1; try { DateTime req = DateTime.Now; while (!_stopEvent.WaitOne(0, false)) { data = afr.ReadAudioFrame(); if (data.Length > 0) { lastPacket = DateTime.Now; if (DataAvailable != null) { //forces processing of volume level without piping it out _waveProvider.AddSamples(data, 0, data.Length); var sampleBuffer = new float[data.Length]; _sampleChannel.Read(sampleBuffer, 0, data.Length); if (WaveOutProvider != null && Listening) { WaveOutProvider.AddSamples(data, 0, data.Length); } var da = new DataAvailableEventArgs((byte[])data.Clone()); DataAvailable(this, da); } if (realTime) { if (_stopEvent.WaitOne(10, false)) { break; } } else { double f = (data.Length / btrg) * 1000; if (f > 0) { var span = DateTime.Now.Subtract(req); var msec = Convert.ToInt32(f - (int)span.TotalMilliseconds); if ((msec > 0) && (_stopEvent.WaitOne(msec, false))) { break; } req = DateTime.Now; } } } else { if ((DateTime.Now - lastPacket).TotalMilliseconds > 5000) { afr.Close(); Stop(); throw new Exception("Audio source timeout"); } if (_stopEvent.WaitOne(30, false)) { break; } } } if (AudioFinished != null) { AudioFinished(this, ReasonToFinishPlaying.StoppedByUser); } } catch (Exception e) { if (AudioSourceError != null) { AudioSourceError(this, new AudioSourceErrorEventArgs(e.Message)); } Log.Error("", e);//MainForm.LogExceptionToFile(e); } }