public async Task ReadTrack(int offset, int sectors, OnReadingTrack onTrackRead, CancellationToken token)
        {
            var bytes2Read = (uint)(sectors) * Constants.CB_AUDIO;
            var bytesRead  = (uint)0;

            Progress(bytesRead, bytes2Read);

            for (int sector = 0; (sector < sectors); sector += Constants.NSECTORS)
            {
                if (token.IsCancellationRequested)
                {
                    return;
                }

                var sectors2Read = ((sector + Constants.NSECTORS) < sectors) ? Constants.NSECTORS : (sectors - sector);
                var buffer       = await _drive.ReadSector(offset - 150 + sector, sectors2Read);//No 2 second lead in for reading the track

                onTrackRead(buffer);
                bytesRead += (uint)(Constants.CB_AUDIO * sectors2Read);

                Progress(bytesRead, bytes2Read);
            }
        }
 public async Task ReadTrack(Track track, OnReadingTrack onTrackRead, CancellationToken token)
 {
     await ReadTrack(track.Offset, track.Sectors, onTrackRead, token);
 }
 public async Task ReadTrack(Track track, OnReadingTrack onTrackRead)
 {
     await ReadTrack(track, onTrackRead, CancellationToken.None);
 }