Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-2-2
Commits
063cb8b6
Commit
063cb8b6
authored
Aug 12, 2005
by
Clément Stenac
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove slp and joystick plugins
parent
74df93df
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
0 additions
and
1030 deletions
+0
-1030
modules/access/Modules.am
modules/access/Modules.am
+0
-1
modules/access/slp.c
modules/access/slp.c
+0
-436
modules/control/Modules.am
modules/control/Modules.am
+0
-1
modules/control/joystick.c
modules/control/joystick.c
+0
-592
No files found.
modules/access/Modules.am
View file @
063cb8b6
...
...
@@ -7,7 +7,6 @@ SOURCES_access_ftp = ftp.c
SOURCES_access_smb = smb.c
SOURCES_dvdnav = dvdnav.c
SOURCES_dvdread = dvdread.c
SOURCES_slp = slp.c
SOURCES_access_fake = fake.c
SOURCES_cdda = \
cdda.c \
...
...
modules/access/slp.c
deleted
100644 → 0
View file @
74df93df
/*****************************************************************************
* slp.c: SLP access plugin
*****************************************************************************
* Copyright (C) 2002-2004 the VideoLAN team
* $Id$
*
* Authors: Loc Minier <lool@videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <stdlib.h>
/* malloc */
#include <vlc/vlc.h>
#include <vlc/input.h>
#include <vlc_playlist.h>
#include <slp.h>
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
);
static
void
Close
(
vlc_object_t
*
);
static
ssize_t
Read
(
input_thread_t
*
,
byte_t
*
,
size_t
);
static
int
Init
(
vlc_object_t
*
);
static
void
End
(
vlc_object_t
*
);
static
int
Demux
(
input_thread_t
*
);
int
i_group
;
/*****************************************************************************
* Module descriptor
*****************************************************************************/
#if 0
#define SRVTYPE_TEXT /*N_*/("SLP service type")
#define SRVTYPE_LONGTEXT /*N_*/( \
"The service type string for SLP queries, including the authority " \
"string (if any) for the request. May not be empty." )
#endif
#define ATTRIDS_TEXT N_("SLP attribute identifiers")
#define ATTRIDS_LONGTEXT N_( \
"This string is a comma separated list of attribute identifiers to " \
"search for a playlist title or empty to use all attributes." )
#define SCOPELIST_TEXT N_("SLP scopes list")
#define SCOPELIST_LONGTEXT N_( \
"This string is a comma separated list of scope names or empty if you " \
"want to use the default scopes. It is used in all SLP queries." )
#define NAMINGAUTHORITY_TEXT N_("SLP naming authority")
#define NAMINGAUTHORITY_LONGTEXT N_( \
"This string is a list of naming authorities to search. " \
"Use \"*\" for all and the empty string for the default of IANA." )
#define FILTER_TEXT N_("SLP LDAP filter")
#define FILTER_LONGTEXT N_( \
"This is a query formulated of attribute pattern matching expressions " \
"in the form of an LDAPv3 search filter or empty for all answers." )
#define LANG_TEXT N_("Language requested in SLP requests")
#define LANG_LONGTEXT N_( \
"RFC 1766 Language tag for the natural language locale of requests, " \
"leave empty to use the default locale. It is used in all SLP queries." )
vlc_module_begin
();
set_description
(
_
(
"SLP input"
)
);
add_string
(
"slp-attrids"
,
""
,
NULL
,
ATTRIDS_TEXT
,
ATTRIDS_LONGTEXT
,
VLC_TRUE
);
add_string
(
"slp-scopelist"
,
""
,
NULL
,
SCOPELIST_TEXT
,
SCOPELIST_LONGTEXT
,
VLC_TRUE
);
add_string
(
"slp-namingauthority"
,
"*"
,
NULL
,
NAMINGAUTHORITY_TEXT
,
NAMINGAUTHORITY_LONGTEXT
,
VLC_TRUE
);
add_string
(
"slp-filter"
,
""
,
NULL
,
FILTER_TEXT
,
FILTER_LONGTEXT
,
VLC_TRUE
);
add_string
(
"slp-lang"
,
""
,
NULL
,
LANG_TEXT
,
LANG_LONGTEXT
,
VLC_TRUE
);
set_capability
(
"access"
,
0
);
set_callbacks
(
Open
,
Close
);
add_submodule
();
add_shortcut
(
"demux_slp"
);
set_capability
(
"demux"
,
0
);
set_callbacks
(
Init
,
End
);
vlc_module_end
();
/*****************************************************************************
* AttrCallback: updates the description of a playlist item
*****************************************************************************/
static
SLPBoolean
AttrCallback
(
SLPHandle
slph_slp
,
const
char
*
psz_attrlist
,
SLPError
slpe_errcode
,
void
*
p_cookie
)
{
playlist_item_t
*
p_playlist_item
=
(
playlist_item_t
*
)
p_cookie
;
/* our callback was only called to tell us there's nothing more to read */
if
(
slpe_errcode
==
SLP_LAST_CALL
)
{
return
SLP_TRUE
;
}
/* or there was a problem with getting the data we requested */
if
(
(
slpe_errcode
!=
SLP_OK
)
)
{
#if 0
msg_Err( (vlc_object_t*)NULL,
"AttrCallback got an error %i with attribute %s",
slpe_errcode,
psz_attrlist );
#endif
return
SLP_TRUE
;
}
if
(
p_playlist_item
->
input
.
psz_name
)
free
(
p_playlist_item
->
input
.
psz_name
);
p_playlist_item
->
input
.
psz_name
=
strdup
(
psz_attrlist
);
/* NULL is checked */
return
SLP_TRUE
;
}
/*****************************************************************************
* SrvUrlCallback: adds an entry to the playlist
*****************************************************************************/
static
SLPBoolean
SrvUrlCallback
(
SLPHandle
slph_slp
,
const
char
*
psz_srvurl
,
uint16_t
i_lifetime
,
SLPError
slpe_errcode
,
void
*
p_cookie
)
{
input_thread_t
*
p_input
=
(
input_thread_t
*
)
p_cookie
;
playlist_t
*
p_playlist
;
char
psz_item
[
42
]
=
""
;
//"udp:@";
char
*
psz_s
;
/* to hold the uri of the stream */
SLPHandle
slph_slp3
;
SLPError
slpe_result
;
playlist_item_t
*
p_playlist_item
;
/* our callback was only called to tell us there's nothing more to read */
if
(
slpe_errcode
==
SLP_LAST_CALL
)
{
return
SLP_TRUE
;
}
msg_Dbg
(
p_input
,
"URL: %s"
,
psz_srvurl
);
/* or there was a problem with getting the data we requested */
if
(
(
slpe_errcode
!=
SLP_OK
)
)
{
msg_Err
(
p_input
,
"SrvUrlCallback got an error %i with URL %s"
,
slpe_errcode
,
psz_srvurl
);
return
SLP_TRUE
;
}
/* search the returned address after a double-slash */
psz_s
=
strstr
(
psz_srvurl
,
"//"
);
if
(
psz_s
==
NULL
)
{
msg_Err
(
p_input
,
"SrvUrlCallback got a strange string of your libslp"
);
return
SLP_TRUE
;
}
/* skip the slashes */
psz_s
=
&
psz_s
[
2
];
/* add udp:@ in front of the address */
psz_s
=
strncat
(
psz_item
,
psz_s
,
sizeof
(
psz_item
)
-
strlen
(
psz_item
)
-
1
);
/* create a playlist item */
p_playlist_item
=
playlist_ItemNew
(
p_input
,
psz_s
,
NULL
);
if
(
p_playlist_item
==
NULL
)
{
msg_Err
(
p_input
,
"out of memory"
);
return
SLP_TRUE
;
}
p_playlist_item
->
i_group
=
i_group
;
p_playlist_item
->
b_enabled
=
VLC_TRUE
;
/* search the description of the stream */
if
(
SLPOpen
(
config_GetPsz
(
p_input
,
"slp-lang"
),
SLP_FALSE
,
/* synchronous ops */
&
slph_slp3
)
==
SLP_OK
)
{
/* search all attributes */
slpe_result
=
SLPFindAttrs
(
slph_slp3
,
psz_srvurl
,
config_GetPsz
(
p_input
,
"slp-scopelist"
),
config_GetPsz
(
p_input
,
"slp-attrids"
),
AttrCallback
,
p_playlist_item
);
/* we're done, clean up */
SLPClose
(
slph_slp3
);
}
/* search the main playlist object */
p_playlist
=
vlc_object_find
(
p_input
,
VLC_OBJECT_PLAYLIST
,
FIND_ANYWHERE
);
if
(
p_playlist
==
NULL
)
{
msg_Warn
(
p_input
,
"could not find playlist, not adding entries"
);
return
SLP_TRUE
;
}
playlist_AddItem
(
p_playlist
,
p_playlist_item
,
PLAYLIST_APPEND
,
PLAYLIST_END
);
vlc_object_release
(
p_playlist
);
msg_Info
(
p_input
,
"added %s (lifetime %i) to playlist"
,
psz_srvurl
,
i_lifetime
);
return
SLP_TRUE
;
}
/*****************************************************************************
* SrvTypeCallback: searchs all servers of a certain type
*****************************************************************************/
static
SLPBoolean
SrvTypeCallback
(
SLPHandle
slph_slp
,
const
char
*
psz_srvurl
,
SLPError
slpe_errcode
,
void
*
p_cookie
)
{
input_thread_t
*
p_input
=
(
input_thread_t
*
)
p_cookie
;
SLPError
slpe_result
;
SLPHandle
slph_slp2
;
char
*
psz_eos
;
char
*
psz_service
;
msg_Dbg
(
p_input
,
"services: %s"
,
psz_srvurl
);
/* our callback was only called to tell us there's nothing more to read */
if
(
slpe_errcode
==
SLP_LAST_CALL
)
{
return
SLP_TRUE
;
}
msg_Dbg
(
p_input
,
"services: %s"
,
psz_srvurl
);
/* or there was a problem with getting the data we requested */
if
(
slpe_errcode
!=
SLP_OK
)
{
msg_Err
(
p_input
,
"SrvTypeCallback got an error %i with URL %s"
,
slpe_errcode
,
psz_srvurl
);
return
SLP_TRUE
;
}
/* get a new handle to the library */
if
(
SLPOpen
(
config_GetPsz
(
p_input
,
"slp-lang"
),
SLP_FALSE
,
/* synchronous ops */
&
slph_slp2
)
==
SLP_OK
)
{
/* search for services */
while
(
1
)
{
if
(
*
psz_srvurl
==
'\0'
)
break
;
if
(
!
strncasecmp
(
psz_srvurl
,
"service:"
,
8
)
)
{
while
(
1
)
{
psz_eos
=
strchr
(
psz_srvurl
,
','
);
if
(
!
psz_eos
)
break
;
if
(
!
strncasecmp
(
psz_eos
+
1
,
"service:"
,
8
))
break
;
}
if
(
psz_eos
)
*
psz_eos
=
'\0'
;
psz_service
=
strdup
(
psz_srvurl
);
msg_Dbg
(
p_input
,
"getting details for %s"
,
psz_service
);
slpe_result
=
SLPFindSrvs
(
slph_slp2
,
psz_service
,
config_GetPsz
(
p_input
,
"slp-scopelist"
),
config_GetPsz
(
p_input
,
"slp-filter"
),
SrvUrlCallback
,
p_input
);
if
(
psz_eos
)
psz_srvurl
=
psz_eos
;
#if 0
SLPClose( slph_slp2 );
#endif
if
(
slpe_result
!=
SLP_OK
)
{
msg_Err
(
p_input
,
"SLPFindSrvs error %i finding servers of type %s"
,
slpe_result
,
psz_service
);
}
}
psz_srvurl
++
;
}
}
SLPClose
(
slph_slp2
);
return
SLP_TRUE
;
}
/*****************************************************************************
* Open: initialize library for the access module
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
p_this
)
{
input_thread_t
*
p_input
=
(
input_thread_t
*
)
p_this
;
SLPError
slpe_result
;
SLPHandle
slph_slp
;
playlist_t
*
p_playlist
;
playlist_group_t
*
p_group
;
/* remove the "slp:" entry of the playlist */
p_playlist
=
(
playlist_t
*
)
vlc_object_find
(
p_input
,
VLC_OBJECT_PLAYLIST
,
FIND_ANYWHERE
);
if
(
!
p_playlist
)
{
msg_Warn
(
p_input
,
"hey I can't find the main playlist, I need it"
);
return
VLC_FALSE
;
}
p_group
=
playlist_CreateGroup
(
p_playlist
,
"SLP"
);
i_group
=
p_group
->
i_id
;
p_playlist
->
pp_items
[
p_playlist
->
i_index
]
->
b_autodeletion
=
VLC_TRUE
;
vlc_object_release
(
(
vlc_object_t
*
)
p_playlist
);
/* get a new handle to the library */
if
(
SLPOpen
(
config_GetPsz
(
p_input
,
"slp-lang"
),
SLP_FALSE
,
/* synchronous ops */
&
slph_slp
)
==
SLP_OK
)
{
/* search all service types */
slpe_result
=
SLPFindSrvTypes
(
slph_slp
,
config_GetPsz
(
p_input
,
"slp-namingauthority"
),
config_GetPsz
(
p_input
,
"slp-scopelist"
),
SrvTypeCallback
,
p_input
);
/* we're done, clean up */
SLPClose
(
slph_slp
);
}
if
(
!
p_input
->
psz_demux
||
!*
p_input
->
psz_demux
)
{
p_input
->
psz_demux
=
"demux_slp"
;
}
p_input
->
pf_read
=
Read
;
p_input
->
pf_set_program
=
NULL
;
p_input
->
pf_set_area
=
NULL
;
p_input
->
pf_seek
=
NULL
;
vlc_mutex_lock
(
&
p_input
->
stream
.
stream_lock
);
p_input
->
stream
.
b_pace_control
=
VLC_FALSE
;
p_input
->
stream
.
b_seekable
=
VLC_FALSE
;
p_input
->
stream
.
p_selected_area
->
i_tell
=
0
;
p_input
->
stream
.
p_selected_area
->
i_size
=
0
;
p_input
->
stream
.
i_method
=
INPUT_METHOD_SLP
;
vlc_mutex_unlock
(
&
p_input
->
stream
.
stream_lock
);
p_input
->
i_mtu
=
0
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
* Close: close access
*****************************************************************************/
static
void
Close
(
vlc_object_t
*
p_this
)
{
return
;
}
/*****************************************************************************
* Read: should fill but zeroes the buffer
*****************************************************************************/
static
ssize_t
Read
(
input_thread_t
*
p_input
,
byte_t
*
p_buffer
,
size_t
s
)
{
memset
(
p_buffer
,
0
,
s
);
return
s
;
}
/*****************************************************************************
* Init: initialize demux
*****************************************************************************/
static
int
Init
(
vlc_object_t
*
p_this
)
{
input_thread_t
*
p_input
=
(
input_thread_t
*
)
p_this
;
if
(
p_input
->
stream
.
i_method
!=
INPUT_METHOD_SLP
)
{
return
VLC_FALSE
;
}
p_input
->
pf_demux
=
Demux
;
p_input
->
pf_demux_control
=
demux_vaControlDefault
;
p_input
->
pf_rewind
=
NULL
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
* Demux: should demux but does nothing
*****************************************************************************/
static
int
Demux
(
input_thread_t
*
p_input
)
{
return
0
;
}
/*****************************************************************************
* End: end demux
*****************************************************************************/
static
void
End
(
vlc_object_t
*
p_this
)
{
return
;
}
modules/control/Modules.am
View file @
063cb8b6
...
...
@@ -4,7 +4,6 @@ SOURCES_http = http.c
SOURCES_telnet = telnet.c
SOURCES_netsync = netsync.c
SOURCES_ntservice = ntservice.c
SOURCES_joystick = joystick.c
SOURCES_hotkeys = hotkeys.c
SOURCES_lirc = lirc.c
SOURCES_rc = rc.c
modules/control/joystick.c
deleted
100644 → 0
View file @
74df93df
/*****************************************************************************
* joystick.c: control vlc with a joystick
*****************************************************************************
* Copyright (C) 2004 the VideoLAN team
* $Id$
*
* Authors: Clément Stenac <zorglub@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <stdlib.h>
/* malloc(), free() */
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/select.h>
#include <errno.h>
#include <fcntl.h>
#include <vlc/vlc.h>
#include <vlc/intf.h>
#include <vlc/vout.h>
#include <linux/joystick.h>
#include "audio_output.h"
/* Default values for parameters */
#define DEFAULT_MAX_SEEK 10
/* seconds */
#define DEFAULT_REPEAT 100
#define DEFAULT_WAIT 500
#define DEFAULT_DEVICE "/dev/input/js0"
#define DEFAULT_THRESHOLD 12000
/* 0 -> 32767 */
#define DEFAULT_MAPPING \
"{axis-0-up=forward,axis-0-down=back," \
"axis-1-up=next,axis-1-down=prev," \
"butt-1-down=play,butt-2-down=fullscreen}"
/* Default Actions (used if there are missing actions in the default
* Available actions are: Next,Prev, Forward,Back,Play,Fullscreen,dummy */
#define AXIS_0_UP_ACTION Forward
#define AXIS_0_DOWN_ACTION Back
#define AXIS_1_UP_ACTION Next
#define AXIS_1_DOWN_ACTION Prev
#define BUTTON_1_PRESS_ACTION Play
#define BUTTON_1_RELEASE_ACTION dummy
#define BUTTON_2_PRESS_ACTION Fullscreen
#define BUTTON_2_RELEASE_ACTION dummy
/*****************************************************************************
* intf_sys_t: description and status of interface
*****************************************************************************/
typedef
int
(
*
action
)(
intf_thread_t
*
p_intf
);
struct
joy_axis_t
{
int
b_trigered
;
/* Are we in the trigger zone ? */
int
i_value
;
/* Value of movement */
int
b_dowork
;
/* Do we have to do the action ? */
action
pf_actup
;
/* Action when axis is up */
action
pf_actdown
;
/* Action when axis is down */
mtime_t
l_time
;
/* When did the axis enter the trigger
* zone ? */
};
struct
joy_button_t
{
action
pf_actup
;
/* What to do when button is released */
action
pf_actdown
;
/* What to do when button is pressed */
};
struct
intf_sys_t
{
int
i_fd
;
/* File descriptor for joystick */
struct
timeval
timeout
;
/* Select timeout */
int
i_threshold
;
/* motion threshold */
int
i_wait
;
/* How much to wait before repeat */
int
i_repeat
;
/* Repeat time */
int
i_maxseek
;
/* Maximum seek time */
struct
joy_axis_t
axes
[
3
];
/* Axes descriptor */
struct
joy_button_t
buttons
[
2
];
/* Buttons descriptor */
input_thread_t
*
p_input
;
/* Input thread (for seeking) */
float
f_seconds
;
/* How much to seek */
};
/*****************************************************************************
* Local prototypes.
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
);
static
void
Close
(
vlc_object_t
*
);
static
int
Init
(
intf_thread_t
*
p_intf
);
static
int
handle_event
(
intf_thread_t
*
p_intf
,
struct
js_event
event
);
/* Actions */
static
int
Next
(
intf_thread_t
*
p_intf
);
static
int
Prev
(
intf_thread_t
*
p_intf
);
static
int
Back
(
intf_thread_t
*
p_intf
);
static
int
Forward
(
intf_thread_t
*
p_intf
);
static
int
Play
(
intf_thread_t
*
p_intf
);
static
int
Fullscreen
(
intf_thread_t
*
p_intf
);
static
int
dummy
(
intf_thread_t
*
p_intf
);
/* Exported functions */
static
void
Run
(
intf_thread_t
*
p_intf
);
/*****************************************************************************
* Module descriptor
*****************************************************************************/
#define THRESHOLD_TEXT N_( "Motion threshold" )
#define THRESHOLD_LONGTEXT N_( \
"Amount of joystick movement required for a movement to be " \
"recorded (0->32767)." )
#define DEVICE_TEXT N_( "Joystick device" )
#define DEVICE_LONGTEXT N_( \
"The joystick device (usually /dev/js0 or /dev/input/js0).")
#define REPEAT_TEXT N_( "Repeat time (ms)" )
#define REPEAT_LONGTEXT N_( \
"Delay waited before the action is repeated if it is still " \
"triggered, in milliseconds." )
#define WAIT_TEXT N_( "Wait time (ms)")
#define WAIT_LONGTEXT N_(\
"The time waited before the repeat starts, in milliseconds.")
#define SEEK_TEXT N_( "Max seek interval (seconds)")
#define SEEK_LONGTEXT N_(\
"The maximum number of seconds that will be sought at a time." )
#define MAP_TEXT N_( "Action mapping")
#define MAP_LONGTEXT N_( "Allows you to remap the actions." )
vlc_module_begin
();
set_category
(
CAT_INTERFACE
);
set_subcategory
(
SUBCAT_INTERFACE_CONTROL
);
add_integer
(
"motion-threshold"
,
DEFAULT_THRESHOLD
,
NULL
,
THRESHOLD_TEXT
,
THRESHOLD_LONGTEXT
,
VLC_TRUE
);
add_string
(
"joystick-device"
,
DEFAULT_DEVICE
,
NULL
,
DEVICE_TEXT
,
DEVICE_LONGTEXT
,
VLC_TRUE
);
add_integer
(
"joystick-repeat"
,
DEFAULT_REPEAT
,
NULL
,
REPEAT_TEXT
,
REPEAT_LONGTEXT
,
VLC_TRUE
);
add_integer
(
"joystick-wait"
,
DEFAULT_WAIT
,
NULL
,
WAIT_TEXT
,
WAIT_LONGTEXT
,
VLC_TRUE
);
add_integer
(
"joystick-max-seek"
,
DEFAULT_MAX_SEEK
,
NULL
,
SEEK_TEXT
,
SEEK_LONGTEXT
,
VLC_TRUE
);
add_string
(
"joystick-mapping"
,
DEFAULT_MAPPING
,
NULL
,
MAP_TEXT
,
MAP_LONGTEXT
,
VLC_TRUE
);
set_description
(
_
(
"Joystick control interface"
)
);
set_capability
(
"interface"
,
0
);
set_callbacks
(
Open
,
Close
);
vlc_module_end
();
/*****************************************************************************
* Open: initialize interface
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
p_this
)
{
intf_thread_t
*
p_intf
=
(
intf_thread_t
*
)
p_this
;
/* Allocate instance and initialize some members */
p_intf
->
p_sys
=
malloc
(
sizeof
(
intf_sys_t
)
);
if
(
p_intf
->
p_sys
==
NULL
)
{
return
VLC_ENOMEM
;
}
if
(
Init
(
p_intf
)
<
0
)
{
msg_Err
(
p_intf
,
"cannot initialize interface"
);
free
(
p_intf
->
p_sys
);
return
VLC_EGENERIC
;
}
msg_Dbg
(
p_intf
,
"interface initialized"
);
p_intf
->
pf_run
=
Run
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
* Close: destroy the interface
*****************************************************************************/
static
void
Close
(
vlc_object_t
*
p_this
)
{
intf_thread_t
*
p_intf
=
(
intf_thread_t
*
)
p_this
;
/* Destroy structure */
if
(
p_intf
->
p_sys
)
{
free
(
p_intf
->
p_sys
);
}
}
/*****************************************************************************
* Run: main loop
*****************************************************************************/
static
void
Run
(
intf_thread_t
*
p_intf
)
{
int
i_sel_res
=
0
;
int
i_read
=
0
;
int
i_axis
=
0
;
struct
js_event
event
;
/* Main loop */
while
(
!
p_intf
->
b_die
)
{
fd_set
fds
;
vlc_mutex_lock
(
&
p_intf
->
change_lock
);
FD_ZERO
(
&
fds
);
FD_SET
(
p_intf
->
p_sys
->
i_fd
,
&
fds
);
p_intf
->
p_sys
->
timeout
.
tv_sec
=
0
;
p_intf
->
p_sys
->
timeout
.
tv_usec
=
p_intf
->
p_sys
->
i_repeat
;
i_sel_res
=
select
(
p_intf
->
p_sys
->
i_fd
+
1
,
&
fds
,
NULL
,
NULL
,
&
p_intf
->
p_sys
->
timeout
);
p_intf
->
p_sys
->
p_input
=
(
input_thread_t
*
)
vlc_object_find
(
p_intf
,
VLC_OBJECT_INPUT
,
FIND_ANYWHERE
);
if
(
i_sel_res
==
-
1
&&
errno
!=
EINTR
)
{
msg_Err
(
p_intf
,
"select error: %s"
,
strerror
(
errno
)
);
}
else
if
(
i_sel_res
>
0
&&
FD_ISSET
(
p_intf
->
p_sys
->
i_fd
,
&
fds
))
{
/* We got an event */
memset
(
&
event
,
0
,
sizeof
(
struct
js_event
));
i_read
=
read
(
p_intf
->
p_sys
->
i_fd
,
&
event
,
sizeof
(
struct
js_event
));
handle_event
(
p_intf
,
event
)
;
}
else
if
(
i_sel_res
==
0
)
{
/*We have no event, but check if we have an action to repeat */
for
(
i_axis
=
0
;
i_axis
<=
1
;
i_axis
++
)
{
if
(
p_intf
->
p_sys
->
axes
[
i_axis
].
b_trigered
&&
mdate
()
-
p_intf
->
p_sys
->
axes
[
i_axis
].
l_time
>
p_intf
->
p_sys
->
i_wait
&&
p_intf
->
p_sys
->
axes
[
i_axis
].
i_value
>
0
)
{
p_intf
->
p_sys
->
axes
[
i_axis
].
pf_actup
(
p_intf
);
}
if
(
p_intf
->
p_sys
->
axes
[
i_axis
].
b_trigered
&&
mdate
()
-
p_intf
->
p_sys
->
axes
[
i_axis
].
l_time
>
p_intf
->
p_sys
->
i_wait
&&
p_intf
->
p_sys
->
axes
[
i_axis
].
i_value
<
0
)
{
p_intf
->
p_sys
->
axes
[
i_axis
].
pf_actdown
(
p_intf
);
}
}
}
if
(
p_intf
->
p_sys
->
p_input
)
vlc_object_release
(
p_intf
->
p_sys
->
p_input
);
vlc_mutex_unlock
(
&
p_intf
->
change_lock
);
}
}
/*****************************************************************************
* InitThread: Initialize the interface
*****************************************************************************/
static
int
Init
(
intf_thread_t
*
p_intf
)
{
char
*
psz_device
;
char
*
psz_parse
;
char
*
psz_eof
;
/* end of field */
psz_device
=
config_GetPsz
(
p_intf
,
"joystick-device"
);
if
(
!
psz_device
)
/* strange... */
{
psz_device
=
strdup
(
DEFAULT_DEVICE
);
}
p_intf
->
p_sys
->
i_fd
=
open
(
psz_device
,
O_RDONLY
|
O_NONBLOCK
);
if
(
p_intf
->
p_sys
->
i_fd
==
-
1
)
{
msg_Warn
(
p_intf
,
"unable to open %s for reading: %s"
,
psz_device
,
strerror
(
errno
)
);
return
VLC_EGENERIC
;
}
p_intf
->
p_sys
->
i_repeat
=
1000
*
config_GetInt
(
p_intf
,
"joystick-repeat"
);
p_intf
->
p_sys
->
i_wait
=
1000
*
config_GetInt
(
p_intf
,
"joystick-wait"
);
p_intf
->
p_sys
->
i_threshold
=
config_GetInt
(
p_intf
,
"motion-threshold"
);
if
(
p_intf
->
p_sys
->
i_threshold
>
32767
||
p_intf
->
p_sys
->
i_threshold
<
0
)
p_intf
->
p_sys
->
i_threshold
=
DEFAULT_THRESHOLD
;
p_intf
->
p_sys
->
i_maxseek
=
config_GetInt
(
p_intf
,
"joystick-max-seek"
);
psz_parse
=
config_GetPsz
(
p_intf
,
"joystick-mapping"
)
;
if
(
!
psz_parse
)
{
msg_Warn
(
p_intf
,
"invalid mapping. aborting"
);
return
VLC_EGENERIC
;
}
if
(
!
strlen
(
psz_parse
)
)
{
msg_Warn
(
p_intf
,
"invalid mapping, aborting"
);
return
VLC_EGENERIC
;
}
p_intf
->
p_sys
->
axes
[
0
].
pf_actup
=
AXIS_0_UP_ACTION
;
p_intf
->
p_sys
->
axes
[
0
].
pf_actdown
=
AXIS_0_DOWN_ACTION
;
p_intf
->
p_sys
->
axes
[
1
].
pf_actup
=
AXIS_1_UP_ACTION
;
p_intf
->
p_sys
->
axes
[
1
].
pf_actdown
=
AXIS_1_DOWN_ACTION
;
p_intf
->
p_sys
->
buttons
[
0
].
pf_actdown
=
BUTTON_1_PRESS_ACTION
;
p_intf
->
p_sys
->
buttons
[
0
].
pf_actup
=
BUTTON_1_RELEASE_ACTION
;
p_intf
->
p_sys
->
buttons
[
1
].
pf_actdown
=
BUTTON_2_PRESS_ACTION
;
p_intf
->
p_sys
->
buttons
[
1
].
pf_actup
=
BUTTON_2_RELEASE_ACTION
;
/* Macro to parse the command line */
#define PARSE(name,function) \
if(!strncmp( psz_parse, name, strlen( name ) ) ) \
{ \
psz_parse += strlen( name ); \
psz_eof = strchr( psz_parse, ',' ); \
if( !psz_eof) \
psz_eof = strchr( psz_parse, '}' ); \
if( !psz_eof) \
psz_eof = psz_parse + strlen(psz_parse); \
if( psz_eof ) \
{ \
*psz_eof = '\0' ; \
} \
msg_Dbg(p_intf,"%s -> %s", name,psz_parse) ; \
if(!strcasecmp( psz_parse, "play" ) ) function = Play; \
if(!strcasecmp( psz_parse, "next" ) ) function = Next; \
if(!strcasecmp( psz_parse, "prev" ) ) function = Prev; \
if(!strcasecmp( psz_parse, "fullscreen" ) ) function = Fullscreen; \
if(!strcasecmp( psz_parse, "forward" ) ) function = Forward; \
if(!strcasecmp( psz_parse, "back" ) ) function = Back; \
psz_parse = psz_eof; \
psz_parse ++; \
continue; \
} \
for
(
;
*
psz_parse
;
psz_parse
++
)
{
PARSE
(
"axis-0-up="
,
p_intf
->
p_sys
->
axes
[
0
].
pf_actup
);
PARSE
(
"axis-0-down="
,
p_intf
->
p_sys
->
axes
[
0
].
pf_actdown
);
PARSE
(
"axis-1-up="
,
p_intf
->
p_sys
->
axes
[
1
].
pf_actup
);
PARSE
(
"axis-1-down="
,
p_intf
->
p_sys
->
axes
[
1
].
pf_actdown
);
PARSE
(
"butt-1-up="
,
p_intf
->
p_sys
->
buttons
[
0
].
pf_actup
);
PARSE
(
"butt-1-down="
,
p_intf
->
p_sys
->
buttons
[
0
].
pf_actdown
);
PARSE
(
"butt-2-up="
,
p_intf
->
p_sys
->
buttons
[
1
].
pf_actup
);
PARSE
(
"butt-2-down="
,
p_intf
->
p_sys
->
buttons
[
1
].
pf_actdown
);
}
p_intf
->
p_sys
->
axes
[
0
].
b_trigered
=
VLC_FALSE
;
p_intf
->
p_sys
->
axes
[
0
].
l_time
=
0
;
p_intf
->
p_sys
->
axes
[
1
].
b_trigered
=
VLC_FALSE
;
p_intf
->
p_sys
->
axes
[
1
].
l_time
=
0
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
* handle_event : parse a joystick event and takes the appropriate action *
*****************************************************************************/
static
int
handle_event
(
intf_thread_t
*
p_intf
,
struct
js_event
event
)
{
unsigned
int
i_axis
;
if
(
event
.
type
==
JS_EVENT_AXIS
)
{
/* Third axis is supposed to behave in a different way: it is a
* throttle, and will set a value, without triggering anything */
if
(
event
.
number
==
2
&&
/* Try to avoid Parkinson joysticks */
abs
(
event
.
value
-
p_intf
->
p_sys
->
axes
[
2
].
i_value
)
>
200
)
{
p_intf
->
p_sys
->
axes
[
2
].
i_value
=
event
.
value
;
msg_Dbg
(
p_intf
,
"updating volume"
);
/* This way, the volume is between 0 and 1024 */
aout_VolumeSet
(
p_intf
,
(
32767
-
event
.
value
)
/
64
);
return
0
;
}
p_intf
->
p_sys
->
axes
[
event
.
number
].
b_dowork
=
VLC_FALSE
;
p_intf
->
p_sys
->
axes
[
event
.
number
].
i_value
=
event
.
value
;
if
(
abs
(
event
.
value
)
>
p_intf
->
p_sys
->
i_threshold
&&
p_intf
->
p_sys
->
axes
[
event
.
number
].
b_trigered
==
VLC_FALSE
)
{
/* The axis entered the trigger zone. Start the event */
p_intf
->
p_sys
->
axes
[
event
.
number
].
b_trigered
=
VLC_TRUE
;
p_intf
->
p_sys
->
axes
[
event
.
number
].
b_dowork
=
VLC_TRUE
;
p_intf
->
p_sys
->
axes
[
event
.
number
].
l_time
=
mdate
();
}
else
if
(
abs
(
event
.
value
)
>
p_intf
->
p_sys
->
i_threshold
&&
p_intf
->
p_sys
->
axes
[
event
.
number
].
b_trigered
==
VLC_TRUE
)
{
/* The axis moved but remained in the trigger zone
* Do nothing at this time */
}
else
if
(
abs
(
event
.
value
)
<
p_intf
->
p_sys
->
i_threshold
)
{
/* The axis is not in the trigger zone */
p_intf
->
p_sys
->
axes
[
event
.
number
].
b_trigered
=
VLC_FALSE
;
}
/* Special for seeking */
p_intf
->
p_sys
->
f_seconds
=
1
+
(
abs
(
event
.
value
)
-
p_intf
->
p_sys
->
i_threshold
)
*
(
p_intf
->
p_sys
->
i_maxseek
-
1
)
/
(
32767
-
p_intf
->
p_sys
->
i_threshold
);
/* Handle the first two axes. */
for
(
i_axis
=
0
;
i_axis
<=
1
;
i_axis
++
)
{
if
(
p_intf
->
p_sys
->
axes
[
i_axis
].
b_dowork
==
VLC_TRUE
)
{
if
(
p_intf
->
p_sys
->
axes
[
i_axis
].
i_value
>
p_intf
->
p_sys
->
i_threshold
)
{
msg_Dbg
(
p_intf
,
"up for axis %i
\n
"
,
i_axis
);
p_intf
->
p_sys
->
axes
[
i_axis
].
pf_actup
(
p_intf
);
}
else
if
(
p_intf
->
p_sys
->
axes
[
i_axis
].
i_value
<
-
p_intf
->
p_sys
->
i_threshold
)
{
msg_Dbg
(
p_intf
,
"down for axis %i
\n
"
,
i_axis
);
p_intf
->
p_sys
->
axes
[
i_axis
].
pf_actdown
(
p_intf
);
}
}
}
}
else
if
(
event
.
type
==
JS_EVENT_BUTTON
)
{
msg_Dbg
(
p_intf
,
"button %i %s"
,
event
.
number
,
event
.
value
?
"pressed"
:
"released"
);
if
(
event
.
number
>
1
)
return
0
;
/* Only trigger 2 buttons */
if
(
event
.
value
==
1
)
/* Button pressed */
{
if
(
p_intf
->
p_sys
->
buttons
[
event
.
number
].
pf_actdown
)
p_intf
->
p_sys
->
buttons
[
event
.
number
].
pf_actdown
(
p_intf
);
}
else
/* Button released */
{
if
(
p_intf
->
p_sys
->
buttons
[
event
.
number
].
pf_actup
)
p_intf
->
p_sys
->
buttons
[
event
.
number
].
pf_actup
(
p_intf
);
}
}
return
0
;
}
/****************************************************************************
* The actions
****************************************************************************/
/* Go to next item in the playlist */
static
int
Next
(
intf_thread_t
*
p_intf
)
{
playlist_t
*
p_playlist
;
p_playlist
=
vlc_object_find
(
p_intf
,
VLC_OBJECT_PLAYLIST
,
FIND_ANYWHERE
);
if
(
p_playlist
==
NULL
)
{
return
VLC_ENOOBJ
;
}
playlist_Next
(
p_playlist
);
vlc_object_release
(
p_playlist
);
return
VLC_SUCCESS
;
}
/* Go to previous item in the playlist */
static
int
Prev
(
intf_thread_t
*
p_intf
)
{
playlist_t
*
p_playlist
;
p_playlist
=
vlc_object_find
(
p_intf
,
VLC_OBJECT_PLAYLIST
,
FIND_ANYWHERE
);
if
(
p_playlist
==
NULL
)
{
return
VLC_ENOOBJ
;
}
playlist_Prev
(
p_playlist
);
vlc_object_release
(
p_playlist
);
return
VLC_SUCCESS
;
}
/* Seek forward */
static
int
Forward
(
intf_thread_t
*
p_intf
)
{
if
(
p_intf
->
p_sys
->
p_input
)
{
msg_Dbg
(
p_intf
,
"seeking %f seconds"
,
p_intf
->
p_sys
->
f_seconds
);
var_SetTime
(
p_intf
->
p_sys
->
p_input
,
"time-offset"
,
(
int64_t
)
p_intf
->
p_sys
->
f_seconds
*
I64C
(
1000000
)
);
return
VLC_SUCCESS
;
}
return
VLC_ENOOBJ
;
}
/* Seek backwards */
static
int
Back
(
intf_thread_t
*
p_intf
)
{
if
(
p_intf
->
p_sys
->
p_input
)
{
msg_Dbg
(
p_intf
,
"seeking -%f seconds"
,
p_intf
->
p_sys
->
f_seconds
);
var_SetTime
(
p_intf
->
p_sys
->
p_input
,
"time-offset"
,
-
(
int64_t
)
p_intf
->
p_sys
->
f_seconds
*
I64C
(
1000000
)
);
return
VLC_SUCCESS
;
}
return
VLC_ENOOBJ
;
}
/* Toggle Play/Pause */
static
int
Play
(
intf_thread_t
*
p_intf
)
{
if
(
p_intf
->
p_sys
->
p_input
)
{
var_SetInteger
(
p_intf
->
p_sys
->
p_input
,
"state"
,
PAUSE_S
);
return
VLC_SUCCESS
;
}
return
VLC_ENOOBJ
;
}
/* Toggle fullscreen mode */
static
int
Fullscreen
(
intf_thread_t
*
p_intf
)
{
vout_thread_t
*
p_vout
;
p_vout
=
vlc_object_find
(
p_intf
,
VLC_OBJECT_VOUT
,
FIND_ANYWHERE
);
if
(
p_vout
)
{
p_vout
->
i_changes
|=
VOUT_FULLSCREEN_CHANGE
;
vlc_object_release
(
p_vout
);
}
return
VLC_SUCCESS
;
}
/* dummy event. Use it if you don't wan't anything to happen */
static
int
dummy
(
intf_thread_t
*
p_intf
)
{
return
VLC_SUCCESS
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment