#define HDLC_FRAMING_OK_THRESHOLD 8
-static void fax_send_hdlc(void *user_data, const uint8_t *msg, int len)
+static void fax_modems_hdlc_tx_frame(void *user_data, const uint8_t *msg, int len)
{
- fax_state_t *s;
+ fax_modems_state_t *s;
- s = (fax_state_t *) user_data;
+ s = (fax_modems_state_t *) user_data;
- hdlc_tx_frame(&s->modems.hdlc_tx, msg, len);
+ hdlc_tx_frame(&s->hdlc_tx, msg, len);
}
/*- End of function --------------------------------------------------------*/
}
/*- End of function --------------------------------------------------------*/
-#if 0
static void v8_handler(void *user_data, v8_parms_t *result)
{
fax_state_t *s;
span_log(&s->logging, SPAN_LOG_FLOW, "V.8 report received\n");
}
/*- End of function --------------------------------------------------------*/
-#endif
static void hdlc_underflow_handler(void *user_data)
{
}
/*- End of function --------------------------------------------------------*/
-static void set_rx_handler(fax_state_t *s,
- span_rx_handler_t rx_handler,
- span_rx_fillin_handler_t fillin_handler,
- void *user_data)
-{
- s->modems.rx_handler = rx_handler;
- s->modems.rx_fillin_handler = fillin_handler;
- s->modems.rx_user_data = user_data;
-}
-/*- End of function --------------------------------------------------------*/
-
-static void fax_modems_set_tx_handler(fax_state_t *s, span_tx_handler_t handler, void *user_data)
-{
- s->modems.tx_handler = handler;
- s->modems.tx_user_data = user_data;
-}
-/*- End of function --------------------------------------------------------*/
-
-static void fax_modems_set_next_tx_handler(fax_state_t *s, span_tx_handler_t handler, void *user_data)
-{
- s->modems.next_tx_handler = handler;
- s->modems.next_tx_user_data = user_data;
-}
-/*- End of function --------------------------------------------------------*/
-
static int v17_v21_rx(void *user_data, const int16_t amp[], int len)
{
fax_state_t *t;
t = (fax_state_t *) user_data;
s = &t->modems;
v17_rx(&s->fast_modems.v17_rx, amp, len);
+ fsk_rx(&s->v21_rx, amp, len);
if (t->t30.rx_trained)
{
/* The fast modem has trained, so we no longer need to run the slow one in parallel. */
- span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.17 (%.2fdBm0)\n", v17_rx_signal_power(&s->fast_modems.v17_rx));
- set_rx_handler(t, (span_rx_handler_t) &v17_rx, (span_rx_fillin_handler_t) &v17_rx_fillin, &s->fast_modems.v17_rx);
+ 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, (span_rx_fillin_handler_t) &v17_rx_fillin, &s->fast_modems.v17_rx);
}
- else
+ else if (t->t30.rx_frame_received)
{
- fsk_rx(&s->v21_rx, amp, len);
- if (t->t30.rx_frame_received)
- {
- /* We have received something, and the fast modem has not trained. We must
- be receiving valid V.21 */
- span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_rx));
- set_rx_handler(t, (span_rx_handler_t) &fsk_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &s->v21_rx);
- }
+ /* We have received something, and the fast modem has not trained. We must be receiving valid V.21 */
+ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_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);
}
+ /*endif*/
return 0;
}
/*- End of function --------------------------------------------------------*/
t = (fax_state_t *) user_data;
s = &t->modems;
v27ter_rx(&s->fast_modems.v27ter_rx, amp, len);
+ fsk_rx(&s->v21_rx, amp, len);
if (t->t30.rx_trained)
{
/* The fast modem has trained, so we no longer need to run the slow one in parallel. */
- span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.27ter (%.2fdBm0)\n", v27ter_rx_signal_power(&s->fast_modems.v27ter_rx));
- set_rx_handler(t, (span_rx_handler_t) &v27ter_rx, (span_rx_fillin_handler_t) &v27ter_rx_fillin, &s->fast_modems.v27ter_rx);
+ 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, (span_rx_fillin_handler_t) &v27ter_rx_fillin, &s->fast_modems.v27ter_rx);
}
- else
+ else if (t->t30.rx_frame_received)
{
- fsk_rx(&s->v21_rx, amp, len);
- if (t->t30.rx_frame_received)
- {
- /* We have received something, and the fast modem has not trained. We must
- be receiving valid V.21 */
- span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_rx));
- set_rx_handler(t, (span_rx_handler_t) &fsk_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &s->v21_rx);
- }
+ /* We have received something, and the fast modem has not trained. We must be receiving valid V.21 */
+ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_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);
}
+ /*endif*/
return 0;
}
/*- End of function --------------------------------------------------------*/
t = (fax_state_t *) user_data;
s = &t->modems;
v29_rx(&s->fast_modems.v29_rx, amp, len);
+ fsk_rx(&s->v21_rx, amp, len);
if (t->t30.rx_trained)
{
/* The fast modem has trained, so we no longer need to run the slow one in parallel. */
- span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.29 (%.2fdBm0)\n", v29_rx_signal_power(&s->fast_modems.v29_rx));
- set_rx_handler(t, (span_rx_handler_t) &v29_rx, (span_rx_fillin_handler_t) &v29_rx_fillin, &s->fast_modems.v29_rx);
+ 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, (span_rx_fillin_handler_t) &v29_rx_fillin, &s->fast_modems.v29_rx);
}
- else
+ else if (t->t30.rx_frame_received)
{
- fsk_rx(&s->v21_rx, amp, len);
- if (t->t30.rx_frame_received)
- {
- /* We have received something, and the fast modem has not trained. We must
- be receiving valid V.21 */
- span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_rx));
- set_rx_handler(t, (span_rx_handler_t) &fsk_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &s->v21_rx);
- }
+ /* We have received something, and the fast modem has not trained. We must be receiving valid V.21 */
+ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_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);
}
+ /*endif*/
return 0;
}
/*- End of function --------------------------------------------------------*/
}
#endif
/* Call the fillin function of the current modem (if there is one). */
- s->modems.rx_fillin_handler(s->modems.rx_user_data, len);
+ s->modems.rx_fillin_handler(s->modems.rx_fillin_user_data, len);
t30_timer_update(&s->t30, len);
return 0;
}
t = &s->modems;
if (t->next_tx_handler)
{
- fax_modems_set_tx_handler(s, t->next_tx_handler, t->next_tx_user_data);
+ 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(s, (span_tx_handler_t) &silence_gen, &t->silence_gen);
- fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ 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;
}
case T30_MODEM_V21:
fsk_rx_init(&t->v21_rx, &preset_fsk_specs[FSK_V21CH2], FSK_FRAME_MODE_SYNC, (put_bit_func_t) hdlc_rx_put_bit, put_bit_user_data);
fsk_rx_signal_cutoff(&t->v21_rx, -45.5f);
- set_rx_handler(s, (span_rx_handler_t) &fsk_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &t->v21_rx);
+ fax_modems_set_rx_handler(t, (span_rx_handler_t) &fsk_rx, &t->v21_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &t->v21_rx);
break;
case T30_MODEM_V27TER:
v27ter_rx_restart(&t->fast_modems.v27ter_rx, bit_rate, FALSE);
v27ter_rx_set_put_bit(&t->fast_modems.v27ter_rx, put_bit_func, put_bit_user_data);
- set_rx_handler(s, &v27ter_v21_rx, &v27ter_v21_rx_fillin, s);
+ fax_modems_set_rx_handler(t, &v27ter_v21_rx, s, &v27ter_v21_rx_fillin, s);
break;
case T30_MODEM_V29:
v29_rx_restart(&t->fast_modems.v29_rx, bit_rate, FALSE);
v29_rx_set_put_bit(&t->fast_modems.v29_rx, put_bit_func, put_bit_user_data);
- set_rx_handler(s, &v29_v21_rx, &v29_v21_rx_fillin, s);
+ fax_modems_set_rx_handler(t, &v29_v21_rx, s, &v29_v21_rx_fillin, s);
break;
case T30_MODEM_V17:
v17_rx_restart(&t->fast_modems.v17_rx, bit_rate, short_train);
v17_rx_set_put_bit(&t->fast_modems.v17_rx, put_bit_func, put_bit_user_data);
- set_rx_handler(s, &v17_v21_rx, &v17_v21_rx_fillin, s);
+ fax_modems_set_rx_handler(t, &v17_v21_rx, s, &v17_v21_rx_fillin, s);
break;
case T30_MODEM_DONE:
span_log(&s->logging, SPAN_LOG_FLOW, "FAX exchange complete\n");
default:
- set_rx_handler(s, (span_rx_handler_t) &span_dummy_rx, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, s);
+ fax_modems_set_rx_handler(t, (span_rx_handler_t) &span_dummy_rx, s, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, s);
break;
}
}
{
case T30_MODEM_PAUSE:
silence_gen_alter(&t->silence_gen, ms_to_samples(short_train));
- fax_modems_set_tx_handler(s, (span_tx_handler_t) &silence_gen, &t->silence_gen);
- fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ 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 = TRUE;
break;
case T30_MODEM_CED:
else
tone = MODEM_CONNECT_TONES_FAX_CNG;
modem_connect_tones_tx_init(&t->connect_tx, tone);
- fax_modems_set_tx_handler(s, (span_tx_handler_t) &modem_connect_tones_tx, &t->connect_tx);
- fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ 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) NULL, NULL);
t->transmit = TRUE;
break;
case T30_MODEM_V21:
a 75ms gap before any V.21 transmission is harmless, adds little to the overall length of
a call, and ensures the receiving end is ready. */
silence_gen_alter(&t->silence_gen, ms_to_samples(75));
- fax_modems_set_tx_handler(s, (span_tx_handler_t) &silence_gen, &t->silence_gen);
- fax_modems_set_next_tx_handler(s, (span_tx_handler_t) &fsk_tx, &t->v21_tx);
+ 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) &fsk_tx, &t->v21_tx);
t->transmit = TRUE;
break;
case T30_MODEM_V17:
hdlc_tx_flags(&t->hdlc_tx, bit_rate/(8*5));
v17_tx_restart(&t->fast_modems.v17_tx, bit_rate, t->use_tep, short_train);
v17_tx_set_get_bit(&t->fast_modems.v17_tx, get_bit_func, get_bit_user_data);
- fax_modems_set_tx_handler(s, (span_tx_handler_t) &silence_gen, &t->silence_gen);
- fax_modems_set_next_tx_handler(s, (span_tx_handler_t) &v17_tx, &t->fast_modems.v17_tx);
+ 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) &v17_tx, &t->fast_modems.v17_tx);
t->transmit = TRUE;
break;
case T30_MODEM_V27TER:
hdlc_tx_flags(&t->hdlc_tx, bit_rate/(8*5));
v27ter_tx_restart(&t->fast_modems.v27ter_tx, bit_rate, t->use_tep);
v27ter_tx_set_get_bit(&t->fast_modems.v27ter_tx, get_bit_func, get_bit_user_data);
- fax_modems_set_tx_handler(s, (span_tx_handler_t) &silence_gen, &t->silence_gen);
- fax_modems_set_next_tx_handler(s, (span_tx_handler_t) &v27ter_tx, &t->fast_modems.v27ter_tx);
+ 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) &v27ter_tx, &t->fast_modems.v27ter_tx);
t->transmit = TRUE;
break;
case T30_MODEM_V29:
hdlc_tx_flags(&t->hdlc_tx, bit_rate/(8*5));
v29_tx_restart(&t->fast_modems.v29_tx, bit_rate, t->use_tep);
v29_tx_set_get_bit(&t->fast_modems.v29_tx, get_bit_func, get_bit_user_data);
- fax_modems_set_tx_handler(s, (span_tx_handler_t) &silence_gen, &t->silence_gen);
- fax_modems_set_next_tx_handler(s, (span_tx_handler_t) &v29_tx, &t->fast_modems.v29_tx);
+ 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) &v29_tx, &t->fast_modems.v29_tx);
t->transmit = TRUE;
break;
case T30_MODEM_DONE:
/* Fall through */
default:
silence_gen_alter(&t->silence_gen, 0);
- fax_modems_set_tx_handler(s, (span_tx_handler_t) &silence_gen, &t->silence_gen);
- fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ 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;
break;
}
SPAN_DECLARE(void) fax_set_tep_mode(fax_state_t *s, int use_tep)
{
- s->modems.use_tep = use_tep;
+ fax_modems_set_tep_mode(&s->modems, use_tep);
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) fax_restart(fax_state_t *s, int calling_party)
{
-#if 0
v8_parms_t v8_parms;
-#endif
fax_modems_restart(&s->modems);
-#if 0
v8_parms.modem_connect_tone = MODEM_CONNECT_TONES_ANSAM_PR;
v8_parms.call_function = V8_CALL_T30_RX;
v8_parms.modulations = V8_MOD_V21;
v8_parms.nsf = -1;
v8_parms.t66 = -1;
v8_restart(&s->v8, calling_party, &v8_parms);
-#endif
t30_restart(&s->t30);
#if defined(LOG_FAX_AUDIO)
{
SPAN_DECLARE(fax_state_t *) fax_init(fax_state_t *s, int calling_party)
{
-#if 0
v8_parms_t v8_parms;
-#endif
if (s == NULL)
{
(void *) s,
fax_set_tx_type,
(void *) s,
- fax_send_hdlc,
- (void *) s);
+ fax_modems_hdlc_tx_frame,
+ (void *) &s->modems);
t30_set_supported_modems(&s->t30, T30_SUPPORT_V27TER | T30_SUPPORT_V29 | T30_SUPPORT_V17);
-#if 0
v8_parms.modem_connect_tone = MODEM_CONNECT_TONES_ANSAM_PR;
v8_parms.call_function = V8_CALL_T30_RX;
v8_parms.modulations = V8_MOD_V21;
v8_parms.nsf = -1;
v8_parms.t66 = -1;
v8_init(&s->v8, calling_party, &v8_parms, v8_handler, s);
-#endif
fax_restart(s, calling_party);
return s;
}
#define HDLC_FRAMING_OK_THRESHOLD 5
+SPAN_DECLARE(void) fax_modems_hdlc_tx_frame(void *user_data, const uint8_t *msg, int len)
+{
+ fax_modems_state_t *s;
+
+ s = (fax_modems_state_t *) user_data;
+
+ hdlc_tx_frame(&s->hdlc_tx, msg, len);
+}
+/*- End of function --------------------------------------------------------*/
+
+SPAN_DECLARE(void) fax_modems_hdlc_tx_flags(fax_modems_state_t *s, int flags)
+{
+ hdlc_tx_flags(&s->hdlc_tx, flags);
+}
+/*- End of function --------------------------------------------------------*/
+
+static void v17_rx_status_handler(void *user_data, int status)
+{
+ fax_modems_state_t *s;
+
+ s = (fax_modems_state_t *) user_data;
+ switch (status)
+ {
+ case SIG_STATUS_TRAINING_SUCCEEDED:
+ 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, (span_rx_fillin_handler_t) &v17_rx_fillin, &s->fast_modems.v17_rx);
+ v17_rx_set_modem_status_handler(&s->fast_modems.v17_rx, NULL, s);
+ s->fast_modems.v17_rx.put_bit(s->fast_modems.v17_rx.put_bit_user_data, status);
+ break;
+ }
+ /*endswitch*/
+}
+/*- End of function --------------------------------------------------------*/
+
SPAN_DECLARE_NONSTD(int) fax_modems_v17_v21_rx(void *user_data, const int16_t amp[], int len)
{
fax_modems_state_t *s;
{
/* We have received something, and the fast modem has not trained. We must be receiving valid V.21 */
span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_rx));
- s->rx_handler = (span_rx_handler_t) &fsk_rx;
- s->rx_fillin_handler = (span_rx_fillin_handler_t) &fsk_rx_fillin;
- s->rx_user_data = &s->v21_rx;
- s->rx_fillin_user_data = &s->v21_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);
}
/*endif*/
return 0;
}
/*- End of function --------------------------------------------------------*/
+static void v27ter_rx_status_handler(void *user_data, int status)
+{
+ fax_modems_state_t *s;
+
+ s = (fax_modems_state_t *) user_data;
+ switch (status)
+ {
+ case SIG_STATUS_TRAINING_SUCCEEDED:
+ 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, (span_rx_fillin_handler_t) &v27ter_rx_fillin, &s->fast_modems.v27ter_rx);
+ v27ter_rx_set_modem_status_handler(&s->fast_modems.v27ter_rx, NULL, s);
+ s->fast_modems.v27ter_rx.put_bit(s->fast_modems.v27ter_rx.put_bit_user_data, status);
+ break;
+ }
+ /*endswitch*/
+}
+/*- End of function --------------------------------------------------------*/
+
SPAN_DECLARE_NONSTD(int) fax_modems_v27ter_v21_rx(void *user_data, const int16_t amp[], int len)
{
fax_modems_state_t *s;
{
/* We have received something, and the fast modem has not trained. We must be receiving valid V.21 */
span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_rx));
- s->rx_handler = (span_rx_handler_t) &fsk_rx;
- s->rx_fillin_handler = (span_rx_fillin_handler_t) &fsk_rx_fillin;
- s->rx_user_data = &s->v21_rx;
- s->rx_fillin_user_data = &s->v21_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);
}
/*endif*/
return 0;
}
/*- End of function --------------------------------------------------------*/
+static void v29_rx_status_handler(void *user_data, int status)
+{
+ fax_modems_state_t *s;
+
+ s = (fax_modems_state_t *) user_data;
+ switch (status)
+ {
+ case SIG_STATUS_TRAINING_SUCCEEDED:
+ 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, (span_rx_fillin_handler_t) &v29_rx_fillin, &s->fast_modems.v29_rx);
+ v29_rx_set_modem_status_handler(&s->fast_modems.v29_rx, NULL, s);
+ s->fast_modems.v29_rx.put_bit(s->fast_modems.v29_rx.put_bit_user_data, status);
+ break;
+ }
+ /*endswitch*/
+}
+/*- End of function --------------------------------------------------------*/
+
SPAN_DECLARE_NONSTD(int) fax_modems_v29_v21_rx(void *user_data, const int16_t amp[], int len)
{
fax_modems_state_t *s;
{
/* We have received something, and the fast modem has not trained. We must be receiving valid V.21 */
span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_rx));
- s->rx_handler = (span_rx_handler_t) &fsk_rx;
- s->rx_fillin_handler = (span_rx_fillin_handler_t) &fsk_rx_fillin;
- s->rx_user_data = &s->v21_rx;
- s->rx_fillin_user_data = &s->v21_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);
}
/*endif*/
return 0;
}
/*- End of function --------------------------------------------------------*/
-static void v17_rx_status_handler(void *user_data, int status)
+SPAN_DECLARE(void) fax_modems_start_slow_modem(fax_modems_state_t *s, int which)
{
- fax_modems_state_t *s;
-
- s = (fax_modems_state_t *) user_data;
- switch (status)
+ switch (which)
{
- case SIG_STATUS_TRAINING_SUCCEEDED:
- span_log(&s->logging, SPAN_LOG_FLOW, "Switching to V.17 (%.2fdBm0)\n", v17_rx_signal_power(&s->fast_modems.v17_rx));
- s->rx_handler = (span_rx_handler_t) &v17_rx;
- s->rx_fillin_handler = (span_rx_fillin_handler_t) &v17_rx_fillin;
- s->rx_user_data = &s->fast_modems.v17_rx;
- s->rx_fillin_user_data = &s->fast_modems.v17_rx;
+ 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);
+ fsk_rx_signal_cutoff(&s->v21_rx, -39.09f);
+ s->rx_frame_received = FALSE;
+ 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);
break;
}
- /*endswitch*/
}
/*- End of function --------------------------------------------------------*/
-static void v27ter_rx_status_handler(void *user_data, int status)
+SPAN_DECLARE(void) fax_modems_start_fast_modem(fax_modems_state_t *s, int which, int bit_rate, int short_train, int hdlc_mode)
{
- fax_modems_state_t *s;
+ put_bit_func_t put_bit;
+ get_bit_func_t get_bit;
+ void *get_bit_user_data;
+ void *put_bit_user_data;
- s = (fax_modems_state_t *) user_data;
- switch (status)
+ s->bit_rate = bit_rate;
+ if (hdlc_mode)
{
- case SIG_STATUS_TRAINING_SUCCEEDED:
- span_log(&s->logging, SPAN_LOG_FLOW, "Switching to V.27ter (%.2fdBm0)\n", v27ter_rx_signal_power(&s->fast_modems.v27ter_rx));
- s->rx_handler = (span_rx_handler_t) &v27ter_rx;
- s->rx_fillin_handler = (span_rx_fillin_handler_t) &v27ter_rx_fillin;
- s->rx_user_data = &s->fast_modems.v27ter_rx;
- s->rx_fillin_user_data = &s->fast_modems.v27ter_rx;
- break;
+ get_bit = (get_bit_func_t) hdlc_tx_get_bit;
+ get_bit_user_data = (void *) &s->hdlc_tx;
+ put_bit = (put_bit_func_t) hdlc_rx_put_bit;
+ put_bit_user_data = (void *) &s->hdlc_rx;
}
- /*endswitch*/
-}
-/*- End of function --------------------------------------------------------*/
-
-static void v29_rx_status_handler(void *user_data, int status)
-{
- fax_modems_state_t *s;
+ else
+ {
+ get_bit = s->get_bit;
+ get_bit_user_data = s->get_bit_user_data;
+ put_bit = s->put_bit;
+ put_bit_user_data = s->put_bit_user_data;
+ }
+ /*endif*/
- s = (fax_modems_state_t *) user_data;
- switch (status)
+ /* If we change modems we need to do a complete reinitialisation of the modem, because
+ the modems use overlapping memory. */
+ if (s->fast_modem != which)
{
- case SIG_STATUS_TRAINING_SUCCEEDED:
- span_log(&s->logging, SPAN_LOG_FLOW, "Switching to V.29 (%.2fdBm0)\n", v29_rx_signal_power(&s->fast_modems.v29_rx));
- s->rx_handler = (span_rx_handler_t) &v29_rx;
- s->rx_fillin_handler = (span_rx_fillin_handler_t) &v29_rx_fillin;
- s->rx_user_data = &s->fast_modems.v29_rx;
- s->rx_fillin_user_data = &s->fast_modems.v29_rx;
- break;
+ s->current_rx_type = which;
+ s->short_train = FALSE;
+ s->fast_modem = which;
+ if (hdlc_mode)
+ s->rx_frame_received = FALSE;
+ switch (s->fast_modem)
+ {
+ case FAX_MODEM_V27TER_RX:
+ v27ter_rx_init(&s->fast_modems.v27ter_rx, s->bit_rate, put_bit, put_bit_user_data);
+ v27ter_rx_set_modem_status_handler(&s->fast_modems.v27ter_rx, v27ter_rx_status_handler, s);
+ fax_modems_set_rx_handler(s, (span_rx_handler_t) &fax_modems_v27ter_v21_rx, s, (span_rx_fillin_handler_t) &fax_modems_v27ter_v21_rx_fillin, s);
+ break;
+ case FAX_MODEM_V29_RX:
+ v29_rx_init(&s->fast_modems.v29_rx, s->bit_rate, put_bit, put_bit_user_data);
+ v29_rx_signal_cutoff(&s->fast_modems.v29_rx, -45.5f);
+ v29_rx_set_modem_status_handler(&s->fast_modems.v29_rx, v29_rx_status_handler, s);
+ fax_modems_set_rx_handler(s, (span_rx_handler_t) &fax_modems_v29_v21_rx, s, (span_rx_fillin_handler_t) &fax_modems_v29_v21_rx_fillin, s);
+ break;
+ case FAX_MODEM_V17_RX:
+ v17_rx_init(&s->fast_modems.v17_rx, s->bit_rate, put_bit, put_bit_user_data);
+ v17_rx_set_modem_status_handler(&s->fast_modems.v17_rx, v17_rx_status_handler, s);
+ fax_modems_set_rx_handler(s, (span_rx_handler_t) &fax_modems_v17_v21_rx, s, (span_rx_fillin_handler_t) &fax_modems_v17_v21_rx_fillin, s);
+ break;
+ case FAX_MODEM_V27TER_TX:
+ v27ter_tx_init(&s->fast_modems.v27ter_tx, s->bit_rate, s->use_tep, get_bit, get_bit_user_data);
+ fax_modems_set_tx_handler(s, (span_tx_handler_t) &v27ter_tx, &s->fast_modems.v27ter_tx);
+ fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ break;
+ case FAX_MODEM_V29_TX:
+ v29_tx_init(&s->fast_modems.v29_tx, s->bit_rate, s->use_tep, get_bit, get_bit_user_data);
+ fax_modems_set_tx_handler(s, (span_tx_handler_t) &v29_tx, &s->fast_modems.v29_tx);
+ fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ break;
+ case FAX_MODEM_V17_TX:
+ v17_tx_init(&s->fast_modems.v17_tx, s->bit_rate, s->use_tep, get_bit, get_bit_user_data);
+ fax_modems_set_tx_handler(s, (span_tx_handler_t) &v17_tx, &s->fast_modems.v17_tx);
+ fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ break;
+ }
+ /*endswitch*/
}
- /*endswitch*/
+ else
+ {
+ s->short_train = short_train;
+ switch (s->fast_modem)
+ {
+ case FAX_MODEM_V27TER_RX:
+ v27ter_rx_restart(&s->fast_modems.v27ter_rx, s->bit_rate, FALSE);
+ v27ter_rx_set_put_bit(&s->fast_modems.v27ter_rx, put_bit, put_bit_user_data);
+ v27ter_rx_set_modem_status_handler(&s->fast_modems.v27ter_rx, v27ter_rx_status_handler, s);
+ fax_modems_set_rx_handler(s, (span_rx_handler_t) &fax_modems_v27ter_v21_rx, s, (span_rx_fillin_handler_t) &fax_modems_v27ter_v21_rx_fillin, s);
+ break;
+ case FAX_MODEM_V29_RX:
+ v29_rx_restart(&s->fast_modems.v29_rx, s->bit_rate, FALSE);
+ v29_rx_set_put_bit(&s->fast_modems.v29_rx, put_bit, put_bit_user_data);
+ v29_rx_set_modem_status_handler(&s->fast_modems.v29_rx, v29_rx_status_handler, s);
+ fax_modems_set_rx_handler(s, (span_rx_handler_t) &fax_modems_v29_v21_rx, s, (span_rx_fillin_handler_t) &fax_modems_v29_v21_rx_fillin, s);
+ break;
+ case FAX_MODEM_V17_RX:
+ v17_rx_restart(&s->fast_modems.v17_rx, s->bit_rate, s->short_train);
+ v17_rx_set_put_bit(&s->fast_modems.v17_rx, put_bit, put_bit_user_data);
+ v17_rx_set_modem_status_handler(&s->fast_modems.v17_rx, v17_rx_status_handler, s);
+ fax_modems_set_rx_handler(s, (span_rx_handler_t) &fax_modems_v17_v21_rx, s, (span_rx_fillin_handler_t) &fax_modems_v17_v21_rx_fillin, s);
+ break;
+ case FAX_MODEM_V27TER_TX:
+ v27ter_tx_restart(&s->fast_modems.v27ter_tx, s->bit_rate, s->use_tep);
+ v27ter_tx_set_get_bit(&s->fast_modems.v27ter_tx, get_bit, get_bit_user_data);
+ fax_modems_set_tx_handler(s, (span_tx_handler_t) &v27ter_tx, &s->fast_modems.v27ter_tx);
+ fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ break;
+ case FAX_MODEM_V29_TX:
+ v29_tx_restart(&s->fast_modems.v29_tx, s->bit_rate, s->use_tep);
+ v29_tx_set_get_bit(&s->fast_modems.v29_tx, get_bit, get_bit_user_data);
+ fax_modems_set_tx_handler(s, (span_tx_handler_t) &v29_tx, &s->fast_modems.v29_tx);
+ fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ break;
+ case FAX_MODEM_V17_TX:
+ v17_tx_restart(&s->fast_modems.v17_tx, s->bit_rate, s->use_tep, s->short_train);
+ v17_tx_set_get_bit(&s->fast_modems.v17_tx, get_bit, get_bit_user_data);
+ fax_modems_set_tx_handler(s, (span_tx_handler_t) &v17_tx, &s->fast_modems.v17_tx);
+ fax_modems_set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ break;
+ }
+ /*endswitch*/
+ }
+ /*endif*/
}
/*- End of function --------------------------------------------------------*/
}
/*- End of function --------------------------------------------------------*/
+SPAN_DECLARE(void) fax_modems_set_rx_handler(fax_modems_state_t *s,
+ span_rx_handler_t rx_handler,
+ void *rx_user_data,
+ span_rx_fillin_handler_t rx_fillin_handler,
+ void *rx_fillin_user_data)
+{
+ s->rx_handler = rx_handler;
+ s->rx_user_data = rx_user_data;
+ s->rx_fillin_handler = rx_fillin_handler;
+ s->rx_fillin_user_data = rx_fillin_user_data;
+}
+/*- End of function --------------------------------------------------------*/
+
+#if 0
+SPAN_DECLARE(void) fax_modems_set_rx_active(fax_modems_state_t *s, int active)
+{
+ s->rx_handler = (active) ? s->base_rx_handler : span_dummy_rx;
+ s->rx_fillin_handler = (active) ? s->base_rx_fillin_handler : span_dummy_rx_fillin;
+}
+/*- End of function --------------------------------------------------------*/
+#endif
+
+SPAN_DECLARE(void) fax_modems_set_tx_handler(fax_modems_state_t *s, span_tx_handler_t handler, void *user_data)
+{
+ s->tx_handler = handler;
+ s->tx_user_data = user_data;
+}
+/*- End of function --------------------------------------------------------*/
+
+SPAN_DECLARE(void) fax_modems_set_next_tx_handler(fax_modems_state_t *s, span_tx_handler_t handler, void *user_data)
+{
+ s->next_tx_handler = handler;
+ s->next_tx_user_data = user_data;
+}
+/*- End of function --------------------------------------------------------*/
+
SPAN_DECLARE(void) fax_modems_set_tep_mode(fax_modems_state_t *s, int use_tep)
{
s->use_tep = use_tep;
memset(s, 0, sizeof(*s));
s->use_tep = use_tep;
+ modem_connect_tones_tx_init(&s->connect_tx, MODEM_CONNECT_TONES_FAX_CNG);
+ if (tone_callback)
+ {
+ modem_connect_tones_rx_init(&s->connect_rx,
+ MODEM_CONNECT_TONES_FAX_CNG,
+ tone_callback,
+ user_data);
+ }
+ /*endif*/
+ span_log_init(&s->logging, SPAN_LOG_NONE, NULL);
+ span_log_set_protocol(&s->logging, "FAX modems");
+
+ dc_restore_init(&s->dc_restore);
+
+ s->get_bit = non_ecm_get_bit;
+ s->get_bit_user_data = user_data;
+ s->put_bit = non_ecm_put_bit;
+ s->put_bit_user_data = user_data;
+
+ s->hdlc_accept = hdlc_accept;
+ s->hdlc_accept_user_data = user_data;
+
hdlc_rx_init(&s->hdlc_rx, FALSE, FALSE, HDLC_FRAMING_OK_THRESHOLD, hdlc_accept, user_data);
hdlc_tx_init(&s->hdlc_tx, FALSE, 2, FALSE, hdlc_tx_underflow, user_data);
+
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);
fsk_rx_signal_cutoff(&s->v21_rx, -39.09f);
fsk_tx_init(&s->v21_tx, &preset_fsk_specs[FSK_V21CH2], (get_bit_func_t) hdlc_tx_get_bit, &s->hdlc_tx);
v27ter_rx_init(&s->fast_modems.v27ter_rx, 4800, non_ecm_put_bit, user_data);
v27ter_tx_init(&s->fast_modems.v27ter_tx, 4800, s->use_tep, non_ecm_get_bit, user_data);
silence_gen_init(&s->silence_gen, 0);
- modem_connect_tones_tx_init(&s->connect_tx, MODEM_CONNECT_TONES_FAX_CNG);
- if (tone_callback)
- {
- modem_connect_tones_rx_init(&s->connect_rx,
- MODEM_CONNECT_TONES_FAX_CNG,
- tone_callback,
- user_data);
- }
- /*endif*/
- dc_restore_init(&s->dc_restore);
s->rx_signal_present = FALSE;
s->rx_handler = (span_rx_handler_t) &span_dummy_rx;
SPAN_DECLARE_NONSTD(int) fax_modems_v27ter_v21_rx_fillin(void *user_data, int len);
SPAN_DECLARE_NONSTD(int) fax_modems_v29_v21_rx_fillin(void *user_data, int len);
+SPAN_DECLARE(void) fax_modems_hdlc_tx_frame(void *user_data, const uint8_t *msg, int len);
+
+SPAN_DECLARE(void) fax_modems_hdlc_tx_flags(fax_modems_state_t *s, int flags);
+
SPAN_DECLARE(void) fax_modems_start_rx_modem(fax_modems_state_t *s, int which);
+SPAN_DECLARE(void) fax_modems_start_fast_modem(fax_modems_state_t *s, int which, int bit_rate, int short_train, int hdlc_mode);
+
+SPAN_DECLARE(void) fax_modems_start_slow_modem(fax_modems_state_t *s, int which);
+
SPAN_DECLARE(void) fax_modems_set_tep_mode(fax_modems_state_t *s, int use_tep);
+SPAN_DECLARE(void) fax_modems_set_rx_handler(fax_modems_state_t *s,
+ span_rx_handler_t rx_handler,
+ void *rx_user_data,
+ span_rx_fillin_handler_t rx_fillin_handler,
+ void *rx_fillin_user_data);
+
+SPAN_DECLARE(void) fax_modems_set_rx_active(fax_modems_state_t *s, int active);
+
+SPAN_DECLARE(void) fax_modems_set_tx_handler(fax_modems_state_t *s, span_tx_handler_t handler, void *user_data);
+
+SPAN_DECLARE(void) fax_modems_set_next_tx_handler(fax_modems_state_t *s, span_tx_handler_t handler, void *user_data);
+
SPAN_DECLARE(int) fax_modems_restart(fax_modems_state_t *s);
/*! Get a pointer to the logging context associated with a FAX modems context.
/*! \brief */
dc_restore_state_t dc_restore;
+ /*! \brief The fast modem type currently in use */
+ int fast_modem;
+
/*! \brief The currently selected receiver type */
int current_rx_type;
/*! \brief The currently selected transmitter type */
int current_tx_type;
+ int bit_rate;
+ int short_train;
+
+ /*! \brief The callback function used to put each bit received. */
+ put_bit_func_t put_bit;
+ /*! \brief A user specified opaque pointer passed to the put_bit routine. */
+ void *put_bit_user_data;
+
+ /*! \brief The callback function used to get the next bit to be transmitted. */
+ get_bit_func_t get_bit;
+ /*! \brief A user specified opaque pointer passed to the get_bit function. */
+ void *get_bit_user_data;
+
+ hdlc_frame_handler_t hdlc_accept;
+ void *hdlc_accept_user_data;
+
/*! \brief TRUE if a carrier is present. Otherwise FALSE. */
int rx_signal_present;
/*! \brief TRUE if a modem has trained correctly. */
/*! \brief The current receive signal handler */
span_rx_handler_t rx_handler;
+ void *rx_user_data;
/*! \brief The current receive missing signal fill-in handler */
span_rx_fillin_handler_t rx_fillin_handler;
- void *rx_user_data;
void *rx_fillin_user_data;
/*! \brief The current transmit signal handler */
static int restart_modem(t31_state_t *s, int new_modem);
static void hdlc_accept_frame(void *user_data, const uint8_t *msg, int len, int ok);
-static void set_rx_handler(t31_state_t *s, span_rx_handler_t rx_handler, span_rx_fillin_handler_t fillin_handler, void *user_data);
-static void set_tx_handler(t31_state_t *s, span_tx_handler_t handler, void *user_data);
-static void set_next_tx_handler(t31_state_t *s, span_tx_handler_t handler, void *user_data);
static int v17_v21_rx(void *user_data, const int16_t amp[], int len);
static int v17_v21_rx_fillin(void *user_data, int len);
static int v27ter_v21_rx(void *user_data, const int16_t amp[], int len);
break;
case SIG_STATUS_TRAINING_FAILED:
s->at_state.rx_trained = FALSE;
+ s->audio.modems.rx_trained = FALSE;
break;
case SIG_STATUS_TRAINING_SUCCEEDED:
/* The modem is now trained */
at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
s->at_state.rx_signal_present = TRUE;
s->at_state.rx_trained = TRUE;
+ s->audio.modems.rx_trained = TRUE;
break;
case SIG_STATUS_CARRIER_UP:
break;
}
s->at_state.rx_signal_present = FALSE;
s->at_state.rx_trained = FALSE;
+ s->audio.modems.rx_trained = FALSE;
break;
default:
if (s->at_state.p.result_code_format)
}
/*- End of function --------------------------------------------------------*/
-#if 0
static void v8_handler(void *user_data, v8_parms_t *result)
{
t31_state_t *s;
span_log(&s->logging, SPAN_LOG_FLOW, "V.8 report received\n");
}
/*- End of function --------------------------------------------------------*/
-#endif
static void hdlc_tx_underflow(void *user_data)
{
break;
case SIG_STATUS_TRAINING_FAILED:
s->at_state.rx_trained = FALSE;
+ s->audio.modems.rx_trained = FALSE;
break;
case SIG_STATUS_TRAINING_SUCCEEDED:
/* The modem is now trained */
s->at_state.rx_signal_present = TRUE;
s->at_state.rx_trained = TRUE;
+ 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)
{
s->at_state.rx_signal_present = TRUE;
s->rx_frame_received = FALSE;
+ s->audio.modems.rx_frame_received = FALSE;
}
break;
case SIG_STATUS_CARRIER_DOWN:
}
s->at_state.rx_signal_present = FALSE;
s->at_state.rx_trained = FALSE;
+ 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)
{
s->at_state.rx_signal_present = TRUE;
s->rx_frame_received = TRUE;
+ s->audio.modems.rx_frame_received = TRUE;
s->modem = FAX_MODEM_V21_RX;
s->at_state.transmit = FALSE;
s->at_state.dte_is_waiting = TRUE;
s->modem = FAX_MODEM_SILENCE_TX;
t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
s->rx_frame_received = FALSE;
+ s->audio.modems.rx_frame_received = FALSE;
at_put_response_code(&s->at_state, AT_RESPONSE_CODE_FCERROR);
}
}
/* Report CONNECT as soon as possible to avoid a timeout. */
at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
s->rx_frame_received = TRUE;
+ s->audio.modems.rx_frame_received = TRUE;
}
else
{
/* Report CONNECT as soon as possible to avoid a timeout. */
at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
s->rx_frame_received = TRUE;
+ s->audio.modems.rx_frame_received = TRUE;
}
else
{
at_put_response_code(&s->at_state, (ok) ? AT_RESPONSE_CODE_OK : AT_RESPONSE_CODE_ERROR);
s->at_state.dte_is_waiting = FALSE;
s->rx_frame_received = FALSE;
+ s->audio.modems.rx_frame_received = FALSE;
}
}
else
s->tx.final = FALSE;
s->at_state.rx_signal_present = FALSE;
s->at_state.rx_trained = FALSE;
+ s->audio.modems.rx_trained = FALSE;
s->rx_frame_received = FALSE;
- set_rx_handler(s, (span_rx_handler_t) &span_dummy_rx, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, NULL);
+ s->audio.modems.rx_frame_received = FALSE;
+ fax_modems_set_rx_handler(t, (span_rx_handler_t) &span_dummy_rx, NULL, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, NULL);
use_hdlc = FALSE;
switch (s->modem)
{
/* 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. */
- set_rx_handler(s, (span_rx_handler_t) &cng_rx, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, s);
t31_v21_rx(s);
- set_tx_handler(s, (span_tx_handler_t) &modem_connect_tones_tx, &t->connect_tx);
- set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ 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_next_tx_handler(t, (span_tx_handler_t) NULL, NULL);
}
s->at_state.transmit = TRUE;
break;
}
else
{
- set_rx_handler(s, (span_rx_handler_t) &cng_rx, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, s);
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);
silence_gen_set(&t->silence_gen, 0);
- set_tx_handler(s, (span_tx_handler_t) &silence_gen, &t->silence_gen);
+ fax_modems_set_tx_handler(t, (span_tx_handler_t) &silence_gen, &t->silence_gen);
}
s->at_state.transmit = FALSE;
break;
else
{
modem_connect_tones_tx_init(&t->connect_tx, MODEM_CONNECT_TONES_FAX_CED);
- set_tx_handler(s, (span_tx_handler_t) &modem_connect_tones_tx, &t->connect_tx);
- set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ 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) NULL, NULL);
}
s->at_state.transmit = TRUE;
break;
/* The spec says 1s +-15% of preamble. So, the minimum is 32 octets. */
hdlc_tx_flags(&t->hdlc_tx, 32);
fsk_tx_init(&t->v21_tx, &preset_fsk_specs[FSK_V21CH2], (get_bit_func_t) hdlc_tx_get_bit, &t->hdlc_tx);
- set_tx_handler(s, (span_tx_handler_t) &fsk_tx, &t->v21_tx);
- set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ fax_modems_set_tx_handler(t, (span_tx_handler_t) &fsk_tx, &t->v21_tx);
+ fax_modems_set_next_tx_handler(t, (span_tx_handler_t) NULL, NULL);
}
s->hdlc_tx.final = FALSE;
s->hdlc_tx.len = 0;
}
else
{
- set_rx_handler(s, (span_rx_handler_t) &fsk_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &t->v21_rx);
t31_v21_rx(s);
+ fax_modems_set_rx_handler(t, (span_rx_handler_t) &fsk_rx, &t->v21_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &t->v21_rx);
}
break;
case FAX_MODEM_V17_TX:
else
{
v17_tx_restart(&t->fast_modems.v17_tx, s->bit_rate, FALSE, s->short_train);
- set_tx_handler(s, (span_tx_handler_t) &v17_tx, &t->fast_modems.v17_tx);
- set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ fax_modems_set_tx_handler(t, (span_tx_handler_t) &v17_tx, &t->fast_modems.v17_tx);
+ fax_modems_set_next_tx_handler(t, (span_tx_handler_t) NULL, NULL);
}
s->tx.out_bytes = 0;
s->tx.data_started = FALSE;
case FAX_MODEM_V17_RX:
if (!s->t38_mode)
{
- set_rx_handler(s, (span_rx_handler_t) &v17_v21_rx, (span_rx_fillin_handler_t) &v17_v21_rx_fillin, s);
+ fax_modems_set_rx_handler(t, (span_rx_handler_t) &v17_v21_rx, s, (span_rx_fillin_handler_t) &v17_v21_rx_fillin, s);
v17_rx_restart(&t->fast_modems.v17_rx, s->bit_rate, s->short_train);
/* Allow for +FCERROR/+FRH:3 */
t31_v21_rx(s);
else
{
v27ter_tx_restart(&t->fast_modems.v27ter_tx, s->bit_rate, FALSE);
- set_tx_handler(s, (span_tx_handler_t) &v27ter_tx, &t->fast_modems.v27ter_tx);
- set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ fax_modems_set_tx_handler(t, (span_tx_handler_t) &v27ter_tx, &t->fast_modems.v27ter_tx);
+ fax_modems_set_next_tx_handler(t, (span_tx_handler_t) NULL, NULL);
}
s->tx.out_bytes = 0;
s->tx.data_started = FALSE;
case FAX_MODEM_V27TER_RX:
if (!s->t38_mode)
{
- set_rx_handler(s, (span_rx_handler_t) &v27ter_v21_rx, (span_rx_fillin_handler_t) &v27ter_v21_rx_fillin, s);
+ fax_modems_set_rx_handler(t, (span_rx_handler_t) &v27ter_v21_rx, s, (span_rx_fillin_handler_t) &v27ter_v21_rx_fillin, s);
v27ter_rx_restart(&t->fast_modems.v27ter_rx, s->bit_rate, FALSE);
/* Allow for +FCERROR/+FRH:3 */
t31_v21_rx(s);
else
{
v29_tx_restart(&t->fast_modems.v29_tx, s->bit_rate, FALSE);
- set_tx_handler(s, (span_tx_handler_t) &v29_tx, &t->fast_modems.v29_tx);
- set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ fax_modems_set_tx_handler(t, (span_tx_handler_t) &v29_tx, &t->fast_modems.v29_tx);
+ fax_modems_set_next_tx_handler(t, (span_tx_handler_t) NULL, NULL);
}
s->tx.out_bytes = 0;
s->tx.data_started = FALSE;
case FAX_MODEM_V29_RX:
if (!s->t38_mode)
{
- set_rx_handler(s, (span_rx_handler_t) &v29_v21_rx, (span_rx_fillin_handler_t) &v29_v21_rx_fillin, s);
+ fax_modems_set_rx_handler(t, (span_rx_handler_t) &v29_v21_rx, s, (span_rx_fillin_handler_t) &v29_v21_rx_fillin, s);
v29_rx_restart(&t->fast_modems.v29_rx, s->bit_rate, FALSE);
/* Allow for +FCERROR/+FRH:3 */
t31_v21_rx(s);
else
{
silence_gen_set(&t->silence_gen, 0);
- set_tx_handler(s, (span_tx_handler_t) &silence_gen, &t->silence_gen);
- set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ 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);
}
s->at_state.transmit = FALSE;
break;
case FAX_MODEM_SILENCE_RX:
if (!s->t38_mode)
{
- set_rx_handler(s, (span_rx_handler_t) &silence_rx, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, s);
+ fax_modems_set_rx_handler(t, (span_rx_handler_t) &silence_rx, s, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, NULL);
silence_gen_set(&t->silence_gen, 0);
- set_tx_handler(s, (span_tx_handler_t) &silence_gen, &t->silence_gen);
- set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ 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);
}
s->at_state.transmit = FALSE;
break;
{
s->modem = FAX_MODEM_SILENCE_TX;
silence_gen_alter(&t->silence_gen, ms_to_samples(200));
- set_tx_handler(s, (span_tx_handler_t) &silence_gen, &t->silence_gen);
- set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ 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);
s->at_state.transmit = TRUE;
}
break;
/* Send straight away, if there is something queued. */
t31_set_at_rx_mode(s, AT_MODE_DELIVERY);
s->rx_frame_received = FALSE;
+ s->audio.modems.rx_frame_received = FALSE;
do
{
if (!queue_empty(s->rx_queue))
s->at_state.rx_data_bytes = 0;
s->at_state.transmit = FALSE;
s->modem = FAX_MODEM_SILENCE_TX;
- set_rx_handler(s, (span_rx_handler_t) &span_dummy_rx, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, NULL);
+ fax_modems_set_rx_handler(&s->audio.modems, (span_rx_handler_t) &span_dummy_rx, NULL, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, NULL);
t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK);
}
}
/*- End of function --------------------------------------------------------*/
-static void set_rx_handler(t31_state_t *s,
- span_rx_handler_t rx_handler,
- span_rx_fillin_handler_t fillin_handler,
- void *user_data)
-{
- s->audio.modems.rx_handler = rx_handler;
- s->audio.modems.rx_fillin_handler = fillin_handler;
- s->audio.modems.rx_user_data = user_data;
-}
-/*- End of function --------------------------------------------------------*/
-
-static void set_tx_handler(t31_state_t *s, span_tx_handler_t handler, void *user_data)
-{
- s->audio.modems.tx_handler = handler;
- s->audio.modems.tx_user_data = user_data;
-}
-/*- End of function --------------------------------------------------------*/
-
-static void set_next_tx_handler(t31_state_t *s, span_tx_handler_t handler, void *user_data)
-{
- s->audio.modems.next_tx_handler = handler;
- s->audio.modems.next_tx_user_data = user_data;
-}
-/*- End of function --------------------------------------------------------*/
-
static int silence_rx(void *user_data, const int16_t amp[], int len)
{
t31_state_t *s;
{
/* The fast modem has trained, so we no longer need to run the slow
one in parallel. */
- span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.17 (%.2fdBm0)\n", v17_rx_signal_power(&s->fast_modems.v17_rx));
- set_rx_handler(t, (span_rx_handler_t) &v17_rx, (span_rx_fillin_handler_t) &v17_rx_fillin, &s->fast_modems.v17_rx);
+ 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, (span_rx_fillin_handler_t) &v17_rx_fillin, &s->fast_modems.v17_rx);
}
else
{
{
/* We have received something, and the fast modem has not trained. We must
be receiving valid V.21 */
- span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_rx));
- set_rx_handler(t, (span_rx_handler_t) &fsk_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &s->v21_rx);
+ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_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);
}
}
return len;
{
/* The fast modem has trained, so we no longer need to run the slow
one in parallel. */
- span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.27ter (%.2fdBm0)\n", v27ter_rx_signal_power(&s->fast_modems.v27ter_rx));
- set_rx_handler(t, (span_rx_handler_t) &v27ter_rx, (span_rx_fillin_handler_t) &v27ter_rx_fillin, &s->fast_modems.v27ter_rx);
+ 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, (span_rx_fillin_handler_t) &v27ter_rx_fillin, &s->fast_modems.v27ter_rx);
}
else
{
{
/* We have received something, and the fast modem has not trained. We must
be receiving valid V.21 */
- span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_rx));
- set_rx_handler(t, (span_rx_handler_t) &fsk_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &s->v21_rx);
+ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_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);
}
}
return len;
/* 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));
- set_rx_handler(t, (span_rx_handler_t) &v29_rx, (span_rx_fillin_handler_t) &v29_rx_fillin, &s->fast_modems.v29_rx);
+ fax_modems_set_rx_handler(s, (span_rx_handler_t) &v29_rx, &s->fast_modems.v29_rx, (span_rx_fillin_handler_t) &v29_rx_fillin, &s->fast_modems.v29_rx);
}
else
{
{
/* We have received something, and the fast modem has not trained. We must
be receiving valid V.21 */
- span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_rx));
- set_rx_handler(t, (span_rx_handler_t) &fsk_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &s->v21_rx);
+ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_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);
}
}
return len;
{
if (s->audio.next_tx_handler)
{
- set_tx_handler(s, s->audio.next_tx_handler, s->audio.next_tx_user_data);
- set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ 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;
}
/* There is nothing else to change to, so use zero length silence */
silence_gen_alter(&s->audio.modems.silence_gen, 0);
- set_tx_handler(s, (span_tx_handler_t) &silence_gen, &s->audio.modems.silence_gen);
- set_next_tx_handler(s, (span_tx_handler_t) NULL, NULL);
+ 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 --------------------------------------------------------*/
t38_tx_packet_handler_t tx_t38_packet_handler,
void *tx_t38_packet_user_data)
{
-#if 0
v8_parms_t v8_parms;
-#endif
int alloced;
if (at_tx_handler == NULL || modem_control_handler == NULL)
non_ecm_get_bit,
tone_detected,
(void *) s);
-#if 0
v8_parms.modem_connect_tone = MODEM_CONNECT_TONES_ANSAM_PR;
v8_parms.call_function = V8_CALL_T30_RX;
v8_parms.modulations = V8_MOD_V21
v8_parms.t66 = -1;
v8_init(&s->audio.v8, FALSE, &v8_parms, v8_handler, s);
-#endif
power_meter_init(&s->audio.rx_power, 4);
s->audio.last_sample = 0;
s->audio.silence_threshold_power = power_meter_level_dbm0(-36);
s->at_state.rx_signal_present = FALSE;
s->at_state.rx_trained = FALSE;
+ s->audio.modems.rx_trained = FALSE;
s->at_state.do_hangup = FALSE;
s->at_state.line_ptr = 0;
static void non_ecm_push_residue(t38_gateway_state_t *s);
static void tone_detected(void *user_data, int tone, int level, int delay);
-static void set_rx_handler(t38_gateway_state_t *s, span_rx_handler_t handler, span_rx_fillin_handler_t fillin_handler, void *user_data)
+static void set_rx_handler(t38_gateway_state_t *s,
+ span_rx_handler_t handler,
+ void *user_data,
+ span_rx_fillin_handler_t fillin_handler,
+ void *rx_fillin_user_data)
{
if (s->audio.modems.rx_handler != span_dummy_rx)
{
s->audio.base_rx_handler = handler;
s->audio.base_rx_fillin_handler = fillin_handler;
s->audio.modems.rx_user_data = user_data;
+ s->audio.modems.rx_fillin_user_data = rx_fillin_user_data;
}
/*- End of function --------------------------------------------------------*/
/* The fast modem has trained, so we no longer need to run the slow
one in parallel. */
span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.17 (%.2fdBm0)\n", v17_rx_signal_power(&s->fast_modems.v17_rx));
- set_rx_handler(t, (span_rx_handler_t) &v17_rx, (span_rx_fillin_handler_t) &v17_rx_fillin, &s->fast_modems.v17_rx);
+ set_rx_handler(t, (span_rx_handler_t) &v17_rx, &s->fast_modems.v17_rx, (span_rx_fillin_handler_t) &v17_rx_fillin, &s->fast_modems.v17_rx);
}
else
{
if (s->rx_signal_present)
{
span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_rx));
- set_rx_handler(t, (span_rx_handler_t) &fsk_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &s->v21_rx);
+ set_rx_handler(t, (span_rx_handler_t) &fsk_rx, &s->v21_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &s->v21_rx);
}
/*endif*/
}
/* The fast modem has trained, so we no longer need to run the slow
one in parallel. */
span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.27ter (%.2fdBm0)\n", v27ter_rx_signal_power(&s->fast_modems.v27ter_rx));
- set_rx_handler(t, (span_rx_handler_t) &v27ter_rx, (span_rx_fillin_handler_t) &v27ter_v21_rx_fillin, &s->fast_modems.v27ter_rx);
+ set_rx_handler(t, (span_rx_handler_t) &v27ter_rx, &s->fast_modems.v27ter_rx, (span_rx_fillin_handler_t) &v27ter_v21_rx_fillin, &s->fast_modems.v27ter_rx);
}
else
{
if (s->rx_signal_present)
{
span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_rx));
- set_rx_handler(t, (span_rx_handler_t) &fsk_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &s->v21_rx);
+ set_rx_handler(t, (span_rx_handler_t) &fsk_rx, &s->v21_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &s->v21_rx);
}
/*endif*/
}
/* The fast modem has trained, so we no longer need to run the slow
one in parallel. */
span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.29 (%.2fdBm0)\n", v29_rx_signal_power(&s->fast_modems.v29_rx));
- set_rx_handler(t, (span_rx_handler_t) &v29_rx, (span_rx_fillin_handler_t) &v29_rx_fillin, &s->fast_modems.v29_rx);
+ set_rx_handler(t, (span_rx_handler_t) &v29_rx, &s->fast_modems.v29_rx, (span_rx_fillin_handler_t) &v29_rx_fillin, &s->fast_modems.v29_rx);
}
else
{
if (s->rx_signal_present)
{
span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_rx));
- set_rx_handler(t, (span_rx_handler_t) &fsk_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &s->v21_rx);
+ set_rx_handler(t, (span_rx_handler_t) &fsk_rx, &s->v21_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &s->v21_rx);
}
/*endif*/
}
int short_train;
fax_modems_state_t *t;
t38_gateway_hdlc_state_t *u;
+ int bit_rate;
t = &s->audio.modems;
t38_non_ecm_buffer_report_output_status(&s->core.non_ecm_to_modem, &s->logging);
break;
case T38_IND_V27TER_2400_TRAINING:
case T38_IND_V27TER_4800_TRAINING:
- switch (indicator)
- {
- case T38_IND_V27TER_2400_TRAINING:
- t->tx_bit_rate = 2400;
- break;
- case T38_IND_V27TER_4800_TRAINING:
- t->tx_bit_rate = 4800;
- break;
- }
- /*endswitch*/
+ bit_rate =
+ t->tx_bit_rate = (indicator == T38_IND_V27TER_4800_TRAINING) ? 4800 : 2400;
silence_gen_alter(&t->silence_gen, ms_to_samples(75));
v27ter_tx_restart(&t->fast_modems.v27ter_tx, t->tx_bit_rate, t->use_tep);
v27ter_tx_set_get_bit(&t->fast_modems.v27ter_tx, get_bit_func, get_bit_user_data);
break;
case T38_IND_V29_7200_TRAINING:
case T38_IND_V29_9600_TRAINING:
- switch (indicator)
- {
- case T38_IND_V29_7200_TRAINING:
- t->tx_bit_rate = 7200;
- break;
- case T38_IND_V29_9600_TRAINING:
- t->tx_bit_rate = 9600;
- break;
- }
- /*endswitch*/
+ bit_rate =
+ t->tx_bit_rate = (indicator == T38_IND_V29_9600_TRAINING) ? 9600 : 7200;
silence_gen_alter(&t->silence_gen, ms_to_samples(75));
v29_tx_restart(&t->fast_modems.v29_tx, t->tx_bit_rate, t->use_tep);
v29_tx_set_get_bit(&t->fast_modems.v29_tx, get_bit_func, get_bit_user_data);
{
case T38_IND_V17_7200_SHORT_TRAINING:
short_train = TRUE;
- t->tx_bit_rate = 7200;
+ bit_rate = 7200;
break;
case T38_IND_V17_7200_LONG_TRAINING:
- t->tx_bit_rate = 7200;
+ bit_rate = 7200;
break;
case T38_IND_V17_9600_SHORT_TRAINING:
short_train = TRUE;
- t->tx_bit_rate = 9600;
+ bit_rate = 9600;
break;
case T38_IND_V17_9600_LONG_TRAINING:
- t->tx_bit_rate = 9600;
+ bit_rate = 9600;
break;
case T38_IND_V17_12000_SHORT_TRAINING:
short_train = TRUE;
- t->tx_bit_rate = 12000;
+ bit_rate = 12000;
break;
case T38_IND_V17_12000_LONG_TRAINING:
- t->tx_bit_rate = 12000;
+ bit_rate = 12000;
break;
case T38_IND_V17_14400_SHORT_TRAINING:
short_train = TRUE;
- t->tx_bit_rate = 14400;
+ bit_rate = 14400;
break;
case T38_IND_V17_14400_LONG_TRAINING:
- t->tx_bit_rate = 14400;
+ bit_rate = 14400;
break;
}
/*endswitch*/
+ t->tx_bit_rate = bit_rate;
silence_gen_alter(&t->silence_gen, ms_to_samples(75));
v17_tx_restart(&t->fast_modems.v17_tx, t->tx_bit_rate, t->use_tep, short_train);
v17_tx_set_get_bit(&t->fast_modems.v17_tx, get_bit_func, get_bit_user_data);
span_log(&s->logging,
SPAN_LOG_FLOW,
"Changing - (%d) %s -> %s\n",
- silence_gen_remainder(&(s->audio.modems.silence_gen)),
+ silence_gen_remainder(&s->audio.modems.silence_gen),
t38_indicator_to_str(t->current_rx_indicator),
t38_indicator_to_str(indicator));
switch (s->t38x.current_rx_field_class)
span_log(&s->logging,
SPAN_LOG_FLOW,
"Queued change - (%d) %s -> %s\n",
- silence_gen_remainder(&(s->audio.modems.silence_gen)),
+ silence_gen_remainder(&s->audio.modems.silence_gen),
t38_indicator_to_str(t->current_rx_indicator),
t38_indicator_to_str(indicator));
}
case FAX_MODEM_V27TER_RX:
v27ter_rx_restart(&t->fast_modems.v27ter_rx, s->core.fast_bit_rate, FALSE);
v27ter_rx_set_put_bit(&t->fast_modems.v27ter_rx, put_bit_func, put_bit_user_data);
- set_rx_handler(s, &v27ter_v21_rx, &v27ter_v21_rx_fillin, s);
+ set_rx_handler(s, &v27ter_v21_rx, s, &v27ter_v21_rx_fillin, s);
s->core.fast_rx_active = FAX_MODEM_V27TER_RX;
break;
case FAX_MODEM_V29_RX:
v29_rx_restart(&t->fast_modems.v29_rx, s->core.fast_bit_rate, FALSE);
v29_rx_set_put_bit(&t->fast_modems.v29_rx, put_bit_func, put_bit_user_data);
- set_rx_handler(s, &v29_v21_rx, &v29_v21_rx_fillin, s);
+ set_rx_handler(s, &v29_v21_rx, s, &v29_v21_rx_fillin, s);
s->core.fast_rx_active = FAX_MODEM_V29_RX;
break;
case FAX_MODEM_V17_RX:
v17_rx_restart(&t->fast_modems.v17_rx, s->core.fast_bit_rate, s->core.short_train);
v17_rx_set_put_bit(&t->fast_modems.v17_rx, put_bit_func, put_bit_user_data);
- set_rx_handler(s, &v17_v21_rx, &v17_v21_rx_fillin, s);
+ set_rx_handler(s, &v17_v21_rx, s, &v17_v21_rx_fillin, s);
s->core.fast_rx_active = FAX_MODEM_V17_RX;
break;
default:
- set_rx_handler(s, (span_rx_handler_t) &fsk_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &t->v21_rx);
+ set_rx_handler(s, (span_rx_handler_t) &fsk_rx, &t->v21_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &t->v21_rx);
s->core.fast_rx_active = FAX_MODEM_NONE;
break;
}
#endif
update_rx_timing(s, len);
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*/
s->audio.modems.rx_handler(s->audio.modems.rx_user_data, amp, len);
return 0;
#endif
update_rx_timing(s, len);
/* TODO: handle the modems properly */
- s->audio.modems.rx_fillin_handler(s->audio.modems.rx_user_data, len);
+ s->audio.modems.rx_fillin_handler(s->audio.modems.rx_fillin_user_data, len);
return 0;
}
/*- End of function --------------------------------------------------------*/
len += s->audio.modems.tx_handler(s->audio.modems.tx_user_data, amp + len, max_len - len);
if (len < max_len)
{
- silence_gen_set(&(s->audio.modems.silence_gen), 0);
+ silence_gen_set(&s->audio.modems.silence_gen, 0);
set_next_tx_type(s);
}
/*endif*/