Commit d69ab00d authored by Henri Fallon's avatar Henri Fallon

- Ported the 0.2.0's channel changing functions
- 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
parent b3d7d241
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* Collection of useful common types and macros definitions * Collection of useful common types and macros definitions
***************************************************************************** *****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN * 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> * Authors: Samuel Hocevar <sam@via.ecp.fr>
* Vincent Seguin <seguin@via.ecp.fr> * Vincent Seguin <seguin@via.ecp.fr>
...@@ -103,11 +103,11 @@ typedef struct intf_channel_s * p_intf_channel_t; ...@@ -103,11 +103,11 @@ typedef struct intf_channel_s * p_intf_channel_t;
/* Input */ /* Input */
struct input_thread_s; struct input_thread_s;
struct input_vlan_s; struct input_channel_s;
struct input_cfg_s; struct input_cfg_s;
typedef struct input_thread_s * p_input_thread_t; 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; typedef struct input_cfg_s * p_input_cfg_t;
/* Audio */ /* Audio */
......
...@@ -190,7 +190,7 @@ ...@@ -190,7 +190,7 @@
#define INPUT_BROADCAST_DEFAULT 0 #define INPUT_BROADCAST_DEFAULT 0
/* /*
* Vlan method * Channel method
*/ */
/* Default network interface and environment variable */ /* Default network interface and environment variable */
...@@ -198,14 +198,14 @@ ...@@ -198,14 +198,14 @@
#define INPUT_IFACE_DEFAULT "eth0" #define INPUT_IFACE_DEFAULT "eth0"
/* Default server and port */ /* Default server and port */
#define INPUT_VLAN_SERVER_VAR "vlc_vlan_server" #define INPUT_CHANNEL_SERVER_VAR "vlc_channel_server"
#define INPUT_VLAN_SERVER_DEFAULT "138.195.139.95" #define INPUT_CHANNEL_SERVER_DEFAULT "138.195.139.95"
#define INPUT_VLAN_PORT_VAR "vlc_vlan_port" #define INPUT_CHANNEL_PORT_VAR "vlc_channel_port"
#define INPUT_VLAN_PORT_DEFAULT 6010 #define INPUT_CHANNEL_PORT_DEFAULT 6010
/* Delay between vlan changes - this is required to avoid flooding the VLAN /* Delay between channel changes - this is required to avoid flooding the
* server */ * channel server */
#define INPUT_VLAN_CHANGE_DELAY (mtime_t)(5*CLOCK_FREQ) #define INPUT_CHANNEL_CHANGE_DELAY (mtime_t)(5*CLOCK_FREQ)
/* Duration between the time we receive the data packet, and the time we will /* Duration between the time we receive the data packet, and the time we will
* mark it to be presented */ * mark it to be presented */
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* Declaration and extern access to global program object. * Declaration and extern access to global program object.
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * 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> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* *
...@@ -47,7 +47,7 @@ typedef struct ...@@ -47,7 +47,7 @@ typedef struct
/* Generic settings */ /* Generic settings */
boolean_t b_audio; /* is audio output allowed ? */ boolean_t b_audio; /* is audio output allowed ? */
boolean_t b_video; /* is video 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 ? */ boolean_t b_dvd; /* DVD mode ? */
/* Unique threads */ /* Unique threads */
...@@ -60,7 +60,7 @@ typedef struct ...@@ -60,7 +60,7 @@ typedef struct
struct module_bank_s * p_bank; /* module bank */ struct module_bank_s * p_bank; /* module bank */
p_playlist_t p_playlist; /* playlist */ p_playlist_t p_playlist; /* playlist */
p_intf_msg_t p_msg; /* messages interface data */ 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; } main_t;
extern main_t *p_main; extern main_t *p_main;
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* modules. * modules.
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN * 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> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* Henri Fallon <henri@videolan.org> * Henri Fallon <henri@videolan.org>
...@@ -24,9 +24,13 @@ ...@@ -24,9 +24,13 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/ *****************************************************************************/
/* The channel without stream is 0 */
#define COMMON_CHANNEL 0
/***************************************************************************** /*****************************************************************************
* Prototypes * Prototypes
*****************************************************************************/ *****************************************************************************/
int network_BuildLocalAddr ( struct sockaddr_in *, int, boolean_t ); int network_BuildLocalAddr ( struct sockaddr_in *, int, boolean_t );
int network_BuildRemoteAddr( struct sockaddr_in *, char * ); int network_BuildRemoteAddr( struct sockaddr_in *, char * );
int network_ChannelJoin( int i_channel_id );
int network_ChannelCreate( void );
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* vout_sdl.c: SDL video output display method * vout_sdl.c: SDL video output display method
***************************************************************************** *****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN * 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> * Authors: Samuel Hocevar <sam@zoy.org>
* Pierre Baillet <oct@zoy.org> * Pierre Baillet <oct@zoy.org>
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
/* FIXME: get rid of this */ /* FIXME: get rid of this */
#include "keystrokes.h" #include "keystrokes.h"
#include "main.h" #include "main.h"
#include "netutils.h"
/***************************************************************************** /*****************************************************************************
* FIXME: this file is ... * * FIXME: this file is ... *
...@@ -274,7 +275,7 @@ static void vout_Destroy( vout_thread_t *p_vout ) ...@@ -274,7 +275,7 @@ static void vout_Destroy( vout_thread_t *p_vout )
static int vout_Manage( vout_thread_t *p_vout ) static int vout_Manage( vout_thread_t *p_vout )
{ {
SDL_Event event; /* SDL event */ SDL_Event event; /* SDL event */
Uint8 i_key; char * p_key;
/* Process events */ /* Process events */
while( SDL_PollEvent(&event) ) while( SDL_PollEvent(&event) )
...@@ -326,9 +327,8 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -326,9 +327,8 @@ static int vout_Manage( vout_thread_t *p_vout )
break; break;
case SDL_KEYDOWN: /* if a key is pressed */ 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 */ case SDLK_f: /* switch to fullscreen */
p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE; p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
...@@ -357,11 +357,51 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -357,11 +357,51 @@ static int vout_Manage( vout_thread_t *p_vout )
p_vout->b_interface = ! p_vout->b_interface; p_vout->b_interface = ! p_vout->b_interface;
p_vout->i_changes |= VOUT_INTF_CHANGE; p_vout->i_changes |= VOUT_INTF_CHANGE;
break; 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: 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;
} }
break; break;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* vout_x11.c: X11 video output display method * vout_x11.c: X11 video output display method
***************************************************************************** *****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN * 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> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org> * Samuel Hocevar <sam@zoy.org>
...@@ -60,6 +60,8 @@ ...@@ -60,6 +60,8 @@
#include "interface.h" #include "interface.h"
#include "intf_msg.h" #include "intf_msg.h"
#include "netutils.h" /* network_ChannelJoin */
#include "main.h" #include "main.h"
/***************************************************************************** /*****************************************************************************
...@@ -100,6 +102,9 @@ typedef struct vout_sys_s ...@@ -100,6 +102,9 @@ typedef struct vout_sys_s
int i_ss_blanking; /* blanking mode */ int i_ss_blanking; /* blanking mode */
int i_ss_exposure; /* exposure mode */ int i_ss_exposure; /* exposure mode */
/* Auto-hide cursor */
mtime_t i_lastmoved;
/* Mouse pointer properties */ /* Mouse pointer properties */
boolean_t b_mouse; /* is the mouse pointer displayed ? */ boolean_t b_mouse; /* is the mouse pointer displayed ? */
...@@ -288,6 +293,10 @@ static int vout_Init( vout_thread_t *p_vout ) ...@@ -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; 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, vout_SetBuffers( p_vout, p_vout->p_sys->p_ximage[ 0 ]->data,
p_vout->p_sys->p_ximage[ 1 ]->data ); p_vout->p_sys->p_ximage[ 1 ]->data );
/* Set date for autohiding cursor */
p_vout->p_sys->i_lastmoved = mdate();
return( 0 ); return( 0 );
} }
...@@ -352,6 +361,8 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -352,6 +361,8 @@ static int vout_Manage( vout_thread_t *p_vout )
XEvent xevent; /* X11 event */ XEvent xevent; /* X11 event */
boolean_t b_resized; /* window has been resized */ boolean_t b_resized; /* window has been resized */
char i_key; /* ISO Latin-1 key */ char i_key; /* ISO Latin-1 key */
KeySym x_key_symbol;
/* Handle X11 events: ConfigureNotify events are parsed to know if the /* Handle X11 events: ConfigureNotify events are parsed to know if the
* output window's size changed, MapNotify and UnmapNotify 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 ) ...@@ -360,7 +371,8 @@ static int vout_Manage( vout_thread_t *p_vout )
b_resized = 0; b_resized = 0;
while( XCheckWindowEvent( p_vout->p_sys->p_display, p_vout->p_sys->window, while( XCheckWindowEvent( p_vout->p_sys->p_display, p_vout->p_sys->window,
StructureNotifyMask | KeyPressMask | StructureNotifyMask | KeyPressMask |
ButtonPressMask | ButtonReleaseMask, &xevent ) ButtonPressMask | ButtonReleaseMask |
PointerMotionMask | Button1MotionMask , &xevent )
== True ) == True )
{ {
/* ConfigureNotify event: prepare */ /* ConfigureNotify event: prepare */
...@@ -394,16 +406,73 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -394,16 +406,73 @@ static int vout_Manage( vout_thread_t *p_vout )
/* Keyboard event */ /* Keyboard event */
else if( xevent.type == KeyPress ) 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 */ case XK_Escape:
switch( i_key ) p_main->p_intf->b_die = 1;
{ break;
case 'q': case XK_Menu:
/* FIXME: need locking ! */ p_main->p_intf->b_menu_change = 1;
p_main->p_intf->b_die = 1; break;
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 */ /* Mouse click */
...@@ -415,10 +484,6 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -415,10 +484,6 @@ static int vout_Manage( vout_thread_t *p_vout )
/* in this part we will eventually manage /* in this part we will eventually manage
* clicks for DVD navigation for instance */ * clicks for DVD navigation for instance */
break; break;
case Button2:
X11TogglePointer( p_vout );
break;
} }
} }
/* Mouse release */ /* Mouse release */
...@@ -432,6 +497,15 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -432,6 +497,15 @@ static int vout_Manage( vout_thread_t *p_vout )
break; 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 #ifdef DEBUG
/* Other event */ /* Other event */
else else
...@@ -519,6 +593,17 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -519,6 +593,17 @@ static int vout_Manage( vout_thread_t *p_vout )
p_vout->i_width, p_vout->i_height); 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; return 0;
} }
...@@ -693,7 +778,8 @@ static int X11CreateWindow( vout_thread_t *p_vout ) ...@@ -693,7 +778,8 @@ static int X11CreateWindow( vout_thread_t *p_vout )
XSelectInput( p_vout->p_sys->p_display, p_vout->p_sys->window, XSelectInput( p_vout->p_sys->p_display, p_vout->p_sys->window,
StructureNotifyMask | KeyPressMask | StructureNotifyMask | KeyPressMask |
ButtonPressMask | ButtonReleaseMask ); ButtonPressMask | ButtonReleaseMask |
PointerMotionMask );
if( XDefaultDepth(p_vout->p_sys->p_display, p_vout->p_sys->i_screen) == 8 ) if( XDefaultDepth(p_vout->p_sys->p_display, p_vout->p_sys->i_screen) == 8 )
{ {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* vout_xvideo.c: Xvideo video output display method * vout_xvideo.c: Xvideo video output display method
***************************************************************************** *****************************************************************************
* Copyright (C) 1998, 1999, 2000, 2001 VideoLAN * 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> * Authors: Shane Harper <shanegh@optusnet.com.au>
* Vincent Seguin <seguin@via.ecp.fr> * Vincent Seguin <seguin@via.ecp.fr>
...@@ -63,6 +63,8 @@ ...@@ -63,6 +63,8 @@
#include "interface.h" #include "interface.h"
#include "intf_msg.h" #include "intf_msg.h"
#include "netutils.h" /* network_ChannelJoin */
#include "main.h" #include "main.h"
/***************************************************************************** /*****************************************************************************
...@@ -105,7 +107,10 @@ typedef struct vout_sys_s ...@@ -105,7 +107,10 @@ typedef struct vout_sys_s
int i_ss_interval; /* interval between changes */ int i_ss_interval; /* interval between changes */
int i_ss_blanking; /* blanking mode */ int i_ss_blanking; /* blanking mode */
int i_ss_exposure; /* exposure mode */ int i_ss_exposure; /* exposure mode */
/* Auto-hide cursor */
mtime_t i_lastmoved;
/* Mouse pointer properties */ /* Mouse pointer properties */
boolean_t b_mouse; /* is the mouse pointer displayed ? */ boolean_t b_mouse; /* is the mouse pointer displayed ? */
...@@ -331,6 +336,7 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -331,6 +336,7 @@ static int vout_Manage( vout_thread_t *p_vout )
XEvent xevent; /* X11 event */ XEvent xevent; /* X11 event */
boolean_t b_resized; /* window has been resized */ boolean_t b_resized; /* window has been resized */
char i_key; /* ISO Latin-1 key */ char i_key; /* ISO Latin-1 key */
KeySym x_key_symbol;
/* Handle X11 events: ConfigureNotify events are parsed to know if the /* Handle X11 events: ConfigureNotify events are parsed to know if the
* output window's size changed, MapNotify and UnmapNotify 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 ) ...@@ -339,7 +345,8 @@ static int vout_Manage( vout_thread_t *p_vout )
b_resized = 0; b_resized = 0;
while( XCheckWindowEvent( p_vout->p_sys->p_display, p_vout->p_sys->window, while( XCheckWindowEvent( p_vout->p_sys->p_display, p_vout->p_sys->window,
StructureNotifyMask | KeyPressMask | StructureNotifyMask | KeyPressMask |
ButtonPressMask | ButtonReleaseMask, &xevent ) ButtonPressMask | ButtonReleaseMask |
PointerMotionMask, &xevent )
== True ) == True )
{ {
/* ConfigureNotify event: prepare */ /* ConfigureNotify event: prepare */
...@@ -375,16 +382,73 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -375,16 +382,73 @@ static int vout_Manage( vout_thread_t *p_vout )
/* Keyboard event */ /* Keyboard event */
else if( xevent.type == KeyPress ) 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 */ case XK_Escape:
switch( i_key ) p_main->p_intf->b_die = 1;
{ break;
case 'q': case XK_Menu:
/* FIXME: need locking ! */ p_main->p_intf->b_menu_change = 1;
p_main->p_intf->b_die = 1; break;
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 */ /* Mouse click */
...@@ -396,10 +460,6 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -396,10 +460,6 @@ static int vout_Manage( vout_thread_t *p_vout )
/* in this part we will eventually manage /* in this part we will eventually manage
* clicks for DVD navigation for instance */ * clicks for DVD navigation for instance */
break; break;
case Button2:
XVideoTogglePointer( p_vout );
break;
} }
} }
/* Mouse release */ /* Mouse release */
...@@ -413,6 +473,16 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -413,6 +473,16 @@ static int vout_Manage( vout_thread_t *p_vout )
break; 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 #ifdef DEBUG
/* Other event */ /* Other event */
else else
...@@ -482,6 +552,16 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -482,6 +552,16 @@ static int vout_Manage( vout_thread_t *p_vout )
p_vout->i_width, p_vout->i_height ); 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; return 0;
} }
...@@ -684,7 +764,8 @@ static int XVideoCreateWindow( vout_thread_t *p_vout ) ...@@ -684,7 +764,8 @@ static int XVideoCreateWindow( vout_thread_t *p_vout )
XSelectInput( p_vout->p_sys->p_display, p_vout->p_sys->window, XSelectInput( p_vout->p_sys->p_display, p_vout->p_sys->window,
StructureNotifyMask | KeyPressMask | StructureNotifyMask | KeyPressMask |
ButtonPressMask | ButtonReleaseMask ); ButtonPressMask | ButtonReleaseMask |
PointerMotionMask );
/* At this stage, the window is open, displayed, and ready to /* At this stage, the window is open, displayed, and ready to
* receive data */ * receive data */
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* interface, such as command line. * interface, such as command line.
***************************************************************************** *****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN * 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> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* *
...@@ -322,16 +322,18 @@ int intf_ProcessKey( intf_thread_t *p_intf, int g_key ) ...@@ -322,16 +322,18 @@ int intf_ProcessKey( intf_thread_t *p_intf, int g_key )
keyparm k_reply; keyparm k_reply;
k_reply = intf_GetKey( p_intf, g_key); k_reply = intf_GetKey( p_intf, g_key);
switch( k_reply.key ) switch( k_reply.key )
{ {
case INTF_KEY_QUIT: /* quit order */ case INTF_KEY_QUIT: /* quit order */
p_intf->b_die = 1; p_intf->b_die = 1;
break; break;
case INTF_KEY_SET_CHANNEL: case INTF_KEY_SET_CHANNEL:
/* Change channel - return code is ignored since SelectChannel displays /* Change channel - return code is ignored since SelectChannel displays
* its own error messages */ * 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; break;
case INTF_KEY_INC_VOLUME: /* volume + */ case INTF_KEY_INC_VOLUME: /* volume + */
if( (p_main->p_aout != NULL) && (p_main->p_aout->vol < VOLUME_MAX) ) 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 ) ...@@ -380,4 +382,3 @@ int intf_ProcessKey( intf_thread_t *p_intf, int g_key )
return( 0 ); return( 0 );
} }
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
* More informations about parameters stand in `list of commands' section. * More informations about parameters stand in `list of commands' section.
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * 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> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* *
...@@ -80,7 +80,7 @@ static int SpawnInput ( int i_argc, intf_arg_t *p_argv ); ...@@ -80,7 +80,7 @@ static int SpawnInput ( int i_argc, intf_arg_t *p_argv );
#ifdef DEBUG #ifdef DEBUG
static int Test ( int i_argc, intf_arg_t *p_argv ); static int Test ( int i_argc, intf_arg_t *p_argv );
#endif #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 ); static int Psi ( int i_argc, intf_arg_t *p_argv );
/* /*
...@@ -170,11 +170,12 @@ const intf_command_t control_command[] = ...@@ -170,11 +170,12 @@ const intf_command_t control_command[] =
/* help: */ "Spawn a decoder thread for <pid>. The stream will be" \ /* help: */ "Spawn a decoder thread for <pid>. The stream will be" \
" received by <input>." }, " received by <input>." },
{ "spawn-input", SpawnInput, /* spawn-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 an input thread",
/* summary: */ "spawn-input [method=<method>]\n" \ /* summary: */ "spawn-input [method=<method>]\n" \
"[filename=<file>|hostname=<hostname>|ip=<ip>]\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, "\ /* 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." }, "hostname is the fully-qualified domain name, ip is a dotted-decimal address." },
#ifdef DEBUG #ifdef DEBUG
...@@ -186,16 +187,17 @@ const intf_command_t control_command[] = ...@@ -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 "\ "developpers as an easy way to test part of their code. If you don't know "\
"what it should do, just try !" }, "what it should do, just try !" },
#endif #endif
{ "vlan", Vlan, { "channel", Channel,
/* format: */ "intf=s? s i? ", /* format: */ "intf=s? s i? ",
/* summary: */ "vlan operations", /* summary: */ "channel changing operations",
/* usage: */ "vlan synchro\n" \ /* usage: */ "channel synchro\n" \
"vlan [intf=<interface>] request\n" \ "channel [intf=<interface>] request\n" \
"vlan [intf=<interface>] join <vlan>\n" \ "channel [intf=<interface>] join <channel>\n" \
"vlan [intf=<interface>] leave", "channel [intf=<interface>] leave",
/* help: */ "Perform various operations on vlans. 'synchro' resynchronize " \ /* help: */ "Perform various operations on channels. 'synchro'"\
"with the server. 'request' ask which is the current vlan (for the default "\ "resynchronize with the server. 'request' ask which is the current"\
"interface or for a given one). 'join' and 'leave' try to change vlan." }, "channel (for the default interface or for a given one)."\
"'join' and 'leave' try to change channel." },
{ "psi", Psi, { "psi", Psi,
/* format: */ "i ", /* format: */ "i ",
/* summary: */ "Dump PSI tables", /* summary: */ "Dump PSI tables",
...@@ -529,18 +531,18 @@ static int Test( int i_argc, intf_arg_t *p_argv ) ...@@ -529,18 +531,18 @@ static int Test( int i_argc, intf_arg_t *p_argv )
#endif #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 */ int i_command; /* command argument number */
/* Do not try anything if vlans are deactivated */ /* Do not try anything if channel changing is desactivated */
if( !p_main->b_vlans ) if( !p_main->b_channels )
{ {
intf_IntfMsg("vlans are deactivated"); intf_IntfMsg("channel changing is desactivated");
return( INTF_OTHER_ERROR ); return( INTF_OTHER_ERROR );
} }
...@@ -564,7 +566,7 @@ static int Vlan( int i_argc, intf_arg_t *p_argv ) ...@@ -564,7 +566,7 @@ static int Vlan( int i_argc, intf_arg_t *p_argv )
/* Command is unknown */ /* Command is unknown */
else 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 ); return( INTF_USAGE_ERROR );
} }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* and spawn threads. * and spawn threads.
***************************************************************************** *****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN * 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> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org> * Samuel Hocevar <sam@zoy.org>
...@@ -76,6 +76,8 @@ ...@@ -76,6 +76,8 @@
#include "beos_specific.h" #include "beos_specific.h"
#endif #endif
#include "netutils.h" /* network_ChannelJoin */
#include "main.h" #include "main.h"
/***************************************************************************** /*****************************************************************************
...@@ -97,7 +99,7 @@ ...@@ -97,7 +99,7 @@
#define OPT_FULLSCREEN 165 #define OPT_FULLSCREEN 165
#define OPT_OVERLAY 166 #define OPT_OVERLAY 166
#define OPT_VLANS 170 #define OPT_CHANNELS 170
#define OPT_SERVER 171 #define OPT_SERVER 171
#define OPT_PORT 172 #define OPT_PORT 172
#define OPT_BROADCAST 173 #define OPT_BROADCAST 173
...@@ -159,7 +161,7 @@ static const struct option longopts[] = ...@@ -159,7 +161,7 @@ static const struct option longopts[] =
/* Input options */ /* Input options */
{ "input", 1, 0, OPT_INPUT }, { "input", 1, 0, OPT_INPUT },
{ "vlans", 0, 0, OPT_VLANS }, { "channels", 0, 0, OPT_CHANNELS },
{ "server", 1, 0, OPT_SERVER }, { "server", 1, 0, OPT_SERVER },
{ "port", 1, 0, OPT_PORT }, { "port", 1, 0, OPT_PORT },
{ "broadcast", 0, 0, OPT_BROADCAST }, { "broadcast", 0, 0, OPT_BROADCAST },
...@@ -293,16 +295,13 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] ) ...@@ -293,16 +295,13 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
/* /*
* Initialize shared resources and libraries * Initialize shared resources and libraries
*/ */
/* FIXME: no VLANs */ if( p_main->b_channels && network_ChannelCreate() )
#if 0
if( p_main->b_vlans && input_VlanCreate() )
{ {
/* On error during vlans initialization, switch off vlans */ /* On error during Channels initialization, switch off channels */
intf_Msg( "Virtual LANs initialization failed : " intf_Msg( "Channels initialization failed : "
"vlans management is deactivated" ); "Channel management is deactivated" );
p_main->b_vlans = 0; p_main->b_channels = 0;
} }
#endif
/* /*
* Run interface * Run interface
...@@ -379,15 +378,12 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] ) ...@@ -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( p_main->b_channels )
#if 0
if( p_main->b_vlans )
{ {
input_VlanDestroy(); network_ChannelJoin( COMMON_CHANNEL );
} }
#endif
/* /*
* Free module bank * Free module bank
...@@ -518,9 +514,9 @@ static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] ) ...@@ -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_argv = ppsz_argv;
p_main->ppsz_env = ppsz_env; p_main->ppsz_env = ppsz_env;
p_main->b_audio = 1; p_main->b_audio = 1;
p_main->b_video = 1; p_main->b_video = 1;
p_main->b_vlans = 0; p_main->b_channels = 0;
p_main->i_warning_level = 4; p_main->i_warning_level = 4;
...@@ -651,8 +647,8 @@ static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] ) ...@@ -651,8 +647,8 @@ static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
case OPT_INPUT: /* --input */ case OPT_INPUT: /* --input */
main_PutPszVariable( INPUT_METHOD_VAR, optarg ); main_PutPszVariable( INPUT_METHOD_VAR, optarg );
break; break;
case OPT_VLANS: /* --vlans */ case OPT_CHANNELS: /* --channels */
p_main->b_vlans = 1; p_main->b_channels = 1;
break; break;
case OPT_SERVER: /* --server */ case OPT_SERVER: /* --server */
main_PutPszVariable( INPUT_SERVER_VAR, optarg ); main_PutPszVariable( INPUT_SERVER_VAR, optarg );
...@@ -754,7 +750,7 @@ static void Usage( int i_fashion ) ...@@ -754,7 +750,7 @@ static void Usage( int i_fashion )
"\n -s, --dvdsubtitle <channel> \tchoose DVD subtitle channel" "\n -s, --dvdsubtitle <channel> \tchoose DVD subtitle channel"
"\n" "\n"
"\n --input \tinput method" "\n --input \tinput method"
"\n --vlans \tenable vlans" "\n --channels \tenable channels"
"\n --server <host> \tvideo server address" "\n --server <host> \tvideo server address"
"\n --port <port> \tvideo server port" "\n --port <port> \tvideo server port"
"\n --broadcast \tlisten to a broadcast" "\n --broadcast \tlisten to a broadcast"
...@@ -809,8 +805,8 @@ static void Usage( int i_fashion ) ...@@ -809,8 +805,8 @@ static void Usage( int i_fashion )
"\n " INPUT_PORT_VAR "=<port> \tvideo server port" "\n " INPUT_PORT_VAR "=<port> \tvideo server port"
"\n " INPUT_IFACE_VAR "=<interface> \tnetwork interface" "\n " INPUT_IFACE_VAR "=<interface> \tnetwork interface"
"\n " INPUT_BROADCAST_VAR "={1|0} \tbroadcast mode" "\n " INPUT_BROADCAST_VAR "={1|0} \tbroadcast mode"
"\n " INPUT_VLAN_SERVER_VAR "=<hostname> \tvlan server" "\n " INPUT_CHANNEL_SERVER_VAR "=<hostname> \tchannel server"
"\n " INPUT_VLAN_PORT_VAR "=<port> \tvlan server port" ); "\n " INPUT_CHANNEL_PORT_VAR "=<port> \tchannel server port" );
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* netutils.c: various network functions * netutils.c: various network functions
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN * 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> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* Benoit Steiner <benny@via.ecp.fr> * Benoit Steiner <benny@via.ecp.fr>
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <errno.h> /* errno() */ #include <errno.h> /* errno() */
#include <string.h> /* bzero(), bcopy() */ #include <string.h> /* bzero(), bcopy() */
#include <unistd.h> /* gethostname() */ #include <unistd.h> /* gethostname() */
#include <sys/time.h> /* gettimeofday */
#include <netinet/in.h> /* BSD: struct in_addr */ #include <netinet/in.h> /* BSD: struct in_addr */
#include <sys/socket.h> /* BSD: struct sockaddr */ #include <sys/socket.h> /* BSD: struct sockaddr */
...@@ -40,6 +41,10 @@ ...@@ -40,6 +41,10 @@
#include <arpa/inet.h> /* inet_ntoa(), inet_aton() */ #include <arpa/inet.h> /* inet_ntoa(), inet_aton() */
#endif #endif
#ifdef SYS_LINUX
#include <sys/ioctl.h> /* ioctl() */
#endif
#if defined (HAVE_NET_IF_H) #if defined (HAVE_NET_IF_H)
#include <net/if.h> /* interface (arch-dependent) */ #include <net/if.h> /* interface (arch-dependent) */
#endif #endif
...@@ -52,15 +57,31 @@ ...@@ -52,15 +57,31 @@
#include "common.h" #include "common.h"
#include "mtime.h" #include "mtime.h"
#include "threads.h" #include "threads.h"
#include "main.h"
#include "intf_msg.h" #include "intf_msg.h"
#if !defined( SYS_BEOS ) && !defined( SYS_NTO )
#include "netutils.h" #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, int network_BuildLocalAddr( struct sockaddr_in * p_socket, int i_port,
boolean_t b_broadcast ) boolean_t b_broadcast )
...@@ -113,7 +134,7 @@ int network_BuildLocalAddr( struct sockaddr_in * p_socket, int i_port, ...@@ -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 ) 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 ) ...@@ -147,5 +168,223 @@ int network_BuildRemoteAddr( struct sockaddr_in * p_socket, char * psz_server )
} }
return( 0 ); 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 */
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment