⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdrecord.c

📁 刻录光盘的程序
💻 C
📖 第 1 页 / 共 5 页
字号:
			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 + -