From 3bd3edb36ff0f78f1049a89260bb6e46ddfb3ef5 Mon Sep 17 00:00:00 2001 From: lwvmobile Date: Wed, 26 Jul 2023 18:43:52 -0400 Subject: [PATCH] Fix Cygwin/Aero/OSS/M17 Junk; --- src/dsd_main.c | 17 +++++- src/dsd_ncurses.c | 4 +- src/m17.c | 137 ++++++++++++++++++++++++++++++++++------------ 3 files changed, 119 insertions(+), 39 deletions(-) diff --git a/src/dsd_main.c b/src/dsd_main.c index e3091ce..9f43de7 100644 --- a/src/dsd_main.c +++ b/src/dsd_main.c @@ -1319,6 +1319,13 @@ if (opts->audio_out_type == 0) openPulseOutput(opts); } +#ifdef AERO_BUILD +//TODO: Investigate why getSymbol needs to be run first in this context...truly confused here +if(opts->frame_m17 == 1 && opts->audio_in_type != 0 && opts->audio_out_type != 0) // + for (int i = 0; i < 960; i++) getSymbol(opts, state, 1); //I think this is actually just framesync being a pain +#endif + + while (1) { @@ -1450,7 +1457,7 @@ main (int argc, char **argv) } #ifdef AERO_BUILD - fprintf (stderr, "Build Version: v2.1b (20230714)\n"); + fprintf (stderr, "Build Version: v2.1b (20230726)\n"); #else fprintf (stderr, "Build Version: %s \n", GIT_TAG); #endif @@ -2530,9 +2537,15 @@ main (int argc, char **argv) opts.audio_in_type = 5; //5 will become OSS input type } - //Codec2 only running at 8k output currently, need to match for OSS + //OSS cannot open different rate/channel configs on /dev/dsp on real hardware and in Cygwin + //So, in Aero builds, we need to keep the rate the same but upscale Codec2 + //padsp opens a virtual output, so mixing and matching rates/channels is possible there + #ifdef AERO_BUILD + // speed = 48000; + #else if (opts.frame_m17 == 1) speed = 8000; + #endif if((strncmp(opts.audio_out_dev, "/dev/audio", 10) == 0)) { diff --git a/src/dsd_ncurses.c b/src/dsd_ncurses.c index 9adcfa1..504abbb 100644 --- a/src/dsd_ncurses.c +++ b/src/dsd_ncurses.c @@ -2225,7 +2225,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) if (opts->ncurses_compact == 1) { printw ("------------------------------------------------------------------------------\n"); - printw ("| Digital Speech Decoder: Florida Man Edition - Aero %s \n", "v2.1b (20230714)"); + printw ("| Digital Speech Decoder: Florida Man Edition - Aero %s \n", "v2.1b (20230726)"); printw ("------------------------------------------------------------------------------\n"); } #elif LIMAZULUTWEAKS @@ -2261,7 +2261,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) if (i == 4) printw (" MBElib %s", versionstr); #ifdef AERO_BUILD if (i == 5) printw (" %s ", "Aero Build"); - if (i == 6) printw (" v2.1b (20230714) \n"); + if (i == 6) printw (" v2.1b (20230726) \n"); #elif ZDEV_BUILD if (i == 5) printw (" %s ", "zDEV Build"); if (i == 6) printw (" %s \n", GIT_TAG); diff --git a/src/m17.c b/src/m17.c index d86b903..90f0061 100644 --- a/src/m17.c +++ b/src/m17.c @@ -45,6 +45,26 @@ uint8_t p1[62] = { 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1 }; +//produce 6 short samples (48k) for every 1 short sample (8k) +void upsampleM17 (short invalue, short prev, short outbuf[6]) +{ + + float c, d; + + c = prev; + d = invalue; + + // basic triangle interpolation + outbuf[0] = c = ((invalue * (float) 0.166) + (c * (float) 0.834)); + outbuf[1] = c = ((invalue * (float) 0.332) + (c * (float) 0.668)); + outbuf[2] = c = ((invalue * (float) 0.500) + (c * (float) 0.5)); + outbuf[3] = c = ((invalue * (float) 0.668) + (c * (float) 0.332)); + outbuf[4] = c = ((invalue * (float) 0.834) + (c * (float) 0.166)); + outbuf[5] = c = d; + prev = d; //shift prev to the last d value for the next repitition + +} + //from M17_Implementations -- sp5wwp -- should have just looked here to begin with //this setup looks very similar to the OP25 variant of crc16, but with a few differences (uses packed bytes) uint16_t crc16m17(const uint8_t *in, const uint16_t len) @@ -294,12 +314,8 @@ int M17processLICH(dsd_state * state, dsd_opts * opts, uint8_t lich_bits[96]) void M17processCodec2_1600(dsd_opts * opts, dsd_state * state, uint8_t payload[128]) { - - //If payload is the same from the stream in this mode, I suppose we could use this area to parse - //or send off the remaining data to be handled or decoded , or just print out the raw data bytes - int i; - unsigned char voice1[8]; //codec2_bytes_per_frame + unsigned char voice1[8]; unsigned char voice2[8]; for (i = 0; i < 8; i++) @@ -329,35 +345,47 @@ void M17processCodec2_1600(dsd_opts * opts, dsd_state * state, uint8_t payload[1 #ifdef USE_CODEC2 size_t nsam; - nsam = 320; //codec2_samples_per_frame(state->codec2_1600); - - short samp1[nsam]; - // short samp2[nsam]; - memset (samp1, 0, sizeof(samp1)); - // memset (samp2, 0, sizeof(samp2)); + nsam = 160; + //converted to using allocated memory pointers to prevent the overflow issues + short * samp1 = malloc (sizeof(short) * nsam); + short * upsamp = malloc (sizeof(short) * nsam * 6); + short * out = malloc (sizeof(short) * 6); + short prev; + int j; codec2_decode(state->codec2_1600, samp1, voice1); - // codec2_decode(state->codec2_1600, samp2, voice2); - - if (opts->audio_out_type == 0 && state->m17_enc == 0) + if (opts->audio_out_type == 0 && state->m17_enc == 0) //Pulse Audio { 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 == 5 && state->m17_enc == 0) - { - write (opts->audio_out_fd, samp1, nsam*2); - // write (opts->audio_out_fd, samp2, nsam*2); + } + #ifdef AERO_BUILD + if (opts->audio_out_type == 5 && state->m17_enc == 0) //OSS w/ required upsample to 48k + { + //upsample to 48k and then play + prev = samp1[0]; + for (i = 0; i < 160; i++) + { + upsampleM17 (samp1[i], prev, out); + for (j = 0; j < 6; j++) upsamp[(i*6)+j] = out[j]; + } + write (opts->audio_out_fd, upsamp, nsam*2*6); + } + #else + if (opts->audio_out_type == 5 && state->m17_enc == 0) //OSS via PADSP at 8k + { + write (opts->audio_out_fd, samp1, nsam*2); + } + #endif + + //WIP: Wav file saving -- still need a way to open/close/label wav files similar to call history - if(opts->wav_out_f != NULL && state->m17_enc == 0) + if(opts->wav_out_f != NULL && state->m17_enc == 0) //WAV { sf_write_short(opts->wav_out_f, samp1, nsam); - // sf_write_short(opts->wav_out_f, samp2, nsam); } //TODO: Codec2 Raw file saving @@ -366,6 +394,10 @@ void M17processCodec2_1600(dsd_opts * opts, dsd_state * state, uint8_t payload[1 // } + free (samp1); + free (upsamp); + free (out); + #endif } @@ -373,7 +405,7 @@ void M17processCodec2_1600(dsd_opts * opts, dsd_state * state, uint8_t payload[1 void M17processCodec2_3200(dsd_opts * opts, dsd_state * state, uint8_t payload[128]) { int i; - unsigned char voice1[8]; //codec2_bytes_per_frame + unsigned char voice1[8]; unsigned char voice2[8]; for (i = 0; i < 8; i++) @@ -404,32 +436,62 @@ void M17processCodec2_3200(dsd_opts * opts, dsd_state * state, uint8_t payload[1 #ifdef USE_CODEC2 size_t nsam; - nsam = 160; //codec2_samples_per_frame(state->codec2_3200); - - short samp1[nsam]; - short samp2[nsam]; - memset (samp1, 0, sizeof(samp1)); - memset (samp2, 0, sizeof(samp2)); + nsam = 160; + //converted to using allocated memory pointers to prevent the overflow issues + short * samp1 = malloc (sizeof(short) * nsam); + short * samp2 = malloc (sizeof(short) * nsam); + short * upsamp = malloc (sizeof(short) * nsam * 6); + short * out = malloc (sizeof(short) * 6); + short prev; + int j; codec2_decode(state->codec2_3200, samp1, voice1); codec2_decode(state->codec2_3200, samp2, voice2); - - if (opts->audio_out_type == 0 && state->m17_enc == 0) + if (opts->audio_out_type == 0 && state->m17_enc == 0) //Pulse Audio { 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 == 5 && state->m17_enc == 0) + + #ifdef AERO_BUILD + if (opts->audio_out_type == 5 && state->m17_enc == 0) //OSS w/ required upsample to 48k + { + //upsample to 48k and then play + // prev = samp1[0]; + prev = 0; + for (i = 0; i < 160; i++) + { + upsampleM17 (samp1[i], prev, out); + for (j = 0; j < 6; j++) upsamp[(i*6)+j] = out[j]; + } + write (opts->audio_out_fd, upsamp, nsam*2*6); + prev = samp2[0]; + for (i = 0; i < 160; i++) + { + upsampleM17 (samp2[i], prev, out); + for (j = 0; j < 6; j++) upsamp[(i*6)+j] = out[j]; + } + write (opts->audio_out_fd, upsamp, nsam*2*6); + } + #else + if (opts->audio_out_type == 5 && state->m17_enc == 0) //OSS via PADSP at 8k + { + write (opts->audio_out_fd, samp1, nsam*2); + write (opts->audio_out_fd, samp2, nsam*2); + } + #endif + + + if (opts->audio_out_type == 1 && state->m17_enc == 0) //STDOUT { write (opts->audio_out_fd, samp1, nsam*2); write (opts->audio_out_fd, samp2, nsam*2); } //WIP: Wav file saving -- still need a way to open/close/label wav files similar to call history - if(opts->wav_out_f != NULL && state->m17_enc == 0) + if(opts->wav_out_f != NULL && state->m17_enc == 0) //WAV { sf_write_short(opts->wav_out_f, samp1, nsam); sf_write_short(opts->wav_out_f, samp2, nsam); @@ -441,6 +503,11 @@ void M17processCodec2_3200(dsd_opts * opts, dsd_state * state, uint8_t payload[1 // } + free (samp1); + free (samp2); + free (upsamp); + free (out); + #endif }