git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@8232 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2008-05-01 16:41:46 +00:00
parent f59b8ed1dc
commit 580f545e26
8 changed files with 39 additions and 20 deletions

View File

@ -466,7 +466,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_nomedia(const char *uuid, switch_medi
\param message optional message \param message optional message
\return SWITCH_STATUS_SUCCESS if all is well \return SWITCH_STATUS_SUCCESS if all is well
*/ */
SWITCH_DECLARE(switch_status_t) switch_ivr_hold_uuid(const char *uuid, const char *message); SWITCH_DECLARE(switch_status_t) switch_ivr_hold_uuid(const char *uuid, const char *message, switch_bool_t moh);
/*! /*!
\brief Signal the session with a protocol specific unhold message. \brief Signal the session with a protocol specific unhold message.
@ -481,7 +481,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_unhold_uuid(const char *uuid);
\param message optional message \param message optional message
\return SWITCH_STATUS_SUCCESS if all is well \return SWITCH_STATUS_SUCCESS if all is well
*/ */
SWITCH_DECLARE(switch_status_t) switch_ivr_hold(switch_core_session_t *session, const char *message); SWITCH_DECLARE(switch_status_t) switch_ivr_hold(switch_core_session_t *session, const char *message, switch_bool_t moh);
/*! /*!
\brief Signal the session with a protocol specific unhold message. \brief Signal the session with a protocol specific unhold message.

View File

@ -1171,7 +1171,7 @@ SWITCH_STANDARD_API(uuid_hold_function)
if (!strcasecmp(argv[0], "off")) { if (!strcasecmp(argv[0], "off")) {
status = switch_ivr_unhold_uuid(argv[1]); status = switch_ivr_unhold_uuid(argv[1]);
} else { } else {
status = switch_ivr_hold_uuid(argv[0], argv[1]); status = switch_ivr_hold_uuid(argv[0], argv[1], 1);
} }
} }

View File

@ -1897,7 +1897,7 @@ static switch_call_cause_t user_outgoing_channel(switch_core_session_t *session,
#define HOLD_SYNTAX "[<display message>]" #define HOLD_SYNTAX "[<display message>]"
SWITCH_STANDARD_APP(hold_function) SWITCH_STANDARD_APP(hold_function)
{ {
switch_ivr_hold_uuid(switch_core_session_get_uuid(session), data); switch_ivr_hold_uuid(switch_core_session_get_uuid(session), data, 1);
} }
#define UNHOLD_SYNTAX "" #define UNHOLD_SYNTAX ""

View File

@ -1829,9 +1829,15 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, sdp_session_t *
} }
if (stream && strcasecmp(stream, "silence")) { if (stream && strcasecmp(stream, "silence")) {
if (!strcasecmp(stream, "indicate_hold")) {
switch_channel_set_flag(tech_pvt->channel, CF_SUSPEND);
switch_channel_set_flag(tech_pvt->channel, CF_HOLD);
switch_ivr_hold_uuid(switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE), NULL, 0);
} else {
switch_ivr_broadcast(switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE), stream, SMF_ECHO_ALEG | SMF_LOOP); switch_ivr_broadcast(switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE), stream, SMF_ECHO_ALEG | SMF_LOOP);
} }
} }
}
} else { } else {
if (switch_test_flag(tech_pvt, TFLAG_SIP_HOLD)) { if (switch_test_flag(tech_pvt, TFLAG_SIP_HOLD)) {
const char *uuid; const char *uuid;
@ -1843,8 +1849,15 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, sdp_session_t *
if ((uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (b_session = switch_core_session_locate(uuid))) { if ((uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (b_session = switch_core_session_locate(uuid))) {
switch_channel_t *b_channel = switch_core_session_get_channel(b_session); switch_channel_t *b_channel = switch_core_session_get_channel(b_session);
if (switch_channel_test_flag(tech_pvt->channel, CF_HOLD)) {
switch_ivr_unhold(b_session);
switch_channel_clear_flag(tech_pvt->channel, CF_SUSPEND);
switch_channel_clear_flag(tech_pvt->channel, CF_HOLD);
} else {
switch_channel_stop_broadcast(b_channel); switch_channel_stop_broadcast(b_channel);
switch_channel_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_FALSE, 5000); switch_channel_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_FALSE, 5000);
}
switch_core_session_rwunlock(b_session); switch_core_session_rwunlock(b_session);
} }

View File

@ -120,7 +120,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
if (switch_channel_test_flag(session->channel, CF_HOLD)) { if (switch_channel_test_flag(session->channel, CF_HOLD)) {
status = SWITCH_STATUS_BREAK; status = SWITCH_STATUS_BREAK;
goto done; goto even_more_done;
} }
if (session->endpoint_interface->io_routines->read_frame) { if (session->endpoint_interface->io_routines->read_frame) {
@ -459,6 +459,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
switch_thread_rwlock_unlock(session->bug_rwlock); switch_thread_rwlock_unlock(session->bug_rwlock);
} }
} }
even_more_done:
return status; return status;
} }

View File

@ -35,7 +35,6 @@
#include <switch.h> #include <switch.h>
#include "private/switch_core_pvt.h" #include "private/switch_core_pvt.h"
SWITCH_DECLARE(switch_status_t) switch_core_session_signal_lock(switch_core_session_t *session) SWITCH_DECLARE(switch_status_t) switch_core_session_signal_lock(switch_core_session_t *session)
{ {
return switch_mutex_lock(session->signal_mutex); return switch_mutex_lock(session->signal_mutex);
@ -58,12 +57,12 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_lock(switch_core_sessio
if (switch_test_flag(session, SSF_DESTROYED)) { if (switch_test_flag(session, SSF_DESTROYED)) {
status = SWITCH_STATUS_FALSE; status = SWITCH_STATUS_FALSE;
#ifdef SWITCH_DEBUG_RWLOCKS #ifdef SWITCH_DEBUG_RWLOCKS
switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, SWITCH_LOG_ERROR, "%s Read lock FAIL\n", switch_channel_get_name(session->channel)); switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "%s Read lock FAIL\n", switch_channel_get_name(session->channel));
#endif #endif
} else { } else {
status = (switch_status_t) switch_thread_rwlock_tryrdlock(session->rwlock); status = (switch_status_t) switch_thread_rwlock_tryrdlock(session->rwlock);
#ifdef SWITCH_DEBUG_RWLOCKS #ifdef SWITCH_DEBUG_RWLOCKS
switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, SWITCH_LOG_ERROR, "%s Read lock AQUIRED\n", switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "%s Read lock AQUIRED\n",
switch_channel_get_name(session->channel)); switch_channel_get_name(session->channel));
#endif #endif
} }
@ -76,7 +75,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_lock(switch_core_sessio
SWITCH_DECLARE(void) switch_core_session_perform_write_lock(switch_core_session_t *session, const char *file, const char *func, int line) SWITCH_DECLARE(void) switch_core_session_perform_write_lock(switch_core_session_t *session, const char *file, const char *func, int line)
{ {
switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, SWITCH_LOG_ERROR, "%s Write lock AQUIRED\n", switch_channel_get_name(session->channel)); switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "%s Write lock AQUIRED\n", switch_channel_get_name(session->channel));
#else #else
SWITCH_DECLARE(void) switch_core_session_write_lock(switch_core_session_t *session) SWITCH_DECLARE(void) switch_core_session_write_lock(switch_core_session_t *session)
{ {
@ -87,7 +86,7 @@ SWITCH_DECLARE(void) switch_core_session_write_lock(switch_core_session_t *sessi
#ifdef SWITCH_DEBUG_RWLOCKS #ifdef SWITCH_DEBUG_RWLOCKS
SWITCH_DECLARE(void) switch_core_session_perform_rwunlock(switch_core_session_t *session, const char *file, const char *func, int line) SWITCH_DECLARE(void) switch_core_session_perform_rwunlock(switch_core_session_t *session, const char *file, const char *func, int line)
{ {
switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, SWITCH_LOG_ERROR, "%s Read/Write lock CLEARED\n", switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "%s Read/Write lock CLEARED\n",
switch_channel_get_name(session->channel)); switch_channel_get_name(session->channel));
#else #else
SWITCH_DECLARE(void) switch_core_session_rwunlock(switch_core_session_t *session) SWITCH_DECLARE(void) switch_core_session_rwunlock(switch_core_session_t *session)

View File

@ -741,7 +741,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_sess
return status; return status;
} }
SWITCH_DECLARE(switch_status_t) switch_ivr_hold(switch_core_session_t *session, const char *message) SWITCH_DECLARE(switch_status_t) switch_ivr_hold(switch_core_session_t *session, const char *message, switch_bool_t moh)
{ {
switch_core_session_message_t msg = { 0 }; switch_core_session_message_t msg = { 0 };
switch_channel_t *channel = switch_core_session_get_channel(session); switch_channel_t *channel = switch_core_session_get_channel(session);
@ -757,7 +757,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_hold(switch_core_session_t *session,
switch_core_session_receive_message(session, &msg); switch_core_session_receive_message(session, &msg);
if ((stream = switch_channel_get_variable(channel, SWITCH_HOLD_MUSIC_VARIABLE))) { if (moh && (stream = switch_channel_get_variable(channel, SWITCH_HOLD_MUSIC_VARIABLE))) {
if ((other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) { if ((other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) {
switch_ivr_broadcast(other_uuid, stream, SMF_ECHO_ALEG | SMF_LOOP); switch_ivr_broadcast(other_uuid, stream, SMF_ECHO_ALEG | SMF_LOOP);
} }
@ -767,12 +767,12 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_hold(switch_core_session_t *session,
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }
SWITCH_DECLARE(switch_status_t) switch_ivr_hold_uuid(const char *uuid, const char *message) SWITCH_DECLARE(switch_status_t) switch_ivr_hold_uuid(const char *uuid, const char *message, switch_bool_t moh)
{ {
switch_core_session_t *session; switch_core_session_t *session;
if ((session = switch_core_session_locate(uuid))) { if ((session = switch_core_session_locate(uuid))) {
switch_ivr_hold(session, message); switch_ivr_hold(session, message, moh);
switch_core_session_rwunlock(session); switch_core_session_rwunlock(session);
} }

View File

@ -161,7 +161,11 @@ static void *audio_bridge_thread(switch_thread_t * thread, void *obj)
} }
if (!nosuspend && (switch_channel_test_flag(chan_a, CF_SUSPEND) || switch_channel_test_flag(chan_b, CF_SUSPEND))) { if (!nosuspend && (switch_channel_test_flag(chan_a, CF_SUSPEND) || switch_channel_test_flag(chan_b, CF_SUSPEND))) {
if (switch_channel_test_flag(chan_a, CF_SUSPEND)) {
status = SWITCH_STATUS_SUCCESS;
} else {
status = switch_core_session_read_frame(session_a, &read_frame, -1, stream_id); status = switch_core_session_read_frame(session_a, &read_frame, -1, stream_id);
}
if (!SWITCH_READ_ACCEPTABLE(status)) { if (!SWITCH_READ_ACCEPTABLE(status)) {
goto end_of_bridge_loop; goto end_of_bridge_loop;