44#define BUFFER_SIZE 128*28
46static short samples[BUFFER_SIZE];
47static char wave[BUFFER_SIZE * 2];
49static void find_predict(
short *samples,
double *d_samples,
int *predict_nr,
int *shift_factor );
50static void pack(
const double *d_samples,
short *four_bit,
int predict_nr,
int shift_factor );
52int adpcm_encode(FILE* fp, FILE* sad,
int offset,
int sample_len,
int flag_loop,
int bytes_per_sample)
68 while( sample_len > 0 )
73 size = ( sample_len >= BUFFER_SIZE ) ? BUFFER_SIZE : sample_len;
77 for(i = 0; i < size; i++)
79 if(fread( wave+i, bytes_per_sample, 1, fp )==1){
80 fseek(fp, offset, SEEK_CUR);
83 printf(
"Error: Can't read SAMPLE DATA in WAVE-file.\n");
90 if(fread(wave, bytes_per_sample, size, fp)!=size){
91 printf(
"Error: Can't read SAMPLE DATA in WAVE-file.\n");
96 if (bytes_per_sample == 1) {
97 for(i = 0; i < size; i++)
104 memcpy(samples, wave, BUFFER_SIZE*2);
113 for ( j = size % 28; j < 28; j++ ) samples[28*i+j] = 0;
118 for ( j = 0; j < i; j++ )
120 ptr = samples + j * 28;
122 find_predict( ptr, d_samples, &predict_nr, &shift_factor );
125 pack( d_samples, four_bit, predict_nr, shift_factor );
128 d = ( predict_nr << 4 ) | shift_factor;
142 for ( k = 0; k < 28; k += 2 )
144 d = ( ( four_bit[k+1] >> 8 ) & 0xf0 ) | ( ( four_bit[k] >> 12 ) & 0xf );
151 if ( sample_len < 28 )
161 fputc( ( predict_nr << 4 ) | shift_factor, sad );
164 for ( i = 0; i < 14; i++ )
171static double f[5][2] = { { 0.0, 0.0 },
172 { -60.0 / 64.0, 0.0 },
173 { -115.0 / 64.0, 52.0 / 64.0 },
174 { -98.0 / 64.0, 55.0 / 64.0 },
175 { -122.0 / 64.0, 60.0 / 64.0 } };
179static void find_predict(
short *samples,
double *d_samples,
int *predict_nr,
int *shift_factor )
182 double buffer[28][5];
188 static double _s_1 = 0.0;
189 static double _s_2 = 0.0;
190 double s_0, s_1, s_2;
192 for ( i = 0; i < 5; i++ ) {
196 for ( j = 0; j < 28; j ++ ) {
197 s_0 = (double) samples[j];
200 if ( s_0 < - 30720.0 )
202 ds = s_0 + s_1 * f[i][0] + s_2 * f[i][1];
204 if ( fabs( ds ) > max[i] )
211 if ( max[i] < min ) {
228 for ( i = 0; i < 28; i++ )
229 d_samples[i] = buffer[i][*predict_nr];
238 while( *shift_factor < 12 ) {
239 if ( shift_mask & ( min2 + ( shift_mask >> 3 ) ) )
242 shift_mask = shift_mask >> 1;
247static void pack(
const double *d_samples,
short *four_bit,
int predict_nr,
int shift_factor )
249 static double s_1 = 0.0;
250 static double s_2 = 0.0;
253 for ( i = 0; i < 28; i++ ) {
255 int di, di_shift_tmp;
258 s_0 = d_samples[i] + s_1 * f[predict_nr][0] + s_2 * f[predict_nr][1];
259 ds = s_0 * (double) ( 1 << shift_factor );
261 di = ( (int) ds + 0x800 ) & 0xfffff000;
268 four_bit[i] = (short) di;
271 di_shift_tmp = -((
unsigned int) di >> 31);
272 di = (di_shift_tmp ^ di) >> shift_factor ^ di_shift_tmp;
274 s_1 = (double) di - s_0;