]> git.sesse.net Git - vlc/commitdiff
- Ported the 0.2.0's channel changing functions
authorHenri Fallon <henri@videolan.org>
Wed, 11 Apr 2001 02:01:24 +0000 (02:01 +0000)
committerHenri Fallon <henri@videolan.org>
Wed, 11 Apr 2001 02:01:24 +0000 (02:01 +0000)
- Cosmetic changes : the word 'vlan' is disappearing
- network_ChannelJoin is still commented out as it's not in sync anymore
  with our channel server. Nitrox should fix this within a week.
- X and Xv output : added autohide cursor as in SDL
- X and Sv : keys 1 to 0 change channel
- SDL : keys F1 to F10 change channel as I was not able to make 1..0 work

include/common.h
include/config.h.in
include/main.h
include/netutils.h
plugins/sdl/vout_sdl.c
plugins/x11/vout_x11.c
plugins/x11/vout_xvideo.c
src/interface/interface.c
src/interface/intf_ctrl.c
src/interface/main.c
src/misc/netutils.c

index 7f90479644cd4ff52538c69627b7cd066718da3d..04b8c86de7d090946435f345530e523dd8dedcc9 100644 (file)
@@ -3,7 +3,7 @@
  * Collection of useful common types and macros definitions
  *****************************************************************************
  * Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: common.h,v 1.29 2001/03/16 22:37:06 massiot Exp $
+ * $Id: common.h,v 1.30 2001/04/11 02:01:24 henri Exp $
  *
  * Authors: Samuel Hocevar <sam@via.ecp.fr>
  *          Vincent Seguin <seguin@via.ecp.fr>
@@ -103,11 +103,11 @@ typedef struct intf_channel_s *         p_intf_channel_t;
 
 /* Input */
 struct input_thread_s;
-struct input_vlan_s;
+struct input_channel_s;
 struct input_cfg_s;
 
 typedef struct input_thread_s *         p_input_thread_t;
-typedef struct input_vlan_s *           p_input_vlan_t;
+typedef struct input_channel_s *        p_input_channel_t;
 typedef struct input_cfg_s *            p_input_cfg_t;
 
 /* Audio */
index 817bb3aca2dbf1b7d66be49365d8a62a04adfc23..6f6177a35ed862ea60fdad0bd19b6efa60746fe2 100644 (file)
 #define INPUT_BROADCAST_DEFAULT         0
 
 /*
- * Vlan method
+ * Channel method
  */
 
 /* Default network interface and environment variable */
 #define INPUT_IFACE_DEFAULT             "eth0"
 
 /* Default server and port */
-#define INPUT_VLAN_SERVER_VAR           "vlc_vlan_server"
-#define INPUT_VLAN_SERVER_DEFAULT       "138.195.139.95"
-#define INPUT_VLAN_PORT_VAR             "vlc_vlan_port"
-#define INPUT_VLAN_PORT_DEFAULT         6010
-
-/* Delay between vlan changes - this is required to avoid flooding the VLAN
- * server */
-#define INPUT_VLAN_CHANGE_DELAY         (mtime_t)(5*CLOCK_FREQ)
+#define INPUT_CHANNEL_SERVER_VAR           "vlc_channel_server"
+#define INPUT_CHANNEL_SERVER_DEFAULT       "138.195.139.95"
+#define INPUT_CHANNEL_PORT_VAR             "vlc_channel_port"
+#define INPUT_CHANNEL_PORT_DEFAULT         6010
+
+/* Delay between channel changes - this is required to avoid flooding the 
+ * channel server */
+#define INPUT_CHANNEL_CHANGE_DELAY         (mtime_t)(5*CLOCK_FREQ)
 
 /* Duration between the time we receive the data packet, and the time we will
  * mark it to be presented */
index d01d6e008623b2d3cf1740d9f5510717c8a600d2..c1806a3620b5259bf5dac63a4aa95f658e31cfe8 100644 (file)
@@ -3,7 +3,7 @@
  * Declaration and extern access to global program object.
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: main.h,v 1.14 2001/03/21 13:42:33 sam Exp $
+ * $Id: main.h,v 1.15 2001/04/11 02:01:24 henri Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *
@@ -47,7 +47,7 @@ typedef struct
     /* Generic settings */
     boolean_t              b_audio;             /* is audio output allowed ? */
     boolean_t              b_video;             /* is video output allowed ? */
-    boolean_t              b_vlans;                 /* are vlans supported ? */
+    boolean_t              b_channels;    /* is channel changing supported ? */
     boolean_t              b_dvd;                              /* DVD mode ? */
 
     /* Unique threads */
@@ -60,7 +60,7 @@ typedef struct
     struct module_bank_s * p_bank;                            /* module bank */
     p_playlist_t           p_playlist;                           /* playlist */
     p_intf_msg_t           p_msg;                 /* messages interface data */
-    p_input_vlan_t         p_vlan;                      /* vlan library data */
+    p_input_channel_t      p_channel;                /* channel library data */
 } main_t;
 
 extern main_t *p_main;
index 123134d8ecd8a365b08a5f45b49a117f53e6b0a4..fe5cfc6d8e0a7fbc1e5dffc1b88fcd6e33bcd990 100644 (file)
@@ -4,7 +4,7 @@
  * modules.
  *****************************************************************************
  * Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: netutils.h,v 1.9 2001/03/21 13:42:33 sam Exp $
+ * $Id: netutils.h,v 1.10 2001/04/11 02:01:24 henri Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Henri Fallon <henri@videolan.org>
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  *****************************************************************************/
 
