private static IEnumerable <Track> GetTracks(Win32Functions.CDROM_TOC toc)
        {
            for (var i = toc.FirstTrack - 1; i < toc.LastTrack; i++)
            {
                if (toc.TrackData[i].Control == 0)
                {
                    var trackNumber = toc.TrackData[i].TrackNumber;
                    var offset      = GetStartSector(toc.TrackData[i]);

                    var nextTrack = toc.TrackData[i + 1];
                    var sectors   = GetStartSector(nextTrack) - offset;

                    yield return(new Track(trackNumber, offset, sectors));
                }
            }
        }
Beispiel #2
0
        public async Task <TableOfContents> ReadTableOfContents()
        {
            if (!await IsCdInDrive())
            {
                return(null);
            }

            return(await Task.Run(() =>
            {
                var toc = new Win32Functions.CDROM_TOC();
                uint bytesRead = 0;
                var succes =
                    Win32Functions.DeviceIoControl(_driveHandle, Win32Functions.IOCTL_CDROM_READ_TOC, IntPtr.Zero, 0,
                                                   toc, (uint)Marshal.SizeOf(toc), ref bytesRead, IntPtr.Zero) != 0;
                if (!succes)
                {
                    throw new Exception("Reading the TOC failed.");
                }
                return TableOfContents.Create(toc);
            }));
        }
        internal static TableOfContents Create(Win32Functions.CDROM_TOC toc)
        {
            var tracks = GetTracks(toc).ToList();

            return(new TableOfContents(tracks));
        }