Пример #1
0
        private void mk_play_data(IntPtr userdata, int track_type, int codec_id, IntPtr data, int len, uint dts, uint pts)
        {
            unsafe
            {
                var a = new Span <byte>(data.ToPointer(), len).ToArray();
            }
            var mediaInfo = new MediaPlayInfo
            {
                Codec   = (EM_Codec)codec_id,
                Data    = data,
                Dts     = dts,
                IsVideo = track_type == 0,
                Length  = len,
                Pts     = pts
            };

            if (this.OnDataAsync != null)
            {
                mediaInfo.FillData(true);
                _ = Task.Run(() => OnDataAsync.Invoke(mediaInfo));
            }
            else if (this.OnData != null)
            {
                OnData.Invoke(mediaInfo);
            }
        }
Пример #2
0
        private async Task ReceiveAsync()
        {
            try {
                var buffer      = new byte[_lavaConfig.BufferSize];
                var finalBuffer = default(byte[]);

                var offset = 0;
                do
                {
                    var receiveResult = await _webSocket.ReceiveAsync(buffer, _cancellationToken.Token);

                    if (!receiveResult.EndOfMessage)
                    {
                        finalBuffer = new byte[_lavaConfig.BufferSize * 2];
                        buffer.CopyTo(finalBuffer, offset);
                        offset += receiveResult.Count;
                        buffer  = new byte[_lavaConfig.BufferSize];
                        continue;
                    }

                    switch (receiveResult.MessageType)
                    {
                    case WebSocketMessageType.Text:
                        await OnDataAsync.Invoke(RemoveTrailingNulls(finalBuffer ?? buffer));

                        finalBuffer = default;
                        buffer      = new byte[_lavaConfig.BufferSize];
                        offset      = 0;
                        break;

                    case WebSocketMessageType.Close:
                        await DisconnectAsync();

                        break;
                    }
                } while (_webSocket.State == WebSocketState.Open &&
                         !_cancellationToken.IsCancellationRequested);
            }
            catch (Exception exception) {
                if (exception is TaskCanceledException ||
                    exception is OperationCanceledException ||
                    exception is ObjectDisposedException)
                {
                    return;
                }

                await OnErrorAsync.Invoke(exception);
                await RetryConnectionAsync();
            }
        }
Пример #3
0
        private async Task ReceiveAsync()
        {
            try {
                var buffer      = new byte[1024];
                var finalBuffer = default(byte[]);
                var offset      = 0;
                do
                {
                    var receiveResult = await _webSocket.ReceiveAsync(buffer, _connectionTokenSource.Token);

                    if (!receiveResult.EndOfMessage)
                    {
                        finalBuffer = new byte[2048];
                        buffer.CopyTo(finalBuffer, offset);
                        offset += receiveResult.Count;
                        buffer  = new byte[1024];
                        continue;
                    }

                    switch (receiveResult.MessageType)
                    {
                    case WebSocketMessageType.Text:
                        await OnDataAsync.Invoke(new DataEventArgs(finalBuffer));

                        break;

                    case WebSocketMessageType.Close:
                        await DisconnectAsync();

                        break;
                    }
                } while (_webSocket.State == WebSocketState.Open &&
                         !_connectionTokenSource.IsCancellationRequested);
            }
            catch (Exception exception) {
                if (exception is TaskCanceledException or OperationCanceledException or ObjectDisposedException)
                {
                    return;
                }

                await OnErrorAsync(new ErrorEventArgs(exception));
            }
        }