25 #define FFMIN(a,b) ((a) > (b) ? (b) : (a))
26 #define FFMAX(a,b) ((a) > (b) ? (a) : (b))
27 #define FFABS(a) ((a) >= 0 ? (a) : (-(a)))
31 fseek(
f, 0, SEEK_END);
33 fseek(
f,
pos, SEEK_SET);
37 int main(
int argc,
char **argv) {
42 const double eps = 0.161;
45 int16_t *signal, *
data;
49 printf(
"audiomatch <testfile> <reffile>\n");
50 printf(
"WAV headers are skipped automatically.\n");
54 f[0] = fopen(argv[1],
"rb");
55 f[1] = fopen(argv[2],
"rb");
57 fprintf(stderr,
"Could not open input files.\n");
61 for (
i = 0;
i < 2;
i++) {
63 if (fread(
p, 1, 12,
f[
i]) != 12)
65 if (!memcmp(
p,
"RIFF", 4) &&
66 !memcmp(
p + 8,
"WAVE", 4)) {
67 if (fread(
p, 1, 8,
f[
i]) != 8)
69 while (memcmp(
p,
"data", 4)) {
70 int s =
p[4] |
p[5] << 8 |
p[6] << 16 |
p[7] << 24;
71 fseek(
f[
i],
s, SEEK_CUR);
72 if (fread(
p, 1, 8,
f[
i]) != 8)
76 fseek(
f[
i], -12, SEEK_CUR);
80 datlen =
fsize(
f[0]) - ftell(
f[0]);
81 siglen =
fsize(
f[1]) - ftell(
f[1]);
82 data = malloc(datlen *
sizeof(*
data));
83 signal = malloc(siglen *
sizeof(*signal));
85 if (fread(
data , 1, datlen,
f[0]) != datlen)
87 if (fread(signal, 1, siglen,
f[1]) != siglen)
92 for (
i = 0;
i < siglen;
i++) {
93 signal[
i] = ((uint8_t*)(signal +
i))[0] + 256*((uint8_t*)(signal +
i))[1];
94 sigamp += signal[
i] * signal[
i];
96 for (
i = 0;
i < datlen;
i++)
101 int testlen =
FFMIN(siglen, datlen-
pos);
106 if (
FFABS(
c) > sigamp * 0.94)
113 printf(
"presig: %d postsig:%d lenerr:%d\n", bestpos, datlen - siglen - bestpos, datlen - siglen);
115 sigamp = bestc / sigamp;
116 if (
fabs(1.0 - sigamp) > eps) {
117 printf(
"c: |1.0 - %.4f| > %.3f\n", sigamp, eps);