public SocketWrapper(StreamSocket baseSocket, DataReader dataReader, DataWriter dataWriter)
        {
            if (baseSocket == null)
            {
                throw new ArgumentNullException(nameof(baseSocket));
            }

            if (dataReader == null)
            {
                SocketDataReader = new DataReader(BaseSocket.InputStream);
            }

            if (dataWriter == null)
            {
                SocketDataWriter = new DataWriter(BaseSocket.OutputStream);
            }

            BaseSocket       = baseSocket;
            SocketDataReader = dataReader;
            SocketDataWriter = dataWriter;

            InitializeDataStream();

            InitialBufferLock.Release(1);
        }
        public virtual async Task ReadBytesAsync(byte[] buffer)
        {
            await WaitForInitialBufferReadyAsync();

            LastReadTime = DateTime.Now;
            SocketDataReader.ReadBytes(buffer);
            InitialBufferLock.Release();
        }
        public virtual async Task <uint> LoadAsync(uint amount)
        {
            await WaitForInitialBufferReadyAsync();

            var result = await SocketDataReader.LoadAsync(amount);

            InitialBufferLock.Release();
            return(result);
        }
        public virtual async Task <byte> ReadByteAsync()
        {
            await WaitForInitialBufferReadyAsync();

            LastReadTime = DateTime.Now;
            var result = SocketDataReader.ReadByte();

            InitialBufferLock.Release();
            return(result);
        }
        public virtual async Task <IBuffer> ReadBufferAsync(uint length)
        {
            await WaitForInitialBufferReadyAsync();

            LastReadTime = DateTime.Now;
            var result = SocketDataReader.ReadBuffer(length);

            InitialBufferLock.Release();
            return(result);
        }
        public virtual async Task <string> ReadStringAsync(uint codeUnitCount)
        {
            await WaitForInitialBufferReadyAsync();

            LastReadTime = DateTime.Now;
            var result = SocketDataReader.ReadString(codeUnitCount);

            InitialBufferLock.Release();
            return(result);
        }
        protected void HandleInitialBuffering(uint size)
        {
            //this function pauses the streaming process initially so that we can buffer, avoiding that initial stutter in playback.

            if (isInitialBuffering)
            {
                initialBufferedAmount += size;

                //todo create events that get bubbled up to the client so that they can show a "buffering" ui.
                if (initialBufferedAmount > Math.Max(UWPShoutcastMSS.Parsers.Audio.MP3Parser.mp3_sampleSize, UWPShoutcastMSS.Parsers.Audio.AAC_ADTSParser.aac_adts_sampleSize) * 10)
                {
                    InitialBufferLock.Release(1);
                    isInitialBuffering = false;
                }
            }
        }
 public Task WaitForInitialBufferReadyAsync()
 {
     return(InitialBufferLock.WaitAsync());
 }