static void fax_set_rx_type(void *user_data, int type, int bit_rate, int short_train, int use_hdlc) { fax_state_t *s; put_bit_func_t put_bit_func; void *put_bit_user_data; fax_modems_state_t *t; s = (fax_state_t *) user_data; t = &s->modems; span_log(&s->logging, SPAN_LOG_FLOW, "Set rx type %d\n", type); if (t->current_rx_type == type) return; /*endif*/ t->current_rx_type = type; t->rx_bit_rate = bit_rate; if (use_hdlc) { put_bit_func = (put_bit_func_t) hdlc_rx_put_bit; put_bit_user_data = (void *) &t->hdlc_rx; hdlc_rx_init(&t->hdlc_rx, false, true, HDLC_FRAMING_OK_THRESHOLD, t30_hdlc_accept, &s->t30); } else { put_bit_func = t30_non_ecm_put_bit; put_bit_user_data = (void *) &s->t30; } /*endif*/ switch (type) { 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); 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); 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); 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); 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); break; } /*endswitch*/ }
SPAN_DECLARE(void) fax_modems_start_fast_modem(fax_modems_state_t *s, int which, int bit_rate, int short_train, int hdlc_mode) { put_bit_func_t put_bit; get_bit_func_t get_bit; void *get_bit_user_data; void *put_bit_user_data; s->bit_rate = bit_rate; if (hdlc_mode) { 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; } 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*/ /* 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) { 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*/ } 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*/ }
static void fax_set_rx_type(void *user_data, int type, int short_train, int use_hdlc) { fax_state_t *s; put_bit_func_t put_bit_func; void *put_bit_user_data; s = (fax_state_t *) user_data; span_log(&s->logging, SPAN_LOG_FLOW, "Set rx type %d\n", type); if (s->current_rx_type == type) return; s->current_rx_type = type; if (use_hdlc) { put_bit_func = (put_bit_func_t) hdlc_rx_put_bit; put_bit_user_data = (void *) &(s->hdlcrx); hdlc_rx_init(&(s->hdlcrx), FALSE, FALSE, 5, t30_hdlc_accept, &(s->t30_state)); } else { put_bit_func = t30_non_ecm_put_bit; put_bit_user_data = (void *) &(s->t30_state); } switch (type) { case T30_MODEM_V21: if (s->flush_handler) s->flush_handler(s, s->flush_user_data, 3); fsk_rx_init(&(s->v21rx), &preset_fsk_specs[FSK_V21CH2], TRUE, (put_bit_func_t) hdlc_rx_put_bit, put_bit_user_data); fsk_rx_signal_cutoff(&(s->v21rx), -45.5); s->rx_handler = (span_rx_handler_t *) &fsk_rx; s->rx_user_data = &(s->v21rx); break; case T30_MODEM_V27TER_2400: v27ter_rx_restart(&(s->v27ter_rx), 2400, FALSE); v27ter_rx_set_put_bit(&(s->v27ter_rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v27ter_rx; s->rx_user_data = s; break; case T30_MODEM_V27TER_4800: v27ter_rx_restart(&(s->v27ter_rx), 4800, FALSE); v27ter_rx_set_put_bit(&(s->v27ter_rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v27ter_rx; s->rx_user_data = s; break; case T30_MODEM_V29_7200: v29_rx_restart(&(s->v29rx), 7200, FALSE); v29_rx_set_put_bit(&(s->v29rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v29_rx; s->rx_user_data = s; break; case T30_MODEM_V29_9600: v29_rx_restart(&(s->v29rx), 9600, FALSE); v29_rx_set_put_bit(&(s->v29rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v29_rx; s->rx_user_data = s; break; case T30_MODEM_V17_7200: v17_rx_restart(&(s->v17rx), 7200, short_train); v17_rx_set_put_bit(&(s->v17rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v17_rx; s->rx_user_data = s; break; case T30_MODEM_V17_9600: v17_rx_restart(&(s->v17rx), 9600, short_train); v17_rx_set_put_bit(&(s->v17rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v17_rx; s->rx_user_data = s; break; case T30_MODEM_V17_12000: v17_rx_restart(&(s->v17rx), 12000, short_train); v17_rx_set_put_bit(&(s->v17rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v17_rx; s->rx_user_data = s; break; case T30_MODEM_V17_14400: v17_rx_restart(&(s->v17rx), 14400, short_train); v17_rx_set_put_bit(&(s->v17rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v17_rx; s->rx_user_data = s; break; case T30_MODEM_DONE: span_log(&s->logging, SPAN_LOG_FLOW, "FAX exchange complete\n"); default: s->rx_handler = (span_rx_handler_t *) &dummy_rx; s->rx_user_data = s; break; } }