aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKacper Michajłow <kasper93@gmail.com>2014-11-01 12:20:45 +0100
committerSteve Markgraf <steve@steve-m.de>2018-02-20 22:24:40 +0100
commita03198c5b7d148ef258f8f7d5c873dd959dd2790 (patch)
tree5189eeb32708285b1324d1965e7f4be1913d5ca0
parentb04c2f9f035c5aede43d731e5d58e4725d2f8bb4 (diff)
rtl_test: Support PPM error measurement on Windows.
Signed-off-by: Steve Markgraf <steve@steve-m.de>
-rw-r--r--src/rtl_test.c58
1 files changed, 46 insertions, 12 deletions
diff --git a/src/rtl_test.c b/src/rtl_test.c
index 9a6cfda..42d2c94 100644
--- a/src/rtl_test.c
+++ b/src/rtl_test.c
@@ -53,6 +53,21 @@
#define PPM_DURATION 10
#define PPM_DUMP_TIME 5
+struct time_generic
+/* holds all the platform specific values */
+{
+#ifndef _WIN32
+ time_t tv_sec;
+ long tv_nsec;
+#else
+ long tv_sec;
+ long tv_nsec;
+ int init;
+ LARGE_INTEGER frequency;
+ LARGE_INTEGER ticks;
+#endif
+};
+
static enum {
NO_BENCHMARK,
TUNER_BENCHMARK,
@@ -134,12 +149,15 @@ static void underrun_test(unsigned char *buf, uint32_t len, int mute)
}
#ifndef _WIN32
-static int ppm_gettime(struct timespec *ts)
+static int ppm_gettime(struct time_generic *tg)
{
int rv = ENOSYS;
+ struct timespec ts;
#ifdef __unix__
- rv = clock_gettime(CLOCK_MONOTONIC, ts);
+ rv = clock_gettime(CLOCK_MONOTONIC, &ts);
+ tg->tv_sec = ts.tv_sec;
+ tg->tv_nsec = ts.tv_nsec;
#elif __APPLE__
struct timeval tv;
@@ -149,6 +167,24 @@ static int ppm_gettime(struct timespec *ts)
#endif
return rv;
}
+#endif
+
+#ifdef _WIN32
+static int ppm_gettime(struct time_generic *tg)
+{
+ int rv;
+ int64_t frac;
+ if (!tg->init) {
+ QueryPerformanceFrequency(&tg->frequency);
+ tg->init = 1;
+ }
+ rv = QueryPerformanceCounter(&tg->ticks);
+ tg->tv_sec = tg->ticks.QuadPart / tg->frequency.QuadPart;
+ frac = (int64_t)(tg->ticks.QuadPart - (tg->tv_sec * tg->frequency.QuadPart));
+ tg->tv_nsec = (long)(frac * 1000000000L / (int64_t)tg->frequency.QuadPart);
+ return !rv;
+}
+#endif
static int ppm_report(uint64_t nsamples, uint64_t interval)
{
@@ -165,8 +201,8 @@ static void ppm_test(uint32_t len)
static uint64_t interval = 0;
static uint64_t nsamples_total = 0;
static uint64_t interval_total = 0;
- struct timespec ppm_now;
- static struct timespec ppm_recent;
+ struct time_generic ppm_now;
+ static struct time_generic ppm_recent;
static enum {
PPM_INIT_NO,
PPM_INIT_DUMP,
@@ -174,6 +210,7 @@ static void ppm_test(uint32_t len)
} ppm_init = PPM_INIT_NO;
ppm_gettime(&ppm_now);
+
if (ppm_init != PPM_INIT_RUN) {
/*
* Kyle Keen wrote:
@@ -189,11 +226,11 @@ static void ppm_test(uint32_t len)
}
if (ppm_init == PPM_INIT_DUMP && ppm_recent.tv_sec < ppm_now.tv_sec)
return;
- ppm_recent.tv_sec = ppm_now.tv_sec;
- ppm_recent.tv_nsec = ppm_now.tv_nsec;
+ ppm_recent = ppm_now;
ppm_init = PPM_INIT_RUN;
return;
}
+
nsamples += (uint64_t)(len / 2UL);
interval = (uint64_t)(ppm_now.tv_sec - ppm_recent.tv_sec);
if (interval < ppm_duration)
@@ -206,19 +243,16 @@ static void ppm_test(uint32_t len)
(int)((1000000000UL * nsamples) / interval),
ppm_report(nsamples, interval),
ppm_report(nsamples_total, interval_total));
- ppm_recent.tv_sec = ppm_now.tv_sec;
- ppm_recent.tv_nsec = ppm_now.tv_nsec;
+ ppm_recent = ppm_now;
nsamples = 0;
}
-#endif
static void rtlsdr_callback(unsigned char *buf, uint32_t len, void *ctx)
{
underrun_test(buf, len, 0);
-#ifndef _WIN32
+
if (test_mode == PPM_BENCHMARK)
ppm_test(len);
-#endif
}
void e4k_benchmark(void)
@@ -375,7 +409,7 @@ int main(int argc, char **argv)
verbose_reset_buffer(dev);
if ((test_mode == PPM_BENCHMARK) && !sync_mode) {
- fprintf(stderr, "Reporting PPM error measurement every %i seconds...\n", ppm_duration);
+ fprintf(stderr, "Reporting PPM error measurement every %u seconds...\n", ppm_duration);
fprintf(stderr, "Press ^C after a few minutes.\n");
}