Date: Sat, 28 Jul 2001 22:53:47 -0700 (PDT) From: Yoshihide SONODA <yshd@na.rim.or.jp> To: freebsd-gnats-submit@FreeBSD.org Subject: misc/29292: The functional addtion to burncd(8) Message-ID: <200107290553.f6T5rl466453@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 29292 >Category: misc >Synopsis: The functional addtion to burncd(8) >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Sat Jul 28 23:00:01 PDT 2001 >Closed-Date: >Last-Modified: >Originator: Yoshihide SONODA >Release: 4.3-STABLE >Organization: >Environment: FreeBSD raptor 4.3-STABLE FreeBSD 4.3-STABLE #33: Sat Jul 28 23:40:22 JST 2001 yoshi@raptor:/usr/src/sys/compile/raptor i386 >Description: Although burncd(8) treats all audio image files as a raw file, this change enable it to deal with wav file. >How-To-Repeat: # burncd audio file.wav fixate In the original burncd(8), since a RIFF WAV header is also written in together, it becomes a noise and will be written in a disc. >Fix: Apply this patch. This patch add -w option to burncd(8). When -w option is specified, an audio image file is dealt with as a RIFF wav file. Neither the case where this option is not specified, nor the handling of a data image changes with the former. diff -uNr /usr/src/usr.sbin/burncd/Makefile burncd/Makefile --- /usr/src/usr.sbin/burncd/Makefile Fri Apr 27 00:52:18 2001 +++ burncd/Makefile Sun Jul 29 13:38:59 2001 @@ -1,6 +1,7 @@ # $FreeBSD: src/usr.sbin/burncd/Makefile,v 1.2.2.1 2001/04/25 12:09:21 ru Exp $ PROG= burncd +SRCS= burncd.c readwav.c MAN= burncd.8 .include <bsd.prog.mk> diff -uNr /usr/src/usr.sbin/burncd/burncd.8 burncd/burncd.8 --- /usr/src/usr.sbin/burncd/burncd.8 Tue Feb 27 00:13:33 2001 +++ burncd/burncd.8 Sun Jul 29 13:13:42 2001 @@ -43,6 +43,7 @@ .Op Fl p .Op Fl q .Op Fl t +.Op Fl w .Op Ar command .Op Ar command Ar .Sh DESCRIPTION @@ -70,6 +71,8 @@ quiet, do not print progress messages. .It Fl t test write, do not actually write on the media. +.It Fl w +audio images are treated as RIFF WAV format. .El .Pp .Ar command diff -uNr /usr/src/usr.sbin/burncd/burncd.c burncd/burncd.c --- /usr/src/usr.sbin/burncd/burncd.c Tue Feb 27 00:13:33 2001 +++ burncd/burncd.c Sun Jul 29 13:12:20 2001 @@ -41,6 +41,8 @@ #include <sys/cdrio.h> #include <sys/param.h> +#include "wavefmt.h" + #define BLOCKS 16 void cleanup(int); @@ -49,6 +51,7 @@ static int fd, quiet, saved_block_size; static struct cdr_track track; +static int wav = 0; int main(int argc, char **argv) @@ -59,7 +62,7 @@ int block_size = 0; prog_name = argv[0]; - while ((ch = getopt(argc, argv, "ef:lmpqs:t")) != -1) { + while ((ch = getopt(argc, argv, "ef:lmpqs:tw")) != -1) { switch (ch) { case 'e': eject = 1; @@ -94,6 +97,10 @@ case 't': test_write = 1; break; + + case 'w': + wav = 1; + break; default: usage(prog_name); @@ -133,12 +140,12 @@ err(EX_IOERR, "ioctl(CDIOREADTOCENTRY)"); if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)"); - fprintf(stderr, "%d, %d\n", + fprintf(stderr, "%ld, %d\n", ntohl(entry.entry.addr.lba), addr); break; } if (!strcmp(argv[arg], "erase") || !strcmp(argv[arg], "blank")){ - int error, blank; + int blank; if (!quiet) fprintf(stderr, "%sing CD, please wait..\n", argv[arg]); @@ -227,7 +234,7 @@ usage(const char *prog_name) { fprintf(stderr, "Usage: %s [-f device] [-s speed] [-e] [-l] [-m] [-p]\n" - "\t[-q] [command] [command filename...]\n", prog_name); + "\t[-q] [-w] [command] [command filename...]\n", prog_name); exit(EX_USAGE); } @@ -238,6 +245,7 @@ char buf[2352*BLOCKS]; struct stat stat; static int cdopen, done_stdin, tot_size = 0; + static size_t datasize; if (!strcmp(name, "-")) { if (done_stdin) { @@ -262,9 +270,26 @@ if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)"); - if (fstat(file, &stat) < 0) - err(EX_IOERR, "fstat(%s)", name); - filesize = stat.st_size / 1024; + if (wav && track.datablock_type == CDR_DB_RAW) { + waveformat_t wf; + int ret; + + //fprintf(stderr, "checking wav header...\n"); + ret = read_wav_header(file, &wf, &datasize); + if (ret) + err(EX_IOERR, "read_wav_header(%d)", ret); + + if (wf.channels != 2 || wf.samples_per_sec != 44100 || + wf.bits_per_sample != 16) + err(EX_IOERR, "CD-DA must be 44100Hz, 16bits, stereo."); + + filesize = datasize / 1024; + } + else { + if (fstat(file, &stat) < 0) + err(EX_IOERR, "fstat(%s)", name); + filesize = stat.st_size / 1024; + } if (!quiet) { fprintf(stderr, "next writeable LBA %d\n", addr); @@ -283,6 +308,14 @@ while ((count = read(file, buf, block_size * BLOCKS)) > 0) { int res; + + if (wav && track.datablock_type == CDR_DB_RAW) { + if ((datasize - size) < (block_size * BLOCKS)) + count = datasize - size; + else if (size == datasize) + break; + } + if (count % block_size) { /* pad file to % block_size */ bzero(&buf[count], block_size * BLOCKS - count); diff -uNr /usr/src/usr.sbin/burncd/readwav.c burncd/readwav.c --- /usr/src/usr.sbin/burncd/readwav.c Thu Jan 1 09:00:00 1970 +++ burncd/readwav.c Sun Mar 4 22:46:51 2001 @@ -0,0 +1,80 @@ +/* + * Copyright (c) 1999,2000,2001 Yoshihide SONODA + * All rights reserved. + * + * Last Modified: <2001/03/04 22:46:49> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification, immediately at the beginning of the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> +#include "wavefmt.h" + +int read_wav_header(int fd, pwaveformat_t pwavefmt, size_t *datasize) +{ + int header = 0; + int size = 0; + char *buff; + + lseek(fd, 0, SEEK_SET); + *datasize = 0; + read(fd, (void *)&header, sizeof(header)); + if (header != H_RIFF) { + return ERR_NOT_RIFF; + } + + read(fd, (void *)&size, sizeof(size)); + read(fd, (void *)&header, sizeof(header)); + if (header != H_WAVE) { + return ERR_NOT_WAVE; + } + + while(read(fd, (char *)&header, sizeof(int32_t)) == sizeof(int32_t)) { + read(fd, (char *)&size, sizeof(int32_t)); + + if (header == H_FMT_) { + if ((size_t)size < sizeof(waveformat_t)) { + return ERR_ILLEGAL_HEADER; + } + buff = alloca((size_t)size); + read(fd, buff, size); + memcpy((void *)pwavefmt, (void *)buff, sizeof(waveformat_t)); + if (pwavefmt->format_tag != 1) { + return ERR_UNKNOWN_FORMAT; + } + } + else if (header == H_DATA) { + *datasize = (size_t)size; + return 0; + } + else { + lseek(fd, size, SEEK_CUR); + } + } + + return ERR_DATA_NOT_FOUND; +} diff -uNr /usr/src/usr.sbin/burncd/wavefmt.h burncd/wavefmt.h --- /usr/src/usr.sbin/burncd/wavefmt.h Thu Jan 1 09:00:00 1970 +++ burncd/wavefmt.h Sun Mar 4 22:47:04 2001 @@ -0,0 +1,61 @@ +/* + * Copyright (c) 1999,2000,2001 Yoshihide SONODA + * All rights reserved. + * + * Last Modified: <2001/03/04 22:47:02> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification, immediately at the beginning of the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _WAVE_FMT_H_ +#define _WAVE_FMT_H_ + +#include <sys/types.h> + +#define H_RIFF (*(int32_t *)"RIFF") +#define H_WAVE (*(int32_t *)"WAVE") +#define H_DATA (*(int32_t *)"data") +#define H_FMT_ (*(int32_t *)"fmt ") + +#define ERR_NONE 0 +#define ERR_NOT_RIFF 1 +#define ERR_NOT_WAVE 2 +#define ERR_ILLEGAL_HEADER 3 +#define ERR_UNKNOWN_FORMAT 4 +#define ERR_DATA_NOT_FOUND 5 + +typedef struct waveformat +{ + u_int16_t format_tag; + u_int16_t channels; + u_int32_t samples_per_sec; + u_int32_t bytes_per_sec; + u_int16_t block_align; + u_int16_t bits_per_sample; +} waveformat_t, *pwaveformat_t; + +int read_wav_header(int fd, pwaveformat_t pwavefmt, size_t *datasize); + +#endif /* _WAVE_FMT_H_ */ >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200107290553.f6T5rl466453>