提交 6cb3be7d authored 作者: Steve Underwood's avatar Steve Underwood

Some cleanups of FAX modem tone handling

上级 8e6460fe
......@@ -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,
......
......@@ -142,6 +142,15 @@ SPAN_DECLARE_NONSTD(int) modem_connect_tones_rx(modem_connect_tones_rx_state_t *
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;
......
......@@ -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*/
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;
......
......@@ -312,66 +312,13 @@ static void hdlc_accept(void *user_data, const uint8_t *msg, int len, int ok)
}
/*- End of function --------------------------------------------------------*/
static int v17_v21_rx(void *user_data, const int16_t amp[], int len)
{
fax_modems_state_t *s;
s = (fax_modems_state_t *) user_data;
v17_rx(&s->fast_modems.v17_rx, amp, len);
fsk_rx(&s->v21_rx, amp, len);
if (s->rx_trained)
{
/* The fast modem has trained, so we no longer need to run the slow
one in parallel. */
span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.17 (%.2fdBm0)\n", v17_rx_signal_power(&s->fast_modems.v17_rx));
fax_modems_set_rx_handler(s, (span_rx_handler_t) &v17_rx, &s->fast_modems.v17_rx, NULL, NULL);
}
return 0;
}
/*- End of function --------------------------------------------------------*/
static int v27ter_v21_rx(void *user_data, const int16_t amp[], int len)
{
fax_modems_state_t *s;
s = (fax_modems_state_t *) user_data;
v27ter_rx(&s->fast_modems.v27ter_rx, amp, len);
fsk_rx(&s->v21_rx, amp, len);
if (s->rx_trained)
{
/* The fast modem has trained, so we no longer need to run the slow
one in parallel. */
span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.27ter (%.2fdBm0)\n", v27ter_rx_signal_power(&s->fast_modems.v27ter_rx));
fax_modems_set_rx_handler(s, (span_rx_handler_t) &v27ter_rx, &s->fast_modems.v27ter_rx, NULL, NULL);
}
return 0;
}
/*- End of function --------------------------------------------------------*/
static int v29_v21_rx(void *user_data, const int16_t amp[], int len)
{
fax_modems_state_t *s;
s = (fax_modems_state_t *) user_data;
v29_rx(&s->fast_modems.v29_rx, amp, len);
fsk_rx(&s->v21_rx, amp, len);
if (s->rx_trained)
{
/* The fast modem has trained, so we no longer need to run the slow
one in parallel. */
span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.29 (%.2fdBm0)\n", v29_rx_signal_power(&s->fast_modems.v29_rx));
fax_modems_set_rx_handler(s, (span_rx_handler_t) &v29_rx, &s->fast_modems.v29_rx, NULL, NULL);
}
return 0;
}
/*- End of function --------------------------------------------------------*/
int faxtester_rx(faxtester_state_t *s, int16_t *amp, int len)
{
int i;
for (i = 0; i < len; i++)
amp[i] = dc_restore(&s->modems.dc_restore, amp[i]);
if (s->modems.rx_handler)
s->modems.rx_handler(s->modems.rx_user_data, amp, len);
timer_update(s, len);
if (s->wait_for_silence)
......@@ -432,7 +379,6 @@ void faxtester_set_rx_type(void *user_data, int type, int bit_rate, int short_tr
{
faxtester_state_t *s;
fax_modems_state_t *t;
int tone;
s = (faxtester_state_t *) user_data;
t = &s->modems;
......@@ -445,37 +391,31 @@ void faxtester_set_rx_type(void *user_data, int type, int bit_rate, int short_tr
switch (type)
{
case T30_MODEM_CED:
fax_modems_start_slow_modem(t, FAX_MODEM_CED_TONE_RX);
s->tone_state = MODEM_CONNECT_TONES_NONE;
break;
case T30_MODEM_CNG:
tone = (type == T30_MODEM_CED) ? MODEM_CONNECT_TONES_FAX_CED : MODEM_CONNECT_TONES_FAX_CNG;
modem_connect_tones_rx_init(&t->connect_rx,
tone,
tone_detected,
(void *) s);
fax_modems_set_rx_handler(t, (span_rx_handler_t) &modem_connect_tones_rx, &t->connect_rx, NULL, NULL);
fax_modems_start_slow_modem(t, FAX_MODEM_CNG_TONE_RX);
s->tone_state = MODEM_CONNECT_TONES_NONE;
break;
case T30_MODEM_V21:
if (s->flush_handler)
s->flush_handler(s, s->flush_user_data, 3);
fax_modems_start_slow_modem(t, FAX_MODEM_V21_RX);
fax_modems_set_rx_handler(t, (span_rx_handler_t) &fsk_rx, &t->v21_rx, NULL, NULL);
break;
case T30_MODEM_V27TER:
fax_modems_start_fast_modem(t, FAX_MODEM_V27TER_RX, bit_rate, short_train, use_hdlc);
fax_modems_set_rx_handler(t, (span_rx_handler_t) &v27ter_v21_rx, t, NULL, NULL);
break;
case T30_MODEM_V29:
fax_modems_start_fast_modem(t, FAX_MODEM_V29_RX, bit_rate, short_train, use_hdlc);
fax_modems_set_rx_handler(t, (span_rx_handler_t) &v29_v21_rx, t, NULL, NULL);
break;
case T30_MODEM_V17:
fax_modems_start_fast_modem(t, FAX_MODEM_V17_RX, bit_rate, short_train, use_hdlc);
fax_modems_set_rx_handler(t, (span_rx_handler_t) &v17_v21_rx, t, NULL, NULL);
break;
case T30_MODEM_DONE:
span_log(&s->logging, SPAN_LOG_FLOW, "FAX exchange complete\n");
default:
fax_modems_set_rx_handler(t, (span_rx_handler_t) &span_dummy_rx, s, NULL, NULL);
fax_modems_set_rx_handler(t, (span_rx_handler_t) &span_dummy_rx, s, NULL, s);
break;
}
}
......@@ -513,25 +453,19 @@ void faxtester_set_tx_type(void *user_data, int type, int bit_rate, int short_tr
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) ? MODEM_CONNECT_TONES_FAX_CED : MODEM_CONNECT_TONES_FAX_CNG;
fax_modems_start_slow_modem(t, tone);
s->transmit = TRUE;
break;
case T30_MODEM_V21:
fax_modems_start_slow_modem(t, FAX_MODEM_V21_TX);
fsk_tx_set_modem_status_handler(&t->v21_tx, modem_tx_status, (void *) s);
fax_modems_set_tx_handler(t, (span_tx_handler_t) &fsk_tx, &t->v21_tx);
s->transmit = TRUE;
break;
case T30_MODEM_V27TER:
fax_modems_set_get_bit(t, get_bit_func, get_bit_user_data);
fax_modems_start_fast_modem(t, FAX_MODEM_V27TER_TX, bit_rate, short_train, use_hdlc);
v27ter_tx_set_modem_status_handler(&t->fast_modems.v27ter_tx, modem_tx_status, (void *) s);
fax_modems_set_tx_handler(t, (span_tx_handler_t) &v27ter_tx, &t->fast_modems.v27ter_tx);
/* For any fast modem, set 200ms of preamble flags */
hdlc_tx_flags(&t->hdlc_tx, bit_rate/(8*5));
s->transmit = TRUE;
......@@ -540,7 +474,6 @@ void faxtester_set_tx_type(void *user_data, int type, int bit_rate, int short_tr
fax_modems_set_get_bit(t, get_bit_func, get_bit_user_data);
fax_modems_start_fast_modem(t, FAX_MODEM_V29_TX, bit_rate, short_train, use_hdlc);
v29_tx_set_modem_status_handler(&t->fast_modems.v29_tx, modem_tx_status, (void *) s);
fax_modems_set_tx_handler(t, (span_tx_handler_t) &v29_tx, &t->fast_modems.v29_tx);
/* For any fast modem, set 200ms of preamble flags */
hdlc_tx_flags(&t->hdlc_tx, bit_rate/(8*5));
s->transmit = TRUE;
......@@ -549,7 +482,6 @@ void faxtester_set_tx_type(void *user_data, int type, int bit_rate, int short_tr
fax_modems_set_get_bit(t, get_bit_func, get_bit_user_data);
fax_modems_start_fast_modem(t, FAX_MODEM_V17_TX, bit_rate, short_train, use_hdlc);
v17_tx_set_modem_status_handler(&t->fast_modems.v17_tx, modem_tx_status, (void *) s);
fax_modems_set_tx_handler(t, (span_tx_handler_t) &v17_tx, &t->fast_modems.v17_tx);
/* For any fast modem, set 200ms of preamble flags */
hdlc_tx_flags(&t->hdlc_tx, bit_rate/(8*5));
s->transmit = TRUE;
......
......@@ -415,15 +415,14 @@ then
fi
echo schedule_tests completed OK
#./sig_tone_tests >$STDOUT_DEST 2>$STDERR_DEST
#RETVAL=$?
#if [ $RETVAL != 0 ]
#then
# echo sig_tone_tests failed!
# exit $RETVAL
#fi
#echo sig_tone_tests completed OK
echo sig_tone_tests not enabled
./sig_tone_tests >$STDOUT_DEST 2>$STDERR_DEST
RETVAL=$?
if [ $RETVAL != 0 ]
then
echo sig_tone_tests failed!
exit $RETVAL
fi
echo sig_tone_tests completed OK
#./super_tone_rx_tests >$STDOUT_DEST 2>$STDERR_DEST
#RETVAL=$?
......@@ -445,15 +444,14 @@ echo super_tone_rx_tests not enabled
#echo super_tone_tx_tests completed OK
echo super_tone_tx_tests not enabled
#./swept_tone_tests >$STDOUT_DEST 2>$STDERR_DEST
#RETVAL=$?
#if [ $RETVAL != 0 ]
#then
# echo swept_tone_tests failed!
# exit $RETVAL
#fi
#echo swept_tone_tests completed OK
echo swept_tone_tests not enabled
./swept_tone_tests >$STDOUT_DEST 2>$STDERR_DEST
RETVAL=$?
if [ $RETVAL != 0 ]
then
echo swept_tone_tests failed!
exit $RETVAL
fi
echo swept_tone_tests completed OK
./t31_tests -r >$STDOUT_DEST 2>$STDERR_DEST
RETVAL=$?
......
......@@ -105,7 +105,7 @@ static const struct command_response_s fax_send_test_seq[] =
RESPONSE("\r\nOK\r\n"),
EXCHANGE("AT+FRH=3\r", "\r\nCONNECT\r\n"),
//<DIS frame data>
#if 0
#if 1
RESPONSE("\xFF\x13\x80\x00\xEE\xF8\x80\x80\x91\x80\x80\x80\x18\x78\x57\x10\x03"), // For audio FAXing
#else
RESPONSE("\xFF\x13\x80\x04\xEE\xF8\x80\x80\x91\x80\x80\x80\x18\xE4\xE7\x10\x03"), // For T.38 FAXing
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论