瀏覽代碼

handle init/exit functions calling
automatically inside the library

Dimitri Stolnikov 13 年之前
父節點
當前提交
9d15dc565a
共有 3 個文件被更改,包括 36 次插入28 次删除
  1. 0 10
      include/rtl-sdr.h
  2. 5 6
      src/main.c
  3. 31 12
      src/rtl-sdr.c

+ 0 - 10
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

+ 5 - 6
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;
 }

+ 31 - 12
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;