/* Raise RECORD-COMPLETE event */ static apt_bool_t recorder_record_complete(recorder_channel_t *recorder_channel, mrcp_recorder_completion_cause_e cause) { mrcp_recorder_header_t *recorder_header; /* create RECORD-COMPLETE event */ mrcp_message_t *message = mrcp_event_create( recorder_channel->record_request, RECORDER_RECORD_COMPLETE, recorder_channel->record_request->pool); if(!message) { return FALSE; } if(recorder_channel->audio_out) { fclose(recorder_channel->audio_out); recorder_channel->audio_out = NULL; } /* get/allocate recorder header */ recorder_header = mrcp_resource_header_prepare(message); if(recorder_header) { /* set completion cause */ recorder_header->completion_cause = cause; mrcp_resource_header_property_add(message,RECORDER_HEADER_COMPLETION_CAUSE); } /* set record-uri */ recorder_channel_uri_set(recorder_channel,message); /* set request state */ message->start_line.request_state = MRCP_REQUEST_STATE_COMPLETE; recorder_channel->record_request = NULL; /* send asynch event */ return mrcp_engine_channel_message_send(recorder_channel->channel,message); }
/** 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; }