| version 1.4 | | version 1.5 |
|---|
| | |
| #include <stdio.h> | | #include <stdio.h> |
| #include <string.h> | | #include <string.h> |
| #include "strio.h" | | #include "strio.h" |
| #include "sounds.h" | | |
| #include "digi.h" | | |
| #include "altsound.h" | | |
| #include "types.h" | | #include "types.h" |
| #include "d_io.h" | | #include "d_io.h" |
| #include "u_mem.h" | | #include "u_mem.h" |
| | | #include "error.h" |
| | | #include "sounds.h" |
| | | #include "digi.h" |
| | | #include "altsound.h" |
| | | |
| | | |
| int use_alt_sounds=0; | | int use_alt_sounds=0; |
| altsound_data altsound_list[MAX_SOUNDS]; | | digi_sound altsound_list[MAX_SOUNDS]; |
| | | int use_altsound[MAX_SOUNDS]; |
| | | |
| void read_alt_soundlist(char *soundfile_list) | | int digi_xlat_sound(int soundnum) |
| { | | { |
| FILE *f; | | if ( soundnum < 0 ) |
| char *line,word[64]; | | return -1; |
| int i; | | |
| | | |
| #ifdef SHAREWARE | | if ( digi_lomem ) |
| return; | | |
| #endif | | |
| | | |
| for(i=0;i<MAX_SOUNDS;i++) | | |
| { | | { |
| altsound_list[i].soundnum=-1; | | int i; |
| memset(altsound_list[i].file,0,64*sizeof(char)); | | i = AltSounds[soundnum]; |
| | | if ( i == 255 ) |
| | | return -1; |
| | | else |
| | | return i; |
| | | } |
| | | else |
| | | return Sounds[soundnum]; |
| } | | } |
| | | |
| f=fopen(soundfile_list,"rt"); | | digi_sound *Sounddat(int soundnum) |
| | | |
| if(!f) return; | | |
| | | |
| while(!feof(f)) | | |
| { | | |
| line=fsplitword(f,'\n'); | | |
| if(line) | | |
| { | | { |
| if((line[0]!='#') && sscanf(line,"%i=%s\n",&i,word)==2) | | if(use_altsound[soundnum]) |
| | | return &altsound_list[soundnum]; |
| | | else |
| { | | { |
| if(strlen(word) <= 13) | | int i; |
| { | | i = digi_xlat_sound(soundnum); |
| sprintf(altsound_list[i].file,"%s",word); | | if (i < 0) |
| altsound_list[i].soundnum = i; | | return NULL; |
| use_alt_sounds++; | | else |
| } | | return &(GameSounds[i]); |
| } | | |
| free(line); | | |
| } | | |
| } | | |
| | | |
| fclose(f); | | |
| } | | } |
| | | |
| int use_alt_sound(int soundnum) | | |
| { | | |
| return (altsound_list[soundnum].soundnum != -1); | | |
| } | | } |
| | | |
| int get_alt_sound_size(int soundnum) | | void load_alt_sounds(char *soundfile_list) |
| { | | { |
| return altsound_list[soundnum].datsize; | | FILE *list,*sound; |
| } | | char *line,word[256]; |
| | | int i,channels=0,datsize=0,bits=0,freq=0; |
| | | |
| char * load_alt_sound_info(int soundnum, digi_sound *snd) | | memset(&use_altsound,0,sizeof(int) * MAX_SOUNDS); |
| { | | memset(&altsound_list,0,sizeof(digi_sound) * MAX_SOUNDS); |
| FILE *snd_file; | | |
| int smplsize; | | |
| | | |
| if(!use_alt_sound(soundnum)) | | list=fopen(soundfile_list,"rt"); |
| return NULL; | | |
| | | |
| snd_file=fopen(altsound_list[soundnum].file,"rb"); | | if(!list) return; |
| | | |
| if(!snd_file) | | while(!feof(list)) |
| { | | { |
| altsound_list[soundnum].soundnum = -1; | | line=fsplitword(list,'\n'); |
| return NULL; | | if((line) && |
| } | | (line[0]!='#') && |
| | | (sscanf(line,"%i=%s\n",&i,word)==2) && |
| // read info from wav file; if error, return 0 | | (i >= 0) && |
| fseek(snd_file,34,SEEK_SET); | | (i <= MAX_SOUNDS) ) |
| fread(&(snd->bits),sizeof(u_int16_t),1,snd_file); | | |
| fseek(snd_file,24,SEEK_SET); | | |
| fread(&(snd->freq),sizeof(u_int32_t),1,snd_file); | | |
| // fseek(snd_file,22,SEEK_SET); // # channels | | |
| // fread(&(),sizeof(u_int16_t),1,snd_file); | | |
| | | |
| fseek(snd_file,34,SEEK_SET); | | |
| fread(&smplsize,sizeof(u_int16_t),1,snd_file); | | |
| fseek(snd_file,40,SEEK_SET); | | |
| fread(&(altsound_list[soundnum].datsize),sizeof(u_int32_t),1,snd_file); | | |
| | | |
| #ifdef ALLEGRO | | |
| snd->len=(altsound_list[soundnum].datsize*8)/smplsize; | | |
| #else | | |
| snd->length=(altsound_list[soundnum].datsize*8)/smplsize; | | |
| #endif | | |
| | | |
| fclose(snd_file); | | |
| | | |
| if(ferror(snd_file)) | | |
| { | | { |
| altsound_list[soundnum].soundnum = -1; | | sound=fopen(word,"rb"); |
| return NULL; | | if(sound) |
| } | | |
| | | |
| return altsound_list[soundnum].file; | | |
| } | | |
| | | |
| int load_alt_sound(int soundnum, digi_sound *snd) | | |
| { | | { |
| FILE *snd_file; | | fseek(sound,40,SEEK_SET); |
| | | fread(&(datsize),sizeof(u_int32_t),1,sound); |
| if(!use_alt_sound(soundnum)) | | |
| return 0; | | |
| | | |
| snd_file=fopen(altsound_list[soundnum].file,"rb"); | | altsound_list[i].data = (void *)malloc(datsize); |
| | | |
| if(!snd_file) | | if(altsound_list[i].data) |
| { | | { |
| altsound_list[soundnum].soundnum = -1; | | fseek(sound,34,SEEK_SET); |
| return 0; | | fread(&(bits),sizeof(u_int16_t),1,sound); |
| } | | |
| | | |
| | | fseek(sound,24,SEEK_SET); |
| | | fread(&(freq),sizeof(u_int32_t),1,sound); |
| | | |
| // read data from file and store in *data; if error, return 0 | | fseek(sound,22,SEEK_SET); |
| fseek(snd_file,44,SEEK_SET); | | fread(&(channels),sizeof(u_int16_t),1,sound); |
| fread(snd->data,altsound_list[soundnum].datsize,1,snd_file); | | |
| | | |
| fclose(snd_file); | | fseek(sound,44,SEEK_SET); |
| | | fread(altsound_list[i].data,datsize,1,sound); |
| | | |
| if(ferror(snd_file)) | | if(!ferror(sound)) |
| { | | { |
| altsound_list[soundnum].soundnum = -1; | | altsound_list[i].bits=bits; |
| return 0; | | altsound_list[i].freq=freq; |
| | | #ifdef ALLEGRO |
| | | altsound_list[i].len=datsize; |
| | | altsound_list[i].loop_start=0; |
| | | altsound_list[i].loop_end = altsound_list[i].len; |
| | | altsound_list[i].priority=128; |
| | | altsound_list[i].param=-1; |
| | | #else |
| | | altsound_list[i].length=datsize; |
| | | #endif |
| | | use_alt_sounds++; |
| | | use_altsound[i]=1; |
| | | } |
| | | } |
| | | fclose(sound); |
| | | } |
| | | free(line); |
| | | } |
| | | } |
| | | fclose(list); |
| } | | } |
| | | |
| return 0; | | void free_alt_sounds() |
| | | { |
| | | int i; |
| | | for(i=0;i<MAX_SOUNDS;i++) |
| | | if(use_altsound[i] && altsound_list[i].data) |
| | | { |
| | | free(altsound_list[i].data); |
| | | use_altsound[i]=0; |
| | | use_alt_sounds--; |
| } | | } |
| | | |
| | | for(i=0;i<MAX_SOUNDS;i++) |
| | | if(use_altsound[i] || altsound_list[i].data || use_alt_sounds) |
| | | Error("Something screwed in freeing altsounds (num:%i)\n",i); |
| | | } |