private void OnCaptured(bool recover, IAudioPacket packet) { byte[] uncompressed; if (recover) { uncompressed = _codec.Restore(packet?.Payload ?? null); } else { uncompressed = _codec.Decode(packet.Payload); } _waveProvider.AddSamples(uncompressed, 0, uncompressed.Length); }
void AudioLoop() { System.Threading.Thread.CurrentThread.Priority = ThreadPriority.Highest; short[] outputBuffer = new short[160]; bool newStream = true; Action streamFinsihed = () => { _audioPlayer.Pause(); }; Action streamStart = () => { newStream = true; _audioPlayer.Resume(); }; while (!_disposing) { (AudioData? data, bool isNext) = _jitterBuffer.GetNext(streamFinsihed, streamStart); if (newStream) { } if (data != null) { newStream = false; } //decode if (newStream) { Silence(outputBuffer); //don't do packet loss concellement its just unfilled slots at start of new stream } else if (data != null || (data == null && _talker != null)) { _audioCodec.Decode(data, isNext, outputBuffer); } else { Silence(outputBuffer); //don't do packet loss concellement if we don't have a talker } //play _audioPlayer.PlayAudio(outputBuffer); } }
private void Broadcast() { try { Thread.Sleep(300); while (Connected) { //if (!EndpointMatches(udpReciever.Client.RemoteEndPoint)) // throw new Exception("Endpoint does not match the client."); byte[] data = udpReciever.Receive(ref acceptingEndpoint); byte[] decodedData = audioCodec.Decode(data, 0, data.Length); buffer.AddSamples(decodedData, 0, decodedData.Length); } } catch (SocketException) { // usually not a problem - just means we have disconnected } }