return END_PORT;
}
-static void release_port(switch_rtp_t *rtp_session)
+static void release_port(const char *host, int port)
{
switch_core_port_allocator_t *alloc = NULL;
- if (!rtp_session->rx_host) {
+ if (!host) {
return;
}
switch_mutex_lock(port_lock);
- if ((alloc = switch_core_hash_find(alloc_hash, rtp_session->rx_host))) {
- switch_core_port_allocator_free_port(alloc, rtp_session->rx_port);
+ if ((alloc = switch_core_hash_find(alloc_hash, host))) {
+ switch_core_port_allocator_free_port(alloc, port);
}
switch_mutex_unlock(port_lock);
*err = "Send myself a packet failed!";
goto done;
}
- release_port(rtp_session);
old_sock = rtp_session->sock;
rtp_session->sock = new_sock;
done:
- if (status == SWITCH_STATUS_SUCCESS) {
- rtp_session->rx_host = switch_core_strdup(rtp_session->pool, host);
- rtp_session->rx_port = port;
- rtp_session->ready = 1;
- }
-
if (new_sock) {
switch_socket_close(new_sock);
}
uint32_t ms_per_packet,
switch_rtp_flag_t flags, char *crypto_key, char *timer_name, const char **err, switch_memory_pool_t *pool)
{
- switch_rtp_t *rtp_session;
-
+ switch_rtp_t *rtp_session = NULL;
+
if (switch_rtp_create(&rtp_session, payload, samples_per_interval, ms_per_packet, flags, crypto_key, timer_name, err, pool) != SWITCH_STATUS_SUCCESS) {
- return NULL;
+ goto end;
}
-
+
if (switch_rtp_set_remote_address(rtp_session, tx_host, tx_port, err) != SWITCH_STATUS_SUCCESS) {
- return NULL;
+ rtp_session = NULL;
+ goto end;
}
if (switch_rtp_set_local_address(rtp_session, rx_host, rx_port, err) != SWITCH_STATUS_SUCCESS) {
- return NULL;
+ rtp_session = NULL;
+ }
+
+ end:
+
+ if (rtp_session) {
+ rtp_session->ready = 1;
+ rtp_session->rx_host = switch_core_strdup(rtp_session->pool, rx_host);
+ rtp_session->rx_port = rx_port;
+ } else {
+ release_port(rx_host, rx_port);
}
- rtp_session->ready = 1;
return rtp_session;
}
switch_core_timer_destroy(&(*rtp_session)->timer);
}
- release_port(*rtp_session);
+ release_port((*rtp_session)->rx_host, (*rtp_session)->rx_port);
switch_mutex_unlock((*rtp_session)->flag_mutex);
return;