mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-10-29 06:34:19 +00:00
Some cleanups of FAX modem tone handling
This commit is contained in:
1 parent
8e6460fed3
commit
6cb3be7d8b
14 files changed
+238
-285
No files matched your search
@@ -291,7 +291,7 @@ SPAN_DECLARE(void) at_call_event(at_state_t *s, int event)
|
||||
{
|
||||
/* FAX modem connection */
|
||||
at_set_at_rx_mode(s, AT_MODE_DELIVERY);
|
||||
at_modem_control(s, AT_MODEM_CONTROL_RESTART, (void *) FAX_MODEM_CED_TONE);
|
||||
at_modem_control(s, AT_MODEM_CONTROL_RESTART, (void *) FAX_MODEM_CED_TONE_TX);
|
||||
}
|
||||
break;
|
||||
case AT_CALL_EVENT_CONNECTED:
|
||||
@@ -315,9 +315,9 @@ SPAN_DECLARE(void) at_call_event(at_state_t *s, int event)
|
||||
/* FAX modem connection */
|
||||
at_set_at_rx_mode(s, AT_MODE_DELIVERY);
|
||||
if (s->silent_dial)
|
||||
at_modem_control(s, AT_MODEM_CONTROL_RESTART, (void *) FAX_MODEM_NOCNG_TONE);
|
||||
at_modem_control(s, AT_MODEM_CONTROL_RESTART, (void *) FAX_MODEM_NOCNG_TONE_TX);
|
||||
else
|
||||
at_modem_control(s, AT_MODEM_CONTROL_RESTART, (void *) FAX_MODEM_CNG_TONE);
|
||||
at_modem_control(s, AT_MODEM_CONTROL_RESTART, (void *) FAX_MODEM_CNG_TONE_TX);
|
||||
s->dte_is_waiting = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -323,12 +323,8 @@ static void fax_set_tx_type(void *user_data, int type, int bit_rate, int short_t
|
||||
break;
|
||||
case T30_MODEM_CED:
|
||||
case T30_MODEM_CNG:
|
||||
if (type == T30_MODEM_CED)
|
||||
tone = MODEM_CONNECT_TONES_FAX_CED;
|
||||
else
|
||||
tone = MODEM_CONNECT_TONES_FAX_CNG;
|
||||
modem_connect_tones_tx_init(&t->connect_tx, tone);
|
||||
fax_modems_set_tx_handler(t, (span_tx_handler_t) &modem_connect_tones_tx, &t->connect_tx);
|
||||
tone = (type == T30_MODEM_CED) ? FAX_MODEM_CED_TONE_TX : FAX_MODEM_CNG_TONE_TX;
|
||||
fax_modems_start_slow_modem(t, tone);
|
||||
fax_modems_set_next_tx_handler(t, (span_tx_handler_t) NULL, NULL);
|
||||
t->transmit = TRUE;
|
||||
break;
|
||||
|
||||
@@ -261,11 +261,32 @@ SPAN_DECLARE(void) fax_modems_start_slow_modem(fax_modems_state_t *s, int which)
|
||||
{
|
||||
case FAX_MODEM_V21_RX:
|
||||
fsk_rx_init(&s->v21_rx, &preset_fsk_specs[FSK_V21CH2], FSK_FRAME_MODE_SYNC, (put_bit_func_t) hdlc_rx_put_bit, &s->hdlc_rx);
|
||||
fax_modems_set_rx_handler(s, (span_rx_handler_t) &fsk_rx, &s->v21_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &s->v21_rx);
|
||||
fsk_rx_signal_cutoff(&s->v21_rx, -39.09f);
|
||||
s->rx_frame_received = FALSE;
|
||||
break;
|
||||
case FAX_MODEM_CED_TONE_RX:
|
||||
modem_connect_tones_rx_init(&s->connect_rx, MODEM_CONNECT_TONES_FAX_CED, s->tone_callback, s->tone_callback_user_data);
|
||||
fax_modems_set_rx_handler(s, (span_rx_handler_t) &modem_connect_tones_rx, &s->connect_rx, (span_rx_fillin_handler_t) &modem_connect_tones_rx_fillin, &s->connect_rx);
|
||||
break;
|
||||
case FAX_MODEM_CNG_TONE_RX:
|
||||
modem_connect_tones_rx_init(&s->connect_rx, MODEM_CONNECT_TONES_FAX_CNG, s->tone_callback, s->tone_callback_user_data);
|
||||
fax_modems_set_rx_handler(s, (span_rx_handler_t) &modem_connect_tones_rx, &s->connect_rx, (span_rx_fillin_handler_t) &modem_connect_tones_rx_fillin, &s->connect_rx);
|
||||
break;
|
||||
case FAX_MODEM_V21_TX:
|
||||
fsk_tx_init(&s->v21_tx, &preset_fsk_specs[FSK_V21CH2], (get_bit_func_t) hdlc_tx_get_bit, &s->hdlc_tx);
|
||||
fax_modems_set_tx_handler(s, (span_tx_handler_t) &fsk_tx, &s->v21_tx);
|
||||
fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
|
||||
break;
|
||||
case FAX_MODEM_CED_TONE_TX:
|
||||
modem_connect_tones_tx_init(&s->connect_tx, MODEM_CONNECT_TONES_FAX_CED);
|
||||
fax_modems_set_tx_handler(s, (span_tx_handler_t) &modem_connect_tones_tx, &s->connect_tx);
|
||||
fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
|
||||
break;
|
||||
case FAX_MODEM_CNG_TONE_TX:
|
||||
modem_connect_tones_tx_init(&s->connect_tx, MODEM_CONNECT_TONES_FAX_CNG);
|
||||
fax_modems_set_tx_handler(s, (span_tx_handler_t) &modem_connect_tones_tx, &s->connect_tx);
|
||||
fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -490,12 +511,14 @@ SPAN_DECLARE(fax_modems_state_t *) fax_modems_init(fax_modems_state_t *s,
|
||||
s->use_tep = use_tep;
|
||||
|
||||
modem_connect_tones_tx_init(&s->connect_tx, MODEM_CONNECT_TONES_FAX_CNG);
|
||||
s->tone_callback = tone_callback;
|
||||
s->tone_callback_user_data = user_data;
|
||||
if (tone_callback)
|
||||
{
|
||||
modem_connect_tones_rx_init(&s->connect_rx,
|
||||
MODEM_CONNECT_TONES_FAX_CNG,
|
||||
tone_callback,
|
||||
user_data);
|
||||
s->tone_callback,
|
||||
s->tone_callback_user_data);
|
||||
}
|
||||
/*endif*/
|
||||
span_log_init(&s->logging, SPAN_LOG_NONE, NULL);
|
||||
|
||||
@@ -693,6 +693,12 @@ SPAN_DECLARE_NONSTD(int) modem_connect_tones_rx(modem_connect_tones_rx_state_t *
|
||||
}
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
SPAN_DECLARE_NONSTD(int) modem_connect_tones_rx_fillin(modem_connect_tones_rx_state_t *s, int len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
SPAN_DECLARE(int) modem_connect_tones_rx_get(modem_connect_tones_rx_state_t *s)
|
||||
{
|
||||
int x;
|
||||
|
||||
@@ -34,9 +34,11 @@ enum
|
||||
FAX_MODEM_FLUSH = 0,
|
||||
FAX_MODEM_SILENCE_TX,
|
||||
FAX_MODEM_SILENCE_RX,
|
||||
FAX_MODEM_CED_TONE,
|
||||
FAX_MODEM_CNG_TONE,
|
||||
FAX_MODEM_NOCNG_TONE,
|
||||
FAX_MODEM_CED_TONE_TX,
|
||||
FAX_MODEM_CNG_TONE_TX,
|
||||
FAX_MODEM_NOCNG_TONE_TX,
|
||||
FAX_MODEM_CED_TONE_RX,
|
||||
FAX_MODEM_CNG_TONE_RX,
|
||||
FAX_MODEM_V21_TX,
|
||||
FAX_MODEM_V17_TX,
|
||||
FAX_MODEM_V27TER_TX,
|
||||
|
||||
@@ -141,7 +141,16 @@ SPAN_DECLARE_NONSTD(int) modem_connect_tones_tx(modem_connect_tones_tx_state_t *
|
||||
SPAN_DECLARE_NONSTD(int) modem_connect_tones_rx(modem_connect_tones_rx_state_t *s,
|
||||
const int16_t amp[],
|
||||
int len);
|
||||
|
||||
|
||||
/*! Fake processing of a missing block of received modem connect tone samples
|
||||
(e.g due to packet loss).
|
||||
\brief Fake processing of a missing block of received modem connect tone samples.
|
||||
\param s The context.
|
||||
\param len The number of samples to fake.
|
||||
\return The number of samples unprocessed.
|
||||
*/
|
||||
SPAN_DECLARE_NONSTD(int) modem_connect_tones_rx_fillin(modem_connect_tones_rx_state_t *s, int len);
|
||||
|
||||
/*! \brief Test if a modem_connect tone has been detected.
|
||||
\param s The context.
|
||||
\return TRUE if tone is detected, else FALSE.
|
||||
|
||||
@@ -82,6 +82,11 @@ struct fax_modems_state_s
|
||||
/*! \brief */
|
||||
dc_restore_state_t dc_restore;
|
||||
|
||||
/*! \brief The callback function used to report detected tones. */
|
||||
tone_report_func_t tone_callback;
|
||||
/*! \brief A user specified opaque pointer passed to the tone_callback function. */
|
||||
void *tone_callback_user_data;
|
||||
|
||||
/*! \brief The fast modem type currently in use */
|
||||
int fast_modem;
|
||||
|
||||
|
||||
+15
-21
@@ -187,7 +187,7 @@ static void hdlc_accept_frame(void *user_data, const uint8_t *msg, int len, int
|
||||
static void hdlc_accept_t38_frame(void *user_data, const uint8_t *msg, int len, int ok);
|
||||
static void hdlc_accept_non_ecm_frame(void *user_data, const uint8_t *msg, int len, int ok);
|
||||
static int silence_rx(void *user_data, const int16_t amp[], int len);
|
||||
static int cng_rx(void *user_data, const int16_t amp[], int len);
|
||||
static int initial_timed_rx(void *user_data, const int16_t amp[], int len);
|
||||
static void non_ecm_put_bit(void *user_data, int bit);
|
||||
static void non_ecm_put(void *user_data, const uint8_t buf[], int len);
|
||||
static int non_ecm_get(void *user_data, uint8_t buf[], int len);
|
||||
@@ -223,7 +223,7 @@ static int front_end_status(t31_state_t *s, int status)
|
||||
}
|
||||
/*endif*/
|
||||
break;
|
||||
case FAX_MODEM_CED_TONE:
|
||||
case FAX_MODEM_CED_TONE_TX:
|
||||
/* Go directly to V.21/HDLC transmit. */
|
||||
s->modem = FAX_MODEM_NONE;
|
||||
restart_modem(s, FAX_MODEM_V21_TX);
|
||||
@@ -1599,7 +1599,6 @@ static int non_ecm_get(void *user_data, uint8_t buf[], int len)
|
||||
s->non_ecm_tx.final = FALSE;
|
||||
/* This will put the modem into its shutdown sequence. When
|
||||
it has finally shut down, an OK response will be sent. */
|
||||
//return SIG_STATUS_END_OF_DATA;
|
||||
return i;
|
||||
}
|
||||
/*endif*/
|
||||
@@ -1679,7 +1678,7 @@ static void hdlc_rx_status(void *user_data, int status)
|
||||
s->audio.modems.rx_trained = TRUE;
|
||||
break;
|
||||
case SIG_STATUS_CARRIER_UP:
|
||||
if (s->modem == FAX_MODEM_CNG_TONE || s->modem == FAX_MODEM_NOCNG_TONE || s->modem == FAX_MODEM_V21_RX)
|
||||
if (s->modem == FAX_MODEM_CNG_TONE_TX || s->modem == FAX_MODEM_NOCNG_TONE_TX || s->modem == FAX_MODEM_V21_RX)
|
||||
{
|
||||
s->at_state.rx_signal_present = TRUE;
|
||||
s->rx_frame_received = FALSE;
|
||||
@@ -1718,7 +1717,7 @@ static void hdlc_rx_status(void *user_data, int status)
|
||||
s->audio.modems.rx_trained = FALSE;
|
||||
break;
|
||||
case SIG_STATUS_FRAMING_OK:
|
||||
if (s->modem == FAX_MODEM_CNG_TONE || s->modem == FAX_MODEM_NOCNG_TONE)
|
||||
if (s->modem == FAX_MODEM_CNG_TONE_TX || s->modem == FAX_MODEM_NOCNG_TONE_TX)
|
||||
{
|
||||
/* Once we get any valid HDLC the CNG tone stops, and we drop
|
||||
to the V.21 receive modem on its own. */
|
||||
@@ -2028,7 +2027,7 @@ static int restart_modem(t31_state_t *s, int new_modem)
|
||||
use_hdlc = FALSE;
|
||||
switch (s->modem)
|
||||
{
|
||||
case FAX_MODEM_CNG_TONE:
|
||||
case FAX_MODEM_CNG_TONE_TX:
|
||||
if (s->t38_mode)
|
||||
{
|
||||
s->t38_fe.next_tx_samples = s->t38_fe.samples;
|
||||
@@ -2037,35 +2036,34 @@ static int restart_modem(t31_state_t *s, int new_modem)
|
||||
}
|
||||
else
|
||||
{
|
||||
modem_connect_tones_tx_init(&t->connect_tx, MODEM_CONNECT_TONES_FAX_CNG);
|
||||
fax_modems_start_slow_modem(t, FAX_MODEM_CNG_TONE_TX);
|
||||
/* CNG is special, since we need to receive V.21 HDLC messages while sending the
|
||||
tone. Everything else in FAX processing sends only one way at a time. */
|
||||
/* Do V.21/HDLC receive in parallel. The other end may send its
|
||||
first message at any time. The CNG tone will continue until
|
||||
we get a valid preamble. */
|
||||
t31_v21_rx(s);
|
||||
fax_modems_set_rx_handler(t, (span_rx_handler_t) &cng_rx, s, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, NULL);
|
||||
fax_modems_set_tx_handler(t, (span_tx_handler_t) &modem_connect_tones_tx, &t->connect_tx);
|
||||
fax_modems_set_rx_handler(t, (span_rx_handler_t) &initial_timed_rx, s, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, NULL);
|
||||
fax_modems_set_next_tx_handler(t, (span_tx_handler_t) NULL, NULL);
|
||||
}
|
||||
/*endif*/
|
||||
s->at_state.transmit = TRUE;
|
||||
break;
|
||||
case FAX_MODEM_NOCNG_TONE:
|
||||
case FAX_MODEM_NOCNG_TONE_TX:
|
||||
if (s->t38_mode)
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
t31_v21_rx(s);
|
||||
fax_modems_set_rx_handler(t, (span_rx_handler_t) &cng_rx, s, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, NULL);
|
||||
fax_modems_set_rx_handler(t, (span_rx_handler_t) &initial_timed_rx, s, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, NULL);
|
||||
silence_gen_set(&t->silence_gen, 0);
|
||||
fax_modems_set_tx_handler(t, (span_tx_handler_t) &silence_gen, &t->silence_gen);
|
||||
}
|
||||
/*endif*/
|
||||
s->at_state.transmit = FALSE;
|
||||
break;
|
||||
case FAX_MODEM_CED_TONE:
|
||||
case FAX_MODEM_CED_TONE_TX:
|
||||
if (s->t38_mode)
|
||||
{
|
||||
s->t38_fe.next_tx_samples = s->t38_fe.samples;
|
||||
@@ -2074,8 +2072,7 @@ static int restart_modem(t31_state_t *s, int new_modem)
|
||||
}
|
||||
else
|
||||
{
|
||||
modem_connect_tones_tx_init(&t->connect_tx, MODEM_CONNECT_TONES_FAX_CED);
|
||||
fax_modems_set_tx_handler(t, (span_tx_handler_t) &modem_connect_tones_tx, &t->connect_tx);
|
||||
fax_modems_start_slow_modem(t, FAX_MODEM_CED_TONE_TX);
|
||||
fax_modems_set_next_tx_handler(t, (span_tx_handler_t) NULL, NULL);
|
||||
}
|
||||
/*endif*/
|
||||
@@ -2121,9 +2118,9 @@ static int restart_modem(t31_state_t *s, int new_modem)
|
||||
case FAX_MODEM_V29_RX:
|
||||
if (!s->t38_mode)
|
||||
{
|
||||
fax_modems_start_fast_modem(t, s->modem, s->bit_rate, s->short_train, use_hdlc);
|
||||
/* Allow for +FCERROR/+FRH:3 */
|
||||
t31_v21_rx(s);
|
||||
fax_modems_start_fast_modem(t, s->modem, s->bit_rate, s->short_train, use_hdlc);
|
||||
}
|
||||
/*endif*/
|
||||
s->at_state.transmit = FALSE;
|
||||
@@ -2743,7 +2740,7 @@ static int silence_rx(void *user_data, const int16_t amp[], int len)
|
||||
}
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
static int cng_rx(void *user_data, const int16_t amp[], int len)
|
||||
static int initial_timed_rx(void *user_data, const int16_t amp[], int len)
|
||||
{
|
||||
t31_state_t *s;
|
||||
|
||||
@@ -2755,12 +2752,9 @@ static int cng_rx(void *user_data, const int16_t amp[], int len)
|
||||
restart_modem(s, FAX_MODEM_SILENCE_TX);
|
||||
at_modem_control(&s->at_state, AT_MODEM_CONTROL_HANGUP, NULL);
|
||||
t31_set_at_rx_mode(s, AT_MODE_ONHOOK_COMMAND);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
fsk_rx(&s->audio.modems.v21_rx, amp, len);
|
||||
}
|
||||
/*endif*/
|
||||
fsk_rx(&s->audio.modems.v21_rx, amp, len);
|
||||
return 0;
|
||||
}
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
@@ -867,7 +867,7 @@ static int t38_encode_data(t38_core_state_t *s, uint8_t buf[], int data_type, co
|
||||
|
||||
if (s->data_transport_protocol == T38_TRANSPORT_TCP_TPKT)
|
||||
{
|
||||
/* Fill in the TPKT header (se RFC1006) */
|
||||
/* Fill in the TPKT header (see RFC1006) */
|
||||
/* Version */
|
||||
buf[0] = 3;
|
||||
/* Reserved */
|
||||
|
||||
@@ -321,16 +321,14 @@ static int set_next_tx_type(t38_gateway_state_t *s)
|
||||
break;
|
||||
case T38_IND_CNG:
|
||||
t->tx_bit_rate = 0;
|
||||
modem_connect_tones_tx_init(&t->connect_tx, MODEM_CONNECT_TONES_FAX_CNG);
|
||||
fax_modems_start_slow_modem(t, FAX_MODEM_CNG_TONE_TX);
|
||||
silence_gen_set(&t->silence_gen, 0);
|
||||
fax_modems_set_tx_handler(t, (span_tx_handler_t) &modem_connect_tones_tx, &t->connect_tx);
|
||||
fax_modems_set_next_tx_handler(t, (span_tx_handler_t) &silence_gen, &t->silence_gen);
|
||||
fax_modems_set_rx_active(t, TRUE);
|
||||
break;
|
||||
case T38_IND_CED:
|
||||
t->tx_bit_rate = 0;
|
||||
modem_connect_tones_tx_init(&t->connect_tx, MODEM_CONNECT_TONES_FAX_CED);
|
||||
fax_modems_set_tx_handler(t, (span_tx_handler_t) &modem_connect_tones_tx, &t->connect_tx);
|
||||
fax_modems_start_slow_modem(t, FAX_MODEM_CED_TONE_TX);
|
||||
fax_modems_set_next_tx_handler(t, (span_tx_handler_t) NULL, NULL);
|
||||
fax_modems_set_rx_active(t, TRUE);
|
||||
break;
|
||||
|
||||
Reference in new issue
Block a user