97 lines
2.2 KiB
C
97 lines
2.2 KiB
C
/* SCCS Id: @(#)cvtsnd.c 3.2 95/09/10 */
|
|
/* Copyright (c) 1995, Andrew Church, Olney, Maryland */
|
|
/* NetHack may be freely redistributed. See license for details. */
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
typedef struct {
|
|
short namelen;
|
|
char name[62];
|
|
char misc[64]; /* rest of MacBinary header */
|
|
long FORM;
|
|
long flen;
|
|
long AIFF;
|
|
long SSND;
|
|
long sndlen;
|
|
} AIFF;
|
|
|
|
typedef struct {
|
|
char FORM[4];
|
|
long flen;
|
|
char _8SVX[4];
|
|
char VHDR[4];
|
|
long vhlen;
|
|
long oneshot, repeat;
|
|
long samples; /* 'samplesPerHiCycle' in the docs - usually 32, so
|
|
* we'll use that */
|
|
short freq;
|
|
char octaves, compress;
|
|
long volume;
|
|
char NAME[4];
|
|
long nlen; /* should be 64; see name[] comment */
|
|
char name[64]; /* for simplicity, i.e. just fwrite() entiree header */
|
|
char BODY[4];
|
|
long blen;
|
|
} IFF;
|
|
|
|
|
|
main(int ac, char **av)
|
|
{
|
|
FILE *in, *out;
|
|
AIFF aiff;
|
|
IFF iff;
|
|
static char buf[16384];
|
|
long n, len;
|
|
|
|
if (ac != 3) {
|
|
fprintf(stderr, "Usage: %s input-file output-file\n", av[0]);
|
|
exit(20);
|
|
}
|
|
if (!(in = fopen(av[1], "r"))) {
|
|
fprintf(stderr, "Can't open input file\n");
|
|
exit(20);
|
|
}
|
|
if (!(out = fopen(av[2], "w"))) {
|
|
fprintf(stderr, "Can't open output file\n");
|
|
exit(20);
|
|
}
|
|
|
|
fread(&aiff, sizeof(aiff), 1, in);
|
|
memcpy(iff.FORM, "FORM", 4);
|
|
iff.flen = sizeof(iff) + aiff.sndlen - 8;
|
|
memcpy(iff._8SVX, "8SVX", 4);
|
|
memcpy(iff.VHDR, "VHDR", 4);
|
|
iff.vhlen = 20;
|
|
iff.oneshot = aiff.sndlen;
|
|
iff.repeat = 0;
|
|
iff.samples = 32;
|
|
iff.freq = 22000;
|
|
iff.octaves = 1;
|
|
iff.compress= 0;
|
|
iff.volume = 0x10000;
|
|
memcpy(iff.NAME, "NAME", 4);
|
|
iff.nlen = 64;
|
|
strncpy(iff.name, aiff.name, 62); iff.name[aiff.namelen] = 0;
|
|
memcpy(iff.BODY, "BODY", 4);
|
|
iff.blen = aiff.sndlen;
|
|
fwrite(&iff, sizeof(iff), 1, out);
|
|
len = aiff.sndlen;
|
|
do {
|
|
if (len >= sizeof(buf))
|
|
n = fread(buf, 1, sizeof(buf), in);
|
|
else
|
|
n = fread(buf, 1, len, in);
|
|
if (n) {
|
|
fwrite(buf, 1, n, out);
|
|
len -= n;
|
|
}
|
|
} while (len && n);
|
|
|
|
if (len)
|
|
fprintf(stderr, "Warning: %ld bytes of sample missing\n", len);
|
|
fclose(in); fclose(out);
|
|
exit(0);
|
|
}
|