aboutsummaryrefslogtreecommitdiffstats
path: root/src/cnetz/dsp.c
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2020-06-01 21:07:49 +0200
committerAndreas Eversberg <jolly@eversberg.eu>2020-10-29 07:35:50 +0100
commit7189984bbbe0f44888d3cdbc2b68199b1d3714c7 (patch)
tree78da76ba347c98acbf2e65aea38f0c3d8a917eeb /src/cnetz/dsp.c
parenta98b05beb02ddf3184b513bf1fda91ad1a70945c (diff)
C-Netz: At correct timeslot switch channel mode
Without this, the first BQ(K) message came to early, so that BSA 51 released when receiving ZFZ(K) one frame too early.
Diffstat (limited to 'src/cnetz/dsp.c')
-rw-r--r--src/cnetz/dsp.c67
1 files changed, 37 insertions, 30 deletions
diff --git a/src/cnetz/dsp.c b/src/cnetz/dsp.c
index 91f967c..ecf26a4 100644
--- a/src/cnetz/dsp.c
+++ b/src/cnetz/dsp.c
@@ -54,6 +54,27 @@ scrambler_t scrambler_test_scrambler1;
scrambler_t scrambler_test_scrambler2;
#endif
+const char *cnetz_dsp_mode_name(enum dsp_mode mode)
+{
+ static char invalid[16];
+
+ switch (mode) {
+ case DSP_SCHED_NONE:
+ return "SCHED_NONE";
+ case DSP_MODE_OFF:
+ return "OFF";
+ case DSP_MODE_OGK:
+ return "OGK";
+ case DSP_MODE_SPK_K:
+ return "SPK_K";
+ case DSP_MODE_SPK_V:
+ return "SPK_V";
+ }
+
+ sprintf(invalid, "invalid(%d)", mode);
+ return invalid;
+}
+
static sample_t ramp_up[256], ramp_down[256];
void dsp_init(void)
@@ -166,6 +187,8 @@ int dsp_init_sender(cnetz_t *cnetz, int measure_speed, double clock_speed[2], en
scrambler_setup(&scrambler_test_scrambler2, cnetz->sender.samplerate);
#endif
+ cnetz->sched_dsp_mode_ts = -1;
+
return 0;
error:
@@ -636,10 +659,11 @@ again:
}
/* switch to speech channel */
- if (cnetz->sched_switch_mode && cnetz->sched_r_m == 0) {
- if (--cnetz->sched_switch_mode == 0) {
+ if (cnetz->sched_dsp_mode_ts >= 0 && cnetz->sched_r_m == 0) {
+ if (cnetz->sched_dsp_mode_ts == cnetz->sched_ts) {
/* OgK / SpK(K) / SpK(V) */
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Switching channel (mode)\n");
+ PDEBUG_CHAN(DDSP, DEBUG_INFO, "Now switchting channel mode to %s at timeslot %d\n", cnetz_dsp_mode_name(cnetz->sched_dsp_mode), cnetz->sched_dsp_mode_ts);
+ cnetz->sched_dsp_mode_ts = -1;
cnetz_set_dsp_mode(cnetz, cnetz->sched_dsp_mode);
}
}
@@ -843,39 +867,22 @@ void unshrink_speech(cnetz_t *cnetz, sample_t *speech_buffer, int count)
cnetz->sender.rxbuf_pos = pos;
}
-const char *cnetz_dsp_mode_name(enum dsp_mode mode)
-{
- static char invalid[16];
-
- switch (mode) {
- case DSP_SCHED_NONE:
- return "SCHED_NONE";
- case DSP_MODE_OFF:
- return "OFF";
- case DSP_MODE_OGK:
- return "OGK";
- case DSP_MODE_SPK_K:
- return "SPK_K";
- case DSP_MODE_SPK_V:
- return "SPK_V";
- }
-
- sprintf(invalid, "invalid(%d)", mode);
- return invalid;
-}
-
void cnetz_set_dsp_mode(cnetz_t *cnetz, enum dsp_mode mode)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "DSP mode %s -> %s\n", cnetz_dsp_mode_name(cnetz->dsp_mode), cnetz_dsp_mode_name(mode));
- cnetz->dsp_mode = mode;
+ if (mode != cnetz->dsp_mode) {
+ PDEBUG_CHAN(DDSP, DEBUG_INFO, "DSP mode %s -> %s\n", cnetz_dsp_mode_name(cnetz->dsp_mode), cnetz_dsp_mode_name(mode));
+ cnetz->dsp_mode = mode;
+ }
/* we must get rid of partly received frame */
fsk_demod_reset(&cnetz->fsk_demod);
}
-void cnetz_set_sched_dsp_mode(cnetz_t *cnetz, enum dsp_mode mode, int frames_ahead)
+void cnetz_set_sched_dsp_mode(cnetz_t *cnetz, enum dsp_mode mode, int timeslot)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, " Schedule DSP mode %s -> %s in %d frames\n", cnetz_dsp_mode_name(cnetz->dsp_mode), cnetz_dsp_mode_name(mode), frames_ahead);
- cnetz->sched_dsp_mode = mode;
- cnetz->sched_switch_mode = frames_ahead;
+ if (mode != cnetz->dsp_mode) {
+ PDEBUG_CHAN(DDSP, DEBUG_INFO, "Schedule DSP mode %s -> %s at timeslot %d\n", cnetz_dsp_mode_name(cnetz->dsp_mode), cnetz_dsp_mode_name(mode), timeslot);
+ cnetz->sched_dsp_mode = mode;
+ cnetz->sched_dsp_mode_ts = timeslot;
+ }
}