diff options
Diffstat (limited to 'src/rtl_tcp.c')
-rw-r--r-- | src/rtl_tcp.c | 50 |
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; |