[Freeswitch-svn] [commit] r4690 - in freeswitch/trunk/src: . mod/applications/mod_ivrtest
Freeswitch SVN
anthm at freeswitch.org
Tue Mar 20 16:37:52 EDT 2007
Author: anthm
Date: Tue Mar 20 16:37:52 2007
New Revision: 4690
Modified:
freeswitch/trunk/src/mod/applications/mod_ivrtest/mod_ivrtest.c
freeswitch/trunk/src/switch_core.c
freeswitch/trunk/src/switch_ivr.c
Log:
update
Modified: freeswitch/trunk/src/mod/applications/mod_ivrtest/mod_ivrtest.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_ivrtest/mod_ivrtest.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_ivrtest/mod_ivrtest.c Tue Mar 20 16:37:52 2007
@@ -233,7 +233,7 @@
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Done\n");
}
-static void bug_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
+static switch_bool_t bug_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
{
switch_frame_t *frame;
@@ -247,6 +247,7 @@
break;
}
+ return SWITCH_TRUE;
}
static void bugtest_function(switch_core_session_t *session, char *data)
Modified: freeswitch/trunk/src/switch_core.c
==============================================================================
--- freeswitch/trunk/src/switch_core.c (original)
+++ freeswitch/trunk/src/switch_core.c Tue Mar 20 16:37:52 2007
@@ -366,7 +366,10 @@
*new_bug = bug;
if (bug->callback) {
- bug->callback(bug, bug->user_data, SWITCH_ABC_TYPE_INIT);
+ switch_bool_t result = bug->callback(bug, bug->user_data, SWITCH_ABC_TYPE_INIT);
+ if (result == SWITCH_FALSE) {
+ return switch_core_media_bug_remove(session, new_bug);
+ }
}
return SWITCH_STATUS_SUCCESS;
@@ -394,9 +397,25 @@
return SWITCH_STATUS_FALSE;
}
+static switch_status_t switch_core_media_bug_close(switch_media_bug_t *bp)
+{
+ if (bp) {
+ if (bp->callback) {
+ bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_CLOSE);
+ bp->ready = 0;
+ }
+ switch_core_media_bug_destroy(bp);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Removing BUG from %s\n", switch_channel_get_name(bp->session->channel));
+ return SWITCH_STATUS_SUCCESS;
+ }
+
+ return SWITCH_STATUS_FALSE;
+}
+
SWITCH_DECLARE(switch_status_t) switch_core_media_bug_remove(switch_core_session_t *session, switch_media_bug_t **bug)
{
switch_media_bug_t *bp = NULL, *last = NULL;
+ switch_status_t status = SWITCH_STATUS_FALSE;
if (session->bugs) {
switch_thread_rwlock_wrlock(session->bug_rwlock);
@@ -416,19 +435,12 @@
}
switch_thread_rwlock_unlock(session->bug_rwlock);
- if (bp) {
- if (bp->callback) {
- bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_CLOSE);
- bp->ready = 0;
- }
- switch_core_media_bug_destroy(bp);
+ if ((status = switch_core_media_bug_close(bp)) == SWITCH_STATUS_SUCCESS) {
*bug = NULL;
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Removing BUG from %s\n", switch_channel_get_name(session->channel));
- return SWITCH_STATUS_SUCCESS;
}
}
- return SWITCH_STATUS_FALSE;
+ return status;
}
struct switch_core_port_allocator {
@@ -2195,17 +2207,31 @@
}
if (session->bugs) {
- switch_media_bug_t *bp;
+ switch_media_bug_t *bp, *dp, *last = NULL;
+
switch_thread_rwlock_rdlock(session->bug_rwlock);
for (bp = session->bugs; bp; bp = bp->next) {
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);
if (bp->callback) {
- bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_READ);
+ if (bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_READ) == SWITCH_FALSE) {
+ bp->ready = 0;
+ if (last) {
+ last->next = bp->next;
+ } else {
+ session->bugs = bp->next;
+ }
+ switch_mutex_unlock(bp->read_mutex);
+ dp = bp;
+ bp = last;
+ switch_core_media_bug_close(dp);
+ continue;
+ }
}
switch_mutex_unlock(bp->read_mutex);
}
+ last = bp;
}
switch_thread_rwlock_unlock(session->bug_rwlock);
}
@@ -2457,7 +2483,9 @@
}
if (session->bugs) {
- switch_media_bug_t *bp;
+ switch_media_bug_t *bp, *dp, *last = NULL;
+ switch_bool_t ok = SWITCH_TRUE;
+
switch_thread_rwlock_rdlock(session->bug_rwlock);
for (bp = session->bugs; bp; bp = bp->next) {
if (!bp->ready) {
@@ -2468,17 +2496,33 @@
switch_buffer_write(bp->raw_write_buffer, write_frame->data, write_frame->datalen);
switch_mutex_unlock(bp->write_mutex);
if (bp->callback) {
- bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_WRITE);
+ ok = bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_WRITE);
}
} else if (switch_test_flag(bp, SMBF_WRITE_REPLACE)) {
do_bugs = 0;
if (bp->callback) {
bp->replace_frame_in = frame;
bp->replace_frame_out = NULL;
- bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_WRITE_REPLACE);
- write_frame = bp->replace_frame_out;
+ if ((ok = bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_WRITE_REPLACE)) == SWITCH_TRUE) {
+ write_frame = bp->replace_frame_out;
+ }
+ }
+ }
+
+ if (ok == SWITCH_FALSE) {
+ bp->ready = 0;
+ if (last) {
+ last->next = bp->next;
+ } else {
+ session->bugs = bp->next;
}
+ switch_mutex_unlock(bp->read_mutex);
+ dp = bp;
+ bp = last;
+ switch_core_media_bug_close(dp);
+ continue;
}
+ last = bp;
}
switch_thread_rwlock_unlock(session->bug_rwlock);
}
Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c (original)
+++ freeswitch/trunk/src/switch_ivr.c Tue Mar 20 16:37:52 2007
@@ -555,7 +555,7 @@
return status;
}
-static void record_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
+static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
{
switch_file_handle_t *fh = (switch_file_handle_t *) user_data;
uint8_t data[SWITCH_RECOMMENDED_BUFFER_SIZE];
@@ -586,6 +586,8 @@
default:
break;
}
+
+ return SWITCH_TRUE;
}
SWITCH_DECLARE(switch_status_t) switch_ivr_stop_record_session(switch_core_session_t *session, char *file)
@@ -699,7 +701,7 @@
teletone_dtmf_detect_state_t dtmf_detect;
} switch_inband_dtmf_t;
-static void inband_dtmf_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
+static switch_bool_t inband_dtmf_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
{
switch_inband_dtmf_t *pvt = (switch_inband_dtmf_t *) user_data;
uint8_t data[SWITCH_RECOMMENDED_BUFFER_SIZE];
@@ -730,6 +732,8 @@
default:
break;
}
+
+ return SWITCH_TRUE;
}
SWITCH_DECLARE(switch_status_t) switch_ivr_stop_inband_dtmf_session(switch_core_session_t *session)
@@ -857,7 +861,7 @@
return NULL;
}
-static void speech_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
+static switch_bool_t speech_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
{
struct speech_thread_handle *sth = (struct speech_thread_handle *) user_data;
uint8_t data[SWITCH_RECOMMENDED_BUFFER_SIZE];
@@ -891,7 +895,7 @@
if (switch_core_media_bug_read(bug, &frame) == SWITCH_STATUS_SUCCESS) {
if (switch_core_asr_feed(sth->ah, frame.data, frame.datalen, &flags) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Error Feeding Data\n");
- return;
+ return SWITCH_FALSE;
}
if (switch_core_asr_check_results(sth->ah, &flags) == SWITCH_STATUS_SUCCESS) {
switch_mutex_lock(sth->mutex);
@@ -905,6 +909,8 @@
default:
break;
}
+
+ return SWITCH_TRUE;
}
SWITCH_DECLARE(switch_status_t) switch_ivr_stop_detect_speech(switch_core_session_t *session)
More information about the Freeswitch-svn
mailing list