SPAN_DECLARE(int) ademco_contactid_sender_tx(ademco_contactid_sender_state_t *s, int16_t amp[], int max_samples) { int sample; int samples; for (sample = 0; sample < max_samples; sample += samples) { switch (s->step) { case 0: if (!s->clear_to_send) return 0; s->clear_to_send = false; s->step++; s->remaining_samples = ms_to_samples(250); /* Fall through */ case 1: samples = (s->remaining_samples > (max_samples - sample)) ? (max_samples - sample) : s->remaining_samples; vec_zeroi16(&[sample], samples); s->remaining_samples -= samples; if (s->remaining_samples > 0) return samples; span_log(&s->logging, SPAN_LOG_FLOW, "Pre-send silence finished\n"); s->step++; break; case 2: samples = dtmf_tx(&s->dtmf, &[sample], max_samples - sample); if (samples == 0) { s->clear_to_send = false; s->step = 0; return sample; } break; default: return sample; } } return sample; }
int main(int argc, char *argv[]) { dtmf_tx_state_t *gen; int16_t amp[16384]; int len; SNDFILE *outhandle; int add_digits; if ((outhandle = sf_open_telephony_write(OUTPUT_FILE_NAME, 1)) == NULL) { fprintf(stderr, " Cannot open audio file '%s'\n", OUTPUT_FILE_NAME); exit(2); } gen = dtmf_tx_init(NULL, NULL, NULL); len = dtmf_tx(gen, amp, 16384); printf("Generated %d samples\n", len); sf_writef_short(outhandle, amp, len); if (dtmf_tx_put(gen, "123", -1)) { printf("Ooops\n"); exit(2); } len = dtmf_tx(gen, amp, 16384); printf("Generated %d samples\n", len); sf_writef_short(outhandle, amp, len); if (dtmf_tx_put(gen, "456", -1)) { printf("Ooops\n"); exit(2); } len = dtmf_tx(gen, amp, 160); printf("Generated %d samples\n", len); sf_writef_short(outhandle, amp, len); if (dtmf_tx_put(gen, "789", -1)) { printf("Ooops\n"); exit(2); } len = dtmf_tx(gen, amp, 160); printf("Generated %d samples\n", len); sf_writef_short(outhandle, amp, len); if (dtmf_tx_put(gen, "*#", -1)) { printf("Ooops\n"); exit(2); } len = dtmf_tx(gen, amp, 160); printf("Generated %d samples\n", len); sf_writef_short(outhandle, amp, len); add_digits = 1; do { len = dtmf_tx(gen, amp, 160); printf("Generated %d samples\n", len); if (len > 0) sf_writef_short(outhandle, amp, len); if (add_digits) { if (dtmf_tx_put(gen, "1234567890", -1)) { printf("Digit buffer full\n"); add_digits = 0; } } } while (len > 0); dtmf_tx_init(gen, NULL, NULL); len = dtmf_tx(gen, amp, 16384); printf("Generated %d samples\n", len); sf_writef_short(outhandle, amp, len); if (dtmf_tx_put(gen, "123", -1)) { printf("Ooops\n"); exit(2); } len = dtmf_tx(gen, amp, 16384); printf("Generated %d samples\n", len); sf_writef_short(outhandle, amp, len); if (dtmf_tx_put(gen, "456", -1)) { printf("Ooops\n"); exit(2); } len = dtmf_tx(gen, amp, 160); printf("Generated %d samples\n", len); sf_writef_short(outhandle, amp, len); if (dtmf_tx_put(gen, "789", -1)) { printf("Ooops\n"); exit(2); } len = dtmf_tx(gen, amp, 160); printf("Generated %d samples\n", len); sf_writef_short(outhandle, amp, len); if (dtmf_tx_put(gen, "0*#", -1)) { printf("Ooops\n"); exit(2); } len = dtmf_tx(gen, amp, 160); printf("Generated %d samples\n", len); sf_writef_short(outhandle, amp, len); if (dtmf_tx_put(gen, "ABCD", -1)) { printf("Ooops\n"); exit(2); } len = dtmf_tx(gen, amp, 160); printf("Generated %d samples\n", len); sf_writef_short(outhandle, amp, len); /* Try modifying the level and length of the digits */ printf("Try different levels and timing\n"); dtmf_tx_set_level(gen, -20, 5); dtmf_tx_set_timing(gen, 100, 200); if (dtmf_tx_put(gen, "123", -1)) { printf("Ooops\n"); exit(2); } do { len = dtmf_tx(gen, amp, 160); printf("Generated %d samples\n", len); if (len > 0) sf_writef_short(outhandle, amp, len); } while (len > 0); printf("Restore normal levels and timing\n"); dtmf_tx_set_level(gen, -10, 0); dtmf_tx_set_timing(gen, 50, 55); if (dtmf_tx_put(gen, "A", -1)) { printf("Ooops\n"); exit(2); } add_digits = TRUE; do { len = dtmf_tx(gen, amp, 160); printf("Generated %d samples\n", len); if (len > 0) sf_writef_short(outhandle, amp, len); if (add_digits) { if (dtmf_tx_put(gen, "1234567890", -1)) { printf("Digit buffer full\n"); add_digits = FALSE; } } } while (len > 0); if (sf_close_telephony(outhandle)) { fprintf(stderr, " Cannot close audio file '%s'\n", OUTPUT_FILE_NAME); exit(2); } return 0; }