static void detector_process(MSFilter *f) { DetectorState *s=(DetectorState *)f->data; mblk_t *m; while ((m=ms_queue_get(f->inputs[0]))!=NULL) { ms_queue_put(f->outputs[0],m); if (s->tone_def->frequency!=0) { ms_bufferizer_put(s->buf,dupmsg(m)); } } if (s->tone_def->frequency!=0) { uint8_t *buf=_alloca(s->framesize); while(ms_bufferizer_read(s->buf,buf,s->framesize)!=0) { float en=compute_energy((int16_t*)buf,s->framesize/2); if (en>energy_min) { float freq_en=goertzel_state_run(&s->tone_gs,(int16_t*)buf,s->framesize/2,en); if (freq_en>=s->tone_def->min_amplitude) { if (s->dur==0) s->starttime=f->ticker->time; s->dur+=s->frame_ms; if (s->dur>s->tone_def->min_duration && !s->event_sent) { MSToneDetectorEvent event; strncpy(event.tone_name,s->tone_def->tone_name,sizeof(event.tone_name)); event.tone_start_time=s->starttime; ms_filter_notify(f,MS_TONE_DETECTOR_EVENT,&event); s->event_sent=TRUE; } } else end_tone(s); } else end_tone(s); } } }
static void detector_process(MSFilter *f){ DetectorState *s=(DetectorState *)f->data; mblk_t *m; while ((m=ms_queue_get(f->inputs[0]))!=NULL){ ms_queue_put(f->outputs[0],m); if (s->nscans>0){ ms_bufferizer_put(s->buf,dupmsg(m)); } } if (s->nscans>0){ uint8_t *buf=alloca(s->framesize); while(ms_bufferizer_read(s->buf,buf,s->framesize)!=0){ float en=compute_energy((int16_t*)buf,s->framesize/2); if (en>energy_min_threshold*(32767.0*32767.0*0.7)){ int i; for(i=0;i<s->nscans;++i){ GoertzelState *gs=&s->tone_gs[i]; MSToneDetectorDef *tone_def=&s->tone_def[i]; float freq_en=goertzel_state_run(gs,(int16_t*)buf,s->framesize/2,en); if (freq_en>=tone_def->min_amplitude){ if (gs->dur==0) gs->starttime=f->ticker->time; gs->dur+=s->frame_ms; if (gs->dur>=tone_def->min_duration && !gs->event_sent){ MSToneDetectorEvent event; strncpy(event.tone_name,tone_def->tone_name,sizeof(event.tone_name)); event.tone_start_time=gs->starttime; ms_filter_notify(f,MS_TONE_DETECTOR_EVENT,&event); gs->event_sent=TRUE; } }else{ gs->event_sent=FALSE; gs->dur=0; gs->starttime=0; } } }else end_all_tones(s); } } }