\brief Launch a service thread on a session to drop inbound data
\param session the session the launch thread on
*/
-SWITCH_DECLARE(void) switch_core_service_session(_In_ switch_core_session_t *session);
+SWITCH_DECLARE(void) switch_core_service_session_av(_In_ switch_core_session_t *session, switch_bool_t audio, switch_bool_t video);
+#define switch_core_service_session(_s) switch_core_service_session_av(_s, SWITCH_TRUE, SWITCH_FALSE)
+
/*!
\brief Request an outgoing session spawned from an existing session using a desired endpoing module
switch_channel_set_flag(channel, CF_SERVICE);
while (switch_channel_test_flag(channel, CF_SERVICE)) {
- switch (switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0)) {
- case SWITCH_STATUS_SUCCESS:
- case SWITCH_STATUS_TIMEOUT:
- case SWITCH_STATUS_BREAK:
- break;
- default:
- switch_channel_clear_flag(channel, CF_SERVICE);
- continue;
+
+ if (switch_channel_test_flag(channel, CF_SERVICE_AUDIO)) {
+ switch (switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0)) {
+ case SWITCH_STATUS_SUCCESS:
+ case SWITCH_STATUS_TIMEOUT:
+ case SWITCH_STATUS_BREAK:
+ break;
+ default:
+ switch_channel_clear_flag(channel, CF_SERVICE);
+ break;
+ }
+ }
+
+ if (switch_channel_test_flag(channel, CF_SERVICE_VIDEO) && switch_channel_test_flag(channel, CF_VIDEO)) {
+ switch (switch_core_session_read_video_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0)) {
+ case SWITCH_STATUS_SUCCESS:
+ case SWITCH_STATUS_TIMEOUT:
+ case SWITCH_STATUS_BREAK:
+ break;
+ default:
+ switch_channel_clear_flag(channel, CF_SERVICE);
+ break;
+ }
}
}
switch_mutex_unlock(session->frame_read_mutex);
+ switch_channel_clear_flag(channel, CF_SERVICE_AUDIO);
+ switch_channel_clear_flag(channel, CF_SERVICE_VIDEO);
+
switch_core_session_rwunlock(session);
return NULL;
switch_assert(channel);
switch_channel_clear_flag(channel, CF_SERVICE);
+ switch_channel_clear_flag(channel, CF_SERVICE_AUDIO);
+ switch_channel_clear_flag(channel, CF_SERVICE_VIDEO);
+
+ switch_core_session_kill_channel(session, SWITCH_SIG_BREAK);
+
}
-SWITCH_DECLARE(void) switch_core_service_session(switch_core_session_t *session)
+SWITCH_DECLARE(void) switch_core_service_session_av(switch_core_session_t *session, switch_bool_t audio, switch_bool_t video)
{
switch_channel_t *channel;
switch_assert(session);
channel = switch_core_session_get_channel(session);
switch_assert(channel);
+ if (audio) switch_channel_set_flag(channel, CF_SERVICE_AUDIO);
+ if (video) switch_channel_set_flag(channel, CF_SERVICE_VIDEO);
+
switch_core_session_launch_thread(session, (void *(*)(switch_thread_t *,void *))switch_core_service_thread, session);
}