From 06bfcdacc247e8144496d16cebfa6c7cbdc368e7 Mon Sep 17 00:00:00 2001 From: lwvmobile Date: Tue, 26 Mar 2024 23:52:56 -0400 Subject: [PATCH] Remove Integrated Patches; --- ..._single_voice_to_stereo_fix_p2_slots.patch | 1222 ----------------- patch/faster_cap_plus_rest_lsn_testing.patch | 200 --- 2 files changed, 1422 deletions(-) delete mode 100644 patch/better_dmr_and_p25p2_single_voice_to_stereo_fix_p2_slots.patch delete mode 100644 patch/faster_cap_plus_rest_lsn_testing.patch diff --git a/patch/better_dmr_and_p25p2_single_voice_to_stereo_fix_p2_slots.patch b/patch/better_dmr_and_p25p2_single_voice_to_stereo_fix_p2_slots.patch deleted file mode 100644 index 23a853e..0000000 --- a/patch/better_dmr_and_p25p2_single_voice_to_stereo_fix_p2_slots.patch +++ /dev/null @@ -1,1222 +0,0 @@ -diff --git a/include/dsd.h b/include/dsd.h -index b2201dc..13a1070 100644 ---- a/include/dsd.h -+++ b/include/dsd.h -@@ -438,8 +438,8 @@ typedef struct - //new stereo short sample storage - short s_l[160]; //single sample left - short s_r[160]; //single sample right -- short s_l4[4][160]; //quad sample for up to a P25p2 4V -- short s_r4[4][160]; //quad sample for up to a P25p2 4V -+ short s_l4[18][160]; //quad sample for up to a P25p2 4V -+ short s_r4[18][160]; //quad sample for up to a P25p2 4V - //new stereo short sample storage tapped from 48_k internal upsampling - short s_lu[160*6]; //single sample left - short s_ru[160*6]; //single sample right -@@ -655,6 +655,7 @@ typedef struct - int p2_vch_chan_num; //vch channel number (0 or 1, not the 0-11 TS) - int ess_b[2][96]; //external storage for ESS_B fragments - int fourv_counter[2]; //external reference counter for ESS_B fragment collection -+ int voice_counter[2]; //external reference counter for 18V x 2 P25p2 Superframe - int p2_is_lcch; //flag to tell us when a frame is lcch and not sacch - - //iden freq storage for frequency calculations -@@ -928,6 +929,7 @@ void agf (dsd_opts * opts, dsd_state * state, float samp[160], int slot); //floa - void playSynthesizedVoiceSS (dsd_opts * opts, dsd_state * state); //short stereo mix - void playSynthesizedVoiceSS3 (dsd_opts * opts, dsd_state * state); //short stereo mix 3v2 DMR - void playSynthesizedVoiceSS4 (dsd_opts * opts, dsd_state * state); //short stereo mix 4v2 P25p2 -+void playSynthesizedVoiceSS18 (dsd_opts * opts, dsd_state * state); //short stereo mix 18V Superframe - void upsampleS (short invalue, short prev, short outbuf[6]); //upsample 8k to 48k short - // - void openAudioOutDevice (dsd_opts * opts, int speed); -diff --git a/src/dsd_audio2.c b/src/dsd_audio2.c -index e149850..a2c97ed 100644 ---- a/src/dsd_audio2.c -+++ b/src/dsd_audio2.c -@@ -906,8 +906,8 @@ void playSynthesizedVoiceSS3 (dsd_opts * opts, dsd_state * state) - //CHEAT: Using the slot on/off, use that to set encL or encR back on - //as a simple way to turn off voice synthesis in a particular slot - //its not really 'disabled', we just aren't playing it -- if (opts->slot1_on == 0) encL = 1; -- if (opts->slot2_on == 0) encR = 1; -+ // if (opts->slot1_on == 0) encL = 1; -+ // if (opts->slot2_on == 0) encR = 1; - - //WIP: Mute if on B list (or not W list) - char modeL[8]; -@@ -944,42 +944,158 @@ void playSynthesizedVoiceSS3 (dsd_opts * opts, dsd_state * state) - if (strcmp(modeL, "B") == 0) encL = 1; - if (strcmp(modeR, "B") == 0) encR = 1; - -+ //check to see if we need to enable slot and toggle slot preference here -+ //this method will always favor slot 2 (this is a patch anyways, so....meh) -+ // if (strcmp(modeL, "A") == 0) -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot_preference = 0; -+ // } -+ // if (strcmp(modeR, "A") == 0) -+ // { -+ // opts->slot2_on = 1; -+ // opts->slot_preference = 1; -+ // } -+ -+ //check to see if we need to enable slot and toggle slot preference here -+ //if both groups allowed, then give no preference to either one (not sure this is needed now) -+ // if ( (strcmp(modeL, "A") == 0) && (strcmp(modeR, "A") == 0) ) -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 1; -+ // opts->slot_preference = 2; -+ // } -+ // else if (strcmp(modeL, "A") == 0) -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot_preference = 0; -+ // } -+ // else if (strcmp(modeR, "A") == 0) -+ // { -+ // opts->slot2_on = 1; -+ // opts->slot_preference = 1; -+ // } -+ // else //if any other condition, then give no preference to either one -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 1; -+ // opts->slot_preference = 2; -+ // } -+ - //if TG Hold in place, mute anything but that TG #132 -- if (state->tg_hold != 0 && state->tg_hold != TGL) encL = 1; -- if (state->tg_hold != 0 && state->tg_hold != TGR) encR = 1; -- //likewise, override and unmute if TG hold matches TG -- if (state->tg_hold != 0 && state->tg_hold == TGL) encL = 0; -- if (state->tg_hold != 0 && state->tg_hold == TGR) encR = 0; -+ if (state->tg_hold != 0 && state->tg_hold != TGL) -+ encL = 1; -+ if (state->tg_hold != 0 && state->tg_hold != TGR) -+ encR = 1; -+ -+ //likewise, override and unmute if TG hold matches TG (and turn on slot and set preference) -+ if (state->tg_hold != 0 && state->tg_hold == TGL) -+ { -+ encL = 0; -+ opts->slot1_on = 1; -+ opts->slot_preference = 0; -+ } -+ else if (state->tg_hold != 0 && state->tg_hold == TGR) -+ { -+ encR = 0; -+ opts->slot2_on = 1; -+ opts->slot_preference = 1; -+ } -+ else //otherwise, reset slot preference to either or (both slots enabled) -+ { -+ opts->slot_preference = 2; -+ } -+ -+ //convert the left or right channel to both channels if single voice under certain conditions, if defined to do so -+ #define DMR_STEREO_OUTPUT -+ -+ #ifdef DMR_STEREO_OUTPUT -+ if (encL) memset (state->s_l4, 0, sizeof(state->s_l4)); -+ if (encR) memset (state->s_r4, 0, sizeof(state->s_r4)); -+ //this is for playing single voice over both channels, or when to keep them seperated -+ if (opts->slot1_on == 0 && opts->slot2_on == 1 && encR == 0) //slot 1 is hard off and slot 2 is on -+ memcpy (state->s_l4, state->s_r4, sizeof(state->s_l4)); //copy right to left -+ else if (opts->slot1_on == 1 && opts->slot2_on == 0 && encL == 0) //slot 2 is hard off and slot 1 is on -+ memcpy (state->s_r4, state->s_l4, sizeof(state->s_r4)); //copy left to right -+ else if (opts->slot_preference == 0 && state->dmrburstL == 16 && encL == 0) //slot 1 is preferred, and voice in slot 1 -+ memcpy (state->s_r4, state->s_l4, sizeof(state->s_r4)); //copy left to right -+ else if (opts->slot_preference == 1 && state->dmrburstR == 16 && encR == 0) //slot 2 is preferred, and voice in slot 2 -+ memcpy (state->s_l4, state->s_r4, sizeof(state->s_l4)); //copy right to left -+ else if (state->dmrburstL == 16 && state->dmrburstR != 16 && encL == 0) //voice in left, no voice in right -+ memcpy (state->s_r4, state->s_l4, sizeof(state->s_r4)); //copy left to right -+ else if (state->dmrburstR == 16 && state->dmrburstL != 16 && encR == 0) //voice in right, no voice in left -+ memcpy (state->s_l4, state->s_r4, sizeof(state->s_l4)); //copy right to left -+ //else if voice in both, and both slots on, and no preference on slot, then regular stereo interleave (left and right channels) -+ -+ //if both slots are the same now, then let's decimate the audio to keep the audio level consistent -+ // if (memcmp (state->s_l4, state->s_r4, sizeof(state->s_l4)) == 0) -+ { -+ for (int j = 0; j < 3; j++) -+ { -+ for (i = 0; i < 160; i++) -+ { -+ state->s_l4[j][i] /= 2; -+ state->s_r4[j][i] /= 2; -+ } -+ } -+ } -+ -+ #endif -+ -+ //check this last -+ if (opts->slot1_on == 0 && opts->slot2_on == 0) //both slots are hard off, disable playback -+ { -+ encL = 1; -+ encR = 1; -+ } -+ -+ //at this point, if both channels are still flagged as enc, then we can skip all playback/writing functions -+ if (encL && encR) -+ goto SS3_END; - - //interleave left and right channels from the short storage area - for (i = 0; i < 160; i++) - { -+ #ifdef DMR_STEREO_OUTPUT -+ #else - if (!encL) -+ #endif - stereo_samp1[i*2+0] = state->s_l4[0][i]; -+ #ifdef DMR_STEREO_OUTPUT -+ #else - if (!encR) -+ #endif - stereo_samp1[i*2+1] = state->s_r4[0][i]; - } - - for (i = 0; i < 160; i++) - { -+ #ifdef DMR_STEREO_OUTPUT -+ #else - if (!encL) -+ #endif - stereo_samp2[i*2+0] = state->s_l4[1][i]; -+ #ifdef DMR_STEREO_OUTPUT -+ #else - if (!encR) -+ #endif - stereo_samp2[i*2+1] = state->s_r4[1][i]; - } - - for (i = 0; i < 160; i++) - { -+ #ifdef DMR_STEREO_OUTPUT -+ #else - if (!encL) -+ #endif - stereo_samp3[i*2+0] = state->s_l4[2][i]; -+ #ifdef DMR_STEREO_OUTPUT -+ #else - if (!encR) -+ #endif - stereo_samp3[i*2+1] = state->s_r4[2][i]; - } - -- //at this point, if both channels are still flagged as enc, then we can skip all playback/writing functions -- if (encL && encR) -- goto SS3_END; -- - if (opts->audio_out_type == 0) //Pulse Audio - { - pa_simple_write(opts->pulse_digi_dev_out, stereo_samp1, 320*2, NULL); -@@ -1238,6 +1354,274 @@ void playSynthesizedVoiceSS4 (dsd_opts * opts, dsd_state * state) - - } - -+//short stereo mix 18v superframe -+void playSynthesizedVoiceSS18 (dsd_opts * opts, dsd_state * state) -+{ -+ -+ //NOTE: This will run once every superframe during a sacch field -+ //exact implementation to be determined -+ -+ int i, j; -+ uint8_t encL, encR; -+ -+ short stereo_sf[18][320]; //8k 2-channel stereo interleave mix for full superframe -+ // memset (stereo_sf, 1, 18*sizeof(short)); //I don't think 18*sizeof(short) was large enough, should probably be 18*320*sizeof(short) -+ memset (stereo_sf, 0, sizeof(stereo_sf)); -+ -+ short empty[320]; -+ memset (empty, 0, sizeof(empty)); -+ -+ //p25p2 enc checkdown for whether or not to fill the stereo sample or not for playback or writing -+ encL = encR = 1; -+ if (state->payload_algid == 0 || state->payload_algid == 0x80) -+ encL = 0; -+ if (state->payload_algidR == 0 || state->payload_algidR == 0x80) -+ encR = 0; -+ -+ //checkdown to see if we can lift the 'mute' if a key is available -+ if (encL) -+ { -+ if (state->payload_algid == 0xAA) -+ { -+ if (state->R != 0) -+ { -+ encL = 0; -+ } -+ } -+ } -+ -+ if (encR) -+ { -+ if (state->payload_algidR == 0xAA) -+ { -+ if (state->RR != 0) -+ { -+ encR = 0; -+ } -+ } -+ } -+ -+ //WIP: Mute if on B list (or not W list) -+ char modeL[8]; -+ sprintf (modeL, "%s", ""); -+ char modeR[8]; -+ sprintf (modeR, "%s", ""); -+ -+ int TGL = state->lasttg; -+ int TGR = state->lasttgR; -+ -+ //if we are using allow/whitelist mode, then write 'B' to mode for block -+ //comparison below will look for an 'A' to write to mode if it is allowed -+ if (opts->trunk_use_allow_list == 1) -+ { -+ sprintf (modeL, "%s", "B"); -+ sprintf (modeR, "%s", "B"); -+ -+ } -+ -+ for (i = 0; i < state->group_tally; i++) -+ { -+ if (state->group_array[i].groupNumber == TGL) -+ { -+ strcpy (modeL, state->group_array[i].groupMode); -+ // break; //need to keep going to check other potential slot group -+ } -+ if (state->group_array[i].groupNumber == TGR) -+ { -+ strcpy (modeR, state->group_array[i].groupMode); -+ // break; //need to keep going to check other potential slot group -+ } -+ } -+ -+ //flag either left or right as 'enc' to mute if B -+ if (strcmp(modeL, "B") == 0) encL = 1; -+ if (strcmp(modeR, "B") == 0) encR = 1; -+ -+ //check to see if we need to enable slot and toggle slot preference here -+ //this method will always favor slot 2 (this is a patch anyways, so....meh) -+ // if (strcmp(modeL, "A") == 0) -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot_preference = 0; -+ // } -+ // if (strcmp(modeR, "A") == 0) -+ // { -+ // opts->slot2_on = 1; -+ // opts->slot_preference = 1; -+ // } -+ -+ //check to see if we need to enable slot and toggle slot preference here -+ //if both groups allowed, then give no preference to either one (not sure this is needed now) -+ // if ( (strcmp(modeL, "A") == 0) && (strcmp(modeR, "A") == 0) ) -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 1; -+ // opts->slot_preference = 2; -+ // } -+ // else if (strcmp(modeL, "A") == 0) -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot_preference = 0; -+ // } -+ // else if (strcmp(modeR, "A") == 0) -+ // { -+ // opts->slot2_on = 1; -+ // opts->slot_preference = 1; -+ // } -+ // else //if any other condition, then give no preference to either one -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 1; -+ // opts->slot_preference = 2; -+ // } -+ -+ //if TG Hold in place, mute anything but that TG #132 -+ if (state->tg_hold != 0 && state->tg_hold != TGL) -+ encL = 1; -+ if (state->tg_hold != 0 && state->tg_hold != TGR) -+ encR = 1; -+ -+ //likewise, override and unmute if TG hold matches TG (and turn on slot and set preference) -+ if (state->tg_hold != 0 && state->tg_hold == TGL) -+ { -+ encL = 0; -+ opts->slot1_on = 1; -+ opts->slot_preference = 0; -+ } -+ else if (state->tg_hold != 0 && state->tg_hold == TGR) -+ { -+ encR = 0; -+ opts->slot2_on = 1; -+ opts->slot_preference = 1; -+ } -+ else //otherwise, reset slot preference to either or (both slots enabled) -+ { -+ opts->slot_preference = 2; -+ } -+ -+ //convert the left or right channel to both channels if single voice under certain conditions, if defined to do so -+ #define P2_STEREO_OUTPUT -+ -+ #ifdef P2_STEREO_OUTPUT -+ if (encL) memset (state->s_l4, 0, sizeof(state->s_l4)); -+ if (encR) memset (state->s_r4, 0, sizeof(state->s_r4)); -+ //this is for playing single voice over both channels, or when to keep them seperated -+ if (opts->slot1_on == 0 && opts->slot2_on == 1 && encR == 0) //slot 1 is hard off and slot 2 is on -+ memcpy (state->s_l4, state->s_r4, sizeof(state->s_l4)); //copy right to left -+ else if (opts->slot1_on == 1 && opts->slot2_on == 0 && encL == 0) //slot 2 is hard off and slot 1 is on -+ memcpy (state->s_r4, state->s_l4, sizeof(state->s_r4)); //copy left to right -+ else if (opts->slot_preference == 0 && state->dmrburstL == 21 && encL == 0) //slot 1 is preferred, and voice in slot 1 -+ memcpy (state->s_r4, state->s_l4, sizeof(state->s_r4)); //copy left to right -+ else if (opts->slot_preference == 1 && state->dmrburstR == 21 && encR == 0) //slot 2 is preferred, and voice in slot 2 -+ memcpy (state->s_l4, state->s_r4, sizeof(state->s_l4)); //copy right to left -+ else if (state->dmrburstL == 21 && state->dmrburstR != 21 && encL == 0) //voice in left, no voice in right -+ memcpy (state->s_r4, state->s_l4, sizeof(state->s_r4)); //copy left to right -+ else if (state->dmrburstR == 21 && state->dmrburstL != 21 && encR == 0) //voice in right, no voice in left -+ memcpy (state->s_l4, state->s_r4, sizeof(state->s_l4)); //copy right to left -+ //else if voice in both, and both slots on, and no preference on slot, then regular stereo interleave (left and right channels) -+ -+ //if both slots are the same now, then let's decimate the audio to keep the audio level consistent -+ // if (memcmp (state->s_l4, state->s_r4, sizeof(state->s_l4)) == 0) -+ { -+ for (j = 0; j < 18; j++) -+ { -+ for (i = 0; i < 160; i++) -+ { -+ state->s_l4[j][i] /= 2; -+ state->s_r4[j][i] /= 2; -+ } -+ } -+ } -+ -+ #endif -+ -+ //check this last -+ if (opts->slot1_on == 0 && opts->slot2_on == 0) //both slots are hard off, disable playback -+ { -+ encL = 1; -+ encR = 1; -+ } -+ -+ //at this point, if both channels are still flagged as enc, then we can skip all playback/writing functions -+ if (encL && encR) -+ goto SS18_END; -+ -+ //interleave left and right channels from the short storage area -+ for (j = 0; j < 18; j++) -+ { -+ for (i = 0; i < 160; i++) -+ { -+ #ifdef P2_STEREO_OUTPUT -+ #else -+ if (!encL) -+ #endif -+ stereo_sf[j][i*2+0] = state->s_l4[j][i]; -+ #ifdef P2_STEREO_OUTPUT -+ #else -+ if (!encR) -+ #endif -+ stereo_sf[j][i*2+1] = state->s_r4[j][i]; -+ } -+ } -+ -+ if (opts->audio_out_type == 0) //Pulse Audio -+ { -+ for (j = 0; j < 18; j++) -+ { -+ if (memcmp(empty, stereo_sf[j], sizeof(empty)) != 0) //may not work as intended because its stereo and one will have something in it most likely -+ pa_simple_write(opts->pulse_digi_dev_out, stereo_sf[j], 320*2, NULL); -+ } -+ } -+ -+ if (opts->audio_out_type == 8) //UDP Audio -+ { -+ for (j = 0; j < 18; j++) -+ { -+ if (memcmp(empty, stereo_sf[j], sizeof(empty)) != 0) //may not work as intended because its stereo and one will have something in it most likely -+ udp_socket_blaster (opts, state, 320*2, stereo_sf[j]); -+ } -+ } -+ -+ -+ if (opts->audio_out_type == 1 || opts->audio_out_type == 2) //STDOUT or OSS 8k/2channel -+ { -+ for (j = 0; j < 18; j++) -+ { -+ if (memcmp(empty, stereo_sf[j], sizeof(empty)) != 0) //may not work as intended because its stereo and one will have something in it most likely -+ write (opts->audio_out_fd, stereo_sf[j], 320*2); -+ } -+ } -+ -+ SS18_END: -+ -+ //run cleanup since we pulled stuff from processAudio -+ state->audio_out_idx = 0; -+ state->audio_out_idxR = 0; -+ -+ //set float temp buffer to baseline -+ memset (state->s_l4, 0, sizeof(state->s_l4)); -+ memset (state->s_r4, 0, sizeof(state->s_r4)); -+ -+ if (state->audio_out_idx2 >= 800000) -+ { -+ state->audio_out_float_buf_p = state->audio_out_float_buf + 100; -+ state->audio_out_buf_p = state->audio_out_buf + 100; -+ memset (state->audio_out_float_buf, 0, 100 * sizeof (float)); -+ memset (state->audio_out_buf, 0, 100 * sizeof (short)); -+ state->audio_out_idx2 = 0; -+ } -+ -+ if (state->audio_out_idx2R >= 800000) -+ { -+ state->audio_out_float_buf_pR = state->audio_out_float_bufR + 100; -+ state->audio_out_buf_pR = state->audio_out_bufR + 100; -+ memset (state->audio_out_float_bufR, 0, 100 * sizeof (float)); -+ memset (state->audio_out_bufR, 0, 100 * sizeof (short)); -+ state->audio_out_idx2R = 0; -+ } -+ -+} -+ - //largely borrowed from Boatbod OP25 (simplified single tone ID version) - void soft_tonef (float samp[160], int n, int ID, int AD) - { -diff --git a/src/dsd_main.c b/src/dsd_main.c -index d116ac4..79dd281 100644 ---- a/src/dsd_main.c -+++ b/src/dsd_main.c -@@ -382,6 +382,8 @@ if(opts->frame_m17 == 1) //&& opts->audio_in_type == 5 - } - state->fourv_counter[0] = 0; - state->fourv_counter[1] = 0; -+ state->voice_counter[0] = 0; -+ state->voice_counter[1] = 0; - - //values displayed in ncurses terminal - // state->p25_vc_freq[0] = 0; -@@ -746,7 +748,7 @@ initOpts (dsd_opts * opts) - //slot preference is used during OSS audio playback to - //prefer one tdma voice slot over another when both are playing back - //this is a fix to OSS 48k/1 output -- opts->slot_preference = 0; //default prefer slot 1 -- state->currentslot = 0; -+ opts->slot_preference = 2; //default prefer slot 1 -- state->currentslot = 0; - - //hardset slots to synthesize - opts->slot1_on = 1; -@@ -942,6 +944,8 @@ initState (dsd_state * state) - } - state->fourv_counter[0] = 0; - state->fourv_counter[1] = 0; -+ state->voice_counter[0] = 0; -+ state->voice_counter[1] = 0; - - state->K = 0; - state->R = 0; -diff --git a/src/dsd_ncurses.c b/src/dsd_ncurses.c -index 982a178..701a6b1 100644 ---- a/src/dsd_ncurses.c -+++ b/src/dsd_ncurses.c -@@ -2576,11 +2576,11 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) - { - printw ("| Voice Error: [%i][%i] Slot 1 (1)", state->errs, state->errs2); - if (opts->slot1_on == 0) printw (" OFF"); -- if (opts->slot1_on == 1) printw (" ON"); -+ if (opts->slot1_on == 1) printw (" ON"); if (opts->slot_preference == 0) printw (" *Preferred"); - printw ("\n"); - printw ("| Voice Error: [%i][%i] Slot 2 (2)", state->errsR, state->errs2R); - if (opts->slot2_on == 0) printw (" OFF"); -- if (opts->slot2_on == 1) printw (" ON"); -+ if (opts->slot2_on == 1) printw (" ON"); if (opts->slot_preference == 1) printw (" *Preferred"); - printw ("\n"); - } - printw ("------------------------------------------------------------------------------\n"); -@@ -3662,8 +3662,8 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) - //switching, but want to control each seperately plz - if (opts->slot1_on == 1) - { -- opts->slot1_on = 0; -- opts->slot_preference = 1; //slot 2 -+ opts->slot1_on = 0; if (opts->slot_preference == 0) opts->slot_preference = 2; -+ // opts->slot_preference = 1; //slot 2 - //clear any previously buffered audio - state->audio_out_float_buf_p = state->audio_out_float_buf + 100; - state->audio_out_buf_p = state->audio_out_buf + 100; -@@ -3688,8 +3688,8 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) - //switching, but want to control each seperately plz - if (opts->slot2_on == 1) - { -- opts->slot2_on = 0; -- opts->slot_preference = 0; //slot 1 -+ opts->slot2_on = 0; if (opts->slot_preference == 1) opts->slot_preference = 2; -+ // opts->slot_preference = 0; //slot 1 - //clear any previously buffered audio - state->audio_out_float_buf_pR = state->audio_out_float_bufR + 100; - state->audio_out_buf_pR = state->audio_out_bufR + 100; -@@ -3709,6 +3709,13 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) - } - } - -+ if (c == 51) //'3' key, cycle slot preferences -+ { -+ if (opts->slot_preference < 2) -+ opts->slot_preference++; -+ else opts->slot_preference = 0; -+ } -+ - if (c == 43) //+ key, increment audio_gain - { - -diff --git a/src/p25p1_mdpu.c b/src/p25p1_mdpu.c -index 7d29860..f216d4b 100644 ---- a/src/p25p1_mdpu.c -+++ b/src/p25p1_mdpu.c -@@ -77,6 +77,13 @@ static uint32_t crc32mbf(uint8_t * buf, int len) - void processMPDU(dsd_opts * opts, dsd_state * state) - { - -+ //p25p2 18v reset counters and buffers -+ state->voice_counter[0] = 0; //reset -+ state->voice_counter[1] = 0; //reset -+ memset (state->s_l4, 0, sizeof(state->s_l4)); -+ memset (state->s_r4, 0, sizeof(state->s_r4)); -+ opts->slot_preference = 2; -+ - //reset some strings when returning from a call in case they didn't get zipped already - sprintf (state->call_string[0], "%s", " "); //21 spaces - sprintf (state->call_string[1], "%s", " "); //21 spaces -diff --git a/src/p25p1_tsbk.c b/src/p25p1_tsbk.c -index c801b7f..4d42fd3 100644 ---- a/src/p25p1_tsbk.c -+++ b/src/p25p1_tsbk.c -@@ -11,6 +11,14 @@ - void processTSBK(dsd_opts * opts, dsd_state * state) - { - -+ //p25p2 18v reset counters and buffers -+ state->voice_counter[0] = 0; //reset -+ state->voice_counter[1] = 0; //reset -+ memset (state->s_l4, 0, sizeof(state->s_l4)); -+ memset (state->s_r4, 0, sizeof(state->s_r4)); -+ opts->slot_preference = 2; -+ -+ - //reset some strings when returning from a call in case they didn't get zipped already - sprintf (state->call_string[0], "%s", " "); //21 spaces - sprintf (state->call_string[1], "%s", " "); //21 spaces -diff --git a/src/p25p2_frame.c b/src/p25p2_frame.c -index b27b79e..427161d 100644 ---- a/src/p25p2_frame.c -+++ b/src/p25p2_frame.c -@@ -490,18 +490,27 @@ void process_4V (dsd_opts * opts, dsd_state * state) - // else state->dmrburstR = 21; - // } - // #endif -+ -+ //unsure of the best location for these counter resets -+ if (state->voice_counter[0] >= 18) -+ state->voice_counter[0] = 0; -+ -+ if (state->voice_counter[1] >= 18) -+ state->voice_counter[1] = 0; - - processMbeFrame (opts, state, NULL, ambe_fr1, NULL); - if(state->currentslot == 0) - { - memcpy(state->f_l4[0], state->audio_out_temp_buf, sizeof(state->audio_out_temp_buf)); -- memcpy(state->s_l4[0], state->s_l, sizeof(state->s_l)); -+ // memcpy(state->s_l4[0], state->s_l, sizeof(state->s_l)); -+ memcpy(state->s_l4[(state->voice_counter[0]++)%18], state->s_l, sizeof(state->s_l)); - memcpy(state->s_l4u[0], state->s_lu, sizeof(state->s_lu)); - } - else - { - memcpy(state->f_r4[0], state->audio_out_temp_bufR, sizeof(state->audio_out_temp_bufR)); -- memcpy(state->s_r4[0], state->s_r, sizeof(state->s_r)); -+ // memcpy(state->s_r4[0], state->s_r, sizeof(state->s_r)); -+ memcpy(state->s_r4[(state->voice_counter[1]++)%18], state->s_r, sizeof(state->s_r)); - memcpy(state->s_r4u[0], state->s_ru, sizeof(state->s_ru)); - } - -@@ -509,13 +518,15 @@ void process_4V (dsd_opts * opts, dsd_state * state) - if(state->currentslot == 0) - { - memcpy(state->f_l4[1], state->audio_out_temp_buf, sizeof(state->audio_out_temp_buf)); -- memcpy(state->s_l4[1], state->s_l, sizeof(state->s_l)); -+ // memcpy(state->s_l4[1], state->s_l, sizeof(state->s_l)); -+ memcpy(state->s_l4[(state->voice_counter[0]++)%18], state->s_l, sizeof(state->s_l)); - memcpy(state->s_l4u[1], state->s_lu, sizeof(state->s_lu)); - } - else - { - memcpy(state->f_r4[1], state->audio_out_temp_bufR, sizeof(state->audio_out_temp_bufR)); -- memcpy(state->s_r4[1], state->s_r, sizeof(state->s_r)); -+ // memcpy(state->s_r4[1], state->s_r, sizeof(state->s_r)); -+ memcpy(state->s_r4[(state->voice_counter[1]++)%18], state->s_r, sizeof(state->s_r)); - memcpy(state->s_r4u[1], state->s_ru, sizeof(state->s_ru)); - } - -@@ -523,13 +534,15 @@ void process_4V (dsd_opts * opts, dsd_state * state) - if(state->currentslot == 0) - { - memcpy(state->f_l4[2], state->audio_out_temp_buf, sizeof(state->audio_out_temp_buf)); -- memcpy(state->s_l4[2], state->s_l, sizeof(state->s_l)); -+ // memcpy(state->s_l4[2], state->s_l, sizeof(state->s_l)); -+ memcpy(state->s_l4[(state->voice_counter[0]++)%18], state->s_l, sizeof(state->s_l)); - memcpy(state->s_l4u[2], state->s_lu, sizeof(state->s_lu)); - } - else - { - memcpy(state->f_r4[2], state->audio_out_temp_bufR, sizeof(state->audio_out_temp_bufR)); -- memcpy(state->s_r4[2], state->s_r, sizeof(state->s_r)); -+ // memcpy(state->s_r4[2], state->s_r, sizeof(state->s_r)); -+ memcpy(state->s_r4[(state->voice_counter[1]++)%18], state->s_r, sizeof(state->s_r)); - memcpy(state->s_r4u[2], state->s_ru, sizeof(state->s_ru)); - } - -@@ -537,13 +550,15 @@ void process_4V (dsd_opts * opts, dsd_state * state) - if(state->currentslot == 0) - { - memcpy(state->f_l4[3], state->audio_out_temp_buf, sizeof(state->audio_out_temp_buf)); -- memcpy(state->s_l4[3], state->s_l, sizeof(state->s_l)); -+ // memcpy(state->s_l4[3], state->s_l, sizeof(state->s_l)); -+ memcpy(state->s_l4[(state->voice_counter[0]++)%18], state->s_l, sizeof(state->s_l)); - memcpy(state->s_l4u[3], state->s_lu, sizeof(state->s_lu)); - } - else - { - memcpy(state->f_r4[3], state->audio_out_temp_bufR, sizeof(state->audio_out_temp_bufR)); -- memcpy(state->s_r4[3], state->s_r, sizeof(state->s_r)); -+ // memcpy(state->s_r4[3], state->s_r, sizeof(state->s_r)); -+ memcpy(state->s_r4[(state->voice_counter[1]++)%18], state->s_r, sizeof(state->s_r)); - memcpy(state->s_r4u[3], state->s_ru, sizeof(state->s_ru)); - } - -@@ -709,17 +724,26 @@ void process_2V (dsd_opts * opts, dsd_state * state) - // } - // #endif - -+ //unsure of the best location for these counter resets -+ if (state->voice_counter[0] >= 18) -+ state->voice_counter[0] = 0; -+ -+ if (state->voice_counter[1] >= 18) -+ state->voice_counter[1] = 0; -+ - processMbeFrame (opts, state, NULL, ambe_fr1, NULL); - if(state->currentslot == 0) - { - memcpy(state->f_l4[0], state->audio_out_temp_buf, sizeof(state->audio_out_temp_buf)); -- memcpy(state->s_l4[0], state->s_l, sizeof(state->s_l)); -+ // memcpy(state->s_l4[0], state->s_l, sizeof(state->s_l)); -+ memcpy(state->s_l4[(state->voice_counter[0]++)%18], state->s_l, sizeof(state->s_l)); - memcpy(state->s_l4u[0], state->s_lu, sizeof(state->s_lu)); - } - else - { - memcpy(state->f_r4[0], state->audio_out_temp_bufR, sizeof(state->audio_out_temp_bufR)); -- memcpy(state->s_r4[0], state->s_r, sizeof(state->s_r)); -+ // memcpy(state->s_r4[0], state->s_r, sizeof(state->s_r)); -+ memcpy(state->s_r4[(state->voice_counter[1]++)%18], state->s_r, sizeof(state->s_r)); - memcpy(state->s_r4u[0], state->s_ru, sizeof(state->s_ru)); - } - -@@ -727,17 +751,19 @@ void process_2V (dsd_opts * opts, dsd_state * state) - if(state->currentslot == 0) - { - memcpy(state->f_l4[1], state->audio_out_temp_buf, sizeof(state->audio_out_temp_buf)); -- memcpy(state->s_l4[1], state->s_l, sizeof(state->s_l)); -+ // memcpy(state->s_l4[1], state->s_l, sizeof(state->s_l)); -+ memcpy(state->s_l4[(state->voice_counter[0]++)%18], state->s_l, sizeof(state->s_l)); - memcpy(state->s_l4u[1], state->s_lu, sizeof(state->s_lu)); - - } - else - { - memcpy(state->f_r4[1], state->audio_out_temp_bufR, sizeof(state->audio_out_temp_bufR)); -- memcpy(state->s_r4[1], state->s_r, sizeof(state->s_r)); -+ // memcpy(state->s_r4[1], state->s_r, sizeof(state->s_r)); -+ memcpy(state->s_r4[(state->voice_counter[1]++)%18], state->s_r, sizeof(state->s_r)); - memcpy(state->s_r4u[1], state->s_ru, sizeof(state->s_ru)); - } -- -+ // if (state->currentslot == 0) state->voice_counter[0] = 0; if (state->currentslot == 1) state->voice_counter[1] = 0; - process_ESS(opts, state); - - //reset drop bytes after a 2V -@@ -934,6 +960,8 @@ void process_P2_DUID (dsd_opts * opts, dsd_state * state) - state->p2_is_lcch = 0; - state->fourv_counter[0] = 0; - state->fourv_counter[1] = 0; -+ state->voice_counter[0] = 0; -+ state->voice_counter[1] = 0; - - goto END; - } -@@ -953,8 +981,35 @@ void process_P2_DUID (dsd_opts * opts, dsd_state * state) - if (sacch == 0 && ts_counter & 1 && opts->floating_point == 1 && opts->pulse_digi_rate_out == 8000) - playSynthesizedVoiceFS4 (opts, state); - -- if (sacch == 0 && ts_counter & 1 && opts->floating_point == 0 && opts->pulse_digi_rate_out == 8000) -- playSynthesizedVoiceSS4 (opts, state); -+ // if (sacch == 0 && ts_counter & 1 && opts->floating_point == 0 && opts->pulse_digi_rate_out == 8000) -+ // playSynthesizedVoiceSS4 (opts, state); -+ -+ // fprintf (stderr, " VCH0: %d;", state->voice_counter[0]); //debug -+ // fprintf (stderr, " VCH1: %d;", state->voice_counter[1]); //debug -+ -+ //this works, but may still have an element of 'dual voice stutter' which was my initial complaint, but shouldn't 'lag' during trunking operations (hopefully) -+ if ( (state->voice_counter[0] >= 18 || state->voice_counter[1] >= 18 ) && opts->floating_point == 0 && opts->pulse_digi_rate_out == 8000 && ts_counter & 1) -+ { -+ //debug test, see what each counter is at during playback on dual voice -+ // fprintf (stderr, " VC1: %02d; VC2: %02d;", state->voice_counter[0], state->voice_counter[1] ); -+ -+ playSynthesizedVoiceSS18 (opts, state); -+ state->voice_counter[0] = 0; //reset -+ state->voice_counter[1] = 0; //reset -+ } -+ -+ //these two will work, but NOT at the same time on dual voice -+ // if (state->voice_counter[0] >= 18 && opts->floating_point == 0 && opts->pulse_digi_rate_out == 8000) //&& ts_counter & 1 -+ // { -+ // playSynthesizedVoiceSS18 (opts, state); -+ // state->voice_counter[0] = 0; //reset -+ // } -+ -+ // if (state->voice_counter[1] >= 18 && opts->floating_point == 0 && opts->pulse_digi_rate_out == 8000) //&& ts_counter & 1 -+ // { -+ // playSynthesizedVoiceSS18 (opts, state); -+ // state->voice_counter[1] = 0; //reset -+ // } - - //debug: fix burst indicator for ncurses if marginal signal - // if (voice) -diff --git a/src/p25p2_vpdu.c b/src/p25p2_vpdu.c -index 468b71a..06edae6 100644 ---- a/src/p25p2_vpdu.c -+++ b/src/p25p2_vpdu.c -@@ -154,16 +154,16 @@ void process_MAC_VPDU(dsd_opts * opts, dsd_state * state, int type, unsigned lon - - //shim fix to stutter/lag by only enabling slot on the target/channel we tuned to - //this will only occur in realtime tuning, not not required .bin or .wav playback -- if (channel & 1) //VCH1 -- { -- opts->slot1_on = 0; -- opts->slot2_on = 1; -- } -- else //VCH0 -- { -- opts->slot1_on = 1; -- opts->slot2_on = 0; -- } -+ // if (channel & 1) //VCH1 -+ // { -+ // opts->slot1_on = 0; -+ // opts->slot2_on = 1; -+ // } -+ // else //VCH0 -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 0; -+ // } - - } - } -@@ -254,16 +254,16 @@ void process_MAC_VPDU(dsd_opts * opts, dsd_state * state, int type, unsigned lon - - //shim fix to stutter/lag by only enabling slot on the target/channel we tuned to - //this will only occur in realtime tuning, not not required .bin or .wav playback -- if (channel & 1) //VCH1 -- { -- opts->slot1_on = 0; -- opts->slot2_on = 1; -- } -- else //VCH0 -- { -- opts->slot1_on = 1; -- opts->slot2_on = 0; -- } -+ // if (channel & 1) //VCH1 -+ // { -+ // opts->slot1_on = 0; -+ // opts->slot2_on = 1; -+ // } -+ // else //VCH0 -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 0; -+ // } - - } - } -@@ -385,16 +385,16 @@ void process_MAC_VPDU(dsd_opts * opts, dsd_state * state, int type, unsigned lon - - //shim fix to stutter/lag by only enabling slot on the target/channel we tuned to - //this will only occur in realtime tuning, not not required .bin or .wav playback -- if (tunable_chan & 1) //VCH1 -- { -- opts->slot1_on = 0; -- opts->slot2_on = 1; -- } -- else //VCH0 -- { -- opts->slot1_on = 1; -- opts->slot2_on = 0; -- } -+ // if (tunable_chan & 1) //VCH1 -+ // { -+ // opts->slot1_on = 0; -+ // opts->slot2_on = 1; -+ // } -+ // else //VCH0 -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 0; -+ // } - - } - } -@@ -510,16 +510,16 @@ void process_MAC_VPDU(dsd_opts * opts, dsd_state * state, int type, unsigned lon - - //shim fix to stutter/lag by only enabling slot on the target/channel we tuned to - //this will only occur in realtime tuning, not not required .bin or .wav playback -- if (channel & 1) //VCH1 -- { -- opts->slot1_on = 0; -- opts->slot2_on = 1; -- } -- else //VCH0 -- { -- opts->slot1_on = 1; -- opts->slot2_on = 0; -- } -+ // if (channel & 1) //VCH1 -+ // { -+ // opts->slot1_on = 0; -+ // opts->slot2_on = 1; -+ // } -+ // else //VCH0 -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 0; -+ // } - - } - } -@@ -641,16 +641,16 @@ void process_MAC_VPDU(dsd_opts * opts, dsd_state * state, int type, unsigned lon - - //shim fix to stutter/lag by only enabling slot on the target/channel we tuned to - //this will only occur in realtime tuning, not not required .bin or .wav playback -- if (channel & 1) //VCH1 -- { -- opts->slot1_on = 0; -- opts->slot2_on = 1; -- } -- else //VCH0 -- { -- opts->slot1_on = 1; -- opts->slot2_on = 0; -- } -+ // if (channel & 1) //VCH1 -+ // { -+ // opts->slot1_on = 0; -+ // opts->slot2_on = 1; -+ // } -+ // else //VCH0 -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 0; -+ // } - } - - } -@@ -747,16 +747,16 @@ void process_MAC_VPDU(dsd_opts * opts, dsd_state * state, int type, unsigned lon - - //shim fix to stutter/lag by only enabling slot on the target/channel we tuned to - //this will only occur in realtime tuning, not not required .bin or .wav playback -- if (channel & 1) //VCH1 -- { -- opts->slot1_on = 0; -- opts->slot2_on = 1; -- } -- else //VCH0 -- { -- opts->slot1_on = 1; -- opts->slot2_on = 0; -- } -+ // if (channel & 1) //VCH1 -+ // { -+ // opts->slot1_on = 0; -+ // opts->slot2_on = 1; -+ // } -+ // else //VCH0 -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 0; -+ // } - } - - } -@@ -917,16 +917,16 @@ void process_MAC_VPDU(dsd_opts * opts, dsd_state * state, int type, unsigned lon - - //shim fix to stutter/lag by only enabling slot on the target/channel we tuned to - //this will only occur in realtime tuning, not not required .bin or .wav playback -- if (tunable_chan & 1) //VCH1 -- { -- opts->slot1_on = 0; -- opts->slot2_on = 1; -- } -- else //VCH0 -- { -- opts->slot1_on = 1; -- opts->slot2_on = 0; -- } -+ // if (tunable_chan & 1) //VCH1 -+ // { -+ // opts->slot1_on = 0; -+ // opts->slot2_on = 1; -+ // } -+ // else //VCH0 -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 0; -+ // } - - } - } -@@ -1108,16 +1108,16 @@ void process_MAC_VPDU(dsd_opts * opts, dsd_state * state, int type, unsigned lon - - //shim fix to stutter/lag by only enabling slot on the target/channel we tuned to - //this will only occur in realtime tuning, not not required .bin or .wav playback -- if (tunable_chan & 1) //VCH1 -- { -- opts->slot1_on = 0; -- opts->slot2_on = 1; -- } -- else //VCH0 -- { -- opts->slot1_on = 1; -- opts->slot2_on = 0; -- } -+ // if (tunable_chan & 1) //VCH1 -+ // { -+ // opts->slot1_on = 0; -+ // opts->slot2_on = 1; -+ // } -+ // else //VCH0 -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 0; -+ // } - - } - } -@@ -1244,16 +1244,16 @@ void process_MAC_VPDU(dsd_opts * opts, dsd_state * state, int type, unsigned lon - - //shim fix to stutter/lag by only enabling slot on the target/channel we tuned to - //this will only occur in realtime tuning, not not required .bin or .wav playback -- if (tunable_chan & 1) //VCH1 -- { -- opts->slot1_on = 0; -- opts->slot2_on = 1; -- } -- else //VCH0 -- { -- opts->slot1_on = 1; -- opts->slot2_on = 0; -- } -+ // if (tunable_chan & 1) //VCH1 -+ // { -+ // opts->slot1_on = 0; -+ // opts->slot2_on = 1; -+ // } -+ // else //VCH0 -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 0; -+ // } - - } - } -@@ -1373,16 +1373,16 @@ void process_MAC_VPDU(dsd_opts * opts, dsd_state * state, int type, unsigned lon - - //shim fix to stutter/lag by only enabling slot on the target/channel we tuned to - //this will only occur in realtime tuning, not not required .bin or .wav playback -- if (channelt & 1) //VCH1 -- { -- opts->slot1_on = 0; -- opts->slot2_on = 1; -- } -- else //VCH0 -- { -- opts->slot1_on = 1; -- opts->slot2_on = 0; -- } -+ // if (channelt & 1) //VCH1 -+ // { -+ // opts->slot1_on = 0; -+ // opts->slot2_on = 1; -+ // } -+ // else //VCH0 -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 0; -+ // } - - } - -diff --git a/src/p25p2_xcch.c b/src/p25p2_xcch.c -index 8c72f79..efc23fd 100644 ---- a/src/p25p2_xcch.c -+++ b/src/p25p2_xcch.c -@@ -122,6 +122,7 @@ void process_SACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[180] - { - //reset fourv_counter and dropbyte on PTT - state->fourv_counter[0] = 0; -+ state->voice_counter[0] = 0; - state->dropL = 256; - - state->dmrburstL = 20; -@@ -171,6 +172,7 @@ void process_SACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[180] - { - //reset fourv_counter and dropbyte on PTT - state->fourv_counter[1] = 0; -+ state->voice_counter[1] = 0; - state->dropR = 256; - state->payload_algidR = 0; //zero this out as well - -@@ -230,6 +232,7 @@ void process_SACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[180] - { - - state->fourv_counter[0] = 0; -+ state->voice_counter[0] = 0; - state->dropL = 256; - state->dmrburstL = 23; - state->payload_algid = 0; -@@ -258,6 +261,7 @@ void process_SACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[180] - { - - state->fourv_counter[1] = 0; -+ state->voice_counter[1] = 0; - state->dropR = 256; - state->dmrburstR = 23; - state->payload_algidR = 0; -@@ -370,19 +374,19 @@ void process_SACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[180] - process_MAC_VPDU(opts, state, 1, SMAC); - fprintf (stderr, "%s", KNRM); - -- if (opts->p25_trunk == 1 && opts->p25_is_tuned == 1) -- { -- if (state->currentslot == 1) -- { -- opts->slot1_on = 0; -- opts->slot2_on = 1; -- } -- else -- { -- opts->slot1_on = 1; -- opts->slot2_on = 0; -- } -- } -+ // if (opts->p25_trunk == 1 && opts->p25_is_tuned == 1) -+ // { -+ // if (state->currentslot == 1) -+ // { -+ // opts->slot1_on = 0; -+ // opts->slot2_on = 1; -+ // } -+ // else -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 0; -+ // } -+ // } - - //blank the call string here -- slot variable is already flipped accordingly for sacch - sprintf (state->call_string[slot], "%s", " "); //21 spaces -@@ -512,6 +516,7 @@ void process_FACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[156] - { - //reset fourv_counter and dropbyte on PTT - state->fourv_counter[0] = 0; -+ state->voice_counter[0] = 0; - state->dropL = 256; - - state->dmrburstL = 20; -@@ -552,6 +557,7 @@ void process_FACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[156] - { - //reset fourv_counter and dropbyte on PTT - state->fourv_counter[1] = 0; -+ state->voice_counter[1] = 0; - state->dropR = 256; - - state->dmrburstR = 20; -@@ -608,6 +614,7 @@ void process_FACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[156] - { - - state->fourv_counter[0] = 0; -+ state->voice_counter[0] = 0; - state->dropL = 256; - state->dmrburstL = 23; - state->payload_algid = 0; //zero this out as well -@@ -636,6 +643,7 @@ void process_FACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[156] - { - - state->fourv_counter[1] = 0; -+ state->voice_counter[1] = 0; - state->dropR = 256; - state->dmrburstR = 23; - state->payload_algidR = 0; //zero this out as well -@@ -737,6 +745,7 @@ void process_FACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[156] - state->payload_keyid = 0; - state->dmrburstL = 24; - state->fourv_counter[0] = 0; -+ state->voice_counter[0] = 0; - state->lastsrc = 0; - state->lasttg = 0; - -@@ -747,6 +756,7 @@ void process_FACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[156] - state->payload_keyidR = 0; - state->dmrburstR = 24; - state->fourv_counter[1] = 0; -+ state->voice_counter[1] = 0; - state->lastsrcR = 0; - state->lasttgR = 0; - -@@ -756,19 +766,19 @@ void process_FACCH_MAC_PDU (dsd_opts * opts, dsd_state * state, int payload[156] - process_MAC_VPDU(opts, state, 0, FMAC); - fprintf (stderr, "%s", KNRM); - -- if (opts->p25_trunk == 1 && opts->p25_is_tuned == 1) -- { -- if (state->currentslot == 0) -- { -- opts->slot1_on = 0; -- opts->slot2_on = 1; -- } -- else -- { -- opts->slot1_on = 1; -- opts->slot2_on = 0; -- } -- } -+ // if (opts->p25_trunk == 1 && opts->p25_is_tuned == 1) -+ // { -+ // if (state->currentslot == 0) -+ // { -+ // opts->slot1_on = 0; -+ // opts->slot2_on = 1; -+ // } -+ // else -+ // { -+ // opts->slot1_on = 1; -+ // opts->slot2_on = 0; -+ // } -+ // } - - //blank the call string here - sprintf (state->call_string[slot], "%s", " "); //21 spaces diff --git a/patch/faster_cap_plus_rest_lsn_testing.patch b/patch/faster_cap_plus_rest_lsn_testing.patch deleted file mode 100644 index 37ba238..0000000 --- a/patch/faster_cap_plus_rest_lsn_testing.patch +++ /dev/null @@ -1,200 +0,0 @@ -diff --git a/src/dmr_csbk.c b/src/dmr_csbk.c -index 477711f..eb8fb1d 100644 ---- a/src/dmr_csbk.c -+++ b/src/dmr_csbk.c -@@ -423,6 +423,10 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 - //check the p_clear logic and report status - if (clear && csbk_fid == 255) fprintf (stderr, " Slot %d No Encrypted Call Trunking; Slot %d Free; Return to CC; ", pslot, oslot); - else if (!clear && csbk_fid == 255) fprintf (stderr, " Slot %d No Encrypted Call Trunking; Slot %d Busy; Remain on VC;", pslot, oslot); -+ else if (clear && csbk_fid == 254) fprintf (stderr, " Cap+ Rest LSN Change: %d; Slot %d Free; Slot %d Free; Go To Rest LSN;", state->dmr_rest_channel, pslot, oslot); //disabled -+ else if (!clear && csbk_fid == 254) fprintf (stderr, " Cap+ Rest LSN Change: %d; Slot %d Free; Slot %d Busy; Remain on LSN;", state->dmr_rest_channel, pslot, oslot); //disabled -+ else if (clear && csbk_fid == 253) fprintf (stderr, " Cap+ Rest LSN Change: %d; No CSBK Channel Activity; Go To Rest LSN;", state->dmr_rest_channel); -+ else if (!clear && csbk_fid == 253) fprintf (stderr, " Cap+ Rest LSN Change: %d; CSBK Channel Activity; Remain on LSN;", state->dmr_rest_channel); //this should never happen in code - else if (!clear) fprintf (stderr, " Slot %d Clear; Slot %d Busy; Remain on VC;", pslot, oslot); - else if (clear == 1) fprintf (stderr, " Slot %d Clear; Slot %d Idle; Return to CC;", pslot, oslot); - else if (clear == 2 || clear == 3) fprintf (stderr, " Slot %d Clear; Slot %d Free; Return to CC;", pslot, oslot); -@@ -441,14 +445,14 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 - - //display/le/buzzer bug fix when p_clear activated (unsure why this was disabled) - //clear only the current slot initially, then clear both if tuning to a different freq -- if (state->currentslot == 0) -+ if (state->currentslot == 0 && csbk_fid != 253) //don't reset on Cap+ since we aren't testing based on the current TS - { - state->payload_mi = 0; - state->payload_algid = 0; - state->payload_keyid = 0; - state->dmr_so = 0; - } -- if (state->currentslot == 1) -+ if (state->currentslot == 1 && csbk_fid != 253) - { - state->payload_miR = 0; - state->payload_algidR = 0; -@@ -1199,6 +1203,7 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 - //tg and channel info for trunking purposes - uint16_t t_tg[24]; - char cap_active[20]; //local string to concantenate to active channel stuff -+ uint8_t empty[24]; //used to evaluate whether or not all channels are idle or not with memcmp after loading - - //sanity check - if (block_num > 6) -@@ -1211,6 +1216,7 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 - memset (t_tg, 0, sizeof(t_tg)); - memset (ch, 0, sizeof(ch)); - memset (pch, 0, sizeof(pch)); -+ memset (empty, 0, sizeof(empty)); - - //treating FL as a form of LCSS - if (fl == 2 || fl == 3) //initial or single block (fl2 or fl3) -@@ -1227,6 +1233,7 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 - state->cap_plus_block_num[ts]++; - } - -+ //move assignment until later when evaluating for a p_clear condition - if (rest_channel != state->dmr_rest_channel) - { - state->dmr_rest_channel = rest_channel; -@@ -1235,7 +1242,7 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 - //assign to cc freq to follow during no sync - if (state->trunk_chan_map[rest_channel] != 0) - { -- state->p25_cc_freq = state->trunk_chan_map[rest_channel]; -+ // state->p25_cc_freq = state->trunk_chan_map[rest_channel]; - //set to always tuned - opts->p25_is_tuned = 1; - } -@@ -1405,15 +1412,15 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 - tg = (uint16_t)ConvertBitIntoBytes(&state->cap_plus_csbk_bits[ts][(group_tally*8)+(x*16)+56], 16); //don't change this AGAIN!, this is correct! - if (tg != 0) fprintf (stderr, "%5d; ", tg); - else fprintf (stderr, " P||D; "); -- //flag as available for tuning if data calls enabled -- if (opts->trunk_tune_data_calls == 1) t_tg[i] = tg; //ch[i] = 1; -+ //flag as available for tuning if private calls enabled -+ if (opts->trunk_tune_private_calls == 1) t_tg[i] = tg; //ch[i] = 1; - if (tg != 0) x++; - - //add active channel to display string - - //NOTE: Consider only adding this if user toggled or else - //lots of short data bursts blink in and out -- if (1 == 1) //opts->trunk_tune_data_calls -+ if (1 == 1) //opts->trunk_tune_private_calls - { - sprintf (cap_active, "LSN:%d PC:%d; ", i+1, tg); - strcat (state->active_channel[i+1], cap_active); -@@ -1508,6 +1515,7 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 - SetFreq(opts->rigctl_sockfd, state->trunk_chan_map[j+1]); - state->p25_vc_freq[0] = state->p25_vc_freq[1] = state->trunk_chan_map[j+1]; - opts->p25_is_tuned = 1; //set to 1 to set as currently tuned so we don't keep tuning nonstop -+ state->last_vc_sync_time = time(NULL); - j = 11; //break loop - } - -@@ -1543,6 +1551,7 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 - // else fprintf (stderr, "\n DONT RTL LSN/TG to tune to: %d - %d", j+1, t_tg[j]); //debug - state->p25_vc_freq[0] = state->p25_vc_freq[1] = state->trunk_chan_map[j+1]; - opts->p25_is_tuned = 1; -+ state->last_vc_sync_time = time(NULL); - j = 11; //break loop - #endif - } -@@ -1570,6 +1579,25 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 - } - memset (state->cap_plus_csbk_bits[ts], 0, sizeof(state->cap_plus_csbk_bits[ts])); - state->cap_plus_block_num[ts] = 0; -+ -+ //check here to see if we can go to the current rest lsn, if not already on it -+ int busy = memcmp (empty, t_tg, sizeof(empty)); -+ -+ //testing (don't keep setting on quick data call LSN flip flops but same frequency for rest channel, other misc conditions) -+ // if (!busy && rest_channel != state->dmr_rest_channel && opts->p25_trunk == 1 && state->p25_cc_freq != state->trunk_chan_map[rest_channel]) -+ if (!busy && opts->p25_trunk == 1 && state->p25_cc_freq != state->trunk_chan_map[rest_channel]) -+ { -+ //assign now, ideally, this should always trigger a positive p_clear when needed -+ // state->dmr_rest_channel = rest_channel; -+ -+ //update frequency -+ if (state->trunk_chan_map[rest_channel] != 0) -+ state->p25_cc_freq = state->trunk_chan_map[rest_channel]; -+ -+ //Craft a fake CSBK pdu send it to run as a p_clear to go to rest channel if its available (no calls currently) -+ uint8_t dummy[12]; uint8_t* dbits; memset (dummy, 0, sizeof(dummy)); dummy[0] = 46; dummy[1] = 253; -+ dmr_cspdu (opts, state, dbits, dummy, 1, 0); -+ } - - } //if (fl == 1 || fl == 3) - } //opcode == 0x3E -diff --git a/src/dmr_flco.c b/src/dmr_flco.c -index 2811027..4ab36d4 100644 ---- a/src/dmr_flco.c -+++ b/src/dmr_flco.c -@@ -354,15 +354,18 @@ void dmr_flco (dsd_opts * opts, dsd_state * state, uint8_t lc_bits[], uint32_t C - - } - -- -- if (restchannel != state->dmr_rest_channel && restchannel != -1) -+ //only assign this value here if not trunking -+ // if (opts->p25_trunk == 0) //may be safe to always do this now with code changes, will want to test at some point (tg hold w/ dual voice / slco may optimally need this set) - { -- state->dmr_rest_channel = restchannel; -- //assign to cc freq -- if (state->trunk_chan_map[restchannel] != 0) -+ if (restchannel != state->dmr_rest_channel && restchannel != -1) - { -- state->p25_cc_freq = state->trunk_chan_map[restchannel]; -- } -+ state->dmr_rest_channel = restchannel; -+ //assign to cc freq -+ // if (state->trunk_chan_map[restchannel] != 0) -+ // { -+ // state->p25_cc_freq = state->trunk_chan_map[restchannel]; -+ // } -+ } - } - - if (type == 1) fprintf (stderr, "%s \n", KGRN); -@@ -1004,21 +1007,35 @@ void dmr_slco (dsd_opts * opts, dsd_state * state, uint8_t slco_bits[]) - else if (slco == 0xF) - { - fprintf (stderr, " SLCO Capacity Plus Site: %d - Rest LSN: %d - RS: %02X", capsite, restchannel, cap_reserved); -- //assign to cc freq if available -- if (state->trunk_chan_map[restchannel] != 0) -- { -- state->p25_cc_freq = state->trunk_chan_map[restchannel]; -- } - - //extra handling for TG hold while trunking enabled -- if (state->tg_hold != 0 && opts->p25_trunk == 1) -+ if (state->tg_hold != 0 && opts->p25_trunk == 1) //logic seems to be fixed now for new rest lsn logic and other considerations - { -- //if both slots are voice, -- if (state->dmrburstL == 16 && state->dmrburstR == 16) -+ //debug -+ // fprintf (stderr, " TG HOLD Both Slots Busy Check; "); -+ -+ //if both slots have some cobination of vlc, pi, voice, or tlc -+ int busy = 0; -+ if ( (state->dmrburstL == 16 || state->dmrburstL == 0 || state->dmrburstL == 1 || state->dmrburstL == 2) && -+ (state->dmrburstR == 16 || state->dmrburstR == 0 || state->dmrburstR == 1 || state->dmrburstR == 2)) busy = 1; -+ if (busy) - { -+ -+ //debug -+ // fprintf (stderr, " Busy; "); -+ - //but nether is the TG on hold - if ( (state->tg_hold != state->lasttg) && (state->tg_hold != state->lasttgR) ) - { -+ //debug -+ // fprintf (stderr, " Neither Slot is TG on Hold; "); -+ -+ //assign to cc freq if available -- move to right before needed for new logic on rest lsn -+ if (state->trunk_chan_map[restchannel] != 0) -+ { -+ state->p25_cc_freq = state->trunk_chan_map[restchannel]; -+ } -+ - //tune to the current rest channel so we can observe its channel status csbks for the TG on hold - if (state->p25_cc_freq != 0) - {