diff --git a/configure.in b/configure.in index 9701cfdb..bc94cea0 100644 --- a/configure.in +++ b/configure.in @@ -85,48 +85,42 @@ dnl XMMS_SUPPORT dnl xmms_support=none -AC_ARG_ENABLE(xmms-support, - [ --enable-xmms-support[[=project]] - Specify the XMMS-related Project: - none: none [[default]] - xmms: XMMS (version 1) Support - bmp: Beep Media Player (not BMPx) Support - audacious: Audacious (version >= 0.1) Media Player Support - infopipe: XMMS/BMP InfoPipe (version 1.3) Plugin Support ], +AC_ARG_ENABLE(xmms, + [ --enable-xmms[[=project]] none,xmms,bmp,audacious,infopipe [[default=none]]], [xmms_support="$enableval"]) case x$xmms_support in xnone|xyes|xno) ;; xxmms) - AC_DEFINE(XMMS_H, 1, [Define for XMMS support]) + AC_DEFINE(XMMS, 1, [Define for XMMS Version 1 support]) echo "Sorry, xmms isn't supported yet" exit -1 ;; xbmp) - PKG_CHECK_MODULES([BMP], [bmp], []) - CFLAGS="$CFLAGS $BMP_CFLAGS" - LIBS="$LIBS $BMP_LIBS" - AC_DEFINE(BMP_H, 1, [Define for BMP support]) + PKG_CHECK_MODULES([XMMS], [bmp], []) + CFLAGS="$CFLAGS $XMMS_CFLAGS" + LIBS="$LIBS $XMMS_LIBS" + AC_DEFINE(BMP, 1, [Define for BMP support]) ;; xaudacious) - PKG_CHECK_MODULES([AUDACIOUS], [audacious >= 0.1]) - CFLAGS="$CFLAGS $AUDACIOUS_CFLAGS" - LIBS="$LIBS $AUDACIOUS_LIBS" - AC_DEFINE(AUDACIOUS_H, 1, [Define for Audacious support]) + PKG_CHECK_MODULES([XMMS], [audacious >= 0.1]) + CFLAGS="$CFLAGS $XMMS_CFLAGS" + LIBS="$LIBS $XMMS_LIBS" + AC_DEFINE(AUDACIOUS, 1, [Define for Audacious support]) ;; xinfopipe) - AC_DEFINE(INFOPIPE_H, 1, [Define for XMMS/BMP InfoPipe support]) + AC_DEFINE(INFOPIPE, 1, [Define for XMMS/BMP InfoPipe support]) ;; *) - echo "Error: invalid xmms-status specified: $xmms_support" + echo "Error: invalid xmms support specified: $xmms_support" exit -1 ;; esac AM_CONDITIONAL(BUILD_XMMS, test x$xmms_support = xxmms) -AM_CONDITIONAL(BUILD_XMMS_BMP, test x$xmms_support = xbmp) -AM_CONDITIONAL(BUILD_XMMS_AUDACIOUS, test x$xmms_support = xaudacious) -AM_CONDITIONAL(BUILD_XMMS_INFOPIPE, test x$xmms_support = xinfopipe) +AM_CONDITIONAL(BUILD_BMP, test x$xmms_support = xbmp) +AM_CONDITIONAL(BUILD_AUDACIOUS, test x$xmms_support = xaudacious) +AM_CONDITIONAL(BUILD_INFOPIPE, test x$xmms_support = xinfopipe) dnl dnl BMPx diff --git a/src/Makefile.am b/src/Makefile.am index c2e42e86..828422b9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -4,15 +4,15 @@ if BUILD_XMMS xmms = xmms.c xmms.h endif -if BUILD_XMMS_BMP +if BUILD_BMP xmms = xmms.c xmms.h endif -if BUILD_XMMS_AUDACIOUS +if BUILD_AUDACIOUS xmms = xmms.c xmms.h endif -if BUILD_XMMS_INFOPIPE +if BUILD_INFOPIPE xmms = xmms.c xmms.h endif diff --git a/src/common.c b/src/common.c index 7e65fd3d..7c01957a 100644 --- a/src/common.c +++ b/src/common.c @@ -226,7 +226,7 @@ void update_stuff() if (NEED(INFO_MPD)) update_mpd(); #endif -#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) +#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE) if (NEED(INFO_XMMS)) update_xmms(); #endif diff --git a/src/conky.c b/src/conky.c index dc66806c..6bed45e2 100644 --- a/src/conky.c +++ b/src/conky.c @@ -892,7 +892,7 @@ enum text_object_type { OBJ_mpd_track, OBJ_mpd_percent, #endif -#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) +#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE) OBJ_xmms_status, OBJ_xmms_title, OBJ_xmms_length, @@ -1809,7 +1809,7 @@ int a = stippled_borders, b = 1; (void) scan_bar(arg, &obj->data.pair.a, &obj->data.pair.b); END #endif -#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) +#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE) OBJ(xmms_status, INFO_XMMS) END OBJ(xmms_title, INFO_XMMS) END OBJ(xmms_length, INFO_XMMS) END @@ -3101,7 +3101,7 @@ static void generate_text_internal(char *p, int p_max_size, struct text_object * 255.0f)); } #endif -#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) +#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE) OBJ(xmms_status) { snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_STATUS]); } @@ -5485,7 +5485,7 @@ int main(int argc, char **argv) ERR("error setting signal handler: %s", strerror(errno) ); } -#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) +#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE) /* joinable thread for xmms activity */ pthread_attr_init(&info.xmms.thread_attr); pthread_attr_setdetachstate(&info.xmms.thread_attr, PTHREAD_CREATE_JOINABLE); @@ -5504,7 +5504,7 @@ int main(int argc, char **argv) main_loop(); -#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) +#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE) /* signal xmms worker thread to terminate */ pthread_mutex_lock(&info.xmms.runnable_mutex); info.xmms.runnable=0; diff --git a/src/conky.h b/src/conky.h index 227e042a..5fa7c261 100644 --- a/src/conky.h +++ b/src/conky.h @@ -9,7 +9,7 @@ #ifndef _conky_h_ #define _conky_h_ -#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) +#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE) #include #endif #if defined(HAS_MCHECK_H) @@ -127,7 +127,7 @@ struct mpd_s { }; #endif -#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) +#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE) #include "xmms.h" struct xmms_s { xmms_t items; /* e.g. items[XMMS_STATUS] yields char[] */ @@ -188,7 +188,7 @@ enum { #ifdef TCP_PORT_MONITOR INFO_TCP_PORT_MONITOR = 22, #endif -#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) +#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE) INFO_XMMS = 23, #endif #ifdef BMPX @@ -237,7 +237,7 @@ struct information { struct mpd_s mpd; mpd_Connection *conn; #endif -#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) +#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE) struct xmms_s xmms; #endif #ifdef BMPX diff --git a/src/infopipe.c b/src/infopipe.c deleted file mode 100644 index 9bd0639f..00000000 --- a/src/infopipe.c +++ /dev/null @@ -1,149 +0,0 @@ -/* ------------------------------------------------------------------------- - * infopipe.c: conky support for XMMS/BMP InfoPipe plugin - * - * http://www.beastwithin.org/users/wwwwolf/code/xmms/infopipe.html - * - * Copyright (C) 2005 Philip Kovacs kovacsp3@comcast.net - * - * Based on original ideas and code graciously presented by: - * Ulrich Jansen - ulrich( dot )jansen( at )rwth-aachen.de - * - * $Id$ - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * --------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "infopipe.h" -#include "conky.h" - -/* access to this item array is synchronized with mutexes */ -static infopipe_t g_items; - -/* ---------------------------------------- - * Conky update function for InfoPipe data. - * ---------------------------------------- */ -void update_infopipe(void) -{ - /* - The worker thread is updating the g_items array asynchronously to the main - conky thread. We merely copy the g_items array into the main thread's info - structure when the main thread's update cycle fires. Note that using the - mutexes here makes it easier since we won't have to do any sync in conky.c. - */ - pthread_mutex_lock(&info.infopipe.item_mutex); - memcpy(&info.infopipe.items,g_items,sizeof(g_items)); - pthread_mutex_unlock(&info.infopipe.item_mutex); -} - - -/* -------------------------------------------------- - * Worker thread function for InfoPipe data sampling. - * -------------------------------------------------- */ -void *infopipe_thread_func(void *pvoid) -{ - int i,rc,fd,runnable; - fd_set readset; - struct timeval tm; - static char buf[2048]; /* should equal or exceed sizeof(infopipe_t) */ - static infopipe_t items; - char *pbuf,c; - - pvoid=(void*)pvoid; /* useless cast to avoid unused var warning */ - - /* Grab the runnable signal. Should be non-zero here or we do nothing. */ - pthread_mutex_lock(&info.infopipe.runnable_mutex); - runnable=info.infopipe.runnable; - pthread_mutex_unlock(&info.infopipe.runnable_mutex ); - - /* Loop until the main thread sets the runnable signal to 0. */ - while(runnable) { - - for (;;) { /* convenience loop so we can break below */ - - memset(buf,0,sizeof(buf)); - - if ((fd=open(INFOPIPE_NAMED_PIPE, O_RDONLY | O_NONBLOCK)) < 0) { - /* InfoPipe is not running */ - memset(items,0,sizeof(items)); - strcpy(items[INFOPIPE_STATUS],"Not running"); - break; - } - - FD_ZERO(&readset); - FD_SET(fd,&readset); - - /* On Linux, select() reduces the timer by the amount of time not slept, - * so we must reset the timer with each loop. */ - tm.tv_sec=1; - tm.tv_usec=0; - rc=select(fd+1,&readset,NULL,NULL,&tm); - - if (rc == -1) { - /* -- debug -- - perror("infopipe select()"); - */ - } - else if (rc && FD_ISSET(fd,&readset)) { /* ready to read */ - - if (read(fd,buf,sizeof(buf)) > 0) { /* buf has data */ - - pbuf=buf; - for (i=0;i<14;i++) { - /* 14 lines of key: value pairs presented in a known order */ - if ( sscanf(pbuf,"%*[^:]: %[^\n]",items[i]) == EOF ) - break; - while((c = *pbuf++) && (c != '\n')); - } - - /* -- debug -- - for(i=0;i<14;i++) - printf("%s\n",items[i]); - */ - } - } - else { - /* -- debug -- - printf("no infopipe data\n"); - */ - } - - close(fd); - - break; - } - - /* Deliver the refreshed items array to g_items. */ - pthread_mutex_lock(&info.infopipe.item_mutex); - memcpy(&g_items,items,sizeof(items)); - pthread_mutex_unlock(&info.infopipe.item_mutex); - - /* Grab the runnable signal for next loop. */ - pthread_mutex_lock(&info.infopipe.runnable_mutex); - runnable=info.infopipe.runnable; - pthread_mutex_unlock(&info.infopipe.runnable_mutex); - - sleep(1); - } - - pthread_exit(NULL); -} diff --git a/src/infopipe.h b/src/infopipe.h deleted file mode 100644 index ba5f7bcf..00000000 --- a/src/infopipe.h +++ /dev/null @@ -1,61 +0,0 @@ -/* ------------------------------------------------------------------------- - * infopipe.h: conky support for XMMS/BMP InfoPipe plugin - * - * InfoPipe: http://www.beastwithin.org/users/wwwwolf/code/xmms/infopipe.html - * - * Copyright (C) 2005 Philip Kovacs kovacsp3@comcast.net - * - * Based on original ideas and code graciously presented by: - * Ulrich Jansen - ulrich( dot )jansen( at )rwth-aachen.de - * - * $Id$ - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * --------------------------------------------------------------------------- */ - -#ifndef INFOPIPE_H -#define INFOPIPE_H - -/* The named pipe created by the infopipe plugin (actually a symlink) */ -#define INFOPIPE_NAMED_PIPE "/tmp/xmms-info" - -/* 14 keys comprise the output of the infopipe plugin. */ -enum _infopipe_keys { - INFOPIPE_PROTOCOL, - INFOPIPE_VERSION, - INFOPIPE_STATUS, - INFOPIPE_PLAYLIST_TUNES, - INFOPIPE_PLAYLIST_CURRTUNE, - INFOPIPE_USEC_POSITION, - INFOPIPE_POSITION, - INFOPIPE_USEC_TIME, - INFOPIPE_TIME, - INFOPIPE_BITRATE, - INFOPIPE_FREQUENCY, - INFOPIPE_CHANNELS, - INFOPIPE_TITLE, - INFOPIPE_FILE -}; - -/* 14 slots for the infopipe values */ -typedef char infopipe_t[14][128]; - -/* Service routine for the conky main thread */ -void update_infopipe(void); - -/* Thread function */ -void *infopipe_thread_func(void *); - -#endif diff --git a/src/xmms.c b/src/xmms.c index ad2e90d5..5a4aeab9 100644 --- a/src/xmms.c +++ b/src/xmms.c @@ -25,22 +25,45 @@ #include #include -#if defined(XMMS_H) +#include "config.h" +#include "conky.h" +#include "xmms.h" + +#if defined(XMMS) #include -#elif defined(BMP_H) + +#elif defined(BMP) #include -#elif defined(AUDACIOUS_H) + +#elif defined(AUDACIOUS) #include -#elif defined(INFOPIPE_H) + +#elif defined(INFOPIPE) #include #include #include #include -#define INFOPIPE_NAMED_PIPE "/tmp/xmms-info" -#endif -#include "xmms.h" -#include "conky.h" +#define INFOPIPE_NAMED_PIPE "/tmp/xmms-info" + +/* 14 keys comprise the output of the infopipe plugin. */ +enum _infopipe_keys { + INFOPIPE_PROTOCOL=0, + INFOPIPE_VERSION, + INFOPIPE_STATUS, + INFOPIPE_PLAYLIST_TUNES, + INFOPIPE_PLAYLIST_CURRTUNE, + INFOPIPE_USEC_POSITION, + INFOPIPE_POSITION, + INFOPIPE_USEC_TIME, + INFOPIPE_TIME, + INFOPIPE_BITRATE, + INFOPIPE_FREQUENCY, + INFOPIPE_CHANNELS, + INFOPIPE_TITLE, + INFOPIPE_FILE +}; +#endif /* access to this item array is synchronized with mutexes */ @@ -63,7 +86,7 @@ void update_xmms(void) } -#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) +#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) /* ------------------------------------------------------------ * Worker thread function for XMMS/BMP/Audacious data sampling. * ------------------------------------------------------------ */ @@ -168,7 +191,7 @@ void *xmms_thread_func(void *pvoid) pthread_exit(NULL); } -#elif defined(INFOPIPE_H) +#elif defined(INFOPIPE) /* -------------------------------------------------- * Worker thread function for InfoPipe data sampling. * -------------------------------------------------- */ @@ -177,16 +200,16 @@ void *xmms_thread_func(void *pvoid) int i,rc,fd,runnable; fd_set readset; struct timeval tm; - static char buf[2048]; /* should equal or exceed sizeof(infopipe_t) */ + static char buf[2048],line[128]; static xmms_t items; char *pbuf,c; pvoid=(void*)pvoid; /* useless cast to avoid unused var warning */ /* Grab the runnable signal. Should be non-zero here or we do nothing. */ - pthread_mutex_lock(&info.infopipe.runnable_mutex); - runnable=info.infopipe.runnable; - pthread_mutex_unlock(&info.infopipe.runnable_mutex ); + pthread_mutex_lock(&info.xmms.runnable_mutex); + runnable=info.xmms.runnable; + pthread_mutex_unlock(&info.xmms.runnable_mutex ); /* Loop until the main thread sets the runnable signal to 0. */ while(runnable) { @@ -226,6 +249,25 @@ void *xmms_thread_func(void *pvoid) if ( sscanf(pbuf,"%*[^:]: %[^\n]",items[i]) == EOF ) break; while((c = *pbuf++) && (c != '\n')); + + switch(i) { + case INFOPIPE_PROTOCOL: + case INFOPIPE_VERSION: + case INFOPIPE_STATUS: + case INFOPIPE_PLAYLIST_TUNES: + case INFOPIPE_PLAYLIST_CURRTUNE: + case INFOPIPE_USEC_POSITION: + case INFOPIPE_POSITION: + case INFOPIPE_USEC_TIME: + case INFOPIPE_TIME: + case INFOPIPE_BITRATE: + case INFOPIPE_FREQUENCY: + case INFOPIPE_CHANNELS: + case INFOPIPE_TITLE: + case INFOPIPE_FILE: + default: + break; + } } /* -- debug -- @@ -246,14 +288,14 @@ void *xmms_thread_func(void *pvoid) } /* Deliver the refreshed items array to g_items. */ - pthread_mutex_lock(&info.infopipe.item_mutex); + pthread_mutex_lock(&info.xmms.item_mutex); memcpy(&g_items,items,sizeof(items)); - pthread_mutex_unlock(&info.infopipe.item_mutex); + pthread_mutex_unlock(&info.xmms.item_mutex); /* Grab the runnable signal for next loop. */ - pthread_mutex_lock(&info.infopipe.runnable_mutex); - runnable=info.infopipe.runnable; - pthread_mutex_unlock(&info.infopipe.runnable_mutex); + pthread_mutex_lock(&info.xmms.runnable_mutex); + runnable=info.xmms.runnable; + pthread_mutex_unlock(&info.xmms.runnable_mutex); sleep(1); }