|
|
|
@ -1096,6 +1096,68 @@ void janus_rtc_up(struct call_monologue *ml) { |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// call is locked in some way |
|
|
|
void janus_media_up(struct call_media *media) { |
|
|
|
struct call_monologue *ml = media->monologue; |
|
|
|
if (!ml) |
|
|
|
return; |
|
|
|
|
|
|
|
struct janus_session *session = ml->janus_session; |
|
|
|
if (!session) |
|
|
|
return; |
|
|
|
|
|
|
|
// the monologue tag is the handle ID |
|
|
|
uint64_t handle = str_to_ui(&ml->tag, 0); |
|
|
|
if (!handle) |
|
|
|
return; |
|
|
|
|
|
|
|
// build json |
|
|
|
|
|
|
|
JsonBuilder *builder = json_builder_new(); |
|
|
|
json_builder_begin_object(builder); // { |
|
|
|
json_builder_set_member_name(builder, "janus"); |
|
|
|
json_builder_add_string_value(builder, "media"); |
|
|
|
json_builder_set_member_name(builder, "session_id"); |
|
|
|
json_builder_add_int_value(builder, session->id); |
|
|
|
json_builder_set_member_name(builder, "sender"); |
|
|
|
json_builder_add_int_value(builder, handle); |
|
|
|
json_builder_set_member_name(builder, "mid"); |
|
|
|
if (media->media_id.s) |
|
|
|
json_builder_add_string_value(builder, media->media_id.s); |
|
|
|
else |
|
|
|
json_builder_add_null_value(builder); |
|
|
|
json_builder_set_member_name(builder, "type"); |
|
|
|
json_builder_add_string_value(builder, media->type.s); |
|
|
|
json_builder_set_member_name(builder, "receiving"); |
|
|
|
json_builder_add_boolean_value(builder, true); |
|
|
|
json_builder_end_object(builder); // } |
|
|
|
|
|
|
|
JsonGenerator *gen = json_generator_new(); |
|
|
|
JsonNode *root = json_builder_get_root(builder); |
|
|
|
json_generator_set_root(gen, root); |
|
|
|
char *result = json_generator_to_data(gen, NULL); |
|
|
|
|
|
|
|
json_node_free(root); |
|
|
|
g_object_unref(gen); |
|
|
|
g_object_unref(builder); |
|
|
|
|
|
|
|
// lock order constraint: janus_session lock first, websocket_conn lock second |
|
|
|
|
|
|
|
LOCK(&session->lock); |
|
|
|
|
|
|
|
GHashTableIter iter; |
|
|
|
gpointer value; |
|
|
|
g_hash_table_iter_init(&iter, session->websockets); |
|
|
|
|
|
|
|
while (g_hash_table_iter_next(&iter, NULL, &value)) { |
|
|
|
struct websocket_conn *wc = value; |
|
|
|
websocket_write_text(wc, result, true); |
|
|
|
} |
|
|
|
|
|
|
|
g_free(result); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const char *janus_attach(JsonReader *reader, JsonBuilder *builder, struct janus_session *session, int *retcode) { |
|
|
|
*retcode = 458; |
|
|
|
if (!session) |
|
|
|
|