예제 #1
0
        public static CdromFileInfo[] ReadAllTracks(char driveLetter)
        {
            Dictionary <int, CdromFileInfo> tracks = new Dictionary <int, CdromFileInfo>();

            foreach (FileInfo fi in new DirectoryInfo(driveLetter.ToString() + ":\\").GetFiles(TrackCdaFiles))
            {
                int           trackNumber = Int32.Parse(fi.Name.Substring(5, 2));
                CdromFileInfo cdfi        = new CdromFileInfo(fi.FullName);
                tracks.Add(trackNumber, cdfi);
            }

            List <CdromFileInfo> orderedTracks = new List <CdromFileInfo>();
            int i = 1;

            while (tracks.ContainsKey(i))
            {
                orderedTracks.Add(tracks[i]);
                i++;
            }
            if (orderedTracks.Count != tracks.Count)
            {
                throw new CdromUtilsException("Invalid CD content");
            }

            return(orderedTracks.ToArray());
        }
예제 #2
0
        public static AudioCDInformation ReadAudioCDInformation(char driveLetter)
        {
            CdromFileInfo[] files  = ReadAllTracks(driveLetter);
            CdtextData      cdtext = ReadCdtextData(driveLetter);

            CdromFileInfo firstFile = files[0];
            CdromFileInfo lastFile  = files[files.Length - 1];

            AudioCDInformation audioCd = new AudioCDInformation();

            audioCd.CDCatalogNumber     = cdtext.DiskId;
            audioCd.CdaDiskSerialNumber = files[0].DiskSerialNumber;
            audioCd.CddbDiskId          = GetCddbDiskId(files);
            audioCd.TrackCount          = files.Length;
            audioCd.TotalDuration       = (lastFile.StartFrom + lastFile.Duration).TotalSeconds;
            audioCd.Metadata            = CreateMetadata(cdtext, 0);

            audioCd.Tracks = new AudioTrackInformation[files.Length];
            for (int i = 0; i < files.Length; i++)
            {
                AudioTrackInformation track = new AudioTrackInformation();
                track.TrackNumber = i + 1;
                track.Filename    = Path.GetFileName(files[i].Path);
                track.Metadata    = CreateMetadata(cdtext, i + 1);
                track.StartFrom   = files[i].StartFrom.TotalSeconds;
                track.Duration    = files[i].Duration.TotalSeconds;
                track.StartSector = files[i].StartSector;
                track.SectorCount = files[i].SectorCount;
                track.Metadata    = CreateMetadata(cdtext, i + 1);

                audioCd.Tracks[i] = track;
            }

            return(audioCd);
        }
예제 #3
0
        public CdromFileStream(CdromFileInfo fileInfo, bool includeWaveHeader)
        {
            if (fileInfo == null) throw new ArgumentNullException("fileInfo");

            CdromReader reader = new CdromReader(fileInfo.DriveLetter);
            try
            {
                this.dataSource = ReadData(reader,
                    fileInfo.StartSector, fileInfo.SectorCount, includeWaveHeader);

                InitializeData();
            }
            catch
            {
                reader.Close();
                throw;
            }
        }
예제 #4
0
        public CdromFileStream(CdromFileInfo fileInfo, bool includeWaveHeader)
        {
            if (fileInfo == null)
            {
                throw new ArgumentNullException("fileInfo");
            }

            CdromReader reader = new CdromReader(fileInfo.DriveLetter);

            try
            {
                this.dataSource = ReadData(reader,
                                           fileInfo.StartSector, fileInfo.SectorCount, includeWaveHeader);

                InitializeData();
            }
            catch
            {
                reader.Close();
                throw;
            }
        }
예제 #5
0
        public static CdromFileInfo[] ReadAllTracks(char driveLetter)
        {
            Dictionary<int, CdromFileInfo> tracks = new Dictionary<int, CdromFileInfo>();

            foreach (FileInfo fi in new DirectoryInfo(driveLetter.ToString() + ":\\").GetFiles(TrackCdaFiles))
            {
                int trackNumber = Int32.Parse(fi.Name.Substring(5, 2));
                CdromFileInfo cdfi = new CdromFileInfo(fi.FullName);
                tracks.Add(trackNumber, cdfi);
            }

            List<CdromFileInfo> orderedTracks = new List<CdromFileInfo>();
            int i = 1;
            while (tracks.ContainsKey(i))
            {
                orderedTracks.Add(tracks[i]);
                i++;
            }
            if (orderedTracks.Count != tracks.Count)
                throw new CdromUtilsException("Invalid CD content");

            return orderedTracks.ToArray();
        }
예제 #6
0
        private static uint GetCddbDiskId(CdromFileInfo[] tracks)
        {
            int totalSeconds = 0;
            uint offsetsSum = 0;
            for (int i = 0; i < tracks.Length; i++)
            {
                uint startSeconds = (uint)tracks[i].StartFrom.TotalSeconds;
                while (startSeconds > 0)
                {
                    offsetsSum += startSeconds % 10;
                    startSeconds /= 10;
                }
                totalSeconds += (int)Math.Round( tracks[i].Duration.TotalSeconds );
            }

            uint diskId = ((uint)(offsetsSum & 0xFF)) << 24 | (uint)totalSeconds << 8 | (uint)tracks.Length;
            return diskId;
        }
예제 #7
0
 public CdromFileStream(CdromFileInfo fileInfo)
     : this(fileInfo, true)
 {
 }
예제 #8
0
 public CdromFileStream(CdromFileInfo fileInfo)
     : this(fileInfo, true)
 {
 }
예제 #9
0
        private static void CopyTrack(CdromFileInfo trackFileInfo, string path)
        {
            Console.Write("Copying track {0}: ", Path.GetFileName(trackFileInfo.Path));
            using (Stream sourceStream = trackFileInfo.CreateStream())
            {
                using (Stream outputStream = CreateOutputStream(path))
                {
                    const int BufferSize = 0xFE00;
                    const int ProgressItemSize = 1000000;
                    byte[] buffer = new byte[BufferSize];
                    int reportedProgress = 0;
                    long copiedBytes = 0;
                    int read;
                    while ((read = sourceStream.Read(buffer, 0, BufferSize)) > 0)
                    {
                        outputStream.Write(buffer, 0, read);

                        copiedBytes += read;
                        int currentProgress = (int)(copiedBytes / ProgressItemSize);
                        while (currentProgress > reportedProgress)
                        {
                            Console.Write(".");
                            reportedProgress++;
                        }
                    }
                }
            }
            Console.WriteLine();
        }