Changeset 205 for pjproject/trunk/pjsip/src/pjsua/pjsua_inv.c
- Timestamp:
- Feb 21, 2006 12:11:18 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsua/pjsua_inv.c
r201 r205 42 42 struct pjsua_inv_data *inv_data; 43 43 pjsip_tx_data *tdata; 44 int med_sk_index = 0; 44 45 pj_status_t status; 45 46 … … 48 49 dest_uri = pj_str((char*)cstr_dest_uri); 49 50 51 /* Find free socket. */ 52 for (med_sk_index=0; med_sk_index<PJSUA_MAX_CALLS; ++med_sk_index) { 53 if (!pjsua.med_sock_use[med_sk_index]) 54 break; 55 } 56 57 if (med_sk_index == PJSUA_MAX_CALLS) { 58 PJ_LOG(3,(THIS_FILE, "Error: too many calls!")); 59 return PJ_ETOOMANY; 60 } 61 62 pjsua.med_sock_use[med_sk_index] = 1; 63 50 64 /* Create outgoing dialog: */ 51 65 … … 61 75 62 76 status = pjmedia_endpt_create_sdp( pjsua.med_endpt, dlg->pool, 63 1, &pjsua.med_skinfo, &offer); 77 1, &pjsua.med_sock_info[med_sk_index], 78 &offer); 64 79 if (status != PJ_SUCCESS) { 65 80 pjsua_perror(THIS_FILE, "pjmedia unable to create SDP", status); … … 80 95 inv_data = pj_pool_zalloc( dlg->pool, sizeof(struct pjsua_inv_data)); 81 96 inv_data->inv = inv; 97 inv_data->call_slot = med_sk_index; 82 98 dlg->mod_data[pjsua.mod.id] = inv_data; 83 99 inv->mod_data[pjsua.mod.id] = inv_data; … … 130 146 131 147 PJ_TODO(DESTROY_DIALOG_ON_FAIL); 148 pjsua.med_sock_use[med_sk_index] = 0; 132 149 return status; 133 150 } … … 183 200 struct pjsua_inv_data *inv_data; 184 201 pjmedia_sdp_session *answer; 185 202 int med_sk_index; 203 204 205 /* Find free socket. */ 206 for (med_sk_index=0; med_sk_index<PJSUA_MAX_CALLS; ++med_sk_index) { 207 if (!pjsua.med_sock_use[med_sk_index]) 208 break; 209 } 210 211 if (med_sk_index == PJSUA_MAX_CALLS) { 212 PJ_LOG(3,(THIS_FILE, "Error: too many calls!")); 213 return PJ_TRUE; 214 } 215 216 217 pjsua.med_sock_use[med_sk_index] = 1; 186 218 187 219 /* Get media capability from media endpoint: */ 188 220 189 221 status = pjmedia_endpt_create_sdp( pjsua.med_endpt, rdata->tp_info.pool, 190 1, &pjsua.med_skinfo, &answer ); 222 1, &pjsua.med_sock_info[med_sk_index], 223 &answer ); 191 224 if (status != PJ_SUCCESS) { 192 225 193 226 pjsip_endpt_respond_stateless(pjsua.endpt, rdata, 500, NULL, 194 227 NULL, NULL); 228 pjsua.med_sock_use[med_sk_index] = 0; 195 229 return PJ_TRUE; 196 230 } … … 200 234 status = pjsip_dlg_create_uas( pjsip_ua_instance(), rdata, 201 235 &pjsua.contact_uri, &dlg); 202 if (status != PJ_SUCCESS) 236 if (status != PJ_SUCCESS) { 237 pjsua.med_sock_use[med_sk_index] = 0; 203 238 return PJ_TRUE; 239 } 204 240 205 241 … … 215 251 pjsip_rdata_get_tsx(rdata), 216 252 response); 253 pjsua.med_sock_use[med_sk_index] = 0; 217 254 return PJ_TRUE; 218 255 … … 224 261 inv_data = pj_pool_zalloc(dlg->pool, sizeof(struct pjsua_inv_data)); 225 262 inv_data->inv = inv; 263 inv_data->call_slot = inv_data->call_slot = med_sk_index; 226 264 dlg->mod_data[pjsua.mod.id] = inv_data; 227 265 inv->mod_data[pjsua.mod.id] = inv_data; … … 261 299 262 300 if (inv_data && inv_data->session) { 301 pjmedia_conf_remove_port(pjsua.mconf, inv_data->conf_slot); 263 302 pjmedia_session_destroy(inv_data->session); 303 pjsua.med_sock_use[inv_data->call_slot] = 0; 264 304 inv_data->session = NULL; 265 305 … … 313 353 inv_data = inv->dlg->mod_data[pjsua.mod.id]; 314 354 if (inv_data && inv_data->session) { 355 pjmedia_conf_remove_port(pjsua.mconf, inv_data->conf_slot); 315 356 pjmedia_session_destroy(inv_data->session); 357 pjsua.med_sock_use[inv_data->call_slot] = 0; 316 358 inv_data->session = NULL; 317 359 } … … 336 378 } 337 379 338 339 380 /* Create new media session. 340 381 * The media session is active immediately. … … 342 383 343 384 if (!pjsua.null_audio) { 344 345 status = pjmedia_session_create( pjsua.med_endpt, 1, &pjsua.med_skinfo, 385 pjmedia_port *media_port; 386 pj_str_t port_name; 387 char tmp[PJSIP_MAX_URL_SIZE]; 388 389 status = pjmedia_session_create( pjsua.med_endpt, 1, 390 &pjsua.med_sock_info[inv_data->call_slot], 346 391 local_sdp, remote_sdp, 347 392 &inv_data->session ); … … 352 397 } 353 398 399 pjmedia_session_get_port(inv_data->session, 0, &media_port); 400 401 port_name.ptr = tmp; 402 port_name.slen = pjsip_uri_print(PJSIP_URI_IN_REQ_URI, 403 inv_data->inv->dlg->remote.info->uri, 404 tmp, sizeof(tmp)); 405 if (port_name.slen < 1) { 406 port_name = pj_str("call"); 407 } 408 status = pjmedia_conf_add_port( pjsua.mconf, inv->pool, 409 media_port, 410 &port_name, 411 &inv_data->conf_slot); 412 if (status != PJ_SUCCESS) { 413 pjsua_perror(THIS_FILE, "Unable to create conference slot", 414 status); 415 pjmedia_session_destroy(inv_data->session); 416 inv_data->session = NULL; 417 return; 418 } 419 420 pjmedia_conf_connect_port( pjsua.mconf, 0, inv_data->conf_slot); 421 pjmedia_conf_connect_port( pjsua.mconf, inv_data->conf_slot, 0); 422 354 423 PJ_LOG(3,(THIS_FILE,"Media has been started successfully")); 355 424 }
Note: See TracChangeset
for help on using the changeset viewer.