Beispiel #1
0
        public FlacFile(Stream stream, FlacPreScanMethodMode? scanFlag, Action<FlacPreScanFinishedEventArgs> onscanFinished)
        {

            if (stream == null)
                throw new ArgumentNullException();
            if (!stream.CanRead)
                throw new ArgumentException("Stream is not readable.", "stream");

            _stream = stream;

            //skip ID3v2
            Tags.ID3.ID3v2.SkipTag(stream);
            int read = 0;

            //read fLaC sync
            byte[] beginSync = new byte[4];
            read = stream.Read(beginSync, 0, beginSync.Length);
            if (read < beginSync.Length)
                throw new EndOfStreamException("Can not read \"fLaC\" sync.");
            if (beginSync[0] == 0x66 && beginSync[1] == 0x4C &&
               beginSync[2] == 0x61 && beginSync[3] == 0x43)
            {
                //read metadata
                var metadata = FlacMetadata.AllDataFromStream(stream);

                Metadata = metadata;
                if (metadata == null || metadata.Count <= 0)
                {
                    throw new FlacException("No Metadata found.", FlacLayer.Metadata);
                }

                FlacMetadataStreamInfo streamInfo = metadata.Where(x => x.MetaDataType == FlacMetaDataType.StreamInfo).First() as FlacMetadataStreamInfo;
                if (streamInfo == null)
                    new FlacException("No StreamInfo-Metadata found.", FlacLayer.Metadata);

                _streamInfo = streamInfo;
                _waveFormat = new WaveFormat(streamInfo.SampleRate, (short)streamInfo.BitsPerSample, (short)streamInfo.Channels, AudioEncoding.Pcm);
                Debug.WriteLine("Flac StreamInfo found -> WaveFormat: " + _waveFormat.ToString());
                Debug.WriteLine("Flac-File-Metadata read.");
            }
            else
            {
                throw new FlacException("Invalid Flac-File. \"fLaC\" Sync not found.", FlacLayer.Top);
            }

            //prescan stream
            if (scanFlag != null)
            {
                FlacPreScan scan = new FlacPreScan(stream);
                scan.ScanFinished += (s, e) =>
                {
                    if (onscanFinished != null)
                        onscanFinished(e);
                };
                scan.ScanStream(_streamInfo, (FlacPreScanMethodMode)scanFlag);
                _scan = scan;
            }
        }
Beispiel #2
0
        public void ScanStream(FlacMetadataStreamInfo streamInfo, FlacPreScanMethodMode mode)
        {
            long saveOffset = _stream.Position;
            StartScan(streamInfo, mode);
            _stream.Position = saveOffset;

            long totalLength = 0, totalsamples = 0;
            foreach (var frame in Frames)
            {
                totalLength += frame.Header.BlockSize * frame.Header.BitsPerSample * frame.Header.Channels;
                totalsamples += frame.Header.BlockSize;
            }
            TotalLength = totalLength;
            TotalSamples = totalsamples;
        }
Beispiel #3
0
        public void ScanStream(FlacMetadataStreamInfo streamInfo, FlacPreScanMethodMode method)
        {
            long saveOffset = _stream.Position;

            StartScan(streamInfo, method);
            _stream.Position = saveOffset;

            long totalLength = 0, totalsamples = 0;

            foreach (var frame in Frames)
            {
                totalLength  += frame.Header.BlockSize * frame.Header.BitsPerSample * frame.Header.Channels;
                totalsamples += frame.Header.BlockSize;
            }
            TotalLength  = totalLength;
            TotalSamples = totalsamples;
        }
Beispiel #4
0
        private void StartScan(FlacMetadataStreamInfo streamInfo, FlacPreScanMethodMode method)
        {
            if (_isRunning)
                throw new Exception("Scan is already running.");

            _isRunning = true;

            if (method == FlacPreScanMethodMode.Async)
            {
                ThreadPool.QueueUserWorkItem(o =>
                {
                    Frames = RunScan(streamInfo);
                    _isRunning = false;
                });
            }
            else
            {
                Frames = RunScan(streamInfo);
                _isRunning = false;
            }
        }
Beispiel #5
0
        protected void StartScan(FlacMetadataStreamInfo streamInfo, FlacPreScanMethodMode method)
        {
            if (_isRunning)
            {
                throw new Exception("Scan is already running.");
            }

            _isRunning = true;

            if (method == FlacPreScanMethodMode.Async)
            {
                new Thread((o) =>
                {
                    Frames     = RunScan(streamInfo);
                    _isRunning = false;
                }).Start();
            }
            else
            {
                Frames     = ScanThisShit(streamInfo);
                _isRunning = false;
            }
        }
Beispiel #6
0
        private void StartScan(FlacMetadataStreamInfo streamInfo, FlacPreScanMethodMode method)
        {
            if (_isRunning)
            {
                throw new Exception("Scan is already running.");
            }

            _isRunning = true;

            if (method == FlacPreScanMethodMode.Async)
            {
                ThreadPool.QueueUserWorkItem(o =>
                {
                    Frames     = RunScan(streamInfo);
                    _isRunning = false;
                });
            }
            else
            {
                Frames     = RunScan(streamInfo);
                _isRunning = false;
            }
        }
Beispiel #7
0
 /// <summary>
 ///     Initializes a new instance of the <see cref="FlacReader" /> class.
 /// </summary>
 /// <param name="stream">Stream which contains flac data which should be decoded.</param>
 /// <param name="scanFlag">Scan mode which defines how to scan the flac data for frames.</param>
 public FlacReader(Stream stream, FlacPreScanMethodMode scanFlag)
     : this(stream, scanFlag, null)
 {
 }
Beispiel #8
0
        /// <summary>
        ///     Initializes a new instance of the <see cref="FlacReader" /> class.
        /// </summary>
        /// <param name="stream">Stream which contains flac data which should be decoded.</param>
        /// <param name="scanFlag">Scan mode which defines how to scan the flac data for frames.</param>
        /// <param name="onscanFinished">
        ///     Callback which gets called when the pre scan processes finished. Should be used if the
        ///     <paramref name="scanFlag" /> argument is set the <see cref="FlacPreScanMethodMode.Async" />.
        /// </param>
        public FlacReader(Stream stream, FlacPreScanMethodMode scanFlag,
                          Action <FlacPreScanFinishedEventArgs> onscanFinished)
        {
            if (stream == null)
            {
                throw new ArgumentNullException();
            }
            if (!stream.CanRead)
            {
                throw new ArgumentException("Stream is not readable.", "stream");
            }

            _stream = stream;

            //skip ID3v2
            NAudio.Flac.ID3v2.SkipTag(stream);

            //read fLaC sync
            var beginSync = new byte[4];
            int read      = stream.Read(beginSync, 0, beginSync.Length);

            if (read < beginSync.Length)
            {
                throw new EndOfStreamException("Can not read \"fLaC\" sync.");
            }
            if (beginSync[0] == 0x66 && beginSync[1] == 0x4C && //Check for 'fLaC' signature
                beginSync[2] == 0x61 && beginSync[3] == 0x43)
            {
                //read metadata
                List <FlacMetadata> metadata = FlacMetadata.ReadAllMetadataFromStream(stream);

                Metadata = metadata;
                if (metadata == null || metadata.Count <= 0)
                {
                    throw new FlacException("No Metadata found.", FlacLayer.Metadata);
                }

                var streamInfo =
                    metadata.First(x => x.MetaDataType == FlacMetaDataType.StreamInfo) as FlacMetadataStreamInfo;
                if (streamInfo == null)
                {
                    throw new FlacException("No StreamInfo-Metadata found.", FlacLayer.Metadata);
                }

                _streamInfo = streamInfo;
                _waveFormat = new WaveFormat(streamInfo.SampleRate, (short)streamInfo.BitsPerSample,
                                             (short)streamInfo.Channels);
                Debug.WriteLine("Flac StreamInfo found -> WaveFormat: " + _waveFormat);
                Debug.WriteLine("Flac-File-Metadata read.");
            }
            else
            {
                throw new FlacException("Invalid Flac-File. \"fLaC\" Sync not found.", FlacLayer.Top);
            }

            //prescan stream
            if (scanFlag != FlacPreScanMethodMode.None)
            {
                var scan = new FlacPreScan(stream);
                scan.ScanFinished += (s, e) =>
                {
                    if (onscanFinished != null)
                    {
                        onscanFinished(e);
                    }
                };
                scan.ScanStream(_streamInfo, scanFlag);
                _scan = scan;
            }
        }
Beispiel #9
0
        protected void StartScan(FlacMetadataStreamInfo streamInfo, FlacPreScanMethodMode method)
        {
            if (_isRunning)
                throw new Exception("Scan is already running.");

            _isRunning = true;

            if (method == FlacPreScanMethodMode.Async)
            {
                new Thread((o) =>
                {
                    Frames = RunScan(streamInfo);
                    _isRunning = false;
                }).Start();
            }
            else
            {
                Frames = ScanThisShit(streamInfo);
                _isRunning = false;
            }
        }
Beispiel #10
0
 public FlacFile(Stream stream, FlacPreScanMethodMode? scanFlag)
     : this(stream, scanFlag, null)
 {
 }
Beispiel #11
0
        /// <summary>
        ///     Initializes a new instance of the <see cref="FlacReader" /> class.
        /// </summary>
        /// <param name="stream">Stream which contains flac data which should be decoded.</param>
        /// <param name="scanFlag">Scan mode which defines how to scan the flac data for frames.</param>
        /// <param name="onscanFinished">
        ///     Callback which gets called when the pre scan processes finished. Should be used if the
        ///     <paramref name="scanFlag" /> argument is set the <see cref="FlacPreScanMethodMode.Async" />.
        /// </param>
        public FlacReader(Stream stream, FlacPreScanMethodMode scanFlag,
            Action<FlacPreScanFinishedEventArgs> onscanFinished)
        {
            if (stream == null)
                throw new ArgumentNullException();
            if (!stream.CanRead)
                throw new ArgumentException("Stream is not readable.", "stream");

            _stream = stream;

            //skip ID3v2
            NAudio.Flac.ID3v2.SkipTag(stream);

            //read fLaC sync
            var beginSync = new byte[4];
            int read = stream.Read(beginSync, 0, beginSync.Length);
            if (read < beginSync.Length)
                throw new EndOfStreamException("Can not read \"fLaC\" sync.");
            if (beginSync[0] == 0x66 && beginSync[1] == 0x4C && //Check for 'fLaC' signature
                beginSync[2] == 0x61 && beginSync[3] == 0x43)
            {
                //read metadata
                List<FlacMetadata> metadata = FlacMetadata.ReadAllMetadataFromStream(stream);

                Metadata = metadata;
                if (metadata == null || metadata.Count <= 0)
                    throw new FlacException("No Metadata found.", FlacLayer.Metadata);

                var streamInfo =
                    metadata.First(x => x.MetaDataType == FlacMetaDataType.StreamInfo) as FlacMetadataStreamInfo;
                if (streamInfo == null)
                    throw new FlacException("No StreamInfo-Metadata found.", FlacLayer.Metadata);

                _streamInfo = streamInfo;
                _waveFormat = new WaveFormat(streamInfo.SampleRate, (short) streamInfo.BitsPerSample,
                    (short) streamInfo.Channels);
                Debug.WriteLine("Flac StreamInfo found -> WaveFormat: " + _waveFormat);
                Debug.WriteLine("Flac-File-Metadata read.");
            }
            else
                throw new FlacException("Invalid Flac-File. \"fLaC\" Sync not found.", FlacLayer.Top);

            //prescan stream
            if (scanFlag != FlacPreScanMethodMode.None)
            {
                var scan = new FlacPreScan(stream);
                scan.ScanFinished += (s, e) =>
                {
                    if (onscanFinished != null)
                        onscanFinished(e);
                };
                scan.ScanStream(_streamInfo, scanFlag);
                _scan = scan;
            }
        }
Beispiel #12
0
 /// <summary>
 ///     Initializes a new instance of the <see cref="FlacReader" /> class.
 /// </summary>
 /// <param name="stream">Stream which contains flac data which should be decoded.</param>
 /// <param name="scanFlag">Scan mode which defines how to scan the flac data for frames.</param>
 public FlacReader(Stream stream, FlacPreScanMethodMode scanFlag)
     : this(stream, scanFlag, null)
 {
 }