webrtc_test: Abandon connection change menu 21/265621/4
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 25 Oct 2021 09:47:40 +0000 (18:47 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Tue, 26 Oct 2021 03:55:38 +0000 (12:55 +0900)
The connection change menu intended to use multiple websocket
connections is not that useful considering the conflict of display
object. This application is now modified to use only one websocket
connection with signaling server.

The room joining scenario still can have multiple peers(webrtc handles)
with only one websocket connection.

[Version] 0.2.139
[Issue Type] Clean-up

Change-Id: I712665a9f1040e192706716e6fa6b4f75fb7599a
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/capi-media-webrtc.spec
test/webrtc_test.c

index 5e4e1896a1d0ba60c7d479a7d2f5af204c6042c5..907b43a99010fc45ee17394d4699379d77e22af8 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.2.138
+Version:    0.2.139
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index c8bd92eeffb4a309c09258b25a9599b68d0084c6..50e978e1c843df6115d8d1c652dac3553dfc99bd 100644 (file)
@@ -91,7 +91,6 @@ enum {
        CURRENT_STATUS_SET_REMOTE_DESCRIPTION,
        CURRENT_STATUS_SETTING_SIGNALING_SERVER,
        CURRENT_STATUS_SETTING_PROXY,
-       CURRENT_STATUS_CHANGE_CONNECTION,
        CURRENT_STATUS_REQUEST_SESSION,
        CURRENT_STATUS_REQUEST_JOIN_ROOM,
        CURRENT_STATUS_SEND_LOCAL_DESCRIPTION,
@@ -178,19 +177,12 @@ typedef struct {
 
 typedef struct _connection_s {
        int index;
-       SoupWebsocketConnection *ws_conn;
-       gint32 local_peer_id;
        int remote_peer_id;
-       int server_status;
 
        bool is_for_room;
        bool is_offer;
        int room_source_type;
 
-       /* for private network */
-       webrtc_signaling_client_h signaling_client;
-       bool is_connected;
-
        webrtc_h webrtc;
        webrtc_data_channel_h channels[MAX_CHANNEL_LEN];
        int channel_index;
@@ -200,9 +192,6 @@ typedef struct _connection_s {
        char *remote_desc;
        GList *ice_candidates;
 
-       int menu_state;
-       int cnt;
-
        /* receive data & dump file */
        gint64 sum_size;
        gchar *expected_name;
@@ -235,12 +224,24 @@ typedef struct _connection_s {
        media_packet_source_s packet_sources[MAX_MEDIA_PACKET_SOURCE_LEN];
 } connection_s;
 
-static gchar g_signaling_server[MAX_STRING_LEN];
+typedef struct _signaling_server_s {
+       gchar url[MAX_STRING_LEN];
+       SoupWebsocketConnection *ws_conn;
+       int server_status;
+       gint32 local_peer_id;
+
+       /* for private network - internal API */
+       webrtc_signaling_client_h signaling_client;
+       bool is_connected;
+} signaling_server_s;
+
 static gchar g_proxy[MAX_STRING_LEN];
 
 static appdata_s g_ad;
 static connection_s g_conns[MAX_CONNECTION_LEN];
-static int g_conn_index;
+static signaling_server_s g_signaling_server;
+static int g_menu_state;
+static int g_cnt;
 
 static webrtc_signaling_server_h g_inner_signaling_server;
 
@@ -1086,7 +1087,7 @@ static void _webrtc_data_channel_send_string(int index, const char *string)
        int ret = WEBRTC_ERROR_NONE;
        int i;
        gchar *string_with_peer_id;
-       string_with_peer_id = g_strdup_printf("[%d] %s", g_conns[index].local_peer_id, string);
+       string_with_peer_id = g_strdup_printf("[%d] %s", g_signaling_server.local_peer_id, string);
 
        for (i = 0; i < MAX_CHANNEL_LEN; i++) {
                if (g_conns[index].channels[i] == NULL)
@@ -1110,7 +1111,7 @@ static void _webrtc_data_channel_send_string_as_bytes(int index, const char *str
        int ret = WEBRTC_ERROR_NONE;
        int i;
        gchar *string_with_peer_id;
-       string_with_peer_id = g_strdup_printf("[%d] %s", g_conns[index].local_peer_id, string);
+       string_with_peer_id = g_strdup_printf("[%d] %s", g_signaling_server.local_peer_id, string);
 
        for (i = 0; i < MAX_CHANNEL_LEN; i++) {
                if (g_conns[index].channels[i] == NULL)
@@ -1324,7 +1325,7 @@ static void __foreach_ice_candidate(gpointer data, gpointer user_data)
 {
        int ret = WEBRTC_ERROR_NONE;
 
-       ret = webrtc_add_ice_candidate(g_conns[g_conn_index].webrtc, (const char *)data);
+       ret = webrtc_add_ice_candidate(g_conns[0].webrtc, (const char *)data);
        RET_IF(ret != WEBRTC_ERROR_NONE, "ret[0x%x]", ret);
 
        g_print("webrtc_ice_candidate() success\n");
@@ -1683,7 +1684,7 @@ static void _websocket_connection_send_text_for_room(connection_s *conn, int rem
        RET_IF(!message, "message is NULL");
 
        message_for_room = g_strdup_printf ("ROOM_PEER_MSG %d %s", remote_peer_id, message);
-       soup_websocket_connection_send_text(conn->ws_conn, message_for_room);
+       soup_websocket_connection_send_text(g_signaling_server.ws_conn, message_for_room);
        g_free(message_for_room);
 }
 
@@ -1766,11 +1767,11 @@ static void __signaling_message_cb(webrtc_signaling_message_type_e type, const c
 
        if (type == SIGNALING_MESSAGE_TYPE_CONNECTED) {
                g_print("\n[from SERVER > CONNECTED %s]\n", message);
-               conn->is_connected = true;
+               g_signaling_server.is_connected = true;
 
        } else if (type == SIGNALING_MESSAGE_TYPE_DISCONNECTED) {
                g_print("\n[from SERVER > DISCONNECTED %s]\n", message);
-               conn->is_connected = false;
+               g_signaling_server.is_connected = false;
 
        } else if (type == SIGNALING_MESSAGE_TYPE_SESSION_ESTABLISHED) {
                g_print("\n[from SERVER > SESSION_ESTABLISHED with %s]\n", message);
@@ -1790,49 +1791,49 @@ static void __signaling_message_cb(webrtc_signaling_message_type_e type, const c
        }
 }
 
-static void _webrtc_signaling_connect(int index, const char *ip, int port)
+static void _webrtc_signaling_connect(const char *ip, int port)
 {
        int ret = WEBRTC_ERROR_NONE;
 
-       if (strlen(g_signaling_server) > 0) {
-               g_printerr("server[%s] is already set by 'ss'\n", g_signaling_server);
+       if (strlen(g_signaling_server.url) > 0) {
+               g_printerr("server[%s] is already set by 'ss'\n", g_signaling_server.url);
                return;
        }
 
-       ret = webrtc_signaling_connect(ip, port, __signaling_message_cb, &g_conns[index], &g_conns[index].signaling_client);
+       ret = webrtc_signaling_connect(ip, port, __signaling_message_cb, &g_conns[0], &g_signaling_server.signaling_client);
        RET_IF(ret != WEBRTC_ERROR_NONE, "ret[0x%x]", ret);
 
        g_print("webrtc_signaling_connect() success\n");
 }
 
-static void _webrtc_signaling_disconnect(int index)
+static void _webrtc_signaling_disconnect(void)
 {
        int ret = WEBRTC_ERROR_NONE;
 
-       ret = webrtc_signaling_disconnect(g_conns[index].signaling_client);
+       ret = webrtc_signaling_disconnect(g_signaling_server.signaling_client);
        RET_IF(ret != WEBRTC_ERROR_NONE, "ret[0x%x]", ret);
 
        g_print("webrtc_signaling_disconnect() success\n");
 }
 
-static void _webrtc_signaling_request_session(int index, int peer_id)
+static void _webrtc_signaling_request_session(int peer_id)
 {
        int ret = WEBRTC_ERROR_NONE;
 
-       ret = webrtc_signaling_request_session(g_conns[index].signaling_client, peer_id);
+       ret = webrtc_signaling_request_session(g_signaling_server.signaling_client, peer_id);
        RET_IF(ret != WEBRTC_ERROR_NONE, "ret[0x%x]", ret);
 
        g_print("webrtc_signaling_request_session() success\n");
 }
 
-static void _webrtc_signaling_send_message(connection_s *conn, const char *message)
+static void _webrtc_signaling_send_message(const char *message)
 {
        int ret = WEBRTC_ERROR_NONE;
 
-       RET_IF(!conn, "conn is NULL");
        RET_IF(!message, "message is NULL");
+       RET_IF(!g_signaling_server.signaling_client, "signaling_client is NULL");
 
-       ret = webrtc_signaling_send_message(conn->signaling_client, message);
+       ret = webrtc_signaling_send_message(g_signaling_server.signaling_client, message);
        RET_IF(ret != WEBRTC_ERROR_NONE, "ret[0x%x]", ret);
 
        g_print("webrtc_signaling_send_message() success\n");
@@ -1846,13 +1847,13 @@ static void __ice_candidate_cb(webrtc_h webrtc, const char *candidate, void *use
        RET_IF(!conn, "conn is NULL");
 
        g_print("\n[to SERVER > ICE]\n%s\n", candidate);
-       if (conn->ws_conn) {
+       if (g_signaling_server.ws_conn) {
                if (conn->is_for_room)
                        _websocket_connection_send_text_for_room(conn, conn->remote_peer_id, candidate);
                else
-                       soup_websocket_connection_send_text(conn->ws_conn, candidate);
-       } else if (conn->signaling_client && conn->is_connected) {
-               _webrtc_signaling_send_message(conn, candidate);
+                       soup_websocket_connection_send_text(g_signaling_server.ws_conn, candidate);
+       } else if (g_signaling_server.signaling_client && g_signaling_server.is_connected) {
+               _webrtc_signaling_send_message(candidate);
        }
 }
 
@@ -2323,7 +2324,7 @@ static void _setting_uri(gchar *dest_arr, char *uri)
        if (!uri)
                return;
 
-       if (g_conns[g_conn_index].signaling_client) {
+       if (g_signaling_server.signaling_client) {
                g_printerr("already set by 'scc'\n");
                return;
        }
@@ -2337,16 +2338,16 @@ static void _setting_uri(gchar *dest_arr, char *uri)
        }
 }
 
-static void _request_session(int index, int remote_peer_id)
+static void _request_session(int remote_peer_id)
 {
-       if (!g_conns[index].ws_conn && !g_conns[index].is_connected) {
-               g_printerr("server[%s] is not connected\n", g_signaling_server);
+       if (!g_signaling_server.ws_conn && !g_signaling_server.is_connected) {
+               g_printerr("server[%s] is not connected\n", g_signaling_server.url);
                return;
        }
 
-       if (g_conns[index].ws_conn) {
+       if (g_signaling_server.ws_conn) {
                gchar *msg;
-               if (soup_websocket_connection_get_state(g_conns[index].ws_conn) != SOUP_WEBSOCKET_STATE_OPEN) {
+               if (soup_websocket_connection_get_state(g_signaling_server.ws_conn) != SOUP_WEBSOCKET_STATE_OPEN) {
                        g_printerr("websocket is not opened\n");
                        return;
                }
@@ -2354,28 +2355,28 @@ static void _request_session(int index, int remote_peer_id)
                msg = g_strdup_printf("SESSION %d", remote_peer_id);
 
                g_print("\n[to SERVER > %s]\n", msg);
-               soup_websocket_connection_send_text(g_conns[index].ws_conn, msg);
+               soup_websocket_connection_send_text(g_signaling_server.ws_conn, msg);
                g_free(msg);
 
        } else {
-               _webrtc_signaling_request_session(index, remote_peer_id);
+               _webrtc_signaling_request_session(remote_peer_id);
        }
 }
 
-static void _request_join_room(int index, char *room_name)
+static void _request_join_room(char *room_name)
 {
        gchar *msg;
 
        RET_IF(!room_name, "room_name is NULL");
 
-       if (!g_conns[index].ws_conn && !g_conns[index].is_connected) {
-               g_printerr("server[%s] is not connected\n", g_signaling_server);
+       if (!g_signaling_server.ws_conn && !g_signaling_server.is_connected) {
+               g_printerr("server[%s] is not connected\n", g_signaling_server.url);
                return;
        }
 
-       RET_IF(!g_conns[index].ws_conn, "ws_conn is NULL");
+       RET_IF(!g_signaling_server.ws_conn, "ws_conn is NULL");
 
-       if (soup_websocket_connection_get_state(g_conns[index].ws_conn) != SOUP_WEBSOCKET_STATE_OPEN) {
+       if (soup_websocket_connection_get_state(g_signaling_server.ws_conn) != SOUP_WEBSOCKET_STATE_OPEN) {
                g_printerr("websocket is not opened\n");
                return;
        }
@@ -2383,27 +2384,27 @@ static void _request_join_room(int index, char *room_name)
        msg = g_strdup_printf("ROOM %s", room_name);
 
        g_print("\n[to SERVER > %s]\n", msg);
-       soup_websocket_connection_send_text(g_conns[index].ws_conn, msg);
+       soup_websocket_connection_send_text(g_signaling_server.ws_conn, msg);
        g_free(msg);
 }
 
-static void _send_local_description(int index, bool is_offer)
+static void _send_local_description(bool is_offer)
 {
        char *desc;
 
-       if (!g_conns[index].ws_conn && !g_conns[index].is_connected) {
-               g_printerr("server[%s] is not connected\n", g_signaling_server);
+       if (!g_signaling_server.ws_conn && !g_signaling_server.is_connected) {
+               g_printerr("server[%s] is not connected\n", g_signaling_server.url);
                return;
        }
 
-       desc = is_offer ? g_conns[index].offer : g_conns[index].answer;
+       desc = is_offer ? g_conns[0].offer : g_conns[0].answer;
 
        g_print("\n[to SERVER > local description]\n%s\n", desc);
 
-       if (g_conns[index].ws_conn)
-               soup_websocket_connection_send_text(g_conns[index].ws_conn, desc);
+       if (g_signaling_server.ws_conn)
+               soup_websocket_connection_send_text(g_signaling_server.ws_conn, desc);
        else
-               _webrtc_signaling_send_message(&g_conns[index], desc);
+               _webrtc_signaling_send_message(desc);
 }
 
 gulong _connect_signal(GObject *obj, const char *signal_name, GCallback callback, gpointer user_data)
@@ -3315,30 +3316,30 @@ static void _webrtc_media_source_get_file_looping(int index, unsigned int source
        g_print("webrtc_file_source_get_looping() success, source_id[%u] looping_state[%u]\n", source_id, looping_state);
 }
 
-static void __close_websocket(connection_s *conn)
+static void __close_websocket(signaling_server_s *ss)
 {
-       RET_IF(!conn, "conn is NULL");
+       RET_IF(!ss, "ss is NULL");
 
-       g_print("close websocket, ws_conn[%p]\n", conn->ws_conn);
+       g_print("close websocket, ws_conn[%p]\n", ss->ws_conn);
 
-       if (soup_websocket_connection_get_state(conn->ws_conn) == SOUP_WEBSOCKET_STATE_OPEN)
-               soup_websocket_connection_close(conn->ws_conn, 1000, "");
+       if (soup_websocket_connection_get_state(ss->ws_conn) == SOUP_WEBSOCKET_STATE_OPEN)
+               soup_websocket_connection_close(ss->ws_conn, 1000, "");
        else
-               g_object_unref(conn->ws_conn);
+               g_object_unref(ss->ws_conn);
 
-       conn->ws_conn = NULL;
-       conn->server_status = SERVER_STATUS_DISCONNECTED;
+       ss->ws_conn = NULL;
+       ss->server_status = SERVER_STATUS_DISCONNECTED;
 }
 
 static void __websocket_closed_cb(SoupWebsocketConnection *ws_conn, gpointer user_data)
 {
-       connection_s *conn = (connection_s *)user_data;
+       signaling_server_s *ss = (signaling_server_s *)user_data;
 
-       RET_IF(!conn, "conn is NULL");
+       RET_IF(!ss, "ss is NULL");
        RET_IF(!ws_conn, "ws_conn is NULL");
-       RET_IF(conn->ws_conn != ws_conn, "not matched ws_conn[%p, %p]", conn->ws_conn, ws_conn);
+       RET_IF(ss->ws_conn != ws_conn, "not matched ws_conn[%p, %p]", ss->ws_conn, ws_conn);
 
-       __close_websocket(conn);
+       __close_websocket(ss);
 }
 
 static void __auto_configure_add_peer(gchar *peer_id, bool is_offer)
@@ -3505,18 +3506,17 @@ static void __auto_configure_handle_room_message(gchar *peer_id, gchar *message)
        __handle_json_structured_message(conn, message);
 }
 
-static void __handle_room_related_message(connection_s *conn, const gchar *text)
+static void __handle_room_related_message(const gchar *text)
 {
        gchar **tokens = NULL;
        guint len;
        guint i;
 
-       RET_IF(!conn, "conn is NULL");
        RET_IF(!text, "text is NULL");
 
        if (g_str_has_prefix(text, "ROOM_OK")) {
                g_print("\n[from SERVER > %s]\n", text);
-               conn->server_status = SERVER_STATUS_ROOM_ESTABLISHED;
+               g_signaling_server.server_status = SERVER_STATUS_ROOM_ESTABLISHED;
 
                /* parse text, get the previous peers in the room and negotiate to each other */
                if (strlen(text) > strlen("ROOM_OK")) {
@@ -3552,7 +3552,7 @@ static void __handle_room_related_message(connection_s *conn, const gchar *text)
 
        } else {
                g_print("\n[from SERVER > %s]\n", text);
-               conn->server_status = SERVER_STATUS_ERROR_FOUND;
+               g_signaling_server.server_status = SERVER_STATUS_ERROR_FOUND;
        }
 
        if (tokens)
@@ -3568,7 +3568,7 @@ static void __websocket_message_cb(SoupWebsocketConnection *ws_conn, SoupWebsock
 
        RET_IF(!conn, "conn is NULL");
        RET_IF(!ws_conn, "ws_conn is NULL");
-       RET_IF(conn->ws_conn != ws_conn, "not matched ws_conn[%p, %p]", conn->ws_conn, ws_conn);
+       RET_IF(g_signaling_server.ws_conn != ws_conn, "not matched ws_conn[%p, %p]", g_signaling_server.ws_conn, ws_conn);
        RET_IF(type != SOUP_WEBSOCKET_DATA_TEXT, "invalid data type(%d)", type);
 
        data = g_bytes_get_data(message, &size);
@@ -3576,18 +3576,18 @@ static void __websocket_message_cb(SoupWebsocketConnection *ws_conn, SoupWebsock
 
        /* NOTE: Logics below can be different in each server */
        if (g_strcmp0(text, "HELLO") == 0) {
-               g_print("\n[from SERVER > %s] registered done, local_peer_id[%d]\n", text, conn->local_peer_id);
+               g_print("\n[from SERVER > %s] registered done, local_peer_id[%d]\n", text, g_signaling_server.local_peer_id);
 
        } else if (g_strcmp0(text, "SESSION_OK") == 0) {
                g_print("\n[from SERVER > %s]\n", text);
-               conn->server_status = SERVER_STATUS_SESSION_ESTABLISHED;
+               g_signaling_server.server_status = SERVER_STATUS_SESSION_ESTABLISHED;
 
        } else if (g_str_has_prefix(text, "ROOM_")) {
-               __handle_room_related_message(conn, text);
+               __handle_room_related_message(text);
 
        } else if (g_str_has_prefix(text, "ERROR")) {
                g_print("\n[from SERVER > %s]\n", text);
-               conn->server_status = SERVER_STATUS_ERROR_FOUND;
+               g_signaling_server.server_status = SERVER_STATUS_ERROR_FOUND;
 
        } else {
                __handle_json_structured_message(conn, text);
@@ -3641,25 +3641,25 @@ static void __websocket_connected_cb(SoupSession *session, GAsyncResult *res, vo
                g_error_free(error);
                return;
        }
-       g_print("\n[%s] is connected, conn[%p]\n", g_signaling_server, conn);
+       g_print("\n[%s] is connected, conn[%p]\n", g_signaling_server.url, conn);
 
-       conn->ws_conn = ws_conn;
-       conn->server_status = SERVER_STATUS_CONNECTED;
+       g_signaling_server.ws_conn = ws_conn;
+       g_signaling_server.server_status = SERVER_STATUS_CONNECTED;
 
-       g_signal_connect(ws_conn, "closed", G_CALLBACK(__websocket_closed_cb), conn);
+       g_signal_connect(ws_conn, "closed", G_CALLBACK(__websocket_closed_cb), &g_signaling_server);
        g_signal_connect(ws_conn, "message", G_CALLBACK(__websocket_message_cb), conn);
 
-       conn->local_peer_id = __send_greeting_to_register(ws_conn);
+       g_signaling_server.local_peer_id = __send_greeting_to_register(ws_conn);
 }
 
-static void _connect_signaling_server(int index)
+static void _connect_signaling_server(void)
 {
        SoupMessage *message;
        SoupSession *session;
        SoupURI *proxy_uri;
        const char *https_aliases[] = {"wss", NULL};
 
-       RET_IF(g_conns[index].signaling_client, "already set by 'scc'");
+       RET_IF(g_signaling_server.signaling_client, "already set by 'scc'");
 
        if (strlen(g_proxy) == 0) {
                session = soup_session_new_with_options(SOUP_SESSION_SSL_STRICT, TRUE,
@@ -3675,12 +3675,12 @@ static void _connect_signaling_server(int index)
                        soup_uri_free(proxy_uri);
        }
 
-       message = soup_message_new(SOUP_METHOD_GET, g_signaling_server);
+       message = soup_message_new(SOUP_METHOD_GET, g_signaling_server.url);
 
-       g_print("connecting to signaling server[%s]...\n", g_signaling_server);
+       g_print("connecting to signaling server[%s]...\n", g_signaling_server.url);
 
        soup_session_websocket_connect_async(session, message, NULL, NULL, NULL,
-               (GAsyncReadyCallback) __websocket_connected_cb, &g_conns[index]);
+               (GAsyncReadyCallback) __websocket_connected_cb, &g_conns[0]);
 }
 
 static void _webrtc_signaling_server_create(int port)
@@ -3734,7 +3734,7 @@ void quit_program()
        }
 
        g_print("quit program\n");
-       g_conns[g_conn_index].menu_state = CURRENT_STATUS_TERMINATE;
+       g_menu_state = CURRENT_STATUS_TERMINATE;
 
        elm_exit();
 }
@@ -3744,37 +3744,37 @@ void _interpret_main_menu(char *cmd)
        int len = strlen(cmd);
        if (len == 1) {
                if (strncmp(cmd, "c", 1) == 0) {
-                       _webrtc_create(g_conn_index);
+                       _webrtc_create(0);
 
                } else if (strncmp(cmd, "a", 1) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_ADD_MEDIA_SOURCE;
+                       g_menu_state = CURRENT_STATUS_ADD_MEDIA_SOURCE;
 
                } else if (strncmp(cmd, "r", 1) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_REMOVE_MEDIA_SOURCE;
+                       g_menu_state = CURRENT_STATUS_REMOVE_MEDIA_SOURCE;
 
                } else if (strncmp(cmd, "p", 1) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_PAUSE;
+                       g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_PAUSE;
 
                } else if (strncmp(cmd, "o", 1) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MEDIA_SOURCE_GET_PAUSE;
+                       g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_GET_PAUSE;
 
                } else if (strncmp(cmd, "v", 1) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_RESOLUTION;
+                       g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_RESOLUTION;
 
                } else if (strncmp(cmd, "l", 1) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MEDIA_SOURCE_GET_VIDEO_RESOLUTION;
+                       g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_GET_VIDEO_RESOLUTION;
 
                } else if (strncmp(cmd, "s", 1) == 0) {
-                       _webrtc_start(g_conn_index);
+                       _webrtc_start(0);
 
                } else if (strncmp(cmd, "t", 1) == 0) {
-                       _webrtc_stop(g_conn_index);
+                       _webrtc_stop(0);
 
                } else if (strncmp(cmd, "d", 1) == 0) {
-                       _webrtc_destroy(g_conn_index);
+                       _webrtc_destroy(0);
 
                } else if (strncmp(cmd, "g", 1) == 0) {
-                       _webrtc_get_state(g_conn_index);
+                       _webrtc_get_state(0);
 
                } else if (strncmp(cmd, "q", 1) == 0) {
                        quit_program();
@@ -3785,166 +3785,163 @@ void _interpret_main_menu(char *cmd)
 
        } else if (len == 2) {
                if (strncmp(cmd, "sf", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MEDIA_PACKET_SOURCE_SET_FORMAT;
+                       g_menu_state = CURRENT_STATUS_MEDIA_PACKET_SOURCE_SET_FORMAT;
 
                } else if (strncmp(cmd, "td", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_TRANSCEIVER_DIRECTION;
+                       g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_TRANSCEIVER_DIRECTION;
 
                } else if (strncmp(cmd, "gd", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MEDIA_SOURCE_GET_TRANSCEIVER_DIRECTION;
+                       g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_GET_TRANSCEIVER_DIRECTION;
 
                } else if (strncmp(cmd, "dt", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_SET_DISPLAY_TYPE;
+                       g_menu_state = CURRENT_STATUS_SET_DISPLAY_TYPE;
 
                } else if (strncmp(cmd, "dm", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_SET_DISPLAY_MODE;
+                       g_menu_state = CURRENT_STATUS_SET_DISPLAY_MODE;
 
                } else if (strncmp(cmd, "gm", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_GET_DISPLAY_MODE;
+                       g_menu_state = CURRENT_STATUS_GET_DISPLAY_MODE;
 
                } else if (strncmp(cmd, "dv", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_SET_DISPLAY_VISIBLE;
+                       g_menu_state = CURRENT_STATUS_SET_DISPLAY_VISIBLE;
 
                } else if (strncmp(cmd, "gv", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_GET_DISPLAY_VISIBLE;
+                       g_menu_state = CURRENT_STATUS_GET_DISPLAY_VISIBLE;
 
                } else if (strncmp(cmd, "al", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_AUDIO_LOOPBACK;
+                       g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_AUDIO_LOOPBACK;
 
                } else if (strncmp(cmd, "vl", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_LOOPBACK;
+                       g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_LOOPBACK;
 
                } else if (strncmp(cmd, "cd", 2) == 0) {
-                       _webrtc_create_data_channel(g_conn_index);
+                       _webrtc_create_data_channel(0);
 
                } else if (strncmp(cmd, "dd", 2) == 0) {
-                       _webrtc_destroy_data_channel(g_conn_index);
+                       _webrtc_destroy_data_channel(0);
 
                } else if (strncmp(cmd, "dl", 2) == 0) {
-                       _webrtc_data_channel_get_label(g_conn_index);
+                       _webrtc_data_channel_get_label(0);
 
                } else if (strncmp(cmd, "sz", 2) == 0) {
-                       _webrtc_set_data_channel_cb(g_conn_index);
+                       _webrtc_set_data_channel_cb(0);
 
                } else if (strncmp(cmd, "uz", 2) == 0) {
-                       _webrtc_unset_data_channel_cb(g_conn_index);
+                       _webrtc_unset_data_channel_cb(0);
 
                } else if (strncmp(cmd, "zs", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_DATA_CHANNEL_SEND_STRING;
+                       g_menu_state = CURRENT_STATUS_DATA_CHANNEL_SEND_STRING;
 
                } else if (strncmp(cmd, "zb", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_DATA_CHANNEL_SEND_STRING_AS_BYTES;
+                       g_menu_state = CURRENT_STATUS_DATA_CHANNEL_SEND_STRING_AS_BYTES;
 
                } else if (strncmp(cmd, "zf", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_DATA_CHANNEL_SEND_FILE;
+                       g_menu_state = CURRENT_STATUS_DATA_CHANNEL_SEND_FILE;
 
                } else if (strncmp(cmd, "mu", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MUTE_MEDIA_SOURCE;
+                       g_menu_state = CURRENT_STATUS_MUTE_MEDIA_SOURCE;
 
                } else if (strncmp(cmd, "se", 2) == 0) {
-                       _webrtc_set_error_cb(g_conn_index);
+                       _webrtc_set_error_cb(0);
 
                } else if (strncmp(cmd, "ue", 2) == 0) {
-                       _webrtc_unset_error_cb(g_conn_index);
+                       _webrtc_unset_error_cb(0);
 
                } else if (strncmp(cmd, "sc", 2) == 0) {
-                       _webrtc_set_state_changed_cb(g_conn_index);
+                       _webrtc_set_state_changed_cb(0);
 
                } else if (strncmp(cmd, "us", 2) == 0) {
-                       _webrtc_unset_state_changed_cb(g_conn_index);
+                       _webrtc_unset_state_changed_cb(0);
 
                } else if (strncmp(cmd, "sn", 2) == 0) {
-                       _webrtc_set_negotiation_needed_cb(g_conn_index);
+                       _webrtc_set_negotiation_needed_cb(0);
 
                } else if (strncmp(cmd, "un", 2) == 0) {
-                       _webrtc_unset_negotiation_needed_cb(g_conn_index);
+                       _webrtc_unset_negotiation_needed_cb(0);
 
                } else if (strncmp(cmd, "si", 2) == 0) {
-                       _webrtc_set_ice_candidate_cb(g_conn_index);
+                       _webrtc_set_ice_candidate_cb(0);
 
                } else if (strncmp(cmd, "ui", 2) == 0) {
-                       _webrtc_unset_ice_candidate_cb(g_conn_index);
+                       _webrtc_unset_ice_candidate_cb(0);
 
                } else if (strncmp(cmd, "sk", 2) == 0) {
-                       _webrtc_set_track_added_cb(g_conn_index);
+                       _webrtc_set_track_added_cb(0);
 
                } else if (strncmp(cmd, "uk", 2) == 0) {
-                       _webrtc_unset_track_added_cb(g_conn_index);
+                       _webrtc_unset_track_added_cb(0);
 
                } else if (strncmp(cmd, "sa", 2) == 0) {
-                       _webrtc_set_encoded_audio_frame_cb(g_conn_index);
+                       _webrtc_set_encoded_audio_frame_cb(0);
 
                } else if (strncmp(cmd, "ua", 2) == 0) {
-                       _webrtc_unset_encoded_audio_frame_cb(g_conn_index);
+                       _webrtc_unset_encoded_audio_frame_cb(0);
 
                } else if (strncmp(cmd, "sv", 2) == 0) {
-                       _webrtc_set_encoded_video_frame_cb(g_conn_index);
+                       _webrtc_set_encoded_video_frame_cb(0);
 
                } else if (strncmp(cmd, "uv", 2) == 0) {
-                       _webrtc_unset_encoded_video_frame_cb(g_conn_index);
+                       _webrtc_unset_encoded_video_frame_cb(0);
 
                } else if (strncmp(cmd, "sm", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MEDIA_PACKET_SOURCE_SET_BUFFER_STATE_CHANGED_CB;
+                       g_menu_state = CURRENT_STATUS_MEDIA_PACKET_SOURCE_SET_BUFFER_STATE_CHANGED_CB;
 
                } else if (strncmp(cmd, "um", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MEDIA_PACKET_SOURCE_UNSET_BUFFER_STATE_CHANGED_CB;
+                       g_menu_state = CURRENT_STATUS_MEDIA_PACKET_SOURCE_UNSET_BUFFER_STATE_CHANGED_CB;
 
                } else if (strncmp(cmd, "co", 2) == 0) {
-                       _webrtc_create_offer(&g_conns[g_conn_index], false);
+                       _webrtc_create_offer(&g_conns[0], false);
 
                } else if (strncmp(cmd, "ca", 2) == 0) {
-                       _webrtc_create_answer(&g_conns[g_conn_index], false);
+                       _webrtc_create_answer(&g_conns[0], false);
 
                } else if (strncmp(cmd, "sl", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_SET_LOCAL_DESCRIPTION;
+                       g_menu_state = CURRENT_STATUS_SET_LOCAL_DESCRIPTION;
 
                } else if (strncmp(cmd, "sr", 2) == 0) {
-                       _webrtc_set_remote_description(&g_conns[g_conn_index]);
+                       _webrtc_set_remote_description(&g_conns[0]);
 
                } else if (strncmp(cmd, "st", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_SET_STUN_SERVER;
+                       g_menu_state = CURRENT_STATUS_SET_STUN_SERVER;
 
                } else if (strncmp(cmd, "gt", 2) == 0) {
-                       _webrtc_get_stun_server(g_conn_index);
+                       _webrtc_get_stun_server(0);
 
                } else if (strncmp(cmd, "su", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_ADD_TURN_SERVER;
+                       g_menu_state = CURRENT_STATUS_ADD_TURN_SERVER;
 
                } else if (strncmp(cmd, "gu", 2) == 0) {
-                       _webrtc_get_turn_servers(g_conn_index);
+                       _webrtc_get_turn_servers(0);
 
                } else if (strncmp(cmd, "ss", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_SETTING_SIGNALING_SERVER;
+                       g_menu_state = CURRENT_STATUS_SETTING_SIGNALING_SERVER;
 
                } else if (strncmp(cmd, "px", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_SETTING_PROXY;
-
-               }  else if (strncmp(cmd, "cc", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_CHANGE_CONNECTION;
+                       g_menu_state = CURRENT_STATUS_SETTING_PROXY;
 
                } else if (strncmp(cmd, "cs", 2) == 0) {
-                       _connect_signaling_server(g_conn_index);
+                       _connect_signaling_server();
 
                } else if (strncmp(cmd, "rs", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_REQUEST_SESSION;
+                       g_menu_state = CURRENT_STATUS_REQUEST_SESSION;
 
                } else if (strncmp(cmd, "rj", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_REQUEST_JOIN_ROOM;
+                       g_menu_state = CURRENT_STATUS_REQUEST_JOIN_ROOM;
 
                } else if (strncmp(cmd, "sd", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_SEND_LOCAL_DESCRIPTION;
+                       g_menu_state = CURRENT_STATUS_SEND_LOCAL_DESCRIPTION;
 
                } else if (strncmp(cmd, "sp", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_START_PUSHING_PACKET_TO_MEDIA_PACKET_SOURCE;
+                       g_menu_state = CURRENT_STATUS_START_PUSHING_PACKET_TO_MEDIA_PACKET_SOURCE;
 
                } else if (strncmp(cmd, "tp", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_STOP_PUSHING_PACKET_TO_MEDIA_PACKET_SOURCE;
+                       g_menu_state = CURRENT_STATUS_STOP_PUSHING_PACKET_TO_MEDIA_PACKET_SOURCE;
 
                } else if (strncmp(cmd, "pa", 2) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_SET_MEDIA_PATH_TO_MEDIA_FILE_SOURCE;
+                       g_menu_state = CURRENT_STATUS_SET_MEDIA_PATH_TO_MEDIA_FILE_SOURCE;
 
                } else if (strncmp(cmd, "ac", 2) == 0) {
-                       _webrtc_add_ice_candidate(&g_conns[g_conn_index], NULL);
+                       _webrtc_add_ice_candidate(&g_conns[0], NULL);
 
                } else {
                        g_print("unknown menu \n");
@@ -3954,42 +3951,42 @@ void _interpret_main_menu(char *cmd)
                if (strncmp(cmd, "sac", 3) == 0) {
                        int i;
 
-                       _webrtc_set_error_cb(g_conn_index);
-                       _webrtc_set_state_changed_cb(g_conn_index);
-                       _webrtc_set_negotiation_needed_cb(g_conn_index);
-                       _webrtc_set_ice_candidate_cb(g_conn_index);
-                       _webrtc_set_track_added_cb(g_conn_index);
-                       _webrtc_set_data_channel_cb(g_conn_index);
-                       _webrtc_set_all_negotiation_state_change_cbs(g_conn_index);
+                       _webrtc_set_error_cb(0);
+                       _webrtc_set_state_changed_cb(0);
+                       _webrtc_set_negotiation_needed_cb(0);
+                       _webrtc_set_ice_candidate_cb(0);
+                       _webrtc_set_track_added_cb(0);
+                       _webrtc_set_data_channel_cb(0);
+                       _webrtc_set_all_negotiation_state_change_cbs(0);
 
                        for (i = 0; i < MAX_MEDIA_PACKET_SOURCE_LEN; i++) {
-                               if (g_conns[g_conn_index].packet_sources[i].source_id > 0)
-                                       _webrtc_media_packet_source_set_buffer_state_changed_cb(g_conn_index, g_conns[g_conn_index].packet_sources[i].source_id);
+                               if (g_conns[0].packet_sources[i].source_id > 0)
+                                       _webrtc_media_packet_source_set_buffer_state_changed_cb(0, g_conns[0].packet_sources[i].source_id);
                        }
 
                } else if (strncmp(cmd, "san", 3) == 0) {
-                       _webrtc_set_all_negotiation_state_change_cbs(g_conn_index);
+                       _webrtc_set_all_negotiation_state_change_cbs(0);
 
                } else if (strncmp(cmd, "uan", 3) == 0) {
-                       _webrtc_unset_all_negotiation_state_change_cbs(g_conn_index);
+                       _webrtc_unset_all_negotiation_state_change_cbs(0);
 
                } else if (strncmp(cmd, "gan", 3) == 0) {
-                       _webrtc_get_all_negotiation_states(g_conn_index);
+                       _webrtc_get_all_negotiation_states(0);
 
                } else if (strncmp(cmd, "coa", 3) == 0) {
-                       _webrtc_create_offer(&g_conns[g_conn_index], true);
+                       _webrtc_create_offer(&g_conns[0], true);
 
                } else if (strncmp(cmd, "caa", 3) == 0) {
-                       _webrtc_create_answer(&g_conns[g_conn_index], true);
+                       _webrtc_create_answer(&g_conns[0], true);
 
                } else if (strncmp(cmd, "stp", 3) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_SET_ICE_TRANSPORT_POLICY;
+                       g_menu_state = CURRENT_STATUS_SET_ICE_TRANSPORT_POLICY;
 
                } else if (strncmp(cmd, "gtp", 3) == 0) {
-                       _webrtc_get_ice_transport_policy(g_conn_index);
+                       _webrtc_get_ice_transport_policy(0);
 
                } else if (strncmp(cmd, "ssc", 3) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_CREATE_PRIVATE_SIGNALING_SERVER;
+                       g_menu_state = CURRENT_STATUS_CREATE_PRIVATE_SIGNALING_SERVER;
 
                } else if (strncmp(cmd, "ssd", 3) == 0) {
                        _webrtc_signaling_server_destroy();
@@ -4001,22 +3998,22 @@ void _interpret_main_menu(char *cmd)
                        _webrtc_signaling_server_stop();
 
                } else if (strncmp(cmd, "scc", 3) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_CONNECT_TO_PRIVATE_SIGNALING_SERVER;
+                       g_menu_state = CURRENT_STATUS_CONNECT_TO_PRIVATE_SIGNALING_SERVER;
 
                } else if (strncmp(cmd, "scd", 3) == 0) {
-                       _webrtc_signaling_disconnect(g_conn_index);
+                       _webrtc_signaling_disconnect();
 
                } else if (strncmp(cmd, "scs", 3) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_SET_CROP_SCREEN_SOURCE;
+                       g_menu_state = CURRENT_STATUS_SET_CROP_SCREEN_SOURCE;
 
                } else if (strncmp(cmd, "ucs", 3) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_UNSET_CROP_SCREEN_SOURCE;
+                       g_menu_state = CURRENT_STATUS_UNSET_CROP_SCREEN_SOURCE;
 
                } else if (strncmp(cmd, "sfl", 3) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_FILE_LOOPING;
+                       g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_FILE_LOOPING;
 
                } else if (strncmp(cmd, "gfl", 3) == 0) {
-                       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MEDIA_SOURCE_GET_FILE_LOOPING;
+                       g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_GET_FILE_LOOPING;
 
                } else {
                        g_print("unknown menu \n");
@@ -4058,7 +4055,7 @@ void display_handle_status(int index)
 void display_setting_status()
 {
        int len_proxy = strlen(g_proxy);
-       int len_server = strlen(g_signaling_server);
+       int len_server = strlen(g_signaling_server.url);
        int i;
 
        if (len_proxy == 0 && len_server == 0)
@@ -4066,15 +4063,14 @@ void display_setting_status()
 
        if (len_proxy > 0)
                g_print("  proxy[%s]", g_proxy);
-       if (len_server > 0) {
-               g_print("  server[%s]\n", g_signaling_server);
-               for (i = 0; i < MAX_CONNECTION_LEN; i++) {
-                       if (i == g_conn_index)
-                               g_print("  [*]");
-                       else
-                               g_print("  [ ]");
-                       g_print("[%d][%s][%d]\n", i, g_server_status_str[g_conns[i].server_status], g_conns[i].local_peer_id);
-               }
+       if (len_server > 0)
+               g_print("  server[%s][%s]\n", g_signaling_server.url, g_server_status_str[g_signaling_server.server_status]);
+       if (g_signaling_server.local_peer_id > 0)
+               g_print("  local peer id : %d\n", g_signaling_server.local_peer_id);
+       for (i = 0; i < MAX_CONNECTION_LEN; i++) {
+               if (g_conns[i].remote_peer_id == 0)
+                       continue;
+               g_print("  [%d] remote peer id : %d\n", i, g_conns[i].remote_peer_id);
        }
        g_print("-----------------------------------------------------------------------------------------\n");
 }
@@ -4085,7 +4081,7 @@ void display_sub_basic()
        g_print("=========================================================================================\n");
        g_print("                   Native WebRTC Test (press q to quit, * for internal API)\n");
        g_print("-----------------------------------------------------------------------------------------\n");
-       display_handle_status(g_conn_index);
+       display_handle_status(0);
        g_print("c. Create\t");
        g_print("d. Destroy\n");
        g_print("s. Start\t");
@@ -4161,7 +4157,6 @@ void display_sub_basic()
        display_setting_status();
        g_print("px. Set proxy URL\n");
        g_print("ss. Set signaling server URL\n");
-       g_print("cc. Change connection\n");
        g_print("cs. Connect to the signaling server\n");
        g_print("rs. Request session of remote peer id\n");
        g_print("rj. Request join room\n");
@@ -4181,190 +4176,187 @@ void display_sub_basic()
 
 static void displaymenu()
 {
-       if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MAINMENU) {
+       if (g_menu_state == CURRENT_STATUS_MAINMENU) {
                display_sub_basic();
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_ADD_MEDIA_SOURCE) {
+       } else if (g_menu_state == CURRENT_STATUS_ADD_MEDIA_SOURCE) {
                g_print("*** input media source type.(1:audiotest, 2:videotest, 3:mic, 4:camera, 5:screen, 6:file, 7:media packet, 8:custom audio, 9:custom video)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_REMOVE_MEDIA_SOURCE) {
+       } else if (g_menu_state == CURRENT_STATUS_REMOVE_MEDIA_SOURCE) {
                g_print("*** input media source id to remove.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MEDIA_SOURCE_SET_PAUSE) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_MEDIA_SOURCE_SET_PAUSE) {
+               if (g_cnt == 0)
                        g_print("*** input source id.\n");
-               else if (g_conns[g_conn_index].cnt == 1)
+               else if (g_cnt == 1)
                        g_print("*** input media type.(1:audio 2:video)\n");
-               else if (g_conns[g_conn_index].cnt == 2)
+               else if (g_cnt == 2)
                        g_print("*** input pause or play.(1:pause, 0:play)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MEDIA_SOURCE_GET_PAUSE) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_MEDIA_SOURCE_GET_PAUSE) {
+               if (g_cnt == 0)
                        g_print("*** input source id.\n");
-               else if (g_conns[g_conn_index].cnt == 1)
+               else if (g_cnt == 1)
                        g_print("*** input media type.(1:audio 2:video)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_RESOLUTION) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_RESOLUTION) {
+               if (g_cnt == 0)
                        g_print("*** input source id.\n");
-               else if (g_conns[g_conn_index].cnt == 1)
+               else if (g_cnt == 1)
                        g_print("*** input width.\n");
-               else if (g_conns[g_conn_index].cnt == 2)
+               else if (g_cnt == 2)
                        g_print("*** input height.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MEDIA_SOURCE_GET_VIDEO_RESOLUTION) {
+       } else if (g_menu_state == CURRENT_STATUS_MEDIA_SOURCE_GET_VIDEO_RESOLUTION) {
                g_print("*** input source id.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MEDIA_PACKET_SOURCE_SET_BUFFER_STATE_CHANGED_CB) {
+       } else if (g_menu_state == CURRENT_STATUS_MEDIA_PACKET_SOURCE_SET_BUFFER_STATE_CHANGED_CB) {
                g_print("*** input media packet source id to set buffer state changed callback.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MEDIA_PACKET_SOURCE_UNSET_BUFFER_STATE_CHANGED_CB) {
+       } else if (g_menu_state == CURRENT_STATUS_MEDIA_PACKET_SOURCE_UNSET_BUFFER_STATE_CHANGED_CB) {
                g_print("*** input media packet source id to unset buffer state changed callback.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MEDIA_PACKET_SOURCE_SET_FORMAT) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_MEDIA_PACKET_SOURCE_SET_FORMAT) {
+               if (g_cnt == 0)
                        g_print("*** input source id.\n");
-               else if (g_conns[g_conn_index].cnt == 1)
+               else if (g_cnt == 1)
                        g_print("*** input media format.(1:I420 2:NV12 3:PCM_S16LE 4:H264)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MEDIA_SOURCE_SET_TRANSCEIVER_DIRECTION) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_MEDIA_SOURCE_SET_TRANSCEIVER_DIRECTION) {
+               if (g_cnt == 0)
                        g_print("*** input source id.\n");
-               else if (g_conns[g_conn_index].cnt == 1)
+               else if (g_cnt == 1)
                        g_print("*** input media type.(1:audio 2:video)\n");
-               else if (g_conns[g_conn_index].cnt == 2)
+               else if (g_cnt == 2)
                        g_print("*** input transceiver direction.(1:sendonly 2:recvonly 3:sendrecv)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MEDIA_SOURCE_GET_TRANSCEIVER_DIRECTION) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_MEDIA_SOURCE_GET_TRANSCEIVER_DIRECTION) {
+               if (g_cnt == 0)
                        g_print("*** input source id.\n");
-               else if (g_conns[g_conn_index].cnt == 1)
+               else if (g_cnt == 1)
                        g_print("*** input media type.(1:audio 2:video)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_SET_DISPLAY_TYPE) {
+       } else if (g_menu_state == CURRENT_STATUS_SET_DISPLAY_TYPE) {
                g_print("*** input display type.(1:overlay 2:evas)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_SET_DISPLAY_MODE) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_SET_DISPLAY_MODE) {
+               if (g_cnt == 0)
                        g_print("*** input track id.\n");
-               else if (g_conns[g_conn_index].cnt == 1)
+               else if (g_cnt == 1)
                        g_print("*** input display mode.(1:letter-box 2:origin size 3:full)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_GET_DISPLAY_MODE) {
+       } else if (g_menu_state == CURRENT_STATUS_GET_DISPLAY_MODE) {
                g_print("*** input track id.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_SET_DISPLAY_VISIBLE) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_SET_DISPLAY_VISIBLE) {
+               if (g_cnt == 0)
                        g_print("*** input track id.\n");
-               else if (g_conns[g_conn_index].cnt == 1)
+               else if (g_cnt == 1)
                        g_print("*** input display visible.(1:true 0:false)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_GET_DISPLAY_VISIBLE) {
+       } else if (g_menu_state == CURRENT_STATUS_GET_DISPLAY_VISIBLE) {
                g_print("*** input track id.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MEDIA_SOURCE_SET_AUDIO_LOOPBACK) {
+       } else if (g_menu_state == CURRENT_STATUS_MEDIA_SOURCE_SET_AUDIO_LOOPBACK) {
                g_print("*** input source id.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_LOOPBACK) {
+       } else if (g_menu_state == CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_LOOPBACK) {
                g_print("*** input source id.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MEDIA_SOURCE_SET_FILE_LOOPING) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_MEDIA_SOURCE_SET_FILE_LOOPING) {
+               if (g_cnt == 0)
                        g_print("*** input source id.\n");
-               else if (g_conns[g_conn_index].cnt == 1)
+               else if (g_cnt == 1)
                        g_print("*** input looping state.(1:true 0:false)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MEDIA_SOURCE_GET_FILE_LOOPING) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_MEDIA_SOURCE_GET_FILE_LOOPING) {
+               if (g_cnt == 0)
                        g_print("*** input source id.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_DATA_CHANNEL_SEND_STRING) {
+       } else if (g_menu_state == CURRENT_STATUS_DATA_CHANNEL_SEND_STRING) {
                g_print("*** input string to send.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_DATA_CHANNEL_SEND_STRING_AS_BYTES) {
+       } else if (g_menu_state == CURRENT_STATUS_DATA_CHANNEL_SEND_STRING_AS_BYTES) {
                g_print("*** input string to send.(it will be converted to bytes data)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_DATA_CHANNEL_SEND_FILE) {
+       } else if (g_menu_state == CURRENT_STATUS_DATA_CHANNEL_SEND_FILE) {
                g_print("*** input file path to send.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_MUTE_MEDIA_SOURCE) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_MUTE_MEDIA_SOURCE) {
+               if (g_cnt == 0)
                        g_print("*** input source id.\n");
-               else if (g_conns[g_conn_index].cnt == 1)
+               else if (g_cnt == 1)
                        g_print("*** input media type.(1:audio 2:video)\n");
-               else if (g_conns[g_conn_index].cnt == 2)
+               else if (g_cnt == 2)
                        g_print("*** input mute mode.(0:unmuted 1:muted)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_SET_CROP_SCREEN_SOURCE) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_SET_CROP_SCREEN_SOURCE) {
+               if (g_cnt == 0)
                        g_print("*** input source id.\n");
-               else if (g_conns[g_conn_index].cnt == 1)
+               else if (g_cnt == 1)
                        g_print("*** input x.\n");
-               else if (g_conns[g_conn_index].cnt == 2)
+               else if (g_cnt == 2)
                        g_print("*** input y.\n");
-               else if (g_conns[g_conn_index].cnt == 3)
+               else if (g_cnt == 3)
                        g_print("*** input width.\n");
-               else if (g_conns[g_conn_index].cnt == 4)
+               else if (g_cnt == 4)
                        g_print("*** input height.\n");
-               else if (g_conns[g_conn_index].cnt == 5)
+               else if (g_cnt == 5)
                        g_print("*** input whether screen rotates (0: horizontal, 1: vertical).\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_UNSET_CROP_SCREEN_SOURCE) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_UNSET_CROP_SCREEN_SOURCE) {
+               if (g_cnt == 0)
                        g_print("*** input source id.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_SET_STUN_SERVER) {
+       } else if (g_menu_state == CURRENT_STATUS_SET_STUN_SERVER) {
                g_print("*** input STUN server address.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_ADD_TURN_SERVER) {
+       } else if (g_menu_state == CURRENT_STATUS_ADD_TURN_SERVER) {
                g_print("*** input TURN server address.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_SET_ICE_TRANSPORT_POLICY) {
+       } else if (g_menu_state == CURRENT_STATUS_SET_ICE_TRANSPORT_POLICY) {
                g_print("*** input ICE transport policy.(0:all, 1:relay)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_SET_LOCAL_DESCRIPTION) {
+       } else if (g_menu_state == CURRENT_STATUS_SET_LOCAL_DESCRIPTION) {
                g_print("*** input type of local description.(1:offer, 2:answer)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_SETTING_SIGNALING_SERVER) {
+       } else if (g_menu_state == CURRENT_STATUS_SETTING_SIGNALING_SERVER) {
                g_print("*** input signaling server URL.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_SETTING_PROXY) {
+       } else if (g_menu_state == CURRENT_STATUS_SETTING_PROXY) {
                g_print("*** input proxy URL.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_CHANGE_CONNECTION) {
-               g_print("*** input to connection index.(0 ~ 2)\n");
-
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_REQUEST_SESSION) {
+       } else if (g_menu_state == CURRENT_STATUS_REQUEST_SESSION) {
                g_print("*** input remote peer id.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_REQUEST_JOIN_ROOM) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_REQUEST_JOIN_ROOM) {
+               if (g_cnt == 0)
                        g_print("*** input source type.(1:videotest/audiotest 2:camera/mic)\n");
-               else if (g_conns[g_conn_index].cnt == 1)
+               else if (g_cnt == 1)
                        g_print("*** input room name to join.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_SEND_LOCAL_DESCRIPTION) {
+       } else if (g_menu_state == CURRENT_STATUS_SEND_LOCAL_DESCRIPTION) {
                g_print("*** input type of local description to send to the server.(1:offer, 2:answer)\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_START_PUSHING_PACKET_TO_MEDIA_PACKET_SOURCE) {
+       } else if (g_menu_state == CURRENT_STATUS_START_PUSHING_PACKET_TO_MEDIA_PACKET_SOURCE) {
                g_print("*** input media packet source id to start pushing packet.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_STOP_PUSHING_PACKET_TO_MEDIA_PACKET_SOURCE) {
+       } else if (g_menu_state == CURRENT_STATUS_STOP_PUSHING_PACKET_TO_MEDIA_PACKET_SOURCE) {
                g_print("*** input media packet source id to stop pushing packet.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_SET_MEDIA_PATH_TO_MEDIA_FILE_SOURCE) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_SET_MEDIA_PATH_TO_MEDIA_FILE_SOURCE) {
+               if (g_cnt == 0)
                        g_print("*** input source id.\n");
-               else if (g_conns[g_conn_index].cnt == 1)
+               else if (g_cnt == 1)
                        g_print("*** input media path.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_CREATE_PRIVATE_SIGNALING_SERVER) {
+       } else if (g_menu_state == CURRENT_STATUS_CREATE_PRIVATE_SIGNALING_SERVER) {
                g_print("*** input port.\n");
 
-       } else if (g_conns[g_conn_index].menu_state == CURRENT_STATUS_CONNECT_TO_PRIVATE_SIGNALING_SERVER) {
-               if (g_conns[g_conn_index].cnt == 0)
+       } else if (g_menu_state == CURRENT_STATUS_CONNECT_TO_PRIVATE_SIGNALING_SERVER) {
+               if (g_cnt == 0)
                        g_print("*** input server ip.\n");
-               else if (g_conns[g_conn_index].cnt == 1)
+               else if (g_cnt == 1)
                        g_print("*** input port.\n");
 
        } else {
@@ -4389,26 +4381,26 @@ gboolean timeout_quit_program(void *data)
 
 void reset_menu_state(void)
 {
-       g_conns[g_conn_index].menu_state = CURRENT_STATUS_MAINMENU;
+       g_menu_state = CURRENT_STATUS_MAINMENU;
 }
 
 static void interpret(char *cmd)
 {
        int value;
 
-       switch (g_conns[g_conn_index].menu_state) {
+       switch (g_menu_state) {
        case CURRENT_STATUS_MAINMENU:
                _interpret_main_menu(cmd);
                break;
        case CURRENT_STATUS_ADD_MEDIA_SOURCE: {
                value = atoi(cmd);
-               _webrtc_add_media_source(g_conn_index, value, NULL);
+               _webrtc_add_media_source(0, value, NULL);
                reset_menu_state();
                break;
        }
        case CURRENT_STATUS_REMOVE_MEDIA_SOURCE: {
                value = atoi(cmd);
-               _webrtc_remove_media_source(g_conn_index, value);
+               _webrtc_remove_media_source(0, value);
                reset_menu_state();
                break;
        }
@@ -4418,20 +4410,20 @@ static void interpret(char *cmd)
                int is_pause;
                value = atoi(cmd);
 
-               switch (g_conns[g_conn_index].cnt) {
+               switch (g_cnt) {
                case 0:
                        id = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 1:
                        media_type = value - 1;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 2:
                        is_pause = value;
-                       _webrtc_media_source_set_pause(g_conn_index, id, media_type, is_pause);
+                       _webrtc_media_source_set_pause(0, id, media_type, is_pause);
                        id = media_type = 0;
-                       g_conns[g_conn_index].cnt = 0;
+                       g_cnt = 0;
                        reset_menu_state();
                        break;
                }
@@ -4441,15 +4433,15 @@ static void interpret(char *cmd)
                static unsigned int id;
                value = atoi(cmd);
 
-               switch (g_conns[g_conn_index].cnt) {
+               switch (g_cnt) {
                case 0:
                        id = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 1:
-                       _webrtc_media_source_get_pause(g_conn_index, id, value - 1);
+                       _webrtc_media_source_get_pause(0, id, value - 1);
                        id = 0;
-                       g_conns[g_conn_index].cnt = 0;
+                       g_cnt = 0;
                        reset_menu_state();
                        break;
                }
@@ -4461,20 +4453,20 @@ static void interpret(char *cmd)
                static int height;
                value = atoi(cmd);
 
-               switch (g_conns[g_conn_index].cnt) {
+               switch (g_cnt) {
                case 0:
                        id = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 1:
                        width = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 2:
                        height =  value;
-                       _webrtc_media_source_set_video_resolution(g_conn_index, id, width, height);
+                       _webrtc_media_source_set_video_resolution(0, id, width, height);
                        id = width = height = 0;
-                       g_conns[g_conn_index].cnt = 0;
+                       g_cnt = 0;
                        reset_menu_state();
                        break;
                }
@@ -4482,19 +4474,19 @@ static void interpret(char *cmd)
        }
        case CURRENT_STATUS_MEDIA_SOURCE_GET_VIDEO_RESOLUTION: {
                value = atoi(cmd);
-               _webrtc_media_source_get_video_resolution(g_conn_index, value);
+               _webrtc_media_source_get_video_resolution(0, value);
                reset_menu_state();
                break;
        }
        case CURRENT_STATUS_MEDIA_PACKET_SOURCE_SET_BUFFER_STATE_CHANGED_CB: {
                value = atoi(cmd);
-               _webrtc_media_packet_source_set_buffer_state_changed_cb(g_conn_index, value);
+               _webrtc_media_packet_source_set_buffer_state_changed_cb(0, value);
                reset_menu_state();
                break;
        }
        case CURRENT_STATUS_MEDIA_PACKET_SOURCE_UNSET_BUFFER_STATE_CHANGED_CB: {
                value = atoi(cmd);
-               _webrtc_media_packet_source_unset_buffer_state_changed_cb(g_conn_index, value);
+               _webrtc_media_packet_source_unset_buffer_state_changed_cb(0, value);
                reset_menu_state();
                break;
        }
@@ -4502,15 +4494,15 @@ static void interpret(char *cmd)
                static unsigned int id;
                value = atoi(cmd);
 
-               switch (g_conns[g_conn_index].cnt) {
+               switch (g_cnt) {
                case 0:
                        id = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 1:
-                       _webrtc_media_packet_source_set_format(g_conn_index, id, value);
+                       _webrtc_media_packet_source_set_format(0, id, value);
                        id = 0;
-                       g_conns[g_conn_index].cnt = 0;
+                       g_cnt = 0;
                        reset_menu_state();
                        break;
                }
@@ -4522,20 +4514,20 @@ static void interpret(char *cmd)
                static unsigned int direction;
                value = atoi(cmd);
 
-               switch (g_conns[g_conn_index].cnt) {
+               switch (g_cnt) {
                case 0:
                        id = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 1:
                        media_type = value - 1;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 2:
                        direction =  value - 1;
-                       _webrtc_media_source_set_transceiver_direction(g_conn_index, id, media_type, direction);
+                       _webrtc_media_source_set_transceiver_direction(0, id, media_type, direction);
                        id = media_type = direction = 0;
-                       g_conns[g_conn_index].cnt = 0;
+                       g_cnt = 0;
                        reset_menu_state();
                        break;
                }
@@ -4546,16 +4538,16 @@ static void interpret(char *cmd)
                static unsigned int media_type;
                value = atoi(cmd);
 
-               switch (g_conns[g_conn_index].cnt) {
+               switch (g_cnt) {
                case 0:
                        id = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 1:
                        media_type = value - 1;
-                       _webrtc_media_source_get_transceiver_direction(g_conn_index, id, media_type);
+                       _webrtc_media_source_get_transceiver_direction(0, id, media_type);
                        id = media_type = 0;
-                       g_conns[g_conn_index].cnt = 0;
+                       g_cnt = 0;
                        reset_menu_state();
                        break;
                }
@@ -4563,7 +4555,7 @@ static void interpret(char *cmd)
        }
        case CURRENT_STATUS_SET_DISPLAY_TYPE: {
                value = atoi(cmd);
-               _webrtc_set_display_type(g_conn_index, value - 1);
+               _webrtc_set_display_type(0, value - 1);
                reset_menu_state();
                break;
        }
@@ -4571,15 +4563,15 @@ static void interpret(char *cmd)
                static unsigned int id;
                value = atoi(cmd);
 
-               switch (g_conns[g_conn_index].cnt) {
+               switch (g_cnt) {
                case 0:
                        id = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 1:
-                       _webrtc_set_display_mode(g_conn_index, id, value - 1);
+                       _webrtc_set_display_mode(0, id, value - 1);
                        id = 0;
-                       g_conns[g_conn_index].cnt = 0;
+                       g_cnt = 0;
                        reset_menu_state();
                        break;
                }
@@ -4587,7 +4579,7 @@ static void interpret(char *cmd)
        }
        case CURRENT_STATUS_GET_DISPLAY_MODE: {
                value = atoi(cmd);
-               _webrtc_get_display_mode(g_conn_index, value);
+               _webrtc_get_display_mode(0, value);
                reset_menu_state();
                break;
        }
@@ -4595,15 +4587,15 @@ static void interpret(char *cmd)
                static unsigned int id;
                value = atoi(cmd);
 
-               switch (g_conns[g_conn_index].cnt) {
+               switch (g_cnt) {
                case 0:
                        id = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 1:
-                       _webrtc_set_display_visible(g_conn_index, id, value);
+                       _webrtc_set_display_visible(0, id, value);
                        id = 0;
-                       g_conns[g_conn_index].cnt = 0;
+                       g_cnt = 0;
                        reset_menu_state();
                        break;
                }
@@ -4611,59 +4603,59 @@ static void interpret(char *cmd)
        }
        case CURRENT_STATUS_GET_DISPLAY_VISIBLE: {
                value = atoi(cmd);
-               _webrtc_get_display_visible(g_conn_index, value);
+               _webrtc_get_display_visible(0, value);
                reset_menu_state();
                break;
        }
        case CURRENT_STATUS_MEDIA_SOURCE_SET_AUDIO_LOOPBACK: {
                value = atoi(cmd);
-               _webrtc_media_source_set_audio_loopback(g_conn_index, value);
+               _webrtc_media_source_set_audio_loopback(0, value);
                reset_menu_state();
                break;
        }
        case CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_LOOPBACK: {
                value = atoi(cmd);
-               _webrtc_media_source_set_video_loopback(g_conn_index, value);
+               _webrtc_media_source_set_video_loopback(0, value);
                reset_menu_state();
                break;
        }
        case CURRENT_STATUS_DATA_CHANNEL_SEND_STRING: {
-               _webrtc_data_channel_send_string(g_conn_index, cmd);
+               _webrtc_data_channel_send_string(0, cmd);
                reset_menu_state();
                break;
        }
        case CURRENT_STATUS_DATA_CHANNEL_SEND_STRING_AS_BYTES: {
-               _webrtc_data_channel_send_string_as_bytes(g_conn_index, cmd);
+               _webrtc_data_channel_send_string_as_bytes(0, cmd);
                reset_menu_state();
                break;
        }
        case CURRENT_STATUS_DATA_CHANNEL_SEND_FILE: {
-               _webrtc_data_channel_send_file(g_conn_index, cmd);
+               _webrtc_data_channel_send_file(0, cmd);
                reset_menu_state();
                break;
        }
        case CURRENT_STATUS_SET_STUN_SERVER: {
-               _webrtc_set_stun_server(g_conn_index, cmd);
+               _webrtc_set_stun_server(0, cmd);
                reset_menu_state();
                break;
        }
        case CURRENT_STATUS_ADD_TURN_SERVER: {
-               _webrtc_add_turn_server(g_conn_index, cmd);
+               _webrtc_add_turn_server(0, cmd);
                reset_menu_state();
                break;
        }
        case CURRENT_STATUS_SET_ICE_TRANSPORT_POLICY: {
                value = atoi(cmd);
-               _webrtc_set_ice_transport_policy(g_conn_index, value);
+               _webrtc_set_ice_transport_policy(0, value);
                reset_menu_state();
                break;
        }
        case CURRENT_STATUS_SET_LOCAL_DESCRIPTION: {
                value = atoi(cmd);
                if (value == 1)
-                       _webrtc_set_local_description(&g_conns[g_conn_index], true);
+                       _webrtc_set_local_description(&g_conns[0], true);
                else if (value == 2)
-                       _webrtc_set_local_description(&g_conns[g_conn_index], false);
+                       _webrtc_set_local_description(&g_conns[0], false);
                else
                        g_print("invalid value[%d]\n", value);
 
@@ -4671,7 +4663,7 @@ static void interpret(char *cmd)
                break;
        }
        case CURRENT_STATUS_SETTING_SIGNALING_SERVER: {
-               _setting_uri(g_signaling_server, cmd);
+               _setting_uri(g_signaling_server.url, cmd);
                reset_menu_state();
                break;
        }
@@ -4680,23 +4672,14 @@ static void interpret(char *cmd)
                reset_menu_state();
                break;
        }
-       case CURRENT_STATUS_CHANGE_CONNECTION: {
-               value = atoi(cmd);
-               if (value < 0 || value >= MAX_CONNECTION_LEN)
-                       g_print("invalid value[%d]", value);
-               else
-                       g_conn_index = value;
-               reset_menu_state();
-               break;
-       }
        case CURRENT_STATUS_REQUEST_SESSION: {
                value = atoi(cmd);
-               _request_session(g_conn_index, value);
+               _request_session(value);
                reset_menu_state();
                break;
        }
        case CURRENT_STATUS_REQUEST_JOIN_ROOM: {
-               switch (g_conns[g_conn_index].cnt) {
+               switch (g_cnt) {
                case 0:
                        value = atoi(cmd);
                        if (value <= 0 || value > 2) {
@@ -4704,12 +4687,12 @@ static void interpret(char *cmd)
                                reset_menu_state();
                                break;
                        }
-                       g_conns[g_conn_index].room_source_type = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_conns[0].room_source_type = value;
+                       g_cnt++;
                        break;
                case 1:
-                       _request_join_room(g_conn_index, cmd);
-                       g_conns[g_conn_index].cnt = 0;
+                       _request_join_room(cmd);
+                       g_cnt = 0;
                        reset_menu_state();
                        break;
                }
@@ -4718,9 +4701,9 @@ static void interpret(char *cmd)
        case CURRENT_STATUS_SEND_LOCAL_DESCRIPTION: {
                value = atoi(cmd);
                if (value == 1)
-                       _send_local_description(g_conn_index, true);
+                       _send_local_description(true);
                else if (value == 2)
-                       _send_local_description(g_conn_index, false);
+                       _send_local_description(false);
                else
                        g_print("invalid value[%d]\n", value);
 
@@ -4729,13 +4712,13 @@ static void interpret(char *cmd)
        }
        case CURRENT_STATUS_START_PUSHING_PACKET_TO_MEDIA_PACKET_SOURCE: {
                value = atoi(cmd);
-               _start_pushing_packet(g_conn_index, value);
+               _start_pushing_packet(0, value);
                reset_menu_state();
                break;
        }
        case CURRENT_STATUS_STOP_PUSHING_PACKET_TO_MEDIA_PACKET_SOURCE: {
                value = atoi(cmd);
-               _stop_pushing_packet(g_conn_index, value);
+               _stop_pushing_packet(0, value);
                reset_menu_state();
                break;
        }
@@ -4743,15 +4726,15 @@ static void interpret(char *cmd)
                static unsigned int id;
                value = atoi(cmd);
 
-               switch (g_conns[g_conn_index].cnt) {
+               switch (g_cnt) {
                case 0:
                        id = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 1:
-                       _set_media_path(g_conn_index, id, cmd);
+                       _set_media_path(0, id, cmd);
                        id = 0;
-                       g_conns[g_conn_index].cnt = 0;
+                       g_cnt = 0;
                        reset_menu_state();
                        break;
                }
@@ -4760,15 +4743,15 @@ static void interpret(char *cmd)
        case CURRENT_STATUS_MEDIA_SOURCE_SET_FILE_LOOPING: {
                static unsigned int id;
                value = atoi(cmd);
-               switch (g_conns[g_conn_index].cnt) {
+               switch (g_cnt) {
                case 0:
                        id = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 1:
-                       _webrtc_media_source_set_file_looping(g_conn_index, id, value);
+                       _webrtc_media_source_set_file_looping(0, id, value);
                        id = 0;
-                       g_conns[g_conn_index].cnt = 0;
+                       g_cnt = 0;
                        reset_menu_state();
                        break;
                }
@@ -4776,7 +4759,7 @@ static void interpret(char *cmd)
        }
        case CURRENT_STATUS_MEDIA_SOURCE_GET_FILE_LOOPING: {
                value = atoi(cmd);
-               _webrtc_media_source_get_file_looping(g_conn_index, value);
+               _webrtc_media_source_get_file_looping(0, value);
                reset_menu_state();
                break;
        }
@@ -4789,21 +4772,21 @@ static void interpret(char *cmd)
        case CURRENT_STATUS_CONNECT_TO_PRIVATE_SIGNALING_SERVER: {
                static char *ip = NULL;
 
-               if (strlen(g_signaling_server) > 0) {
-                       g_printerr("server[%s] is already set by 'ss'\n", g_signaling_server);
+               if (strlen(g_signaling_server.url) > 0) {
+                       g_printerr("server[%s] is already set by 'ss'\n", g_signaling_server.url);
                        reset_menu_state();
                        break;
                }
 
-               switch (g_conns[g_conn_index].cnt) {
+               switch (g_cnt) {
                case 0:
                        ip = strdup(cmd);
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 1:
                        value = atoi(cmd);
-                       _webrtc_signaling_connect(g_conn_index, ip, value);
-                       g_conns[g_conn_index].cnt = 0;
+                       _webrtc_signaling_connect(ip, value);
+                       g_cnt = 0;
                        if (ip) {
                                free(ip);
                                ip = NULL;
@@ -4822,33 +4805,33 @@ static void interpret(char *cmd)
                static int is_vertical;
                value = atoi(cmd);
 
-               switch (g_conns[g_conn_index].cnt) {
+               switch (g_cnt) {
                case 0:
                        id = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 1:
                        x = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 2:
                        y =  value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 3:
                        w = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 4:
                        h = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 5:
                        is_vertical = value;
                        int width, height;
-                       _webrtc_screen_source_set_crop(g_conn_index, id, x, y, w, h, is_vertical, &width, &height);
+                       _webrtc_screen_source_set_crop(0, id, x, y, w, h, is_vertical, &width, &height);
                        x = y = w = h = is_vertical = 0;
-                       g_conns[g_conn_index].cnt = 0;
+                       g_cnt = 0;
                        reset_menu_state();
                        break;
                }
@@ -4856,7 +4839,7 @@ static void interpret(char *cmd)
        }
        case CURRENT_STATUS_UNSET_CROP_SCREEN_SOURCE: {
                value = atoi(cmd);
-               _webrtc_screen_source_unset_crop(g_conn_index, value);
+               _webrtc_screen_source_unset_crop(0, value);
                reset_menu_state();
                break;
        }
@@ -4865,19 +4848,19 @@ static void interpret(char *cmd)
                static unsigned int media_type;
                value = atoi(cmd);
 
-               switch (g_conns[g_conn_index].cnt) {
+               switch (g_cnt) {
                case 0:
                        id = value;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 1:
                        media_type = value - 1;
-                       g_conns[g_conn_index].cnt++;
+                       g_cnt++;
                        break;
                case 2:
-                       _webrtc_media_source_set_mute(g_conn_index, id, media_type, value);
+                       _webrtc_media_source_set_mute(0, id, media_type, value);
                        id = media_type = 0;
-                       g_conns[g_conn_index].cnt = 0;
+                       g_cnt = 0;
                        reset_menu_state();
                        break;
                }
@@ -4885,7 +4868,7 @@ static void interpret(char *cmd)
        }
        }
 
-       if (g_conns[g_conn_index].menu_state != CURRENT_STATUS_TERMINATE)
+       if (g_menu_state != CURRENT_STATUS_TERMINATE)
                g_timeout_add(100, timeout_menu_display, 0);
 }