forked from cellular-infrastructure/osmocom-analog
C-Netz: Swtitch speech scrambler only after receiving 3 consecutive frames with different scrambler mode
This commit is contained in:
parent
7c4cfd5567
commit
40aec4f14c
|
@ -1428,6 +1428,7 @@ void cnetz_receive_telegramm_spk_k(cnetz_t *cnetz, telegramm_t *telegramm)
|
||||||
if (trans->state != TRANS_DS)
|
if (trans->state != TRANS_DS)
|
||||||
break;
|
break;
|
||||||
cnetz->scrambler = telegramm->betriebs_art;
|
cnetz->scrambler = telegramm->betriebs_art;
|
||||||
|
cnetz->scrambler_switch = 0;
|
||||||
timer_stop(&trans->timer);
|
timer_stop(&trans->timer);
|
||||||
break;
|
break;
|
||||||
case OPCODE_VH_K:
|
case OPCODE_VH_K:
|
||||||
|
@ -1469,6 +1470,7 @@ void cnetz_receive_telegramm_spk_k(cnetz_t *cnetz, telegramm_t *telegramm)
|
||||||
if (trans->state == TRANS_AHQ || trans->state == TRANS_VHQ || trans->state == TRANS_AF)
|
if (trans->state == TRANS_AHQ || trans->state == TRANS_VHQ || trans->state == TRANS_AF)
|
||||||
break;
|
break;
|
||||||
cnetz->scrambler = telegramm->betriebs_art;
|
cnetz->scrambler = telegramm->betriebs_art;
|
||||||
|
cnetz->scrambler_switch = 0;
|
||||||
trans_new_state(trans, TRANS_AHQ);
|
trans_new_state(trans, TRANS_AHQ);
|
||||||
trans->repeat = 0;
|
trans->repeat = 0;
|
||||||
timer_stop(&trans->timer);
|
timer_stop(&trans->timer);
|
||||||
|
@ -1602,7 +1604,15 @@ void cnetz_receive_telegramm_spk_v(cnetz_t *cnetz, telegramm_t *telegramm)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
valid_frame = 1;
|
valid_frame = 1;
|
||||||
|
if (cnetz->scrambler != telegramm->betriebs_art) {
|
||||||
|
/* if the scrambler mode changes, we wait 3 frames */
|
||||||
|
/* i guess that this was implemented to prevent switching by one corrupt frame. */
|
||||||
|
if (++cnetz->scrambler_switch >= 3) {
|
||||||
cnetz->scrambler = telegramm->betriebs_art;
|
cnetz->scrambler = telegramm->betriebs_art;
|
||||||
|
cnetz->scrambler_switch = 0;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
cnetz->scrambler_switch = 0;
|
||||||
break;
|
break;
|
||||||
case OPCODE_AT_V:
|
case OPCODE_AT_V:
|
||||||
if (!match_fuz(cnetz, telegramm, cnetz->cell_nr)) {
|
if (!match_fuz(cnetz, telegramm, cnetz->cell_nr)) {
|
||||||
|
@ -1616,7 +1626,6 @@ void cnetz_receive_telegramm_spk_v(cnetz_t *cnetz, telegramm_t *telegramm)
|
||||||
/* if already received this frame, if we are releasing */
|
/* if already received this frame, if we are releasing */
|
||||||
if (trans->state == TRANS_AT || trans->state == TRANS_AF)
|
if (trans->state == TRANS_AT || trans->state == TRANS_AF)
|
||||||
break;
|
break;
|
||||||
cnetz->scrambler = telegramm->betriebs_art;
|
|
||||||
trans_new_state(trans, TRANS_AT);
|
trans_new_state(trans, TRANS_AT);
|
||||||
trans->repeat = 0;
|
trans->repeat = 0;
|
||||||
timer_stop(&trans->timer);
|
timer_stop(&trans->timer);
|
||||||
|
|
|
@ -107,6 +107,7 @@ typedef struct cnetz {
|
||||||
double fsk_tx_phase; /* current bit position */
|
double fsk_tx_phase; /* current bit position */
|
||||||
uint64_t fsk_tx_scount; /* sample counter (used to sync multiple channels) */
|
uint64_t fsk_tx_scount; /* sample counter (used to sync multiple channels) */
|
||||||
int scrambler; /* 0 = normal speech, 1 = scrambled speech */
|
int scrambler; /* 0 = normal speech, 1 = scrambled speech */
|
||||||
|
int scrambler_switch; /* counter to switch after 3 frames with new scrabler state */
|
||||||
sample_t *dsp_speech_buffer; /* samples in one chunk */
|
sample_t *dsp_speech_buffer; /* samples in one chunk */
|
||||||
int dsp_speech_length; /* number of samples */
|
int dsp_speech_length; /* number of samples */
|
||||||
int dsp_speech_pos; /* current position in buffer */
|
int dsp_speech_pos; /* current position in buffer */
|
||||||
|
|
Loading…
Reference in New Issue