|
Lines 41-46
Link Here
|
| 41 |
#include <sys/cdrio.h> |
41 |
#include <sys/cdrio.h> |
| 42 |
#include <sys/param.h> |
42 |
#include <sys/param.h> |
| 43 |
|
43 |
|
|
|
44 |
#include "wavefmt.h" |
| 45 |
|
| 44 |
#define BLOCKS 16 |
46 |
#define BLOCKS 16 |
| 45 |
|
47 |
|
| 46 |
void cleanup(int); |
48 |
void cleanup(int); |
|
Lines 49-54
Link Here
|
| 49 |
|
51 |
|
| 50 |
static int fd, quiet, saved_block_size; |
52 |
static int fd, quiet, saved_block_size; |
| 51 |
static struct cdr_track track; |
53 |
static struct cdr_track track; |
|
|
54 |
static int wav = 0; |
| 52 |
|
55 |
|
| 53 |
int |
56 |
int |
| 54 |
main(int argc, char **argv) |
57 |
main(int argc, char **argv) |
|
Lines 59-65
Link Here
|
| 59 |
int block_size = 0; |
62 |
int block_size = 0; |
| 60 |
|
63 |
|
| 61 |
prog_name = argv[0]; |
64 |
prog_name = argv[0]; |
| 62 |
while ((ch = getopt(argc, argv, "ef:lmpqs:t")) != -1) { |
65 |
while ((ch = getopt(argc, argv, "ef:lmpqs:tw")) != -1) { |
| 63 |
switch (ch) { |
66 |
switch (ch) { |
| 64 |
case 'e': |
67 |
case 'e': |
| 65 |
eject = 1; |
68 |
eject = 1; |
|
Lines 94-99
Link Here
|
| 94 |
case 't': |
97 |
case 't': |
| 95 |
test_write = 1; |
98 |
test_write = 1; |
| 96 |
break; |
99 |
break; |
|
|
100 |
|
| 101 |
case 'w': |
| 102 |
wav = 1; |
| 103 |
break; |
| 97 |
|
104 |
|
| 98 |
default: |
105 |
default: |
| 99 |
usage(prog_name); |
106 |
usage(prog_name); |
|
Lines 133-144
Link Here
|
| 133 |
err(EX_IOERR, "ioctl(CDIOREADTOCENTRY)"); |
140 |
err(EX_IOERR, "ioctl(CDIOREADTOCENTRY)"); |
| 134 |
if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) |
141 |
if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) |
| 135 |
err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)"); |
142 |
err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)"); |
| 136 |
fprintf(stderr, "%d, %d\n", |
143 |
fprintf(stderr, "%ld, %d\n", |
| 137 |
ntohl(entry.entry.addr.lba), addr); |
144 |
ntohl(entry.entry.addr.lba), addr); |
| 138 |
break; |
145 |
break; |
| 139 |
} |
146 |
} |
| 140 |
if (!strcmp(argv[arg], "erase") || !strcmp(argv[arg], "blank")){ |
147 |
if (!strcmp(argv[arg], "erase") || !strcmp(argv[arg], "blank")){ |
| 141 |
int error, blank; |
148 |
int blank; |
| 142 |
if (!quiet) |
149 |
if (!quiet) |
| 143 |
fprintf(stderr, "%sing CD, please wait..\n", |
150 |
fprintf(stderr, "%sing CD, please wait..\n", |
| 144 |
argv[arg]); |
151 |
argv[arg]); |
|
Lines 227-233
Link Here
|
| 227 |
usage(const char *prog_name) |
234 |
usage(const char *prog_name) |
| 228 |
{ |
235 |
{ |
| 229 |
fprintf(stderr, "Usage: %s [-f device] [-s speed] [-e] [-l] [-m] [-p]\n" |
236 |
fprintf(stderr, "Usage: %s [-f device] [-s speed] [-e] [-l] [-m] [-p]\n" |
| 230 |
"\t[-q] [command] [command filename...]\n", prog_name); |
237 |
"\t[-q] [-w] [command] [command filename...]\n", prog_name); |
| 231 |
exit(EX_USAGE); |
238 |
exit(EX_USAGE); |
| 232 |
} |
239 |
} |
| 233 |
|
240 |
|
|
Lines 238-243
Link Here
|
| 238 |
char buf[2352*BLOCKS]; |
245 |
char buf[2352*BLOCKS]; |
| 239 |
struct stat stat; |
246 |
struct stat stat; |
| 240 |
static int cdopen, done_stdin, tot_size = 0; |
247 |
static int cdopen, done_stdin, tot_size = 0; |
|
|
248 |
static size_t datasize; |
| 241 |
|
249 |
|
| 242 |
if (!strcmp(name, "-")) { |
250 |
if (!strcmp(name, "-")) { |
| 243 |
if (done_stdin) { |
251 |
if (done_stdin) { |
|
Lines 262-270
Link Here
|
| 262 |
if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) |
270 |
if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) |
| 263 |
err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)"); |
271 |
err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)"); |
| 264 |
|
272 |
|
| 265 |
if (fstat(file, &stat) < 0) |
273 |
if (wav && track.datablock_type == CDR_DB_RAW) { |
| 266 |
err(EX_IOERR, "fstat(%s)", name); |
274 |
waveformat_t wf; |
| 267 |
filesize = stat.st_size / 1024; |
275 |
int ret; |
|
|
276 |
|
| 277 |
//fprintf(stderr, "checking wav header...\n"); |
| 278 |
ret = read_wav_header(file, &wf, &datasize); |
| 279 |
if (ret) |
| 280 |
err(EX_IOERR, "read_wav_header(%d)", ret); |
| 281 |
|
| 282 |
if (wf.channels != 2 || wf.samples_per_sec != 44100 || |
| 283 |
wf.bits_per_sample != 16) |
| 284 |
err(EX_IOERR, "CD-DA must be 44100Hz, 16bits, stereo."); |
| 285 |
|
| 286 |
filesize = datasize / 1024; |
| 287 |
} |
| 288 |
else { |
| 289 |
if (fstat(file, &stat) < 0) |
| 290 |
err(EX_IOERR, "fstat(%s)", name); |
| 291 |
filesize = stat.st_size / 1024; |
| 292 |
} |
| 268 |
|
293 |
|
| 269 |
if (!quiet) { |
294 |
if (!quiet) { |
| 270 |
fprintf(stderr, "next writeable LBA %d\n", addr); |
295 |
fprintf(stderr, "next writeable LBA %d\n", addr); |
|
Lines 283-288
Link Here
|
| 283 |
|
308 |
|
| 284 |
while ((count = read(file, buf, block_size * BLOCKS)) > 0) { |
309 |
while ((count = read(file, buf, block_size * BLOCKS)) > 0) { |
| 285 |
int res; |
310 |
int res; |
|
|
311 |
|
| 312 |
if (wav && track.datablock_type == CDR_DB_RAW) { |
| 313 |
if ((datasize - size) < (block_size * BLOCKS)) |
| 314 |
count = datasize - size; |
| 315 |
else if (size == datasize) |
| 316 |
break; |
| 317 |
} |
| 318 |
|
| 286 |
if (count % block_size) { |
319 |
if (count % block_size) { |
| 287 |
/* pad file to % block_size */ |
320 |
/* pad file to % block_size */ |
| 288 |
bzero(&buf[count], block_size * BLOCKS - count); |
321 |
bzero(&buf[count], block_size * BLOCKS - count); |