static switch_bool_t inband_dtmf_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type) { switch_inband_dtmf_t *pvt = (switch_inband_dtmf_t *) user_data; switch_frame_t *frame = NULL; switch (type) { case SWITCH_ABC_TYPE_INIT: { pvt->dtmf_detect = dtmf_rx_init(NULL, NULL, NULL); dtmf_rx_parms(pvt->dtmf_detect, pvt->filter_dialtone, pvt->twist, pvt->reverse_twist, pvt->threshold); dtmf_rx_set_realtime_callback(pvt->dtmf_detect, spandsp_dtmf_rx_realtime_callback, pvt); break; } case SWITCH_ABC_TYPE_CLOSE: if (pvt->dtmf_detect) { dtmf_rx_free(pvt->dtmf_detect); } break; case SWITCH_ABC_TYPE_READ_REPLACE: if ((frame = switch_core_media_bug_get_read_replace_frame(bug))) { dtmf_rx(pvt->dtmf_detect, frame->data, frame->samples); switch_core_media_bug_set_read_replace_frame(bug, frame); } break; case SWITCH_ABC_TYPE_WRITE: default: break; } return SWITCH_TRUE; }
static void gst_dtmf_detect_state_reset (GstDtmfDetect * self) { if (self->dtmf_state) dtmf_rx_free (self->dtmf_state); self->dtmf_state = dtmf_rx_init (NULL, NULL, NULL); }
void SpanDtmfProbe() { std::string dtmfCode = "*1234567890#ABCD"; iDSP::DtmfGeneratorProfile prof; prof.Level = 0; prof.DurationMs = 80; // 70 мало prof.PauseMs = 40; // 50 20-мало iDSP::DtmfGenerator gen; gen.Add(dtmfCode); // Init: digits_rx_callback_t callback = 0;//EvDigitDetected; void* pUserData = 0; dtmf_rx_state_t state; dtmf_rx_state_t* pState = &state; dtmf_rx_init(pState, callback, pUserData); // Adjust detector: bool rej350_440 = false; int fwTwist = 8; //8 Db максимальная разница уровней частот в комбинации int revTwist = 8; //-4 Db ? int threshold = -26; //Db минимальный уровень сигнала dtmf_rx_parms(pState, rej350_440, fwTwist, revTwist, threshold); while (gen.RestSampleCount() != 0) { int16_t sample = gen.NextSample(); dtmf_rx(pState, &sample, 1); } const int CMaxSymbols = 100; char dtmfCodeRx[CMaxSymbols]; int size = dtmf_rx_get(pState, dtmfCodeRx, CMaxSymbols); TUT_ASSERT(size == dtmfCode.size()); dtmfCodeRx[size] = '\0'; TUT_ASSERT(dtmfCode == dtmfCodeRx); // delete pState; //dtmf_rx_free(pState); //pState = 0; }
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; }
int main(int argc, char *argv[]) { int rc = 0; short readbuf[160]; char digitsbuf[255]; int fd = open(argv[1], O_RDONLY); #if defined(BELL_DETECTOR) bell_mf_rx_state_t *rxstate = NULL; if (!(rxstate = bell_mf_rx_init(rxstate, NULL, NULL))) { fprintf(stderr, "bell_mf_rx_init\n"); return -1; } #elif defined(MF_DETECTOR_FWD) r2_mf_rx_state_t *rxstate = NULL; if (!(rxstate = r2_mf_rx_init(rxstate, 1, NULL, NULL))) { fprintf(stderr, "r2_mf_rx_init fwd\n"); return -1; } #elif defined(MF_DETECTOR_BWD) r2_mf_rx_state_t *rxstate = NULL; if (!(rxstate = r2_mf_rx_init(rxstate, 0, NULL, NULL))) { fprintf(stderr, "r2_mf_rx_init backward\n"); return -1; } #elif defined(DTMF_DETECTOR) dtmf_rx_state_t *rxstate = NULL; if (!(rxstate = dtmf_rx_init(rxstate, NULL, NULL))) { fprintf(stderr, "dtmf_rx_init\n"); return -1; } #else #error "define detector type!" #endif if (fd == -1) { perror("fopen"); return -1; } while (1) { rc = read(fd, readbuf, sizeof(readbuf)/sizeof(readbuf[0])); if (rc < 0) { perror("read"); break; } if (!rc) { break; } #if defined(BELL_DETECTOR) rc = bell_mf_rx(rxstate, readbuf, rc/2); if (rc != 0) { fprintf(stderr, "Unprocessed samples: %d\n", rc); break; } digitsbuf[0] = '\0'; rc = bell_mf_rx_get(rxstate, digitsbuf, sizeof(digitsbuf)-1); if (rc > 0) { printf("Rx digits: %s\n", digitsbuf); } #elif defined(MF_DETECTOR_FWD) || defined(MF_DETECTOR_BWD) rc = r2_mf_rx(rxstate, readbuf, rc/2); if (rc != 0) { fprintf(stderr, "Unprocessed samples: %d\n", rc); break; } rc = r2_mf_rx_get(rxstate); if (rc > 0) { printf("Rx digit: %c\n", rc); } #elif defined(DTMF_DETECTOR) rc = dtmf_rx(rxstate, readbuf, rc/2); if (rc != 0) { fprintf(stderr, "Unprocessed samples: %d\n", rc); break; } digitsbuf[0] = '\0'; rc = dtmf_rx_get(rxstate, digitsbuf, sizeof(digitsbuf)-1); if (rc > 0) { printf("Rx digit: %s\n", digitsbuf); } #else #error "define detector type!" #endif } #if defined(BELL_DETECTOR) bell_mf_rx_free(rxstate); #elif defined(MF_DETECTOR_FWD) || defined(MF_DETECTOR_BWD) r2_mf_rx_free(rxstate); #elif defined(DTMF_DETECTOR) dtmf_rx_free(rxstate); #endif close(fd); return 0; }
int main(int argc, char *argv[]) { struct stat statbuf; FILE *audiofp; short slinear_buffer[CHUNK_SAMPLES]; char alaw_buffer[CHUNK_SAMPLES]; char *chunk_buffer; size_t chunksize = 0; int format = FORMAT_INVALID; int i = 0; char digit = 0; char currdigit = 0; dtmf_rx_state_t *rxstate = NULL; printf("Running DTMF Detection Test - alaw or slinear 8000hz only\n"); if (argc < 3) { fprintf(stderr, USAGE, argv[0]); exit(1); } if (!strncasecmp(argv[1], "alaw", sizeof("alaw")-1)) { format = FORMAT_ALAW; chunksize = sizeof(alaw_buffer); chunk_buffer = alaw_buffer; } else if (!strncasecmp(argv[1], "slinear", sizeof("slinear")-1)) { format = FORMAT_SLINEAR; chunksize = sizeof(slinear_buffer); chunk_buffer = (char *)slinear_buffer; } else { fprintf(stderr, USAGE, argv[0]); exit(1); } printf("Using file %s\n", argv[2]); if (stat(argv[2], &statbuf)) { perror("could not stat audio file"); exit(1); } audiofp = fopen(argv[2], "r"); if (!audiofp) { perror("could not open audio file"); exit(1); } rxstate = dtmf_rx_init(rxstate, on_dtmf_detected, NULL); printf("reading chunks of %d bytes\n", chunksize); while (fread(chunk_buffer, chunksize, 1, audiofp) == 1) { if (format == FORMAT_ALAW) { /* chunksize == bytes == samples */ for (i = 0; i < chunksize; i++) { slinear_buffer[i] = alaw_to_linear(chunk_buffer[i]); } } dtmf_rx(rxstate, slinear_buffer, CHUNK_SAMPLES); digit = dtmf_rx_status(rxstate); if (digit) { currdigit = digit; printf("%c ON\n", currdigit); } else if (currdigit) { printf("%c OFF\n", currdigit); currdigit = 0; } } dtmf_rx_free(rxstate); fclose(audiofp); return 0; }
static void handle_uc_event(uc_t *uc, void *user_data, uc_event_t *e) { int chan; chan = (int) user_data; printf ("-- %s (%d)\n", uc_event2str(e->e), chan); switch (e->e) { case UC_EVENT_DEVICEFAIL: break; case UC_EVENT_PROTOCOLFAIL: printf("-- Protocol failure on channel %d, cause %d\n", e->gen.channel, e->gen.data); break; case UC_EVENT_SIGCHANSTATUS: printf("-- Signalling channel status - %s\n", e->sigchanstatus.ok ? "Up" : "Down"); break; case UC_EVENT_ALARM: printf("-- Alarm - 0x%X 0x%X\n", e->alarm.raised, e->alarm.cleared); break; case UC_EVENT_FARBLOCKED: printf("-- Channel far end blocked! :-(\n"); chan_stuff[chan].xxx &= ~1; break; case UC_EVENT_FARUNBLOCKED: printf("-- Channel far end unblocked! :-)\n"); chan_stuff[chan].xxx |= 1; if (chan_stuff[chan].xxx == 3) { if (caller_mode) initiate_call(uc, chan, e); /*endif*/ } /*endif*/ break; case UC_EVENT_LOCALBLOCKED: printf("-- Channel local end blocked! :-(\n"); chan_stuff[chan].xxx &= ~2; break; case UC_EVENT_LOCALUNBLOCKED: printf("-- Channel local end unblocked! :-)\n"); chan_stuff[chan].xxx |= 2; if (chan_stuff[chan].xxx == 3) { if (caller_mode) initiate_call(uc, chan, e); /*endif*/ } /*endif*/ break; case UC_EVENT_DIALING: printf("-- Dialing on channel %d\n", e->gen.channel); break; case UC_EVENT_ACCEPTED: printf("-- Accepted on channel %d\n", e->gen.channel); if (uc_call_control(uc, UC_OP_ANSWERCALL, e->gen.crn, (void *) -1)) fprintf(stderr, "Answer Call failed\n"); /*endif*/ break; case UC_EVENT_DETECTED: printf("-- Detected on channel %d\n", e->gen.channel); break; case UC_EVENT_ALERTING: printf("-- Alerting on channel %d\n", e->gen.channel); /* This is just a notification of call progress. We need take no action at this point. */ break; case UC_EVENT_FARDISCONNECTED: printf("-- Far end disconnected on channel %d\n", e->fardisconnected.channel); /* Kill any outstanding audio processing */ uc_set_channel_read_callback(uc, 0, NULL, 0); uc_set_channel_write_callback(uc, 0, NULL, 0); if (uc_call_control(uc, UC_OP_DROPCALL, e->fardisconnected.crn, (void *) UC_CAUSE_NORMAL_CLEARING)) fprintf(stderr, "C Drop Call failed\n"); /*endif*/ break; case UC_EVENT_DROPCALL: printf("-- Drop call on channel %d\n", e->gen.channel); if (uc_call_control(uc, UC_OP_RELEASECALL, e->gen.crn, NULL)) fprintf(stderr, "uc_ReleaseCall failed\n"); /*endif*/ break; case UC_EVENT_RELEASECALL: printf("-- Released on channel %d\n", e->gen.channel); if (caller_mode) initiate_call(uc, chan, e); /*endif*/ break; case UC_EVENT_OFFERED: printf("-- Offered on channel %d, CRN %d (ANI: %s, DNIS: %s)\n", e->offered.channel, e->offered.crn, e->offered.parms.originating_number, e->offered.parms.destination_number); if (!caller_mode) { switch (chan_stuff[chan].cause) { case 0: if (uc_call_control(uc, UC_OP_ACCEPTCALL, e->offered.crn, (void *) -1)) fprintf(stderr, "uc_AcceptCall failed\n"); /*endif*/ break; case 1: if (uc_call_control(uc, UC_OP_ANSWERCALL, e->offered.crn, (void *) -1)) fprintf(stderr, "uc_AnswerCall failed\n"); /*endif*/ break; case 2: if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_USER_BUSY)) fprintf(stderr, "E Drop Call failed\n"); /*endif*/ break; case 3: if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_UNASSIGNED_NUMBER)) fprintf(stderr, "F Drop Call failed\n"); /*endif*/ break; case 4: if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_NETWORK_CONGESTION)) fprintf(stderr, "G Drop Call failed\n"); /*endif*/ break; case 5: if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_DEST_OUT_OF_ORDER)) fprintf(stderr, "H Drop Call failed\n"); /*endif*/ break; } /*endswitch*/ if (++chan_stuff[chan].cause > 5) chan_stuff[chan].cause = 0; /*endif*/ } /*endif*/ break; case UC_EVENT_ANSWERED: printf("-- Answered on channel %d\n", e->gen.channel); uc_set_channel_read_callback(uc, 0, channel_read_adsi_channel, (void *) chan); printf("XXX read callback set\n"); uc_set_channel_write_callback(uc, 0, channel_write_adsi_channel, (void *) chan); printf("XXX write callback set\n"); adsi_tx_init(&(chan_stuff[chan].adsi_tx), ADSI_STANDARD_CLASS); printf("XXX ADSI inited\n"); dtmf_rx_init(&chan_stuff[chan].dtmf_state, NULL, NULL); printf("XXX DTMF inited\n"); break; case UC_EVENT_CONNECTED: printf("-- Connected on channel %d\n", e->gen.channel); if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_NORMAL_CLEARING)) printf ("I Drop Call failed\n"); /*endif*/ break; default: fprintf(stderr, "--!! Unknown signaling event %d\n", e->e); break; } /*endswitch*/ }