Mercurial > mplayer.hg
annotate input/appleir.c @ 26845:a9fdb0a478a7
sync w/r26863, patch by JRaSH % jrash06 A 163 P com %
author | gpoirier |
---|---|
date | Sun, 25 May 2008 17:01:04 +0000 |
parents | 5ca7a8309193 |
children | 0f1b5b68af32 |
rev | line source |
---|---|
26763
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
1 /* |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
2 * Linux Apple IR Remote input interface |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
3 * |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
4 * Copyright (C) 2008 Benjamin Zores <ben at geexbox dot org> |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
5 * |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
6 * This file is part of MPlayer. |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
7 * |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
8 * MPlayer is free software; you can redistribute it and/or modify |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
9 * it under the terms of the GNU General Public License as published by |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
10 * the Free Software Foundation; either version 2 of the License, or |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
11 * (at your option) any later version. |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
12 * |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
13 * MPlayer is distributed in the hope that it will be useful, |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
16 * GNU General Public License for more details. |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
17 * |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
18 * You should have received a copy of the GNU General Public License along |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
19 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
21 */ |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
22 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
23 #include "config.h" |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
24 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
25 #include "ar.h" |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
26 #include "input.h" |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
27 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
28 #include <stdlib.h> |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
29 #include <stdio.h> |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
30 #include <string.h> |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
31 #include <unistd.h> |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
32 #include <sys/types.h> |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
33 #include <sys/stat.h> |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
34 #include <fcntl.h> |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
35 #include <errno.h> |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
36 |
26809 | 37 #include <linux/types.h> |
26763
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
38 #include <linux/input.h> |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
39 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
40 #include "mp_msg.h" |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
41 #include "help_mp.h" |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
42 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
43 #define EVDEV_MAX_EVENTS 32 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
44 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
45 /* ripped from AppleIR driver */ |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
46 #define USB_VENDOR_APPLE 0x05ac |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
47 #define USB_DEV_APPLE_IR 0x8240 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
48 #define USB_DEV_APPLE_IR_2 0x8242 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
49 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
50 /* Apple IR Remote evdev mapping */ |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
51 #define APPLE_IR_MINUS KEY_VOLUMEDOWN |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
52 #define APPLE_IR_PLUS KEY_VOLUMEUP |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
53 #define APPLE_IR_MENU KEY_MENU |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
54 #define APPLE_IR_FORWARD KEY_NEXTSONG |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
55 #define APPLE_IR_PLAY KEY_PLAYPAUSE |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
56 #define APPLE_IR_BACKWARD KEY_PREVIOUSSONG |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
57 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
58 static const struct { |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
59 int linux_keycode; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
60 int value; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
61 int mp_keycode; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
62 } apple_ir_mapping[] = { |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
63 { APPLE_IR_PLAY, 1, AR_PLAY }, |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
64 { APPLE_IR_PLAY, 2, AR_PLAY_HOLD }, |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
65 { APPLE_IR_FORWARD, 1, AR_NEXT }, |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
66 { APPLE_IR_FORWARD, 2, AR_NEXT_HOLD }, |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
67 { APPLE_IR_BACKWARD, 1, AR_PREV }, |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
68 { APPLE_IR_BACKWARD, 2, AR_PREV_HOLD }, |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
69 { APPLE_IR_MENU, 1, AR_MENU }, |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
70 { APPLE_IR_MENU, 2, AR_MENU_HOLD }, |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
71 { APPLE_IR_PLUS, 1, AR_VUP }, |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
72 { APPLE_IR_MINUS, 1, AR_VDOWN }, |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
73 { -1, -1, -1 } |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
74 }; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
75 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
76 int mp_input_appleir_init (char *dev) |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
77 { |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
78 int i, fd; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
79 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
80 if (dev) |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
81 { |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
82 mp_msg (MSGT_INPUT, MSGL_V, MSGTR_INPUT_APPLE_IR_Init, dev); |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
83 fd = open (dev, O_RDONLY | O_NONBLOCK); |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
84 if (fd < 0) |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
85 { |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
86 mp_msg (MSGT_INPUT, MSGL_ERR, |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
87 MSGTR_INPUT_APPLE_IR_CantOpen, strerror (errno)); |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
88 return -1; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
89 } |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
90 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
91 return fd; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
92 } |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
93 else |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
94 { |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
95 /* look for a valid AppleIR device on system */ |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
96 for (i = 0; i < EVDEV_MAX_EVENTS; i++) |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
97 { |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
98 struct input_id id; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
99 char file[64]; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
100 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
101 sprintf (file, "/dev/input/event%d", i); |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
102 fd = open (file, O_RDONLY | O_NONBLOCK); |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
103 if (fd < 0) |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
104 continue; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
105 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
106 ioctl (fd, EVIOCGID, &id); |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
107 if (id.bustype == BUS_USB && |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
108 id.vendor == USB_VENDOR_APPLE && |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
109 (id.product == USB_DEV_APPLE_IR ||id.product == USB_DEV_APPLE_IR_2)) |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
110 { |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
111 mp_msg (MSGT_INPUT, MSGL_V, MSGTR_INPUT_APPLE_IR_Detect, file); |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
112 return fd; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
113 } |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
114 close (fd); |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
115 } |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
116 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
117 mp_msg (MSGT_INPUT, MSGL_ERR, |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
118 MSGTR_INPUT_APPLE_IR_CantOpen, strerror (errno)); |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
119 } |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
120 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
121 return -1; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
122 } |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
123 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
124 int mp_input_appleir_read (int fd) |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
125 { |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
126 struct input_event ev; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
127 int i, r; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
128 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
129 r = read (fd, &ev, sizeof (struct input_event)); |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
130 if (r <= 0 || r < sizeof (struct input_event)) |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
131 return MP_INPUT_NOTHING; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
132 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
133 /* check for key press only */ |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
134 if (ev.type != EV_KEY) |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
135 return MP_INPUT_NOTHING; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
136 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
137 /* EvDev Key values: |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
138 * 0: key release |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
139 * 1: key press |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
140 * 2: key auto-repeat |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
141 */ |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
142 if (ev.value == 0) |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
143 return MP_INPUT_NOTHING; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
144 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
145 /* find Linux evdev -> MPlayer keycode mapping */ |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
146 for (i = 0; apple_ir_mapping[i].linux_keycode != -1; i++) |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
147 if (apple_ir_mapping[i].linux_keycode == ev.code && |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
148 apple_ir_mapping[i].value == ev.value) |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
149 return apple_ir_mapping[i].mp_keycode; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
150 |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
151 return MP_INPUT_NOTHING; |
c13288eeb9f6
Add support for AppleIR Remote as an input under Linux systems.
ben
parents:
diff
changeset
|
152 } |