From nobody@FreeBSD.org  Sat Jul 28 22:53:47 2001
Return-Path: <nobody@FreeBSD.org>
Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21])
	by hub.freebsd.org (Postfix) with ESMTP id 1D91637B403
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 28 Jul 2001 22:53:47 -0700 (PDT)
	(envelope-from nobody@FreeBSD.org)
Received: (from nobody@localhost)
	by freefall.freebsd.org (8.11.4/8.11.4) id f6T5rl466453;
	Sat, 28 Jul 2001 22:53:47 -0700 (PDT)
	(envelope-from nobody)
Message-Id: <200107290553.f6T5rl466453@freefall.freebsd.org>
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: The functional addtion to burncd(8)
X-Send-Pr-Version: www-1.0

>Number:         29292
>Category:       bin
>Synopsis:       [patch] addition to burncd(8) for specific handling of .wav files
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sat Jul 28 23:00:01 PDT 2001
>Closed-Date:    Thu Feb 17 13:23:58 UTC 2011
>Last-Modified:  Thu Feb 17 13:23:58 UTC 2011
>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:
Responsible-Changed-From-To: freebsd-bugs->sos 
Responsible-Changed-By: mikeh 
Responsible-Changed-When: Sat Jul 28 23:05:45 PDT 2001 
Responsible-Changed-Why:  
Soren wrote burncd 

http://www.FreeBSD.org/cgi/query-pr.cgi?pr=29292 
State-Changed-From-To: open->analyzed 
State-Changed-By: sos 
State-Changed-When: Thu Sep 6 01:57:04 PDT 2001 
State-Changed-Why:  
Hmm, I like the Unix way of things better, ie such a conversion 
tool should be a util of its own, then you just use the right 
combination of utils and you get the job done. This way we 
will have .wav reader code in lots of programs, instead of 
just in one. 


http://www.FreeBSD.org/cgi/query-pr.cgi?pr=29292 
State-Changed-From-To: analyzed->suspended 
State-Changed-By: sos 
State-Changed-When: Sun May 4 03:10:50 PDT 2003 
State-Changed-Why:  
As said this should be kept out of burncd. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=29292 
Responsible-Changed-From-To: sos->freebsd-bugs 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Mon May 11 21:43:33 UTC 2009 
Responsible-Changed-Why:  
sos@ is not actively working on ATA-related PRs. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=29292 
State-Changed-From-To: suspended->closed 
State-Changed-By: arundel 
State-Changed-When: Thu Feb 17 13:23:43 UTC 2011 
State-Changed-Why:  
Burncd(1) perfectly handles raw wave files. It is not intended to provide 
funcionality to strip away wave headers. Thus close this PR. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=29292 
>Unformatted:
