webrtc_test: Use hashmap to interpret command 52/274552/1
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 2 May 2022 07:57:31 +0000 (16:57 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Mon, 2 May 2022 07:57:31 +0000 (16:57 +0900)
[Version] 0.3.98
[Issue Type] Refactoring

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

index fb159c9a7d0b7b0b62132a74881106ff97906a68..559bd48766472dd180440da7e7d85ddcb6144c53 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.3.97
+Version:    0.3.98
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 04657a24bbdb585e556db27f4a565777de04c245..266405b7429186fa14028519880039e4de9d3aaf 100644 (file)
@@ -71,14 +71,33 @@ do { \
 enum {
        CURRENT_STATUS_MAINMENU,
        CURRENT_STATUS_TERMINATE,
+       CURRENT_STATUS_QUIT,
        /* webrtc common */
-       CURRENT_STATUS_SET_STUN_SERVER = TEST_MENU_WEBRTC_COMMON | 0x01,
-       CURRENT_STATUS_ADD_TURN_SERVER = TEST_MENU_WEBRTC_COMMON | 0x02,
-       CURRENT_STATUS_SET_BUNDLE_POLICY = TEST_MENU_WEBRTC_COMMON | 0x03,
-       CURRENT_STATUS_SET_ICE_TRANSPORT_POLICY = TEST_MENU_WEBRTC_COMMON | 0x04,
-       CURRENT_STATUS_SET_LOCAL_DESCRIPTION = TEST_MENU_WEBRTC_COMMON | 0x05,
-       CURRENT_STATUS_SET_RTP_PACKET_DROP_PROBABILITY = TEST_MENU_WEBRTC_COMMON | 0x06,
-       CURRENT_STATUS_GET_RTP_PACKET_DROP_PROBABILITY = TEST_MENU_WEBRTC_COMMON | 0x07,
+       CURRENT_STATUS_CREATE = TEST_MENU_WEBRTC_COMMON | 0x01,
+       CURRENT_STATUS_START = TEST_MENU_WEBRTC_COMMON | 0x02,
+       CURRENT_STATUS_STOP = TEST_MENU_WEBRTC_COMMON | 0x03,
+       CURRENT_STATUS_DESTROY = TEST_MENU_WEBRTC_COMMON | 0x04,
+       CURRENT_STATUS_GET_STATE = TEST_MENU_WEBRTC_COMMON | 0x05,
+       CURRENT_STATUS_SET_STUN_SERVER = TEST_MENU_WEBRTC_COMMON | 0x06,
+       CURRENT_STATUS_GET_STUN_SERVER = TEST_MENU_WEBRTC_COMMON | 0x07,
+       CURRENT_STATUS_ADD_TURN_SERVER = TEST_MENU_WEBRTC_COMMON | 0x08,
+       CURRENT_STATUS_GET_TURN_SERVERS = TEST_MENU_WEBRTC_COMMON | 0x09,
+       CURRENT_STATUS_SET_BUNDLE_POLICY = TEST_MENU_WEBRTC_COMMON | 0x0A,
+       CURRENT_STATUS_GET_BUNDLE_POLICY = TEST_MENU_WEBRTC_COMMON | 0x0B,
+       CURRENT_STATUS_SET_ICE_TRANSPORT_POLICY = TEST_MENU_WEBRTC_COMMON | 0x0C,
+       CURRENT_STATUS_GET_ICE_TRANSPORT_POLICY = TEST_MENU_WEBRTC_COMMON | 0x0D,
+       CURRENT_STATUS_CREATE_OFFER = TEST_MENU_WEBRTC_COMMON | 0x0E,
+       CURRENT_STATUS_CREATE_ANSWER = TEST_MENU_WEBRTC_COMMON | 0x0F,
+       CURRENT_STATUS_CREATE_OFFER_ASYNC = TEST_MENU_WEBRTC_COMMON | 0x10,
+       CURRENT_STATUS_CREATE_ANSWER_ASYNC = TEST_MENU_WEBRTC_COMMON | 0x11,
+       CURRENT_STATUS_SET_LOCAL_DESCRIPTION = TEST_MENU_WEBRTC_COMMON | 0x12,
+       CURRENT_STATUS_SET_REMOTE_DESCRIPTION = TEST_MENU_WEBRTC_COMMON | 0x13,
+       CURRENT_STATUS_ADD_ICE_CANDIDATE = TEST_MENU_WEBRTC_COMMON | 0x14,
+       CURRENT_STATUS_SET_ALL_CALLBACKS = TEST_MENU_WEBRTC_COMMON | 0x15,
+       CURRENT_STATUS_UNSET_ALL_CALLBACKS = TEST_MENU_WEBRTC_COMMON | 0x16,
+       CURRENT_STATUS_GET_ALL_NEGOTIATION_STATES = TEST_MENU_WEBRTC_COMMON | 0x17,
+       CURRENT_STATUS_SET_RTP_PACKET_DROP_PROBABILITY = TEST_MENU_WEBRTC_COMMON | 0x18,
+       CURRENT_STATUS_GET_RTP_PACKET_DROP_PROBABILITY = TEST_MENU_WEBRTC_COMMON | 0x19,
        /* webrtc media source */
        CURRENT_STATUS_ADD_MEDIA_SOURCE = TEST_MENU_WEBRTC_MEDIA_SOURCE | 0x01,
        CURRENT_STATUS_REMOVE_MEDIA_SOURCE = TEST_MENU_WEBRTC_MEDIA_SOURCE | 0x02,
@@ -108,25 +127,142 @@ enum {
        CURRENT_STATUS_GET_DISPLAY_MODE = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x03,
        CURRENT_STATUS_SET_DISPLAY_VISIBLE = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x04,
        CURRENT_STATUS_GET_DISPLAY_VISIBLE = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x05,
-       CURRENT_STATUS_MEDIA_SOURCE_SET_AUDIO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x06,
-       CURRENT_STATUS_MEDIA_SOURCE_UNSET_AUDIO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x07,
-       CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x08,
-       CURRENT_STATUS_MEDIA_SOURCE_UNSET_VIDEO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x09,
+       CURRENT_STATUS_SET_ENCODED_AUDIO_FRAME_CB = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x06,
+       CURRENT_STATUS_UNSET_ENCODED_AUDIO_FRAME_CB = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x07,
+       CURRENT_STATUS_SET_ENCODED_VIDEO_FRAME_CB = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x08,
+       CURRENT_STATUS_UNSET_ENCODED_VIDEO_FRAME_CB = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x09,
+       CURRENT_STATUS_MEDIA_SOURCE_SET_AUDIO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0A,
+       CURRENT_STATUS_MEDIA_SOURCE_UNSET_AUDIO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0B,
+       CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0C,
+       CURRENT_STATUS_MEDIA_SOURCE_UNSET_VIDEO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0D,
        /* webrtc data channel */
-       CURRENT_STATUS_DATA_CHANNEL_SEND_STRING = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x01,
-       CURRENT_STATUS_DATA_CHANNEL_SEND_STRING_AS_BYTES = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x02,
-       CURRENT_STATUS_DATA_CHANNEL_SEND_FILE = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x03,
-       CURRENT_STATUS_DATA_CHANNEL_SET_BUFFERED_AMOUNT_LOW_CB = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x04,
+       CURRENT_STATUS_DATA_CHANNEL_CREATE = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x01,
+       CURRENT_STATUS_DATA_CHANNEL_DESTROY = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x02,
+       CURRENT_STATUS_DATA_CHANNEL_GET_LABEL = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x03,
+       CURRENT_STATUS_DATA_CHANNEL_SEND_STRING = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x04,
+       CURRENT_STATUS_DATA_CHANNEL_SEND_STRING_AS_BYTES = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x05,
+       CURRENT_STATUS_DATA_CHANNEL_SEND_FILE = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x06,
+       CURRENT_STATUS_DATA_CHANNEL_SET_BUFFERED_AMOUNT_LOW_CB = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x07,
+       CURRENT_STATUS_DATA_CHANNEL_UNSET_BUFFERED_AMOUNT_LOW_CB = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x08,
+       CURRENT_STATUS_DATA_CHANNEL_GET_BUFFERED_AMOUNT_LOW_THRESHOLD = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x09,
+       CURRENT_STATUS_DATA_CHANNEL_GET_BUFFERED_AMOUNT = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x0A,
        /* webrtc stats */
        CURRENT_STATUS_FOREACH_STATS = TEST_MENU_WEBRTC_STATS | 0x01,
        /* app. setting & signaling */
        CURRENT_STATUS_SETTING_SIGNALING_SERVER = TEST_MENU_APP_SIGNALING | 0x01,
-       CURRENT_STATUS_SETTING_PROXY = TEST_MENU_APP_SIGNALING | 0x02,
-       CURRENT_STATUS_REQUEST_SESSION = TEST_MENU_APP_SIGNALING | 0x03,
-       CURRENT_STATUS_REQUEST_JOIN_ROOM = TEST_MENU_APP_SIGNALING | 0x04,
-       CURRENT_STATUS_SEND_LOCAL_DESCRIPTION = TEST_MENU_APP_SIGNALING | 0x05,
-       CURRENT_STATUS_CREATE_PRIVATE_SIGNALING_SERVER = TEST_MENU_APP_SIGNALING | 0x06,
-       CURRENT_STATUS_CONNECT_TO_PRIVATE_SIGNALING_SERVER = TEST_MENU_APP_SIGNALING | 0x07,
+       CURRENT_STATUS_CONNECT_SIGNALING_SERVER = TEST_MENU_APP_SIGNALING | 0x02,
+       CURRENT_STATUS_SETTING_PROXY = TEST_MENU_APP_SIGNALING | 0x03,
+       CURRENT_STATUS_REQUEST_SESSION = TEST_MENU_APP_SIGNALING | 0x04,
+       CURRENT_STATUS_REQUEST_JOIN_ROOM = TEST_MENU_APP_SIGNALING | 0x05,
+       CURRENT_STATUS_SEND_LOCAL_DESCRIPTION = TEST_MENU_APP_SIGNALING | 0x06,
+       CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_CREATE = TEST_MENU_APP_SIGNALING | 0x07,
+       CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_DESTROY = TEST_MENU_APP_SIGNALING | 0x08,
+       CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_START = TEST_MENU_APP_SIGNALING | 0x09,
+       CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_STOP = TEST_MENU_APP_SIGNALING | 0x0A,
+       CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_CONNECT = TEST_MENU_APP_SIGNALING | 0x0B,
+       CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_DISCONNECT = TEST_MENU_APP_SIGNALING | 0x0C,
+};
+
+typedef struct {
+       const char *cmd;
+       int status;
+       bool key_input_needed;
+} menu_info_s;
+
+menu_info_s g_menu_infos[] = {
+       { "none", CURRENT_STATUS_MAINMENU, false },
+       { "none", CURRENT_STATUS_TERMINATE, false },
+       { "q", CURRENT_STATUS_QUIT, false },
+       /* webrtc common */
+       { "c", CURRENT_STATUS_CREATE, false },
+       { "s", CURRENT_STATUS_START, false },
+       { "t", CURRENT_STATUS_STOP, false },
+       { "d", CURRENT_STATUS_DESTROY, false },
+       { "g", CURRENT_STATUS_GET_STATE, false },
+       { "st", CURRENT_STATUS_SET_STUN_SERVER, true },
+       { "gt", CURRENT_STATUS_GET_STUN_SERVER, false },
+       { "su", CURRENT_STATUS_ADD_TURN_SERVER, true },
+       { "gu", CURRENT_STATUS_GET_TURN_SERVERS, false },
+       { "sbp", CURRENT_STATUS_SET_BUNDLE_POLICY, true },
+       { "gbp", CURRENT_STATUS_GET_BUNDLE_POLICY, false },
+       { "stp", CURRENT_STATUS_SET_ICE_TRANSPORT_POLICY, true },
+       { "gtp", CURRENT_STATUS_GET_ICE_TRANSPORT_POLICY, false },
+       { "co", CURRENT_STATUS_CREATE_OFFER, false },
+       { "ca", CURRENT_STATUS_CREATE_ANSWER, false },
+       { "coa", CURRENT_STATUS_CREATE_OFFER_ASYNC, false },
+       { "caa", CURRENT_STATUS_CREATE_ANSWER_ASYNC, false },
+       { "sl", CURRENT_STATUS_SET_LOCAL_DESCRIPTION, true },
+       { "sr", CURRENT_STATUS_SET_REMOTE_DESCRIPTION, false },
+       { "ac", CURRENT_STATUS_ADD_ICE_CANDIDATE, false },
+       { "sac", CURRENT_STATUS_SET_ALL_CALLBACKS, false },
+       { "uac", CURRENT_STATUS_UNSET_ALL_CALLBACKS, false },
+       { "gan", CURRENT_STATUS_GET_ALL_NEGOTIATION_STATES, false },
+       { "sdp", CURRENT_STATUS_SET_RTP_PACKET_DROP_PROBABILITY, true },
+       { "gdp", CURRENT_STATUS_GET_RTP_PACKET_DROP_PROBABILITY, true },
+       /* webrtc media source */
+       { "a", CURRENT_STATUS_ADD_MEDIA_SOURCE, true },
+       { "r", CURRENT_STATUS_REMOVE_MEDIA_SOURCE, true },
+       { "td", CURRENT_STATUS_MEDIA_SOURCE_SET_TRANSCEIVER_DIRECTION, true },
+       { "gd", CURRENT_STATUS_MEDIA_SOURCE_GET_TRANSCEIVER_DIRECTION, true },
+       { "p", CURRENT_STATUS_MEDIA_SOURCE_SET_PAUSE, true },
+       { "o", CURRENT_STATUS_MEDIA_SOURCE_GET_PAUSE, true },
+       { "mu", CURRENT_STATUS_MEDIA_SOURCE_SET_MUTE, true },
+       { "mg", CURRENT_STATUS_MEDIA_SOURCE_GET_MUTE, true },
+       { "v", CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_RESOLUTION, true },
+       { "l", CURRENT_STATUS_MEDIA_SOURCE_GET_VIDEO_RESOLUTION, true },
+       { "f", CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_FRAMERATE, true },
+       { "m", CURRENT_STATUS_MEDIA_SOURCE_GET_VIDEO_FRAMERATE, true },
+       { "pa", CURRENT_STATUS_FILE_SOURCE_SET_PATH, true },
+       { "sfl", CURRENT_STATUS_FILE_SOURCE_SET_LOOPING, true },
+       { "gfl", CURRENT_STATUS_FILE_SOURCE_GET_LOOPING, true },
+       { "sf", CURRENT_STATUS_MEDIA_PACKET_SOURCE_SET_FORMAT, true },
+       { "sm", CURRENT_STATUS_MEDIA_PACKET_SOURCE_SET_BUFFER_STATE_CHANGED_CB, true },
+       { "um", CURRENT_STATUS_MEDIA_PACKET_SOURCE_UNSET_BUFFER_STATE_CHANGED_CB, true },
+       { "sp", CURRENT_STATUS_START_PUSHING_PACKET_TO_MEDIA_PACKET_SOURCE, true },
+       { "tp", CURRENT_STATUS_STOP_PUSHING_PACKET_TO_MEDIA_PACKET_SOURCE, true },
+       { "scs", CURRENT_STATUS_SET_CROP_SCREEN_SOURCE, true },
+       { "ucs", CURRENT_STATUS_UNSET_CROP_SCREEN_SOURCE, true },
+       /* webrtc media render */
+       { "dt", CURRENT_STATUS_SET_DISPLAY_TYPE, true },
+       { "dm", CURRENT_STATUS_SET_DISPLAY_MODE, true },
+       { "gm", CURRENT_STATUS_GET_DISPLAY_MODE, true },
+       { "dv", CURRENT_STATUS_SET_DISPLAY_VISIBLE, true },
+       { "gv", CURRENT_STATUS_GET_DISPLAY_VISIBLE, true },
+       { "sa", CURRENT_STATUS_SET_ENCODED_AUDIO_FRAME_CB, false },
+       { "ua", CURRENT_STATUS_UNSET_ENCODED_AUDIO_FRAME_CB, false },
+       { "sv", CURRENT_STATUS_SET_ENCODED_VIDEO_FRAME_CB, false },
+       { "uv", CURRENT_STATUS_UNSET_ENCODED_VIDEO_FRAME_CB, false },
+       { "al", CURRENT_STATUS_MEDIA_SOURCE_SET_AUDIO_LOOPBACK, true },
+       { "ual", CURRENT_STATUS_MEDIA_SOURCE_UNSET_AUDIO_LOOPBACK, true },
+       { "vl", CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_LOOPBACK, true },
+       { "uvl", CURRENT_STATUS_MEDIA_SOURCE_UNSET_VIDEO_LOOPBACK, true },
+       /* webrtc data channel */
+       { "cd", CURRENT_STATUS_DATA_CHANNEL_CREATE, false },
+       { "dd", CURRENT_STATUS_DATA_CHANNEL_DESTROY, false },
+       { "dl", CURRENT_STATUS_DATA_CHANNEL_GET_LABEL, false },
+       { "zs", CURRENT_STATUS_DATA_CHANNEL_SEND_STRING, true },
+       { "zb", CURRENT_STATUS_DATA_CHANNEL_SEND_STRING_AS_BYTES, true },
+       { "zf", CURRENT_STATUS_DATA_CHANNEL_SEND_FILE, true },
+       { "sbc", CURRENT_STATUS_DATA_CHANNEL_SET_BUFFERED_AMOUNT_LOW_CB, true },
+       { "ubc", CURRENT_STATUS_DATA_CHANNEL_UNSET_BUFFERED_AMOUNT_LOW_CB, false },
+       { "gbt", CURRENT_STATUS_DATA_CHANNEL_GET_BUFFERED_AMOUNT_LOW_THRESHOLD, false },
+       { "ba", CURRENT_STATUS_DATA_CHANNEL_GET_BUFFERED_AMOUNT, false },
+       /* webrtc stats */
+       { "sts", CURRENT_STATUS_FOREACH_STATS, true },
+       /* app. setting & signaling */
+       { "ss", CURRENT_STATUS_SETTING_SIGNALING_SERVER, true },
+       { "cs", CURRENT_STATUS_CONNECT_SIGNALING_SERVER, false },
+       { "px", CURRENT_STATUS_SETTING_PROXY, true },
+       { "rs", CURRENT_STATUS_REQUEST_SESSION, true },
+       { "rj", CURRENT_STATUS_REQUEST_JOIN_ROOM, true },
+       { "sd", CURRENT_STATUS_SEND_LOCAL_DESCRIPTION, true },
+       { "ssc", CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_CREATE, true },
+       { "ssd", CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_DESTROY, false },
+       { "sss", CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_START, false },
+       { "sst", CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_STOP, false },
+       { "scc", CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_CONNECT, true },
+       { "scd", CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_DISCONNECT, false },
+       { NULL, -1, false },
 };
 
 enum {
@@ -178,6 +314,7 @@ static Evas_Object *g_eo_mine;
 static Evas_Object *g_text_eo_mine;
 
 typedef struct {
+       GHashTable *menu_items;
        Evas_Object *win;
        int win_width;
        int win_height;
@@ -385,6 +522,16 @@ static int app_create(void *data)
        int i;
        Evas_Object **eo;
 
+       ad->menu_items = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
+       for (i = 0; g_menu_infos[i].cmd != NULL; i++) {
+               if (g_strcmp0(g_menu_infos[i].cmd, "none") == 0)
+                       continue;
+               if (!g_hash_table_insert(ad->menu_items, (gpointer)g_menu_infos[i].cmd, &g_menu_infos[i])) {
+                       g_printerr("should not be reached here, cmd[%s] already exist", g_menu_infos[i].cmd);
+                       continue;
+               }
+       }
+
        /* use gl backend */
        elm_config_accel_preference_set("opengl");
 
@@ -498,6 +645,9 @@ static int app_terminate(void *data)
 
        ad->win = NULL;
 
+       g_hash_table_destroy(ad->menu_items);
+       ad->menu_items = NULL;
+
        return 0;
 }
 
@@ -2556,6 +2706,32 @@ static void _webrtc_media_packet_source_unset_buffer_state_changed_cb(int index,
        g_print("webrtc_media_packet_source_unset_buffer_state_changed_cb() success\n");
 }
 
+static void _webrtc_set_all_cbs(int index)
+{
+       int i;
+
+       _webrtc_set_all_basic_cbs(index);
+       _webrtc_set_all_negotiation_state_change_cbs(index);
+
+       for (i = 0; i < MAX_MEDIA_PACKET_SOURCE_LEN; i++) {
+               if (g_conns[index].packet_sources[i].source_id > 0)
+                       _webrtc_media_packet_source_set_buffer_state_changed_cb(0, g_conns[index].packet_sources[i].source_id);
+       }
+}
+
+static void _webrtc_unset_all_cbs(int index)
+{
+       int i;
+
+       _webrtc_unset_all_basic_cbs(index);
+       _webrtc_unset_all_negotiation_state_change_cbs(index);
+
+       for (i = 0; i < MAX_MEDIA_PACKET_SOURCE_LEN; i++) {
+               if (g_conns[index].packet_sources[i].source_id > 0)
+                       _webrtc_media_packet_source_unset_buffer_state_changed_cb(0, g_conns[index].packet_sources[i].source_id);
+       }
+}
+
 static void _webrtc_create_data_channel(int index)
 {
        int ret = WEBRTC_ERROR_NONE;
@@ -4203,330 +4379,31 @@ static void quit_program()
        elm_exit();
 }
 
-static void change_menu_state_1(char *cmd)
-{
-       if (!cmd)
-               return;
-
-       if (strncmp(cmd, "c", 1) == 0)
-               _webrtc_create(0);
-
-       else if (strncmp(cmd, "a", 1) == 0)
-               g_menu_state = CURRENT_STATUS_ADD_MEDIA_SOURCE;
-
-       else if (strncmp(cmd, "r", 1) == 0)
-               g_menu_state = CURRENT_STATUS_REMOVE_MEDIA_SOURCE;
-
-       else if (strncmp(cmd, "p", 1) == 0)
-               g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_PAUSE;
-
-       else if (strncmp(cmd, "o", 1) == 0)
-               g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_GET_PAUSE;
-
-       else if (strncmp(cmd, "v", 1) == 0)
-               g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_RESOLUTION;
-
-       else if (strncmp(cmd, "l", 1) == 0)
-               g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_GET_VIDEO_RESOLUTION;
-
-       else if (strncmp(cmd, "f", 1) == 0)
-               g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_FRAMERATE;
-
-       else if (strncmp(cmd, "m", 1) == 0)
-               g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_GET_VIDEO_FRAMERATE;
-
-       else if (strncmp(cmd, "s", 1) == 0)
-               _webrtc_start(0);
-
-       else if (strncmp(cmd, "t", 1) == 0)
-               _webrtc_stop(0);
-
-       else if (strncmp(cmd, "d", 1) == 0)
-               _webrtc_destroy(0);
-
-       else if (strncmp(cmd, "g", 1) == 0)
-               _webrtc_get_state(0);
-
-       else if (strncmp(cmd, "q", 1) == 0)
-               quit_program();
-
-       else
-               g_print("%s() > unknown menu[%s]\n", __FUNCTION__, cmd);
-
-}
-
-static void change_menu_state_2(char *cmd)
-{
-       if (!cmd)
-               return;
-
-       if (strncmp(cmd, "sf", 2) == 0)
-               g_menu_state = CURRENT_STATUS_MEDIA_PACKET_SOURCE_SET_FORMAT;
-
-       else if (strncmp(cmd, "td", 2) == 0)
-               g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_TRANSCEIVER_DIRECTION;
-
-       else if (strncmp(cmd, "gd", 2) == 0)
-               g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_GET_TRANSCEIVER_DIRECTION;
-
-       else if (strncmp(cmd, "mu", 2) == 0)
-               g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_MUTE;
-
-       else if (strncmp(cmd, "mg", 2) == 0)
-               g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_GET_MUTE;
-
-       else if (strncmp(cmd, "dt", 2) == 0)
-               g_menu_state = CURRENT_STATUS_SET_DISPLAY_TYPE;
-
-       else if (strncmp(cmd, "dm", 2) == 0)
-               g_menu_state = CURRENT_STATUS_SET_DISPLAY_MODE;
-
-       else if (strncmp(cmd, "gm", 2) == 0)
-               g_menu_state = CURRENT_STATUS_GET_DISPLAY_MODE;
-
-       else if (strncmp(cmd, "dv", 2) == 0)
-               g_menu_state = CURRENT_STATUS_SET_DISPLAY_VISIBLE;
-
-       else if (strncmp(cmd, "gv", 2) == 0)
-               g_menu_state = CURRENT_STATUS_GET_DISPLAY_VISIBLE;
-
-       else if (strncmp(cmd, "al", 2) == 0)
-               g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_AUDIO_LOOPBACK;
-
-       else if (strncmp(cmd, "vl", 2) == 0)
-               g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_LOOPBACK;
-
-       else if (strncmp(cmd, "cd", 2) == 0)
-               _webrtc_create_data_channel(0);
-
-       else if (strncmp(cmd, "dd", 2) == 0)
-               _webrtc_destroy_data_channel(0);
-
-       else if (strncmp(cmd, "dl", 2) == 0)
-               _webrtc_data_channel_get_label(0);
-
-       else if (strncmp(cmd, "zs", 2) == 0)
-               g_menu_state = CURRENT_STATUS_DATA_CHANNEL_SEND_STRING;
-
-       else if (strncmp(cmd, "zb", 2) == 0)
-               g_menu_state = CURRENT_STATUS_DATA_CHANNEL_SEND_STRING_AS_BYTES;
-
-       else if (strncmp(cmd, "zf", 2) == 0)
-               g_menu_state = CURRENT_STATUS_DATA_CHANNEL_SEND_FILE;
-
-       else if (strncmp(cmd, "ba", 2) == 0)
-               _webrtc_data_channel_get_buffered_amount(0);
-
-       else if (strncmp(cmd, "sa", 2) == 0)
-               _webrtc_set_encoded_audio_frame_cb(0);
-
-       else if (strncmp(cmd, "ua", 2) == 0)
-               _webrtc_unset_encoded_audio_frame_cb(0);
-
-       else if (strncmp(cmd, "sv", 2) == 0)
-               _webrtc_set_encoded_video_frame_cb(0);
-
-       else if (strncmp(cmd, "uv", 2) == 0)
-               _webrtc_unset_encoded_video_frame_cb(0);
-
-       else if (strncmp(cmd, "sm", 2) == 0)
-               g_menu_state = CURRENT_STATUS_MEDIA_PACKET_SOURCE_SET_BUFFER_STATE_CHANGED_CB;
-
-       else if (strncmp(cmd, "um", 2) == 0)
-               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[0], false);
-
-       else if (strncmp(cmd, "ca", 2) == 0)
-               _webrtc_create_answer(&g_conns[0], false);
-
-       else if (strncmp(cmd, "sl", 2) == 0)
-               g_menu_state = CURRENT_STATUS_SET_LOCAL_DESCRIPTION;
-
-       else if (strncmp(cmd, "sr", 2) == 0)
-               _webrtc_set_remote_description(&g_conns[0]);
-
-       else if (strncmp(cmd, "st", 2) == 0)
-               g_menu_state = CURRENT_STATUS_SET_STUN_SERVER;
-
-       else if (strncmp(cmd, "gt", 2) == 0)
-               _webrtc_get_stun_server(0);
-
-       else if (strncmp(cmd, "su", 2) == 0)
-               g_menu_state = CURRENT_STATUS_ADD_TURN_SERVER;
-
-       else if (strncmp(cmd, "gu", 2) == 0)
-               _webrtc_get_turn_servers(0);
-
-       else if (strncmp(cmd, "ss", 2) == 0)
-               g_menu_state = CURRENT_STATUS_SETTING_SIGNALING_SERVER;
-
-       else if (strncmp(cmd, "px", 2) == 0)
-               g_menu_state = CURRENT_STATUS_SETTING_PROXY;
-
-       else if (strncmp(cmd, "cs", 2) == 0)
-               _connect_signaling_server();
-
-       else if (strncmp(cmd, "rs", 2) == 0)
-               g_menu_state = CURRENT_STATUS_REQUEST_SESSION;
-
-       else if (strncmp(cmd, "rj", 2) == 0)
-               g_menu_state = CURRENT_STATUS_REQUEST_JOIN_ROOM;
-
-       else if (strncmp(cmd, "sd", 2) == 0)
-               g_menu_state = CURRENT_STATUS_SEND_LOCAL_DESCRIPTION;
-
-       else if (strncmp(cmd, "sp", 2) == 0)
-               g_menu_state = CURRENT_STATUS_START_PUSHING_PACKET_TO_MEDIA_PACKET_SOURCE;
-
-       else if (strncmp(cmd, "tp", 2) == 0)
-               g_menu_state = CURRENT_STATUS_STOP_PUSHING_PACKET_TO_MEDIA_PACKET_SOURCE;
-
-       else if (strncmp(cmd, "pa", 2) == 0)
-               g_menu_state = CURRENT_STATUS_FILE_SOURCE_SET_PATH;
-
-       else if (strncmp(cmd, "ac", 2) == 0)
-               _webrtc_add_ice_candidate(&g_conns[0], NULL);
-
-       else
-               g_print("%s() > unknown menu[%s]\n", __FUNCTION__, cmd);
-
-}
-
-static void change_menu_state_3(char *cmd)
-{
-       if (!cmd)
-               return;
-
-       if (strncmp(cmd, "ual", 3) == 0) {
-               g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_UNSET_AUDIO_LOOPBACK;
-
-       } else if (strncmp(cmd, "uvl", 3) == 0) {
-               g_menu_state = CURRENT_STATUS_MEDIA_SOURCE_UNSET_VIDEO_LOOPBACK;
-
-       } else if (strncmp(cmd, "sac", 3) == 0) {
-               int i;
-
-               _webrtc_set_all_basic_cbs(0);
-               _webrtc_set_all_negotiation_state_change_cbs(0);
-
-               for (i = 0; i < MAX_MEDIA_PACKET_SOURCE_LEN; i++) {
-                       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, "uac", 3) == 0) {
-               int i;
-
-               _webrtc_unset_all_basic_cbs(0);
-               _webrtc_unset_all_negotiation_state_change_cbs(0);
-
-               for (i = 0; i < MAX_MEDIA_PACKET_SOURCE_LEN; i++) {
-                       if (g_conns[0].packet_sources[i].source_id > 0)
-                               _webrtc_media_packet_source_unset_buffer_state_changed_cb(0, g_conns[0].packet_sources[i].source_id);
-               }
-
-       } else if (strncmp(cmd, "gan", 3) == 0) {
-               _webrtc_get_all_negotiation_states(0);
-
-       } else if (strncmp(cmd, "coa", 3) == 0) {
-               _webrtc_create_offer(&g_conns[0], true);
-
-       } else if (strncmp(cmd, "caa", 3) == 0) {
-               _webrtc_create_answer(&g_conns[0], true);
-
-       } else if (strncmp(cmd, "sbp", 3) == 0) {
-               g_menu_state = CURRENT_STATUS_SET_BUNDLE_POLICY;
-
-       } else if (strncmp(cmd, "gbp", 3) == 0) {
-               _webrtc_get_bundle_policy(0);
-
-       } else if (strncmp(cmd, "stp", 3) == 0) {
-               g_menu_state = CURRENT_STATUS_SET_ICE_TRANSPORT_POLICY;
-
-       } else if (strncmp(cmd, "gtp", 3) == 0) {
-               _webrtc_get_ice_transport_policy(0);
-
-       } else if (strncmp(cmd, "sdp", 3) == 0) {
-               g_menu_state = CURRENT_STATUS_SET_RTP_PACKET_DROP_PROBABILITY;
-
-       } else if (strncmp(cmd, "gdp", 3) == 0) {
-               g_menu_state = CURRENT_STATUS_GET_RTP_PACKET_DROP_PROBABILITY;
-
-       } else if (strncmp(cmd, "ssc", 3) == 0) {
-               g_menu_state = CURRENT_STATUS_CREATE_PRIVATE_SIGNALING_SERVER;
-
-       } else if (strncmp(cmd, "ssd", 3) == 0) {
-               _webrtc_signaling_server_destroy();
-
-       } else if (strncmp(cmd, "sss", 3) == 0) {
-               _webrtc_signaling_server_start();
-
-       } else if (strncmp(cmd, "sst", 3) == 0) {
-               _webrtc_signaling_server_stop();
-
-       } else if (strncmp(cmd, "scc", 3) == 0) {
-               g_menu_state = CURRENT_STATUS_CONNECT_TO_PRIVATE_SIGNALING_SERVER;
-
-       } else if (strncmp(cmd, "scd", 3) == 0) {
-               _webrtc_signaling_disconnect();
-
-       } else if (strncmp(cmd, "scs", 3) == 0) {
-               g_menu_state = CURRENT_STATUS_SET_CROP_SCREEN_SOURCE;
-
-       } else if (strncmp(cmd, "ucs", 3) == 0) {
-               g_menu_state = CURRENT_STATUS_UNSET_CROP_SCREEN_SOURCE;
-
-       } else if (strncmp(cmd, "sfl", 3) == 0) {
-               g_menu_state = CURRENT_STATUS_FILE_SOURCE_SET_LOOPING;
-
-       } else if (strncmp(cmd, "gfl", 3) == 0) {
-               g_menu_state = CURRENT_STATUS_FILE_SOURCE_GET_LOOPING;
-
-       } else if (strncmp(cmd, "sbc", 3) == 0) {
-               g_menu_state = CURRENT_STATUS_DATA_CHANNEL_SET_BUFFERED_AMOUNT_LOW_CB;
-
-       } else if (strncmp(cmd, "gbt", 3) == 0) {
-               _webrtc_data_channel_get_buffered_amount_low_threshold(0);
-
-       } else if (strncmp(cmd, "ubc", 3) == 0) {
-               _webrtc_data_channel_unset_buffered_amount_low_cb(0);
-
-       } else if (strncmp(cmd, "sts", 3) == 0) {
-               g_menu_state = CURRENT_STATUS_FOREACH_STATS;
-
-       } else {
-               g_print("%s() > unknown menu[%s]\n", __FUNCTION__, cmd);
-       }
-}
-
-static void interpret_main_menu_cmd(char *cmd)
+static bool interpret_main_menu_cmd(char *cmd)
 {
        int len;
 
        if (!cmd)
-               return;
+               return true;
 
        len = strlen(cmd);
 
        switch (len) {
-       case 0:
-               /* '\0' case */
-               break;
-       case 1:
-               change_menu_state_1(cmd);
-               break;
-       case 2:
-               change_menu_state_2(cmd);
-               break;
-       case 3:
-               change_menu_state_3(cmd);
-               break;
+       case 0: /* '\0' case */
+               return true;
+       case 1 ... 3: {
+               menu_info_s *menu_info = g_hash_table_lookup(g_ad.menu_items, cmd);
+               if (!menu_info)
+                       break;
+               g_menu_state = menu_info->status;
+               return menu_info->key_input_needed;
+       }
        default:
-               g_print("%s() > unknown menu[%s]\n", __FUNCTION__, cmd);
                break;
        }
+
+       g_print("%s() > unknown menu[%s]\n", __FUNCTION__, cmd);
+       return true;
 }
 
 static void display_handle_status(int index)
@@ -4675,6 +4552,7 @@ static void display_menu_main(void)
        g_print("scd. *Disconnect from signaling server\n");
        g_print("-----------------------------------------------------------------------------------------\n");
        g_print("=========================================================================================\n");
+       g_print(" >>> ");
 }
 
 static void display_menu_webrtc_common(void)
@@ -4706,6 +4584,7 @@ static void display_menu_webrtc_common(void)
                        g_print("*** input side.(1:sender, 2:receiver)\n");
                break;
        }
+       g_print(" >>> ");
 }
 
 static void display_menu_webrtc_media_source(void)
