/// <summary> /// Read the digital data of the track /// </summary> /// <param name="track">Track to read</param> /// <param name="OnDataRead">Call each time data is read</param> /// <param name="StartSecond">First second of the track to read, 0 means to start at beginning of the track</param> /// <param name="Seconds2Read">Number of seconds to read, 0 means to read until the end of the track</param> /// <param name="OnProgress">Delegate to indicate the reading progress</param> /// <returns>Negative value means an error. On success returns the number of bytes read</returns> public int ReadTrack(int track, CdDataReadEventHandler DataReadEvent, uint StartSecond, uint Seconds2Read, CdReadProgressEventHandler ProgressEvent) { if (TocValid && (track >= Toc.FirstTrack) && (track <= Toc.LastTrack) && (DataReadEvent != null)) { int StartSect = GetStartSector(track); int EndSect = GetEndSector(track); if ((StartSect += (int)StartSecond * 75) >= EndSect) { StartSect -= (int)StartSecond * 75; } if ((Seconds2Read > 0) && ((int)(StartSect + Seconds2Read * 75) < EndSect)) { EndSect = StartSect + (int)Seconds2Read * 75; } uint Bytes2Read = (uint)(EndSect - StartSect) * CB_AUDIO; uint BytesRead = 0; byte[] Data = new byte[CB_AUDIO * NSECTORS]; bool Cont = true; bool ReadOk = true; if (ProgressEvent != null) { ReadProgressEventArgs rpa = new ReadProgressEventArgs(Bytes2Read, 0); ProgressEvent(this, rpa); Cont = !rpa.CancelRead; } for (int sector = StartSect; (sector < EndSect) && (Cont) && (ReadOk); sector += NSECTORS) { int Sectors2Read = ((sector + NSECTORS) < EndSect)?NSECTORS:(EndSect - sector); ReadOk = ReadSector(sector, Data, Sectors2Read); if (ReadOk) { DataReadEventArgs dra = new DataReadEventArgs(Data, (uint)(CB_AUDIO * Sectors2Read)); DataReadEvent(this, dra); BytesRead += (uint)(CB_AUDIO * Sectors2Read); if (ProgressEvent != null) { ReadProgressEventArgs rpa = new ReadProgressEventArgs(Bytes2Read, BytesRead); ProgressEvent(this, rpa); Cont = !rpa.CancelRead; } } } if (ReadOk) { return((int)BytesRead); } else { return(-1); } } else { return(-1); } }
public void OnCdDataRead(object sender, DataReadEventArgs ea) { Buffer.BlockCopy(ea.Data, 0, BufferArray, WritePosition, (int)ea.DataSize); WritePosition += (int)ea.DataSize; }