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()); }
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); }
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; } }
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; } }
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(); }
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; }
public CdromFileStream(CdromFileInfo fileInfo) : this(fileInfo, true) { }
public CdromFileStream(CdromFileInfo fileInfo) : this(fileInfo, true) { }
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(); }