summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Stolnikov <horiz0n@gmx.net>2012-04-01 13:06:22 +0200
committerDimitri Stolnikov <horiz0n@gmx.net>2012-04-01 13:06:22 +0200
commit9d15dc565a0d09ad313180fe1286a26de834c792 (patch)
tree1f68ee3393fe060bdb34a0f4e141bae841f1a229
parent46acfaebd2e4670e0d63696dc55fcb5f6bd9737a (diff)
handle init/exit functions calling
automatically inside the library
-rw-r--r--include/rtl-sdr.h10
-rw-r--r--src/main.c11
-rw-r--r--src/rtl-sdr.c43
3 files changed, 36 insertions, 28 deletions
diff --git a/include/rtl-sdr.h b/include/rtl-sdr.h
index 33370bc..8e8bf1b 100644
--- a/include/rtl-sdr.h
+++ b/include/rtl-sdr.h
@@ -27,12 +27,6 @@ extern "C" {
typedef int rtlsdr_dev_t;
-/* must be called once before using any other library functions */
-int rtlsdr_init(void);
-
-/* must be called once at application shutdown */
-void rtlsdr_exit(void);
-
uint32_t rtlsdr_get_device_count(void);
const char *rtlsdr_get_device_name(uint32_t index);
@@ -66,10 +60,6 @@ int rtlsdr_reset_buffer(rtlsdr_dev_t *dev);
int rtlsdr_read_sync(rtlsdr_dev_t *dev, void *buf, uint32_t len, uint32_t *n_read);
-typedef void(*rtlsdr_async_read_cb_t)(const char *buf, uint32_t len, void *ctx);
-
-int rtlsdr_async_loop(rtlsdr_dev_t *dev, rtlsdr_async_read_cb_t cb, void *ctx);
-
#ifdef __cplusplus
}
#endif
diff --git a/src/main.c b/src/main.c
index b3a7722..e412810 100644
--- a/src/main.c
+++ b/src/main.c
@@ -64,13 +64,13 @@ int main(int argc, char **argv)
dev_index = atoi(optarg);
break;
case 'f':
- frequency = atoi(optarg);
+ frequency = (int)atof(optarg);
break;
case 'g':
gain = atoi(optarg);
break;
case 's':
- samp_rate = atoi(optarg);
+ samp_rate = (int)atof(optarg);
break;
default:
usage();
@@ -84,8 +84,6 @@ int main(int argc, char **argv)
filename = argv[optind];
}
- rtlsdr_init();
-
int device_count = rtlsdr_get_device_count();
if (!device_count) {
fprintf(stderr, "No supported devices found.\n");
@@ -153,11 +151,12 @@ int main(int argc, char **argv)
}
}
+ if (do_exit)
+ printf("\nUser cancel, exiting...\n");
+
fclose(file);
rtlsdr_close(dev);
-
- rtlsdr_exit();
out:
return r >= 0 ? r : -r;
}
diff --git a/src/rtl-sdr.c b/src/rtl-sdr.c
index 76f90f5..1ab929b 100644
--- a/src/rtl-sdr.c
+++ b/src/rtl-sdr.c
@@ -79,8 +79,6 @@ enum rtlsdr_tuners {
RTLSDR_TUNER_FC0013,
};
-
-
static rtlsdr_tuner_t tuners[] = {
{ e4k_init, e4k_exit, e4k_tune, e4k_set_bw, e4k_set_gain, 0, 0, 0 },
{ fc0012_init, fc0012_exit, fc0012_tune, fc0012_set_bw, fc0012_set_gain, 0, 0, 0 },
@@ -108,6 +106,9 @@ typedef struct {
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
@@ -489,16 +490,6 @@ int rtlsdr_get_sample_rate(rtlsdr_dev_t *dev)
return dev->rate;
}
-int rtlsdr_init(void)
-{
- return libusb_init(NULL);
-}
-
-void rtlsdr_exit(void)
-{
- libusb_exit(NULL);
-}
-
rtlsdr_device_t *find_known_device(uint16_t vid, uint16_t pid)
{
int i;
@@ -521,6 +512,9 @@ uint32_t rtlsdr_get_device_count(void)
uint32_t device_count = 0;
struct libusb_device_descriptor dd;
+ if (!libusb_inited)
+ libusb_init(NULL);
+
ssize_t cnt = libusb_get_device_list(NULL, &list);
for (i = 0; i < cnt; i++) {
@@ -532,6 +526,9 @@ uint32_t rtlsdr_get_device_count(void)
libusb_free_device_list(list, 0);
+ if (!libusb_inited)
+ libusb_exit(NULL);
+
return device_count;
}
@@ -543,6 +540,9 @@ const char *rtlsdr_get_device_name(uint32_t index)
rtlsdr_device_t *device = NULL;
uint32_t device_count = 0;
+ if (!libusb_inited)
+ libusb_init(NULL);
+
ssize_t cnt = libusb_get_device_list(NULL, &list);
for (i = 0; i < cnt; i++) {
@@ -560,6 +560,9 @@ const char *rtlsdr_get_device_name(uint32_t index)
libusb_free_device_list(list, 0);
+ if (!libusb_inited)
+ libusb_exit(NULL);
+
if (device)
return device->name;
else
@@ -586,6 +589,13 @@ rtlsdr_dev_t *rtlsdr_open(int 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;
+ }
+ }
+
ssize_t cnt = libusb_get_device_list(NULL, &list);
for (i = 0; i < cnt; i++) {
@@ -681,6 +691,13 @@ int rtlsdr_close(rtlsdr_dev_t *dev)
libusb_close(dev->devh);
free(dev);
+ if (0 == --opened_devices) {
+ if (libusb_inited) {
+ libusb_exit(NULL);
+ libusb_inited = 0;
+ }
+ }
+
return 0;
}
@@ -703,6 +720,8 @@ int rtlsdr_read_sync(rtlsdr_dev_t *dev, void *buf, int len, int *n_read)
return libusb_bulk_transfer(dev->devh, 0x81, buf, len, n_read, 3000);
}
#if 0
+typedef void(*rtlsdr_async_read_cb_t)(const char *buf, uint32_t len, void *ctx);
+
int rtlsdr_async_loop(rtlsdr_dev_t *dev, rtlsdr_async_read_cb_t cb, void *ctx)
{
return 0;