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); }
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_finalize (GObject * object) { GstDtmfDetect *self = GST_DTMF_DETECT (object); if (self->dtmf_state) dtmf_rx_free (self->dtmf_state); G_OBJECT_CLASS (gst_dtmf_detect_parent_class)->finalize (object); }
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; }