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;
        }
    }
}
Example #3
0
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;
}