+/* The channel without stream is 0 */
+#define COMMON_CHANNEL  0
+
 /*****************************************************************************
  * Prototypes
  *****************************************************************************/
 int network_BuildLocalAddr ( struct sockaddr_in *, int, boolean_t ); 
 int network_BuildRemoteAddr( struct sockaddr_in *, char * );
-
+int network_ChannelJoin( int i_channel_id );
+int network_ChannelCreate( void );
index 74e55846cb598b29f37bcdfac7a26c0be460ab13..b0bf0f7514ae21159a93d71ab8630f86f2a1aa34 100644 (file)
@@ -2,7 +2,7 @@
  * vout_sdl.c: SDL video output display method
  *****************************************************************************
  * Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: vout_sdl.c,v 1.46 2001/04/06 09:15:47 sam Exp $
+ * $Id: vout_sdl.c,v 1.47 2001/04/11 02:01:24 henri Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *          Pierre Baillet <oct@zoy.org>
@@ -52,6 +52,7 @@
 /* FIXME: get rid of this */
 #include "keystrokes.h"
 #include "main.h"
+#include "netutils.h"
 
 /*****************************************************************************
  * FIXME: this file is ...                                                   *
@@ -274,7 +275,7 @@ static void vout_Destroy( vout_thread_t *p_vout )
 static int vout_Manage( vout_thread_t *p_vout )
 {
     SDL_Event event;                                            /* SDL event */
-    Uint8     i_key;
+    char *    p_key;
 
     /* Process events */
     while( SDL_PollEvent(&event) )
@@ -326,9 +327,8 @@ static int vout_Manage( vout_thread_t *p_vout )
             break;
 
         case SDL_KEYDOWN:                             /* if a key is pressed */
-            i_key = event.key.keysym.sym;
 
-            switch( i_key )
+            switch( event.key.keysym.sym )
             {
             case SDLK_f:                             /* switch to fullscreen */
                 p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
@@ -357,11 +357,51 @@ static int vout_Manage( vout_thread_t *p_vout )
                 p_vout->b_interface = ! p_vout->b_interface;
                 p_vout->i_changes |= VOUT_INTF_CHANGE;
                 break;
+            
+            case SDLK_F10:
+                network_ChannelJoin( 0 );
+                break;
+            case SDLK_F1:
+                network_ChannelJoin( 1 );
+                break;
+            case SDLK_F2:
+                network_ChannelJoin( 2 );
+                break;
+            case SDLK_F3:
+                network_ChannelJoin( 3 );
+                break;
+            case SDLK_F4:
+                network_ChannelJoin( 4 );
+                break;
+            case SDLK_F5:
+                network_ChannelJoin( 5 );
+                break;
+            case SDLK_F6:
+                network_ChannelJoin( 6 );
+                break;
+            case SDLK_F7:
+                network_ChannelJoin( 7 );
+                break;
+            case SDLK_F8:
+                network_ChannelJoin( 8 );
+                break;
+            case SDLK_F9:
+                network_ChannelJoin( 9 );
+                break;
 
+            case SDLK_MENU:
+                p_main->p_intf->b_menu_change = 1;
+                break;
+                
             default:
-                if( intf_ProcessKey( p_main->p_intf, (char )i_key ) )
+                p_key = SDL_GetKeyName( event.key.keysym.sym ) ;
+                if( intf_ProcessKey( p_main->p_intf, 
+                                     (char )event.key.keysym.sym ) )
                 {
-                   intf_DbgMsg( "unhandled key '%c' (%i)", (char)i_key, i_key );                }
+                   intf_DbgMsg( "unhandled key '%c' (%i)", 
+                                (char)event.key.keysym.sym, 
+                                event.key.keysym.sym );                
+                }
                 break;
             }
             break;
index c8230ebafda9bedd1b1b5db1accbda1f70e5e87e..2fb70f5648a651f6afd3a0b2afede5fc41b849a9 100644 (file)
@@ -2,7 +2,7 @@
  * vout_x11.c: X11 video output display method
  *****************************************************************************
  * Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: vout_x11.c,v 1.17 2001/04/01 06:21:44 sam Exp $
+ * $Id: vout_x11.c,v 1.18 2001/04/11 02:01:24 henri Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -60,6 +60,8 @@
 #include "interface.h"
 #include "intf_msg.h"
 
+#include "netutils.h"                                 /* network_ChannelJoin */
+
 #include "main.h"
 
 /*****************************************************************************
@@ -100,6 +102,9 @@ typedef struct vout_sys_s
     int                 i_ss_blanking;                      /* blanking mode */
     int                 i_ss_exposure;                      /* exposure mode */
 
+    /* Auto-hide cursor */
+    mtime_t     i_lastmoved;
+    
     /* Mouse pointer properties */
     boolean_t           b_mouse;         /* is the mouse pointer displayed ? */
 
@@ -288,6 +293,10 @@ static int vout_Init( vout_thread_t *p_vout )
     p_vout->i_bytes_per_line = p_vout->p_sys->p_ximage[0]->bytes_per_line;
     vout_SetBuffers( p_vout, p_vout->p_sys->p_ximage[ 0 ]->data,
                      p_vout->p_sys->p_ximage[ 1 ]->data );
+
+    /* Set date for autohiding cursor */
+    p_vout->p_sys->i_lastmoved = mdate();
+    
     return( 0 );
 }
 
@@ -352,6 +361,8 @@ static int vout_Manage( vout_thread_t *p_vout )
     XEvent      xevent;                                         /* X11 event */
     boolean_t   b_resized;                        /* window has been resized */
     char        i_key;                                    /* ISO Latin-1 key */
