diff options
Diffstat (limited to 'src/rtl-sdr.c')
| -rw-r--r-- | src/rtl-sdr.c | 66 |
1 files changed, 31 insertions, 35 deletions
diff --git a/src/rtl-sdr.c b/src/rtl-sdr.c index bf01bb3..ad01c70 100644 --- a/src/rtl-sdr.c +++ b/src/rtl-sdr.c @@ -122,19 +122,17 @@ static rtlsdr_device_t devices[] = { #define BUF_LENGTH (16 * 16384) typedef struct rtlsdr_dev { + libusb_context *ctx; struct libusb_device_handle *devh; struct libusb_transfer *xfer[BUF_COUNT]; unsigned char *xfer_buf[BUF_COUNT]; rtlsdr_async_read_cb_t cb; - void *context; + void *cb_ctx; int run_async; rtlsdr_tuner_t *tuner; int rate; /* Hz */ } rtlsdr_dev_t; -static int opened_devices = 0; -static int libusb_inited = 0; - #define CRYSTAL_FREQ 28800000 #define MAX_SAMP_RATE 3200000 @@ -538,8 +536,7 @@ uint32_t rtlsdr_get_device_count(void) struct libusb_device_descriptor dd; ssize_t cnt; - if (!libusb_inited) - libusb_init(NULL); + libusb_init(NULL); cnt = libusb_get_device_list(NULL, &list); @@ -552,8 +549,7 @@ uint32_t rtlsdr_get_device_count(void) libusb_free_device_list(list, 0); - if (!libusb_inited) - libusb_exit(NULL); + libusb_exit(NULL); return device_count; } @@ -567,8 +563,7 @@ const char *rtlsdr_get_device_name(uint32_t index) uint32_t device_count = 0; ssize_t cnt; - if (!libusb_inited) - libusb_init(NULL); + libusb_init(NULL); cnt = libusb_get_device_list(NULL, &list); @@ -587,8 +582,7 @@ const char *rtlsdr_get_device_name(uint32_t index) libusb_free_device_list(list, 0); - if (!libusb_inited) - libusb_exit(NULL); + libusb_exit(NULL); if (device) return device->name; @@ -596,12 +590,12 @@ const char *rtlsdr_get_device_name(uint32_t index) return ""; } -rtlsdr_dev_t *rtlsdr_open(uint32_t index) +int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index) { int r; int i; libusb_device **list; - rtlsdr_dev_t * dev = NULL; + rtlsdr_dev_t *dev = NULL; libusb_device *device = NULL; uint32_t device_count = 0; struct libusb_device_descriptor dd; @@ -611,14 +605,9 @@ rtlsdr_dev_t *rtlsdr_open(uint32_t index) dev = malloc(sizeof(rtlsdr_dev_t)); memset(dev, 0, sizeof(rtlsdr_dev_t)); - if (1 == ++opened_devices) { - if (!libusb_inited) { - libusb_init(NULL); - libusb_inited = 1; - } - } + libusb_init(&dev->ctx); - cnt = libusb_get_device_list(NULL, &list); + cnt = libusb_get_device_list(dev->ctx, &list); for (i = 0; i < cnt; i++) { device = list[i]; @@ -635,8 +624,10 @@ rtlsdr_dev_t *rtlsdr_open(uint32_t index) device = NULL; } - if (!device) + if (!device) { + r = -1; goto err; + } r = libusb_open(device, &dev->devh); if (r < 0) { @@ -699,9 +690,19 @@ found: r =dev->tuner->init(dev); rtlsdr_set_i2c_repeater(dev, 0); - return dev; + + *out_dev = dev; + + return 0; err: - return NULL; + if (dev) { + if (dev->ctx) + libusb_exit(dev->ctx); + + free(dev); + } + + return r; } int rtlsdr_close(rtlsdr_dev_t *dev) @@ -721,14 +722,9 @@ int rtlsdr_close(rtlsdr_dev_t *dev) free(dev->xfer_buf[i]); } - free(dev); + libusb_exit(dev->ctx); - if (0 == --opened_devices) { - if (libusb_inited) { - libusb_exit(NULL); - libusb_inited = 0; - } - } + free(dev); return 0; } @@ -757,7 +753,7 @@ static void LIBUSB_CALL _libusb_callback(struct libusb_transfer *transfer) if (LIBUSB_TRANSFER_COMPLETED == transfer->status) { rtlsdr_dev_t *dev = (rtlsdr_dev_t *)transfer->user_data; - dev->cb(transfer->buffer, transfer->actual_length, dev->context); + dev->cb(transfer->buffer, transfer->actual_length, dev->cb_ctx); libusb_submit_transfer(transfer); /* resubmit transfer */ } else { @@ -765,7 +761,7 @@ static void LIBUSB_CALL _libusb_callback(struct libusb_transfer *transfer) } } -int rtlsdr_wait_async(rtlsdr_dev_t *dev, rtlsdr_async_read_cb_t cb, void *context) +int rtlsdr_wait_async(rtlsdr_dev_t *dev, rtlsdr_async_read_cb_t cb, void *ctx) { int i, r; @@ -773,7 +769,7 @@ int rtlsdr_wait_async(rtlsdr_dev_t *dev, rtlsdr_async_read_cb_t cb, void *contex return -1; dev->cb = cb; - dev->context = context; + dev->cb_ctx = ctx; for(i = 0; i < BUF_COUNT; ++i) { if (dev->xfer[i]) @@ -804,7 +800,7 @@ int rtlsdr_wait_async(rtlsdr_dev_t *dev, rtlsdr_async_read_cb_t cb, void *contex while (dev->run_async) { struct timeval tv = { 1, 0 }; - r = libusb_handle_events_timeout(NULL, &tv); + r = libusb_handle_events_timeout(dev->ctx, &tv); if (r < 0) { /*fprintf(stderr, "handle_events %d\n", r);*/ break; |
