Beispiel #1
0
        /// <summary>
        /// Reads decoded audio data from the current stream.
        /// </summary>
        /// <param name="buffer">The buffer to write the data to.</param>
        /// <param name="offset">The offset into <paramref name="buffer"/> to start writing data.</param>
        /// <param name="count">The number of values to write.  This must be a multiple of <see cref="WaveFormat.Channels"/>.</param>
        /// <returns>The number of values writte to <paramref name="buffer"/>.</returns>
        public int Read(float[] buffer, int offset, int count)
        {
            if (_streamDecoder.IsEndOfStream)
            {
                if (_hasEnded)
                {
                    // we've ended and don't have any data, so just bail
                    return(0);
                }

                var eosea = new EndOfStreamEventArgs();
                EndOfStream?.Invoke(this, eosea);
                _hasEnded = true;
                if (eosea.AdvanceToNextStream)
                {
                    var formatChanged = GetNextDecoder(eosea.KeepStream);
                    if (formatChanged ?? true)
                    {
                        return(0);
                    }
                }
            }

            return(_streamDecoder.Read(buffer, offset, count));
        }