+    KeySym      x_key_symbol;
+
 
     /* Handle X11 events: ConfigureNotify events are parsed to know if the
      * output window's size changed, MapNotify and UnmapNotify to know if the
@@ -360,7 +371,8 @@ static int vout_Manage( vout_thread_t *p_vout )
     b_resized = 0;
     while( XCheckWindowEvent( p_vout->p_sys->p_display, p_vout->p_sys->window,
                               StructureNotifyMask | KeyPressMask |
-                              ButtonPressMask | ButtonReleaseMask, &xevent )
+                              ButtonPressMask | ButtonReleaseMask | 
+                              PointerMotionMask | Button1MotionMask , &xevent )
            == True )
     {
         /* ConfigureNotify event: prepare  */
@@ -394,16 +406,73 @@ static int vout_Manage( vout_thread_t *p_vout )
         /* Keyboard event */
         else if( xevent.type == KeyPress )
         {
-            if( XLookupString( &xevent.xkey, &i_key, 1, NULL, NULL ) )
+            /* We may have keys like F1 trough F12, ESC ... */
+            x_key_symbol = XKeycodeToKeysym( p_vout->p_sys->p_display,
+                                             xevent.xkey.keycode, 0 );
+            switch( x_key_symbol )
             {
-                /* FIXME: handle stuff here */
-                switch( i_key )
-                {
-                case 'q':
-                    /* FIXME: need locking ! */
-                    p_main->p_intf->b_die = 1;
-                    break;
-                }
+                 case XK_Escape:
+                     p_main->p_intf->b_die = 1;
+                     break;
+                 case XK_Menu:
+                     p_main->p_intf->b_menu_change = 1;
+                     break;
+                 default:
+                     /* "Normal Keys"
+                      * The reason why I use this instead of XK_0 is that 
+                      * with XLookupString, we don't have to care about
+                      * keymaps. */
+
+                    if( XLookupString( &xevent.xkey, &i_key, 1, NULL, NULL ) )
+                    {
+                        /* FIXME: handle stuff here */
+                        switch( i_key )
+                        {
+                        case 'q':
+                        case 'Q':
+                            p_main->p_intf->b_die = 1;
+                            break;
+                        case '0':
+                            network_ChannelJoin( 0 );
+                            break;
+                        case '1':
+                            network_ChannelJoin( 1 );
+                            break;
+                        case '2':
+                            network_ChannelJoin( 2 );
+                            break;
+                        case '3':
+                            network_ChannelJoin( 3 );
+                            break;
+                        case '4':
+                            network_ChannelJoin( 4 );
+                            break;
+                        case '5':
+                            network_ChannelJoin( 5 );
+                            break;
+                        case '6':
+                            network_ChannelJoin( 6 );
+                            break;
+                        case '7':
+                            network_ChannelJoin( 7 );
+                            break;
+                        case '8':
+                            network_ChannelJoin( 8 );
+                            break;
+                        case '9':
+                            network_ChannelJoin( 9 );
+                            break;
+                        default:
+                            if( intf_ProcessKey( p_main->p_intf, 
+                                                 (char )i_key ) )
+                            {
+                               intf_DbgMsg( "unhandled key '%c' (%i)", 
+                                            (char)i_key, i_key );
+                            }
+                            break;
+                        }
+                    }
+                break;
             }
         }
         /* Mouse click */
@@ -415,10 +484,6 @@ static int vout_Manage( vout_thread_t *p_vout )
                     /* in this part we will eventually manage
                      * clicks for DVD navigation for instance */
                     break;
-
-                case Button2:
-                    X11TogglePointer( p_vout );
-                    break;
             }
         }
         /* Mouse release */
@@ -432,6 +497,15 @@ static int vout_Manage( vout_thread_t *p_vout )
                     break;
             }
         }
+        /* Mouse move */
+        else if( xevent.type == MotionNotify )
+        {
+            p_vout->p_sys->i_lastmoved = mdate();
+            if( ! p_vout->p_sys->b_mouse )
+            {
+                X11TogglePointer( p_vout ); 
+            }
+        }
 #ifdef DEBUG
         /* Other event */
         else
@@ -519,6 +593,17 @@ static int vout_Manage( vout_thread_t *p_vout )
                   p_vout->i_width, p_vout->i_height);
     }
 
+    /* Autohide Cursour */
+    if( mdate() - p_vout->p_sys->i_lastmoved > 2000000 )
+    {
+        /* Hide the mouse automatically */
+        if( p_vout->p_sys->b_mouse )
+        {
+            X11TogglePointer( p_vout ); 
+        }
+    }
+
+    
     return 0;
 }
 
