From d9d7584d28210e3170a47a0a5ba54dd84684cbd3 Mon Sep 17 00:00:00 2001 From: Vlad P Date: Sun, 31 Jul 2022 21:15:47 +0300 Subject: [PATCH] Try to resync on sync loss --- src/async.c | 11 +++++++++++ src/convert/252_s16.c | 1 + src/convert/336_s16.c | 1 + src/convert/384_s16.c | 1 + src/convert/504_s16.c | 1 + src/convert/504_s8.c | 1 + src/structs.h | 1 + 7 files changed, 17 insertions(+) diff --git a/src/async.c b/src/async.c index fbf647c..280768c 100644 --- a/src/async.c +++ b/src/async.c @@ -206,6 +206,16 @@ static void LIBUSB_CALL _libusb_callback (struct libusb_transfer *xfer) { if (bytes > 0) mirisdr_feed_async(p, samples, bytes); + if (xfer->type == LIBUSB_TRANSFER_TYPE_BULK) + { + if(p->sync_loss_cnt > (int)p->xfer_buf_num) + { + p->sync_loss_cnt = -p->xfer_buf_num +1; + xfer->length = DEFAULT_BULK_BUFFER - 512; + fprintf(stderr,"libmirisdr: Sync lost. Trying to synchronize.\n"); + }else + xfer->length = DEFAULT_BULK_BUFFER; + } /* pokračujeme dalším přenosem */ if (libusb_submit_transfer(xfer) < 0) { fprintf( stderr, "error re-submitting URB on device %u\n", p->index); @@ -382,6 +392,7 @@ int mirisdr_read_async (mirisdr_dev_t *p, mirisdr_read_async_cb_t cb, void *ctx, fprintf( stderr, "auto"); } #endif + p->sync_loss_cnt = 0; /* použití správného rozhraní které zasílá data - není kritické */ switch (p->transfer) { case MIRISDR_TRANSFER_BULK: diff --git a/src/convert/252_s16.c b/src/convert/252_s16.c index 9184a37..bf3e393 100644 --- a/src/convert/252_s16.c +++ b/src/convert/252_s16.c @@ -20,6 +20,7 @@ static int mirisdr_samples_convert_252_s16 (mirisdr_dev_t *p, unsigned char* buf /* potenciálně ztracená data */ if ((i == 0) && (addr != p->addr)) { fprintf(stderr, "%u samples lost, %d, %08x:%08x\n", addr - p->addr, cnt, p->addr, addr); + p->sync_loss_cnt++; } /* přeskočíme hlavičku 16 bitů, 252 I+Q párů */ diff --git a/src/convert/336_s16.c b/src/convert/336_s16.c index 565844d..0c62018 100644 --- a/src/convert/336_s16.c +++ b/src/convert/336_s16.c @@ -20,6 +20,7 @@ static int mirisdr_samples_convert_336_s16 (mirisdr_dev_t *p, unsigned char* buf /* potenciálně ztracená data */ if ((i == 0) && (addr != p->addr)) { fprintf(stderr, "%u samples lost, %d, %08x:%08x\n", addr - p->addr, cnt, p->addr, addr); + p->sync_loss_cnt++; } /* přeskočíme hlavičku 16 bitů, 336 I+Q párů */ diff --git a/src/convert/384_s16.c b/src/convert/384_s16.c index 435f2dd..a14095e 100644 --- a/src/convert/384_s16.c +++ b/src/convert/384_s16.c @@ -23,6 +23,7 @@ static int mirisdr_samples_convert_384_s16 (mirisdr_dev_t *p, unsigned char* buf /* potenciálně ztracená data */ if ((i == 0) && (addr != p->addr)) { fprintf(stderr, "%u samples lost, %d, %08x:%08x\n", addr - p->addr, cnt, p->addr, addr); + p->sync_loss_cnt++; } /* přeskočíme hlavičku 16 bitů, 6 bloků, poslední 4 bajtový posuvný blok zpracujeme */ diff --git a/src/convert/504_s16.c b/src/convert/504_s16.c index 7e5a350..46ae2a2 100644 --- a/src/convert/504_s16.c +++ b/src/convert/504_s16.c @@ -20,6 +20,7 @@ static int mirisdr_samples_convert_504_s16 (mirisdr_dev_t *p, unsigned char* buf /* potenciálně ztracená data */ if ((i == 0) && (addr != p->addr)) { fprintf(stderr, "%u samples lost, %d, %08x:%08x\n", addr - p->addr, cnt, p->addr, addr); + p->sync_loss_cnt++; } /* přeskočíme hlavičku 16 bitů, 504 I+Q párů */ diff --git a/src/convert/504_s8.c b/src/convert/504_s8.c index fd25402..1a099ce 100644 --- a/src/convert/504_s8.c +++ b/src/convert/504_s8.c @@ -14,6 +14,7 @@ static int mirisdr_samples_convert_504_s8 (mirisdr_dev_t *p, unsigned char* src, if (p->addr != addr) { fprintf(stderr, "%u samples lost, %d, %08x:%08x\n", addr - p->addr, cnt, p->addr, addr); p->addr = addr; + p->sync_loss_cnt++; } for (i = 16; i < cnt; i+= 1024, ret+= 1008) { diff --git a/src/structs.h b/src/structs.h index 0d73709..1c2b58d 100644 --- a/src/structs.h +++ b/src/structs.h @@ -100,5 +100,6 @@ struct mirisdr_dev { int reg8; uint8_t *samples; int samples_size; + int sync_loss_cnt; };