@@ -4832,6 +4711,7 @@ static void display_menu_webrtc_media_source(void)
                        g_print("*** input source id.\n");
                break;
        }
+       g_print(" >>> ");
 }
 
 static void display_menu_webrtc_media_render(void)
@@ -4871,6 +4751,7 @@ static void display_menu_webrtc_media_render(void)
                g_print("*** input source id.\n");
                break;
        }
+       g_print(" >>> ");
 }
 
 static void display_menu_webrtc_data_channel(void)
@@ -4889,6 +4770,7 @@ static void display_menu_webrtc_data_channel(void)
                g_print("*** input data channel buffered amount low threshold.\n");
                break;
        }
+       g_print(" >>> ");
 }
 
 static void display_menu_webrtc_stats(void)
@@ -4899,6 +4781,7 @@ static void display_menu_webrtc_stats(void)
                        g_print("*** input stats type.(1:all, 2:codec, 3:inbound-rtp/remote-outbound-rtp, 4:outbound-rtp/remote-inbound-rtp)\n");
                break;
        }
+       g_print(" >>> ");
 }
 
 static void display_menu_app_signaling(void)
@@ -4922,16 +4805,17 @@ static void display_menu_app_signaling(void)
        case CURRENT_STATUS_SEND_LOCAL_DESCRIPTION:
                g_print("*** input type of local description to send to the server.(1:offer, 2:answer)\n");
                break;
-       case CURRENT_STATUS_CREATE_PRIVATE_SIGNALING_SERVER:
+       case CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_CREATE:
                g_print("*** input port.\n");
                break;
-       case CURRENT_STATUS_CONNECT_TO_PRIVATE_SIGNALING_SERVER:
+       case CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_CONNECT:
                if (g_cnt == 0)
                        g_print("*** input server ip.\n");
                else if (g_cnt == 1)
                        g_print("*** input port.\n");
                break;
        }
+       g_print(" >>> ");
 }
 
 static void displaymenu(void)
@@ -4963,7 +4847,6 @@ static void displaymenu(void)
                        quit_program();
                }
        }
-       g_print(" >>> ");
 }
 
 static gboolean timeout_menu_display_cb(void *data)
@@ -4982,28 +4865,81 @@ static void test_webrtc_common(char *cmd)
        int value;
 
        switch (g_menu_state) {
+       case CURRENT_STATUS_CREATE:
+               _webrtc_create(0);
+               reset_menu_state();
+               break;
+       case CURRENT_STATUS_START:
+               _webrtc_start(0);
+               reset_menu_state();
+               break;
+       case CURRENT_STATUS_STOP:
+               _webrtc_stop(0);
+               reset_menu_state();
+               break;
+       case CURRENT_STATUS_DESTROY:
+               _webrtc_destroy(0);
+               reset_menu_state();
+               break;
+       case CURRENT_STATUS_GET_STATE:
+               _webrtc_get_state(0);
+               reset_menu_state();
+               break;
        case CURRENT_STATUS_SET_STUN_SERVER: {
                _webrtc_set_stun_server(0, cmd);
                reset_menu_state();
                break;
        }
+       case CURRENT_STATUS_GET_STUN_SERVER: {
+               _webrtc_get_stun_server(0);
+               reset_menu_state();
+               break;
+       }
        case CURRENT_STATUS_ADD_TURN_SERVER: {
                _webrtc_add_turn_server(0, cmd);
                reset_menu_state();
                break;
        }
+       case CURRENT_STATUS_GET_TURN_SERVERS: {
+               _webrtc_get_turn_servers(0);
+               reset_menu_state();
+               break;
+       }
        case CURRENT_STATUS_SET_BUNDLE_POLICY: {
                value = atoi(cmd);
                _webrtc_set_bundle_policy(0, value);
                reset_menu_state();
                break;
        }
+       case CURRENT_STATUS_GET_BUNDLE_POLICY: {
+               value = atoi(cmd);
+               _webrtc_get_bundle_policy(0);
+               reset_menu_state();
+               break;
+       }
        case CURRENT_STATUS_SET_ICE_TRANSPORT_POLICY: {
                value = atoi(cmd);
                _webrtc_set_ice_transport_policy(0, value);
                reset_menu_state();
                break;
        }
+       case CURRENT_STATUS_GET_ICE_TRANSPORT_POLICY: {
+               _webrtc_get_ice_transport_policy(0);
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_CREATE_OFFER:
+       case CURRENT_STATUS_CREATE_OFFER_ASYNC: {
+               _webrtc_create_offer(&g_conns[0], g_menu_state == CURRENT_STATUS_CREATE_OFFER ? false : true);
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_CREATE_ANSWER:
+       case CURRENT_STATUS_CREATE_ANSWER_ASYNC: {
+               _webrtc_create_answer(&g_conns[0], g_menu_state == CURRENT_STATUS_CREATE_ANSWER ? false: true);
+               reset_menu_state();
+               break;
+       }
        case CURRENT_STATUS_SET_LOCAL_DESCRIPTION: {
                value = atoi(cmd);
                if (value == 1)
@@ -5016,6 +4952,31 @@ static void test_webrtc_common(char *cmd)
                reset_menu_state();
                break;
        }
+       case CURRENT_STATUS_SET_REMOTE_DESCRIPTION: {
+               _webrtc_set_remote_description(&g_conns[0]);
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_ADD_ICE_CANDIDATE: {
+               _webrtc_add_ice_candidate(&g_conns[0], NULL);
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_SET_ALL_CALLBACKS: {
+               _webrtc_set_all_cbs(0);
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_UNSET_ALL_CALLBACKS: {
+               _webrtc_unset_all_cbs(0);
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_GET_ALL_NEGOTIATION_STATES: {
+               _webrtc_get_all_negotiation_states(0);
+               reset_menu_state();
+               break;
+       }
        case CURRENT_STATUS_SET_RTP_PACKET_DROP_PROBABILITY: {
                static bool sender;
                switch (g_cnt) {
@@ -5413,6 +5374,26 @@ static void test_webrtc_media_render(char *cmd)
                reset_menu_state();
                break;
        }
+       case CURRENT_STATUS_SET_ENCODED_AUDIO_FRAME_CB: {
+               _webrtc_set_encoded_audio_frame_cb(0);
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_UNSET_ENCODED_AUDIO_FRAME_CB: {
+               _webrtc_unset_encoded_audio_frame_cb(0);
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_SET_ENCODED_VIDEO_FRAME_CB: {
+               _webrtc_set_encoded_video_frame_cb(0);
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_UNSET_ENCODED_VIDEO_FRAME_CB: {
+               _webrtc_unset_encoded_video_frame_cb(0);
+               reset_menu_state();
+               break;
+       }
        case CURRENT_STATUS_MEDIA_SOURCE_SET_AUDIO_LOOPBACK: {
                value = atoi(cmd);
                _webrtc_media_source_set_audio_loopback(0, value);
@@ -5443,6 +5424,21 @@ static void test_webrtc_media_render(char *cmd)
 static void test_webrtc_data_channel(char *cmd)
 {
        switch (g_menu_state) {
+       case CURRENT_STATUS_DATA_CHANNEL_CREATE: {
+               _webrtc_create_data_channel(0);
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_DATA_CHANNEL_DESTROY: {
+               _webrtc_destroy_data_channel(0);
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_DATA_CHANNEL_GET_LABEL: {
+               _webrtc_data_channel_get_label(0);
+               reset_menu_state();
+               break;
+       }
        case CURRENT_STATUS_DATA_CHANNEL_SEND_STRING: {
                _webrtc_data_channel_send_string(cmd, false);
                reset_menu_state();
@@ -5463,6 +5459,21 @@ static void test_webrtc_data_channel(char *cmd)
                reset_menu_state();
                break;
        }
+       case CURRENT_STATUS_DATA_CHANNEL_UNSET_BUFFERED_AMOUNT_LOW_CB: {
+               _webrtc_data_channel_unset_buffered_amount_low_cb(0);
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_DATA_CHANNEL_GET_BUFFERED_AMOUNT_LOW_THRESHOLD: {
+               _webrtc_data_channel_get_buffered_amount_low_threshold(0);
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_DATA_CHANNEL_GET_BUFFERED_AMOUNT: {
+               _webrtc_data_channel_get_buffered_amount(0);
+               reset_menu_state();
+               break;
+       }
        }
 }
 
@@ -5492,6 +5503,11 @@ static void app_setting_and_signaling(char *cmd)
                reset_menu_state();
                break;
        }
+       case CURRENT_STATUS_CONNECT_SIGNALING_SERVER: {
+               _connect_signaling_server();
+               reset_menu_state();
+               break;
+       }
        case CURRENT_STATUS_REQUEST_SESSION: {
                value = atoi(cmd);
                _request_session(value);
@@ -5530,13 +5546,28 @@ static void app_setting_and_signaling(char *cmd)
                reset_menu_state();
                break;
        }
-       case CURRENT_STATUS_CREATE_PRIVATE_SIGNALING_SERVER: {
+       case CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_CREATE: {
                value = atoi(cmd);
                _webrtc_signaling_server_create(value);
                reset_menu_state();
                break;
        }
-       case CURRENT_STATUS_CONNECT_TO_PRIVATE_SIGNALING_SERVER: {
+       case CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_DESTROY: {
+               _webrtc_signaling_server_destroy();
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_START: {
+               _webrtc_signaling_server_start();
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_STOP: {
+               _webrtc_signaling_server_stop();
+               reset_menu_state();
+               break;
+       }
+       case CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_CONNECT: {
                static char *ip = NULL;
 
                if (strlen(g_signaling_server.url) > 0) {
@@ -5563,6 +5594,11 @@ static void app_setting_and_signaling(char *cmd)
                }
                break;
        }
+       case CURRENT_STATUS_PRIVATE_SIGNALING_SERVER_DISCONNECT: {
+               _webrtc_signaling_disconnect();
+               reset_menu_state();
+               break;
+       }
        }
 }
 
@@ -5572,28 +5608,32 @@ static void interpret(char *cmd)
                return;
 
        if (g_menu_state == CURRENT_STATUS_MAINMENU) {
-               interpret_main_menu_cmd(cmd);
+               if (interpret_main_menu_cmd(cmd))
+                       goto out;
+       }
 
-       } else {
-               if (g_menu_state & TEST_MENU_WEBRTC_COMMON)
-                       test_webrtc_common(cmd);
+       if (g_menu_state & TEST_MENU_WEBRTC_COMMON)
+               test_webrtc_common(cmd);
 
-               else if (g_menu_state & TEST_MENU_WEBRTC_MEDIA_SOURCE)
-                       test_webrtc_media_source(cmd);
+       else if (g_menu_state & TEST_MENU_WEBRTC_MEDIA_SOURCE)
+               test_webrtc_media_source(cmd);
 
-               else if (g_menu_state & TEST_MENU_WEBRTC_MEDIA_RENDER)
-                       test_webrtc_media_render(cmd);
+       else if (g_menu_state & TEST_MENU_WEBRTC_MEDIA_RENDER)
+               test_webrtc_media_render(cmd);
 
-               else if (g_menu_state & TEST_MENU_WEBRTC_DATA_CHANNEL)
-                       test_webrtc_data_channel(cmd);
+       else if (g_menu_state & TEST_MENU_WEBRTC_DATA_CHANNEL)
+               test_webrtc_data_channel(cmd);
 
-               else if (g_menu_state & TEST_MENU_WEBRTC_STATS)
-                       test_webrtc_stats(cmd);
+       else if (g_menu_state & TEST_MENU_WEBRTC_STATS)
+               test_webrtc_stats(cmd);
 
-               else if (g_menu_state & TEST_MENU_APP_SIGNALING)
-                       app_setting_and_signaling(cmd);
-       }
+       else if (g_menu_state & TEST_MENU_APP_SIGNALING)
+               app_setting_and_signaling(cmd);
+
+       else if (g_menu_state == CURRENT_STATUS_QUIT)
+               quit_program();
 
+out:
        if (g_menu_state != CURRENT_STATUS_TERMINATE)
                g_timeout_add(100, timeout_menu_display_cb, 0);
 }
@@ -5619,8 +5659,7 @@ static gboolean input_watch_cb(GIOChannel *channel, GIOCondition condition, gpoi
 
 int main(int argc, char *argv[])
 {
-       GIOChannel *stdin_channel;
-       stdin_channel = g_io_channel_unix_new(0);
+       GIOChannel *stdin_channel = g_io_channel_unix_new(0);
        g_io_channel_set_flags(stdin_channel, G_IO_FLAG_NONBLOCK, NULL);
        g_io_add_watch(stdin_channel, G_IO_IN, input_watch_cb, NULL);