]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
tewaks
authorAnthony Minessale <anthony.minessale@gmail.com>
Thu, 1 May 2008 16:41:46 +0000 (16:41 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Thu, 1 May 2008 16:41:46 +0000 (16:41 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@8232 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/include/switch_ivr.h
src/mod/applications/mod_commands/mod_commands.c
src/mod/applications/mod_dptools/mod_dptools.c
src/mod/endpoints/mod_sofia/sofia_glue.c
src/switch_core_io.c
src/switch_core_rwlock.c
src/switch_ivr.c
src/switch_ivr_bridge.c

index 1c5ac2bda88a281305416773c8e30cf0e65f5e93..104a49c5ea9a1ef5341d95ff5db30979726a8f64 100644 (file)
@@ -466,7 +466,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_nomedia(const char *uuid, switch_medi
   \param message optional message
   \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.
@@ -481,7 +481,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_unhold_uuid(const char *uuid);
   \param message optional message
   \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.
index c1811ca612aba54ebb9286f3a5f9bf4084ba9f10..e453fbc691dcf7375475d871463252c476cdab69 100644 (file)
@@ -1171,7 +1171,7 @@ SWITCH_STANDARD_API(uuid_hold_function)
                if (!strcasecmp(argv[0], "off")) {
                        status = switch_ivr_unhold_uuid(argv[1]);
                } else {
-                       status = switch_ivr_hold_uuid(argv[0], argv[1]);
+                       status = switch_ivr_hold_uuid(argv[0], argv[1], 1);
                }
        }
 
index b99522a4c415c3d5982c83c697bc0c1050d79383..2574191275ab40c77ff9fde12b03165b0268b0a2 100644 (file)
@@ -1897,7 +1897,7 @@ static switch_call_cause_t user_outgoing_channel(switch_core_session_t *session,
 #define HOLD_SYNTAX "[<display message>]"
 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 ""
index 1af6e8ab01c1065ef6d4a2bc5aad76d6ef98aa98..1acd1f26b72d75d6c848744ecc1e26a8b39ee326 100644 (file)
@@ -1829,7 +1829,13 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, sdp_session_t *
                        }
 
                        if (stream && strcasecmp(stream, "silence")) {
-                               switch_ivr_broadcast(switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE), stream, SMF_ECHO_ALEG | SMF_LOOP);
+                               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);
+                               }
                        }
                }
        } else {
@@ -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))) {
                                switch_channel_t *b_channel = switch_core_session_get_channel(b_session);
-                               switch_channel_stop_broadcast(b_channel);
-                               switch_channel_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_FALSE, 5000);
+
+                               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_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_FALSE, 5000);
+                               }
                                switch_core_session_rwunlock(b_session);
                        }
 
index ff402bc96775b2f538f7fd8cb8121bc0665a050c..c4dcf776ab93bc3d6bfef36cd09da0528d7a5b7d 100644 (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)) {
                status = SWITCH_STATUS_BREAK;
-               goto done;
+               goto even_more_done;
        }
 
        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);
                }
        }
+
+ even_more_done:
+
        return status;
 }
 
index 0bec5c935a056cc63c9064346a08bd4ff24653d2..ae94e82f2851a0e5ddd86fd46ccf519ac8fbfe57 100644 (file)
@@ -35,7 +35,6 @@
 #include <switch.h>
 #include "private/switch_core_pvt.h"
 
-
 SWITCH_DECLARE(switch_status_t) switch_core_session_signal_lock(switch_core_session_t *session)
 {
        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)) {
                        status = SWITCH_STATUS_FALSE;
 #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
                } else {
                        status = (switch_status_t) switch_thread_rwlock_tryrdlock(session->rwlock);
 #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));
 #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_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
 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
 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));
 #else
 SWITCH_DECLARE(void) switch_core_session_rwunlock(switch_core_session_t *session)
index 5274c462028378cc66c2782b87df1a972c2b0f5e..4601bb114b7c4f0437b075782a6b81e16ff174b0 100644 (file)
@@ -741,7 +741,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_sess
        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_channel_t *channel = switch_core_session_get_channel(session);
@@ -756,8 +756,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_hold(switch_core_session_t *session,
        switch_channel_set_flag(channel, CF_SUSPEND);
 
        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))) {
                        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;
 }
 
-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;
 
        if ((session = switch_core_session_locate(uuid))) {
-               switch_ivr_hold(session, message);
+               switch_ivr_hold(session, message, moh);
                switch_core_session_rwunlock(session);
        }
 
index 9b56a3b657cf3ce582757232ad39fb386e28cecf..948e544be1a172bb112ae25ee288bbe212eb113d 100644 (file)
@@ -161,8 +161,12 @@ 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))) {
-                       status = switch_core_session_read_frame(session_a, &read_frame, -1, stream_id);
-                       
+                       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);
+                       }
+
                        if (!SWITCH_READ_ACCEPTABLE(status)) {
                                goto end_of_bridge_loop;
                        }