@@ -693,7 +778,8 @@ static int X11CreateWindow( vout_thread_t *p_vout )
 
     XSelectInput( p_vout->p_sys->p_display, p_vout->p_sys->window,
                   StructureNotifyMask | KeyPressMask |
-                  ButtonPressMask | ButtonReleaseMask );
+                  ButtonPressMask | ButtonReleaseMask | 
+                  PointerMotionMask );
 
     if( XDefaultDepth(p_vout->p_sys->p_display, p_vout->p_sys->i_screen) == 8 )
     {
index 197a9216ce76c7b8e47a7d9d44ffcdda8ca00724..86d2a0755a6cf5fe101c9a8a9e6ad55869bc6d53 100644 (file)
@@ -2,7 +2,7 @@
  * vout_xvideo.c: Xvideo video output display method
  *****************************************************************************
  * Copyright (C) 1998, 1999, 2000, 2001 VideoLAN
- * $Id: vout_xvideo.c,v 1.4 2001/04/08 16:57:47 sam Exp $
+ * $Id: vout_xvideo.c,v 1.5 2001/04/11 02:01:24 henri Exp $
  *
  * Authors: Shane Harper <shanegh@optusnet.com.au>
  *          Vincent Seguin <seguin@via.ecp.fr>
@@ -63,6 +63,8 @@
 #include "interface.h"
 #include "intf_msg.h"
 
+#include "netutils.h"                                 /* network_ChannelJoin */
+
 #include "main.h"
 
 /*****************************************************************************
@@ -105,7 +107,10 @@ typedef struct vout_sys_s
     int                 i_ss_interval;           /* interval between changes */
     int                 i_ss_blanking;                      /* blanking mode */
     int                 i_ss_exposure;                      /* exposure mode */
-
+    
+    /* Auto-hide cursor */
+    mtime_t     i_lastmoved;
+    
     /* Mouse pointer properties */
     boolean_t           b_mouse;         /* is the mouse pointer displayed ? */
 
@@ -331,6 +336,7 @@ static int vout_Manage( vout_thread_t *p_vout )
     XEvent      xevent;                                         /* X11 event */
     boolean_t   b_resized;                        /* window has been resized */
     char        i_key;                                    /* ISO Latin-1 key */
+    KeySym      x_key_symbol;
 
     /* Handle X11 events: ConfigureNotify events are parsed to know if the
      * output window's size changed, MapNotify and UnmapNotify to know if the
@@ -339,7 +345,8 @@ static int vout_Manage( vout_thread_t *p_vout )
     b_resized = 0;
     while( XCheckWindowEvent( p_vout->p_sys->p_display, p_vout->p_sys->window,
                               StructureNotifyMask | KeyPressMask |
-                              ButtonPressMask | ButtonReleaseMask, &xevent )
+                              ButtonPressMask | ButtonReleaseMask | 
+                              PointerMotionMask, &xevent )
            == True )
     {
         /* ConfigureNotify event: prepare  */
@@ -375,16 +382,73 @@ static int vout_Manage( vout_thread_t *p_vout )
         /* Keyboard event */
         else if( xevent.type == KeyPress )
         {
-            if( XLookupString( &xevent.xkey, &i_key, 1, NULL, NULL ) )
+            /* We may have keys like F1 trough F12, ESC ... */
+            x_key_symbol = XKeycodeToKeysym( p_vout->p_sys->p_display,
+                                             xevent.xkey.keycode, 0 );
+            switch( x_key_symbol )
             {
-                /* FIXME: handle stuff here */
-                switch( i_key )
-                {
-                case 'q':
-                    /* FIXME: need locking ! */
-                    p_main->p_intf->b_die = 1;
-                    break;
-                }
+                 case XK_Escape:
+                     p_main->p_intf->b_die = 1;
+                     break;
+                 case XK_Menu:
+                     p_main->p_intf->b_menu_change = 1;
+                     break;
+                 default:
+                     /* "Normal Keys"
+                      * The reason why I use this instead of XK_0 is that 
+                      * with XLookupString, we don't have to care about
+                      * keymaps. */
+
+                    if( XLookupString( &xevent.xkey, &i_key, 1, NULL, NULL ) )
+                    {
+                        /* FIXME: handle stuff here */
+                        switch( i_key )
+                        {
+                        case 'q':
+                        case 'Q':
+                            p_main->p_intf->b_die = 1;
+                            break;
+                        case '0':
+                            network_ChannelJoin( 0 );
+                            break;
+                        case '1':
+                            network_ChannelJoin( 1 );
+                            break;
+                        case '2':
+                            network_ChannelJoin( 2 );
+                            break;
+                        case '3':
+                            network_ChannelJoin( 3 );
+                            break;
+                        case '4':
+                            network_ChannelJoin( 4 );
+                            break;
+                        case '5':
+                            network_ChannelJoin( 5 );
+                            break;
+                        case '6':
+                            network_ChannelJoin( 6 );
+                            break;
+                        case '7':
+                            network_ChannelJoin( 7 );
+                            break;
+                        case '8':
+                            network_ChannelJoin( 8 );
+                            break;
+                        case '9':
+                            network_ChannelJoin( 9 );
+                            break;
+                        default:
+                            if( intf_ProcessKey( p_main->p_intf, 
+                                                 (char )i_key ) )
+                            {
+                               intf_DbgMsg( "unhandled key '%c' (%i)", 
+                                            (char)i_key, i_key );
+                            }
+                            break;
+                        }
+                    }
+                break;
             }
         }
         /* Mouse click */
@@ -396,10 +460,6 @@ static int vout_Manage( vout_thread_t *p_vout )
                     /* in this part we will eventually manage
                      * clicks for DVD navigation for instance */
                     break;
-
-                case Button2:
-                    XVideoTogglePointer( p_vout );
-                    break;
             }
         }
         /* Mouse release */
@@ -413,6 +473,16 @@ static int vout_Manage( vout_thread_t *p_vout )
                     break;
             }
         }
+        /* Mouse move */
+        else if( xevent.type == MotionNotify )
+        {
+            p_vout->p_sys->i_lastmoved = mdate();
+            if( ! p_vout->p_sys->b_mouse )
+            {
+                XVideoTogglePointer( p_vout ); 
+            }
+        }
+        
 #ifdef DEBUG
         /* Other event */
         else
@@ -482,6 +552,16 @@ static int vout_Manage( vout_thread_t *p_vout )
                   p_vout->i_width, p_vout->i_height );
     }
 
+    /* Autohide Cursour */
+    if( mdate() - p_vout->p_sys->i_lastmoved > 2000000 )
+    {
+        /* Hide the mouse automatically */
+        if( p_vout->p_sys->b_mouse )
+        {
+            XVideoTogglePointer( p_vout ); 
+        }
+    }
+    
     return 0;
 }
 
