コード例 #1
0
        public VirtualFlacCreator(string file, string flacImageFileName, ITrackInfo [] tracksInfo)
        {
            tracksInfo_ = tracksInfo;

            string xml = String.Format("<virtualFlac><flacImage uri=\"{0}\"><tracks></tracks><frames></frames></flacImage></virtualFlac>", flacImageFileName);
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);

            inStream_ = new FlacStream(file, FlacStream.StreamMode.OpenExisting, FlacStream.StreamAccessMode.Read);
            inStream_.BeforeFrameDataRead += new FrameCallback(inStream__BeforeFrameDataRead);

            outStream_ = new FlacStream(Path.GetTempFileName(), FlacStream.StreamMode.CreateNew, FlacStream.StreamAccessMode.Write);
            inStream_.Decode();
            outStream_.Close();

            XmlNode tracks = doc.SelectSingleNode("/virtualFlac/flacImage/tracks");
            foreach (VirtualTrack vt in virtualTracks_)
            {
                XmlNode track = doc.CreateElement("track");
                vt.SaveToXml(track);

                tracks.AppendChild(track);
            }

            string virtualFlacFile = file.Remove(file.Length - ".flac".Length) + ".virtualflac";
            doc.Save(virtualFlacFile);
        }
コード例 #2
0
ファイル: ExtractTrack.cs プロジェクト: LastContrarian/flacfs
        public ExtractTrack(string file, long startSample, long endSample)
            : base(file)
        {
            startSample_ = startSample;
            endSample_ = endSample;

            string destFile = file + "." + startSample + ".flac";

            Console.Write("Extracting...");
            outStream_ = new FlacStream(destFile, FlacStream.StreamMode.CreateNew, FlacStream.StreamAccessMode.Both);
            outStream_.Encode();

            stream_.Decode();

            stream_.Close();
            outStream_.Close();

            outStream_ = new FlacStream(destFile, FlacStream.StreamMode.OpenExisting, FlacStream.StreamAccessMode.Both);

            outStream_.Encode();

            streamInfo_.Header.IsLastMetadataBlock = true;
            streamInfo_.TotalSamples = sampleCount_;
            streamInfo_.Checksum[0] = 0;
            streamInfo_.Checksum[1] = 0;
            streamInfo_.Checksum[2] = 0;
            streamInfo_.Checksum[3] = 0;
            streamInfo_.Write(outStream_);

            outStream_.Close();

            Done();
        }
コード例 #3
0
ファイル: CopyFile.cs プロジェクト: LastContrarian/flacfs
        // dump whole file
        public CopyFile(string file)
            : base(file)
        {
            Console.Write("Copying...");
            outStream_ = new FlacStream(file + ".copy.flac", FlacStream.StreamMode.CreateNew, FlacStream.StreamAccessMode.Both);
            outStream_.Encode();

            stream_.Decode();

            Done();
        }
コード例 #4
0
        public VirtualFlacTrack(string flacImage, VirtualTrack track)
        {
            track_ = track;

            inStream_ = new FlacStream(flacImage, FlacStream.StreamMode.OpenExisting, FlacStream.StreamAccessMode.Read);
            inStream_.BeforeFrameDataRead += new FrameCallback(inStream__BeforeFrameDataRead);
            inStream_.Decode();
            outStream_ = new FlacStream(Path.GetTempFileName(), FlacStream.StreamMode.CreateNew, FlacStream.StreamAccessMode.Both);

            ReadHeader();
        }
コード例 #5
0
ファイル: ProcessFile.cs プロジェクト: LastContrarian/flacfs
        protected ProcessFile(string file, bool noCallback)
        {
            watch_.Start();
            stream_ = new FlacStream(file, FlacStream.StreamMode.OpenExisting, FlacStream.StreamAccessMode.Read);

            length_ = new System.IO.FileInfo(file).Length;

            if (noCallback)
            {
            }
            else
            {
                stream_.MetadataRead += new MetadataCallback(stream__MetadataRead);
                stream_.BeforeFrameDataRead += new FrameCallback(stream__BeforeFrameDataRead);
            }
        }
コード例 #6
0
        private void ProcessFrame(FlacStream inStream, Frame frame, long offset)
        {
            long startSample = frame.Header.StartingSampleNumber;
            long endSample = startSample + frame.Header.BlockSize;
            int frameSize = (int)(inStream.Reader.Debug_BytesRead - offset);

            if (blockingStrategy_ == -1)
            {
                blockingStrategy_ = frame.Header.BlockingStrategy;
            }
            else
            {
                // whole stream must have the same blocking strategy
                Debug.Assert(frame.Header.BlockingStrategy == blockingStrategy_);
            }

            if (currentTrack_ != null)
            {
                long start = startSample;
                long end = endSample;

                if (start <= currentTrack_.EndSample && currentTrack_.EndSample <= end)
                {
                    end = currentTrack_.EndSample;
                    WriteFrame(frame, currentTrack_, start, end, frameSize, startSample, offset);
                    currentTrack_.TotalSamples = sampleCount_;

                    currentTrack_.Frames.Values[0].CalculateVirtualBlockSizeDifference(currentTrack_.StartSample, true);
                    currentTrack_.Frames.Values[currentTrack_.Frames.Count - 1].CalculateVirtualBlockSizeDifference(currentTrack_.EndSample, false);

                    RefreshFrame(inStream, ref frame, offset);
                    currentTrack_ = null;
                    goto loop;
                }
                else
                {
                    WriteFrame(frame, currentTrack_, start, end, frameSize, startSample, offset);
                    goto done;
                }
            }
            else
            {
                goto loop;
            }

            loop:
            foreach (ITrackInfo file in tracksInfo_)
            {
                long start = startSample;
                long end = endSample;
                if (start <= file.StartSample && file.StartSample <= end)
                {
                    VirtualTrack lastTrack = null;
                    if (virtualTracks_.Count > 0)
                    {
                        lastTrack = virtualTracks_[virtualTracks_.Count - 1];
                    }
                    if (lastTrack != null)
                    {
                        Debug.Assert(lastTrack.Frames.Values[lastTrack.Frames.Count - 1].imageEndSample == endSample);
                    }

                    currentTrack_ = new VirtualTrack();
                    currentTrack_.StartSample =file.StartSample;
                    currentTrack_.EndSample = file.EndSample;
                    currentTrack_.FileName = file.Name;
                    currentTrack_.Size = TRACK_HEADER_SIZE;
                    virtualTracks_.Add(currentTrack_);

                    sampleCount_ = 0;

                    start = file.StartSample;

                    bool next = false;
                    if (start <= file.EndSample && file.EndSample <= end)
                    {
                        // track ends in the same frame
                        end = file.EndSample;

                        // write (probably) partial first frame of track
                        WriteFrame(frame, currentTrack_, start, end, frameSize, startSample, offset);
                        RefreshFrame(inStream, ref frame, offset);
                        next = true;
                    }
                    else
                    {
                        // write (probably) partial first frame of track
                        WriteFrame(frame, currentTrack_, start, end, frameSize, startSample, offset);
                    }
                    if (next)
                    {
                        continue;
                    }
                    break;
                }
            }
            done:
            return;
        }
コード例 #7
0
        private void RefreshFrame(FlacStream inStream, ref Frame frame, long offset)
        {
            inStream_.Reader.Seek(offset);

            frame = new Frame();
            frame.ReadHeader(inStream);
            frame.ReadData(inStream);
            frame.ReadFooter(inStream);
        }
コード例 #8
0
 public FrameCallbackArgs(Frame frame, FlacStream stream)
 {
     frame_ = frame;
     stream_ = stream;
 }