static void default_key_pressed(void* data, int key, int modifier) { KeyboardConnect* connect = (KeyboardConnect*)data; long elapsedTime; MediaControlMode mode = mc_get_mode(connect->control); switch (key) { case 'j': if (!connect->reverse) { connect->reverse = 1; connect->speedIndex = 0; } else { connect->speedIndex = (connect->speedIndex < NUM_SPEEDS - 1) ? (connect->speedIndex + 1) : connect->speedIndex; } mc_play_speed(connect->control, g_reverseKeyboardSpeed[connect->speedIndex], FRAME_PLAY_UNIT); break; case 'l': if (connect->reverse) { connect->reverse = 0; connect->speedIndex = 0; } else { connect->speedIndex = (connect->speedIndex < NUM_SPEEDS - 1) ? (connect->speedIndex + 1) : connect->speedIndex; } mc_play_speed(connect->control, g_keyboardSpeed[connect->speedIndex], FRAME_PLAY_UNIT); break; case 'k': connect->speedIndex = -1; connect->reverse = 0; mc_pause(connect->control); break; case 'i': mc_toggle_lock(connect->control); break; case 'q': mc_stop(connect->control); break; case XK_space: connect->speedIndex = -1; connect->reverse = 0; mc_toggle_play_pause(connect->control); break; case XK_Right: if (mode == MENU_MODE) { mc_select_menu_item_right(connect->control); } else { mc_step(connect->control, 1, FRAME_PLAY_UNIT); } break; case XK_Left: if (mode == MENU_MODE) { mc_select_menu_item_left(connect->control); } else { mc_step(connect->control, 0, FRAME_PLAY_UNIT); } break; case XK_Up: if (mode == MENU_MODE) { mc_previous_menu_item(connect->control); } else { /* 10 frames speed up forwards */ mc_play_speed(connect->control, 10, FRAME_PLAY_UNIT); } break; case XK_Down: if (mode == MENU_MODE) { mc_next_menu_item(connect->control); } else { /* 10 frames speed up backwards */ mc_play_speed(connect->control, -10, FRAME_PLAY_UNIT); } break; case XK_Page_Up: /* step 1 minute backwards */ mc_seek(connect->control, -1500, SEEK_CUR, FRAME_PLAY_UNIT); break; case XK_Page_Down: /* step 1 minute forwards */ mc_seek(connect->control, 1500, SEEK_CUR, FRAME_PLAY_UNIT); break; case 'm': mc_mark(connect->control, M0_MARK_TYPE, 1); break; case 'c': mc_clear_mark(connect->control, ALL_MARK_TYPE); break; case 'b': mc_clear_all_marks(connect->control, ALL_MARK_TYPE); break; case ',': mc_seek_prev_mark(connect->control); break; case '.': mc_seek_next_mark(connect->control); break; case '/': mc_seek_clip_mark(connect->control); break; case XK_Home: mc_seek(connect->control, 0, SEEK_SET, FRAME_PLAY_UNIT); break; case XK_End: mc_seek(connect->control, 0, SEEK_END, FRAME_PLAY_UNIT); break; case 'o': mc_next_osd_screen(connect->control); break; case 't': mc_next_osd_timecode(connect->control); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': mc_switch_video(connect->control, key - '0'); break; case 'e': mc_switch_prev_audio_group(connect->control); break; case 'p': mc_snap_audio_to_video(connect->control); break; case 'r': mc_switch_next_audio_group(connect->control); break; case 'a': mc_review_start(connect->control, connect->reviewDuration * 25); break; case 'z': mc_review_end(connect->control, connect->reviewDuration * 25); break; case 'x': mc_review(connect->control, connect->reviewDuration * 25); break; case 's': mc_set_half_split_orientation(connect->control, -1 /* toggle */); break; case 'd': mc_set_half_split_type(connect->control, -1 /* toggle */); break; case 'f': mc_show_half_split(connect->control, -1 /* toggle */); break; case 'g': elapsedTime = get_elapsed_time(&connect->halfSplitMovePressedTime); if (elapsedTime < 100000) { connect->halfSplitSpeed = (connect->halfSplitSpeed > HALF_SPLIT_MOVE_MAX_SPEED) ? HALF_SPLIT_MOVE_MAX_SPEED : connect->halfSplitSpeed + 1; } else { connect->halfSplitSpeed = 0; } mc_move_half_split(connect->control, 0 /* left or down */, connect->halfSplitSpeed); break; case 'h': elapsedTime = get_elapsed_time(&connect->halfSplitMovePressedTime); if (elapsedTime < 100000) { connect->halfSplitSpeed = (connect->halfSplitSpeed > HALF_SPLIT_MOVE_MAX_SPEED) ? HALF_SPLIT_MOVE_MAX_SPEED : connect->halfSplitSpeed + 1; } else { connect->halfSplitSpeed = 0; } mc_move_half_split(connect->control, 1 /* right or up */, connect->halfSplitSpeed); break; case 'v': mc_mute_audio(connect->control, -1 /* toggle */); break; case XK_Return: if (mode == MENU_MODE) { mc_select_menu_item_extra(connect->control); } break; case XK_Delete: if (mode == MENU_MODE) { mc_select_menu_item_center(connect->control); } break; case '-': mc_toggle_show_source_name(connect->control); break; case XK_KP_Add: mc_toggle_show_audio_level(connect->control); break; default: break; } }
static void qc_key_pressed(void* data, int key, int modifier) { KeyboardConnect* connect = (KeyboardConnect*)data; long elapsedTime; MediaControlMode mode = mc_get_mode(connect->control); int i; if (mode == MENU_MODE) { switch (key) { case 'q': mc_stop(connect->control); break; case XK_space: mc_pause(connect->control); break; case 'o': mc_next_osd_screen(connect->control); break; case XK_Up: mc_previous_menu_item(connect->control); break; case XK_Down: mc_next_menu_item(connect->control); break; case XK_Return: mc_select_menu_item_extra(connect->control); break; case XK_Left: mc_select_menu_item_left(connect->control); break; case XK_Right: mc_select_menu_item_right(connect->control); break; case XK_Page_Up: for (i = 0; i < 10; i++) { mc_previous_menu_item(connect->control); } break; case XK_Page_Down: for (i = 0; i < 10; i++) { mc_next_menu_item(connect->control); } break; case XK_Delete: mc_select_menu_item_center(connect->control); break; default: break; } } else { switch (key) { case 'j': if (!connect->reverse) { connect->reverse = 1; connect->speedIndex = 0; } else { connect->speedIndex = (connect->speedIndex < NUM_SPEEDS - 1) ? (connect->speedIndex + 1) : connect->speedIndex; } mc_play_speed(connect->control, g_reverseKeyboardSpeed[connect->speedIndex], FRAME_PLAY_UNIT); break; case 'l': if (connect->reverse) { connect->reverse = 0; connect->speedIndex = 0; } else { connect->speedIndex = (connect->speedIndex < NUM_SPEEDS - 1) ? (connect->speedIndex + 1) : connect->speedIndex; } mc_play_speed(connect->control, g_keyboardSpeed[connect->speedIndex], FRAME_PLAY_UNIT); break; case 'k': connect->speedIndex = -1; connect->reverse = 0; mc_pause(connect->control); break; case 'i': mc_toggle_lock(connect->control); break; case 'q': mc_stop(connect->control); break; case XK_space: connect->speedIndex = -1; connect->reverse = 0; mc_toggle_play_pause(connect->control); break; case XK_Right: mc_step(connect->control, 1, FRAME_PLAY_UNIT); break; case XK_Left: mc_step(connect->control, 0, FRAME_PLAY_UNIT); break; case XK_Up: /* 10 frames speed up forwards */ mc_play_speed(connect->control, 10, FRAME_PLAY_UNIT); break; case XK_Down: /* 10 frames speed up backwards */ mc_play_speed(connect->control, -10, FRAME_PLAY_UNIT); break; case XK_Page_Up: /* step 1 minute backwards */ mc_seek(connect->control, -1500, SEEK_CUR, FRAME_PLAY_UNIT); break; case XK_Page_Down: /* step 1 minute forwards */ mc_seek(connect->control, 1500, SEEK_CUR, FRAME_PLAY_UNIT); break; case 'm': mc_mark(connect->control, M0_MARK_TYPE, 1); break; case 'c': /* clear mark except for PSE failures, VTR errors and digibeta dropouts */ mc_clear_mark(connect->control, ALL_MARK_TYPE & ~VTR_ERROR_MARK_TYPE & ~PSE_FAILURE_MARK_TYPE & ~DIGIBETA_DROPOUT_MARK_TYPE); break; case 'b': /* clear all marks except for PSE failures, VTR errors and digibeta dropouts */ mc_clear_all_marks(connect->control, ALL_MARK_TYPE & ~VTR_ERROR_MARK_TYPE & ~PSE_FAILURE_MARK_TYPE & ~DIGIBETA_DROPOUT_MARK_TYPE); break; case ',': mc_seek_prev_mark(connect->control); break; case '.': mc_seek_next_mark(connect->control); break; case '/': mc_seek_clip_mark(connect->control); break; case XK_Home: mc_seek(connect->control, 0, SEEK_SET, FRAME_PLAY_UNIT); break; case XK_End: mc_seek(connect->control, 0, SEEK_END, FRAME_PLAY_UNIT); break; case 'o': mc_next_osd_screen(connect->control); break; case 't': mc_next_osd_timecode(connect->control); break; case '0': mc_switch_video(connect->control, 0); break; case '1': mc_switch_video(connect->control, 1); break; case '2': mc_switch_video(connect->control, 2); break; case '3': mc_switch_video(connect->control, 3); break; case '4': mc_switch_video(connect->control, 4); break; case '5': mc_switch_video(connect->control, 5); break; case '6': mc_switch_video(connect->control, 6); break; case '7': mc_switch_video(connect->control, 7); break; case '8': mc_switch_video(connect->control, 8); break; case '9': mc_switch_video(connect->control, 9); break; case 'a': mc_review_start(connect->control, connect->reviewDuration * 25); break; case 'z': mc_review_end(connect->control, connect->reviewDuration * 25); break; case 'x': mc_review(connect->control, connect->reviewDuration * 25); break; case 's': mc_set_half_split_orientation(connect->control, -1 /* toggle */); break; case 'd': mc_set_half_split_type(connect->control, -1 /* toggle */); break; case 'f': mc_show_half_split(connect->control, -1 /* toggle */); break; case 'g': elapsedTime = get_elapsed_time(&connect->halfSplitMovePressedTime); if (elapsedTime < 100000) { connect->halfSplitSpeed = (connect->halfSplitSpeed > HALF_SPLIT_MOVE_MAX_SPEED) ? HALF_SPLIT_MOVE_MAX_SPEED : connect->halfSplitSpeed + 1; } else { connect->halfSplitSpeed = 0; } mc_move_half_split(connect->control, 0 /* left or down */, connect->halfSplitSpeed); break; case 'h': elapsedTime = get_elapsed_time(&connect->halfSplitMovePressedTime); if (elapsedTime < 100000) { connect->halfSplitSpeed = (connect->halfSplitSpeed > HALF_SPLIT_MOVE_MAX_SPEED) ? HALF_SPLIT_MOVE_MAX_SPEED : connect->halfSplitSpeed + 1; } else { connect->halfSplitSpeed = 0; } mc_move_half_split(connect->control, 1 /* right or up */, connect->halfSplitSpeed); break; case '\'': mc_toggle_show_source_name(connect->control); break; default: break; } } }
static void http_player_control(struct shttpd_arg* arg) { HTTPAccess* access = (HTTPAccess*)arg->user_data; const char* requestURI; char queryValue[64]; int64_t offset = 0; int whence = SEEK_SET; int speed = 1; PlayUnit unit = FRAME_PLAY_UNIT; int forward = 1; int queryOk; int queryValueCount; int pause = 0; float factor; int64_t duration; int toggle = 1; int markType = 0; int64_t position = 0; unsigned int markTypeMask = 0; int vtrErrorLevel = 0; int selection = 0; requestURI = shttpd_get_env(arg, "REQUEST_URI"); if (strcmp("/player/control/play", requestURI) == 0) { mc_play(access->control); } else if (strcmp("/player/control/stop", requestURI) == 0) { mc_stop(access->control); } else if (strcmp("/player/control/pause", requestURI) == 0) { mc_pause(access->control); } else if (strcmp("/player/control/toggle-play-pause", requestURI) == 0) { mc_toggle_play_pause(access->control); } else if (strcmp("/player/control/seek", requestURI) == 0) { queryOk = 1; queryValueCount = 0; if (get_query_value(arg, "offset", queryValue, sizeof(queryValue))) { if (!parse_int64(queryValue, &offset)) { queryOk = 0; } else { queryValueCount++; } } if (get_query_value(arg, "whence", queryValue, sizeof(queryValue))) { queryValueCount++; if (strcmp("SEEK_SET", queryValue) == 0) { whence = SEEK_SET; } else if (strcmp("SEEK_CUR", queryValue) == 0) { whence = SEEK_CUR; } else if (strcmp("SEEK_END", queryValue) == 0) { whence = SEEK_END; } else { queryOk = 0; } } if (get_query_value(arg, "unit", queryValue, sizeof(queryValue))) { queryValueCount++; if (strcmp("FRAME_PLAY_UNIT", queryValue) == 0) { unit = FRAME_PLAY_UNIT; } else if (strcmp("PERCENTAGE_PLAY_UNIT", queryValue) == 0) { unit = PERCENTAGE_PLAY_UNIT; } else { queryOk = 0; } } if (get_query_value(arg, "pause", queryValue, sizeof(queryValue))) { if (strcmp("true", queryValue) == 0) { pause = 1; } } if (queryOk && queryValueCount == 3) { if (pause) { mc_pause(access->control); } mc_seek(access->control, offset, whence, unit); } } else if (strcmp("/player/control/play-speed", requestURI) == 0) { queryOk = 1; queryValueCount = 0; if (get_query_value(arg, "speed", queryValue, sizeof(queryValue))) { queryValueCount++; if ((speed = atoi(queryValue)) == 0) { queryOk = 0; } } if (get_query_value(arg, "unit", queryValue, sizeof(queryValue))) { queryValueCount++; if (strcmp("FRAME_PLAY_UNIT", queryValue) == 0) { unit = FRAME_PLAY_UNIT; } else if (strcmp("PERCENTAGE_PLAY_UNIT", queryValue) == 0) { unit = PERCENTAGE_PLAY_UNIT; } else { queryOk = 0; } } if (queryOk && queryValueCount == 2) { mc_play_speed(access->control, speed, unit); } } else if (strcmp("/player/control/play-speed-factor", requestURI) == 0) { queryOk = 1; queryValueCount = 0; factor = 0.0; if (get_query_value(arg, "factor", queryValue, sizeof(queryValue))) { queryValueCount++; factor = (float)(atof(queryValue)); if (factor == 0.0) { queryOk = 0; } } if (queryOk && queryValueCount == 1) { mc_play_speed_factor(access->control, factor); } } else if (strcmp("/player/control/step", requestURI) == 0) { queryOk = 1; queryValueCount = 0; if (get_query_value(arg, "forward", queryValue, sizeof(queryValue))) { queryValueCount++; if (strcmp("true", queryValue) == 0) { forward = 1; } else if (strcmp("false", queryValue) == 0) { forward = 0; } else { queryOk = 0; } } if (get_query_value(arg, "unit", queryValue, sizeof(queryValue))) { queryValueCount++; if (strcmp("FRAME_PLAY_UNIT", queryValue) == 0) { unit = FRAME_PLAY_UNIT; } else if (strcmp("PERCENTAGE_PLAY_UNIT", queryValue) == 0) { unit = PERCENTAGE_PLAY_UNIT; } else { queryOk = 0; } } if (queryOk && queryValueCount == 2) { mc_step(access->control, forward, unit); } } else if (strcmp("/player/control/home", requestURI) == 0) { if (get_query_value(arg, "pause", queryValue, sizeof(queryValue))) { if (strcmp("true", queryValue) == 0) { mc_pause(access->control); } } mc_seek(access->control, 0, SEEK_SET, FRAME_PLAY_UNIT); } else if (strcmp("/player/control/end", requestURI) == 0) { if (get_query_value(arg, "pause", queryValue, sizeof(queryValue))) { if (strcmp("true", queryValue) == 0) { mc_pause(access->control); } } mc_seek(access->control, 0, SEEK_END, FRAME_PLAY_UNIT); } else if (strcmp("/player/control/prev-mark", requestURI) == 0) { mc_seek_prev_mark(access->control); } else if (strcmp("/player/control/next-mark", requestURI) == 0) { mc_seek_next_mark(access->control); } else if (strcmp("/player/control/clip-mark", requestURI) == 0) { mc_seek_clip_mark(access->control); } else if (strcmp("/player/control/mark-position", requestURI) == 0) { queryOk = 1; queryValueCount = 0; if (get_query_value(arg, "position", queryValue, sizeof(queryValue))) { if (!parse_int64(queryValue, &position) || position < 0) { queryOk = 0; } else { queryValueCount++; } } if (get_query_value(arg, "type", queryValue, sizeof(queryValue))) { queryValueCount++; markType = atoi(queryValue); } if (get_query_value(arg, "toggle", queryValue, sizeof(queryValue))) { queryValueCount++; if (strcmp("true", queryValue) == 0) { toggle = 1; } else if (strcmp("false", queryValue) == 0) { toggle = 0; } else { queryOk = 0; } } if (queryOk && queryValueCount == 3) { mc_mark_position(access->control, position, markType, toggle); } } else if (strcmp("/player/control/clear-mark-position", requestURI) == 0) { queryOk = 1; queryValueCount = 0; if (get_query_value(arg, "position", queryValue, sizeof(queryValue))) { if (!parse_int64(queryValue, &position) || position < 0) { queryOk = 0; } else { queryValueCount++; } } if (get_query_value(arg, "type", queryValue, sizeof(queryValue))) { queryValueCount++; markTypeMask = atoi(queryValue); } if (queryOk && queryValueCount == 2) { mc_clear_mark_position(access->control, position, markTypeMask); } } else if (strcmp("/player/control/next-show-marks", requestURI) == 0) { queryOk = 1; selection = 0; if (get_query_value(arg, "sel", queryValue, sizeof(queryValue))) { if (!parse_int(queryValue, &selection)) { queryOk = 0; } } if (queryOk) { mc_next_show_marks(access->control, selection); } } else if (strcmp("/player/control/set-vtr-error-level", requestURI) == 0) { queryOk = 1; queryValueCount = 0; if (get_query_value(arg, "level", queryValue, sizeof(queryValue))) { if (!parse_int(queryValue, &vtrErrorLevel) || vtrErrorLevel < VTR_NO_ERROR_LEVEL || vtrErrorLevel > VTR_NO_GOOD_LEVEL) { queryOk = 0; } else { queryValueCount++; } } if (queryOk && queryValueCount == 1) { mc_set_vtr_error_level(access->control, (VTRErrorLevel)vtrErrorLevel); } } else if (strcmp("/player/control/next-vtr-error-level", requestURI) == 0) { mc_next_vtr_error_level(access->control); } else if (strcmp("/player/control/next-osd-screen", requestURI) == 0) { mc_next_osd_screen(access->control); } else if (strcmp("/player/control/next-osd-timecode", requestURI) == 0) { mc_next_osd_timecode(access->control); } else if (strcmp("/player/control/review", requestURI) == 0) { queryOk = 1; queryValueCount = 0; if (get_query_value(arg, "duration", queryValue, sizeof(queryValue))) { if (!parse_int64(queryValue, &duration) || duration <= 0) { queryOk = 0; } else { queryValueCount++; } } if (queryOk && queryValueCount == 1) { mc_review(access->control, duration); } } else if (strcmp("/player/control/next-marks-selection", requestURI) == 0) { mc_next_active_mark_selection(access->control); } shttpd_printf(arg, "HTTP/1.1 200 OK\r\n\r\n"); arg->flags |= SHTTPD_END_OF_OUTPUT; }