/** Callback is called from MPF engine context to write/send new frame */ static apt_bool_t demo_verifier_stream_write(mpf_audio_stream_t *stream, const mpf_frame_t *frame) { demo_verifier_channel_t *verifier_channel = stream->obj; if(verifier_channel->stop_response) { /* send asynchronous response to STOP request */ mrcp_engine_channel_message_send(verifier_channel->channel,verifier_channel->stop_response); verifier_channel->stop_response = NULL; verifier_channel->verifier_request = NULL; return TRUE; } if(verifier_channel->verifier_request) { mpf_detector_event_e det_event = mpf_activity_detector_process(verifier_channel->detector,frame); switch(det_event) { case MPF_DETECTOR_EVENT_ACTIVITY: apt_log(VERIF_LOG_MARK,APT_PRIO_INFO,"Detected Voice Activity " APT_SIDRES_FMT, MRCP_MESSAGE_SIDRES(verifier_channel->verifier_request)); demo_verifier_start_of_input(verifier_channel); break; case MPF_DETECTOR_EVENT_INACTIVITY: apt_log(VERIF_LOG_MARK,APT_PRIO_INFO,"Detected Voice Inactivity " APT_SIDRES_FMT, MRCP_MESSAGE_SIDRES(verifier_channel->verifier_request)); demo_verifier_verification_complete(verifier_channel,VERIFIER_COMPLETION_CAUSE_SUCCESS); break; case MPF_DETECTOR_EVENT_NOINPUT: apt_log(VERIF_LOG_MARK,APT_PRIO_INFO,"Detected Noinput " APT_SIDRES_FMT, MRCP_MESSAGE_SIDRES(verifier_channel->verifier_request)); if(verifier_channel->timers_started == TRUE) { demo_verifier_verification_complete(verifier_channel,VERIFIER_COMPLETION_CAUSE_NO_INPUT_TIMEOUT); } break; default: break; } if(verifier_channel->verifier_request) { if((frame->type & MEDIA_FRAME_TYPE_EVENT) == MEDIA_FRAME_TYPE_EVENT) { if(frame->marker == MPF_MARKER_START_OF_EVENT) { apt_log(VERIF_LOG_MARK,APT_PRIO_INFO,"Detected Start of Event " APT_SIDRES_FMT " id:%d", MRCP_MESSAGE_SIDRES(verifier_channel->verifier_request), frame->event_frame.event_id); } else if(frame->marker == MPF_MARKER_END_OF_EVENT) { apt_log(VERIF_LOG_MARK,APT_PRIO_INFO,"Detected End of Event " APT_SIDRES_FMT " id:%d duration:%d ts", MRCP_MESSAGE_SIDRES(verifier_channel->verifier_request), frame->event_frame.event_id, frame->event_frame.duration); } } } if(verifier_channel->audio_out) { fwrite(frame->codec_frame.buffer,1,frame->codec_frame.size,verifier_channel->audio_out); } } return TRUE; }
/** Callback is called from MPF engine context to write/send new frame */ static apt_bool_t recorder_stream_write(mpf_audio_stream_t *stream, const mpf_frame_t *frame) { recorder_channel_t *recorder_channel = stream->obj; if(recorder_channel->stop_response) { if(recorder_channel->audio_out) { fclose(recorder_channel->audio_out); recorder_channel->audio_out = NULL; } if(recorder_channel->record_request){ /* set record-uri */ recorder_channel_uri_set(recorder_channel,recorder_channel->stop_response); } /* send asynchronous response to STOP request */ mrcp_engine_channel_message_send(recorder_channel->channel,recorder_channel->stop_response); recorder_channel->stop_response = NULL; recorder_channel->record_request = NULL; return TRUE; } if(recorder_channel->record_request) { mpf_detector_event_e det_event = mpf_activity_detector_process(recorder_channel->detector,frame); switch(det_event) { case MPF_DETECTOR_EVENT_ACTIVITY: apt_log(RECORD_LOG_MARK,APT_PRIO_INFO,"Detected Voice Activity "APT_SIDRES_FMT, MRCP_MESSAGE_SIDRES(recorder_channel->record_request)); recorder_start_of_input(recorder_channel); break; case MPF_DETECTOR_EVENT_INACTIVITY: apt_log(RECORD_LOG_MARK,APT_PRIO_INFO,"Detected Voice Inactivity "APT_SIDRES_FMT, MRCP_MESSAGE_SIDRES(recorder_channel->record_request)); recorder_record_complete(recorder_channel,RECORDER_COMPLETION_CAUSE_SUCCESS_SILENCE); break; case MPF_DETECTOR_EVENT_NOINPUT: apt_log(RECORD_LOG_MARK,APT_PRIO_INFO,"Detected Noinput "APT_SIDRES_FMT, MRCP_MESSAGE_SIDRES(recorder_channel->record_request)); if(recorder_channel->timers_started == TRUE) { recorder_record_complete(recorder_channel,RECORDER_COMPLETION_CAUSE_NO_INPUT_TIMEOUT); } break; default: break; } if(recorder_channel->audio_out) { fwrite(frame->codec_frame.buffer,1,frame->codec_frame.size,recorder_channel->audio_out); recorder_channel->cur_size += frame->codec_frame.size; recorder_channel->cur_time += CODEC_FRAME_TIME_BASE; if(recorder_channel->max_time && recorder_channel->cur_time >= recorder_channel->max_time) { recorder_record_complete(recorder_channel,RECORDER_COMPLETION_CAUSE_SUCCESS_MAXTIME); } } } return TRUE; }