]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Skinny: handle early media
authorMathieu Parent <math.parent@gmail.com>
Thu, 17 Jun 2010 05:44:33 +0000 (07:44 +0200)
committerMathieu Parent <math.parent@gmail.com>
Thu, 17 Jun 2010 05:44:33 +0000 (07:44 +0200)
See MODSKINNY-8 (switch_core_io.c:121
SKINNY/internal/SEP002699438FB6:0/1 has no read codec when using early
media)

src/mod/endpoints/mod_skinny/mod_skinny.c
src/mod/endpoints/mod_skinny/mod_skinny.h
src/mod/endpoints/mod_skinny/skinny_server.c

index d8878a1d53043390188bfb44478ea627bc7fae41..63900dcc3760833b4b91c49018565213ce41c893 100644 (file)
@@ -972,9 +972,12 @@ switch_status_t channel_answer_channel(switch_core_session_t *session)
 
 switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg)
 {
+       private_t *tech_pvt = switch_core_session_get_private(session);
+
        switch (msg->message_id) {
        case SWITCH_MESSAGE_INDICATE_ANSWER:
                {
+                       switch_clear_flag_locked(tech_pvt, TFLAG_EARLY_MEDIA);
                        channel_answer_channel(session);
                }
                break;
@@ -982,6 +985,14 @@ switch_status_t channel_receive_message(switch_core_session_t *session, switch_c
                {
                        skinny_session_send_call_info_all(session);
                }
+       case SWITCH_MESSAGE_INDICATE_PROGRESS:
+               {
+                       if (!switch_test_flag(tech_pvt, TFLAG_EARLY_MEDIA)) {
+                               /* early media */
+                               switch_set_flag_locked(tech_pvt, TFLAG_EARLY_MEDIA);
+                               channel_answer_channel(session);
+                       }
+               }
        default:
                break;
        }
index d4e4529f0ba23a3a90feb2442de7211b50eb02df..f8cd92619e3c61cd47ab67cf8dac3e74ec17abc5 100644 (file)
@@ -146,10 +146,11 @@ typedef switch_status_t (*skinny_listener_callback_func_t) (listener_t *listener
 /* CHANNEL TYPES */
 /*****************************************************************************/
 typedef enum {
-    TFLAG_IO = (1 << 0),
-    TFLAG_READING = (1 << 9),
-    TFLAG_WRITING = (1 << 10),
-    TFLAG_FORCE_ROUTE = (1 << 11)
+    TFLAG_FORCE_ROUTE = (1 << 0),
+    TFLAG_EARLY_MEDIA = (1 << 1),
+    TFLAG_IO = (1 << 2),
+    TFLAG_READING = (1 << 3),
+    TFLAG_WRITING = (1 << 4)
 } TFLAGS;
 
 typedef enum {
index ca5c911b8605f296536383efef995a957406ad3b..e3c112b53149a581ee45a7bf8e08693645e7105f 100644 (file)
@@ -697,26 +697,30 @@ switch_status_t skinny_session_start_media(switch_core_session_t *session, liste
        
        channel = switch_core_session_get_channel(session);
        tech_pvt = switch_core_session_get_private(session);
-        
-       send_stop_tone(listener, line_instance, tech_pvt->call_id);
-       send_open_receive_channel(listener,
-           tech_pvt->call_id, /* uint32_t conference_id, */
-           tech_pvt->call_id, /* uint32_t pass_thru_party_id, */
-           20, /* uint32_t packets, */
-           SKINNY_CODEC_ULAW_64K, /* uint32_t payload_capacity, */
-           0, /* uint32_t echo_cancel_type, */
-           0, /* uint32_t g723_bitrate, */
-           0, /* uint32_t conference_id2, */
-           0 /* uint32_t reserved[10] */
-       );
-       skinny_line_set_state(listener, line_instance, tech_pvt->call_id, SKINNY_CONNECTED);
-       send_select_soft_keys(listener, line_instance, tech_pvt->call_id,
-           SKINNY_KEY_SET_CONNECTED, 0xffff);
-       send_display_prompt_status(listener,
-           0,
-           SKINNY_DISP_CONNECTED,
-           line_instance,
-           tech_pvt->call_id);
+       
+       if (!switch_channel_test_flag(channel, CF_EARLY_MEDIA)) {
+               send_stop_tone(listener, line_instance, tech_pvt->call_id);
+               send_open_receive_channel(listener,
+                       tech_pvt->call_id, /* uint32_t conference_id, */
+                       tech_pvt->call_id, /* uint32_t pass_thru_party_id, */
+                       20, /* uint32_t packets, */
+                       SKINNY_CODEC_ULAW_64K, /* uint32_t payload_capacity, */
+                       0, /* uint32_t echo_cancel_type, */
+                       0, /* uint32_t g723_bitrate, */
+                       0, /* uint32_t conference_id2, */
+                       0 /* uint32_t reserved[10] */
+               );
+       }
+       if (!switch_test_flag(tech_pvt, TFLAG_EARLY_MEDIA)) {
+               skinny_line_set_state(listener, line_instance, tech_pvt->call_id, SKINNY_CONNECTED);
+               send_select_soft_keys(listener, line_instance, tech_pvt->call_id,
+                       SKINNY_KEY_SET_CONNECTED, 0xffff);
+               send_display_prompt_status(listener,
+                       0,
+                       SKINNY_DISP_CONNECTED,
+                       line_instance,
+                       tech_pvt->call_id);
+       }
        skinny_session_send_call_info(session, listener, line_instance);
 
        return SWITCH_STATUS_SUCCESS;