X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Fmotion.c;h=4ab6739623a7a97983b02003b4425cb07648d4ff;hb=4ae811b6cc998370a3213ccd746887f630a42040;hp=c7491dee3b6bb4bdd70e54d640754e453b78c54f;hpb=27d483e9ef7a451397d7857251c8d67097661f1d;p=vlc diff --git a/modules/control/motion.c b/modules/control/motion.c index c7491dee3b..4ab6739623 100644 --- a/modules/control/motion.c +++ b/modules/control/motion.c @@ -25,23 +25,32 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include +#include + +#include #include #include +#include #include #ifdef HAVE_UNISTD_H -# include +# include #endif #ifdef __APPLE__ -#include "unimotion.h" +# include "TargetConditionals.h" +# if !TARGET_OS_IPHONE +# define HAVE_MACOS_UNIMOTION +# endif +#endif + +#ifdef HAVE_MACOS_UNIMOTION +# include "unimotion.h" #endif /***************************************************************************** @@ -49,8 +58,9 @@ *****************************************************************************/ struct intf_sys_t { - enum { NO_SENSOR, HDAPS_SENSOR, AMS_SENSOR, UNIMOTION_SENSOR } sensor; -#ifdef __APPLE__ + enum { NO_SENSOR, HDAPS_SENSOR, AMS_SENSOR, APPLESMC_SENSOR, + UNIMOTION_SENSOR } sensor; +#ifdef HAVE_MACOS_UNIMOTION enum sms_hardware unimotion_hw; #endif int i_calibrate; @@ -72,17 +82,20 @@ static int GetOrientation( intf_thread_t *p_intf ); /***************************************************************************** * Module descriptor *****************************************************************************/ -vlc_module_begin(); - set_shortname( _("motion")); - set_category( CAT_INTERFACE ); - set_description( _("motion control interface") ); +vlc_module_begin () + set_shortname( N_("motion")) + set_category( CAT_INTERFACE ) + set_subcategory( SUBCAT_INTERFACE_CONTROL ) + set_description( N_("motion control interface") ) + set_help( N_("Use HDAPS, AMS, APPLESMC or UNIMOTION motion sensors " \ + "to rotate the video") ) - add_bool( "motion-use-rotate", 0, NULL, - USE_ROTATE_TEXT, USE_ROTATE_TEXT, false ); + add_bool( "motion-use-rotate", false, + USE_ROTATE_TEXT, USE_ROTATE_TEXT, false ) - set_capability( "interface", 0 ); - set_callbacks( Open, Close ); -vlc_module_end(); + set_capability( "interface", 0 ) + set_callbacks( Open, Close ) +vlc_module_end () /***************************************************************************** * OpenIntf: initialise interface @@ -91,7 +104,7 @@ int Open ( vlc_object_t *p_this ) { intf_thread_t *p_intf = (intf_thread_t *)p_this; FILE *f; - int i_x, i_y; + int i_x = 0, i_y = 0; p_intf->p_sys = malloc( sizeof( intf_sys_t ) ); if( p_intf->p_sys == NULL ) @@ -105,10 +118,8 @@ int Open ( vlc_object_t *p_this ) f = fopen( "/sys/devices/platform/hdaps/calibrate", "r" ); if( f ) { - i_x = i_y = 0; - fscanf( f, "(%d,%d)", &i_x, &i_y ); + p_intf->p_sys->i_calibrate = fscanf( f, "(%d,%d)", &i_x, &i_y ) == 2 ? i_x: 0; fclose( f ); - p_intf->p_sys->i_calibrate = i_x; p_intf->p_sys->sensor = HDAPS_SENSOR; } else @@ -121,8 +132,24 @@ int Open ( vlc_object_t *p_this ) /* Apple Motion Sensor support */ p_intf->p_sys->sensor = AMS_SENSOR; } -#ifdef __APPLE__ - else if( p_intf->p_sys->unimotion_hw = detect_sms() ) + else if( access( "/sys/devices/applesmc.768/position", R_OK ) == 0 ) + { + /* Apple SMC (newer macbooks) */ + /* Should be factorised with HDAPS */ + f = fopen( "/sys/devices/applesmc.768/calibrate", "r" ); + if( f ) + { + p_intf->p_sys->i_calibrate = fscanf( f, "(%d,%d)", &i_x, &i_y ) == 2 ? i_x: 0; + fclose( f ); + p_intf->p_sys->sensor = APPLESMC_SENSOR; + } + else + { + p_intf->p_sys->sensor = NO_SENSOR; + } + } +#ifdef HAVE_MACOS_UNIMOTION + else if( (p_intf->p_sys->unimotion_hw = detect_sms()) ) p_intf->p_sys->sensor = UNIMOTION_SENSOR; #endif else @@ -133,8 +160,9 @@ int Open ( vlc_object_t *p_this ) p_intf->pf_run = RunIntf; - p_intf->p_sys->b_use_rotate = config_GetInt( p_intf, "motion-use-rotate" ); + p_intf->p_sys->b_use_rotate = var_InheritBool( p_intf, "motion-use-rotate" ); + msg_Dbg( p_intf, "Motion detection correctly loaded" ); return VLC_SUCCESS; } @@ -160,15 +188,16 @@ static void RunIntf( intf_thread_t *p_intf ) int p_oldx[FILTER_LENGTH]; memset( p_oldx, 0, FILTER_LENGTH * sizeof( int ) ); - while( !intf_ShouldDie( p_intf ) ) + for( ;; ) { - vout_thread_t *p_vout; const char *psz_filter, *psz_type; bool b_change = false; /* Wait a bit, get orientation, change filter if necessary */ +#warning FIXME: check once (or less) per picture, not once per interval msleep( INTF_IDLE_SLEEP ); + int canc = vlc_savecancel(); i_x = GetOrientation( p_intf ); i_sum += i_x - p_oldx[i]; p_oldx[i++] = i_x; @@ -190,7 +219,7 @@ static void RunIntf( intf_thread_t *p_intf ) vlc_object_release( p_obj ); } } - continue; + goto loop; } if( i_x < -HIGH_THRESHOLD && i_oldx > -LOW_THRESHOLD ) @@ -213,23 +242,31 @@ static void RunIntf( intf_thread_t *p_intf ) psz_type = "90"; } - if( !b_change ) + if( b_change ) { - continue; - } +#warning FIXME: refactor this plugin as a video filter! + input_thread_t *p_input; - p_vout = (vout_thread_t *) - vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); - if( !p_vout ) - { - continue; - } - - config_PutPsz( p_vout, "transform-type", psz_type ); - var_SetString( p_vout, "vout-filter", psz_filter ); - vlc_object_release( p_vout ); + p_input = playlist_CurrentInput( pl_Get( p_intf ) ); + if( p_input ) + { + vout_thread_t *p_vout; - i_oldx = i_x; + p_vout = input_GetVout( p_input ); + if( p_vout ) + { +#warning FIXME: do not override the permanent configuration! +#warning FIXME: transform-type does not exist anymore + config_PutPsz( p_vout, "transform-type", psz_type ); + var_SetString( p_vout, "video-filter", psz_filter ); + vlc_object_release( p_vout ); + } + vlc_object_release( p_input ); + i_oldx = i_x; + } + } +loop: + vlc_restorecancel( canc ); } } #undef FILTER_LENGTH @@ -242,10 +279,9 @@ static void RunIntf( intf_thread_t *p_intf ) static int GetOrientation( intf_thread_t *p_intf ) { FILE *f; - int i_x, i_y; -#ifdef __APPLE__ - int i_z; -#endif + int i_x = 0, i_y = 0, i_z = 0; + int i_ret; + switch( p_intf->p_sys->sensor ) { case HDAPS_SENSOR: @@ -255,11 +291,13 @@ static int GetOrientation( intf_thread_t *p_intf ) return 0; } - i_x = i_y = 0; - fscanf( f, "(%d,%d)", &i_x, &i_y ); + i_ret = fscanf( f, "(%d,%d)", &i_x, &i_y ); fclose( f ); - return ( i_x - p_intf->p_sys->i_calibrate ) * 10; + if( i_ret < 2 ) + return 0; + else + return ( i_x - p_intf->p_sys->i_calibrate ) * 10; case AMS_SENSOR: f = fopen( "/sys/devices/ams/x", "r" ); @@ -268,11 +306,30 @@ static int GetOrientation( intf_thread_t *p_intf ) return 0; } - fscanf( f, "%d", &i_x); + i_ret = fscanf( f, "%d", &i_x); fclose( f ); - return - i_x * 30; /* FIXME: arbitrary */ -#ifdef __APPLE__ + if( i_ret < 1 ) + return 0; + else + return - i_x * 30; /* FIXME: arbitrary */ + + case APPLESMC_SENSOR: + f = fopen( "/sys/devices/applesmc.768/position", "r" ); + if( !f ) + { + return 0; + } + + i_ret = fscanf( f, "(%d,%d,%d)", &i_x, &i_y, &i_z ); + fclose( f ); + + if( i_ret < 3 ) + return 0; + else + return ( i_x - p_intf->p_sys->i_calibrate ) * 10; + +#ifdef HAVE_MACOS_UNIMOTION case UNIMOTION_SENSOR: if( read_sms_raw( p_intf->p_sys->unimotion_hw, &i_x, &i_y, &i_z ) ) { @@ -288,6 +345,7 @@ static int GetOrientation( intf_thread_t *p_intf ) else return 0; #endif + case NO_SENSOR: default: return 0; }