1 /* 2 * Copyright 2008-2014 Arsen Chaloyan 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 * 16 * $Id: mrcp_server_session.h 2251 2014-11-21 02:36:44Z achaloyan@gmail.com $ 17 */ 18 19 #ifndef MRCP_SERVER_SESSION_H 20 #define MRCP_SERVER_SESSION_H 21 22 /** 23 * @file mrcp_server_session.h 24 * @brief MRCP Server Session 25 */ 26 27 #include <apr_hash.h> 28 #include "mrcp_session.h" 29 #include "mpf_engine.h" 30 #include "apt_task.h" 31 #include "apt_obj_list.h" 32 33 34 APT_BEGIN_EXTERN_C 35 36 /** Opaque MRCP channel declaration */ 37 typedef struct mrcp_channel_t mrcp_channel_t; 38 /** MRCP server session declaration */ 39 typedef struct mrcp_server_session_t mrcp_server_session_t; 40 /** MRCP signaling message declaration */ 41 typedef struct mrcp_signaling_message_t mrcp_signaling_message_t; 42 43 /** Enumeration of signaling task messages */ 44 typedef enum { 45 SIGNALING_MESSAGE_OFFER, 46 SIGNALING_MESSAGE_CONTROL, 47 SIGNALING_MESSAGE_TERMINATE, 48 } mrcp_signaling_message_type_e; 49 50 /** MRCP signaling message */ 51 struct mrcp_signaling_message_t { 52 /** Signaling message type */ 53 mrcp_signaling_message_type_e type; 54 55 /** Session */ 56 mrcp_server_session_t *session; 57 /** Descriptor */ 58 mrcp_session_descriptor_t *descriptor; 59 60 /** Channel */ 61 mrcp_channel_t *channel; 62 /** MRCP message */ 63 mrcp_message_t *message; 64 }; 65 66 /** Server session states */ 67 typedef enum { 68 SESSION_STATE_NONE, /**< initial state */ 69 SESSION_STATE_GENERATING_ANSWER, /**< received offer, generating answer now */ 70 SESSION_STATE_INITIALIZING, /**< answer is ready, finally initializing channels now */ 71 SESSION_STATE_DEACTIVATING, /**< received session termination request, deinitializing channels now */ 72 SESSION_STATE_TERMINATING /**< finally terminating session */ 73 } mrcp_server_session_state_e; 74 75 76 /** MRCP server session */ 77 struct mrcp_server_session_t { 78 /** Session base */ 79 mrcp_session_t base; 80 /** MRCP server */ 81 mrcp_server_t *server; 82 /** MRCP profile */ 83 mrcp_server_profile_t *profile; 84 85 /** Media context */ 86 mpf_context_t *context; 87 88 /** Media termination array */ 89 apr_array_header_t *terminations; 90 /** MRCP control channel array */ 91 apr_array_header_t *channels; 92 93 /** In-progress signaling request */ 94 mrcp_signaling_message_t *active_request; 95 /** Signaling request queue */ 96 apt_obj_list_t *request_queue; 97 98 /** In-progress offer */ 99 mrcp_session_descriptor_t *offer; 100 /** In-progres answer */ 101 mrcp_session_descriptor_t *answer; 102 103 /** MPF task message, which construction is in progress */ 104 mpf_task_msg_t *mpf_task_msg; 105 106 /** Session state */ 107 mrcp_server_session_state_e state; 108 /** Number of in-progress sub requests */ 109 apr_size_t subrequest_count; 110 }; 111 112 /** MRCP server profile */ 113 struct mrcp_server_profile_t { 114 /** Identifier of the profile */ 115 const char *id; 116 /** MRCP version */ 117 mrcp_version_e mrcp_version; 118 /** Table of engines (mrcp_engine_t*) */ 119 apr_hash_t *engine_table; 120 /** MRCP resource factory */ 121 mrcp_resource_factory_t *resource_factory; 122 /** Media processing engine */ 123 mpf_engine_t *media_engine; 124 /** RTP termination factory */ 125 mpf_termination_factory_t *rtp_termination_factory; 126 /** RTP settings */ 127 mpf_rtp_settings_t *rtp_settings; 128 /** Signaling agent */ 129 mrcp_sig_agent_t *signaling_agent; 130 /** Connection agent */ 131 mrcp_connection_agent_t *connection_agent; 132 }; 133 134 /** Create server session */ 135 mrcp_server_session_t* mrcp_server_session_create(void); 136 137 /** Process signaling message */ 138 apt_bool_t mrcp_server_signaling_message_process(mrcp_signaling_message_t *signaling_message); 139 /** Process MPF message */ 140 apt_bool_t mrcp_server_mpf_message_process(mpf_message_container_t *mpf_message_container); 141 142 /** Process channel modify event */ 143 apt_bool_t mrcp_server_on_channel_modify(mrcp_channel_t *channel, mrcp_control_descriptor_t *answer, apt_bool_t status); 144 /** Process channel remove event */ 145 apt_bool_t mrcp_server_on_channel_remove(mrcp_channel_t *channel, apt_bool_t status); 146 /** Process channel message receive */ 147 apt_bool_t mrcp_server_on_channel_message(mrcp_channel_t *channel, mrcp_message_t *message); 148 /** Process connection disconnect event */ 149 apt_bool_t mrcp_server_on_disconnect(mrcp_channel_t *channel); 150 151 /** Process channel open event */ 152 apt_bool_t mrcp_server_on_engine_channel_open(mrcp_channel_t *channel, apt_bool_t status); 153 /** Process channel close event */ 154 apt_bool_t mrcp_server_on_engine_channel_close(mrcp_channel_t *channel); 155 /** Process message receive event */ 156 apt_bool_t mrcp_server_on_engine_channel_message(mrcp_channel_t *channel, mrcp_message_t *message); 157 158 /** Get session by channel */ 159 mrcp_session_t* mrcp_server_channel_session_get(mrcp_channel_t *channel); 160 161 APT_END_EXTERN_C 162 163 #endif /* MRCP_SERVER_SESSION_H */ 164