]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7500: add switch_core_session_raw_read to put session into raw read mode without...
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 20 Nov 2014 17:28:05 +0000 (11:28 -0600)
committerMichael Jerris <mike@jerris.com>
Thu, 28 May 2015 17:46:47 +0000 (12:46 -0500)
src/include/private/switch_core_pvt.h
src/include/switch_core.h
src/mod/applications/mod_fsv/mod_fsv.c
src/switch_core_session.c
src/switch_ivr_async.c

index 8beb502f875679a9ffee010d43bf49d211a050a9..79b384c78a802637c0908662632b62b2635886a4 100644 (file)
@@ -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 {
index ba1c877919a1169a84a84f49d53ccf3d7143adee..9492d412208d67ebdf9558a9e201ff470f5c4bc0 100644 (file)
@@ -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
index 77fa89dfcdc293556b825a6fea2a1b45b7821d3e..cdd9c3a03cc0565f077989597921aac758d27320 100644 (file)
@@ -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);
index 44aff9984940e367ad9ca7e7208d697412a0adea..bcb92197b1a19df4b454493888595057c52ba613 100644 (file)
@@ -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
index af127feb9ea4482611c2f96e349edee1bc7855eb..e54a7629240b1141be2da615f2a1d9b938e13926 100644 (file)
@@ -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;
 }