Chris Rienzo 8330336e9a FS-6450 [unimrcp] Update library
[apr] Backport APR_RING_FOREACH and APR_RING_FOREACH_SAFE macros to APR for unimrcp compatibility.

 [unimrcp] configure.gnu - need full path, not relative path for library paths

 [unimrcp] added uni_revision.h - couldn't get it to autogenerate from build

 [mod_unimrcp] add better logging and error checking on module load.  Currently dumps core on MRCPv1 TTS attempt

 [mod_unimrcp] don't configure MRCPv1 session with a connection agent- causes crash
2014-11-18 14:23:54 -05:00

253 lines
5.7 KiB
C++

/*
* Copyright 2008-2014 Arsen Chaloyan
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* $Id: umcsession.cpp 2136 2014-07-04 06:33:36Z achaloyan@gmail.com $
*/
#include "umcsession.h"
#include "umcscenario.h"
#include "mrcp_message.h"
UmcSession::UmcSession(const UmcScenario* pScenario) :
m_pScenario(pScenario),
m_pMrcpProfile(NULL),
m_pMrcpApplication(NULL),
m_pMrcpSession(NULL),
m_pMrcpMessage(NULL),
m_Running(false),
m_Terminating(false)
{
static int id = 0;
if(id == INT_MAX)
id = 0;
id++;
int size = apr_snprintf(m_Id,sizeof(m_Id)-1,"%d",id);
m_Id[size] = '\0';
}
UmcSession::~UmcSession()
{
}
bool UmcSession::Run()
{
if(m_Running)
return false;
if(!m_pMrcpProfile)
m_pMrcpProfile = m_pScenario->GetMrcpProfile();
if(!m_pMrcpProfile || !m_pMrcpApplication)
return false;
/* create session */
if(!CreateMrcpSession(m_pMrcpProfile))
return false;
m_Running = true;
bool ret = false;
if(m_pScenario->IsDiscoveryEnabled())
ret = ResourceDiscover();
else
ret = Start();
if(!ret)
{
m_Running = false;
DestroyMrcpSession();
}
return ret;
}
bool UmcSession::Stop()
{
if(m_Terminating)
return false;
return true;
}
bool UmcSession::Terminate()
{
if(m_Terminating)
return false;
m_Running = false;
m_Terminating = true;
return (mrcp_application_session_terminate(m_pMrcpSession) == TRUE);
}
bool UmcSession::OnSessionTerminate(mrcp_sig_status_code_e status)
{
if(!m_Terminating)
return false;
m_Terminating = false;
return DestroyMrcpSession();
}
bool UmcSession::OnSessionUpdate(mrcp_sig_status_code_e status)
{
return m_Running;
}
bool UmcSession::OnChannelAdd(mrcp_channel_t *channel, mrcp_sig_status_code_e status)
{
return m_Running;
}
bool UmcSession::OnChannelRemove(mrcp_channel_t *channel, mrcp_sig_status_code_e status)
{
return m_Running;
}
bool UmcSession::OnMessageReceive(mrcp_channel_t *channel, mrcp_message_t *message)
{
if(!m_Running)
return false;
if(!m_pMrcpMessage)
return false;
/* match request identifiers */
if(m_pMrcpMessage->start_line.request_id != message->start_line.request_id)
return false;
return true;
}
bool UmcSession::OnTerminateEvent(mrcp_channel_t *channel)
{
if(!m_Running)
return false;
return Terminate();
}
bool UmcSession::OnResourceDiscover(mrcp_session_descriptor_t* descriptor, mrcp_sig_status_code_e status)
{
if(!m_Running)
return false;
if(!Start())
Terminate();
return true;
}
bool UmcSession::CreateMrcpSession(const char* pProfileName)
{
m_pMrcpSession = mrcp_application_session_create(m_pMrcpApplication,pProfileName,this);
char name[32];
apr_snprintf(name,sizeof(name),"umc-%s",m_Id);
mrcp_application_session_name_set(m_pMrcpSession,name);
return (m_pMrcpSession != NULL);
}
bool UmcSession::DestroyMrcpSession()
{
if(!m_pMrcpSession)
return false;
mrcp_application_session_destroy(m_pMrcpSession);
m_pMrcpSession = NULL;
return true;
}
bool UmcSession::AddMrcpChannel(mrcp_channel_t* pMrcpChannel)
{
if(!m_Running)
return false;
return (mrcp_application_channel_add(m_pMrcpSession,pMrcpChannel) == TRUE);
}
bool UmcSession::RemoveMrcpChannel(mrcp_channel_t* pMrcpChannel)
{
if(!m_Running)
return false;
return (mrcp_application_channel_remove(m_pMrcpSession,pMrcpChannel) == TRUE);
}
bool UmcSession::SendMrcpRequest(mrcp_channel_t* pMrcpChannel, mrcp_message_t* pMrcpMessage)
{
if(!m_Running)
return false;
m_pMrcpMessage = pMrcpMessage;
return (mrcp_application_message_send(m_pMrcpSession,pMrcpChannel,pMrcpMessage) == TRUE);
}
bool UmcSession::ResourceDiscover()
{
if(!m_Running)
return false;
return (mrcp_application_resource_discover(m_pMrcpSession) == TRUE);
}
mrcp_channel_t* UmcSession::CreateMrcpChannel(
mrcp_resource_id resource_id,
mpf_termination_t* pTermination,
mpf_rtp_termination_descriptor_t* pRtpDescriptor,
void* pObj)
{
return mrcp_application_channel_create(
m_pMrcpSession, /* session, channel belongs to */
resource_id, /* MRCP resource identifier */
pTermination, /* media termination, used to terminate audio stream */
NULL, /* RTP descriptor, used to create RTP termination (NULL by default) */
pObj); /* object to associate */
}
mpf_termination_t* UmcSession::CreateAudioTermination(
const mpf_audio_stream_vtable_t* pStreamVtable,
mpf_stream_capabilities_t* pCapabilities,
void* pObj)
{
return mrcp_application_audio_termination_create(
m_pMrcpSession, /* session, termination belongs to */
pStreamVtable, /* virtual methods table of audio stream */
pCapabilities, /* capabilities of audio stream */
pObj); /* object to associate */
}
mrcp_message_t* UmcSession::CreateMrcpMessage(
mrcp_channel_t* pMrcpChannel,
mrcp_method_id method_id)
{
return mrcp_application_message_create(m_pMrcpSession,pMrcpChannel,method_id);
}
apr_pool_t* UmcSession::GetSessionPool() const
{
if(!m_pMrcpSession)
return NULL;
return mrcp_application_session_pool_get(m_pMrcpSession);
}
const char* UmcSession::GetMrcpSessionId() const
{
if(!m_pMrcpSession)
return NULL;
const apt_str_t *pId = mrcp_application_session_id_get(m_pMrcpSession);
return pId->buf;
}