#include #include #include void main(int argc, char *argv[]) { Biobuf in; Biobuf out; uchar b[2]; int x[4], y; int t; if(argc != 2) exits("usage"); Binit(&in, 0, OREAD); Binit(&out, 1, OWRITE); if(strcmp(argv[1], "nearest") == 0){ t = 0; for(;;){ if(Bread(&in, b, 2) < 2) break; t -= 1<<16; do{ Bwrite(&out, b, 2); t += (32000<<16)/44100; }while(t < 0); } }else if(strcmp(argv[1], "linear") == 0){ t = 1<<16; for(;;){ if(Bread(&in, b, 2) < 2) break; x[0] = (s16int)(b[1] << 8 | b[0]); do{ y = x[1] + ((x[0] - x[1]) * t >> 16); b[0] = y & 0xff; b[1] = y >> 8; Bwrite(&out, b, 2); t += (32000<<16)/44100; }while(t < 1<<16); t -= 1<<16; x[1] = x[0]; } }else if(strcmp(argv[1], "hermite") == 0){ t = 1<<15; for(;;){ if(Bread(&in, b, 2) < 2) break; x[0] = (s16int)(b[1] << 8 | b[0]); do{ y = (x[0] - x[3]) / 2 + (x[2] - x[1]) * 3 / 2; y = y * t >> 15; y += x[3] - x[2] * 5 / 2 + x[1] * 2 - x[0] / 2; y = y * t >> 15; y += (x[1] - x[3]) / 2; y = y * t >> 15; y += x[2]; b[0] = y & 0xff; b[1] = y >> 8; Bwrite(&out, b, 2); t += (32000<<15)/44100; }while(t < 1<<15); t -= 1<<15; memmove(x + 1, x, sizeof(x) - sizeof(x[0])); } } exits(nil); }