#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

#define irnd(v) ((int64_t)((v) + 0.5) > (int64_t)(v) ? \
                 (int64_t)((v) + 0.5) : (int64_t)(v))

int
main(int argc, char *argv[]) {
  int64_t minutes;
  int64_t sample_rate;
  int64_t tc_scale;
  int64_t sample, unscaled_timecode, scaled_timecode;
  int64_t rescaled_timecode, recalculated_sample;

  if (argc != 3) {
    printf("tcscale-working sample_rate num_minutes\n");
    return 1;
  }

  sample_rate = atoi(argv[1]);
  minutes = atoi(argv[2]);
  tc_scale = 1000000000ll / sample_rate;

  printf("sample_rate: %lld\t1000000000/sample_rate: %f\ttc_scale: %lld\n",
         sample_rate, 1000000000.0 / sample_rate, tc_scale);

  for (sample = 0; sample < minutes * 60 * sample_rate; sample++) {
    unscaled_timecode = irnd((double)1000000000.0l * sample / sample_rate);
    scaled_timecode = irnd((double)unscaled_timecode / (double)tc_scale);
    rescaled_timecode = scaled_timecode * tc_scale;
    recalculated_sample = irnd((double)rescaled_timecode * sample_rate /
                               1000000000.0l);
    if (sample != recalculated_sample) {
      printf("s: %5lld un-t: %10lld sc-t: %5lld resc-t: %10lld "
             "rec-s: %5lld %s\n",
             sample, unscaled_timecode, scaled_timecode,
             rescaled_timecode, recalculated_sample,
             sample == recalculated_sample ? "ok" : "NOT OK!");
    }
  }

  return 0;
}