@@ -684,7 +764,8 @@ static int XVideoCreateWindow( vout_thread_t *p_vout )
 
     XSelectInput( p_vout->p_sys->p_display, p_vout->p_sys->window,
                   StructureNotifyMask | KeyPressMask |
-                  ButtonPressMask | ButtonReleaseMask );
+                  ButtonPressMask | ButtonReleaseMask | 
+                  PointerMotionMask );
 
     /* At this stage, the window is open, displayed, and ready to
      * receive data */
index 709f7253bb753a4599c01f2afda2f9cc1fb10732..c23091cef94b9fddce651ac959c67b8a876d8daf 100644 (file)
@@ -4,7 +4,7 @@
  * interface, such as command line.
  *****************************************************************************
  * Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: interface.c,v 1.71 2001/03/21 13:42:34 sam Exp $
+ * $Id: interface.c,v 1.72 2001/04/11 02:01:24 henri Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *
@@ -322,16 +322,18 @@ int intf_ProcessKey( intf_thread_t *p_intf, int g_key )
     keyparm k_reply;
     
     k_reply = intf_GetKey( p_intf, g_key); 
-    
     switch( k_reply.key )
     {
-    case INTF_KEY_QUIT:                                                  /* quit order */
+    case INTF_KEY_QUIT:                                        /* quit order */
         p_intf->b_die = 1;
         break;
     case INTF_KEY_SET_CHANNEL:
         /* Change channel - return code is ignored since SelectChannel displays
          * its own error messages */
-        intf_SelectChannel( p_intf, k_reply.param );
+/*        intf_SelectChannel( p_intf, k_reply.param ); */
+/*        network_ChannelJoin() */
+/* FIXME : keyboard event is for the time being half handled by the interface
+ * half handled directly by the plugins. We should decide what to do. */        
         break;
     case INTF_KEY_INC_VOLUME:                                    /* volume + */
         if( (p_main->p_aout != NULL) && (p_main->p_aout->vol < VOLUME_MAX) )
@@ -380,4 +382,3 @@ int intf_ProcessKey( intf_thread_t *p_intf, int g_key )
 
     return( 0 );
 }
