aboutsummaryrefslogtreecommitdiffstats
path: root/src/rtl_tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rtl_tcp.c')
-rw-r--r--src/rtl_tcp.c50
1 files changed, 33 insertions, 17 deletions
diff --git a/src/rtl_tcp.c b/src/rtl_tcp.c
index 562198f..b730bf4 100644
--- a/src/rtl_tcp.c
+++ b/src/rtl_tcp.c
@@ -35,6 +35,7 @@
#include <fcntl.h>
#else
#include <winsock2.h>
+#include <ws2tcpip.h>
#include "getopt/getopt.h"
#endif
@@ -55,6 +56,10 @@ typedef int socklen_t;
#define SOCKET_ERROR -1
#endif
+#define DEFAULT_PORT_STR "1234"
+#define DEFAULT_SAMPLE_RATE_HZ 2048000
+#define DEFAULT_MAX_NUM_BUFFERS 500
+
static SOCKET s;
static pthread_t tcp_worker_thread;
@@ -82,23 +87,25 @@ static rtlsdr_dev_t *dev = NULL;
static int enable_biastee = 0;
static int global_numq = 0;
static struct llist *ll_buffers = 0;
-static int llbuf_num = 500;
+static int llbuf_num = DEFAULT_MAX_NUM_BUFFERS;
static volatile int do_exit = 0;
+
void usage(void)
{
- printf("rtl_tcp, an I/Q spectrum server for RTL2832 based DVB-T receivers\n\n"
- "Usage:\t[-a listen address]\n"
- "\t[-p listen port (default: 1234)]\n"
- "\t[-f frequency to tune to [Hz]]\n"
- "\t[-g gain (default: 0 for auto)]\n"
- "\t[-s samplerate in Hz (default: 2048000 Hz)]\n"
- "\t[-b number of buffers (default: 15, set by library)]\n"
- "\t[-n max number of linked list buffers to keep (default: 500)]\n"
- "\t[-d device index (default: 0)]\n"
- "\t[-P ppm_error (default: 0)]\n"
- "\t[-T enable bias-T on GPIO PIN 0 (works for rtl-sdr.com v3 dongles)]\n");
+ printf("rtl_tcp, an I/Q spectrum server for RTL2832 based DVB-T receivers\n\n");
+ printf("Usage:\t[-a listen address]\n");
+ printf("\t[-p listen port (default: %s)]\n", DEFAULT_PORT_STR);
+ printf("\t[-f frequency to tune to [Hz]]\n");
+ printf("\t[-g gain (default: 0 for auto)]\n");
+ printf("\t[-s samplerate in Hz (default: %d Hz)]\n", DEFAULT_SAMPLE_RATE_HZ);
+ printf("\t[-b number of buffers (default: 15, set by library)]\n");
+ printf("\t[-n max number of linked list buffers to keep (default: %d)]\n", DEFAULT_MAX_NUM_BUFFERS);
+ printf("\t[-d device index or serial (default: 0)]\n");
+ printf("\t[-P ppm_error (default: 0)]\n");
+ printf("\t[-T enable bias-T on GPIO PIN 0 (works for rtl-sdr.com v3 dongles)]\n");
+ printf("\t[-D enable direct sampling (default: off)]\n");
exit(1);
}
@@ -138,6 +145,7 @@ sighandler(int signum)
#else
static void sighandler(int signum)
{
+ signal(SIGPIPE, SIG_IGN);
fprintf(stderr, "Signal caught, exiting!\n");
rtlsdr_cancel_async(dev);
do_exit = 1;
@@ -373,12 +381,12 @@ int main(int argc, char **argv)
{
int r, opt, i;
char *addr = "127.0.0.1";
- char *port = "1234";
- uint32_t frequency = 100000000, samp_rate = 2048000;
+ const char *port = DEFAULT_PORT_STR;
+ uint32_t frequency = 100000000, samp_rate = DEFAULT_SAMPLE_RATE_HZ;
struct sockaddr_storage local, remote;
struct addrinfo *ai;
struct addrinfo *aiHead;
- struct addrinfo hints;
+ struct addrinfo hints = { 0 };
char hostinfo[NI_MAXHOST];
char portinfo[NI_MAXSERV];
char remhostinfo[NI_MAXHOST];
@@ -389,6 +397,7 @@ int main(int argc, char **argv)
int dev_given = 0;
int gain = 0;
int ppm_error = 0;
+ int direct_sampling = 0;
struct llist *curelem,*prev;
pthread_attr_t attr;
void *status;
@@ -406,7 +415,7 @@ int main(int argc, char **argv)
struct sigaction sigact, sigign;
#endif
- while ((opt = getopt(argc, argv, "a:p:f:g:s:b:n:d:P:T")) != -1) {
+ while ((opt = getopt(argc, argv, "a:p:f:g:s:b:n:d:P:TD")) != -1) {
switch (opt) {
case 'd':
dev_index = verbose_device_search(optarg);
@@ -439,6 +448,9 @@ int main(int argc, char **argv)
case 'T':
enable_biastee = 1;
break;
+ case 'D':
+ direct_sampling = 1;
+ break;
default:
usage();
break;
@@ -475,6 +487,10 @@ int main(int argc, char **argv)
SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE );
#endif
+ /* Set direct sampling */
+ if (direct_sampling)
+ verbose_direct_sampling(dev, 2);
+
/* Set the tuner error */
verbose_ppm_set(dev, ppm_error);
@@ -555,7 +571,7 @@ int main(int argc, char **argv)
setsockopt(listensocket, SOL_SOCKET, SO_REUSEADDR, (char *)&r, sizeof(int));
setsockopt(listensocket, SOL_SOCKET, SO_LINGER, (char *)&ling, sizeof(ling));
- if (bind(listensocket, (struct sockaddr *)&local, sizeof(local)))
+ if (bind(listensocket, (struct sockaddr *)&local, aiHead->ai_addrlen))
fprintf(stderr, "rtl_tcp bind error: %s", strerror(errno));
else
break;