提交 489053be authored 作者: Steve Underwood's avatar Steve Underwood

Some polishing of FAX modem Tx handling

上级 1d76b2f9
...@@ -163,7 +163,8 @@ SPAN_DECLARE_NONSTD(int) fax_rx(fax_state_t *s, int16_t *amp, int len) ...@@ -163,7 +163,8 @@ SPAN_DECLARE_NONSTD(int) fax_rx(fax_state_t *s, int16_t *amp, int len)
#endif #endif
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
amp[i] = dc_restore(&s->modems.dc_restore, amp[i]); amp[i] = dc_restore(&s->modems.dc_restore, amp[i]);
s->modems.rx_handler(s->modems.rx_user_data, amp, len); if (s->modems.rx_handler)
s->modems.rx_handler(s->modems.rx_user_data, amp, len);
t30_timer_update(&s->t30, len); t30_timer_update(&s->t30, len);
return 0; return 0;
} }
...@@ -197,26 +198,6 @@ SPAN_DECLARE_NONSTD(int) fax_rx_fillin(fax_state_t *s, int len) ...@@ -197,26 +198,6 @@ SPAN_DECLARE_NONSTD(int) fax_rx_fillin(fax_state_t *s, int len)
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static int set_next_tx_type(fax_state_t *s)
{
fax_modems_state_t *t;
t = &s->modems;
if (t->next_tx_handler)
{
fax_modems_set_tx_handler(t, t->next_tx_handler, t->next_tx_user_data);
t->next_tx_handler = NULL;
return 0;
}
/* If there is nothing else to change to, so use zero length silence */
silence_gen_alter(&t->silence_gen, 0);
fax_modems_set_tx_handler(t, (span_tx_handler_t) &silence_gen, &t->silence_gen);
fax_modems_set_next_tx_handler(t, (span_tx_handler_t) NULL, NULL);
t->transmit = false;
return -1;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE_NONSTD(int) fax_tx(fax_state_t *s, int16_t *amp, int max_len) SPAN_DECLARE_NONSTD(int) fax_tx(fax_state_t *s, int16_t *amp, int max_len)
{ {
int len; int len;
...@@ -226,41 +207,30 @@ SPAN_DECLARE_NONSTD(int) fax_tx(fax_state_t *s, int16_t *amp, int max_len) ...@@ -226,41 +207,30 @@ SPAN_DECLARE_NONSTD(int) fax_tx(fax_state_t *s, int16_t *amp, int max_len)
required_len = max_len; required_len = max_len;
#endif #endif
len = 0; len = 0;
if (s->modems.transmit) while (s->modems.transmit && (len += s->modems.tx_handler(s->modems.tx_user_data, &amp[len], max_len - len)) < max_len)
{ {
while ((len += s->modems.tx_handler(s->modems.tx_user_data, amp + len, max_len - len)) < max_len) /* Allow for a change of tx handler within a block */
{ if (fax_modems_set_next_tx_type(&s->modems) && s->modems.current_tx_type != T30_MODEM_NONE && s->modems.current_tx_type != T30_MODEM_DONE)
/* Allow for a change of tx handler within a block */ t30_front_end_status(&s->t30, T30_FRONT_END_SEND_STEP_COMPLETE);
if (set_next_tx_type(s) && s->modems.current_tx_type != T30_MODEM_NONE && s->modems.current_tx_type != T30_MODEM_DONE) /*endif*/
t30_front_end_status(&s->t30, T30_FRONT_END_SEND_STEP_COMPLETE);
if (!s->modems.transmit)
{
if (s->modems.transmit_on_idle)
{
/* Pad to the requested length with silence */
memset(amp + len, 0, (max_len - len)*sizeof(int16_t));
len = max_len;
}
break;
}
}
} }
else /*endwhile*/
if (s->modems.transmit_on_idle)
{ {
if (s->modems.transmit_on_idle) /* Pad to the requested length with silence */
{ memset(&amp[len], 0, (max_len - len)*sizeof(int16_t));
/* Pad to the requested length with silence */ len = max_len;
memset(amp, 0, max_len*sizeof(int16_t));
len = max_len;
}
} }
/*endif*/
#if defined(LOG_FAX_AUDIO) #if defined(LOG_FAX_AUDIO)
if (s->modems.audio_tx_log >= 0) if (s->modems.audio_tx_log >= 0)
{ {
if (len < required_len) if (len < required_len)
memset(amp + len, 0, (required_len - len)*sizeof(int16_t)); memset(&amp[len], 0, (required_len - len)*sizeof(int16_t));
/*endif*/
write(s->modems.audio_tx_log, amp, required_len*sizeof(int16_t)); write(s->modems.audio_tx_log, amp, required_len*sizeof(int16_t));
} }
/*endif*/
#endif #endif
return len; return len;
} }
......
...@@ -533,6 +533,23 @@ SPAN_DECLARE(void) fax_modems_set_next_tx_handler(fax_modems_state_t *s, span_tx ...@@ -533,6 +533,23 @@ SPAN_DECLARE(void) fax_modems_set_next_tx_handler(fax_modems_state_t *s, span_tx
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) fax_modems_set_next_tx_type(fax_modems_state_t *s)
{
if (s->next_tx_handler)
{
fax_modems_set_tx_handler(s, s->next_tx_handler, s->next_tx_user_data);
fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
return 0;
}
/* There is nothing else to change to, so use zero length silence */
silence_gen_alter(&s->silence_gen, 0);
fax_modems_set_tx_handler(s, (span_tx_handler_t) &silence_gen, &s->silence_gen);
fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
s->transmit = false;
return -1;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(void) fax_modems_set_tep_mode(fax_modems_state_t *s, int use_tep) SPAN_DECLARE(void) fax_modems_set_tep_mode(fax_modems_state_t *s, int use_tep)
{ {
s->use_tep = use_tep; s->use_tep = use_tep;
......
...@@ -2830,7 +2830,8 @@ SPAN_DECLARE_NONSTD(int) t31_rx(t31_state_t *s, int16_t amp[], int len) ...@@ -2830,7 +2830,8 @@ SPAN_DECLARE_NONSTD(int) t31_rx(t31_state_t *s, int16_t amp[], int len)
} }
/*endif*/ /*endif*/
s->audio.modems.rx_handler(s->audio.modems.rx_user_data, amp, len); if (s->audio.modems.rx_handler)
s->audio.modems.rx_handler(s->audio.modems.rx_user_data, amp, len);
return 0; return 0;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
...@@ -2861,23 +2862,6 @@ SPAN_DECLARE_NONSTD(int) t31_rx_fillin(t31_state_t *s, int len) ...@@ -2861,23 +2862,6 @@ SPAN_DECLARE_NONSTD(int) t31_rx_fillin(t31_state_t *s, int len)
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static int set_next_tx_type(t31_state_t *s)
{
if (s->audio.next_tx_handler)
{
fax_modems_set_tx_handler(&s->audio.modems, s->audio.next_tx_handler, s->audio.next_tx_user_data);
fax_modems_set_next_tx_handler(&s->audio.modems, (span_tx_handler_t) NULL, NULL);
return 0;
}
/*endif*/
/* There is nothing else to change to, so use zero length silence */
silence_gen_alter(&s->audio.modems.silence_gen, 0);
fax_modems_set_tx_handler(&s->audio.modems, (span_tx_handler_t) &silence_gen, &s->audio.modems.silence_gen);
fax_modems_set_next_tx_handler(&s->audio.modems, (span_tx_handler_t) NULL, NULL);
return -1;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE_NONSTD(int) t31_tx(t31_state_t *s, int16_t amp[], int max_len) SPAN_DECLARE_NONSTD(int) t31_tx(t31_state_t *s, int16_t amp[], int max_len)
{ {
int len; int len;
...@@ -2888,8 +2872,8 @@ SPAN_DECLARE_NONSTD(int) t31_tx(t31_state_t *s, int16_t amp[], int max_len) ...@@ -2888,8 +2872,8 @@ SPAN_DECLARE_NONSTD(int) t31_tx(t31_state_t *s, int16_t amp[], int max_len)
if ((len = s->audio.modems.tx_handler(s->audio.modems.tx_user_data, amp, max_len)) < max_len) if ((len = s->audio.modems.tx_handler(s->audio.modems.tx_user_data, amp, max_len)) < max_len)
{ {
/* Allow for one change of tx handler within a block */ /* Allow for one change of tx handler within a block */
set_next_tx_type(s); fax_modems_set_next_tx_type(&s->audio.modems);
if ((len += s->audio.modems.tx_handler(s->audio.modems.tx_user_data, amp + len, max_len - len)) < max_len) if ((len += s->audio.modems.tx_handler(s->audio.modems.tx_user_data, &amp[len], max_len - len)) < max_len)
front_end_status(s, T30_FRONT_END_SEND_STEP_COMPLETE); front_end_status(s, T30_FRONT_END_SEND_STEP_COMPLETE);
/*endif*/ /*endif*/
} }
...@@ -2899,7 +2883,7 @@ SPAN_DECLARE_NONSTD(int) t31_tx(t31_state_t *s, int16_t amp[], int max_len) ...@@ -2899,7 +2883,7 @@ SPAN_DECLARE_NONSTD(int) t31_tx(t31_state_t *s, int16_t amp[], int max_len)
if (s->audio.modems.transmit_on_idle) if (s->audio.modems.transmit_on_idle)
{ {
/* Pad to the requested length with silence */ /* Pad to the requested length with silence */
memset(amp + len, 0, (max_len - len)*sizeof(int16_t)); memset(&amp[len], 0, (max_len - len)*sizeof(int16_t));
len = max_len; len = max_len;
} }
/*endif*/ /*endif*/
......
...@@ -2061,7 +2061,8 @@ SPAN_DECLARE_NONSTD(int) t38_gateway_rx(t38_gateway_state_t *s, int16_t amp[], i ...@@ -2061,7 +2061,8 @@ SPAN_DECLARE_NONSTD(int) t38_gateway_rx(t38_gateway_state_t *s, int16_t amp[], i
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
amp[i] = dc_restore(&s->audio.modems.dc_restore, amp[i]); amp[i] = dc_restore(&s->audio.modems.dc_restore, amp[i]);
/*endfor*/ /*endfor*/
s->audio.modems.rx_handler(s->audio.modems.rx_user_data, amp, len); if (s->audio.modems.rx_handler)
s->audio.modems.rx_handler(s->audio.modems.rx_user_data, amp, len);
return 0; return 0;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
...@@ -2102,12 +2103,13 @@ SPAN_DECLARE_NONSTD(int) t38_gateway_tx(t38_gateway_state_t *s, int16_t amp[], i ...@@ -2102,12 +2103,13 @@ SPAN_DECLARE_NONSTD(int) t38_gateway_tx(t38_gateway_state_t *s, int16_t amp[], i
required_len = max_len; required_len = max_len;
#endif #endif
len = 0;
if ((len = s->audio.modems.tx_handler(s->audio.modems.tx_user_data, amp, max_len)) < max_len) if ((len = s->audio.modems.tx_handler(s->audio.modems.tx_user_data, amp, max_len)) < max_len)
{ {
if (set_next_tx_type(s)) if (set_next_tx_type(s))
{ {
/* Give the new handler a chance to file the remaining buffer space */ /* Give the new handler a chance to file the remaining buffer space */
len += s->audio.modems.tx_handler(s->audio.modems.tx_user_data, amp + len, max_len - len); len += s->audio.modems.tx_handler(s->audio.modems.tx_user_data, &amp[len], max_len - len);
if (len < max_len) if (len < max_len)
{ {
silence_gen_set(&s->audio.modems.silence_gen, 0); silence_gen_set(&s->audio.modems.silence_gen, 0);
...@@ -2121,7 +2123,7 @@ SPAN_DECLARE_NONSTD(int) t38_gateway_tx(t38_gateway_state_t *s, int16_t amp[], i ...@@ -2121,7 +2123,7 @@ SPAN_DECLARE_NONSTD(int) t38_gateway_tx(t38_gateway_state_t *s, int16_t amp[], i
if (s->audio.modems.transmit_on_idle) if (s->audio.modems.transmit_on_idle)
{ {
/* Pad to the requested length with silence */ /* Pad to the requested length with silence */
memset(amp + len, 0, (max_len - len)*sizeof(int16_t)); memset(&amp[len], 0, (max_len - len)*sizeof(int16_t));
len = max_len; len = max_len;
} }
/*endif*/ /*endif*/
...@@ -2129,7 +2131,7 @@ SPAN_DECLARE_NONSTD(int) t38_gateway_tx(t38_gateway_state_t *s, int16_t amp[], i ...@@ -2129,7 +2131,7 @@ SPAN_DECLARE_NONSTD(int) t38_gateway_tx(t38_gateway_state_t *s, int16_t amp[], i
if (s->audio.modems.audio_tx_log >= 0) if (s->audio.modems.audio_tx_log >= 0)
{ {
if (len < required_len) if (len < required_len)
memset(amp + len, 0, (required_len - len)*sizeof(int16_t)); memset(&amp[len], 0, (required_len - len)*sizeof(int16_t));
/*endif*/ /*endif*/
write(s->audio.modems.audio_tx_log, amp, required_len*sizeof(int16_t)); write(s->audio.modems.audio_tx_log, amp, required_len*sizeof(int16_t));
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论