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); /* The specified timing is 50-60ms on, 50-60ms off */ dtmf_tx_set_timing(&s->dtmf, 55, 55); return s; }
SPAN_DECLARE(dtmf_rx_state_t *) dtmf_rx_init(dtmf_rx_state_t *s, digits_rx_callback_t callback, void *user_data) { int i; static int initialised = FALSE; if (s == NULL) { if ((s = (dtmf_rx_state_t *) malloc(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, "DTMF"); s->digits_callback = callback; s->digits_callback_data = user_data; s->realtime_callback = NULL; s->realtime_callback_data = NULL; s->filter_dialtone = FALSE; s->normal_twist = DTMF_NORMAL_TWIST; s->reverse_twist = DTMF_REVERSE_TWIST; s->threshold = DTMF_THRESHOLD; s->in_digit = 0; s->last_hit = 0; if (!initialised) { for (i = 0; i < 4; i++) { make_goertzel_descriptor(&dtmf_detect_row[i], dtmf_row[i], DTMF_SAMPLES_PER_BLOCK); make_goertzel_descriptor(&dtmf_detect_col[i], dtmf_col[i], DTMF_SAMPLES_PER_BLOCK); } initialised = TRUE; } for (i = 0; i < 4; i++) { goertzel_init(&s->row_out[i], &dtmf_detect_row[i]); goertzel_init(&s->col_out[i], &dtmf_detect_col[i]); } #if defined(SPANDSP_USE_FIXED_POINT) s->energy = 0; #else s->energy = 0.0f; #endif s->current_sample = 0; s->lost_digits = 0; s->current_digits = 0; s->digits[0] = '\0'; return s; }
bell_mf_rx_state_t *bell_mf_rx_init(bell_mf_rx_state_t *s, void (*callback)(void *user_data, const char *digits, int len), void *user_data) { int i; static int initialised = FALSE; if (!initialised) { for (i = 0; i < 6; i++) make_goertzel_descriptor(&bell_mf_detect_desc[i], bell_mf_frequencies[i], 120); initialised = TRUE; } s->callback = callback; s->callback_data = user_data; s->hits[0] = s->hits[1] = s->hits[2] = s->hits[3] = s->hits[4] = 0; for (i = 0; i < 6; i++) goertzel_init(&s->out[i], &bell_mf_detect_desc[i]); s->current_sample = 0; s->lost_digits = 0; s->current_digits = 0; s->digits[0] = '\0'; return s; }
SPAN_DECLARE(r2_mf_rx_state_t *) r2_mf_rx_init(r2_mf_rx_state_t *s, int fwd, tone_report_func_t callback, void *user_data) { int i; static int initialised = FALSE; if (s == NULL) { if ((s = (r2_mf_rx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->fwd = fwd; if (!initialised) { for (i = 0; i < 6; i++) { make_goertzel_descriptor(&mf_fwd_detect_desc[i], (float) r2_mf_fwd_frequencies[i], R2_MF_SAMPLES_PER_BLOCK); make_goertzel_descriptor(&mf_back_detect_desc[i], (float) r2_mf_back_frequencies[i], R2_MF_SAMPLES_PER_BLOCK); } initialised = TRUE; } if (fwd) { for (i = 0; i < 6; i++) goertzel_init(&s->out[i], &mf_fwd_detect_desc[i]); } else { for (i = 0; i < 6; i++) goertzel_init(&s->out[i], &mf_back_detect_desc[i]); } s->callback = callback; s->callback_data = user_data; s->current_digit = 0; s->current_sample = 0; return s; }
static int add_super_tone_freq(super_tone_rx_descriptor_t *desc, int freq) { int i; if (freq == 0) return -1; /* Look for an existing frequency */ for (i = 0; i < desc->used_frequencies; i++) { if (desc->pitches[i][0] == freq) return desc->pitches[i][1]; } /* Look for an existing tone which is very close. We may need to merge the detectors. */ for (i = 0; i < desc->used_frequencies; i++) { if ((desc->pitches[i][0] - 10) <= freq && freq <= (desc->pitches[i][0] + 10)) { /* Merge these two */ desc->pitches[desc->used_frequencies][0] = freq; desc->pitches[desc->used_frequencies][1] = i; make_goertzel_descriptor(&desc->desc[desc->pitches[i][1]], (float) (freq + desc->pitches[i][0])/2, SUPER_TONE_BINS); desc->used_frequencies++; return desc->pitches[i][1]; } } desc->pitches[i][0] = freq; desc->pitches[i][1] = desc->monitored_frequencies; if (desc->monitored_frequencies%5 == 0) { desc->desc = (goertzel_descriptor_t *) span_realloc(desc->desc, (desc->monitored_frequencies + 5)*sizeof(goertzel_descriptor_t)); } make_goertzel_descriptor(&desc->desc[desc->monitored_frequencies++], (float) freq, SUPER_TONE_BINS); desc->used_frequencies++; return desc->pitches[i][1]; }
SPAN_DECLARE(bell_mf_rx_state_t *) bell_mf_rx_init(bell_mf_rx_state_t *s, digits_rx_callback_t callback, void *user_data) { int i; static int initialised = FALSE; if (s == NULL) { if ((s = (bell_mf_rx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); if (!initialised) { for (i = 0; i < 6; i++) make_goertzel_descriptor(&bell_mf_detect_desc[i], (float) bell_mf_frequencies[i], BELL_MF_SAMPLES_PER_BLOCK); initialised = TRUE; } s->digits_callback = callback; s->digits_callback_data = user_data; s->hits[0] = s->hits[1] = s->hits[2] = s->hits[3] = s->hits[4] = 0; for (i = 0; i < 6; i++) goertzel_init(&s->out[i], &bell_mf_detect_desc[i]); s->current_sample = 0; s->lost_digits = 0; s->current_digits = 0; s->digits[0] = '\0'; return s; }