]> git.sesse.net Git - vlc/blobdiff - src/misc/vlm.c
For consistency, remove references to vlc from libvlc
[vlc] / src / misc / vlm.c
index 19bad42aafb6d726aae0acae7899b82e63455aee..b8c5b262b5c8a99d74d62bd056ece8ad2340b7bd 100644 (file)
 /*****************************************************************************
  * Preamble
  *****************************************************************************/
+#include <vlc/vlc.h>
+
+#include <stdio.h>
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <ctype.h>                                              /* tolower() */
 
-#include <vlc/vlc.h>
-
 #ifdef ENABLE_VLM
 
 #include <vlc/intf.h>
@@ -45,9 +46,6 @@
 #include <vlc_vod.h>
 #include <charset.h>
 
-#define FREE( p ) \
-        if( p ) { free( p ); (p) = NULL; }
-
 /*****************************************************************************
  * Local prototypes.
  *****************************************************************************/
@@ -76,8 +74,8 @@ vlm_t *__vlm_New ( vlc_object_t *p_this )
     char *psz_vlmconf;
 
     /* to be sure to avoid multiple creation */
-    var_Create( p_this->p_libvlc, "vlm_mutex", VLC_VAR_MUTEX );
-    var_Get( p_this->p_libvlc, "vlm_mutex", &lockval );
+    var_Create( p_this->p_libvlc_global, "vlm_mutex", VLC_VAR_MUTEX );
+    var_Get( p_this->p_libvlc_global, "vlm_mutex", &lockval );
     vlc_mutex_lock( lockval.p_address );
 
     if( !(p_vlm = vlc_object_find( p_this, VLC_OBJECT_VLM, FIND_ANYWHERE )) )
@@ -89,7 +87,7 @@ vlm_t *__vlm_New ( vlc_object_t *p_this )
             return NULL;
         }
 
-        vlc_mutex_init( p_this->p_vlc, &p_vlm->lock );
+        vlc_mutex_init( p_this->p_libvlc, &p_vlm->lock );
         p_vlm->i_media      = 0;
         p_vlm->media        = NULL;
         p_vlm->i_vod        = 0;
@@ -97,7 +95,7 @@ vlm_t *__vlm_New ( vlc_object_t *p_this )
         p_vlm->schedule     = NULL;
 
         vlc_object_yield( p_vlm );
-        vlc_object_attach( p_vlm, p_this->p_vlc );
+        vlc_object_attach( p_vlm, p_this->p_libvlc );
     }
     vlc_mutex_unlock( lockval.p_address );
 
@@ -141,7 +139,7 @@ void vlm_Delete( vlm_t *p_vlm )
 {
     vlc_value_t lockval;
 
-    var_Get( p_vlm->p_libvlc, "vlm_mutex", &lockval );
+    var_Get( p_vlm->p_libvlc_global, "vlm_mutex", &lockval );
     vlc_mutex_lock( lockval.p_address );
 
     vlc_object_release( p_vlm );
@@ -158,11 +156,11 @@ void vlm_Delete( vlm_t *p_vlm )
     vlc_mutex_destroy( &p_vlm->lock );
 
     while( p_vlm->i_media ) vlm_MediaDelete( p_vlm, p_vlm->media[0], NULL );
-    FREE( p_vlm->media );
+    FREENULL( p_vlm->media );
 
     while( p_vlm->i_schedule ) vlm_ScheduleDelete( p_vlm,
                                                    p_vlm->schedule[0], NULL );
-    FREE( p_vlm->schedule );
+    FREENULL( p_vlm->schedule );
 
     vlc_object_detach( p_vlm );
     vlc_object_destroy( p_vlm );
@@ -833,8 +831,8 @@ static int ExecuteCommand( vlm_t *p_vlm, const char *psz_command,
     }
 
 success:
-    for( i = 0 ; i < i_command ; i++ ) FREE( ppsz_command[i] );
-    FREE( ppsz_command );
+    for( i = 0 ; i < i_command ; i++ ) FREENULL( ppsz_command[i] );
+    FREENULL( ppsz_command );
     *pp_message = p_message;
 
     return VLC_SUCCESS;
@@ -843,8 +841,8 @@ syntax_error:
     p_message = vlm_MessageNew( ppsz_command[0], "Wrong command syntax" );
 
 error:
-    for( i = 0 ; i < i_command ; i++ ) FREE( ppsz_command[i] );
-    FREE( ppsz_command );
+    for( i = 0 ; i < i_command ; i++ ) FREENULL( ppsz_command[i] );
+    FREENULL( ppsz_command );
     *pp_message = p_message;
 
     return VLC_EGENERIC;
@@ -1276,6 +1274,40 @@ int vlm_MediaControl( vlm_t *vlm, vlm_media_t *media, const char *psz_id,
             }
         }
     }
+    else if( !strcmp( psz_command, "rewind" ) )
+    {
+        float f_pos;
+        float f_scale;
+        vlc_value_t val;
+
+        if( psz_args )
+        {
+            f_scale = i18n_atof( psz_args );
+            f_pos = var_GetFloat( p_instance->p_input, "position" );
+            val.f_float = f_pos - (f_scale / 1000.0);
+            if( val.f_float < 0.0 )
+                val.f_float = 0.0;
+            var_Set( p_instance->p_input, "position", val );
+            return VLC_SUCCESS;
+        }
+    }
+    else if( !strcmp( psz_command, "forward" ) )
+    {
+        float f_pos;
+        float f_scale;
+        vlc_value_t val;
+
+        if( psz_args )
+        {
+            f_scale = i18n_atof( psz_args );
+            f_pos = var_GetFloat( p_instance->p_input, "position" );
+            val.f_float = f_pos + (f_scale / 1000.0);
+            if( val.f_float > 1.0 )
+                val.f_float = 1.0;
+            var_Set( p_instance->p_input, "position", val );
+            return VLC_SUCCESS;
+        }
+    }
     else if( !strcmp( psz_command, "stop" ) )
     {
         TAB_REMOVE( media->i_instance, media->instance, p_instance );
@@ -2353,6 +2385,26 @@ int vlm_MediaVodControl( void *p_private, vod_media_t *p_vod_media,
         break;
     }
 
+    case VOD_MEDIA_REWIND:
+    {
+        double f_scale = (double)va_arg( args, double );
+        char psz_scale[50];
+        lldiv_t div = lldiv( f_scale * 10000000, 10000000 );
+        sprintf( psz_scale, I64Fd".%07u", div.quot, (unsigned int) div.rem );
+        i_ret = vlm_MediaControl( vlm, vlm->media[i], psz_id, "rewind", psz_scale );
+        break;
+    }
+
+    case VOD_MEDIA_FORWARD:
+    {
+        double f_scale = (double)va_arg( args, double );
+        char psz_scale[50];
+        lldiv_t div = lldiv( f_scale * 10000000, 10000000 );
+        sprintf( psz_scale, I64Fd".%07u", div.quot, (unsigned int) div.rem );
+        i_ret = vlm_MediaControl( vlm, vlm->media[i], psz_id, "forward", psz_scale );
+        break;
+    }
+
     default:
         break;
     }
@@ -2362,6 +2414,7 @@ int vlm_MediaVodControl( void *p_private, vod_media_t *p_vod_media,
     return i_ret;
 }
 
+
 /*****************************************************************************
  * Manage:
  *****************************************************************************/