/** Handle the MRCP responses/events */ static apt_bool_t synth_application_on_message_receive(mrcp_application_t *application, mrcp_session_t *session, mrcp_channel_t *channel, mrcp_message_t *message) { if(message->start_line.message_type == MRCP_MESSAGE_TYPE_RESPONSE) { /* received MRCP response */ if(message->start_line.method_id == SYNTHESIZER_SPEAK) { /* received the response to SPEAK request */ if(message->start_line.request_state == MRCP_REQUEST_STATE_INPROGRESS) { /* waiting for SPEAK-COMPLETE event */ } else { /* received unexpected response, remove channel */ mrcp_application_channel_remove(session,channel); } } else { /* received unexpected response */ } } else if(message->start_line.message_type == MRCP_MESSAGE_TYPE_EVENT) { /* received MRCP event */ if(message->start_line.method_id == SYNTHESIZER_SPEAK_COMPLETE) { /* received SPEAK-COMPLETE event, remove channel */ mrcp_application_channel_remove(session,channel); } } return TRUE; }
bool UmcSession::RemoveMrcpChannel(mrcp_channel_t* pMrcpChannel) { if(!m_Running) return false; return (mrcp_application_channel_remove(m_pMrcpSession,pMrcpChannel) == TRUE); }
static apt_bool_t recog_application_on_message_receive(mrcp_application_t *application, mrcp_session_t *session, mrcp_channel_t *channel, mrcp_message_t *message) { recog_app_channel_t *recog_channel = mrcp_application_channel_object_get(channel); if(message->start_line.message_type == MRCP_MESSAGE_TYPE_RESPONSE) { /* received MRCP response */ if(message->start_line.method_id == RECOGNIZER_DEFINE_GRAMMAR) { /* received the response to DEFINE-GRAMMAR request */ if(message->start_line.request_state == MRCP_REQUEST_STATE_COMPLETE) { recog_application_on_define_grammar(application,session,channel); } else { /* received unexpected response, remove channel */ mrcp_application_channel_remove(session,channel); } } else if(message->start_line.method_id == RECOGNIZER_RECOGNIZE) { /* received the response to RECOGNIZE request */ if(message->start_line.request_state == MRCP_REQUEST_STATE_INPROGRESS) { /* start to stream the speech to recognize */ if(recog_channel) { recog_channel->streaming = TRUE; } } else { /* received unexpected response, remove channel */ mrcp_application_channel_remove(session,channel); } } else { /* received unexpected response */ } } else if(message->start_line.message_type == MRCP_MESSAGE_TYPE_EVENT) { if(message->start_line.method_id == RECOGNIZER_RECOGNITION_COMPLETE) { demo_nlsml_result_parse(message); if(recog_channel) { recog_channel->streaming = FALSE; } mrcp_application_channel_remove(session,channel); } else if(message->start_line.method_id == RECOGNIZER_START_OF_INPUT) { /* received start-of-input, do whatever you need here */ } } return TRUE; }
/** \brief Send session management request to client stack and wait for async response */ static apt_bool_t uni_recog_sm_request_send(uni_speech_t *uni_speech, mrcp_sig_command_e sm_request) { apt_bool_t res = FALSE; ast_log(LOG_DEBUG, "Send session request type:%d\n",sm_request); apr_thread_mutex_lock(uni_speech->mutex); uni_speech->is_sm_request = TRUE; uni_speech->sm_request = sm_request; switch(sm_request) { case MRCP_SIG_COMMAND_SESSION_UPDATE: res = mrcp_application_session_update(uni_speech->session); break; case MRCP_SIG_COMMAND_SESSION_TERMINATE: res = mrcp_application_session_terminate(uni_speech->session); break; case MRCP_SIG_COMMAND_CHANNEL_ADD: res = mrcp_application_channel_add(uni_speech->session,uni_speech->channel); break; case MRCP_SIG_COMMAND_CHANNEL_REMOVE: res = mrcp_application_channel_remove(uni_speech->session,uni_speech->channel); break; case MRCP_SIG_COMMAND_RESOURCE_DISCOVER: res = mrcp_application_resource_discover(uni_speech->session); break; default: break; } if(res == TRUE) { /* Wait for session response */ ast_log(LOG_DEBUG, "Wait for session response\n"); if(apr_thread_cond_timedwait(uni_speech->wait_object,uni_speech->mutex,MRCP_APP_REQUEST_TIMEOUT) != APR_SUCCESS) { ast_log(LOG_ERROR, "Failed to get response, request timed out\n"); uni_speech->sm_response = MRCP_SIG_STATUS_CODE_FAILURE; } ast_log(LOG_DEBUG, "Waked up, status code: %d\n",uni_speech->sm_response); } uni_speech->is_sm_request = FALSE; apr_thread_mutex_unlock(uni_speech->mutex); return res; }