void AudioDeviceDataAvailable(object sender, DataAvailableEventArgs e) { if (Levels == null) return; try { if (WriterBuffer == null) { var dt = DateTime.Now.AddSeconds(0 - Micobject.settings.buffer); AudioBuffer.RemoveAll(p => p.TimeStamp < dt); AudioBuffer.Add(new AudioAction(e.RawData, Levels.Max(), DateTime.Now)); } else { WriterBuffer.Enqueue(new AudioAction(e.RawData, Levels.Max(), DateTime.Now)); } if (Micobject.settings.needsupdate) { Micobject.settings.samples = AudioSource.RecordingFormat.SampleRate; Micobject.settings.channels = AudioSource.RecordingFormat.Channels; Micobject.settings.needsupdate = false; } OutSockets.RemoveAll(p => p.Connected == false); if (OutSockets.Count>0) { if (_mp3Writer == null) { //_as = new AudioStreamer(); //_as.Open(AudioCodec.AAC, AudioSource.RecordingFormat.BitsPerSample * AudioSource.RecordingFormat.SampleRate * AudioSource.RecordingFormat.Channels, AudioSource.RecordingFormat.SampleRate, AudioSource.RecordingFormat.Channels); _audioStreamFormat = new WaveFormat(22050, 16, Micobject.settings.channels); var wf = new MP3Stream.WaveFormat(_audioStreamFormat.SampleRate, _audioStreamFormat.BitsPerSample, _audioStreamFormat.Channels); _mp3Writer = new Mp3Writer(_outStream, wf, false); } //unsafe //{ // fixed (byte* p = e.RawData) // { // int byteLength = 0; // int* l = &byteLength; // byte* outStream = _as.WriteAudio(p, e.RawData.Length, l); // byteLength = *l; // if (byteLength > 0) // { // var toSend = new byte[byteLength]; // for (var i = 0; i < byteLength;i++ ) // { // if (i==0) // Debug.Write(toSend[0]); // toSend[i] = *(outStream + i); // } // foreach (Socket s in OutSockets) // { // s.Send(Encoding.ASCII.GetBytes(byteLength.ToString("X") + "\r\n")); // s.Send(toSend); // s.Send(Encoding.ASCII.GetBytes("\r\n")); // } // } // } //} byte[] bSrc = e.RawData; int totBytes = bSrc.Length; var ws = new TalkHelperStream(bSrc, totBytes, AudioSource.RecordingFormat); var helpStm = new WaveFormatConversionStream(_audioStreamFormat, ws); totBytes = helpStm.Read(_bResampled, 0, 25000); ws.Close(); ws.Dispose(); helpStm.Close(); helpStm.Dispose(); _mp3Writer.Write(_bResampled, 0, totBytes); if (_outStream.Length > 0) { var bout = new byte[(int) _outStream.Length]; _outStream.Seek(0, SeekOrigin.Begin); _outStream.Read(bout, 0, (int) _outStream.Length); _outStream.SetLength(0); _outStream.Seek(0, SeekOrigin.Begin); foreach (Socket s in OutSockets) { s.Send(Encoding.ASCII.GetBytes(bout.Length.ToString("X") + "\r\n")); s.Send(bout); s.Send(Encoding.ASCII.GetBytes("\r\n")); } } } else { if (_mp3Writer != null) { _mp3Writer.Close(); _mp3Writer = null; } //if (_as!=null) //{ // _as.Close(); // _as.Dispose(); // _as = null; //} } if (DataAvailable != null) { DataAvailable(this, new NewDataAvailableArgs((byte[])e.RawData.Clone())); } } catch (Exception ex) { Log.Error("",ex);//MainForm.LogExceptionToFile(ex); } }
public void AudioDeviceDataAvailable(object sender, DataAvailableEventArgs e) { if (Levels == null || IsReconnect) return; try { lock (_lockobject) { Helper.FrameAction fa; if (!Recording) { var dt = Helper.Now.AddSeconds(0 - Micobject.settings.buffer); while (Buffer.Count > 0) { if (Buffer.TryPeek(out fa)) { if (fa.TimeStamp < dt) { if (Buffer.TryDequeue(out fa)) fa.Nullify(); } else { break; } } } } fa = new Helper.FrameAction(e.RawData, e.BytesRecorded, Levels.Max(), Helper.Now); Buffer.Enqueue(fa); } if (Micobject.settings.needsupdate) { Micobject.settings.samples = AudioSource.RecordingFormat.SampleRate; Micobject.settings.channels = AudioSource.RecordingFormat.Channels; Micobject.settings.needsupdate = false; } OutSockets.RemoveAll(p => p.TcpClient.Client.Connected == false); if (OutSockets.Count>0) { if (_mp3Writer == null) { _audioStreamFormat = new WaveFormat(22050, 16, Micobject.settings.channels); var wf = new MP3Stream.WaveFormat(_audioStreamFormat.SampleRate, _audioStreamFormat.BitsPerSample, _audioStreamFormat.Channels); _mp3Writer = new Mp3Writer(_outStream, wf, false); } byte[] bSrc = e.RawData; int totBytes = bSrc.Length; var ws = new TalkHelperStream(bSrc, totBytes, AudioSource.RecordingFormat); var helpStm = new WaveFormatConversionStream(_audioStreamFormat, ws); totBytes = helpStm.Read(_bResampled, 0, 22050); ws.Close(); ws.Dispose(); helpStm.Close(); helpStm.Dispose(); _mp3Writer.Write(_bResampled, 0, totBytes); var bterm = Encoding.ASCII.GetBytes("\r\n"); if (_outStream.Length > 0) { var bout = new byte[(int) _outStream.Length]; _outStream.Seek(0, SeekOrigin.Begin); _outStream.Read(bout, 0, (int) _outStream.Length); _outStream.SetLength(0); _outStream.Seek(0, SeekOrigin.Begin); foreach (var s in OutSockets) { var b = Encoding.ASCII.GetBytes(bout.Length.ToString("X") + "\r\n"); s.Stream.Write(b, 0, b.Length); s.Stream.Write(bout, 0, bout.Length); s.Stream.Write(bterm, 0, bterm.Length); } } } else { if (_mp3Writer != null) { _mp3Writer.Close(); _mp3Writer = null; } } if (DataAvailable != null) { DataAvailable(this, new NewDataAvailableArgs((byte[])e.RawData.Clone())); } if (_reconnectTime != DateTime.MinValue) { Micobject.settings.active = true; _errorTime = _reconnectTime = DateTime.MinValue; DoAlert("reconnect"); } _errorTime = DateTime.MinValue; } catch (Exception ex) { if (ErrorHandler != null) ErrorHandler(ex.Message); } }