From 6d24365953c244d82825bbc137969e94089b805d Mon Sep 17 00:00:00 2001 From: Philip Kovacs Date: Sun, 8 Jan 2006 08:02:37 +0000 Subject: [PATCH] xmms/bmp/audacious/infopipe reorgamization git-svn-id: https://conky.svn.sourceforge.net/svnroot/conky/trunk/conky@487 7f574dfc-610e-0410-a909-a81674777703 --- README | 90 ++++++------ configure.in | 18 +-- src/Makefile.am | 22 ++- src/audacious.c | 154 -------------------- src/common.c | 13 +- src/conky.c | 271 +++++++++++------------------------- src/conky.h | 44 ++---- src/xmms.c | 264 +++++++++++++++++++++++++++++++++++ src/{audacious.h => xmms.h} | 44 +++--- 9 files changed, 451 insertions(+), 469 deletions(-) delete mode 100644 src/audacious.c create mode 100644 src/xmms.c rename src/{audacious.h => xmms.h} (61%) diff --git a/README b/README index 6447b408..86d1e49c 100644 --- a/README +++ b/README @@ -4,16 +4,16 @@ conky(1) conky(1) NAME conky - A system monitor for X originally based on the torsmo code, but - more kickass. It just keeps on given'er. Yeah. + more kickass. It just keeps on given’er. Yeah. SYNOPSIS conky [options] DESCRIPTION Conky is a system monitor for X originally based on the torsmo code. - Since it's original conception, Conky has changed a fair bit from it's + Since it’s original conception, Conky has changed a fair bit from it’s predecessor. Conky can display just about anything, either on your - root desktop or in it's own window. Conky has many built-in objects, + root desktop or in it’s own window. Conky has many built-in objects, as well as the ability to execute programs and scripts, then display the output from stdout. @@ -28,11 +28,11 @@ COMPILING libraries installed. This should be a package along the lines of "libx11-dev or xorg-x11-dev". - Gentoo users -- Conky is in Gentoo's Portage... simply use "emerge app- + Gentoo users -- Conky is in Gentoo’s Portage... simply use "emerge app- admin/conky" for installation. There is also usually an up-to-date - ebuild within Conky's package or in CVS. + ebuild within Conky’s package or in CVS. - Debian,etc. users -- Conky will be in Debian's repositories soon (by + Debian,etc. users -- Conky will be in Debian’s repositories soon (by mid-September, hopefully), and then Ubuntu shortly thereafter. Until then, "dpkg -i" the .deb package to install. @@ -43,7 +43,7 @@ COMPILING ./configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc - --localstatedir=/var/lib --enable-xft --enable-seti --enable-dou- + --localstatedir=/var/lib --enable-xft --enable-seti --enable-dou‐ ble-buffer --enable-own-window --enable-proc-uptime --enable-mpd --enable-mldonkey --enable-x11 --enable-portmon --enable-bmpx --enable-infopipe @@ -54,14 +54,14 @@ COMPILING src/conky - Conky probably doesn't compile with compilers other than gcc and icc. - It doesn't compile with C89 compiler and not even with pure C99. It - uses a few things that might not exist: strdup(), strcasecmp(), strn- + Conky probably doesn’t compile with compilers other than gcc and icc. + It doesn’t compile with C89 compiler and not even with pure C99. It + uses a few things that might not exist: strdup(), strcasecmp(), strn‐ casecmp(), optarg variable with getopt() and long long (not in C89). - Crashes in file system statistics stuff when compiled with icc, I don't + Crashes in file system statistics stuff when compiled with icc, I don’t know exactly why. - You can disable 'drawing to own window' feature in case you don't need + You can disable ’drawing to own window’ feature in case you don’t need it by passing --disable-own-window to configure -script. @@ -72,14 +72,14 @@ YOU SHOULD KNOW rest of Conky. If you do use them, please do not complain about memory or CPU usage, - unless you think something's seriously wrong (mem leak, etc.). + unless you think something’s seriously wrong (mem leak, etc.). An easy way to force Conky to reload your ~/.conkyrc: "killall -SIGUSR1 conky". Saves you the trouble of having to kill and then restart. IMPORTANT: For previous Conky users, Conky 1.3 no longer supports the metar stuff. mdsplib was causing way too many problems. Hopefully - there'll be a better solution in Conky 2.x... + there’ll be a better solution in Conky 2.x... OPTIONS Command line options override configurations defined in configuration @@ -114,7 +114,7 @@ OPTIONS -t TEXT - Text to render, remember single quotes, like -t ' $uptime ' + Text to render, remember single quotes, like -t ’ $uptime ’ -u SECONDS @@ -136,14 +136,14 @@ OPTIONS CONFIGURATION SETTINGS Default configuration file is $HOME/.conkyrc (can be changed from conky.c among other things). See conkyrc.sample. If installing from - Debian package, this should be in /usr/share/doc/conky/examples ("gun- + Debian package, this should be in /usr/share/doc/conky/examples ("gun‐ zip conkyrc.sample.gz" to get conkyrc.sample). You might want to copy it to $HOME/.conkyrc and then start modifying it. Other configs can be found at http://conky.sf.net alignment - Aligned position on screen, may be top_left, top_right, bot- + Aligned position on screen, may be top_left, top_right, bot‐ tom_left, bottom_right, or none @@ -173,7 +173,7 @@ CONFIGURATION SETTINGS default_shade_color - Default shading color and border's shading color + Default shading color and border’s shading color default_outline_color @@ -181,8 +181,8 @@ CONFIGURATION SETTINGS double_buffer - Use the Xdbe extension? (eliminates flicker) It is highly recom- - mended to use own window with this one so double buffer won't be + Use the Xdbe extension? (eliminates flicker) It is highly recom‐ + mended to use own window with this one so double buffer won’t be so big. @@ -330,7 +330,7 @@ CONFIGURATION SETTINGS VARIABLES Colors are parsed using XParsecolor(), there might be a list of them: /usr/X11R6/lib/X11/rgb.txt. Also, http://sedition.com/perl/rgb.html - [http://sedition.com/perl/rgb.html]. Color can be also in #rrggbb for- + [http://sedition.com/perl/rgb.html]. Color can be also in #rrggbb for‐ mat (hex). Note that when displaying bytes, power is 1024 and not 1000 so 1M really means 1024*1024 bytes and not 1000*1000. @@ -430,7 +430,7 @@ VARIABLES cpubar (cpu number) (height),(width) - Bar that shows CPU usage, height is bar's height in pixels. See + Bar that shows CPU usage, height is bar’s height in pixels. See $cpu for more info on SMP. @@ -467,8 +467,8 @@ VARIABLES exec command - Executes a shell command and displays the output in conky. warn- - ing: this takes a lot more resources than other variables. I'd + Executes a shell command and displays the output in conky. warn‐ + ing: this takes a lot more resources than other variables. I’d recommend coding wanted behaviour in C and posting a patch. @@ -483,7 +483,7 @@ VARIABLES execi interval command - Same as exec but with specific interval. Interval can't be less + Same as exec but with specific interval. Interval can’t be less than update_interval in configuration. See also $texeci @@ -540,7 +540,7 @@ VARIABLES head logfile lines (interval) Displays first N lines of supplied text text file. If interval - is not supplied, Conky assumes 2x Conky's interval. Max of 30 + is not supplied, Conky assumes 2x Conky’s interval. Max of 30 lines can be displayed, or until the text buffer is filled. @@ -585,7 +585,7 @@ VARIABLES i8k_left_fan_rpm If running the i8k kernel driver for Inspiron laptops, displays - the left fan's rate of rotation, in revolutions per minute as + the left fan’s rate of rotation, in revolutions per minute as listed in /proc/i8k. Beware, some laptops i8k reports these fans in reverse order. @@ -599,7 +599,7 @@ VARIABLES i8k_right_fan_rpm If running the i8k kernel driver for Inspiron laptops, displays - the right fan's rate of rotation, in revolutions per minute as + the right fan’s rate of rotation, in revolutions per minute as listed in /proc/i8k. Beware, some laptops i8k reports these fans in reverse order. @@ -740,7 +740,7 @@ VARIABLES mpd_bar (height),(width) - Bar of mpd's progress + Bar of mpd’s progress mpd_bitrate @@ -756,19 +756,19 @@ VARIABLES mpd_vol - MPD's volume + MPD’s volume mpd_elapsed - Song's elapsed time + Song’s elapsed time mpd_length - Song's length + Song’s length mpd_percent - Percent of song's progress + Percent of song’s progress mpd_random @@ -861,7 +861,7 @@ VARIABLES Examples: - ${tcp_portmon 6881 6999 count} - displays the number of connec- + ${tcp_portmon 6881 6999 count} - displays the number of connec‐ tions in the bittorrent port range ${tcp_portmon 22 22 rip 0} - displays the remote host ip of the @@ -880,7 +880,7 @@ VARIABLES name of the fifteenth connection in the range of all ports Note that port monitor variables which share the same port range - actually refer to the same monitor, so many references to a sin- + actually refer to the same monitor, so many references to a sin‐ gle port range for different items and different indexes all use the same monitor internally. In other words, the program avoids creating redundant monitors. @@ -888,7 +888,7 @@ VARIABLES texeci interval command Runs a command at an interval inside a thread and displays the output. Same as $execi, except the command is run inside a - thread. Use this if you have a slow script to keep Conky updat- + thread. Use this if you have a slow script to keep Conky updat‐ ing. You should make the interval slightly longer then the time it takes your script to execute. For example, if you have a script that take 5 seconds to execute, you should make the @@ -901,18 +901,18 @@ VARIABLES tail logfile lines (interval) Displays last N lines of supplied text text file. If interval is - not supplied, Conky assumes 2x Conky's interval. Max of 30 lines + not supplied, Conky assumes 2x Conky’s interval. Max of 30 lines can be displayed, or until the text buffer is filled. time (format) - Local time, see man strftime to get more information about for- + Local time, see man strftime to get more information about for‐ mat totaldown net Total download, overflows at 4 GB on Linux with 32-bit arch and - there doesn't seem to be a way to know how many times it has + there doesn’t seem to be a way to know how many times it has already done that before conky has started. @@ -975,7 +975,7 @@ VARIABLES EXAMPLES - conky -t '${time %D %H:%m}' -o -u 30 + conky -t ’${time %D %H:%m}’ -o -u 30 Start Conky in its own window with date and clock as text and 30 sec update interval. @@ -986,9 +986,9 @@ FILES ~/.conkyrc default configuration file BUGS - Drawing to root or some other desktop window directly doesn't work with - all window managers. Especially doesn't work well with Gnome and it has - been reported that it doesn't work with KDE either. Nautilus can be + Drawing to root or some other desktop window directly doesn’t work with + all window managers. Especially doesn’t work well with Gnome and it has + been reported that it doesn’t work with KDE either. Nautilus can be disabled from drawing to desktop with program gconf-editor. Uncheck show_desktop in /apps/nautilus/preferences/. There is -w switch in Conky to set some specific window id. You might find xwininfo -tree @@ -998,13 +998,13 @@ BUGS SEE ALSO http://conky.sourceforge.net [http://conky.sourceforge.net] - http://www.sourceforge.net/projects/conky [http://www.source- + http://www.sourceforge.net/projects/conky [http://www.source‐ forge.net/projects/conky] #conky on irc.freenode.net AUTHORS - The Conky dev team. What's up now! + The Conky dev team. What’s up now! diff --git a/configure.in b/configure.in index ac64aa25..9701cfdb 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ -AC_INIT([Conky],[1.3.6_CVS_20060107],[brenden1@users.sourceforge.net]) +AC_INIT([Conky],[1.3.6_CVS_20060108],[brenden1@users.sourceforge.net]) -AM_INIT_AUTOMAKE(conky, 1.3.6_CVS_20060107) +AM_INIT_AUTOMAKE(conky, 1.3.6_CVS_20060108) AM_CONFIG_HEADER(src/config.h) AC_PROG_LIBTOOL @@ -99,7 +99,7 @@ case x$xmms_support in xnone|xyes|xno) ;; xxmms) - AC_DEFINE(XMMS, 1, [Define for XMMS support]) + AC_DEFINE(XMMS_H, 1, [Define for XMMS support]) echo "Sorry, xmms isn't supported yet" exit -1 ;; @@ -107,16 +107,16 @@ case x$xmms_support in PKG_CHECK_MODULES([BMP], [bmp], []) CFLAGS="$CFLAGS $BMP_CFLAGS" LIBS="$LIBS $BMP_LIBS" - AC_DEFINE(BMP, 1, [Define for BMP support]) + AC_DEFINE(BMP_H, 1, [Define for BMP support]) ;; xaudacious) PKG_CHECK_MODULES([AUDACIOUS], [audacious >= 0.1]) CFLAGS="$CFLAGS $AUDACIOUS_CFLAGS" LIBS="$LIBS $AUDACIOUS_LIBS" - AC_DEFINE(AUDACIOUS, 1, [Define for Audacious support]) + AC_DEFINE(AUDACIOUS_H, 1, [Define for Audacious support]) ;; xinfopipe) - AC_DEFINE(INFOPIPE, 1, [Define for XMMS/BMP InfoPipe support]) + AC_DEFINE(INFOPIPE_H, 1, [Define for XMMS/BMP InfoPipe support]) ;; *) echo "Error: invalid xmms-status specified: $xmms_support" @@ -124,9 +124,9 @@ case x$xmms_support in ;; esac AM_CONDITIONAL(BUILD_XMMS, test x$xmms_support = xxmms) -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) +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) dnl dnl BMPx diff --git a/src/Makefile.am b/src/Makefile.am index e1c7f498..c2e42e86 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,17 +1,25 @@ bin_PROGRAMS = conky -if BUILD_AUDACIOUS -audacious = audacious.c +if BUILD_XMMS +xmms = xmms.c xmms.h +endif + +if BUILD_XMMS_BMP +xmms = xmms.c xmms.h +endif + +if BUILD_XMMS_AUDACIOUS +xmms = xmms.c xmms.h +endif + +if BUILD_XMMS_INFOPIPE +xmms = xmms.c xmms.h endif if BUILD_BMPX bmpx = bmpx.c endif -if BUILD_INFOPIPE -infopipe = infopipe.c -endif - if BUILD_SETI seti = seti.c endif @@ -50,7 +58,7 @@ if BUILD_X11 x11 = x11.c endif -conky_SOURCES = common.c fs.c $(linux) mail.c mixer.c $(seti) $(mpd) $(solaris) $(freebsd) $(netbsd) $(port_monitors) conky.c conky.h $(x11) $(mldonkey) remoted.c remoted.h remotec.c remotec.h $(audacious) $(bmpx) $(infopipe) +conky_SOURCES = common.c fs.c $(linux) mail.c mixer.c $(seti) $(mpd) $(solaris) $(freebsd) $(netbsd) $(port_monitors) conky.c conky.h $(x11) $(mldonkey) remoted.c remoted.h remotec.c remotec.h $(xmms) $(bmpx) AM_LDFLAGS = $(X11_LIBS) $(XFT_LIBS) $(CAIRO_LIBS) $(PTHREAD_LIBS) -lm diff --git a/src/audacious.c b/src/audacious.c deleted file mode 100644 index c7653808..00000000 --- a/src/audacious.c +++ /dev/null @@ -1,154 +0,0 @@ -/* ------------------------------------------------------------------------- - * audacious.c: conky support for Audacious media player - * - * http://audacious-media-player.org - * - * Copyright (C) 2005 Philip Kovacs kovacsp3@comcast.net - * - * $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 "audacious.h" -#include "conky.h" - -/* access to this item array is synchronized with mutexes */ -static audacious_t g_items; - -/* ---------------------------------------- - * Conky update function for Audacious data. - * ---------------------------------------- */ -void update_audacious(void) -{ - /* - The worker thread is updating ihe 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.audacious.item_mutex); - memcpy(&info.audacious.items,g_items,sizeof(g_items)); - pthread_mutex_unlock(&info.audacious.item_mutex); -} - - -/* -------------------------------------------------- - * Worker thread function for Audacious data sampling. - * -------------------------------------------------- */ -void *audacious_thread_func(void *pvoid) -{ - int runnable; - static audacious_t items; - int session,playpos,frames,length; - int rate,freq,chans; - char *psong; - - pvoid=(void*)pvoid; /* useless cast to avoid unused var warning */ - session=0; - - /* Grab the runnable signal. Should be non-zero here or we do nothing. */ - pthread_mutex_lock(&info.audacious.runnable_mutex); - runnable=info.audacious.runnable; - pthread_mutex_unlock(&info.audacious.runnable_mutex ); - - /* Loop until the main thread sets the runnable signal to 0. */ - while(runnable) { - - for (;;) { /* convenience loop so we can break below */ - - if (!xmms_remote_is_running(session)) { - memset(&items,0,sizeof(items)); - strcpy(items[AUDACIOUS_STATUS],"Not running"); - break; - } - - /* Player status */ - if (xmms_remote_is_paused(session)) - strcpy(items[AUDACIOUS_STATUS],"Paused"); - else if (xmms_remote_is_playing(session)) - strcpy(items[AUDACIOUS_STATUS],"Playing"); - else - strcpy(items[AUDACIOUS_STATUS],"Stopped"); - - /* Current song title */ - playpos = (int) xmms_remote_get_playlist_pos(session); - psong = (char *) xmms_remote_get_playlist_title(session, playpos); - if (psong) - strncpy(items[AUDACIOUS_SONG],psong,sizeof(items[AUDACIOUS_SONG])); - - /* Current song length as MM:SS */ - frames = xmms_remote_get_playlist_time(session,playpos); - length = frames / 1000; - snprintf(items[AUDACIOUS_SONG_LENGTH],sizeof(items[AUDACIOUS_SONG_LENGTH]), - "%d:%.2d", length / 60, length % 60); - - /* Current song length in seconds */ - snprintf(items[AUDACIOUS_SONG_LENGTH_SECONDS],sizeof(items[AUDACIOUS_SONG_LENGTH_SECONDS]), - "%d", length); - - /* Current song length in frames */ - snprintf(items[AUDACIOUS_SONG_LENGTH_FRAMES],sizeof(items[AUDACIOUS_SONG_LENGTH_FRAMES]), - "%d", frames); - - /* Current song output length as MM:SS */ - frames = xmms_remote_get_output_time(session); - length = frames / 1000; - snprintf(items[AUDACIOUS_SONG_OUTPUT_LENGTH],sizeof(items[AUDACIOUS_SONG_OUTPUT_LENGTH]), - "%d:%.2d", length / 60, length % 60); - - /* Current song output length in seconds */ - snprintf(items[AUDACIOUS_SONG_OUTPUT_LENGTH_SECONDS],sizeof(items[AUDACIOUS_SONG_OUTPUT_LENGTH_SECONDS]), - "%d", length); - - /* Current song output length in frames */ - snprintf(items[AUDACIOUS_SONG_OUTPUT_LENGTH_FRAMES],sizeof(items[AUDACIOUS_SONG_OUTPUT_LENGTH_FRAMES]), - "%d", frames); - - /* Current song bitrate */ - xmms_remote_get_info(session, &rate, &freq, &chans); - snprintf(items[AUDACIOUS_SONG_BITRATE],sizeof(items[AUDACIOUS_SONG_BITRATE]), "%d", rate); - - /* Current song frequency */ - snprintf(items[AUDACIOUS_SONG_FREQUENCY],sizeof(items[AUDACIOUS_SONG_FREQUENCY]), "%d", freq); - - /* Current song channels */ - snprintf(items[AUDACIOUS_SONG_CHANNELS],sizeof(items[AUDACIOUS_SONG_CHANNELS]), "%d", chans); - - - break; - } - - /* Deliver the refreshed items array to g_items. */ - pthread_mutex_lock(&info.audacious.item_mutex); - memcpy(&g_items,items,sizeof(items)); - pthread_mutex_unlock(&info.audacious.item_mutex); - - /* Grab the runnable signal for next loop. */ - pthread_mutex_lock(&info.audacious.runnable_mutex); - runnable=info.audacious.runnable; - pthread_mutex_unlock(&info.audacious.runnable_mutex); - - sleep(1); - } - - pthread_exit(NULL); -} diff --git a/src/common.c b/src/common.c index 6b4f9567..7e65fd3d 100644 --- a/src/common.c +++ b/src/common.c @@ -226,18 +226,15 @@ void update_stuff() if (NEED(INFO_MPD)) update_mpd(); #endif -#ifdef AUDACIOUS - if (NEED(INFO_AUDACIOUS)) - update_audacious(); +#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) + if (NEED(INFO_XMMS)) + update_xmms(); #endif #ifdef BMPX if (NEED(INFO_BMPX)) - update_bmpx(); -#endif -#ifdef INFOPIPE - if (NEED(INFO_INFOPIPE)) - update_infopipe(); + update_bmpx(); #endif + if (NEED(INFO_LOADAVG)) update_load_average(); diff --git a/src/conky.c b/src/conky.c index e8f87d99..dc66806c 100644 --- a/src/conky.c +++ b/src/conky.c @@ -892,19 +892,20 @@ enum text_object_type { OBJ_mpd_track, OBJ_mpd_percent, #endif -#ifdef AUDACIOUS - OBJ_audacious_status, - OBJ_audacious_song, - OBJ_audacious_song_length, - OBJ_audacious_song_length_seconds, - OBJ_audacious_song_length_frames, - OBJ_audacious_song_output_length, - OBJ_audacious_song_output_length_seconds, - OBJ_audacious_song_output_length_frames, - OBJ_audacious_song_bitrate, - OBJ_audacious_song_frequency, - OBJ_audacious_song_channels, - OBJ_audacious_bar, +#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) + OBJ_xmms_status, + OBJ_xmms_title, + OBJ_xmms_length, + OBJ_xmms_length_seconds, + OBJ_xmms_position, + OBJ_xmms_position_seconds, + OBJ_xmms_bitrate, + OBJ_xmms_frequency, + OBJ_xmms_channels, + OBJ_xmms_filename, + OBJ_xmms_playlist_length, + OBJ_xmms_playlist_position, + OBJ_xmms_bar, #endif #ifdef BMPX OBJ_bmpx_title, @@ -914,23 +915,6 @@ enum text_object_type { OBJ_bmpx_uri, OBJ_bmpx_bitrate, #endif -#ifdef INFOPIPE - OBJ_infopipe_protocol, - OBJ_infopipe_version, - OBJ_infopipe_status, - OBJ_infopipe_playlist_tunes, - OBJ_infopipe_playlist_currtune, - OBJ_infopipe_usec_position, - OBJ_infopipe_position, - OBJ_infopipe_usec_time, - OBJ_infopipe_time, - OBJ_infopipe_bitrate, - OBJ_infopipe_frequency, - OBJ_infopipe_channels, - OBJ_infopipe_title, - OBJ_infopipe_file, - OBJ_infopipe_bar, -#endif #ifdef TCP_PORT_MONITOR OBJ_tcp_portmon, #endif @@ -1825,19 +1809,20 @@ int a = stippled_borders, b = 1; (void) scan_bar(arg, &obj->data.pair.a, &obj->data.pair.b); END #endif -#ifdef AUDACIOUS - OBJ(audacious_status, INFO_AUDACIOUS) END - OBJ(audacious_song, INFO_AUDACIOUS) END - OBJ(audacious_song_length, INFO_AUDACIOUS) END - OBJ(audacious_song_length_seconds, INFO_AUDACIOUS) END - OBJ(audacious_song_length_frames, INFO_AUDACIOUS) END - OBJ(audacious_song_output_length, INFO_AUDACIOUS) END - OBJ(audacious_song_output_length_seconds, INFO_AUDACIOUS) END - OBJ(audacious_song_output_length_frames, INFO_AUDACIOUS) END - OBJ(audacious_song_bitrate, INFO_AUDACIOUS) END - OBJ(audacious_song_frequency, INFO_AUDACIOUS) END - OBJ(audacious_song_channels, INFO_AUDACIOUS) END - OBJ(audacious_bar, INFO_AUDACIOUS) +#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) + OBJ(xmms_status, INFO_XMMS) END + OBJ(xmms_title, INFO_XMMS) END + OBJ(xmms_length, INFO_XMMS) END + OBJ(xmms_length_seconds, INFO_XMMS) END + OBJ(xmms_position, INFO_XMMS) END + OBJ(xmms_position_seconds, INFO_XMMS) END + OBJ(xmms_bitrate, INFO_XMMS) END + OBJ(xmms_frequency, INFO_XMMS) END + OBJ(xmms_channels, INFO_XMMS) END + OBJ(xmms_filename, INFO_XMMS) END + OBJ(xmms_playlist_length, INFO_XMMS) END + OBJ(xmms_playlist_position, INFO_XMMS) END + OBJ(xmms_bar, INFO_XMMS) (void) scan_bar(arg, &obj->a, &obj->b); END #endif @@ -1861,25 +1846,6 @@ int a = stippled_borders, b = 1; memset(&(info.bmpx), 0, sizeof(struct bmpx_s)); END #endif -#ifdef INFOPIPE - OBJ(infopipe_protocol, INFO_INFOPIPE) END - OBJ(infopipe_version, INFO_INFOPIPE) END - OBJ(infopipe_status, INFO_INFOPIPE) END - OBJ(infopipe_playlist_tunes, INFO_INFOPIPE) END - OBJ(infopipe_playlist_currtune, INFO_INFOPIPE) END - OBJ(infopipe_usec_position, INFO_INFOPIPE) END - OBJ(infopipe_position, INFO_INFOPIPE) END - OBJ(infopipe_usec_time, INFO_INFOPIPE) END - OBJ(infopipe_time, INFO_INFOPIPE) END - OBJ(infopipe_bitrate, INFO_INFOPIPE) END - OBJ(infopipe_frequency, INFO_INFOPIPE) END - OBJ(infopipe_channels, INFO_INFOPIPE) END - OBJ(infopipe_title, INFO_INFOPIPE) END - OBJ(infopipe_file, INFO_INFOPIPE) END - OBJ(infopipe_bar, INFO_INFOPIPE) - (void) scan_bar(arg, &obj->a, &obj->b); - END -#endif #ifdef TCP_PORT_MONITOR OBJ(tcp_portmon, INFO_TCP_PORT_MONITOR) int argc, port_begin, port_end, item, connection_index; @@ -3135,46 +3101,48 @@ static void generate_text_internal(char *p, int p_max_size, struct text_object * 255.0f)); } #endif -#ifdef AUDACIOUS - OBJ(audacious_status) { - snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_STATUS]); - } - OBJ(audacious_song) { - snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG]); +#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) + OBJ(xmms_status) { + snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_STATUS]); } - OBJ(audacious_song_length) { - snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_LENGTH]); + OBJ(xmms_title) { + snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_TITLE]); } - OBJ(audacious_song_length_seconds) { - snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_LENGTH_SECONDS]); + OBJ(xmms_length) { + snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_LENGTH]); } - OBJ(audacious_song_length_frames) { - snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_LENGTH_FRAMES]); + OBJ(xmms_length_seconds) { + snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_LENGTH_SECONDS]); } - OBJ(audacious_song_output_length) { - snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_OUTPUT_LENGTH]); + OBJ(xmms_position) { + snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_POSITION]); } - OBJ(audacious_song_output_length_seconds) { - snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_OUTPUT_LENGTH_SECONDS]); + OBJ(xmms_position_seconds) { + snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_POSITION_SECONDS]); } - OBJ(audacious_song_output_length_frames) { - snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_OUTPUT_LENGTH_FRAMES]); + OBJ(xmms_bitrate) { + snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_BITRATE]); } - OBJ(audacious_song_bitrate) { - snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_BITRATE]); + OBJ(xmms_frequency) { + snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_FREQUENCY]); } - OBJ(audacious_song_frequency) { - snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_FREQUENCY]); + OBJ(xmms_channels) { + snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_CHANNELS]); } - OBJ(audacious_song_channels) { - snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_STATUS]); + OBJ(xmms_filename) { + snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_FILENAME]); } - OBJ(audacious_bar) { + OBJ(xmms_playlist_length) { + snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_PLAYLIST_LENGTH]); + } + OBJ(xmms_playlist_position) { + snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_PLAYLIST_POSITION]); + } + OBJ(xmms_bar) { double progress; - progress= atof(cur->audacious.items[AUDACIOUS_SONG_OUTPUT_LENGTH_SECONDS]) / - atof(cur->audacious.items[AUDACIOUS_SONG_LENGTH_SECONDS]); + progress= atof(cur->xmms.items[XMMS_POSITION_SECONDS]) / + atof(cur->xmms.items[XMMS_LENGTH_SECONDS]); new_bar(p,obj->a,obj->b,(int)(progress*255.0f)); - } #endif #ifdef BMPX @@ -3196,56 +3164,6 @@ static void generate_text_internal(char *p, int p_max_size, struct text_object * OBJ(bmpx_bitrate) { snprintf(p, p_max_size, "%i", cur->bmpx.bitrate); } -#endif -#ifdef INFOPIPE - OBJ(infopipe_protocol) { - snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_PROTOCOL]); - } - OBJ(infopipe_version) { - snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_VERSION]); - } - OBJ(infopipe_status) { - snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_STATUS]); - } - OBJ(infopipe_playlist_tunes) { - snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_PLAYLIST_TUNES]); - } - OBJ(infopipe_playlist_currtune) { - snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_PLAYLIST_CURRTUNE]); - } - OBJ(infopipe_usec_position) { - snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_USEC_POSITION]); - } - OBJ(infopipe_position) { - snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_POSITION]); - } - OBJ(infopipe_usec_time) { - snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_USEC_TIME]); - } - OBJ(infopipe_time) { - snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_TIME]); - } - OBJ(infopipe_bitrate) { - snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_BITRATE]); - } - OBJ(infopipe_frequency) { - snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_FREQUENCY]); - } - OBJ(infopipe_channels) { - snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_CHANNELS]); - } - OBJ(infopipe_title) { - snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_TITLE]); - } - OBJ(infopipe_file) { - snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_FILE]); - } - OBJ(infopipe_bar) { - double progress; - progress= atof(cur->infopipe.items[INFOPIPE_USEC_POSITION]) / - atof(cur->infopipe.items[INFOPIPE_USEC_TIME]); - new_bar(p,obj->a,obj->b,(int)(progress*255.0f)); - } #endif OBJ(top) { if (obj->data.top.type == TOP_NAME @@ -5567,71 +5485,40 @@ int main(int argc, char **argv) ERR("error setting signal handler: %s", strerror(errno) ); } -#ifdef AUDACIOUS - /* joinable thread for audacious activity */ - pthread_attr_init(&info.audacious.thread_attr); - pthread_attr_setdetachstate(&info.audacious.thread_attr, PTHREAD_CREATE_JOINABLE); +#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) + /* joinable thread for xmms activity */ + pthread_attr_init(&info.xmms.thread_attr); + pthread_attr_setdetachstate(&info.xmms.thread_attr, PTHREAD_CREATE_JOINABLE); /* init mutexex */ - pthread_mutex_init(&info.audacious.item_mutex, NULL); - pthread_mutex_init(&info.audacious.runnable_mutex, NULL); + pthread_mutex_init(&info.xmms.item_mutex, NULL); + pthread_mutex_init(&info.xmms.runnable_mutex, NULL); /* init runnable condition for worker thread */ - pthread_mutex_lock(&info.audacious.runnable_mutex); - info.audacious.runnable=1; - pthread_mutex_unlock(&info.audacious.runnable_mutex); - if (pthread_create(&info.audacious.thread, &info.audacious.thread_attr, audacious_thread_func, NULL)) + pthread_mutex_lock(&info.xmms.runnable_mutex); + info.xmms.runnable=1; + pthread_mutex_unlock(&info.xmms.runnable_mutex); + if (pthread_create(&info.xmms.thread, &info.xmms.thread_attr, xmms_thread_func, NULL)) { - CRIT_ERR("unable to create audacious thread!"); - } -#endif -#ifdef INFOPIPE - /* joinable thread for infopipe activity */ - pthread_attr_init(&info.infopipe.thread_attr); - pthread_attr_setdetachstate(&info.infopipe.thread_attr, PTHREAD_CREATE_JOINABLE); - /* init mutexex */ - pthread_mutex_init(&info.infopipe.item_mutex, NULL); - pthread_mutex_init(&info.infopipe.runnable_mutex, NULL); - /* init runnable condition for worker thread */ - pthread_mutex_lock(&info.infopipe.runnable_mutex); - info.infopipe.runnable=1; - pthread_mutex_unlock(&info.infopipe.runnable_mutex); - if (pthread_create(&info.infopipe.thread, &info.infopipe.thread_attr, infopipe_thread_func, NULL)) - { - CRIT_ERR("unable to create infopipe thread!"); + CRIT_ERR("unable to create xmms thread!"); } #endif main_loop(); -#ifdef AUDACIOUS - /* signal audacious worker thread to terminate */ - pthread_mutex_lock(&info.audacious.runnable_mutex); - info.audacious.runnable=0; - pthread_mutex_unlock(&info.audacious.runnable_mutex); +#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) + /* signal xmms worker thread to terminate */ + pthread_mutex_lock(&info.xmms.runnable_mutex); + info.xmms.runnable=0; + pthread_mutex_unlock(&info.xmms.runnable_mutex); /* destroy thread attribute and wait for thread */ - pthread_attr_destroy(&info.audacious.thread_attr); - if (pthread_join(info.audacious.thread, NULL)) + pthread_attr_destroy(&info.xmms.thread_attr); + if (pthread_join(info.xmms.thread, NULL)) { - ERR("error joining audacious thread"); + ERR("error joining xmms thread"); } /* destroy mutexes */ - pthread_mutex_destroy(&info.audacious.item_mutex); - pthread_mutex_destroy(&info.audacious.runnable_mutex); + pthread_mutex_destroy(&info.xmms.item_mutex); + pthread_mutex_destroy(&info.xmms.runnable_mutex); #endif -#ifdef INFOPIPE - /* signal infopipe worker thread to terminate */ - pthread_mutex_lock(&info.infopipe.runnable_mutex); - info.infopipe.runnable=0; - pthread_mutex_unlock(&info.infopipe.runnable_mutex); - /* destroy thread attribute and wait for thread */ - pthread_attr_destroy(&info.infopipe.thread_attr); - if (pthread_join(info.infopipe.thread, NULL)) - { - ERR("error joining infopipe thread"); - } - /* destroy mutexes */ - pthread_mutex_destroy(&info.infopipe.item_mutex); - pthread_mutex_destroy(&info.infopipe.runnable_mutex); -#endif return 0; } diff --git a/src/conky.h b/src/conky.h index 4317d0bd..227e042a 100644 --- a/src/conky.h +++ b/src/conky.h @@ -9,7 +9,7 @@ #ifndef _conky_h_ #define _conky_h_ -#if defined(AUDACIOUS) || defined(INFOPIPE) +#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) #include #endif #if defined(HAS_MCHECK_H) @@ -127,12 +127,12 @@ struct mpd_s { }; #endif -#ifdef AUDACIOUS -#include "audacious.h" -struct audacious_s { - audacious_t items; /* e.g. items[AUDACIOUS_STATUS] yields char[] */ - int runnable; /* used to signal infopipe thread to stop */ - pthread_t thread; /* worker thread for infopipe updating */ +#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) +#include "xmms.h" +struct xmms_s { + xmms_t items; /* e.g. items[XMMS_STATUS] yields char[] */ + int runnable; /* used to signal worker thread to stop */ + pthread_t thread; /* worker thread for xmms updating */ pthread_attr_t thread_attr; /* thread attributes */ pthread_mutex_t item_mutex; /* mutex for item array */ pthread_mutex_t runnable_mutex; /* mutex for runnable flag */ @@ -151,18 +151,6 @@ struct bmpx_s { }; #endif -#ifdef INFOPIPE -#include "infopipe.h" -struct infopipe_s { - infopipe_t items; /* e.g. items[INFOPIPE_STATUS] yields char[] */ - int runnable; /* used to signal infopipe thread to stop */ - pthread_t thread; /* worker thread for infopipe updating */ - pthread_attr_t thread_attr; /* thread attributes */ - pthread_mutex_t item_mutex; /* mutex for item array */ - pthread_mutex_t runnable_mutex; /* mutex for runnable flag */ -}; -#endif - #ifdef TCP_PORT_MONITOR #include "libtcp-portmon.h" #define MIN_PORT_MONITORS_DEFAULT 16 @@ -200,14 +188,11 @@ enum { #ifdef TCP_PORT_MONITOR INFO_TCP_PORT_MONITOR = 22, #endif +#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) + INFO_XMMS = 23, +#endif #ifdef BMPX - INFO_BMPX = 23, -#endif -#ifdef INFOPIPE - INFO_INFOPIPE = 24, -#endif -#ifdef AUDACIOUS - INFO_AUDACIOUS = 25, + INFO_BMPX = 24, #endif }; @@ -252,14 +237,11 @@ struct information { struct mpd_s mpd; mpd_Connection *conn; #endif -#ifdef AUDACIOUS - struct audacious_s audacious; +#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H) + struct xmms_s xmms; #endif #ifdef BMPX struct bmpx_s bmpx; -#endif -#ifdef INFOPIPE - struct infopipe_s infopipe; #endif struct process *cpu[10]; struct process *memu[10]; diff --git a/src/xmms.c b/src/xmms.c new file mode 100644 index 00000000..ad2e90d5 --- /dev/null +++ b/src/xmms.c @@ -0,0 +1,264 @@ +/* ------------------------------------------------------------------------- + * xmms.c: conky support for XMMS-related projects + * + * Copyright (C) 2005 Philip Kovacs kovacsp3@comcast.net + * + * $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 + +#if defined(XMMS_H) +#include +#elif defined(BMP_H) +#include +#elif defined(AUDACIOUS_H) +#include +#elif defined(INFOPIPE_H) +#include +#include +#include +#include +#define INFOPIPE_NAMED_PIPE "/tmp/xmms-info" +#endif + +#include "xmms.h" +#include "conky.h" + + +/* access to this item array is synchronized with mutexes */ +static xmms_t g_items; + +/* ------------------------------------ + * Conky update function for XMMS data. + * ------------------------------------ */ +void update_xmms(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.xmms.item_mutex); + memcpy(&info.xmms.items,g_items,sizeof(g_items)); + pthread_mutex_unlock(&info.xmms.item_mutex); +} + + +#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) +/* ------------------------------------------------------------ + * Worker thread function for XMMS/BMP/Audacious data sampling. + * ------------------------------------------------------------ */ +void *xmms_thread_func(void *pvoid) +{ + int runnable; + static xmms_t items; + int session,playpos,frames,length; + int rate,freq,chans; + char *psong,*pfilename; + + pvoid=(void*)pvoid; /* useless cast to avoid unused var warning */ + session=0; + + /* Grab the runnable signal. Should be non-zero here or we do nothing. */ + 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) { + + for (;;) { /* convenience loop so we can break below */ + + if (!xmms_remote_is_running(session)) { + memset(&items,0,sizeof(items)); + strcpy(items[XMMS_STATUS],"Not running"); + break; + } + + /* Player status */ + if (xmms_remote_is_paused(session)) + strcpy(items[XMMS_STATUS],"Paused"); + else if (xmms_remote_is_playing(session)) + strcpy(items[XMMS_STATUS],"Playing"); + else + strcpy(items[XMMS_STATUS],"Stopped"); + + /* Current song title */ + playpos = (int) xmms_remote_get_playlist_pos(session); + psong = (char *) xmms_remote_get_playlist_title(session, playpos); + if (psong) + strncpy(items[XMMS_TITLE],psong,sizeof(items[XMMS_TITLE])); + + /* Current song length as MM:SS */ + frames = xmms_remote_get_playlist_time(session,playpos); + length = frames / 1000; + snprintf(items[XMMS_LENGTH],sizeof(items[XMMS_LENGTH]), + "%d:%.2d", length / 60, length % 60); + + /* Current song length in seconds */ + snprintf(items[XMMS_LENGTH_SECONDS],sizeof(items[XMMS_LENGTH_SECONDS]), + "%d", length); + + /* Current song position as MM:SS */ + frames = xmms_remote_get_output_time(session); + length = frames / 1000; + snprintf(items[XMMS_POSITION],sizeof(items[XMMS_POSITION]), + "%d:%.2d", length / 60, length % 60); + + /* Current song position in seconds */ + snprintf(items[XMMS_POSITION_SECONDS],sizeof(items[XMMS_POSITION_SECONDS]), + "%d", length); + + /* Current song bitrate */ + xmms_remote_get_info(session, &rate, &freq, &chans); + snprintf(items[XMMS_BITRATE],sizeof(items[XMMS_BITRATE]), "%d", rate); + + /* Current song frequency */ + snprintf(items[XMMS_FREQUENCY],sizeof(items[XMMS_FREQUENCY]), "%d", freq); + + /* Current song channels */ + snprintf(items[XMMS_CHANNELS],sizeof(items[XMMS_CHANNELS]), "%d", chans); + + /* Current song filename */ + pfilename = xmms_remote_get_playlist_file(session,playpos); + strncpy(items[XMMS_FILENAME],pfilename,sizeof(items[XMMS_FILENAME])); + + /* Length of the Playlist (number of songs) */ + length = xmms_remote_get_playlist_length(session); + snprintf(items[XMMS_PLAYLIST_LENGTH],sizeof(items[XMMS_PLAYLIST_LENGTH]), "%d", length); + + /* Playlist position (index of song) */ + snprintf(items[XMMS_PLAYLIST_POSITION],sizeof(items[XMMS_PLAYLIST_POSITION]), "%d", playpos+1); + + break; + } + + /* Deliver the refreshed items array to g_items. */ + pthread_mutex_lock(&info.xmms.item_mutex); + memcpy(&g_items,items,sizeof(items)); + pthread_mutex_unlock(&info.xmms.item_mutex); + + /* Grab the runnable signal for next loop. */ + pthread_mutex_lock(&info.xmms.runnable_mutex); + runnable=info.xmms.runnable; + pthread_mutex_unlock(&info.xmms.runnable_mutex); + + sleep(1); + } + + pthread_exit(NULL); +} + +#elif defined(INFOPIPE_H) +/* -------------------------------------------------- + * Worker thread function for InfoPipe data sampling. + * -------------------------------------------------- */ +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 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 ); + + /* 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); +} + +#endif diff --git a/src/audacious.h b/src/xmms.h similarity index 61% rename from src/audacious.h rename to src/xmms.h index c7bde58c..d3f88926 100644 --- a/src/audacious.h +++ b/src/xmms.h @@ -1,7 +1,5 @@ /* ------------------------------------------------------------------------- - * audacious.h: conky support for Audacious audio player - * - * http://audacious-media-player.org + * xmms.h: conky support for XMMS-related projects * * Copyright (C) 2005 Philip Kovacs kovacsp3@comcast.net * @@ -22,31 +20,31 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * --------------------------------------------------------------------------- */ -#ifndef AUDACIOUS_H -#define AUDACIOUS_H +#ifndef XMMS_H +#define XMMS_H -/* 11 keys comprise the audacious information. */ -enum _audacious_keys { - AUDACIOUS_STATUS, - AUDACIOUS_SONG, - AUDACIOUS_SONG_LENGTH, - AUDACIOUS_SONG_LENGTH_SECONDS, - AUDACIOUS_SONG_LENGTH_FRAMES, - AUDACIOUS_SONG_OUTPUT_LENGTH, - AUDACIOUS_SONG_OUTPUT_LENGTH_SECONDS, - AUDACIOUS_SONG_OUTPUT_LENGTH_FRAMES, - AUDACIOUS_SONG_BITRATE, - AUDACIOUS_SONG_FREQUENCY, - AUDACIOUS_SONG_CHANNELS +enum _xmms_items { + XMMS_STATUS=0, + XMMS_TITLE, + XMMS_LENGTH, + XMMS_LENGTH_SECONDS, + XMMS_POSITION, + XMMS_POSITION_SECONDS, + XMMS_BITRATE, + XMMS_FREQUENCY, + XMMS_CHANNELS, + XMMS_FILENAME, + XMMS_PLAYLIST_LENGTH, + XMMS_PLAYLIST_POSITION, }; - -/* 11 slots for the audacious values */ -typedef char audacious_t[11][128]; + +/* 12 slots for the xmms values */ +typedef char xmms_t[12][128]; /* Service routine for the conky main thread */ -void update_audacious(void); +void update_xmms(void); /* Thread function */ -void *audacious_thread_func(void *); +void *xmms_thread_func(void *); #endif