patch: xbmc and lirc

Juergen Lock nox at jelal.kn-bremen.de
Sat Mar 5 20:50:21 UTC 2011


Hi!

 So the xbmc port atm doesn't build its lirc client code because
that code uses inotify() which is a Linuxism.  Today I took a closer
look and found it actually only uses inotify() to find out when
lircd is stopped, which at least on FreeBSD it will also find out
by receiving an eof from the socket fd so we can actually just
disable the inotify() code.  Did that, added an autoconf check
for good measure, and that got lirc working. :)

 I've put the patch here:

	http://people.freebsd.org/~nox/dvb/xbmc/patch-xbmc-lirc.txt

(the first hunk is actually redundant, instead you should just
remove files/patch-guilib__common__Makefile.in - I'll add the
patch without it at the end.)

 The mceusb remote works as is then with webcamd, for dvb tuner
remotes supported by the Linux code webcamd uses you can start
with this ~/.xbmc/userdata/Lircmap.xml :

	http://people.freebsd.org/~nox/dvb/xbmc/Lircmap.xml

note the comments at the beginning, you may need to remap
important buttons for your particular remote.  Also see here:

	http://wiki.xbmc.org/index.php?title=HOW-TO_setup_Lirc_to_talk_to_XBMC

 And here comes the patch.  Enjoy, :)
	Juergen

--- guilib/system.h.orig
+++ guilib/system.h
@@ -135,9 +135,7 @@
 #define HAS_GLX
 #define HAS_LINUX_NETWORK
 #define HAS_SDL_AUDIO
-#if !defined(__FreeBSD__)
 #define HAS_LIRC
-#endif
 #define HAS_SDL_WIN_EVENTS
 #ifdef HAVE_LIBPULSE
 #define HAS_PULSEAUDIO
--- configure.in.orig
+++ configure.in
@@ -516,7 +516,7 @@ AC_FUNC_STRFTIME
 AC_FUNC_STRTOD
 AC_FUNC_UTIME_NULL
 AC_FUNC_VPRINTF
-AC_CHECK_FUNCS([atexit dup2 fdatasync floor fs_stat_dev ftime ftruncate getcwd gethostbyaddr gethostbyname gethostname getpagesize getpass gettimeofday inet_ntoa lchown localeconv memchr memmove memset mkdir modf munmap pow rmdir select setenv setlocale socket sqrt strcasecmp strchr strcspn strdup strerror strncasecmp strpbrk strrchr strspn strstr strtol strtoul sysinfo tzset utime])
+AC_CHECK_FUNCS([atexit dup2 fdatasync floor fs_stat_dev ftime ftruncate getcwd gethostbyaddr gethostbyname gethostname getpagesize getpass gettimeofday inet_ntoa inotify lchown localeconv memchr memmove memset mkdir modf munmap pow rmdir select setenv setlocale socket sqrt strcasecmp strchr strcspn strdup strerror strncasecmp strpbrk strrchr strspn strstr strtol strtoul sysinfo tzset utime])
 
 # Check for various sizes
 AC_CHECK_SIZEOF([int])
--- guilib/common/LIRC.cpp.orig
+++ guilib/common/LIRC.cpp
@@ -19,11 +19,14 @@
 *
 */
 
+#include "config.h"
 #include <sys/time.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/un.h>
+#ifdef HAVE_INOTIFY
 #include <sys/inotify.h>
+#endif
 #include <limits.h>
 #include <unistd.h>
 #include "LIRC.h"
@@ -92,12 +95,14 @@ void CRemoteControl::Disconnect()
       close(m_fd);
     m_fd = -1;
     m_file = NULL;
+#ifdef HAVE_INOTIFY
     if (m_inotify_wd >= 0) {
       inotify_rm_watch(m_inotify_fd, m_inotify_wd);
       m_inotify_wd = -1;
     }
     if (m_inotify_fd >= 0)
       close(m_inotify_fd);
+#endif
 
     m_inReply = false;
     m_nrSending = 0;
@@ -148,6 +153,7 @@ void CRemoteControl::Initialize()
         {
           if ((m_file = fdopen(m_fd, "r+")) != NULL)
           {
+#ifdef HAVE_INOTIFY
             // Setup inotify so we can disconnect if lircd is restarted
             if ((m_inotify_fd = inotify_init()) >= 0)
             {
@@ -168,6 +174,10 @@ void CRemoteControl::Initialize()
                 }
               }
             }
+#else
+            m_bInitialized = true;
+            CLog::Log(LOGINFO, "LIRC %s: sucessfully started", __FUNCTION__);
+#endif
           }
           else
             CLog::Log(LOGERROR, "LIRC %s: fdopen failed: %s", __FUNCTION__, strerror(errno));
@@ -206,6 +216,7 @@ void CRemoteControl::Initialize()
 }
 
 bool CRemoteControl::CheckDevice() {
+#ifdef HAVE_INOTIFY
   if (m_inotify_fd < 0 || m_inotify_wd < 0)
     return true; // inotify wasn't setup for some reason, assume all is well
   int bufsize = sizeof(struct inotify_event) + PATH_MAX;
@@ -220,6 +231,7 @@ bool CRemoteControl::CheckDevice() {
     }
     i += sizeof(struct inotify_event)+e->len;
   }
+#endif
   return true;
 }
 


More information about the freebsd-multimedia mailing list