diff --git a/src/include/private/switch_core_pvt.h b/src/include/private/switch_core_pvt.h index 8beb502f87..79b384c78a 100644 --- a/src/include/private/switch_core_pvt.h +++ b/src/include/private/switch_core_pvt.h @@ -194,6 +194,7 @@ struct switch_core_session { switch_image_write_callback_t image_write_callback; void *image_write_callback_user_data; + switch_slin_data_t *sdata; }; struct switch_media_bug { diff --git a/src/include/switch_core.h b/src/include/switch_core.h index ba1c877919..9492d41220 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -861,6 +861,7 @@ SWITCH_DECLARE(switch_digit_action_target_t) switch_ivr_dmachine_get_target(swit SWITCH_DECLARE(void) switch_ivr_dmachine_set_target(switch_ivr_dmachine_t *dmachine, switch_digit_action_target_t target); SWITCH_DECLARE(switch_status_t) switch_ivr_dmachine_set_terminators(switch_ivr_dmachine_t *dmachine, const char *terminators); SWITCH_DECLARE(switch_status_t) switch_core_session_set_codec_slin(switch_core_session_t *session, switch_slin_data_t *data); +SWITCH_DECLARE(void) switch_core_session_raw_read(switch_core_session_t *session); /*! \brief Retrieve the unique identifier from the core diff --git a/src/mod/applications/mod_fsv/mod_fsv.c b/src/mod/applications/mod_fsv/mod_fsv.c index 77fa89dfcd..cdd9c3a03c 100644 --- a/src/mod/applications/mod_fsv/mod_fsv.c +++ b/src/mod/applications/mod_fsv/mod_fsv.c @@ -568,7 +568,7 @@ SWITCH_STANDARD_APP(play_yuv_function) switch_channel_t *channel = switch_core_session_get_channel(session); switch_frame_t vid_frame = { 0 }; int fd = -1; - switch_codec_t read_codec, *codec = NULL; + switch_codec_t *codec = NULL; unsigned char *vid_buffer; // switch_timer_t timer = { 0 }; switch_dtmf_t dtmf = { 0 }; @@ -578,7 +578,6 @@ SWITCH_STANDARD_APP(play_yuv_function) switch_byte_t *yuv = NULL; int argc; char *argv[3] = { 0 }; - switch_codec_implementation_t read_impl = { 0 }; char *mydata = switch_core_session_strdup(session, data); uint32_t loops = 0; @@ -591,24 +590,7 @@ SWITCH_STANDARD_APP(play_yuv_function) } switch_channel_audio_sync(channel); - - switch_core_session_get_read_impl(session, &read_impl); - if (switch_core_codec_init(&read_codec, - "L16", - NULL, - read_impl.samples_per_second, - read_impl.microseconds_per_packet / 1000, - read_impl.number_of_channels, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, - NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Audio Codec Activation Success\n"); - } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Audio Codec Activation Fail\n"); - switch_channel_set_variable(channel, SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE, "Audio codec activation failed"); - goto done; - } - - switch_core_session_set_read_codec(session, &read_codec); - + switch_core_session_raw_read(session); argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); @@ -716,7 +698,6 @@ SWITCH_STANDARD_APP(play_yuv_function) done: - switch_core_codec_destroy(&read_codec); switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE); // switch_channel_clear_flag(channel, CF_VIDEO_PASSIVE); diff --git a/src/switch_core_session.c b/src/switch_core_session.c index 44aff99849..bcb92197b1 100644 --- a/src/switch_core_session.c +++ b/src/switch_core_session.c @@ -99,7 +99,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_set_codec_slin(switch_core_s NULL, read_impl.actual_samples_per_second, interval, - 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) == SWITCH_STATUS_SUCCESS) { + read_impl.number_of_channels, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) == SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Codec Activated L16@%uhz %dms\n", read_impl.actual_samples_per_second, interval); @@ -1298,6 +1298,9 @@ SWITCH_DECLARE(void) switch_core_session_reset(switch_core_session_t *session, s if (reset_read_codec) { switch_core_session_set_read_codec(session, NULL); + if (session->sdata && switch_core_codec_ready(&session->sdata->codec)) { + switch_core_codec_destroy(&session->sdata->codec); + } } /* clear resamplers */ @@ -1667,7 +1670,7 @@ static void *SWITCH_THREAD_FUNC switch_core_session_thread_pool_worker(switch_th switch_memory_pool_t *pool = node->pool; void *pop; int check = 0; - + switch_mutex_lock(session_manager.mutex); session_manager.starting--; session_manager.running++; @@ -3066,6 +3069,21 @@ SWITCH_DECLARE(void) switch_core_session_debug_pool(switch_stream_handle_t *stre session_manager.running, session_manager.busy, session_manager.popping); } +SWITCH_DECLARE(void) switch_core_session_raw_read(switch_core_session_t *session) +{ + if (session->sdata) { + if (session->sdata && switch_core_codec_ready(&session->sdata->codec)) { + switch_core_codec_destroy(&session->sdata->codec); + } + memset(session->sdata, 0, sizeof(*session->sdata)); + } else { + session->sdata = switch_core_session_alloc(session, sizeof(*session->sdata)); + } + + switch_core_session_set_codec_slin(session, session->sdata); +} + + /* For Emacs: * Local Variables: * mode:c diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index af127feb9e..e54a762924 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -648,6 +648,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_session_echo(switch_core_session_t *s switch_channel_set_flag(channel, CF_VIDEO_DECODED_READ); } + if (switch_true(switch_channel_get_variable(channel, "echo_decode_audio"))) { + switch_core_session_raw_read(session); + } + while (switch_channel_ready(channel)) { status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); if (!SWITCH_READ_ACCEPTABLE(status)) { @@ -700,6 +704,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_session_echo(switch_core_session_t *s } switch_core_session_video_reset(session); + switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE); return SWITCH_STATUS_SUCCESS; }