From d89507ebde1028293078cb7c2148dc56e26712ab Mon Sep 17 00:00:00 2001 From: lwvmobile <59371473+lwvmobile@users.noreply.github.com> Date: Sun, 12 Jun 2022 11:58:03 -0400 Subject: [PATCH] DMR Stereo Audio and Timing Tweaks --Tweak Naming of DMR Stereo output streams, giving them unique names so that the pulse audio server will remember their audio levels and left and right channel configurations on subsequent start ups. --Tweak timing of events inside of the DMR BS Stereo Method --- src/dmr_bs.c | 61 +++++++++++++++++++++++++++++-------------------- src/dsd_audio.c | 6 ++--- 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/dmr_bs.c b/src/dmr_bs.c index b8a4ecc..5267868 100644 --- a/src/dmr_bs.c +++ b/src/dmr_bs.c @@ -273,7 +273,7 @@ void dmrBS (dsd_opts * opts, dsd_state * state) else fprintf (stderr,"Sync: -DMR "); //constantly reset the vc counter to 1 each data frame in anticipation of new voice frame vc1 = 1; - state->dropL = 256; + //state->dropL = 256; } if (internalslot == 1) { @@ -287,7 +287,7 @@ void dmrBS (dsd_opts * opts, dsd_state * state) else fprintf (stderr,"Sync: -DMR "); //constantly reset the vc counter to 1 each data frame in anticipation of new voice frame vc2 = 1; - state->dropR = 256; + //state->dropR = 256; } processDMRdata (opts, state); skipcount++; //after 2 data frames, drop back to getFrameSync and process subsequent data with processDMRdata @@ -324,11 +324,12 @@ void dmrBS (dsd_opts * opts, dsd_state * state) fprintf(stderr, " BPK %lld", state->K); fprintf (stderr, "%s", KNRM); } + //the condition below should be swapped to vc6 and not on vc1, placement after processMbeFrame if (vc1 == 1 && state->payload_algid != 0 && opts->payload == 1) { - LFSR(state); + //LFSR(state); //placement here causes issues when second slot becomes active as well } - fprintf (stderr, "\n"); + //fprintf (stderr, "\n"); } else { @@ -339,11 +340,12 @@ void dmrBS (dsd_opts * opts, dsd_state * state) fprintf(stderr, " BPK %lld", state->K); fprintf (stderr, "%s", KNRM); } + //the condition below should be swapped to vc6 and not on vc1, placement after processMbeFrame if (vc1 == 1 && state->payload_algid != 0 && opts->payload == 1) { - LFSR(state); + //LFSR(state); //placement here causes issues when second slot becomes active as well } - fprintf (stderr, "\n"); + //fprintf (stderr, "\n"); } } @@ -359,11 +361,12 @@ void dmrBS (dsd_opts * opts, dsd_state * state) fprintf(stderr, " BPK %lld", state->K); fprintf (stderr, "%s", KNRM); } + //the condition below should be swapped to vc6 and not on vc1, placement after processMbeFrame if (vc2 == 1 && state->payload_algidR != 0 && opts->payload == 1) { - LFSR(state); + //LFSR(state); } - fprintf (stderr, "\n"); + //fprintf (stderr, "\n"); } else { @@ -374,11 +377,12 @@ void dmrBS (dsd_opts * opts, dsd_state * state) fprintf(stderr, " BPK %lld", state->K); fprintf (stderr, "%s", KNRM); } + //the condition below should be swapped to vc6 and not on vc1, placement after processMbeFrame if (vc2 == 1 && state->payload_algidR != 0 && opts->payload == 1) { - LFSR(state); + //LFSR(state); } - fprintf (stderr, "\n"); + //fprintf (stderr, "\n"); } } if (internalslot == 0 && vc1 == 6) //presumably when full (and no sync issues) @@ -387,6 +391,7 @@ void dmrBS (dsd_opts * opts, dsd_state * state) ProcessVoiceBurstSync(opts, state); fprintf (stderr, "\n"); } + if (internalslot == 1 && vc2 == 6) //presumably when full (and no sync issues) { //process voice burst @@ -464,29 +469,33 @@ void dmrBS (dsd_opts * opts, dsd_state * state) processMbeFrame (opts, state, NULL, ambe_fr, NULL); processMbeFrame (opts, state, NULL, ambe_fr2, NULL); processMbeFrame (opts, state, NULL, ambe_fr3, NULL); - /* - if (internalslot == 0 ) //&& vc1 == 6 + + //We only want to run LFSR after processing VC6 frames and before rolling + //back to VC1, otherwise we will incur an unwanted LFSR if voice becomes active + //in both slots while in this loop + if (internalslot == 0 && vc1 == 6) { - fprintf (stderr, "\nVC%d Full = ", vc1); - for (k = 0; k < 144;) + state->dropL = 256; + //if (vc1 == 1 && state->payload_algid != 0 && opts->payload == 1) + if (state->payload_algid != 0 && opts->payload == 1) { - fprintf (stderr, "%X", ((state->dmr_stereo_payload[k] << 2) + state->dmr_stereo_payload[k+1]) ); - k = k + 2; + LFSR(state); + fprintf (stderr, "\n"); } - fprintf (stderr, "\n"); + } - if (internalslot == 1 ) //&& vc2 == 6 + + if (internalslot == 1 && vc2 == 6) { - fprintf (stderr, "\nVC%d Full = ", vc2); - for (k = 0; k < 144;) + state->dropR = 256; + if (state->payload_algidR != 0 && opts->payload == 1) { - //fprintf (stderr, " L%X R%X ", state->dmr_stereo_payload[k], state->dmr_stereo_payload[k+1]); - fprintf (stderr, "%01X", ((state->dmr_stereo_payload[k] << 2) + state->dmr_stereo_payload[k+1]) ); - k = k + 2; + LFSR(state); + fprintf (stderr, "\n"); } - fprintf (stderr, "\n"); + } - */ + if (internalslot == 0) { vc1++; @@ -549,7 +558,9 @@ void dmrBS (dsd_opts * opts, dsd_state * state) state->dmr_stereo = 0; state->errs2R = 0; state->errs2 = 0; +// +// } //Process buffered half frame and 2nd half and then jump to full BS decoding diff --git a/src/dsd_audio.c b/src/dsd_audio.c index a5e277d..fc0c08b 100644 --- a/src/dsd_audio.c +++ b/src/dsd_audio.c @@ -49,8 +49,8 @@ void openPulseOutput(dsd_opts * opts) } if (opts->dmr_stereo == 1) { - opts->pulse_digi_dev_out = pa_simple_new(NULL, "DSD-FME", PA_STREAM_PLAYBACK, NULL, "DMR/MOTOTRBO LEFT", &tt, left, NULL, NULL); - opts->pulse_digi_dev_outR = pa_simple_new(NULL, "DSD-FME", PA_STREAM_PLAYBACK, NULL, "DMR/MOTOTRBO RIGHT", &tt, right, NULL, NULL); + opts->pulse_digi_dev_out = pa_simple_new(NULL, "DSD-FME1", PA_STREAM_PLAYBACK, NULL, "DMR/MOTOTRBO SLOT 1", &tt, left, NULL, NULL); + opts->pulse_digi_dev_outR = pa_simple_new(NULL, "DSD-FME2", PA_STREAM_PLAYBACK, NULL, "DMR/MOTOTRBO SLOT 2", &tt, right, NULL, NULL); } } @@ -158,7 +158,7 @@ processAudio (dsd_opts * opts, dsd_state * state) state->audio_out_temp_buf_p = state->audio_out_temp_buf; //we only want to upsample when using sample rates greater than 8k for output, //hard set to 8k for RTL mono and MBE playback, otherwise crackling may occur. - if (opts->pulse_digi_rate_out > 8000) + if (opts->pulse_digi_rate_out > 8000) { for (n = 0; n < 160; n++) {