Generator code in its own file.
[ahxm.git] / input.c
blobe40eff9aad348101d1a6fbacf86f9fba7975ef2c
1 /*
3 PROGRAM_NAME PROGRAM_VERSION - PROGRAM_DESCRIPTION
5 Copyright (C) 2003 Angel Ortega <angel@triptico.com>
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 http://www.triptico.com
25 #include <stdio.h>
26 #include <stdlib.h>
28 #include "input.h"
30 /*******************
31 Data
32 ********************/
34 extern int _frequency;
37 /*******************
38 Code
39 ********************/
41 int fget16(FILE * f)
43 int c;
45 c=fgetc(f);
46 c+=(fgetc(f) * 256);
48 return(c);
52 int fget32(FILE * f)
54 int c;
56 c=fgetc(f);
57 c+=(fgetc(f) * 256);
58 c+=(fgetc(f) * 65536);
59 c+=(fgetc(f) * 16777216);
61 return(c);
65 int load_sample(FILE * f, int bits)
67 short int s;
69 if(bits==8)
71 s=fgetc(f)-128;
72 s<<=8;
74 else
76 /* s=fgetc(f);
77 s|=(((unsigned char)fgetc(f)) << 8);*/
78 s=fget16(f);
81 return(s);
85 void load_pcm_wave(FILE * f, int * size, int bits, int channels,
86 int frequency, int ** lwave, int ** rwave)
88 int n;
89 int * ls;
90 int * rs;
92 ls=(int *)malloc(*size * sizeof(int));
94 if(channels==2)
95 rs=(int *)malloc(*size * sizeof(int));
96 else
97 rs=ls;
99 for(n=0;n < *size;n++)
101 ls[n]=load_sample(f, bits);
103 if(channels==2)
104 rs[n]=load_sample(f, bits);
107 /* resample if needed */
108 if(frequency != _frequency)
110 ls=wave_resample(ls, frequency, size);
112 if(channels==2)
113 rs=wave_resample(rs, frequency, size);
114 else
115 rs=ls;
118 *lwave=ls;
119 *rwave=rs;
123 int * wave_resample(int * wave, int freq, int * size)
125 double ratio;
126 int new_size;
127 int * new_wave;
128 int n;
129 double i;
131 ratio=(double) freq / (double) _frequency;
132 new_size=(int)((double) (*size) / ratio);
134 new_wave=(int *)malloc(new_size * sizeof(int));
136 printf("wave_resample: ratio %f\n", (float)ratio);
138 for(n=i=0;n < new_size;n++,i+=ratio)
139 new_wave[n]=wave[(int)i];
141 *size=new_size;
143 /* free the old wave */
144 free(wave);
146 return(new_wave);
150 int load_wav_file(char * filename, int * size, int ** lwave, int ** rwave)
152 FILE * f;
153 char dummydata[256];
154 int rlen,flen;
155 short int b_per_sec,num_channels,tag;
156 char riffid[5],waveid[5],fmtid[5],dataid[5];
157 int wav_frequency, wav_bits;
158 int * ls;
159 int * rs;
161 if((f=fopen(filename,"r"))==NULL)
162 return(0);
164 fread(riffid,1,4,f);
165 riffid[4] = 0;
166 fread(&rlen,1,4,f);
167 fread(waveid,1,4,f);
168 waveid[4] = 0;
170 if(strcmp(waveid,"WAVE"))
172 fclose(f);
173 return(0);
176 fread(fmtid,1,4,f);
177 fmtid[4] = 0;
178 flen=fget32(f);
180 if(flen>240)
181 flen=240;
183 fread(&tag,1,2,f);
185 num_channels=fget16(f);
186 wav_frequency=fget32(f);
187 b_per_sec=fget32(f);
189 wav_bits=fget16(f) / num_channels;
190 wav_bits*=8;
192 fread(dummydata,1,(size_t)flen-14,f);
193 fread(dataid,1,4,f);
194 dataid[4] = 0;
196 *size=fget32(f);
197 if(wav_bits==16) (*size)/=2;
198 if(num_channels==2) (*size)/=2;
200 load_pcm_wave(f, size, wav_bits, num_channels,
201 wav_frequency, &ls, &rs);
203 fclose(f);
205 *lwave=ls;
206 *rwave=rs;
208 return(1);