-
index 45f59a3e04442173fe0f3eed6df9a69735d2f4b4..fc1a85682ea00fb6d25532a495569c33219d3113 100644 (file)
@@ -19,7 +19,7 @@
  * More informations about parameters stand in `list of commands' section.
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: intf_ctrl.c,v 1.35 2001/04/06 09:15:47 sam Exp $
+ * $Id: intf_ctrl.c,v 1.36 2001/04/11 02:01:24 henri Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *
@@ -80,7 +80,7 @@ static int SpawnInput           ( int i_argc, intf_arg_t *p_argv );
 #ifdef DEBUG
 static int Test                 ( int i_argc, intf_arg_t *p_argv );
 #endif
-static int Vlan                 ( int i_argc, intf_arg_t *p_argv );
+static int Channel                 ( int i_argc, intf_arg_t *p_argv );
 static int Psi                  ( int i_argc, intf_arg_t *p_argv );
 
 /*
@@ -170,11 +170,12 @@ const intf_command_t control_command[] =
     /* help: */     "Spawn a decoder thread for <pid>. The stream will be" \
     " received by <input>." },
   { "spawn-input", SpawnInput,                                /* spawn-input */
-    /* format: */   "method=i? filename=s? hostname=s? ip=s? port=i? vlan=i?",
+    /* format: */   "method=i? filename=s? hostname=s? ip=s? port=i?"\
+    " channel=i?",
     /* summary: */  "spawn an input thread",
     /* summary: */  "spawn-input [method=<method>]\n" \
     "[filename=<file>|hostname=<hostname>|ip=<ip>]\n" \
-    "[port=<port>] [vlan=<vlan>]",
+    "[port=<port>] [channel=<channel>]",
     /* help: */     "Spawn an input thread. Method is 10, 20, 21, 22, 32, "\
     "hostname is the fully-qualified domain name, ip is a dotted-decimal address." },
 #ifdef DEBUG
@@ -186,16 +187,17 @@ const intf_command_t control_command[] =
     "developpers as an easy way to test part of their code. If you don't know "\
     "what it should do, just try !" },
 #endif
-  { "vlan", Vlan,
+  { "channel", Channel,
     /* format: */   "intf=s? s i? ",
-    /* summary: */  "vlan operations",
-    /* usage: */    "vlan synchro\n" \
-    "vlan [intf=<interface>] request\n" \
-    "vlan [intf=<interface>] join <vlan>\n" \
-    "vlan [intf=<interface>] leave",
-    /* help: */     "Perform various operations on vlans. 'synchro' resynchronize " \
-    "with the server. 'request' ask which is the current vlan (for the default "\
-    "interface or for a given one). 'join' and 'leave' try to change vlan." },
+    /* summary: */  "channel changing operations",
+    /* usage: */    "channel synchro\n" \
+    "channel [intf=<interface>] request\n" \
+    "channel [intf=<interface>] join <channel>\n" \
+    "channel [intf=<interface>] leave",
+    /* help: */     "Perform various operations on channels. 'synchro'"\
+    "resynchronize with the server. 'request' ask which is the current"\
+    "channel (for the default interface or for a given one)."\
+    "'join' and 'leave' try to change channel." },
   { "psi", Psi,
     /* format: */   "i ",
     /* summary: */  "Dump PSI tables",
@@ -529,18 +531,18 @@ static int Test( int i_argc, intf_arg_t *p_argv )
 #endif
 
 /*****************************************************************************
- * Vlan: vlan operations
+ * Channels: channel operations
  *****************************************************************************
- * This function performs various vlan operations.
+ * This function performs various channel operations.
  *****************************************************************************/
-static int Vlan( int i_argc, intf_arg_t *p_argv  )
+static int Channel( int i_argc, intf_arg_t *p_argv  )
 {
     int i_command;                                /* command argument number */
 
-    /* Do not try anything if vlans are deactivated */
-    if( !p_main->b_vlans )
+    /* Do not try anything if channel changing is desactivated */
+    if( !p_main->b_channels )
     {
-        intf_IntfMsg("vlans are deactivated");
+        intf_IntfMsg("channel changing is desactivated");
         return( INTF_OTHER_ERROR );
     }
 
@@ -564,7 +566,7 @@ static int Vlan( int i_argc, intf_arg_t *p_argv  )
     /* Command is unknown */
     else
     {
-        intf_IntfMsg("vlan error: unknown command %s", p_argv[i_command].psz_str );
+        intf_IntfMsg("channel error: unknown command %s", p_argv[i_command].psz_str );
         return( INTF_USAGE_ERROR );
     }
 
index 4e940e61b07b42bb2545adfcbf0c25c79be1c4b0..10ddde6cdf9b56bba994c0aece13f1230111e21e 100644 (file)
@@ -4,7 +4,7 @@
  * and spawn threads.
  *****************************************************************************
  * Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: main.c,v 1.82 2001/04/06 09:15:47 sam Exp $
+ * $Id: main.c,v 1.83 2001/04/11 02:01:24 henri Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -76,6 +76,8 @@
 #include "beos_specific.h"
 #endif
 
+#include "netutils.h"                                 /* network_ChannelJoin */
+
 #include "main.h"
 
 /*****************************************************************************
@@ -97,7 +99,7 @@
 #define OPT_FULLSCREEN          165
 #define OPT_OVERLAY             166
 
-#define OPT_VLANS               170
+#define OPT_CHANNELS            170
 #define OPT_SERVER              171
 #define OPT_PORT                172
 #define OPT_BROADCAST           173
@@ -159,7 +161,7 @@ static const struct option longopts[] =
     
     /* Input options */
     {   "input",            1,          0,      OPT_INPUT },
-    {   "vlans",            0,          0,      OPT_VLANS },
+    {   "channels",         0,          0,      OPT_CHANNELS },
     {   "server",           1,          0,      OPT_SERVER },
     {   "port",             1,          0,      OPT_PORT },
     {   "broadcast",        0,          0,      OPT_BROADCAST },
@@ -293,16 +295,13 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
     /*
      * Initialize shared resources and libraries
      */
-    /* FIXME: no VLANs */
-#if 0
-    if( p_main->b_vlans && input_VlanCreate() )
+    if( p_main->b_channels && network_ChannelCreate() )
     {
-        /* On error during vlans initialization, switch off vlans */
-        intf_Msg( "Virtual LANs initialization failed : "
-                  "vlans management is deactivated" );
-        p_main->b_vlans = 0;
+        /* On error during Channels initialization, switch off channels */
+        intf_Msg( "Channels initialization failed : "
+                  "Channel management is deactivated" );
+        p_main->b_channels = 0;
     }
-#endif
 
     /*
      * Run interface
@@ -379,15 +378,12 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
     }
 
     /*
-     * Free shared resources and libraries
+     * Go back into channel 0 which is the network
      */
-    /* FIXME */
-#if 0
-    if( p_main->b_vlans )
+    if( p_main->b_channels )
     {
-        input_VlanDestroy();
+        network_ChannelJoin( COMMON_CHANNEL );
     }
-#endif
 
     /*
      * Free module bank
@@ -518,9 +514,9 @@ static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
     p_main->ppsz_argv = ppsz_argv;
     p_main->ppsz_env  = ppsz_env;
 
-    p_main->b_audio  = 1;
-    p_main->b_video  = 1;
-    p_main->b_vlans  = 0;
+    p_main->b_audio     = 1;
+    p_main->b_video     = 1;
+    p_main->b_channels  = 0;
 
     p_main->i_warning_level = 4;
 
@@ -651,8 +647,8 @@ static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
         case OPT_INPUT:                                           /* --input */
             main_PutPszVariable( INPUT_METHOD_VAR, optarg );
             break;
-        case OPT_VLANS:                                           /* --vlans */
-            p_main->b_vlans = 1;
+        case OPT_CHANNELS:                                     /* --channels */
+            p_main->b_channels = 1;
             break;
         case OPT_SERVER:                                         /* --server */
             main_PutPszVariable( INPUT_SERVER_VAR, optarg );
@@ -754,7 +750,7 @@ static void Usage( int i_fashion )
           "\n  -s, --dvdsubtitle <channel>    \tchoose DVD subtitle channel"
           "\n"
           "\n      --input                    \tinput method"
-          "\n      --vlans                    \tenable vlans"
+          "\n      --channels                    \tenable channels"
           "\n      --server <host>            \tvideo server address"
           "\n      --port <port>              \tvideo server port"
           "\n      --broadcast                \tlisten to a broadcast"
@@ -809,8 +805,8 @@ static void Usage( int i_fashion )
         "\n  " INPUT_PORT_VAR "=<port>            \tvideo server port"
         "\n  " INPUT_IFACE_VAR "=<interface>          \tnetwork interface"
         "\n  " INPUT_BROADCAST_VAR "={1|0}            \tbroadcast mode"
-        "\n  " INPUT_VLAN_SERVER_VAR "=<hostname>     \tvlan server"
-        "\n  " INPUT_VLAN_PORT_VAR "=<port>           \tvlan server port" );
+        "\n  " INPUT_CHANNEL_SERVER_VAR "=<hostname>     \tchannel server"
+        "\n  " INPUT_CHANNEL_PORT_VAR "=<port>         \tchannel server port" );
 
 }
 
index 7f1cd8e1545484fe9011f14384b3b6ef974dbbca..350d5ba7ba1b1ab54ca6cfa003d542099840c137 100644 (file)
@@ -2,7 +2,7 @@
  * netutils.c: various network functions
  *****************************************************************************
  * Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: netutils.c,v 1.22 2001/03/21 13:42:34 sam Exp $
+ * $Id: netutils.c,v 1.23 2001/04/11 02:01:24 henri Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Benoit Steiner <benny@via.ecp.fr>
@@ -33,6 +33,7 @@
 #include <errno.h>                                                /* errno() */
 #include <string.h>                                      /* bzero(), bcopy() */
 #include <unistd.h>                                         /* gethostname() */
+#include <sys/time.h>                                        /* gettimeofday */
 
 #include <netinet/in.h>                               /* BSD: struct in_addr */
 #include <sys/socket.h>                              /* BSD: struct sockaddr */
 #include <arpa/inet.h>                           /* inet_ntoa(), inet_aton() */
 #endif
 
+#ifdef SYS_LINUX
+#include <sys/ioctl.h>                                            /* ioctl() */
+#endif
+
 #if defined (HAVE_NET_IF_H)
 #include <net/if.h>                            /* interface (arch-dependent) */
 #endif
 #include "common.h"
 #include "mtime.h"
 #include "threads.h"
+#include "main.h"
 
 #include "intf_msg.h"
 
-#if !defined( SYS_BEOS ) && !defined( SYS_NTO )
-
 #include "netutils.h"
 
+
+
 /*****************************************************************************
- * input_BuildLocalAddr : fill a sockaddr_in structure for local binding
+ * input_channel_t: channel library data
+ *****************************************************************************
+ * Store global channel library data.
+ * The part of the code concerning the channel changing process is unstable
+ * as it depends on the VideoLAN channel server, which isn't frozen for
+ * the time being.
+ *****************************************************************************/
+typedef struct input_channel_s
+{
+    int         i_channel_id;                      /* current channel number */
+    mtime_t     last_change;                             /* last change date */
+} input_channel_t;
+
+
+/*****************************************************************************
+ * network_BuildLocalAddr : fill a sockaddr_in structure for local binding
  *****************************************************************************/
 int network_BuildLocalAddr( struct sockaddr_in * p_socket, int i_port, 
                             boolean_t b_broadcast )
@@ -113,7 +134,7 @@ int network_BuildLocalAddr( struct sockaddr_in * p_socket, int i_port,
 }
 
 /*****************************************************************************
- * input_BuildRemoteAddr : fill a sockaddr_in structure for remote host
+ * network_BuildRemoteAddr : fill a sockaddr_in structure for remote host
  *****************************************************************************/
 int network_BuildRemoteAddr( struct sockaddr_in * p_socket, char * psz_server )
 {
@@ -147,5 +168,223 @@ int network_BuildRemoteAddr( struct sockaddr_in * p_socket, char * psz_server )
     }
     return( 0 );
 }
-#endif
 
+/*****************************************************************************
+ * network_ChannelCreate: initialize global channel method data
+ *****************************************************************************
+ * Initialize channel input method global data. This function should be called
+ * once before any input thread is created or any call to other 
+ * input_Channel*() function is attempted.
+ *****************************************************************************/
+int network_ChannelCreate( void )
+{
+/* Even when BSD are supported, BeOS is not likely to be supported, so 
+ * I prefer to put it apart */    
+#ifdef SYS_BEOS
+    intf_ErrMsg( "error: channel changing is not yet supported under BeOS" );
+    return( 1 );
+#else
+/* FIXME : channels handling only work for linux */
+#ifdef SYS_LINUX
+    /* Allocate structure */
+    p_main->p_channel = malloc( sizeof( input_channel_t ) );
+    if( p_main->p_channel == NULL )
+    {
+        intf_ErrMsg("error: %s\n", strerror(ENOMEM));
+        return( -1 );
+    }
+
+    /* Initialize structure */
+    p_main->p_channel->i_channel_id   = 0;
+    p_main->p_channel->last_change = 0;
+
+    intf_Msg("Channels initialized\n");
+    return( 0 );
+#else
+    intf_ErrMsg( "error : channel changing only works with linux yest" );
+#endif /* SYS_LINUX */   
+#endif /* SYS_BEOS */
+}
+
+/*****************************************************************************
+ * network_ChannelJoin: join a channel
+ *****************************************************************************
+ * This function will try to join a channel. If the relevant interface is 
+ * already on the good channel, nothing will be done. Else, and if possible 
+ * (if the interface is not locked), the channel server will be contacted 
+ * and a change will be requested. The function will block until the change 
+ * is effective. Note that once a channel is no more used, it's interface 
+ * should be unlocked using input_ChannelLeave().
+ * Non 0 will be returned in case of error.
+ *****************************************************************************/
+int network_ChannelJoin( int i_channel_id )
+{
+    intf_ErrMsg("Changing to channel %d",i_channel_id);
+    return(0);
+/* Courtesy of Nitrox. He'll update it soon */
+#if 0
+/* I still prefer to put BeOS a bit apart */    
+#ifdef SYS_BEOS
+    intf_ErrMsg( "Channels are not yet supported uunder BeOS" );
+    return( -1 );
+#else
+#ifdef SYS_LINUX    
+    int                 socket_cl;
+    int                 fromlen;
+    struct ifreq        interface;
+    struct sockaddr_in  sa_server;
+    struct sockaddr_in  sa_client;
+    unsigned int        version = 12;
+    char                mess[80];
+    char                mess_length = 80;
+    struct timeval     *date_cl;
+    struct timeval      time;
+    long unsigned int   date;
+    int                 nbanswer;
+    char                answer;
+    fd_set              rfds;
+    unsigned int       rc;
+/* debug */ intf_ErrMsg("ChannelJoin : %d",i_channel_id);
+    /* If last change is too recent, wait a while */
+    if( mdate() - p_main->p_channel->last_change < INPUT_CHANNEL_CHANGE_DELAY )
+    {
+        intf_Msg("Waiting before changing channel...\n");
+        mwait( p_main->p_channel->last_change + INPUT_CHANNEL_CHANGE_DELAY );
+    }
+    p_main->p_channel->last_change = mdate();
+    p_main->p_channel->i_channel_id = i_channel_id;
+
+    intf_Msg("Joining channel %d\n", i_channel_id );
+
+    /*      
+     * Looking for information about the eth0 interface
+     */
+    interface.ifr_addr.sa_family=AF_INET;
+    strcpy(interface.ifr_name,INPUT_IFACE_DEFAULT);
+    
+    
+    /*
+     * Initialysing the socket
+     */
+    socket_cl=socket(AF_INET,SOCK_DGRAM,0);
+
+    
+    /* 
+     * Getting the server's information 
+     */
+    bzero(&sa_server,sizeof(struct sockaddr_in));
+    sa_server.sin_family=AF_INET;
+    sa_server.sin_port=htons(INPUT_CHANNEL_PORT_DEFAULT);
+    inet_aton(INPUT_CHANNEL_SERVER_DEFAULT,&(sa_server.sin_addr));
+    
+    /*
+     * Looking for the interface MAC address
+     */
+    ioctl(socket_cl,SIOCGIFHWADDR,&interface);
+    intf_DbgMsg(
+        "CHANNELSERVER: macaddr == %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
+        interface.ifr_hwaddr.sa_data[0] & 0xff,
+        interface.ifr_hwaddr.sa_data[1] & 0xff,
+        interface.ifr_hwaddr.sa_data[2] & 0xff,
+        interface.ifr_hwaddr.sa_data[3] & 0xff,
+        interface.ifr_hwaddr.sa_data[4] & 0xff,
+        interface.ifr_hwaddr.sa_data[5] & 0xff);
+    
+    /*
+     * Getting date of the client
+     */
+    date_cl=malloc(sizeof(struct timeval));
+    if(date_cl==NULL)
+    {
+        intf_ErrMsg("CHANNELSERVER: unable to allocate memory\n");
+    /*    return VS_R_MEMORY;*/
+        return -1;
+    }
+    
+    if (gettimeofday(date_cl,0)==-1)
+        return -1;
+    date=date_cl->tv_sec;
+    free(date_cl);
+    intf_DbgMsg("CHANNELSERVER: date %lu\n",date);
+
+
+    /* 
+     * Build of the message
+     */
+    sprintf(mess,"%d %u %lu %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x \n",
+          i_channel_id, version, date,
+        interface.ifr_hwaddr.sa_data[0] & 0xff, 
+        interface.ifr_hwaddr.sa_data[1] & 0xff,
+        interface.ifr_hwaddr.sa_data[2] & 0xff,
+        interface.ifr_hwaddr.sa_data[3] & 0xff,
+        interface.ifr_hwaddr.sa_data[4] & 0xff,
+        interface.ifr_hwaddr.sa_data[5] & 0xff);
+    intf_DbgMsg("CHANNELSERVER: The message is %s\n",mess);
+
+
+    /*
+     * Open the socket 2
+     */
+    bzero(&sa_client,sizeof(struct sockaddr_in));
+    sa_client.sin_family=AF_INET;
+    sa_client.sin_port=htons(4312);
+    sa_client.sin_addr.s_addr=INADDR_ANY;
+    fromlen=sizeof(struct sockaddr);
+    rc=bind(socket_cl,(struct sockaddr *)(&sa_client),sizeof(struct sockaddr));
+    if (rc)
+    {
+        intf_ErrMsg("CHANNELSERVER: Unable to bind socket:%u\n",rc); 
+    /* TODO put CS_R_BIND in types.h*/
+    /*    return CS_R_SOCKET;*/
+        return -1;
+    }
+
+
+    /*
+     * Send the message
+     */
+    sendto(socket_cl,mess,mess_length,0,(struct sockaddr *)(&sa_server),\
+           sizeof(struct sockaddr));
+   
+     /*
+     * Waiting 5 sec for one answer from the server
+     */
+    time.tv_sec=5;
+    time.tv_usec=0;
+    FD_ZERO(&rfds);
+    FD_SET(socket_cl,&rfds);
+    nbanswer=select(socket_cl+1,&rfds,NULL,NULL,&time);
+    if(nbanswer==0)
+        intf_DbgMsg("CHANNELSERVER: no answer\n");
+    else if(nbanswer==-1)
+        intf_DbgMsg("CHANNELSERVER: Unable to receive the answer\n");
+    else
+    {
+        recvfrom(socket_cl,&answer,sizeof(char),0,\
+                 (struct sockaddr *)(&sa_client),&fromlen);
+        intf_DbgMsg("CHANNELSERVER: the answer : %hhd\n",answer);
+        if(answer==-1)
+            intf_DbgMsg(
+                    "CHANNELSERVER: The server failed to create the thread\n");
+        else if(answer==0)
+            intf_DbgMsg(
+                    "CHANNELSERVER: The server tries to change the channel\n");
+        else
+            intf_DbgMsg("CHANNELSERVER: Unknown answer !\n");
+    }
+    
+    /*
+     * Close the socket
+     */
+    close(socket_cl);
+
+    return 0;
+#else /* SYS_LINUX */
+    intf_ErrMsg( "Channel only work under linux yet" );
+#endif /* SYS_LINUX */    
+    
+}
+#endif /* SYS_BEOS */
+#endif /* if 0 */
+}