From 686ee1bf517003443bbe5197b128c92c30d1bee8 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Tue, 2 Apr 2024 20:48:34 -0400 Subject: [PATCH] keen: add sound file dumper --- games/keen/sound/Makefile | 15 +++++ games/keen/sound/dump_ck1.c | 122 ++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 games/keen/sound/Makefile create mode 100644 games/keen/sound/dump_ck1.c diff --git a/games/keen/sound/Makefile b/games/keen/sound/Makefile new file mode 100644 index 00000000..f5411a79 --- /dev/null +++ b/games/keen/sound/Makefile @@ -0,0 +1,15 @@ +CC = gcc +CFLAGS = -Wall -O2 +LFLAGS = + +all: dump_ck1 + +dump_ck1: dump_ck1.o + $(CC) -o dump_ck1 dump_ck1.o $(LFLAGS) + +dump_ck1.o: dump_ck1.c + $(CC) $(CFLAGS) -c dump_ck1.c + +clean: + rm -f *~ *.o dump_ck1 + diff --git a/games/keen/sound/dump_ck1.c b/games/keen/sound/dump_ck1.c new file mode 100644 index 00000000..42cad918 --- /dev/null +++ b/games/keen/sound/dump_ck1.c @@ -0,0 +1,122 @@ +/* Dump sounds files from commander keen 1-3 sound file */ +/* "Inverse Frequency Sound Format" */ + +/* https://moddingwiki.shikadi.net/wiki/Inverse_Frequency_Sound_format */ + +#include +#include +#include +#include +#include + +#define NUM_SOUNDS 64 + +int main(int argc, char **argv) { + + unsigned char header[16],info[16],temp_sample[2]; + int fd,result,i,j; + int file_size,num_sounds,sample,last,count; + + char *filename; + + struct sound_info_type { + int offset; + int priority; + int rate; + char name[16]; + } sound_info[NUM_SOUNDS]; + + if (argc>1) { + filename=strdup(argv[1]); + } + else { + filename=strdup("sounds.ck1"); + } + + fd=open(filename,O_RDONLY); + if (fd<0) { + fprintf(stderr,"Error: %s\n",strerror(errno)); + return -1; + } + + /* read header */ + result=read(fd,header,16); + if (result<16) { + fprintf(stderr,"Error reading: %s\n",strerror(errno)); + return -1; + } + + if ((header[0]=='S') && (header[1]=='N') && (header[2]=='D')) { + file_size=(header[4]|(header[5]<<8)); + num_sounds=(header[8]|(header[9]<<8)); + printf("Detected SND file, %d sounds, %d bytes\n", + num_sounds,file_size); + } + else { + fprintf(stderr,"Unknown file format!\n"); + return -1; + } + + if (num_sounds>=NUM_SOUNDS) { + fprintf(stderr,"Too many sounds %d\n",num_sounds); + return -1; + } + + for(i=0;i