📄 cdrecord.c
字号:
if (debug) { printf("\nNOTICE: reducing block size for last record.\n"); neednl = FALSE; } if ((amount = count % secsize) != 0) { amount = secsize - amount; fillbytes(&bp[count], amount, '\0'); count += amount; printf("\nWARNING: padding up to secsize.\n"); neednl = FALSE; } bytespt = count; secspt = count / secsize; if (trackp->padsize == 0 && (bytes_read/secsize) >= 300) islast = TRUE; } amount = (*dp->cdr_write_trackdata)(scgp, bp, startsec, bytespt, secspt, islast); if (amount < 0) { printf("%swrite track data: error after %ld bytes\n", neednl?"\n":"", bytes); return (-1); } bytes += amount; startsec += amount / secsize; if (lverbose && (bytes >= (savbytes + 0x100000))) { int fper; printf("\rTrack %02d: %3ld", track, bytes >> 20); if (tracksize > 0) printf(" of %3ld MB", tracksize >> 20); else printf(" MB"); printf(" written"); fper = fifo_percent(TRUE); if (fper >= 0) printf(" (fifo %3d%%)", fper); printf("."); savbytes = (bytes >> 20) << 20; flush(); neednl = TRUE; }#ifdef BCAP if (bsize >= 0) { read_buff_cap(scgp, 0, &bfree); per = 100*(bsize - bfree) / bsize; if (per != oper) printf("[%3d] %3d %3d\b\b\b\b\b\b\b\b\b\b\b\b\b\b", per, bsize >> 10, bfree >> 10); oper = per; flush(); }#endif } while (tracksize < 0 || bytes_read < tracksize); if ((bytes / secsize) < 300) { amount = roundup(trackp->padsize, secsize); if (((bytes+amount) / secsize) < 300) trackp->padsize = 300 * secsize - bytes; } if (trackp->padsize) { if (neednl) { printf("\n"); neednl = FALSE; } if ((trackp->padsize >> 20) > 0) { neednl = TRUE; } else if (lverbose) { printf("Track %02d: writing %3ld KB of pad data.\n", track, trackp->padsize >> 10); neednl = FALSE; } pad_track(scgp, dp, track, trackp, startsec, trackp->padsize, TRUE, &amount); bytes += amount; startsec += amount / secsize; } printf("%sTrack %02d: Total bytes read/written: %ld/%ld (%ld sectors).\n", neednl?"\n":"", track, bytes_read, bytes, bytes/secsize); flush(); return 0;}EXPORT intpad_track(scgp, dp, track, trackp, startsec, amt, dolast, bytesp) SCSI *scgp; cdr_t *dp; int track; track_t *trackp; long startsec; long amt; BOOL dolast; long *bytesp;{ long bytes = 0; long savbytes = 0; int secsize; int secspt; int bytespt; int amount; BOOL neednl = FALSE; BOOL islast = FALSE; secsize = trackp->secsize; secspt = trackp->secspt; bytespt = secsize * secspt; fillbytes(buf, bytespt, '\0'); if ((amt >> 20) > 0) { printf("\rTrack %02d: 0 of %3ld MB pad written.", track, amt >> 20); flush(); } do { if (amt < bytespt) { bytespt = roundup(amt, secsize); secspt = bytespt / secsize; } if (dolast && (amt - bytespt) <= 0) islast = TRUE; amount = (*dp->cdr_write_trackdata)(scgp, buf, startsec, bytespt, secspt, islast); if (amount < 0) { printf("%swrite track data: error after %ld bytes\n", neednl?"\n":"", bytes); if (bytesp) *bytesp = bytes;read_buff_cap(scgp, 0, 0); return (-1); } amt -= amount; bytes += amount; startsec += amount / secsize; if (lverbose && (bytes >= (savbytes + 0x100000))) { printf("\rTrack %02d: %3ld", track, bytes >> 20); savbytes = (bytes >> 20) << 20; flush(); neednl = TRUE; } } while (amt > 0); if (bytesp) *bytesp = bytes; return (bytes);}#ifdef USE_WRITE_BUFEXPORT intwrite_buf(scgp, dp, track, trackp, bp, startsec, amt, secsize, dolast, bytesp) SCSI *scgp; cdr_t *dp; int track; track_t *trackp; char *bp; long startsec; long amt; int secsize; BOOL dolast; long *bytesp;{ long bytes = 0; long savbytes = 0;/* int secsize;*/ int secspt; int bytespt; int amount; BOOL neednl = FALSE; BOOL islast = FALSE;/* secsize = trackp->secsize;*//* secspt = trackp->secspt;*/ secspt = bufsize/secsize; secspt = min(255, secspt); bytespt = secsize * secspt; /* fillbytes(buf, bytespt, '\0');*/ if ((amt >> 20) > 0) { printf("\rTrack %02d: 0 of %3ld MB pad written.", track, amt >> 20); flush(); } do { if (amt < bytespt) { bytespt = roundup(amt, secsize); secspt = bytespt / secsize; } if (dolast && (amt - bytespt) <= 0) islast = TRUE; amount = (*dp->cdr_write_trackdata)(scgp, bp, startsec, bytespt, secspt, islast); if (amount < 0) { printf("%swrite track data: error after %ld bytes\n", neednl?"\n":"", bytes); if (bytesp) *bytesp = bytes;read_buff_cap(scgp, 0, 0); return (-1); } amt -= amount; bytes += amount; startsec += amount / secsize; if (lverbose && (bytes >= (savbytes + 0x100000))) { printf("\rTrack %02d: %3ld", track, bytes >> 20); savbytes = (bytes >> 20) << 20; flush(); neednl = TRUE; } } while (amt > 0); if (bytesp) *bytesp = bytes; return (bytes);}#endif /* USE_WRITE_BUF */LOCAL voidprintdata(track, trackp) int track; track_t *trackp;{ if (trackp->tracksize >= 0) { printf("Track %02d: data %3ld MB ", track, trackp->tracksize >> 20); } else { printf("Track %02d: data unknown length", track); } if (trackp->padsize > 0) { if ((trackp->padsize >> 20) > 0) printf(" padsize: %3ld MB", trackp->padsize >> 20); else printf(" padsize: %3ld KB", trackp->padsize >> 10); } if (trackp->pregapsize != 150) { printf(" pregapsize: %3ld", trackp->pregapsize); } printf("\n");}LOCAL voidprintaudio(track, trackp) int track; track_t *trackp;{ if (trackp->tracksize >= 0) { printf("Track %02d: audio %3ld MB (%02d:%02d.%02d) %spreemp%s%s", track, trackp->tracksize >> 20, minutes(trackp->tracksize), seconds(trackp->tracksize), hseconds(trackp->tracksize), is_preemp(trackp) ? "" : "no ", is_swab(trackp) ? " swab":"", ((trackp->tracksize < 300L*trackp->secsize) || (trackp->tracksize % trackp->secsize)) && is_pad(trackp) ? " pad" : ""); } else { printf("Track %02d: audio unknown length %spreemp%s%s", track, is_preemp(trackp) ? "" : "no ", is_swab(trackp) ? " swab":"", (trackp->tracksize % trackp->secsize) && is_pad(trackp) ? " pad" : ""); } if (trackp->padsize > 0) { if ((trackp->padsize >> 20) > 0) printf(" padsize: %3ld MB", trackp->padsize >> 20); else printf(" padsize: %3ld KB", trackp->padsize >> 10); printf(" (%02d:%02d.%02d)", minutes(trackp->padsize), seconds(trackp->padsize), hseconds(trackp->padsize)); } if (trackp->pregapsize != 150) { printf(" pregapsize: %3ld", trackp->pregapsize); } printf("\n");}LOCAL voidcheckfile(track, trackp) int track; track_t *trackp;{ if (trackp->tracksize > 0 && is_audio(trackp) && ((trackp->tracksize < 300L*trackp->secsize) || (trackp->tracksize % trackp->secsize)) && !is_pad(trackp)) { errmsgno(EX_BAD, "Bad audio track size %ld for track %02d.\n", trackp->tracksize, track); errmsgno(EX_BAD, "Audio tracks must be at least %ld bytes and a multiple of %d.\n", 300L*trackp->secsize, trackp->secsize); comerrno(EX_BAD, "See -pad option.\n"); } if (!lverbose) return; if (is_audio(trackp)) printaudio(track, trackp); else printdata(track, trackp);}LOCAL intcheckfiles(tracks, trackp) int tracks; track_t *trackp;{ int i; int isaudio = 1; for (i = 1; i <= tracks; i++) { if (!is_audio(&trackp[i])) isaudio = 0; checkfile(i, &trackp[i]); } return (isaudio);}LOCAL voidsetpregaps(tracks, trackp) int tracks; track_t *trackp;{ int i; int sectype; track_t *tp; /* * Set some values for track 0 (the lead-in) * XXX There should be a better place to do this. */ sectype = trackp[1].sectype; trackp[0].sectype = sectype; trackp[0].dbtype = trackp[1].dbtype; for (i = 1; i <= tracks; i++) { tp = &trackp[i]; if (tp->pregapsize == -1L) { tp->pregapsize = 150; /* Default Pre GAP */ if (sectype != tp->sectype) { tp->pregapsize = 255; /* Pre GAP is 255 */ tp->flags &= ~TI_PREGAP; } } sectype = tp->sectype; /* Save old sectype */ } /* * Set some values for track 0xAA (the lead-out) * XXX There should be a better place to do this. */ trackp[tracks+1].sectype = sectype; trackp[tracks+1].dbtype = trackp[tracks].dbtype;}LOCAL longchecktsize(tracks, trackp) int tracks; track_t *trackp;{ int i; long curr; long total = -150; Ullong btotal; track_t *tp; for (i = 1; i <= tracks; i++) { tp = &trackp[i]; if (!is_pregap(tp)) total += tp->pregapsize; if (lverbose > 1) { printf("track: %d start: %ld pregap: %ld\n", i, total, tp->pregapsize); } tp->trackstart = total; if (tp->tracksize >= 0) { curr = (tp->tracksize + (tp->secsize-1)) / tp->secsize; curr += (tp->padsize + (tp->secsize-1)) / tp->secsize; if (curr < 300) /* Minimum track size is 4s */ curr = 300; if (is_tao(tp) && !is_audio(tp)) { curr += 2; } total += curr; } } tp = &trackp[i]; tp->trackstart = total; if (!lverbose) return (total); btotal = (Ullong)total * 2352;/* XXX Sector Size ??? */ if (tracks > 0) { printf("Total size: %3lu MB (%02d:%02d.%02d) = %ld sectors\n", (Ulong)(btotal >> 20), minutes(btotal), seconds(btotal), hseconds(btotal), total); btotal += 150 * 2352; printf("Lout start: %3lu MB (%02d:%02d/%02d) = %ld sectors\n", (Ulong)(btotal >> 20), minutes(btotal), seconds(btotal), frames(btotal), total); } return (total);}LOCAL voidchecksize(trackp) track_t *trackp;{ struct stat st; /* * If the current input file is a regular file and * 'padsize=' has not been specified, * use fstat() or file parser to get the size of the file. */ if (trackp->tracksize < 0 && (trackp->flags & TI_ISOSIZE) != 0) { trackp->tracksize = isosize(trackp->f); } if (trackp->tracksize < 0 && (trackp->flags & TI_NOAUHDR) == 0) { trackp->tracksize = ausize(trackp->f); } if (trackp->tracksize < 0 && (trackp->flags & TI_NOAUHDR) == 0) { trackp->tracksize = wavsize(trackp->f); if (trackp->tracksize > 0) /* Force little endian input */ trackp->flags |= TI_SWAB; } if (trackp->tracksize == AU_BAD_CODING) { comerrno(EX_BAD, "Inappropriate audio coding in '%s'.\n", trackp->filename); } if (trackp->tracksize < 0 && fstat(trackp->f, &st) >= 0 && S_ISREG(st.st_mode)) { trackp->tracksize = st.st_size; }}LOCAL BOOLcheckdsize(scgp, dp, dsp, tsize) SCSI *scgp; cdr_t *dp; dstat_t *dsp; long tsize;{ long startsec = 0L; long endsec = 0L; scgp->silent++; (*dp->cdr_next_wr_address)(scgp, /*i*/ 0, (track_t *)0, &startsec); scgp->silent--; /* * This only should happen when the drive is currently in DAO mode. * We rely on the drive being in TAO mode, a negative value for * startsec is not correct here it may be caused by bad firmware or * by a drive in DAO mode. In DAO mode the drive will report the * pre-gap as part of the writable area. */ if (startsec < 0) startsec = 0; endsec = startsec + tsize; if (dsp->ds_maxblocks > 0) { if (lverbose) printf("Blocks total: %ld Blocks current: %ld Blocks remaining: %ld\n", dsp->ds_maxblocks, dsp->ds_maxblocks - startsec, dsp->ds_maxblocks - endsec); if (endsec > dsp->ds_maxblocks) { errmsgno(EX_BAD, "WARNING: Data may not fit on current disk.\n"); /* XXX Check for flags & CDR_NO_LOLIMIT *//* return (FALSE);*/ } if (lverbose && dsp->ds_maxrblocks > 0) printf("RBlocks total: %ld RBlocks current: %ld RBlocks remaining: %ld\n", dsp->ds_maxrblocks, dsp->ds_maxrblocks - startsec, dsp->ds_maxrblocks - endsec); if (dsp->ds_maxrblocks > 0 && endsec > dsp->ds_maxrblocks) { errmsgno(EX_BAD, "Data does not fit on current disk.\n"); return (FALSE); } } else { if (endsec >= (405000-301)) { /*<90 min disk*/ errmsgno(EX_BAD, "Data will not fit on any disk.\n"); return (FALSE); } else if (endsec >= (333000-150)) { /* 74 min disk*/ errmsgno(EX_BAD, "WARNING: Data may not fit on standard 74min disk.\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -