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); |
| | } |