]> git.sesse.net Git - audiosync/blobdiff - estimate-skew.cpp
Add a README.
[audiosync] / estimate-skew.cpp
index 2e6aff241b53f1f41c2c2361d82721884d8f3869..04a56e785fdb0cfecda9183e0e76a44e16f589a6 100644 (file)
@@ -66,23 +66,15 @@ class InterpolatingReader
 {
 private:
        FILE *f;
-       double speed;
        double p;
        int in_pos;
-       short prev_sample;
+       short prev_sample, sample;
 
 public:
-       InterpolatingReader(FILE *f) : f(f), speed(1.0), p(0.0), in_pos(-1) {}
+       InterpolatingReader(FILE *f) : f(f), p(0.0), in_pos(-1) {}
 
-       void update_speed(double speed)
+       double read_sample(double speed)
        {
-               this->speed = speed;
-       }
-
-       double read_sample()
-       {
-               short sample;
-
                p += speed;
                while ((int)(ceil(p)) > in_pos) {
                        prev_sample = sample;
@@ -140,7 +132,7 @@ int main(int argc, char **argv)
 
        // open (estimated) skew
        if (strcmp(argv[3], "-") == 0) {
-               skew = stderr;
+               skew = stdout;
        } else {
                skew = fopen(argv[3], "wb");
                if (skew == NULL) {
@@ -150,6 +142,8 @@ int main(int argc, char **argv)
        }
 
        FlankDetector f1, f2;
+       InterpolatingReader intp(in2);
+       double speed = 1.000;
 
        // initial sync, reference
        do {
@@ -163,18 +157,11 @@ int main(int argc, char **argv)
        
        // initial sync, input
        do {
-               short s;
-               if (fread(&s, sizeof(short), 1, in2) != 1) {
-                       exit(0);
-               }
-
+               short s = (short)intp.read_sample(speed);
                f2.update(s);
-       } while (!f2.check_flag() || !f2.get_status());
 
-       double speed = 1.000;
-
-       InterpolatingReader intp(in2);
-       intp.update_speed(speed);  // test to see if we can resync OK
+               fwrite(&speed, sizeof(double), 1, skew);
+       } while (!f2.check_flag() || !f2.get_status());
 
        while (!feof(in1) && !feof(in2)) {
                short refs;
@@ -192,15 +179,16 @@ int main(int argc, char **argv)
                // same here
                unsigned num_inp = 0;
                while (!feof(in2) && !f2.check_flag()) {
-                       double s = intp.read_sample();
+                       double s = intp.read_sample(speed);
                        f2.update((short)s);
                        ++num_inp;
+               
+                       fwrite(&speed, sizeof(double), 1, skew);
                }
 
                double ns = filter(speed * double(num_inp) / double(num_ref));
-               printf("%u vs. %u -- ratio %.3f, speed %.3f, filtered speed %.3f\n", num_inp, num_ref,
+               fprintf(stderr, "%u vs. %u -- ratio %.3f, speed %.3f, filtered speed %.3f\n", num_inp, num_ref,
                        double(num_inp) / double(num_ref), speed * double(num_inp) / double(num_ref), ns);
                speed = ns;
-               intp.update_speed(ns);
        }
 }