Mercurial > mplayer.hg
annotate input/joystick.c @ 30811:50e0f6942e43
Implement Win32 mutexes.
Implement Win32 mutexes; they used to just be mapped on top of events, which
is not the same thing at all.
The implementation is pretty much the obvious one, similar to the
current critical section implementation and the semaphore implementation;
a single lock count protected by a pthread mutex, and an event lockers can
sleep on to know when the mutex is available.
Also make CreateMutexA and ReleaseMutex available even if QuickTime codecs
support is not configured.
author | sesse |
---|---|
date | Sat, 06 Mar 2010 10:13:37 +0000 |
parents | 0f1b5b68af32 |
children | 277ec491a8a7 |
rev | line source |
---|---|
28112 | 1 /* |
2 * This file is part of MPlayer. | |
3 * | |
4 * MPlayer is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * MPlayer is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License along | |
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
17 */ | |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
18 |
16860 | 19 #include "config.h" |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
20 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
21 #include "joystick.h" |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
22 #include "input.h" |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
23 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
24 #include <stdlib.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
25 #include <stdio.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
26 #include <string.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
27 #include <unistd.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
28 #include <sys/types.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
29 #include <sys/stat.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
30 #include <fcntl.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
31 #include <errno.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
32 |
16855 | 33 #include "mp_msg.h" |
34 #include "help_mp.h" | |
35 | |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
36 #ifndef JOY_AXIS_DELTA |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
37 #define JOY_AXIS_DELTA 500 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
38 #endif |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
39 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
40 #ifndef JS_DEV |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
41 #define JS_DEV "/dev/input/js0" |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
42 #endif |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
43 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
44 #include <linux/joystick.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
45 |
18005 | 46 int axis[256]; |
4589
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
47 int btns = 0; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
48 |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
49 int mp_input_joystick_init(char* dev) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
50 int fd,l=0; |
25962 | 51 int initialized = 0; |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
52 struct js_event ev; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28112
diff
changeset
|
53 |
20185 | 54 mp_msg(MSGT_INPUT,MSGL_V,MSGTR_INPUT_JOYSTICK_Opening,dev ? dev : JS_DEV); |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
55 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
56 fd = open( dev ? dev : JS_DEV , O_RDONLY | O_NONBLOCK ); |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
57 if(fd < 0) { |
16855 | 58 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_JOYSTICK_CantOpen,dev ? dev : JS_DEV,strerror(errno)); |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
59 return -1; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
60 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28112
diff
changeset
|
61 |
25962 | 62 while(! initialized) { |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
63 l = 0; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
64 while((unsigned int)l < sizeof(struct js_event)) { |
6156 | 65 int r = read(fd,((char*)&ev)+l,sizeof(struct js_event)-l); |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
66 if(r < 0) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
67 if(errno == EINTR) |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
68 continue; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
69 else if(errno == EAGAIN) { |
25962 | 70 initialized = 1; |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
71 break; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
72 } |
16855 | 73 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_JOYSTICK_ErrReading,strerror(errno)); |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
74 close(fd); |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
75 return -1; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28112
diff
changeset
|
76 } |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
77 l += r; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
78 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
79 if((unsigned int)l < sizeof(struct js_event)) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
80 if(l > 0) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28112
diff
changeset
|
81 mp_msg(MSGT_INPUT,MSGL_WARN,MSGTR_INPUT_JOYSTICK_LoosingBytes,l); |
4524
01a0cf736e0d
Fix the bugs the previous version should fix (and those introduced
albeu
parents:
4518
diff
changeset
|
82 break; |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
83 } |
4589
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
84 if(ev.type == JS_EVENT_BUTTON) |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
85 btns |= (ev.value << ev.number); |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
86 if(ev.type == JS_EVENT_AXIS) |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
87 axis[ev.number] = ev.value; |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
88 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28112
diff
changeset
|
89 |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
90 return fd; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
91 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
92 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
93 int mp_input_joystick_read(int fd) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
94 struct js_event ev; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
95 int l=0; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
96 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
97 while((unsigned int)l < sizeof(struct js_event)) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
98 int r = read(fd,&ev+l,sizeof(struct js_event)-l); |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
99 if(r <= 0) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
100 if(errno == EINTR) |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
101 continue; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
102 else if(errno == EAGAIN) |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
103 return MP_INPUT_NOTHING; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
104 if( r < 0) |
16855 | 105 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_JOYSTICK_ErrReading,strerror(errno)); |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
106 else |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28112
diff
changeset
|
107 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_JOYSTICK_ErrReading,"EOF"); |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
108 return MP_INPUT_DEAD; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28112
diff
changeset
|
109 } |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
110 l += r; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
111 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
112 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
113 if((unsigned int)l < sizeof(struct js_event)) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
114 if(l > 0) |
16855 | 115 mp_msg(MSGT_INPUT,MSGL_WARN,MSGTR_INPUT_JOYSTICK_LoosingBytes,l); |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
116 return MP_INPUT_NOTHING; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
117 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
118 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
119 if(ev.type & JS_EVENT_INIT) { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28112
diff
changeset
|
120 mp_msg(MSGT_INPUT,MSGL_WARN,MSGTR_INPUT_JOYSTICK_WarnLostSync); |
4589
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
121 ev.type &= ~JS_EVENT_INIT; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
122 if(ev.type == JS_EVENT_BUTTON) { |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
123 int s = (btns >> ev.number) & 1; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
124 if(s == ev.value) // State is the same : ignore |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
125 return MP_INPUT_NOTHING; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
126 } |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
127 if(ev.type == JS_EVENT_AXIS) { |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
128 if( ( axis[ev.number] == 1 && ev.value > JOY_AXIS_DELTA) || |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
129 (axis[ev.number] == -1 && ev.value < -JOY_AXIS_DELTA) || |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
130 (axis[ev.number] == 0 && ev.value >= -JOY_AXIS_DELTA && ev.value <= JOY_AXIS_DELTA) |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
131 ) // State is the same : ignore |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
132 return MP_INPUT_NOTHING; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28112
diff
changeset
|
133 } |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
134 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28112
diff
changeset
|
135 |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
136 if(ev.type & JS_EVENT_BUTTON) { |
4589
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
137 btns &= ~(1 << ev.number); |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
138 btns |= (ev.value << ev.number); |
4524
01a0cf736e0d
Fix the bugs the previous version should fix (and those introduced
albeu
parents:
4518
diff
changeset
|
139 if(ev.value == 1) |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26080
diff
changeset
|
140 return (JOY_BTN0 + ev.number) | MP_KEY_DOWN; |
4589
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
141 else |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26080
diff
changeset
|
142 return JOY_BTN0 + ev.number; |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
143 } else if(ev.type & JS_EVENT_AXIS) { |
4589
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
144 if(ev.value < -JOY_AXIS_DELTA && axis[ev.number] != -1) { |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
145 axis[ev.number] = -1; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
146 return (JOY_AXIS0_MINUS+(2*ev.number)) | MP_KEY_DOWN; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
147 } else if(ev.value > JOY_AXIS_DELTA && axis[ev.number] != 1) { |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
148 axis[ev.number] = 1; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
149 return (JOY_AXIS0_PLUS+(2*ev.number)) | MP_KEY_DOWN; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
150 } else if(ev.value <= JOY_AXIS_DELTA && ev.value >= -JOY_AXIS_DELTA && axis[ev.number] != 0) { |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
151 int r = axis[ev.number] == 1 ? JOY_AXIS0_PLUS+(2*ev.number) : JOY_AXIS0_MINUS+(2*ev.number); |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
152 axis[ev.number] = 0; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
153 return r; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
154 } else |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
155 return MP_INPUT_NOTHING; |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
156 } else { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28112
diff
changeset
|
157 mp_msg(MSGT_INPUT,MSGL_WARN,MSGTR_INPUT_JOYSTICK_WarnUnknownEvent,ev.type); |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
158 return MP_INPUT_ERROR; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
159 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
160 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
161 return MP_INPUT_NOTHING; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
162 } |