2 * Linux Apple IR Remote input interface
4 * Copyright (C) 2008 Benjamin Zores <ben at geexbox dot org>
6 * This file is part of MPlayer.
8 * MPlayer is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * MPlayer is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License along
19 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
32 #include <sys/types.h>
37 #include <linux/types.h>
38 #include <linux/input.h>
42 // keycodes.h defines would conflict with linux/input.h ones
43 #define AR_DEFINES_ONLY
46 #define EVDEV_MAX_EVENTS 32
48 /* ripped from AppleIR driver */
49 #define USB_VENDOR_APPLE 0x05ac
50 #define USB_DEV_APPLE_IR 0x8240
51 #define USB_DEV_APPLE_IR_2 0x8242
53 /* Apple IR Remote evdev mapping */
54 #define APPLE_IR_MINUS KEY_VOLUMEDOWN
55 #define APPLE_IR_PLUS KEY_VOLUMEUP
56 #define APPLE_IR_MENU KEY_MENU
57 #define APPLE_IR_FORWARD KEY_NEXTSONG
58 #define APPLE_IR_PLAY KEY_PLAYPAUSE
59 #define APPLE_IR_BACKWARD KEY_PREVIOUSSONG
65 } apple_ir_mapping
[] = {
66 { APPLE_IR_PLAY
, 1, AR_PLAY
},
67 { APPLE_IR_PLAY
, 2, AR_PLAY_HOLD
},
68 { APPLE_IR_FORWARD
, 1, AR_NEXT
},
69 { APPLE_IR_FORWARD
, 2, AR_NEXT_HOLD
},
70 { APPLE_IR_BACKWARD
, 1, AR_PREV
},
71 { APPLE_IR_BACKWARD
, 2, AR_PREV_HOLD
},
72 { APPLE_IR_MENU
, 1, AR_MENU
},
73 { APPLE_IR_MENU
, 2, AR_MENU_HOLD
},
74 { APPLE_IR_PLUS
, 1, AR_VUP
},
75 { APPLE_IR_MINUS
, 1, AR_VDOWN
},
79 int mp_input_appleir_init (char *dev
)
85 mp_tmsg (MSGT_INPUT
, MSGL_V
, "Initializing Apple IR on %s\n", dev
);
86 fd
= open (dev
, O_RDONLY
| O_NONBLOCK
);
89 mp_tmsg (MSGT_INPUT
, MSGL_ERR
,
90 "Can't open Apple IR device: %s\n", strerror (errno
));
98 /* look for a valid AppleIR device on system */
99 for (i
= 0; i
< EVDEV_MAX_EVENTS
; i
++)
104 sprintf (file
, "/dev/input/event%d", i
);
105 fd
= open (file
, O_RDONLY
| O_NONBLOCK
);
109 ioctl (fd
, EVIOCGID
, &id
);
110 if (id
.bustype
== BUS_USB
&&
111 id
.vendor
== USB_VENDOR_APPLE
&&
112 (id
.product
== USB_DEV_APPLE_IR
||id
.product
== USB_DEV_APPLE_IR_2
))
114 mp_tmsg (MSGT_INPUT
, MSGL_V
, "Detected Apple IR on %s\n", file
);
120 mp_tmsg (MSGT_INPUT
, MSGL_ERR
,
121 "Can't open Apple IR device: %s\n", strerror (errno
));
127 int mp_input_appleir_read(void *ctx
, int fd
)
129 struct input_event ev
;
132 r
= read (fd
, &ev
, sizeof (struct input_event
));
133 if (r
<= 0 || r
< sizeof (struct input_event
))
134 return MP_INPUT_NOTHING
;
136 /* check for key press only */
137 if (ev
.type
!= EV_KEY
)
138 return MP_INPUT_NOTHING
;
146 return MP_INPUT_NOTHING
;
148 /* find Linux evdev -> MPlayer keycode mapping */
149 for (i
= 0; apple_ir_mapping
[i
].linux_keycode
!= -1; i
++)
150 if (apple_ir_mapping
[i
].linux_keycode
== ev
.code
&&
151 apple_ir_mapping
[i
].value
== ev
.value
)
152 return apple_ir_mapping
[i
].mp_keycode
;
154 return MP_INPUT_NOTHING
;