Skip site navigation (1)Skip section navigation (2)
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>