switch_image_write_callback_t image_write_callback;
void *image_write_callback_user_data;
+ switch_slin_data_t *sdata;
};
struct switch_media_bug {
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
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 };
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;
}
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])));
done:
- switch_core_codec_destroy(&read_codec);
switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE);
// switch_channel_clear_flag(channel, CF_VIDEO_PASSIVE);
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);
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 */
switch_memory_pool_t *pool = node->pool;
void *pop;
int check = 0;
-
+
switch_mutex_lock(session_manager.mutex);
session_manager.starting--;
session_manager.running++;
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
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)) {
}
switch_core_session_video_reset(session);
+ switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE);
return SWITCH_STATUS_SUCCESS;
}