⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osd.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
    vlc_mutex_lock( lockval.p_address );    p_button = p_osd->p_state->p_visible;    if( p_button )    {        if( !p_button->b_range )            p_button->p_current_state = osd_StateChange( p_button, OSD_BUTTON_UNSELECT );        if( p_button->p_next )            p_osd->p_state->p_visible = p_button->p_next;        else            p_osd->p_state->p_visible = p_osd->p_button;        if( !p_osd->p_state->p_visible->b_range )            p_osd->p_state->p_visible->p_current_state =                osd_StateChange( p_osd->p_state->p_visible, OSD_BUTTON_SELECT );        osd_UpdateState( p_osd->p_state,                p_osd->p_state->p_visible->i_x, p_osd->p_state->p_visible->i_y,                p_osd->p_state->p_visible->p_current_state->i_width,                p_osd->p_state->p_visible->p_current_state->i_height,                p_osd->p_state->p_visible->p_current_state->p_pic );        osd_SetMenuUpdate( p_osd, true );    }#if defined(OSD_MENU_DEBUG)    msg_Dbg( p_osd, "direction right [button %s]", p_osd->p_state->p_visible->psz_action );#endif    vlc_object_release( (vlc_object_t*) p_osd );    vlc_mutex_unlock( lockval.p_address );}void __osd_MenuPrev( vlc_object_t *p_this ){    osd_menu_t *p_osd = NULL;    osd_button_t *p_button = NULL;    vlc_value_t lockval;    p_osd = vlc_object_find( p_this, VLC_OBJECT_OSDMENU, FIND_ANYWHERE );    if( p_osd == NULL )    {        msg_Err( p_this, "osd_MenuPrev failed" );        return;    }    if( osd_isVisible( p_osd ) == false )    {        vlc_object_release( (vlc_object_t*) p_osd );        return;    }    var_Get( p_this->p_libvlc, "osd_mutex", &lockval );    vlc_mutex_lock( lockval.p_address );    p_button = p_osd->p_state->p_visible;    if( p_button )    {        if( !p_button->b_range )            p_button->p_current_state = osd_StateChange( p_button, OSD_BUTTON_UNSELECT );        if( p_button->p_prev )            p_osd->p_state->p_visible = p_button->p_prev;        else            p_osd->p_state->p_visible = p_osd->p_last_button;        if( !p_osd->p_state->p_visible->b_range )            p_osd->p_state->p_visible->p_current_state =                osd_StateChange( p_osd->p_state->p_visible, OSD_BUTTON_SELECT );        osd_UpdateState( p_osd->p_state,                p_osd->p_state->p_visible->i_x, p_osd->p_state->p_visible->i_y,                p_osd->p_state->p_visible->p_current_state->i_width,                p_osd->p_state->p_visible->p_current_state->i_height,                p_osd->p_state->p_visible->p_current_state->p_pic );        osd_SetMenuUpdate( p_osd, true );    }#if defined(OSD_MENU_DEBUG)    msg_Dbg( p_osd, "direction left [button %s]", p_osd->p_state->p_visible->psz_action );#endif    vlc_object_release( (vlc_object_t*) p_osd );    vlc_mutex_unlock( lockval.p_address );}void __osd_MenuUp( vlc_object_t *p_this ){    osd_menu_t *p_osd = NULL;    osd_button_t *p_button = NULL;    vlc_value_t lockval;#if defined(OSD_MENU_DEBUG)    vlc_value_t val;#endif    p_osd = vlc_object_find( p_this, VLC_OBJECT_OSDMENU, FIND_ANYWHERE );    if( p_osd == NULL )    {        msg_Err( p_this, "osd_MenuDown failed" );        return;    }    if( osd_isVisible( p_osd ) == false )    {        vlc_object_release( (vlc_object_t*) p_osd );        return;    }    var_Get( p_this->p_libvlc, "osd_mutex", &lockval );    vlc_mutex_lock( lockval.p_address );    p_button = p_osd->p_state->p_visible;    if( p_button )    {        if( !p_button->b_range )        {            p_button->p_current_state = osd_StateChange( p_button, OSD_BUTTON_SELECT );            if( p_button->p_up )                p_osd->p_state->p_visible = p_button->p_up;        }        if( p_button->b_range && p_osd->p_state->p_visible->b_range )        {            osd_state_t *p_temp = p_osd->p_state->p_visible->p_current_state;            if( p_temp && p_temp->p_next )                p_osd->p_state->p_visible->p_current_state = p_temp->p_next;        }        else if( !p_osd->p_state->p_visible->b_range )        {            p_osd->p_state->p_visible->p_current_state =                osd_StateChange( p_osd->p_state->p_visible, OSD_BUTTON_SELECT );        }        osd_UpdateState( p_osd->p_state,                p_osd->p_state->p_visible->i_x, p_osd->p_state->p_visible->i_y,                p_osd->p_state->p_visible->p_current_state->i_width,                p_osd->p_state->p_visible->p_current_state->i_height,                p_osd->p_state->p_visible->p_current_state->p_pic );        osd_SetMenuUpdate( p_osd, true );        /* If this is a range style action with associated images of only one state,            * then perform "menu select" on every menu navigation            */        if( p_button->b_range )        {            osd_SetKeyPressed( VLC_OBJECT(p_osd->p_libvlc), config_GetInt(p_osd, p_button->psz_action) );#if defined(OSD_MENU_DEBUG)            msg_Dbg( p_osd, "select (%d, %s)", val.i_int, p_button->psz_action );#endif        }    }#if defined(OSD_MENU_DEBUG)    msg_Dbg( p_osd, "direction up [button %s]", p_osd->p_state->p_visible->psz_action );#endif    vlc_object_release( (vlc_object_t*) p_osd );    vlc_mutex_unlock( lockval.p_address );}void __osd_MenuDown( vlc_object_t *p_this ){    osd_menu_t *p_osd = NULL;    osd_button_t *p_button = NULL;    vlc_value_t lockval;#if defined(OSD_MENU_DEBUG)    vlc_value_t val;#endif    p_osd = vlc_object_find( p_this, VLC_OBJECT_OSDMENU, FIND_ANYWHERE );    if( p_osd == NULL )    {        msg_Err( p_this, "osd_MenuDown failed" );        return;    }    if( osd_isVisible( p_osd ) == false )    {        vlc_object_release( (vlc_object_t*) p_osd );        return;    }    var_Get( p_this->p_libvlc, "osd_mutex", &lockval );    vlc_mutex_lock( lockval.p_address );    p_button = p_osd->p_state->p_visible;    if( p_button )    {        if( !p_button->b_range )        {            p_button->p_current_state = osd_StateChange( p_button, OSD_BUTTON_SELECT );            if( p_button->p_down )                p_osd->p_state->p_visible = p_button->p_down;        }        if( p_button->b_range && p_osd->p_state->p_visible->b_range )        {            osd_state_t *p_temp = p_osd->p_state->p_visible->p_current_state;            if( p_temp && p_temp->p_prev )                p_osd->p_state->p_visible->p_current_state = p_temp->p_prev;        }        else if( !p_osd->p_state->p_visible->b_range )        {            p_osd->p_state->p_visible->p_current_state =                osd_StateChange( p_osd->p_state->p_visible, OSD_BUTTON_SELECT );        }        osd_UpdateState( p_osd->p_state,                p_osd->p_state->p_visible->i_x, p_osd->p_state->p_visible->i_y,                p_osd->p_state->p_visible->p_current_state->i_width,                p_osd->p_state->p_visible->p_current_state->i_height,                p_osd->p_state->p_visible->p_current_state->p_pic );        osd_SetMenuUpdate( p_osd, true );        /* If this is a range style action with associated images of only one state,         * then perform "menu select" on every menu navigation         */        if( p_button->b_range )        {            osd_SetKeyPressed( VLC_OBJECT(p_osd->p_libvlc), config_GetInt(p_osd, p_button->psz_action_down) );#if defined(OSD_MENU_DEBUG)            msg_Dbg( p_osd, "select (%d, %s)", val.i_int, p_button->psz_action_down );#endif        }    }#if defined(OSD_MENU_DEBUG)    msg_Dbg( p_osd, "direction down [button %s]", p_osd->p_state->p_visible->psz_action );#endif    vlc_object_release( (vlc_object_t*) p_osd );    vlc_mutex_unlock( lockval.p_address );}static int osd_VolumeStep( vlc_object_t *p_this, int i_volume, int i_steps ){    int i_volume_step = 0;    (void)i_steps;    i_volume_step = config_GetInt( p_this->p_libvlc, "volume-step" );    return (i_volume/i_volume_step);}/** * Display current audio volume bitmap * * The OSD Menu audio volume bar is updated to reflect the new audio volume. Call this function * when the audio volume is updated outside the OSD menu command "menu up", "menu down" or "menu select". */void __osd_Volume( vlc_object_t *p_this ){    osd_menu_t *p_osd = NULL;    osd_button_t *p_button = NULL;    vlc_value_t lockval;    int i_volume = 0;    int i_steps = 0;    p_osd = vlc_object_find( p_this, VLC_OBJECT_OSDMENU, FIND_ANYWHERE );    if( p_osd == NULL )    {        msg_Err( p_this, "OSD menu volume update failed" );        return;    }    if( p_osd->p_state && p_osd->p_state->p_volume )    {        var_Get( p_this->p_libvlc, "osd_mutex", &lockval );        vlc_mutex_lock( lockval.p_address );        p_button = p_osd->p_state->p_volume;        if( p_osd->p_state->p_volume )            p_osd->p_state->p_visible = p_osd->p_state->p_volume;        if( p_button && p_button->b_range )        {            /* Update the volume state images to match the current volume */            i_volume = config_GetInt( p_this, "volume" );            i_steps = osd_VolumeStep( p_this, i_volume, p_button->i_ranges );            p_button->p_current_state = osd_VolumeStateChange( p_button->p_states, i_steps );            osd_UpdateState( p_osd->p_state,                    p_button->i_x, p_button->i_y,                    p_button->p_current_state->i_width,                    p_button->p_current_state->i_height,                    p_button->p_current_state->p_pic );            osd_SetMenuUpdate( p_osd, true );            osd_SetMenuVisible( p_osd, true );        }        vlc_mutex_unlock( lockval.p_address );    }    vlc_object_release( p_osd );}osd_button_t *__osd_ButtonFind( vlc_object_t *p_this, int i_x, int i_y,    int i_window_height, int i_window_width,    int i_scale_width, int i_scale_height ){    osd_menu_t *p_osd;    osd_button_t *p_button;    vlc_value_t lockval;    p_osd = vlc_object_find( p_this, VLC_OBJECT_OSDMENU, FIND_ANYWHERE );    if( p_osd == NULL )    {        msg_Err( p_this, "OSD menu button find failed" );        return NULL;    }    if( osd_isVisible( p_osd ) == false )    {        vlc_object_release( p_osd );        return NULL;    }    var_Get( p_this->p_libvlc, "osd_mutex", &lockval );    vlc_mutex_lock( lockval.p_address );    p_button = p_osd->p_button;    for( ; p_button != NULL; p_button = p_button->p_next )    {        int i_source_video_width  = ( i_window_width  * 1000 ) / i_scale_width;        int i_source_video_height = ( i_window_height * 1000 ) / i_scale_height;        int i_y_offset = p_button->i_y;        int i_x_offset = p_button->i_x;        int i_width = p_button->i_width;        int i_height = p_button->i_height;        if( p_osd->i_position > 0 )        {            int i_inv_scale_y = i_source_video_height;            int i_inv_scale_x = i_source_video_width;            int pi_x = 0;            if( p_osd->i_position & SUBPICTURE_ALIGN_BOTTOM )            {                i_y_offset = i_window_height - p_button->i_height -                    (p_osd->i_y + p_button->i_y) * i_inv_scale_y / 1000;            }            else if ( !(p_osd->i_position & SUBPICTURE_ALIGN_TOP) )            {                i_y_offset = i_window_height / 2 - p_button->i_height / 2;            }            if( p_osd->i_position & SUBPICTURE_ALIGN_RIGHT )            {                i_x_offset = i_window_width - p_button->i_width -                    (pi_x + p_button->i_x)                    * i_inv_scale_x / 1000;            }            else if ( !(p_osd->i_position & SUBPICTURE_ALIGN_LEFT) )            {                i_x_offset = i_window_width / 2 - p_button->i_width / 2;            }            i_width = i_window_width - p_button->i_width - i_inv_scale_x / 1000;            i_height = i_window_height - p_button->i_height - i_inv_scale_y / 1000;        }        // TODO: write for Up / Down case too.        // TODO: handle absolute positioning case        if( ( i_x >= i_x_offset ) && ( i_x <= i_x_offset + i_width ) &&            ( i_y >= i_y_offset ) && ( i_y <= i_y_offset + i_height ) )        {            vlc_object_release( p_osd );            vlc_mutex_unlock( lockval.p_address );            return p_button;        }    }    vlc_object_release( p_osd );    vlc_mutex_unlock( lockval.p_address );    return NULL;}/** * Select the button provided as the new active button */void __osd_ButtonSelect( vlc_object_t *p_this, osd_button_t *p_button ){    osd_menu_t *p_osd;    osd_button_t *p_old;    vlc_value_t lockval;    p_osd = vlc_object_find( p_this, VLC_OBJECT_OSDMENU, FIND_ANYWHERE );    if( p_osd == NULL )    {        msg_Err( p_this, "OSD menu button select failed" );        return;    }    if( osd_isVisible( p_osd ) == false )    {        vlc_object_release( (vlc_object_t*) p_osd );        return;    }    var_Get( p_this->p_libvlc, "osd_mutex", &lockval );    vlc_mutex_lock( lockval.p_address );    p_old = p_osd->p_state->p_visible;    if( p_old )    {        if( !p_old->b_range )            p_old->p_current_state = osd_StateChange( p_old, OSD_BUTTON_UNSELECT );        p_osd->p_state->p_visible = p_button;        if( !p_osd->p_state->p_visible->b_range )            p_osd->p_state->p_visible->p_current_state =                osd_StateChange( p_osd->p_state->p_visible, OSD_BUTTON_SELECT );        osd_UpdateState( p_osd->p_state,                p_osd->p_state->p_visible->i_x, p_osd->p_state->p_visible->i_y,                p_osd->p_state->p_visible->p_current_state->i_width,                p_osd->p_state->p_visible->p_current_state->i_height,                p_osd->p_state->p_visible->p_current_state->p_pic );        osd_SetMenuUpdate( p_osd, true );    }#if defined(OSD_MENU_DEBUG)    msg_Dbg( p_osd, "button selected is [button %s]", p_osd->p_state->p_visible->psz_action );#endif    vlc_object_release( p_osd );    vlc_mutex_unlock( lockval.p_address );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -