Author: anthm Date: Tue Jun 12 23:09:53 2007 New Revision: 5318 Modified: freeswitch/trunk/build/modules.conf.in freeswitch/trunk/src/include/private/switch_core_pvt.h freeswitch/trunk/src/include/switch_core.h freeswitch/trunk/src/include/switch_types.h freeswitch/trunk/src/mod/applications/mod_soundtouch/mod_soundtouch.cpp freeswitch/trunk/src/switch_core_io.c freeswitch/trunk/src/switch_core_media_bug.c Log: update Modified: freeswitch/trunk/build/modules.conf.in ============================================================================== --- freeswitch/trunk/build/modules.conf.in (original) +++ freeswitch/trunk/build/modules.conf.in Tue Jun 12 23:09:53 2007 @@ -8,6 +8,7 @@ applications/mod_enum #applications/mod_ivrtest #applications/mod_park +#applications/mod_soundtouch applications/mod_playback #applications/mod_rss #applications/mod_skel Modified: freeswitch/trunk/src/include/private/switch_core_pvt.h ============================================================================== --- freeswitch/trunk/src/include/private/switch_core_pvt.h (original) +++ freeswitch/trunk/src/include/private/switch_core_pvt.h Tue Jun 12 23:09:53 2007 @@ -127,8 +127,10 @@ struct switch_media_bug { switch_buffer_t *raw_write_buffer; switch_buffer_t *raw_read_buffer; - switch_frame_t *replace_frame_in; - switch_frame_t *replace_frame_out; + switch_frame_t *read_replace_frame_in; + switch_frame_t *read_replace_frame_out; + switch_frame_t *write_replace_frame_in; + switch_frame_t *write_replace_frame_out; switch_media_bug_callback_t callback; switch_mutex_t *read_mutex; switch_mutex_t *write_mutex; Modified: freeswitch/trunk/src/include/switch_core.h ============================================================================== --- freeswitch/trunk/src/include/switch_core.h (original) +++ freeswitch/trunk/src/include/switch_core.h Tue Jun 12 23:09:53 2007 @@ -142,14 +142,27 @@ \brief Obtain a replace frame from a media bug \param bug the bug to get the data from */ -SWITCH_DECLARE(switch_frame_t *) switch_core_media_bug_get_replace_frame(switch_media_bug_t *bug); +SWITCH_DECLARE(switch_frame_t *) switch_core_media_bug_get_write_replace_frame(switch_media_bug_t *bug); /*! \brief Set a return replace frame \param bug the bug to set the frame on \param frame the frame to set */ -SWITCH_DECLARE(void) switch_core_media_bug_set_replace_frame(switch_media_bug_t *bug, switch_frame_t *frame); +SWITCH_DECLARE(void) switch_core_media_bug_set_write_replace_frame(switch_media_bug_t *bug, switch_frame_t *frame); + +/*! + \brief Obtain a replace frame from a media bug + \param bug the bug to get the data from +*/ +SWITCH_DECLARE(switch_frame_t *) switch_core_media_bug_get_read_replace_frame(switch_media_bug_t *bug); + +/*! + \brief Set a return replace frame + \param bug the bug to set the frame on + \param frame the frame to set +*/ +SWITCH_DECLARE(void) switch_core_media_bug_set_read_replace_frame(switch_media_bug_t *bug, switch_frame_t *frame); /*! \brief Remove a media bug from the session Modified: freeswitch/trunk/src/include/switch_types.h ============================================================================== --- freeswitch/trunk/src/include/switch_types.h (original) +++ freeswitch/trunk/src/include/switch_types.h Tue Jun 12 23:09:53 2007 @@ -196,6 +196,7 @@ SWITCH_ABC_TYPE_READ, SWITCH_ABC_TYPE_WRITE, SWITCH_ABC_TYPE_WRITE_REPLACE, + SWITCH_ABC_TYPE_READ_REPLACE, SWITCH_ABC_TYPE_CLOSE } switch_abc_type_t; @@ -742,14 +743,16 @@ <pre> SMBF_READ_STREAM - Include the Read Stream SMBF_WRITE_STREAM - Include the Write Stream -SMBF_WRITE_STREAM - Replace the Write Stream +SMBF_WRITE_REPLACE - Replace the Write Stream +SMBF_READ_REPLACE - Replace the Read Stream </pre> */ typedef enum { SMBF_BOTH = 0, SMBF_READ_STREAM = (1 << 0), SMBF_WRITE_STREAM = (1 << 1), - SMBF_WRITE_REPLACE = (1 << 2) + SMBF_WRITE_REPLACE = (1 << 2), + SMBF_READ_REPLACE = (1 << 3) } switch_media_bug_flag_t; /*! Modified: freeswitch/trunk/src/mod/applications/mod_soundtouch/mod_soundtouch.cpp ============================================================================== --- freeswitch/trunk/src/mod/applications/mod_soundtouch/mod_soundtouch.cpp (original) +++ freeswitch/trunk/src/mod/applications/mod_soundtouch/mod_soundtouch.cpp Tue Jun 12 23:09:53 2007 @@ -215,7 +215,7 @@ assert(sth != NULL); assert(sth->st != NULL); - frame = switch_core_media_bug_get_replace_frame(bug); + frame = switch_core_media_bug_get_write_replace_frame(bug); sth->st->putSamples((SAMPLETYPE *)frame->data, frame->samples); if (sth->st->numSamples() >= frame->samples * 2) { @@ -225,7 +225,7 @@ memset(frame->data, 0, frame->datalen); } - switch_core_media_bug_set_replace_frame(bug, frame); + switch_core_media_bug_set_write_replace_frame(bug, frame); } Modified: freeswitch/trunk/src/switch_core_io.c ============================================================================== --- freeswitch/trunk/src/switch_core_io.c (original) +++ freeswitch/trunk/src/switch_core_io.c Tue Jun 12 23:09:53 2007 @@ -225,7 +225,7 @@ if (session->bugs) { 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 && switch_test_flag(bp, SMBF_READ_STREAM)) { @@ -233,23 +233,35 @@ switch_buffer_write(bp->raw_read_buffer, read_frame->data, read_frame->datalen); if (bp->callback) { if (bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_READ) == SWITCH_FALSE || (bp->stop_time && bp->stop_time >= time(NULL))) { - 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); - if (!bp) { - break; - } - continue; + ok = SWITCH_FALSE; } } switch_mutex_unlock(bp->read_mutex); + } else if (switch_test_flag(bp, SMBF_READ_REPLACE)) { + do_bugs = 0; + if (bp->callback) { + bp->read_replace_frame_in = read_frame; + bp->read_replace_frame_out = NULL; + if ((ok = bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_READ_REPLACE)) == SWITCH_TRUE) { + read_frame = bp->read_replace_frame_out; + } + } + } + + if (ok == SWITCH_FALSE) { + bp->ready = 0; + if (last) { + last->next = bp->next; + } else { + session->bugs = bp->next; + } + dp = bp; + bp = last; + switch_core_media_bug_close(&dp); + if (!bp) { + break; + } + continue; } last = bp; } @@ -497,10 +509,10 @@ } else if (switch_test_flag(bp, SMBF_WRITE_REPLACE)) { do_bugs = 0; if (bp->callback) { - bp->replace_frame_in = write_frame; - bp->replace_frame_out = NULL; + bp->write_replace_frame_in = write_frame; + bp->write_replace_frame_out = NULL; if ((ok = bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_WRITE_REPLACE)) == SWITCH_TRUE) { - write_frame = bp->replace_frame_out; + write_frame = bp->write_replace_frame_out; } } } Modified: freeswitch/trunk/src/switch_core_media_bug.c ============================================================================== --- freeswitch/trunk/src/switch_core_media_bug.c (original) +++ freeswitch/trunk/src/switch_core_media_bug.c Tue Jun 12 23:09:53 2007 @@ -41,14 +41,24 @@ } -SWITCH_DECLARE(switch_frame_t *) switch_core_media_bug_get_replace_frame(switch_media_bug_t *bug) +SWITCH_DECLARE(switch_frame_t *) switch_core_media_bug_get_write_replace_frame(switch_media_bug_t *bug) { - return bug->replace_frame_in; + return bug->write_replace_frame_in; } -SWITCH_DECLARE(void) switch_core_media_bug_set_replace_frame(switch_media_bug_t *bug, switch_frame_t *frame) +SWITCH_DECLARE(void) switch_core_media_bug_set_write_replace_frame(switch_media_bug_t *bug, switch_frame_t *frame) { - bug->replace_frame_out = frame; + bug->write_replace_frame_out = frame; +} + +SWITCH_DECLARE(switch_frame_t *) switch_core_media_bug_get_read_replace_frame(switch_media_bug_t *bug) +{ + return bug->read_replace_frame_in; +} + +SWITCH_DECLARE(void) switch_core_media_bug_set_read_replace_frame(switch_media_bug_t *bug, switch_frame_t *frame) +{ + bug->read_replace_frame_out = frame; } SWITCH_DECLARE(void *) switch_core_media_bug_get_user_data(switch_media_bug_t *bug) @@ -161,6 +171,18 @@ switch_thread_rwlock_unlock(session->bug_rwlock); } + if (flags & SMBF_READ_REPLACE) { + switch_thread_rwlock_wrlock(session->bug_rwlock); + for (bp = session->bugs; bp; bp = bp->next) { + if (switch_test_flag(bp, SMBF_READ_REPLACE)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Only one bug of this type allowed!\n"); + switch_thread_rwlock_unlock(session->bug_rwlock); + return SWITCH_STATUS_GENERR; + } + } + switch_thread_rwlock_unlock(session->bug_rwlock); + } + if (!(bug = switch_core_session_alloc(session, sizeof(*bug)))) { return SWITCH_STATUS_MEMERR; }