int _push_media_packet(webrtc_s *webrtc, unsigned int source_id, media_packet_h packet);
int _get_transceiver_direction(webrtc_s *webrtc, unsigned int source_id, webrtc_media_type_e media_type, webrtc_transceiver_direction_e *direction);
int _set_transceiver_direction(webrtc_s *webrtc, unsigned int source_id, webrtc_media_type_e media_type, webrtc_transceiver_direction_e direction);
-void _post_state_in_idle(webrtc_s *webrtc, webrtc_state_e new_state);
void _invoke_state_changed_cb(webrtc_s *webrtc, webrtc_state_e old, webrtc_state_e new);
void _connect_and_append_signal(GList **signals, GObject *obj, const char *sig_name, GCallback cb, gpointer user_data);
return TRUE;
}
+typedef struct _idle_userdata {
+ webrtc_s *webrtc;
+ webrtc_state_e state;
+} idle_userdata_s;
+
static gboolean __idle_cb(gpointer user_data)
{
- webrtc_s *webrtc = (webrtc_s*)user_data;
+ idle_userdata_s *data = (idle_userdata_s*)user_data;
+ webrtc_s *webrtc;
webrtc_state_e old_state;
+ RET_VAL_IF(!data, G_SOURCE_REMOVE, "userdata is NULL");
+ if (!data->webrtc) {
+ LOG_ERROR("webrtc is NULL");
+ g_free(data);
+ return G_SOURCE_REMOVE;
+ }
+
+ webrtc = data->webrtc;
+
g_mutex_lock(&webrtc->mutex);
old_state = webrtc->state;
- webrtc->state = webrtc->pend_state;
+ webrtc->state = data->state;
g_mutex_unlock(&webrtc->mutex);
_invoke_state_changed_cb(webrtc, old_state, webrtc->state);
+ g_free(data);
+
return G_SOURCE_REMOVE;
}
-void _post_state_in_idle(webrtc_s *webrtc, webrtc_state_e new_state)
+static void __post_state_cb_in_idle(webrtc_s *webrtc, webrtc_state_e new_state)
{
+ idle_userdata_s *data;
+
if (webrtc->state == new_state)
return;
+ data = g_new0(idle_userdata_s, 1);
+ data->webrtc = webrtc;
+ data->state = new_state;
+
webrtc->pend_state = new_state;
- g_idle_add(__idle_cb, webrtc);
+
+ g_idle_add(__idle_cb, data);
LOG_DEBUG("state will be changed [%s] -> [%s]", __state_str[webrtc->state], __state_str[new_state]);
}
ret = _release_all_resources(webrtc);
RET_VAL_WITH_UNLOCK_IF(ret != WEBRTC_ERROR_NONE, ret, &webrtc->mutex, "failed to release all resources");
#endif
- _post_state_in_idle(webrtc, WEBRTC_STATE_IDLE);
+ __post_state_cb_in_idle(webrtc, WEBRTC_STATE_IDLE);
- LOG_INFO("webrtc[%p] is stopping", webrtc);
+ LOG_INFO("webrtc[%p] is stopped", webrtc);
g_mutex_unlock(&webrtc->mutex);