diff --git a/src/dsd_ncurses.c b/src/dsd_ncurses.c index 9952533..26ac621 100644 --- a/src/dsd_ncurses.c +++ b/src/dsd_ncurses.c @@ -3418,6 +3418,36 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) noCarrier(opts, state); } + //attempt retry to TCP Audio server + if (c == 56) // '8' key, try audio in type 8 (TCP Audio Server connection) using defaults OR whatever the user last specified + { + + opts->tcp_sockfd = Connect(opts->tcp_hostname, opts->tcp_portno); + if (opts->tcp_sockfd != 0) + { + //reset audio input stream + opts->audio_in_file_info = calloc(1, sizeof(SF_INFO)); + opts->audio_in_file_info->samplerate=opts->wav_sample_rate; + opts->audio_in_file_info->channels=1; + opts->audio_in_file_info->seekable=0; + opts->audio_in_file_info->format=SF_FORMAT_RAW|SF_FORMAT_PCM_16|SF_ENDIAN_LITTLE; + opts->tcp_file_in = sf_open_fd(opts->tcp_sockfd, SFM_READ, opts->audio_in_file_info, 0); + + if(opts->tcp_file_in == NULL) + { + fprintf(stderr, "Error, couldn't Connect to TCP with libsndfile: %s\n", sf_strerror(NULL)); + } + else + { + //close pulse input if it is currently open + if (opts->audio_in_type == 0) closePulseInput(opts); + fprintf (stderr, "TCP Socket Connected Successfully.\n"); + opts->audio_in_type = 8; + } + } + else fprintf (stderr, "TCP Socket Connection Error.\n"); + } + //anything with an entry box will need the inputs and outputs stopped first //so probably just write a function to handle c input, and when c = certain values //needing an entry box, then stop all of those diff --git a/src/dsd_symbol.c b/src/dsd_symbol.c index 99a978d..278cfea 100644 --- a/src/dsd_symbol.c +++ b/src/dsd_symbol.c @@ -136,25 +136,86 @@ getSymbol (dsd_opts * opts, dsd_state * state, int have_sync) #endif } - //tcp socket input from SDR++ + + //tcp socket input from SDR++ -- now with 1 retry if connection is broken else if (opts->audio_in_type == 8) { result = sf_read_short(opts->tcp_file_in, &sample, 1); if(result == 0) { + fprintf (stderr, "\nConnection to TCP Server Interrupted. Trying again in 3 seconds.\n"); + sample = 0; + sf_close(opts->tcp_file_in); //close current connection on this end + sleep (3); //halt all processing and wait 3 seconds - fprintf (stderr, "Connection to TCP Server Disconnected.\n"); - //open pulse input if we are pulse output AND using ncurses terminal - if (opts->audio_out_type == 0 && opts->use_ncurses_terminal == 1) + //attempt to reconnect to socket + opts->tcp_sockfd = 0; + opts->tcp_sockfd = Connect(opts->tcp_hostname, opts->tcp_portno); + if (opts->tcp_sockfd != 0) { + //reset audio input stream + opts->audio_in_file_info = calloc(1, sizeof(SF_INFO)); + opts->audio_in_file_info->samplerate=opts->wav_sample_rate; + opts->audio_in_file_info->channels=1; + opts->audio_in_file_info->seekable=0; + opts->audio_in_file_info->format=SF_FORMAT_RAW|SF_FORMAT_PCM_16|SF_ENDIAN_LITTLE; + opts->tcp_file_in = sf_open_fd(opts->tcp_sockfd, SFM_READ, opts->audio_in_file_info, 0); + + if(opts->tcp_file_in == NULL) + { + fprintf(stderr, "Error, couldn't Reconnect to TCP with libsndfile: %s\n", sf_strerror(NULL)); + } + else fprintf (stderr, "TCP Socket Reconnected Successfully.\n"); + } + else fprintf (stderr, "TCP Socket Connection Error.\n"); + + //now retry reading sample + result = sf_read_short(opts->tcp_file_in, &sample, 1); + if (result == 0) { + sf_close(opts->tcp_file_in); opts->audio_in_type = 0; //set input type - openPulseInput(opts); //open pulse input - } - //else cleanup and exit - else cleanupAndExit(opts, state); + opts->tcp_sockfd = 0; //added this line so we will know if it connected when using ncurses terminal keyboard shortcut + //openPulseInput(opts); //open pulse inpput + sample = 0; //zero sample on bad result, keep the ball rolling + //open pulse input if we are pulse output AND using ncurses terminal + if (opts->audio_out_type == 0 && opts->use_ncurses_terminal == 1) + { + fprintf (stderr, "Connection to TCP Server Disconnected.\n"); + fprintf (stderr, "Opening Pulse Audio Input.\n"); + opts->audio_in_type = 0; //set input type + openPulseInput(opts); //open pulse input + } + //else cleanup and exit + else + { + fprintf (stderr, "Connection to TCP Server Disconnected.\n"); + fprintf (stderr, "Closing DSD-FME.\n"); + cleanupAndExit(opts, state); + } + + } } } + //tcp socket input from SDR++ -- old method to open pulse or quit right away + // else if (opts->audio_in_type == 8) + // { + // result = sf_read_short(opts->tcp_file_in, &sample, 1); + // if(result == 0) { + + // fprintf (stderr, "Connection to TCP Server Disconnected.\n"); + // //open pulse input if we are pulse output AND using ncurses terminal + // if (opts->audio_out_type == 0 && opts->use_ncurses_terminal == 1) + // { + // opts->audio_in_type = 0; //set input type + // openPulseInput(opts); //open pulse input + // } + // //else cleanup and exit + // else cleanupAndExit(opts, state); + + // } + // } + //UDP Socket input...not working correct. Reads samples, but no sync // else if (opts->audio_in_type == 6) // {