From 1600e6c0d48a042ef954b8e7d57bf2627b005a45 Mon Sep 17 00:00:00 2001 From: lwvmobile Date: Mon, 21 Aug 2023 15:23:03 -0400 Subject: [PATCH] UDP Audio Output -- Audio Implementation; --- src/dsd_audio.c | 31 ++++++++++++++++--------------- src/dsd_audio2.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- src/dsd_symbol.c | 3 +++ src/edacs-fme.c | 7 +++++++ src/m17.c | 11 +++++++++++ 5 files changed, 81 insertions(+), 16 deletions(-) diff --git a/src/dsd_audio.c b/src/dsd_audio.c index 285f826..48899b2 100644 --- a/src/dsd_audio.c +++ b/src/dsd_audio.c @@ -718,22 +718,23 @@ openAudioInDevice (dsd_opts * opts) } } - else if (strncmp(opts->audio_in_dev, "udp", 3) == 0) - { - opts->audio_in_type = 6; - 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->udp_file_in = sf_open_fd(opts->udp_sockfd, SFM_READ, opts->audio_in_file_info, 0); + // else if (strncmp(opts->audio_in_dev, "udp", 3) == 0) + // { + // opts->audio_in_type = 6; + // 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->udp_file_in = sf_open_fd(opts->udp_sockfd, SFM_READ, opts->audio_in_file_info, 0); + + // if(opts->udp_file_in == NULL) + // { + // fprintf(stderr, "Error, couldn't open UDP with libsndfile: %s\n", sf_strerror(NULL)); + // exit(1); + // } + // } - if(opts->udp_file_in == NULL) - { - fprintf(stderr, "Error, couldn't open UDP with libsndfile: %s\n", sf_strerror(NULL)); - exit(1); - } - } else if(strncmp(opts->audio_in_dev, "rtl", 3) == 0) { #ifdef USE_RTLSDR diff --git a/src/dsd_audio2.c b/src/dsd_audio2.c index ff86d49..72ec290 100644 --- a/src/dsd_audio2.c +++ b/src/dsd_audio2.c @@ -169,6 +169,13 @@ void playSynthesizedVoiceFS3 (dsd_opts * opts, dsd_state * state) pa_simple_write(opts->pulse_digi_dev_out, stereo_samp3, 320*4, NULL); } + if (opts->audio_out_type == 8) //UDP Audio + { + udp_socket_blaster (opts, state, 320*4, stereo_samp1); + udp_socket_blaster (opts, state, 320*4, stereo_samp2); + udp_socket_blaster (opts, state, 320*4, stereo_samp3); + } + //No OSS, since we can't use float output, but STDOUT can with play, aplay, etc if (opts->audio_out_type == 1) //STDOUT (still need these seperated? or not really?) @@ -344,6 +351,17 @@ void playSynthesizedVoiceFS4 (dsd_opts * opts, dsd_state * state) pa_simple_write(opts->pulse_digi_dev_out, stereo_samp4, 320*4, NULL); } + if (opts->audio_out_type == 8) //UDP Audio + { + udp_socket_blaster (opts, state, 320*4, stereo_samp1); + udp_socket_blaster (opts, state, 320*4, stereo_samp2); + //only play these two if not a single 2v or double 2v (minor skip can still occur on a 4v and 2v combo, but will probably only be perceivable if one is a tone) + if (memcmp(empty, stereo_samp3, sizeof(empty)) != 0) + udp_socket_blaster (opts, state, 320*4, stereo_samp3); + if (memcmp(empty, stereo_samp4, sizeof(empty)) != 0) + udp_socket_blaster (opts, state, 320*4, stereo_samp4); + } + //No OSS, since we can't use float output, but the STDOUT can with play, aplay, etc if (opts->audio_out_type == 1) //STDOUT @@ -429,6 +447,8 @@ void playSynthesizedVoiceFS (dsd_opts * opts, dsd_state * state) if (opts->audio_out_type == 0) //Pulse Audio pa_simple_write(opts->pulse_digi_dev_out, stereo_samp1, 320*4, NULL); //switch to sizeof(stereo_samp1) * 2? + if (opts->audio_out_type == 8) //UDP Audio + udp_socket_blaster (opts, state, 320*4, stereo_samp1); //No OSS, since we can't use float output, but STDOUT can with play, aplay, etc @@ -484,6 +504,9 @@ void playSynthesizedVoiceFM (dsd_opts * opts, dsd_state * state) if (opts->audio_out_type == 0) pa_simple_write(opts->pulse_digi_dev_out, state->f_l, 160*4, NULL); + if (opts->audio_out_type == 8) //UDP Audio + udp_socket_blaster (opts, state, 160*4, state->f_l); + if (opts->audio_out_type == 1 || opts->audio_out_type == 5) write(opts->audio_out_fd, state->f_l, 160*4); @@ -540,6 +563,9 @@ void playSynthesizedVoiceSS (dsd_opts * opts, dsd_state * state) if (opts->audio_out_type == 0) //Pulse Audio pa_simple_write(opts->pulse_digi_dev_out, stereo_samp1, 320*2, NULL); + if (opts->audio_out_type == 8) //UDP Audio + udp_socket_blaster (opts, state, 320*2, stereo_samp1); + if (opts->audio_out_type == 1 || opts->audio_out_type == 2) //STDOUT or OSS 8k/2 write (opts->audio_out_fd, stereo_samp1, 320*2); @@ -677,7 +703,13 @@ void playSynthesizedVoiceSS3 (dsd_opts * opts, dsd_state * state) pa_simple_write(opts->pulse_digi_dev_out, stereo_samp2, 320*2, NULL); pa_simple_write(opts->pulse_digi_dev_out, stereo_samp3, 320*2, NULL); } - + + if (opts->audio_out_type == 8) //UDP Audio + { + udp_socket_blaster (opts, state, 320*2, stereo_samp1); + udp_socket_blaster (opts, state, 320*2, stereo_samp2); + udp_socket_blaster (opts, state, 320*2, stereo_samp3); + } if (opts->audio_out_type == 1 || opts->audio_out_type == 2) //STDOUT or OSS 8k/2channel { @@ -827,6 +859,17 @@ void playSynthesizedVoiceSS4 (dsd_opts * opts, dsd_state * state) if (memcmp(empty, stereo_samp4, sizeof(empty)) != 0) pa_simple_write(opts->pulse_digi_dev_out, stereo_samp4, 320*2, NULL); } + + if (opts->audio_out_type == 8) //UDP Audio + { + udp_socket_blaster (opts, state, 320*2, stereo_samp1); + udp_socket_blaster (opts, state, 320*2, stereo_samp2); + //only play these two if not a single 2v or double 2v (minor skip can still occur on a 4v and 2v combo, but will probably only be perceivable if one is a tone) + if (memcmp(empty, stereo_samp3, sizeof(empty)) != 0) + udp_socket_blaster (opts, state, 320*2, stereo_samp3); + if (memcmp(empty, stereo_samp4, sizeof(empty)) != 0) + udp_socket_blaster (opts, state, 320*2, stereo_samp4); + } if (opts->audio_out_type == 1 || opts->audio_out_type == 2) //STDOUT or OSS 8k/2channel diff --git a/src/dsd_symbol.c b/src/dsd_symbol.c index d0bfa37..803a4cc 100644 --- a/src/dsd_symbol.c +++ b/src/dsd_symbol.c @@ -295,6 +295,9 @@ getSymbol (dsd_opts * opts, dsd_state * state, int have_sync) if (opts->audio_out_type == 0) pa_simple_write(opts->pulse_raw_dev_out, state->analog_out, 960*2, NULL); + if (opts->audio_out_type == 8) + udp_socket_blaster (opts, state, 960*2, state->analog_out); + //NOTE: Worked okay earlier in Cygwin, so should be fine -- can only operate at 48k1, else slow mode lag //This one will only operate when OSS 48k1 (when both input and output are OSS audio) diff --git a/src/edacs-fme.c b/src/edacs-fme.c index 69095c3..ea2ee0d 100644 --- a/src/edacs-fme.c +++ b/src/edacs-fme.c @@ -196,6 +196,13 @@ void edacs_analog(dsd_opts * opts, dsd_state * state, int afs, unsigned char lcn pa_simple_write(opts->pulse_raw_dev_out, analog3, 960*2, NULL); } + if (opts->audio_out_type == 8) //UDP Audio + { + udp_socket_blaster (opts, state, 960*2, analog1); + udp_socket_blaster (opts, state, 960*2, analog2); + udp_socket_blaster (opts, state, 960*2, analog3); + } + //added a condition check so that if OSS output and 8K, switches to 48K when opening OSS if (opts->audio_out_type == 5 && opts->floating_point == 0 && opts->slot1_on == 1) { diff --git a/src/m17.c b/src/m17.c index 017fb0b..3942e12 100644 --- a/src/m17.c +++ b/src/m17.c @@ -341,6 +341,11 @@ void M17processCodec2_1600(dsd_opts * opts, dsd_state * state, uint8_t * payload { pa_simple_write(opts->pulse_digi_dev_out, samp1, nsam*2, NULL); } + + if (opts->audio_out_type == 0 && state->m17_enc == 0) //UDP Audio + { + udp_socket_blaster (opts, state, nsam*2, samp1); + } if (opts->audio_out_type == 5 && state->m17_enc == 0) //OSS 48k/1 { @@ -437,6 +442,12 @@ void M17processCodec2_3200(dsd_opts * opts, dsd_state * state, uint8_t * payload pa_simple_write(opts->pulse_digi_dev_out, samp1, nsam*2, NULL); pa_simple_write(opts->pulse_digi_dev_out, samp2, nsam*2, NULL); } + + if (opts->audio_out_type == 0 && state->m17_enc == 0) //UDP Audio + { + udp_socket_blaster (opts, state, nsam*2, samp1); + udp_socket_blaster (opts, state, nsam*2, samp2); + } if (opts->audio_out_type == 5 && state->m17_enc == 0) //OSS 48k/1 {