bool SynthSession::OnChannelAdd(mrcp_channel_t* pMrcpChannel, mrcp_sig_status_code_e status) { if(!UmcSession::OnChannelAdd(pMrcpChannel,status)) return false; const mpf_codec_descriptor_t* pDescriptor = mrcp_application_sink_descriptor_get(pMrcpChannel); if(!pDescriptor) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Get Media Sink Descriptor"); return Terminate(); } SynthChannel* pSynthChannel = (SynthChannel*) mrcp_application_channel_object_get(pMrcpChannel); if(status != MRCP_SIG_STATUS_CODE_SUCCESS) { /* error case, just terminate the demo */ return Terminate(); } /* create MRCP message */ mrcp_message_t* pMrcpMessage = CreateSpeakRequest(pMrcpChannel); if(pMrcpMessage) { SendMrcpRequest(pSynthChannel->m_pMrcpChannel,pMrcpMessage); } pSynthChannel->m_pAudioOut = GetAudioOut(pDescriptor,GetSessionPool()); return true; }
/* Handle the UniMRCP responses sent to channel add requests. */ static apt_bool_t speech_on_channel_add(mrcp_application_t *application, mrcp_session_t *session, mrcp_channel_t *channel, mrcp_sig_status_code_e status) { speech_channel_t *schannel; if (channel != NULL) schannel = (speech_channel_t *)mrcp_application_channel_object_get(channel); else schannel = NULL; ast_log(LOG_DEBUG, "(%s) speech_on_channel_add\n", schannel->name); if ((schannel != NULL) && (application != NULL) && (session != NULL) && (channel != NULL)) { if ((session != NULL) && (status == MRCP_SIG_STATUS_CODE_SUCCESS)) { const mpf_codec_descriptor_t *descriptor = descriptor = mrcp_application_sink_descriptor_get(channel); if (!descriptor) { ast_log(LOG_ERROR, "(%s) Unable to determine codec descriptor\n", schannel->name); speech_channel_set_state(schannel, SPEECH_CHANNEL_ERROR); ast_log(LOG_DEBUG, "(%s) Terminating MRCP session\n", schannel->name); if (!mrcp_application_session_terminate(session)) ast_log(LOG_WARNING, "(%s) Unable to terminate application session\n", schannel->name); return FALSE; } schannel->rate = descriptor->sampling_rate; const char *codec_name = NULL; if (descriptor->name.length > 0) codec_name = descriptor->name.buf; else codec_name = "unknown"; ast_log(LOG_NOTICE, "(%s) Channel ready, codec=%s, sample rate=%d\n", schannel->name, codec_name, schannel->rate); speech_channel_set_state(schannel, SPEECH_CHANNEL_READY); } else { ast_log(LOG_ERROR, "(%s) Channel error!\n", schannel->name); if (session != NULL) { ast_log(LOG_DEBUG, "(%s) Terminating MRCP session\n", schannel->name); speech_channel_set_state(schannel, SPEECH_CHANNEL_ERROR); if (!mrcp_application_session_terminate(session)) ast_log(LOG_WARNING, "(%s) Unable to terminate application session\n", schannel->name); } } } else ast_log(LOG_ERROR, "(unknown) channel error!\n"); return TRUE; }
/* Handle the UniMRCP responses sent to channel add requests. */ static apt_bool_t speech_on_channel_add(mrcp_application_t *application, mrcp_session_t *session, mrcp_channel_t *channel, mrcp_sig_status_code_e status) { speech_channel_t *schannel = get_speech_channel(session); if (!schannel || !channel) { ast_log(LOG_ERROR, "speech_on_channel_add: unknown channel error!\n"); return FALSE; } ast_log(LOG_DEBUG, "(%s) speech_on_channel_add\n", schannel->name); if (status == MRCP_SIG_STATUS_CODE_SUCCESS) { const mpf_codec_descriptor_t *descriptor = mrcp_application_sink_descriptor_get(channel); if (!descriptor) { ast_log(LOG_ERROR, "(%s) Unable to determine codec descriptor\n", schannel->name); speech_channel_set_state(schannel, SPEECH_CHANNEL_ERROR); return FALSE; } schannel->rate = descriptor->sampling_rate; const char *codec_name = NULL; if (descriptor->name.length > 0) codec_name = descriptor->name.buf; else codec_name = "unknown"; ast_log(LOG_NOTICE, "(%s) Channel ready, codec=%s, sample rate=%d\n", schannel->name, codec_name, schannel->rate); speech_channel_set_state(schannel, SPEECH_CHANNEL_READY); } else { int rc = mrcp_application_session_response_code_get(session); ast_log(LOG_ERROR, "(%s) Channel error status=%d, response code=%d!\n", schannel->name, status, rc); speech_channel_set_state(schannel, SPEECH_CHANNEL_ERROR); } return TRUE; }
/** Handle the responses sent to channel add requests */ static apt_bool_t synth_application_on_channel_add(mrcp_application_t *application, mrcp_session_t *session, mrcp_channel_t *channel, mrcp_sig_status_code_e status) { if(status == MRCP_SIG_STATUS_CODE_SUCCESS) { mrcp_message_t *mrcp_message; synth_app_channel_t *synth_channel = mrcp_application_channel_object_get(channel); apr_pool_t *pool = mrcp_application_session_pool_get(session); const apt_dir_layout_t *dir_layout = mrcp_application_dir_layout_get(application); const mpf_codec_descriptor_t *descriptor = mrcp_application_sink_descriptor_get(channel); if(!descriptor) { /* terminate the demo */ apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Get Media Sink Descriptor"); return mrcp_application_session_terminate(session); } /* create and send SPEAK request */ mrcp_message = demo_speak_message_create(session,channel,dir_layout); if(mrcp_message) { mrcp_application_message_send(session,channel,mrcp_message); } if(synth_channel) { const apt_str_t *id = mrcp_application_session_id_get(session); char *file_name = apr_psprintf(pool,"synth-%dkHz-%s.pcm", descriptor->sampling_rate/1000, id->buf); char *file_path = apt_datadir_filepath_get(dir_layout,file_name,pool); if(file_path) { synth_channel->audio_out = fopen(file_path,"wb"); } } } else { /* error case, just terminate the demo */ mrcp_application_session_terminate(session); } return TRUE; }