SPAN_DECLARE(ademco_contactid_sender_state_t *) ademco_contactid_sender_init(ademco_contactid_sender_state_t *s, tone_report_func_t callback, void *user_data) { if (s == NULL) { if ((s = (ademco_contactid_sender_state_t *) span_alloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "Ademco"); if (!tone_rx_init) { make_goertzel_descriptor(&tone_1400_desc, 1400.0f, GOERTZEL_SAMPLES_PER_BLOCK); make_goertzel_descriptor(&tone_2300_desc, 2300.0f, GOERTZEL_SAMPLES_PER_BLOCK); tone_rx_init = true; } goertzel_init(&s->tone_1400, &tone_1400_desc); goertzel_init(&s->tone_2300, &tone_2300_desc); s->current_sample = 0; s->callback = callback; s->callback_user_data = user_data; s->step = 0; s->remaining_samples = ms_to_samples(100); dtmf_tx_init(&s->dtmf, NULL, NULL); /* The specified timing is 50-60ms on, 50-60ms off */ dtmf_tx_set_timing(&s->dtmf, 55, 55); return s; }
SPAN_DECLARE(sig_tone_tx_state_t *) sig_tone_tx_init(sig_tone_tx_state_t *s, int tone_type, tone_report_func_t sig_update, void *user_data) { int i; if (sig_update == NULL || tone_type < 1 || tone_type > 3) return NULL; /*endif*/ if (s == NULL) { if ((s = (sig_tone_tx_state_t *) span_alloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->sig_update = sig_update; s->user_data = user_data; s->desc = &sig_tones[tone_type - 1]; for (i = 0; i < 2; i++) { if (s->desc->tone_freq[i]) s->phase_rate[i] = dds_phase_rate((float) s->desc->tone_freq[i]); else s->phase_rate[i] = 0; s->tone_scaling[i][0] = dds_scaling_dbm0((float) s->desc->tone_amp[i][0]); s->tone_scaling[i][1] = dds_scaling_dbm0((float) s->desc->tone_amp[i][1]); } return s; }
SPAN_DECLARE(fax_modems_state_t *) fax_modems_init(fax_modems_state_t *s, int use_tep, hdlc_frame_handler_t hdlc_accept, hdlc_underflow_handler_t hdlc_tx_underflow, put_bit_func_t non_ecm_put_bit, get_bit_func_t non_ecm_get_bit, tone_report_func_t tone_callback, void *user_data) { if (s == NULL) { if ((s = (fax_modems_state_t *) span_alloc(sizeof(*s))) == NULL) return NULL; } /*endif*/ memset(s, 0, sizeof(*s)); s->use_tep = use_tep; modem_connect_tones_tx_init(&s->connect_tx, MODEM_CONNECT_TONES_FAX_CNG); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "FAX modems"); 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, s->tone_callback, s->tone_callback_user_data); } /*endif*/ 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, fax_modems_hdlc_accept, s); hdlc_tx_init(&s->hdlc_tx, false, 2, false, hdlc_tx_underflow, user_data); fax_modems_start_slow_modem(s, FAX_MODEM_V21_RX); fsk_tx_init(&s->v21_tx, &preset_fsk_specs[FSK_V21CH2], (get_bit_func_t) hdlc_tx_get_bit, &s->hdlc_tx); silence_gen_init(&s->silence_gen, 0); s->rx_signal_present = false; s->rx_handler = (span_rx_handler_t) &span_dummy_rx; s->rx_fillin_handler = (span_rx_fillin_handler_t) &span_dummy_rx; s->rx_user_data = NULL; s->rx_fillin_user_data = NULL; s->tx_handler = (span_tx_handler_t) &silence_gen; s->tx_user_data = &s->silence_gen; return s; }
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) { if ((s = (fax_state_t *) span_alloc(sizeof(*s))) == NULL) return NULL; /*endif*/ } /*endif*/ memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "FAX"); fax_modems_init(&s->modems, false, t30_hdlc_accept, hdlc_underflow_handler, t30_non_ecm_put_bit, t30_non_ecm_get_bit, tone_detected, &s->t30); t30_init(&s->t30, calling_party, fax_set_rx_type, (void *) s, fax_set_tx_type, (void *) s, fax_send_hdlc, (void *) s); 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; if (s->t30.supported_modems & T30_SUPPORT_V27TER) v8_parms.modulations |= V8_MOD_V27TER; /*endif*/ if (s->t30.supported_modems & T30_SUPPORT_V29) v8_parms.modulations |= V8_MOD_V29; /*endif*/ if (s->t30.supported_modems & T30_SUPPORT_V17) v8_parms.modulations |= V8_MOD_V17; /*endif*/ if (s->t30.supported_modems & T30_SUPPORT_V34HDX) v8_parms.modulations |= V8_MOD_V34HDX; /*endif*/ v8_parms.protocol = V8_PROTOCOL_NONE; v8_parms.pcm_modem_availability = 0; v8_parms.pstn_access = 0; 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; }
SPAN_DECLARE(t4_rx_state_t *) t4_rx_init(t4_rx_state_t *s, const char *file, int supported_output_compressions) { bool alloced; alloced = false; if (s == NULL) { if ((s = (t4_rx_state_t *) span_alloc(sizeof(*s))) == NULL) return NULL; alloced = true; } #if defined(SPANDSP_SUPPORT_TIFF_FX) TIFF_FX_init(); #endif memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "T.4"); span_log(&s->logging, SPAN_LOG_FLOW, "Start rx document\n"); s->supported_tiff_compressions = supported_output_compressions; #if !defined(SPANDSP_SUPPORT_T88) s->supported_tiff_compressions &= ~T4_COMPRESSION_T88; #endif #if !defined(SPANDSP_SUPPORT_T43) s->supported_tiff_compressions &= ~T4_COMPRESSION_T43; #endif #if !defined(SPANDSP_SUPPORT_T45) s->supported_tiff_compressions &= ~T4_COMPRESSION_T45; #endif /* Set some default values */ s->metadata.x_resolution = T4_X_RESOLUTION_R8; s->metadata.y_resolution = T4_Y_RESOLUTION_FINE; s->current_page = 0; s->current_decoder = 0; /* Default handler */ s->row_handler = tiff_row_write_handler; s->row_handler_user_data = s; if (file) { s->tiff.pages_in_file = 0; if (open_tiff_output_file(s, file) < 0) { if (alloced) span_free(s); return NULL; } /* Save the file name for logging reports. */ s->tiff.file = strdup(file); } return s; }
SPAN_DECLARE(silence_gen_state_t *) silence_gen_init(silence_gen_state_t *s, int silent_samples) { if (s == NULL) { if ((s = (silence_gen_state_t *) span_alloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->remaining_samples = silent_samples; return s; }
SPAN_DECLARE(tone_gen_descriptor_t *) tone_gen_descriptor_init(tone_gen_descriptor_t *s, int f1, int l1, int f2, int l2, int d1, int d2, int d3, int d4, int repeat) { if (s == NULL) { if ((s = (tone_gen_descriptor_t *) span_alloc(sizeof(*s))) == NULL) { return NULL; } } memset(s, 0, sizeof(*s)); if (f1) { #if defined(SPANDSP_USE_FIXED_POINT) s->tone[0].phase_rate = dds_phase_rate((float) f1); if (f2 < 0) s->tone[0].phase_rate = -s->tone[0].phase_rate; s->tone[0].gain = dds_scaling_dbm0((float) l1); #else s->tone[0].phase_rate = dds_phase_ratef((float) f1); if (f2 < 0) s->tone[0].phase_rate = -s->tone[0].phase_rate; s->tone[0].gain = dds_scaling_dbm0f((float) l1); #endif } if (f2) { #if defined(SPANDSP_USE_FIXED_POINT) s->tone[1].phase_rate = dds_phase_rate((float) abs(f2)); s->tone[1].gain = (f2 < 0) ? (float) 32767.0f*l2/100.0f : dds_scaling_dbm0((float) l2); #else s->tone[1].phase_rate = dds_phase_ratef((float) abs(f2)); s->tone[1].gain = (f2 < 0) ? (float) l2/100.0f : dds_scaling_dbm0f((float) l2); #endif } s->duration[0] = d1*SAMPLE_RATE/1000; s->duration[1] = d2*SAMPLE_RATE/1000; s->duration[2] = d3*SAMPLE_RATE/1000; s->duration[3] = d4*SAMPLE_RATE/1000; s->repeat = repeat; return s; }
SPAN_DECLARE(queue_state_t *) queue_init(queue_state_t *s, int len, int flags) { if (s == NULL) { if ((s = (queue_state_t *) span_alloc(sizeof(*s) + len + 1)) == NULL) return NULL; } s->iptr = s->optr = 0; s->flags = flags; s->len = len + 1; return s; }
SPAN_DECLARE(super_tone_rx_descriptor_t *) super_tone_rx_make_descriptor(super_tone_rx_descriptor_t *desc) { if (desc == NULL) { if ((desc = (super_tone_rx_descriptor_t *) span_alloc(sizeof(*desc))) == NULL) return NULL; } desc->tone_list = NULL; desc->tone_segs = NULL; desc->used_frequencies = 0; desc->monitored_frequencies = 0; desc->desc = NULL; desc->tones = 0; return desc; }
SPAN_DECLARE(int) t30_set_tx_nss(t30_state_t *s, const uint8_t *nss, int len) { if (s->tx_info.nss) span_free(s->tx_info.nss); if (nss && len > 0 && (s->tx_info.nss = span_alloc(len + 3))) { memcpy(&s->tx_info.nss[3], nss, len); s->tx_info.nss_len = len; } else { s->tx_info.nss = NULL; s->tx_info.nss_len = 0; } return 0; }
SPAN_DECLARE(int) t30_set_tx_nsc(t30_state_t *s, const uint8_t *nsc, int len) { if (s->tx_info.nsc) span_free(s->tx_info.nsc); if (nsc && len > 0 && (s->tx_info.nsc = span_alloc(len + 3))) { memcpy(s->tx_info.nsc + 3, nsc, len); s->tx_info.nsc_len = len; } else { s->tx_info.nsc = NULL; s->tx_info.nsc_len = 0; } return 0; }
SPAN_DECLARE(int) t30_set_tx_tsa(t30_state_t *s, int type, const char *address, int len) { if (s->tx_info.tsa) span_free(s->tx_info.tsa); if (address == NULL || len == 0) { s->tx_info.tsa = NULL; s->tx_info.tsa_len = 0; return 0; } s->tx_info.tsa_type = type; if (len < 0) len = strlen(address); if ((s->tx_info.tsa = span_alloc(len))) { memcpy(s->tx_info.tsa, address, len); s->tx_info.tsa_len = len; } return 0; }
int main(int argc, char *argv[]) { void *a; void *b; void *c; if (span_mem_allocators(memalign, malloc, realloc, free)) { printf("Failed\n"); exit(2); } a = span_aligned_alloc(8, 42); b = span_alloc(42); c = span_realloc(NULL, 42); printf("%p %p %p\n", a, b, c); span_free(a); span_free(b); span_free(c); }
SPAN_DECLARE(super_tone_rx_state_t *) super_tone_rx_init(super_tone_rx_state_t *s, super_tone_rx_descriptor_t *desc, tone_report_func_t callback, void *user_data) { int i; if (desc == NULL) return NULL; if (callback == NULL) return NULL; if (s == NULL) { if ((s = (super_tone_rx_state_t *) span_alloc(sizeof(*s) + desc->monitored_frequencies*sizeof(goertzel_state_t))) == NULL) return NULL; } for (i = 0; i < 11; i++) { s->segments[i].f1 = -1; s->segments[i].f2 = -1; s->segments[i].min_duration = 0; } s->segment_callback = NULL; s->tone_callback = callback; s->callback_data = user_data; if (desc) s->desc = desc; s->detected_tone = -1; #if defined(SPANDSP_USE_FIXED_POINT) s->energy = 0; #else s->energy = 0.0f; #endif for (i = 0; i < desc->monitored_frequencies; i++) goertzel_init(&s->state[i], &s->desc->desc[i]); return s; }
SPAN_DECLARE(ademco_contactid_receiver_state_t *) ademco_contactid_receiver_init(ademco_contactid_receiver_state_t *s, ademco_contactid_report_func_t callback, void *user_data) { if (s == NULL) { if ((s = (ademco_contactid_receiver_state_t *) span_alloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "Ademco"); dtmf_rx_init(&s->dtmf, dtmf_digit_delivery, (void *) s); s->rx_digits_len = 0; s->callback = callback; s->callback_user_data = user_data; s->step = 0; s->remaining_samples = ms_to_samples(500); return s; }