summaryrefslogtreecommitdiffstats
path: root/input
diff options
context:
space:
mode:
Diffstat (limited to 'input')
-rw-r--r--input/appleir.c152
-rw-r--r--input/ar.h5
-rw-r--r--input/input.c14
-rw-r--r--input/input.h1
-rw-r--r--input/joystick.c4
5 files changed, 174 insertions, 2 deletions
diff --git a/input/appleir.c b/input/appleir.c
new file mode 100644
index 0000000000..756c66047d
--- /dev/null
+++ b/input/appleir.c
@@ -0,0 +1,152 @@
+/*
+ * Linux Apple IR Remote input interface
+ *
+ * Copyright (C) 2008 Benjamin Zores <ben at geexbox dot org>
+ *
+ * This file is part of MPlayer.
+ *
+ * MPlayer 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.
+ *
+ * MPlayer 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 MPlayer; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "config.h"
+
+#include "ar.h"
+#include "input.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include <linux/types.h>
+#include <linux/input.h>
+
+#include "mp_msg.h"
+#include "help_mp.h"
+
+#define EVDEV_MAX_EVENTS 32
+
+/* ripped from AppleIR driver */
+#define USB_VENDOR_APPLE 0x05ac
+#define USB_DEV_APPLE_IR 0x8240
+#define USB_DEV_APPLE_IR_2 0x8242
+
+/* Apple IR Remote evdev mapping */
+#define APPLE_IR_MINUS KEY_VOLUMEDOWN
+#define APPLE_IR_PLUS KEY_VOLUMEUP
+#define APPLE_IR_MENU KEY_MENU
+#define APPLE_IR_FORWARD KEY_NEXTSONG
+#define APPLE_IR_PLAY KEY_PLAYPAUSE
+#define APPLE_IR_BACKWARD KEY_PREVIOUSSONG
+
+static const struct {
+ int linux_keycode;
+ int value;
+ int mp_keycode;
+} apple_ir_mapping[] = {
+ { APPLE_IR_PLAY, 1, AR_PLAY },
+ { APPLE_IR_PLAY, 2, AR_PLAY_HOLD },
+ { APPLE_IR_FORWARD, 1, AR_NEXT },
+ { APPLE_IR_FORWARD, 2, AR_NEXT_HOLD },
+ { APPLE_IR_BACKWARD, 1, AR_PREV },
+ { APPLE_IR_BACKWARD, 2, AR_PREV_HOLD },
+ { APPLE_IR_MENU, 1, AR_MENU },
+ { APPLE_IR_MENU, 2, AR_MENU_HOLD },
+ { APPLE_IR_PLUS, 1, AR_VUP },
+ { APPLE_IR_MINUS, 1, AR_VDOWN },
+ { -1, -1, -1 }
+};
+
+int mp_input_appleir_init (char *dev)
+{
+ int i, fd;
+
+ if (dev)
+ {
+ mp_msg (MSGT_INPUT, MSGL_V, MSGTR_INPUT_APPLE_IR_Init, dev);
+ fd = open (dev, O_RDONLY | O_NONBLOCK);
+ if (fd < 0)
+ {
+ mp_msg (MSGT_INPUT, MSGL_ERR,
+ MSGTR_INPUT_APPLE_IR_CantOpen, strerror (errno));
+ return -1;
+ }
+
+ return fd;
+ }
+ else
+ {
+ /* look for a valid AppleIR device on system */
+ for (i = 0; i < EVDEV_MAX_EVENTS; i++)
+ {
+ struct input_id id;
+ char file[64];
+
+ sprintf (file, "/dev/input/event%d", i);
+ fd = open (file, O_RDONLY | O_NONBLOCK);
+ if (fd < 0)
+ continue;
+
+ ioctl (fd, EVIOCGID, &id);
+ if (id.bustype == BUS_USB &&
+ id.vendor == USB_VENDOR_APPLE &&
+ (id.product == USB_DEV_APPLE_IR ||id.product == USB_DEV_APPLE_IR_2))
+ {
+ mp_msg (MSGT_INPUT, MSGL_V, MSGTR_INPUT_APPLE_IR_Detect, file);
+ return fd;
+ }
+ close (fd);
+ }
+
+ mp_msg (MSGT_INPUT, MSGL_ERR,
+ MSGTR_INPUT_APPLE_IR_CantOpen, strerror (errno));
+ }
+
+ return -1;
+}
+
+int mp_input_appleir_read(void *ctx, int fd)
+{
+ struct input_event ev;
+ int i, r;
+
+ r = read (fd, &ev, sizeof (struct input_event));
+ if (r <= 0 || r < sizeof (struct input_event))
+ return MP_INPUT_NOTHING;
+
+ /* check for key press only */
+ if (ev.type != EV_KEY)
+ return MP_INPUT_NOTHING;
+
+ /* EvDev Key values:
+ * 0: key release
+ * 1: key press
+ * 2: key auto-repeat
+ */
+ if (ev.value == 0)
+ return MP_INPUT_NOTHING;
+
+ /* find Linux evdev -> MPlayer keycode mapping */
+ for (i = 0; apple_ir_mapping[i].linux_keycode != -1; i++)
+ if (apple_ir_mapping[i].linux_keycode == ev.code &&
+ apple_ir_mapping[i].value == ev.value)
+ return apple_ir_mapping[i].mp_keycode;
+
+ return MP_INPUT_NOTHING;
+}
diff --git a/input/ar.h b/input/ar.h
index a52dccc4c8..12944f84e1 100644
--- a/input/ar.h
+++ b/input/ar.h
@@ -35,8 +35,13 @@
#define AR_VUP (AR_BASE + 8)
#define AR_VDOWN (AR_BASE + 9)
+/* MacOSX Driver */
int mp_input_ar_init(void);
int mp_input_ar_read(void *ctx, int fd);
void mp_input_ar_close(int fd);
+/* Linux Driver */
+int mp_input_appleir_init(char* dev);
+int mp_input_appleir_read(void *ctx, int fd);
+
#endif /* MPLAYER_AR_H */
diff --git a/input/input.c b/input/input.c
index dee2f3a7f7..940076aab6 100644
--- a/input/input.c
+++ b/input/input.c
@@ -75,6 +75,7 @@ static const mp_cmd_t mp_cmds[] = {
{ MP_CMD_SPEED_MULT, "speed_mult", 1, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } },
{ MP_CMD_SPEED_SET, "speed_set", 1, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } },
{ MP_CMD_QUIT, "quit", 0, { {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
+ { MP_CMD_STOP, "stop", 0, { {-1,{0}} } },
{ MP_CMD_PAUSE, "pause", 0, { {-1,{0}} } },
{ MP_CMD_FRAME_STEP, "frame_step", 0, { {-1,{0}} } },
{ MP_CMD_PLAY_TREE_STEP, "pt_step",1, { { MP_CMD_ARG_INT ,{0}}, { MP_CMD_ARG_INT ,{0}}, {-1,{0}} } },
@@ -484,6 +485,7 @@ static const mp_cmd_bind_t def_cmd_binds[] = {
{ { '!', 0 }, "seek_chapter -1" },
{ { '@', 0 }, "seek_chapter 1" },
{ { 'A', 0 }, "switch_angle 1" },
+ { { 'U', 0 }, "stop" },
{ { 0 }, NULL }
};
@@ -599,6 +601,7 @@ static const m_option_t input_conf[] = {
{ "keylist", print_key_list, CONF_TYPE_FUNC, CONF_GLOBAL, 0, 0, NULL },
{ "cmdlist", print_cmd_list, CONF_TYPE_FUNC, CONF_GLOBAL, 0, 0, NULL },
OPT_STRING("js-dev", input.js_dev, CONF_GLOBAL),
+ OPT_STRING("ar-dev", input.ar_dev, CONF_GLOBAL),
OPT_STRING("file", input.in_file, CONF_GLOBAL),
{ NULL, NULL, 0, 0, 0, 0, NULL}
};
@@ -1741,6 +1744,17 @@ struct input_ctx *mp_input_init(struct input_conf *input_conf, int use_gui)
}
#endif
+#ifdef HAVE_APPLE_IR
+ if (input_conf->use_ar) {
+ int fd = mp_input_appleir_init(input_conf->ar_dev);
+ if(fd < 0)
+ mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrCantInitAppleRemote);
+ else
+ mp_input_add_key_fd(ictx, fd, 1, mp_input_appleir_read,
+ (mp_close_func_t)close, NULL);
+ }
+#endif
+
if (input_conf->in_file) {
struct stat st;
if (stat(input_conf->in_file, &st))
diff --git a/input/input.h b/input/input.h
index 0a09f68d2c..9f87d57596 100644
--- a/input/input.h
+++ b/input/input.h
@@ -109,6 +109,7 @@
#define MP_CMD_SWITCH_ANGLE 105
#define MP_CMD_ASS_USE_MARGINS 106
#define MP_CMD_SWITCH_TITLE 107
+#define MP_CMD_STOP 108
#define MP_CMD_GUI_EVENTS 5000
#define MP_CMD_GUI_LOADFILE 5001
diff --git a/input/joystick.c b/input/joystick.c
index 02e00d207f..d50b8678a2 100644
--- a/input/joystick.c
+++ b/input/joystick.c
@@ -120,9 +120,9 @@ int mp_input_joystick_read(void *ctx, int fd) {
btns &= ~(1 << ev.number);
btns |= (ev.value << ev.number);
if(ev.value == 1)
- return ((JOY_BTN0+ev.number) | MP_KEY_DOWN);
+ return (JOY_BTN0 + ev.number) | MP_KEY_DOWN;
else
- return (JOY_BTN0+ev.number);
+ return JOY_BTN0 + ev.number;
} else if(ev.type & JS_EVENT_AXIS) {
if(ev.value < -JOY_AXIS_DELTA && axis[ev.number] != -1) {
axis[ev.number] = -1;