public ArraySegment <byte> Encode(OpusEncoder encoder, out bool isStop, out bool isEmpty) { isStop = false; isEmpty = false; PcmArray nextPcmToSend = null; ArraySegment <byte> encoder_buffer; lock (_unencodedBuffer) { if (_unencodedBuffer.Count == 0) { isEmpty = true; } else { if (_unencodedBuffer.Count == 1 && _isWaitingToSendLastPacket) { isStop = true; } TargettedSpeech speech = _unencodedBuffer.Dequeue(); isStop = isStop || speech.IsStop; nextPcmToSend = speech.PcmData; if (isStop) { _isWaitingToSendLastPacket = false; } } } if (nextPcmToSend == null || nextPcmToSend.Pcm.Length == 0) { isEmpty = true; } encoder_buffer = isEmpty ? EmptyByteSegment : encoder.Encode(nextPcmToSend.Pcm); if (nextPcmToSend != null) { nextPcmToSend.IsAvailable = true; } if (isStop) { Debug.Log("Resetting encoder state"); encoder.ResetState(); } return(encoder_buffer); }
public CompressedBuffer Encode(OpusEncoder encoder, out bool isStop, out bool isEmpty) { isStop = false; isEmpty = false; PcmArray nextPcmToSend = null; ArraySegment <byte> encoder_buffer; lock (_bufferLock) { // Make sure we have data, or an end event if (_unencodedBuffer.Count == 0) { Monitor.Wait(_bufferLock); } // If there are still no unencoded buffers, then we return an empty packet if (_unencodedBuffer.Count == 0) { isEmpty = true; } else { if (_unencodedBuffer.Count == 1 && _isWaitingToSendLastPacket) { isStop = true; } TargettedSpeech speech = _unencodedBuffer.Dequeue(); isStop = isStop || speech.IsStop; nextPcmToSend = speech.PcmData; if (isStop) { _isWaitingToSendLastPacket = false; } } } if (nextPcmToSend == null || nextPcmToSend.Pcm.Length == 0) { isEmpty = true; } encoder_buffer = isEmpty ? EmptyByteSegment : encoder.Encode(nextPcmToSend.Pcm); byte[] pos = nextPcmToSend == null ? null : nextPcmToSend.PositionalData; int posLen = nextPcmToSend == null ? 0 : nextPcmToSend.PositionalDataLength; if (nextPcmToSend != null) { nextPcmToSend.UnRef(); } if (isStop) { Debug.Log("Resetting encoder state"); encoder.ResetState(); } CompressedBuffer compressedBuffer = new CompressedBuffer { EncodedData = encoder_buffer, PositionalData = pos, PositionalDataLength = posLen }; return(compressedBuffer); }