/* This module extracts raw sound information from a wadfile */ #include #include "doomdefs.h" #include "directory.h" #define ULAW_CONVERT /* Convert the sound into sun .au format */ #define SND_MAGIC 3 struct snd_header { two_byte magic; /* The magic number 3 */ two_byte sample_rate; /* The sample rate (11025) */ two_byte num_samples; /* The number of samples */ two_byte zero; /* Null integer */ }; int convert_rawsnd(int fd, char *name) { struct dir_entry entry; struct snd_header header; char outfile[BUFSIZ]; FILE *output; int i, samplei; unsigned char sample, ulaw; float sum = 0, increment; /* Set the fd to the start of the directory entries */ if ( set_directory(fd) < 0 ) { fprintf(stderr, "Can't find start of directories.\n"); return(-1); } /* Now cycle through the entries, looking for the sound */ if ( get_entry(fd, name, &entry) < 0 ) { fprintf(stderr, "Couldn't find directory entry for %s\n", name); return(-1); } /* Go to the entry and retrieve the sound */ if ( lseek(fd, entry.res_start, SEEK_SET) < 0 ) { perror("lseek()"); return(-1); } if (read(fd, (char *)&header, sizeof(header)) != sizeof(header)) { perror("header read error"); return(-1); } if ( header.magic != SND_MAGIC ) { fprintf(stderr, "%s is not a sound resource (%d).\n",name,header.magic); return(-1); } /* Print out the header for now */ printf("Sound: sample rate = %d, holds %d samples.\n", header.sample_rate, header.num_samples); /* increment is the number of bytes to read each time */ increment = ((float)header.sample_rate)/8000; /* Make sure we can write the output file */ #ifdef ULAW_CONVERT sprintf(outfile, "%s.au", name); #else sprintf(outfile, "%s.snd", name); #endif if ( (output=fopen(outfile, "w")) == NULL ) { fprintf(stderr, "Can't open %s for writing.\n", outfile); return(-1); } /* Write the output file */ for ( i=1, read(fd, &sample, 1); i 0) { if ( read(fd, &sample, 1) != 1 ) { perror("read()"); return(-1); } ++i; --sum; } #else /* Raw snd format */ fputc(sample, output); if ( read(fd, &sample, 1) != 1 ) { perror("read()"); return(-1); } #endif } fclose(output); /* Done! */ return(0); }