From 676027a56fc08080cd32449668a26e69229ecf2c Mon Sep 17 00:00:00 2001 From: lwvmobile Date: Wed, 26 Jul 2023 07:21:25 -0400 Subject: [PATCH] Tweak Float Auto Gain; Make User Configurable; --- src/dmr_flco.c | 6 +++++ src/dsd_audio2.c | 20 +++++++++++--- src/dsd_main.c | 68 +++++++++++++++++++++-------------------------- src/dsd_ncurses.c | 41 ++++++++++++++++++---------- src/nxdn_deperm.c | 7 +++++ src/p25p1_hdu.c | 4 +++ src/p25p1_tdu.c | 4 +++ src/p25p1_tdulc.c | 4 +++ src/p25p2_xcch.c | 38 +++++++++++++++++++++++++- 9 files changed, 136 insertions(+), 56 deletions(-) diff --git a/src/dmr_flco.c b/src/dmr_flco.c index 350ef7a..dbd3588 100644 --- a/src/dmr_flco.c +++ b/src/dmr_flco.c @@ -334,6 +334,9 @@ void dmr_flco (dsd_opts * opts, dsd_state * state, uint8_t lc_bits[], uint32_t C state->payload_algid = 0; state->payload_mi = 0; state->payload_keyid = 0; + //reset gain + if (opts->floating_point == 1) + state->aout_gain = opts->audio_gain; } if (state->currentslot == 1) { @@ -344,6 +347,9 @@ void dmr_flco (dsd_opts * opts, dsd_state * state, uint8_t lc_bits[], uint32_t C state->payload_algidR = 0; state->payload_miR = 0; state->payload_keyidR = 0; + //reset gain + if (opts->floating_point == 1) + state->aout_gainR = opts->audio_gain; } } diff --git a/src/dsd_audio2.c b/src/dsd_audio2.c index 6a664a9..7898e4c 100644 --- a/src/dsd_audio2.c +++ b/src/dsd_audio2.c @@ -41,15 +41,27 @@ void agf (dsd_opts * opts, dsd_state * state, float samp[160], int slot) //crude auto gain for float values if (slot == 0) { - if (max < 0.351f && max > 0.1f && state->aout_gain < 42) state->aout_gain += 0.33f; //state->aout_gain++; - if (max > 0.35f && state->aout_gain > 1) state->aout_gain -= 0.33f; //state->aout_gain--; + if (max < 0.351f && max > 0.1f && state->aout_gain < 42.0f) state->aout_gain++; + if (max > 0.35f && state->aout_gain > 1.0f) state->aout_gain--; } if (slot == 1) { - if (max < 0.351f && max > 0.1f && state->aout_gainR < 42) state->aout_gainR += 0.33f; //state->aout_gain++; - if (max > 0.35f && state->aout_gainR > 1) state->aout_gainR -= 0.33f; //state->aout_gain--; + if (max < 0.351f && max > 0.1f && state->aout_gainR < 42) state->aout_gainR++; + if (max > 0.35f && state->aout_gainR > 1) state->aout_gainR--; } + + // if (slot == 0) + // { + // if (max < 0.351f && max > 0.1f && state->aout_gain < 42.0f) state->aout_gain += 0.33f; + // if (max > 0.35f && state->aout_gain > 1.0f) state->aout_gain -= 0.33f; + // } + + // if (slot == 1) + // { + // if (max < 0.351f && max > 0.1f && state->aout_gainR < 42) state->aout_gainR += 0.33f; + // if (max > 0.35f && state->aout_gainR > 1) state->aout_gainR -= 0.33f; + // } AGF_END: ; //do nothing diff --git a/src/dsd_main.c b/src/dsd_main.c index cb04f3b..2ffb2b1 100644 --- a/src/dsd_main.c +++ b/src/dsd_main.c @@ -101,12 +101,10 @@ void noCarrier (dsd_opts * opts, dsd_state * state) { - //is this not being set properly? if (opts->floating_point == 1) { - //test for WIP auto gain, disable later if needbe - state->aout_gain = 25.0f; - state->aout_gainR = 25.0f; + state->aout_gain = opts->audio_gain; + state->aout_gainR = opts->audio_gain; } //clear heuristics from last carrier signal @@ -294,18 +292,6 @@ noCarrier (dsd_opts * opts, dsd_state * state) sprintf (state->slot1light, "%s", ""); sprintf (state->slot2light, "%s", ""); state->firstframe = 0; - //this really isn't the best placement for this sort of check - // if (opts->audio_gain == (float) 0) - // { - // if (state->audio_smoothing == 0) state->aout_gain = 15; //15 - // else state->aout_gain = 25; //25 - // } - - // if (opts->audio_gainR == (float) 0) - // { - // if (state->audio_smoothing == 0) state->aout_gainR = 15; //15 - // else state->aout_gainR = 25; //25 - // } memset (state->aout_max_buf, 0, sizeof (float) * 200); state->aout_max_buf_p = state->aout_max_buf; state->aout_max_buf_idx = 0; @@ -1193,7 +1179,8 @@ usage () printf (" null for no audio output\n"); printf (" -d Create mbe data files, use this directory (TDMA version is experimental)\n"); printf (" -r Read/Play saved mbe data from file(s)\n"); - printf (" -g Audio output gain (default = 0 = auto, disable = -1)\n"); + printf (" -g Audio output gain (SHORT) -- (default = 0 = auto, disable = -1)\n"); + printf (" -g Audio Base Gain (FLOAT) -- (0 - 45)\n"); //re-write this to make it clear! printf (" -w Output synthesized speech to a .wav file, FDMA modes only.\n"); printf (" -7 Create/Use Custom directory for Per Call decoded .wav file saving.\n"); printf (" (Single Nested Directory Only! Use Before the -P option!)\n"); @@ -1334,6 +1321,17 @@ void liveScanner (dsd_opts * opts, dsd_state * state) { + if (opts->floating_point == 1) + { + //use this for now, but see if we can really start on zero later on + //when we have a more normalized gain attack + if (opts->audio_gain == 0) + opts->audio_gain = 25.0f; + + opts->audio_gain /= 2.0f; + if (opts->audio_gain > 45.0f) opts->audio_gain = 45.0f; + } + // if (opts->audio_in_type == 1) // { // opts->pulse_digi_rate_out = 48000; @@ -1584,9 +1582,6 @@ main (int argc, char **argv) case 'y': //use experimental 'float' audio output opts.floating_point = 1; //enable floating point audio output - opts.audio_gain = 0; - state.aout_gain = 25.0f; //seems like a nonimal value for float during testing anyways - state.aout_gainR = 25.0f; //seems like a nonimal value for float during testing anyways fprintf (stderr,"Enabling Experimental Floating Point Audio Output\n"); break; @@ -1893,23 +1888,23 @@ main (int argc, char **argv) case 'g': sscanf (optarg, "%f", &opts.audio_gain); if (opts.audio_gain < (float) 0 ) - { - fprintf (stderr,"Disabling audio out gain setting\n"); - opts.audio_gainR = opts.audio_gain; - } + { + fprintf (stderr,"Disabling audio out gain setting\n"); + opts.audio_gainR = opts.audio_gain; + } else if (opts.audio_gain == (float) 0) - { - opts.audio_gain = (float) 0; - opts.audio_gainR = opts.audio_gain; - fprintf (stderr,"Enabling audio out auto-gain\n"); - } + { + opts.audio_gain = (float) 0; + opts.audio_gainR = opts.audio_gain; + fprintf (stderr,"Enabling audio out auto-gain\n"); + } else - { - fprintf (stderr,"Setting audio out gain to %f\n", opts.audio_gain); - opts.audio_gainR = opts.audio_gain; - state.aout_gain = opts.audio_gain; - state.aout_gainR = opts.audio_gain; - } + { + fprintf (stderr,"Setting audio out gain to %f\n", opts.audio_gain); + opts.audio_gainR = opts.audio_gain; + state.aout_gain = opts.audio_gain; + state.aout_gainR = opts.audio_gain; + } break; case 'w': @@ -2778,8 +2773,7 @@ main (int argc, char **argv) else { - //debug - fprintf (stderr, "AIT: %d AOT: %d RATE: %d GAIN: %f \n", opts.audio_in_type, opts.audio_out_type, opts.pulse_digi_rate_out, state.aout_gain); + liveScanner (&opts, &state); } diff --git a/src/dsd_ncurses.c b/src/dsd_ncurses.c index 4ba4f26..b103aba 100644 --- a/src/dsd_ncurses.c +++ b/src/dsd_ncurses.c @@ -2313,8 +2313,8 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) } if (opts->audio_out_type == 0) { - printw ("| Pulse Audio Output: %i kHz; %i Channel; G: %.1f%%;", opts->pulse_digi_rate_out/1000, opts->pulse_digi_out_channels, state->aout_gain*2); - if (opts->pulse_digi_out_channels == 2) printw (" G: %.1f%%;", state->aout_gainR*2); + printw ("| Pulse Audio Output: %i kHz; %i Channel; G: %.1f%%", opts->pulse_digi_rate_out/1000, opts->pulse_digi_out_channels, state->aout_gain*2); + if (opts->pulse_digi_out_channels == 2) printw (" G: %.1f%%", state->aout_gainR*2); if (state->audio_smoothing == 1 && opts->floating_point == 0) printw (" Smoothing On;"); //only on short if (opts->floating_point == 1) printw (" Floating Point;"); @@ -2322,8 +2322,8 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) } if (opts->audio_out_type == 5) { - printw ("| Pulse Audio Output: %i kHz; %i Channel; G: %.1f%%;", opts->pulse_digi_rate_out/1000, opts->pulse_digi_out_channels, state->aout_gain*2); - if (opts->pulse_digi_out_channels == 2) printw (" G: %.1f%%;", state->aout_gainR*2); + printw ("| Pulse Audio Output: %i kHz; %i Channel; G: %.1f%%", opts->pulse_digi_rate_out/1000, opts->pulse_digi_out_channels, state->aout_gain*2); + if (opts->pulse_digi_out_channels == 2) printw (" G: %.1f%%", state->aout_gainR*2); if (state->audio_smoothing == 1 && opts->floating_point == 0) printw (" Smoothing On;"); //nly on short if (opts->floating_point == 1) printw (" Floating Point;"); printw (" \n"); @@ -3493,20 +3493,33 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) if (c == 43) //+ key, increment aout_gain { - if (state->aout_gain < 50) - state->aout_gain++; - //probably won't use aout_gainR with new short and float systems - if (state->aout_gainR < 50) - state->aout_gainR++; + // if (state->aout_gain < 50) + // state->aout_gain++; + // //probably won't use aout_gainR with new short and float systems + // if (state->aout_gainR < 50) + // state->aout_gainR++; + + if (opts->audio_gain < 50) + opts->audio_gain++; + + state->aout_gain = opts->audio_gain; + state->aout_gainR = opts->audio_gain; + } if (c == 45) //- key, decrement aout_gain { - if (state->aout_gain > 0) - state->aout_gain--; - //probably won't use aout_gainR with new short and float systems - if (state->aout_gainR > 0) - state->aout_gainR--; + // if (state->aout_gain > 0) + // state->aout_gain--; + // //probably won't use aout_gainR with new short and float systems + // if (state->aout_gainR > 0) + // state->aout_gainR--; + + if (opts->audio_gain > 1) + opts->audio_gain--; + + state->aout_gain = opts->audio_gain; + state->aout_gainR = opts->audio_gain; } if (c == 122) //'z' key, toggle payload to console diff --git a/src/nxdn_deperm.c b/src/nxdn_deperm.c index 285b4b0..828d114 100644 --- a/src/nxdn_deperm.c +++ b/src/nxdn_deperm.c @@ -950,6 +950,13 @@ void nxdn_message_type (dsd_opts * opts, dsd_state * state, uint8_t MessageType) memset (state->nxdn_sacch_frame_segment, 1, sizeof(state->nxdn_sacch_frame_segment)); sprintf (state->nxdn_call_type, "%s", ""); } + + if (MessageType == 0x07 ||MessageType == 0x08 || MessageType == 0x11) + { + //reset gain + if (opts->floating_point == 1) + state->aout_gain = opts->audio_gain; + } } diff --git a/src/p25p1_hdu.c b/src/p25p1_hdu.c index 164c8b3..515c780 100644 --- a/src/p25p1_hdu.c +++ b/src/p25p1_hdu.c @@ -502,5 +502,9 @@ processHDU(dsd_opts* opts, dsd_state* state) fprintf (stderr, " HDU FEC ERR \n"); fprintf (stderr, "%s", KNRM); } + + //reset gain + if (opts->floating_point == 1) + state->aout_gain = opts->audio_gain; } diff --git a/src/p25p1_tdu.c b/src/p25p1_tdu.c index 616675d..f2c748f 100644 --- a/src/p25p1_tdu.c +++ b/src/p25p1_tdu.c @@ -38,4 +38,8 @@ processTDU (dsd_opts* opts, dsd_state* state) //reset some strings -- since its a tdu, blank out any call strings, only want during actual call sprintf (state->call_string[0], "%s", " "); //21 spaces sprintf (state->call_string[1], "%s", " "); //21 spaces + + //reset gain + if (opts->floating_point == 1) + state->aout_gain = opts->audio_gain; } diff --git a/src/p25p1_tdulc.c b/src/p25p1_tdulc.c index 17eef24..f52b5dc 100644 --- a/src/p25p1_tdulc.c +++ b/src/p25p1_tdulc.c @@ -447,4 +447,8 @@ processTDULC (dsd_opts* opts, dsd_state* state) sprintf (state->call_string[0], "%s", " "); //21 spaces sprintf (state->call_string[1], "%s", " "); //21 spaces + //reset gain + if (opts->floating_point == 1) + state->aout_gain = opts->audio_gain; + } diff --git a/src/p25p2_xcch.c b/src/p25p2_xcch.c index 200ee5b..02545f9 100644 --- a/src/p25p2_xcch.c +++ b/src/p25p2_xcch.c @@ -150,6 +150,10 @@ void process_SACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[180] // fprintf (stderr, "ENC"); } + //reset gain + if (opts->floating_point == 1) + state->aout_gain = opts->audio_gain; + } if (state->currentslot == 0) @@ -186,6 +190,10 @@ void process_SACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[180] // fprintf (stderr, "ENC"); } + //reset gain + if (opts->floating_point == 1) + state->aout_gainR = opts->audio_gain; + } fprintf (stderr, "%s", KNRM); } @@ -216,7 +224,11 @@ void process_SACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[180] if (opts->mbe_out_f != NULL) closeMbeOutFile (opts, state); //blank the call string here -- slot variable is already flipped accordingly for sacch - sprintf (state->call_string[slot], "%s", " "); //21 spaces + sprintf (state->call_string[slot], "%s", " "); //21 spaces -- wrong placement! + + //reset gain + if (opts->floating_point == 1) + state->aout_gain = opts->audio_gain; } if (state->currentslot == 0) @@ -238,6 +250,14 @@ void process_SACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[180] //close any open MBEout files if (opts->mbe_out_fR != NULL) closeMbeOutFileR (opts, state); + + //blank the call string here -- slot variable is already flipped accordingly for sacch + sprintf (state->call_string[slot], "%s", " "); //21 spaces -- wrong placement! + + //reset gain + if (opts->floating_point == 1) + state->aout_gainR = opts->audio_gain; + } fprintf (stderr, "%s", KNRM); } @@ -406,6 +426,10 @@ void process_FACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[156] // fprintf (stderr, "ENC"); } + //reset gain + if (opts->floating_point == 1) + state->aout_gain = opts->audio_gain; + } if (state->currentslot == 1) @@ -441,6 +465,10 @@ void process_FACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[156] // fprintf (stderr, "ENC"); } + //reset gain + if (opts->floating_point == 1) + state->aout_gainR = opts->audio_gain; + } fprintf (stderr, "%s", KNRM); @@ -471,6 +499,10 @@ void process_FACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[156] //blank the call string here sprintf (state->call_string[slot], "%s", " "); //21 spaces + + //reset gain + if (opts->floating_point == 1) + state->aout_gain = opts->audio_gain; //reset } if (state->currentslot == 1) @@ -492,6 +524,10 @@ void process_FACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[156] //close any open MBEout files if (opts->mbe_out_fR != NULL) closeMbeOutFileR (opts, state); + + //reset gain + if (opts->floating_point == 1) + state->aout_gainR = opts->audio_gain; } fprintf (stderr, "%s", KNRM); }