]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
IRC-00 refactor how record_answer_req=true works, add media_bug_answer_req=true varia...
authorAnthony Minessale <anthony.minessale@gmail.com>
Mon, 26 Oct 2009 21:59:25 +0000 (21:59 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Mon, 26 Oct 2009 21:59:25 +0000 (21:59 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@15235 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/include/switch_types.h
src/switch_core_io.c
src/switch_core_media_bug.c
src/switch_ivr_async.c

index 193908ef144897eefa442a3e014ca2064c3c2439..7aba5f10afd05de74843e82ad7316eccdb5210b9 100644 (file)
@@ -1120,7 +1120,7 @@ typedef enum {
        SMBF_READ_REPLACE = (1 << 3),
        SMBF_READ_PING = (1 << 4),
        SMBF_STEREO = (1 << 5),
-       SMBF_RECORD_ANSWER_REQ = (1 << 6),
+       SMBF_ANSWER_REQ = (1 << 6),
        SMBF_THREAD_LOCK = (1 << 7)
 } switch_media_bug_flag_enum_t;
 typedef uint32_t switch_media_bug_flag_t;
index e2d002b0ec01a95f3aaadf8a2f9a4184855eeddf..bbf661152e1464dc6af091e03db60750d606228e 100644 (file)
@@ -334,6 +334,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
                        switch_bool_t ok = SWITCH_TRUE;
                        switch_thread_rwlock_rdlock(session->bug_rwlock);
                        for (bp = session->bugs; bp; bp = bp->next) {
+                               if (!switch_channel_test_flag(session->channel, CF_ANSWERED) && switch_core_media_bug_test_flag(bp, SMBF_ANSWER_REQ)) {
+                                       continue;
+                               }
+
                                if (bp->ready && switch_test_flag(bp, SMBF_READ_STREAM)) {
                                        switch_mutex_lock(bp->read_mutex);
                                        switch_buffer_write(bp->raw_read_buffer, read_frame->data, read_frame->datalen);
@@ -496,6 +500,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
                        switch_bool_t ok = SWITCH_TRUE;
                        switch_thread_rwlock_rdlock(session->bug_rwlock);
                        for (bp = session->bugs; bp; bp = bp->next) {
+                               if (!switch_channel_test_flag(session->channel, CF_ANSWERED) && switch_core_media_bug_test_flag(bp, SMBF_ANSWER_REQ)) {
+                                       continue;
+                               }
+
                                if (bp->ready && switch_test_flag(bp, SMBF_READ_PING)) {
                                        switch_mutex_lock(bp->read_mutex);
                                        if (bp->callback) {
@@ -760,6 +768,11 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess
                        if (!bp->ready) {
                                continue;
                        }
+
+                       if (!switch_channel_test_flag(session->channel, CF_ANSWERED) && switch_core_media_bug_test_flag(bp, SMBF_ANSWER_REQ)) {
+                               continue;
+                       }
+
                        if (switch_test_flag(bp, SMBF_WRITE_STREAM)) {
 
                                switch_mutex_lock(bp->write_mutex);
index dbed565ba1cda6362db5e8e4c499b5e94a8af6d4..014abb2c0f38af6525454f5b20c70add3c894b1d 100644 (file)
@@ -235,7 +235,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_add(switch_core_session_t
        switch_size_t bytes;
        switch_codec_implementation_t read_impl = {0};
        switch_codec_implementation_t write_impl = {0};
-       
+       const char *p;
 
        if (!switch_channel_media_ready(session->channel)) {
                if (switch_channel_pre_answer(session->channel) != SWITCH_STATUS_SUCCESS) {
@@ -248,6 +248,11 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_add(switch_core_session_t
 
        *new_bug = NULL;
 
+
+       if ((p = switch_channel_get_variable(session->channel, "media_bug_answer_req")) && switch_true(p)) {
+               flags |= SMBF_ANSWER_REQ;
+       }
+
 #if 0
        if (flags & SMBF_WRITE_REPLACE) {
                switch_thread_rwlock_wrlock(session->bug_rwlock);
index 43b74b59ec34c156d635f92e7d256d289f4a5342..945ec06a5f69ab61de171998dc6e238fc75df88c 100644 (file)
@@ -459,20 +459,18 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s
                        }
 
                        if (rh->fh) {
-                               if (switch_channel_test_flag(channel, CF_ANSWERED) || !switch_core_media_bug_test_flag(bug, SMBF_RECORD_ANSWER_REQ)) {
-                                       switch_size_t len;
-                                       uint8_t data[SWITCH_RECOMMENDED_BUFFER_SIZE];
-                                       switch_frame_t frame = { 0 };
+                               switch_size_t len;
+                               uint8_t data[SWITCH_RECOMMENDED_BUFFER_SIZE];
+                               switch_frame_t frame = { 0 };
                                        
+                               frame.data = data;
+                               frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE;
                                        
-                                       frame.data = data;
-                                       frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE;
-                                       
-                                       while (switch_core_media_bug_read(bug, &frame, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS && !switch_test_flag((&frame), SFF_CNG)) {
-                                               len = (switch_size_t) frame.datalen / 2;
-                                               if (len) switch_core_file_write(rh->fh, data, &len);
-                                       }
+                               while (switch_core_media_bug_read(bug, &frame, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS && !switch_test_flag((&frame), SFF_CNG)) {
+                                       len = (switch_size_t) frame.datalen / 2;
+                                       if (len) switch_core_file_write(rh->fh, data, &len);
                                }
+                               
 
                                switch_core_file_close(rh->fh);
                                if (rh->fh->samples_out < read_impl.samples_per_second * 3) {
@@ -493,12 +491,11 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s
                        frame.data = data;
                        frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE;
                        
-                       if (switch_channel_test_flag(channel, CF_ANSWERED) || !switch_core_media_bug_test_flag(bug, SMBF_RECORD_ANSWER_REQ)) {
-                               while (switch_core_media_bug_read(bug, &frame, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS && !switch_test_flag((&frame), SFF_CNG)) {
-                                       len = (switch_size_t) frame.datalen / 2;
-                                       if (len) switch_core_file_write(rh->fh, data, &len);
-                               }
+                       while (switch_core_media_bug_read(bug, &frame, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS && !switch_test_flag((&frame), SFF_CNG)) {
+                               len = (switch_size_t) frame.datalen / 2;
+                               if (len) switch_core_file_write(rh->fh, data, &len);
                        }
+
                }
                break;
        case SWITCH_ABC_TYPE_WRITE:
@@ -911,7 +908,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_record_session(switch_core_session_t
        }
                
        if ((p = switch_channel_get_variable(channel, "RECORD_ANSWER_REQ")) && switch_true(p)) {
-               flags |= SMBF_RECORD_ANSWER_REQ;
+               flags |= SMBF_ANSWER_REQ;
        }