intf.c
来自「VLC媒体播放程序」· C语言 代码 · 共 449 行
C
449 行
/***************************************************************************** * intf.c: interface for DVD video manager ***************************************************************************** * Copyright (C) 2002 VideoLAN * $Id: intf.c,v 1.9 2003/10/29 01:33:27 gbazin Exp $ * * Authors: St閜hane Borel <stef@via.ecp.fr> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#include <stdlib.h> /* malloc(), free() */#include <string.h>#include <unistd.h>#include <vlc/vlc.h>#include <vlc/intf.h>#include "stream_control.h"#include "input_ext-intf.h"#include "input_ext-dec.h"#include "vlc_keys.h"#include "dvd.h"/***************************************************************************** * intf_sys_t: description and status of interface *****************************************************************************/struct intf_sys_t{ input_thread_t * p_input; dvd_data_t * p_dvd; vlc_bool_t b_still; vlc_bool_t b_inf_still; mtime_t m_still_time; dvdplay_ctrl_t control; vlc_bool_t b_click, b_move, b_key_pressed;};/***************************************************************************** * Local prototypes. *****************************************************************************/static int InitThread ( intf_thread_t *p_intf );static int MouseEvent ( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );static int KeyEvent ( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );/* Exported functions */static void RunIntf ( intf_thread_t *p_intf );/***************************************************************************** * OpenIntf: initialize dummy interface *****************************************************************************/int E_(OpenIntf) ( vlc_object_t *p_this ){ intf_thread_t *p_intf = (intf_thread_t *)p_this; /* Allocate instance and initialize some members */ p_intf->p_sys = malloc( sizeof( intf_sys_t ) ); if( p_intf->p_sys == NULL ) { return( 1 ); }; p_intf->pf_run = RunIntf; var_AddCallback( p_intf->p_vlc, "key-pressed", KeyEvent, p_intf ); p_intf->p_sys->m_still_time = 0; p_intf->p_sys->b_inf_still = 0; p_intf->p_sys->b_still = 0; return( 0 );}/***************************************************************************** * CloseIntf: destroy dummy interface *****************************************************************************/void E_(CloseIntf) ( vlc_object_t *p_this ){ intf_thread_t *p_intf = (intf_thread_t *)p_this; var_DelCallback( p_intf->p_vlc, "key-pressed", KeyEvent, p_intf ); /* Destroy structure */ free( p_intf->p_sys );}/***************************************************************************** * RunIntf: main loop *****************************************************************************/static void RunIntf( intf_thread_t *p_intf ){ vlc_object_t * p_vout = NULL; mtime_t mtime = 0; mtime_t mlast = 0; if( InitThread( p_intf ) < 0 ) { msg_Err( p_intf, "can't initialize intf" ); return; } msg_Dbg( p_intf, "intf initialized" ); /* Main loop */ while( !p_intf->b_die ) { vlc_mutex_lock( &p_intf->change_lock ); /* * still images */#if 1 if( p_intf->p_sys->b_still && !p_intf->p_sys->b_inf_still ) { if( p_intf->p_sys->m_still_time > 0 ) { /* update remaining still time */ mtime = mdate(); if( mlast ) { p_intf->p_sys->m_still_time -= mtime - mlast; } mlast = mtime; } else { /* still time elasped */ input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PLAY ); p_intf->p_sys->m_still_time = 0; p_intf->p_sys->b_still = 0; mlast = 0; } }#else if( p_intf->p_sys->m_still_time != (mtime_t)(-1) ) { if( p_intf->p_sys->m_still_time ) { mtime = mdate(); if( mlast ) { p_intf->p_sys->m_still_time -= mtime - mlast; } if( !p_intf->p_sys->m_still_time ) { input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PLAY ); } mlast = mtime; } }#endif /* * mouse cursor */ if( p_vout && ( p_intf->p_sys->b_click || p_intf->p_sys->b_move ) ) { vlc_value_t val; int i_activate; var_Get( p_vout, "mouse-x", &val ); p_intf->p_sys->control.mouse.i_x = val.i_int; var_Get( p_vout, "mouse-y", &val ); p_intf->p_sys->control.mouse.i_y = val.i_int; if( p_intf->p_sys->b_click ) { p_intf->p_sys->control.type = DVDCtrlMouseActivate; p_intf->p_sys->b_click = VLC_FALSE; } else { p_intf->p_sys->control.type = DVDCtrlMouseSelect; p_intf->p_sys->b_move = VLC_FALSE; } /* we can safely interact with libdvdplay * with the stream lock */ vlc_mutex_lock( &p_intf->p_sys->p_input->stream.stream_lock ); i_activate = dvdplay_button( p_intf->p_sys->p_dvd->vmg, &p_intf->p_sys->control ); vlc_mutex_unlock( &p_intf->p_sys->p_input->stream.stream_lock ); if( i_activate && p_intf->p_sys->b_still ) { input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PLAY ); p_intf->p_sys->b_still = 0; p_intf->p_sys->b_inf_still = 0; p_intf->p_sys->m_still_time = 0; } } /* * keyboard event */ if( p_intf->p_sys->b_key_pressed ) { vlc_value_t val; int i, i_activate, i_action = -1; struct hotkey *p_hotkeys = p_intf->p_vlc->p_hotkeys; p_intf->p_sys->b_key_pressed = VLC_FALSE; /* Find action triggered by hotkey (if any) */ var_Get( p_intf->p_vlc, "key-pressed", &val ); for( i = 0; p_hotkeys[i].psz_action != NULL; i++ ) { if( p_hotkeys[i].i_key == val.i_int ) { i_action = p_hotkeys[i].i_action; } } if( i_action ) { if( i_action == ACTIONID_NAV_LEFT ) { p_intf->p_sys->control.type = DVDCtrlLeftButtonSelect; } else if( i_action == ACTIONID_NAV_RIGHT ) { p_intf->p_sys->control.type = DVDCtrlRightButtonSelect; } else if( i_action == ACTIONID_NAV_UP ) { p_intf->p_sys->control.type = DVDCtrlUpperButtonSelect; } else if( i_action == ACTIONID_NAV_DOWN ) { p_intf->p_sys->control.type = DVDCtrlLowerButtonSelect; } else if( i_action == ACTIONID_NAV_ACTIVATE ) { p_intf->p_sys->control.type = DVDCtrlButtonActivate; } /* we can safely interact with libdvdplay * with the stream lock */ vlc_mutex_lock( &p_intf->p_sys->p_input->stream.stream_lock ); i_activate = dvdplay_button( p_intf->p_sys->p_dvd->vmg, &p_intf->p_sys->control ); vlc_mutex_unlock( &p_intf->p_sys->p_input->stream.stream_lock ); if( i_activate && p_intf->p_sys->b_still ) { input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PLAY ); p_intf->p_sys->b_still = 0; p_intf->p_sys->b_inf_still = 0; p_intf->p_sys->m_still_time = 0; } } } vlc_mutex_unlock( &p_intf->change_lock ); /* * video output */ if( p_vout && p_vout->b_die ) { var_DelCallback( p_vout, "mouse-moved", MouseEvent, p_intf ); var_DelCallback( p_vout, "mouse-clicked", MouseEvent, p_intf ); vlc_object_release( p_vout ); p_vout = NULL; } if( p_vout == NULL ) { p_vout = vlc_object_find( p_intf->p_sys->p_input, VLC_OBJECT_VOUT, FIND_CHILD ); if( p_vout ) { var_AddCallback( p_vout, "mouse-moved", MouseEvent, p_intf ); var_AddCallback( p_vout, "mouse-clicked", MouseEvent, p_intf ); } } /* Wait a bit */ msleep( INTF_IDLE_SLEEP ); } if( p_vout ) { var_DelCallback( p_vout, "mouse-moved", MouseEvent, p_intf ); var_DelCallback( p_vout, "mouse-clicked", MouseEvent, p_intf ); vlc_object_release( p_vout ); } vlc_object_release( p_intf->p_sys->p_input );}/***************************************************************************** * InitThread: *****************************************************************************/static int InitThread( intf_thread_t * p_intf ){ /* We might need some locking here */ if( !p_intf->b_die ) { input_thread_t * p_input; dvd_data_t * p_dvd; p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_PARENT ); /* Maybe the input just died */ if( p_input == NULL ) { return VLC_EGENERIC; } p_dvd = (dvd_data_t*)p_input->p_access_data; p_dvd->p_intf = p_intf; vlc_mutex_lock( &p_intf->change_lock ); p_intf->p_sys->p_input = p_input; p_intf->p_sys->p_dvd = p_dvd; p_intf->p_sys->b_move = VLC_FALSE; p_intf->p_sys->b_click = VLC_FALSE; p_intf->p_sys->b_key_pressed = VLC_FALSE; vlc_mutex_unlock( &p_intf->change_lock ); return VLC_SUCCESS; } else { return VLC_EGENERIC; }}/***************************************************************************** * MouseEvent: callback for mouse events *****************************************************************************/static int MouseEvent( vlc_object_t *p_this, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data ){ intf_thread_t *p_intf = (intf_thread_t *)p_data; vlc_mutex_lock( &p_intf->change_lock ); if( psz_var[6] == 'c' ) /* "mouse-clicked" */ { p_intf->p_sys->b_click = VLC_TRUE; } else if( psz_var[6] == 'm' ) /* "mouse-moved" */ { p_intf->p_sys->b_move = VLC_TRUE; } vlc_mutex_unlock( &p_intf->change_lock ); return VLC_SUCCESS;}/***************************************************************************** * KeyEvent: callback for keyboard events *****************************************************************************/static int KeyEvent( vlc_object_t *p_this, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data ){ intf_thread_t *p_intf = (intf_thread_t *)p_data; vlc_mutex_lock( &p_intf->change_lock ); p_intf->p_sys->b_key_pressed = VLC_TRUE; vlc_mutex_unlock( &p_intf->change_lock ); return VLC_SUCCESS;}/***************************************************************************** * dvdIntfStillTime: function provided to demux plugin to request * still images *****************************************************************************/int dvdIntfStillTime( intf_thread_t *p_intf, int i_sec ){ vlc_mutex_lock( &p_intf->change_lock );#if 1 if( i_sec == 0xff ) { p_intf->p_sys->b_still = 1; p_intf->p_sys->b_inf_still = 1; } else if( i_sec > 0 ) { p_intf->p_sys->b_still = 1; p_intf->p_sys->m_still_time = 1000000 * i_sec; }#else if( i_sec > 0 ) { if( i_sec == 0xff ) { p_intf->p_sys->m_still_time = (mtime_t)(-1); msg_Warn( p_intf, I64Fd, p_intf->p_sys->m_still_time ); } else { p_intf->p_sys->m_still_time = 1000000 * i_sec; } }#endif vlc_mutex_unlock( &p_intf->change_lock ); return VLC_SUCCESS;}/***************************************************************************** * dvdIntfStillTime: function provided to reset still image *****************************************************************************/int dvdIntfResetStillTime( intf_thread_t *p_intf ){ vlc_mutex_lock( &p_intf->change_lock ); p_intf->p_sys->m_still_time = 0; input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PLAY ); vlc_mutex_unlock( &p_intf->change_lock ); return VLC_SUCCESS;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?