annotate input/joystick.c @ 15533:ddf15d233d58

Do not switch to audio tracks whose codec private data differs from the main audio track's as this will most likely result in messed up audio output. Patch by Michael Behrisch <list () behrisch ! de>
author mosu
date Sat, 21 May 2005 06:50:08 +0000
parents 6180d7558f75
children 5f83daf94eb2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4418
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
1
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
2 #include "../config.h"
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
3
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
4 #ifdef HAVE_JOYSTICK
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
5
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
6 #include "joystick.h"
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
7 #include "input.h"
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
8
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
9 #include <stdlib.h>
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
10 #include <stdio.h>
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
11 #include <string.h>
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
12 #include <unistd.h>
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
13 #include <sys/types.h>
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
14 #include <sys/stat.h>
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
15 #include <fcntl.h>
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
16 #include <errno.h>
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
17
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
18 #ifndef JOY_AXIS_DELTA
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
19 #define JOY_AXIS_DELTA 500
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
20 #endif
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
21
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
22 #ifndef JS_DEV
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
23 #define JS_DEV "/dev/input/js0"
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
24 #endif
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
25
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
26 #ifdef TARGET_LINUX
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
27
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
28 #include <linux/joystick.h>
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
29
4589
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
30 int axis[10];
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
31 int btns = 0;
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
32
4418
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
33 int mp_input_joystick_init(char* dev) {
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
34 int fd,l=0;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
35 int inited = 0;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
36 struct js_event ev;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
37
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
38 printf("Opening joystick device %s\n",dev ? dev : JS_DEV);
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 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
41 if(fd < 0) {
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
42 printf("Can't open joystick device %s : %s\n",dev ? dev : JS_DEV,strerror(errno));
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
43 return -1;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
44 }
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
45
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
46 while(! inited) {
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
47 l = 0;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
48 while((unsigned int)l < sizeof(struct js_event)) {
6156
f961a25a9257 10L bugfix
albeu
parents: 4589
diff changeset
49 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
50 if(r < 0) {
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
51 if(errno == EINTR)
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
52 continue;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
53 else if(errno == EAGAIN) {
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
54 inited = 1;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
55 break;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
56 }
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
57 printf("Error while reading joystick device : %s\n",strerror(errno));
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
58 close(fd);
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 }
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
61 l += r;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
62 }
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
63 if((unsigned int)l < sizeof(struct js_event)) {
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
64 if(l > 0)
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
65 printf("Joystick : we loose %d bytes of data\n",l);
4524
01a0cf736e0d Fix the bugs the previous version should fix (and those introduced
albeu
parents: 4518
diff changeset
66 break;
4418
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
67 }
4589
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
68 ev.type &= ~JS_EVENT_INIT;
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
69 if(ev.type == JS_EVENT_BUTTON)
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
70 btns |= (ev.value << ev.number);
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
71 if(ev.type == JS_EVENT_AXIS)
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
72 axis[ev.number] = ev.value;
4418
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
73 }
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
74
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
75 return fd;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
76 }
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
77
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
78 int mp_input_joystick_read(int fd) {
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
79 struct js_event ev;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
80 int l=0;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
81
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
82 while((unsigned int)l < sizeof(struct js_event)) {
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
83 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
84 if(r <= 0) {
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
85 if(errno == EINTR)
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
86 continue;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
87 else if(errno == EAGAIN)
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
88 return MP_INPUT_NOTHING;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
89 if( r < 0)
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
90 printf("Joystick error while reading joystick device : %s\n",strerror(errno));
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
91 else
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
92 printf("Joystick error while reading joystick device : EOF\n");
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
93 return MP_INPUT_DEAD;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
94 }
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
95 l += r;
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
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
98 if((unsigned int)l < sizeof(struct js_event)) {
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
99 if(l > 0)
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
100 printf("Joystick : we loose %d bytes of data\n",l);
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
101 return MP_INPUT_NOTHING;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
102 }
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
103
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
104 if(ev.type & JS_EVENT_INIT) {
4524
01a0cf736e0d Fix the bugs the previous version should fix (and those introduced
albeu
parents: 4518
diff changeset
105 printf("Joystick : warning init event, we have lost sync with driver\n");
4589
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
106 ev.type &= ~JS_EVENT_INIT;
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
107 if(ev.type == JS_EVENT_BUTTON) {
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
108 int s = (btns >> ev.number) & 1;
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
109 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
110 return MP_INPUT_NOTHING;
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
111 }
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
112 if(ev.type == JS_EVENT_AXIS) {
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
113 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
114 (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
115 (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
116 ) // State is the same : ignore
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
117 return MP_INPUT_NOTHING;
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
118 }
4418
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
119 }
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
120
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
121 if(ev.type & JS_EVENT_BUTTON) {
4589
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
122 btns &= ~(1 << ev.number);
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
123 btns |= (ev.value << ev.number);
4524
01a0cf736e0d Fix the bugs the previous version should fix (and those introduced
albeu
parents: 4518
diff changeset
124 if(ev.value == 1)
4589
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
125 return ((JOY_BTN0+ev.number) | MP_KEY_DOWN);
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
126 else
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
127 return (JOY_BTN0+ev.number);
4418
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
128 } else if(ev.type & JS_EVENT_AXIS) {
4589
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
129 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
130 axis[ev.number] = -1;
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
131 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
132 } 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
133 axis[ev.number] = 1;
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
134 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
135 } 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
136 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
137 axis[ev.number] = 0;
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
138 return r;
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
139 } else
4ce20c55a18a Added support for key combination and mouse buttons key code
albeu
parents: 4524
diff changeset
140 return MP_INPUT_NOTHING;
4418
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
141 } else {
10397
6180d7558f75 output typo fixes: unknow --> unknown
diego
parents: 6156
diff changeset
142 printf("Joystick warning unknown event type %d\n",ev.type);
4418
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
143 return MP_INPUT_ERROR;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
144 }
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
145
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
146 return MP_INPUT_NOTHING;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
147 }
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
148
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
149 #else
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
150
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
151 // dummy function
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
152
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
153 int mp_input_joystick_init(char* dev) {
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
154 return -1;
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
155 }
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
156
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
157 int mp_input_joystick_read(int fd) {
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
158
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
159 return MP_INPUT_NOTHING;
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
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
162 #endif
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
163
8141d2c399e4 A new configurable input system and joystick support for this system
albeu
parents:
diff changeset
164 #endif