diff --git a/ChangeLog b/ChangeLog
index 445d52a4..032959b3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
# $Id$
+2006-11-03 pkovacs
+ * Removed direct xmms support from conky. The Xmms and Bmp players
+ are now no longer directly supported as those projects are dead and
+ distros such as gentoo are slated them for removal.
+ * Added direct support for Audacious and Infopipe plugin via two new
+ sets of variables (audacious_ and infopipe_). Users can still view
+ Xmms and Bmp status within conky by use of the Infopipe support.
+ * Conky no longer loads Audacious music player library dynamically.
+
2006-10-18
* Implement WiFi signal level detection on FreeBSD (patch
by Stepan Zastupov)
diff --git a/README b/README
index 5c0cecc2..01e34d90 100644
--- a/README
+++ b/README
@@ -43,10 +43,11 @@ COMPILING
./configure --prefix=/usr --mandir=/usr/share/man --in-
fodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --local-
- statedir=/var/lib --enable-xft --enable-seti --enable-double-buffer
- --enable-own-window --enable-proc-uptime --enable-mpd --enable-mldonkey
- --enable-x11 --enable-portmon --enable-xmms --enable-bmp --enable-auda-
- cious --enable-infopipe --enable-bmpx
+ statedir=/var/lib --enable-xft --enable-own-window --enable-proc-uptime
+ --enable-audacious --enable-infopipe --enable-bmpx --enable-seti --en-
+ able-hddtemp --enable-mpd --enable-xmms2 --enable-imlib2 --enable-port-
+ mon --enable-mldonkey --enable-debug --enable-double-buffer --en-
+ able-xdamage --enable-x11
make
@@ -367,12 +368,6 @@ CONFIGURATION SETTINGS
Xft font to use.
- xmms_player
- Use specified player/plugin for the xmms status variables. Valid
- items are: none, xmms, bmp, audacious and infopipe. (default is
- none). Note that bmpx is currently handled separately.
-
-
TEXT After this begins text to be formatted on screen
@@ -432,6 +427,58 @@ VARIABLES
AC adapterstatus is on-line or charging (FreeBSD only)
+ audacious_bar (height),(width)
+ Progress bar
+
+
+ audacious_bitrate
+ Bitrate of current tune
+
+
+ audacious_channels
+ Number of audio channels of current tune
+
+
+ audacious_filename
+ Full path and filename of current tune
+
+
+ audacious_frequency
+ Sampling frequency of current tune
+
+
+ audacious_length
+ Total length of current tune as MM:SS
+
+
+ audacious_length_seconds
+ Total length of current tune in seconds
+
+
+ audacious_playlist_position
+ Playlist position of current tune
+
+
+ audacious_playlist_length
+ Number of tunes in playlist
+
+
+ audacious_position
+ Position of current tune (MM:SS)
+
+
+ audacious_position_seconds
+ Position of current tune in seconds
+
+
+ audacious_status
+ Player status (Playing/Paused/Stopped/Not running)
+
+
+ audacious_title
+ Title of current tune
+
+
battery (num)
Remaining capacity in ACPI or APM battery. ACPI battery number
can be given as argument (default is BAT0).
@@ -748,6 +795,58 @@ VARIABLES
you will be prompted to enter the password when Conky starts.
+ infopipe_bar (height),(width)
+ Progress bar
+
+
+ infopipe_bitrate
+ Bitrate of current tune
+
+
+ infopipe_channels
+ Number of audio channels of current tune
+
+
+ infopipe_filename
+ Full path and filename of current tune
+
+
+ infopipe_frequency
+ Sampling frequency of current tune
+
+
+ infopipe_length
+ Total length of current tune as MM:SS
+
+
+ infopipe_length_seconds
+ Total length of current tune in seconds
+
+
+ infopipe_playlist_position
+ Playlist position of current tune
+
+
+ infopipe_playlist_length
+ Number of tunes in playlist
+
+
+ infopipe_position
+ Position of current tune (MM:SS)
+
+
+ infopipe_position_seconds
+ Position of current tune in seconds
+
+
+ infopipe_status
+ Player status (Playing/Paused/Stopped/Not running)
+
+
+ infopipe_title
+ Title of current tune
+
+
kernel Kernel version
@@ -1089,67 +1188,6 @@ VARIABLES
ted, the parameter defaults to 1.
- xmms_bar (height),(width)
- xmms / bmp / audacious / infopipe: progress bar
-
-
- xmms_bitrate
- xmms / bmp / audacious / infopipe: bitrate of current tune
-
-
- xmms_channels
- xmms / bmp / audacious / infopipe: number of audio channels of
- current tune
-
-
- xmms_filename
- xmms / bmp / audacious / infopipe: full path and filename of
- current tune
-
-
- xmms_frequency
- xmms / bmp / audacious / infopipe: sampling frequency of current
- tune
-
-
- xmms_length
- xmms / bmp / audacious / infopipe: total length of current tune
- as MM:SS
-
-
- xmms_length_seconds
- xmms / bmp / audacious / infopipe: total length of current tune
- in seconds
-
-
- xmms_playlist_position
- xmms / bmp / audacious / infopipe: playlist position of current
- tune
-
-
- xmms_playlist_length
- xmms / bmp / audacious / infopipe: number of tunes in playlist
-
-
- xmms_position
- xmms / bmp / audacious / infopipe: MM:SS position of current
- tune
-
-
- xmms_position_seconds
- xmms / bmp / audacious / infopipe: position of current tune in
- seconds
-
-
- xmms_status
- xmms / bmp / audacious / infopipe: player status (Play-
- ing/Paused/Stopped/Not running)
-
-
- xmms_title
- xmms / bmp / audacious / infopipe: title of current tune
-
-
EXAMPLES
conky -t '${time %D %H:%m}' -o -u 30
Start Conky in its own window with date and clock as text and 30
@@ -1164,11 +1202,11 @@ FILES
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
- 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
- useful to find the window to draw to. You can also use -o argument
+ 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
+ useful to find the window to draw to. You can also use -o argument
which makes Conky to create its own window.
SEE ALSO
diff --git a/configure.ac b/configure.ac
index 41ff0628..6b7ea1be 100644
--- a/configure.ac
+++ b/configure.ac
@@ -102,106 +102,6 @@ if test $dah = "yes"; then
AC_DEFINE(PROC_UPTIME, 1, [Define if you want to use /proc/uptime for uptime])
fi
-dnl
-dnl XMMS (Version 1)
-dnl
-
-want_xmms=auto
-AC_ARG_ENABLE(xmms,
- [ --enable-xmms enable xmms (ver. 1) media player support [[default=auto]]],
- [want_xmms="$enableval"])
-
-case x$want_xmms in
- xauto)
- want_xmms=yes
- ## its ok to favor the glib 2.0 headers over 1.2 for our purposes ##
- PKG_CHECK_MODULES([XMMS], [glib-2.0], [], [PKG_CHECK_MODULES([XMMS], [glib-1.2], [], [want_xmms=no])])
-
- if test x$want_xmms = xyes; then
- AC_CHECK_HEADERS([dlfcn.h], [], [want_xmms=no])
- if test x$want_xmms = xyes; then
- AC_CHECK_LIB(dl, dlopen, [LIBS="$LIBS -ldl"],
- [AC_CHECK_FUNCS(dlopen,[],
- [want_xmms=no])])
- if test x$want_xmms = xyes; then
- CFLAGS="$CFLAGS $XMMS_CFLAGS"
- ### if we link to glib 1.2, that means 2.0 wasn't found ###
- ### if we link to glib 2.0, that's ok, we will load libglib-1.2.so.0 dynamically ###
- LIBS="$LIBS $XMMS_LIBS"
- AC_DEFINE(XMMS, 1, [Define for XMMS Ver. 1 support])
- fi
- fi
- fi
- ;;
- xyes)
- ## its ok to favor the glib 2.0 headers over 1.2 for our purposes ##
- PKG_CHECK_MODULES([XMMS], [glib-2.0], [], [PKG_CHECK_MODULES([XMMS], [glib-1.2])])
- CFLAGS="$CFLAGS $XMMS_CFLAGS"
- ### if we link to glib 1.2, that means 2.0 wasn't found ###
- ### if we link to glib 2.0, that's ok, we will load libglib-1.2.so.0 dynamically ###
- LIBS="$LIBS $XMMS_LIBS"
- AC_CHECK_HEADERS([dlfcn.h], [],
- [AC_MSG_ERROR(["dlfcn.h not found: dynamic library loading not supported"])])
- AC_CHECK_LIB(dl, dlopen, [LIBS="$LIBS -ldl"],
- [AC_CHECK_FUNCS(dlopen,[],
- [AC_MSG_ERROR([dlopen() not available])])])
- AC_DEFINE(XMMS, 1, [Define for XMMS Ver. 1 support])
- ;;
- xno)
- ;;
- *)
- echo "Error: invalid xmms parameter specified: $want_xmms"
- exit -1
- ;;
-esac
-AM_CONDITIONAL(BUILD_XMMS, test x$want_xmms = xyes)
-
-dnl
-dnl BMP (through 0.9.7.1)
-dnl
-
-want_bmp=auto
-AC_ARG_ENABLE(bmp,
- [ --enable-bmp enable beep media media player support [[default=auto]]],
- [want_bmp="$enableval"])
-
-case x$want_bmp in
- xauto)
- want_bmp=yes
- PKG_CHECK_MODULES([BMP], [glib-2.0], [], [want_bmp=no])
- if test x$want_bmp = xyes; then
- AC_CHECK_HEADERS([dlfcn.h], [], [want_bmp=no])
- if test x$want_bmp = xyes; then
- AC_CHECK_LIB(dl, dlopen, [LIBS="$LIBS -ldl"],
- [AC_CHECK_FUNCS(dlopen,[],
- [want_bmp=no])])
- if test x$want_bmp = xyes; then
- CFLAGS="$CFLAGS $BMP_CFLAGS"
- LIBS="$LIBS $BMP_LIBS"
- AC_DEFINE(BMP, 1, [Define for Beep Media Player support])
- fi
- fi
- fi
- ;;
- xyes)
- PKG_CHECK_MODULES([BMP], [glib-2.0 >= 2.0])
- CFLAGS="$CFLAGS $BMP_CFLAGS"
- LIBS="$LIBS $BMP_LIBS"
- AC_CHECK_HEADERS([dlfcn.h], [],
- [AC_MSG_ERROR(["dlfcn.h not found: dynamic library loading not supported"])])
- AC_CHECK_LIB(dl, dlopen, [LIBS="$LIBS -ldl"],
- [AC_CHECK_FUNCS(dlopen,[],
- [AC_MSG_ERROR([dlopen() not available])])])
- AC_DEFINE(BMP, 1, [Define for Beep Media Player support])
- ;;
- xno)
- ;;
- *)
- echo "Error: invalid bmp parameter specified: $want_bmp"
- exit -1
- ;;
-esac
-AM_CONDITIONAL(BUILD_BMP, test x$want_bmp = xyes)
dnl
dnl Audacious Media Player
@@ -215,30 +115,18 @@ AC_ARG_ENABLE(audacious,
case x$want_audacious in
xauto)
want_audacious=yes
- PKG_CHECK_MODULES([AUDACIOUS], [glib-2.0], [], [want_audacious=no])
+ PKG_CHECK_MODULES([AUDACIOUS], [audacious >= 0.1], [], [want_audacious=no])
if test x$want_audacious = xyes; then
- AC_CHECK_HEADERS([dlfcn.h], [], [want_audacious=no])
- if test x$want_audacious = xyes; then
- AC_CHECK_LIB(dl, dlopen, [LIBS="$LIBS -ldl"],
- [AC_CHECK_FUNCS(dlopen,[],
- [want_audacious=no])])
- if test x$want_audacious = xyes; then
- CFLAGS="$CFLAGS $AUDACIOUS_CFLAGS"
- LIBS="$LIBS $AUDACIOUS_LIBS"
- AC_DEFINE(AUDACIOUS, 1, [Define for Audacious support])
- fi
- fi
+ CFLAGS="$CFLAGS $AUDACIOUS_CFLAGS"
+ LIBS="$LIBS $AUDACIOUS_LIBS"
+ AC_DEFINE(AUDACIOUS, 1, [Define for Audacious support])
fi
;;
xyes)
- PKG_CHECK_MODULES([AUDACIOUS], [glib-2.0])
+ PKG_CHECK_MODULES([AUDACIOUS], [audacious >= 0.1], [],
+ [AC_MSG_ERROR([Can't find Audacious development files.])])
CFLAGS="$CFLAGS $AUDACIOUS_CFLAGS"
LIBS="$LIBS $AUDACIOUS_LIBS"
- AC_CHECK_HEADERS([dlfcn.h], [],
- [AC_MSG_ERROR(["dlfcn.h not found: dynamic library loading not supported"])])
- AC_CHECK_LIB(dl, dlopen, [LIBS="$LIBS -ldl"],
- [AC_CHECK_FUNCS(dlopen,[],
- [AC_MSG_ERROR([dlopen() not available])])])
AC_DEFINE(AUDACIOUS, 1, [Define for Audacious support])
;;
xno)
@@ -254,9 +142,9 @@ dnl
dnl InfoPipe (Version 1.3)
dnl
-want_infopipe=yes
+want_infopipe=no
AC_ARG_ENABLE(infopipe,
- [ --enable-infopipe enable xmms/bmp infopipe support [[default=yes]]],
+ [ --enable-infopipe enable xmms/bmp infopipe support [[default=no]]],
[want_infopipe="$enableval"])
case x$want_infopipe in
@@ -647,8 +535,6 @@ $PACKAGE $VERSION configured successfully:
xdamage extension: $want_xdamage
* music detection:
- xmms: $want_xmms
- bmp: $want_bmp
audacious: $want_audacious
infopipe: $want_infopipe
bmpx: $want_bmpx
diff --git a/doc/config_settings.xml b/doc/config_settings.xml
index b122ab99..1e53d9eb 100644
--- a/doc/config_settings.xml
+++ b/doc/config_settings.xml
@@ -363,13 +363,6 @@
-
-
-
- Use specified player/plugin for the xmms status variables. Valid items are: none, xmms, bmp, audacious and infopipe. (default is none). Note that bmpx is currently handled separately.
-
-
-
diff --git a/doc/conky.1 b/doc/conky.1
index afe8cab7..ee1b3361 100644
--- a/doc/conky.1
+++ b/doc/conky.1
@@ -44,7 +44,7 @@ Example to compile and run Conky with all optional components (note that some co
.TP
\fB\*(T<\fBsh autogen.sh\fR\*(T>\fR \*(T<\fB# Only required if building from Svn\fR\*(T>
.TP
-\fB\*(T<\fB\&./configure \fR\*(T>\fR\*(T<\fB\-\-prefix=/usr \-\-mandir=/usr/share/man \-\-infodir=/usr/share/info \-\-datadir=/usr/share \-\-sysconfdir=/etc \-\-localstatedir=/var/lib \-\-enable\-xft \-\-enable\-seti \-\-enable\-double\-buffer \-\-enable\-own\-window \-\-enable\-proc\-uptime \-\-enable\-mpd \-\-enable\-mldonkey \-\-enable\-x11 \-\-enable\-portmon \-\-enable\-xmms \-\-enable\-bmp \-\-enable\-audacious \-\-enable\-infopipe \-\-enable\-bmpx \fR\*(T>
+\fB\*(T<\fB\&./configure \fR\*(T>\fR\*(T<\fB\-\-prefix=/usr \-\-mandir=/usr/share/man \-\-infodir=/usr/share/info \-\-datadir=/usr/share \-\-sysconfdir=/etc \-\-localstatedir=/var/lib \-\-enable\-xft \-\-enable\-own\-window \-\-enable\-proc\-uptime \-\-enable\-audacious \-\-enable\-infopipe \-\-enable\-bmpx \-\-enable\-seti \-\-enable\-hddtemp \-\-enable\-mpd \-\-enable\-xmms2 \-\-enable\-imlib2 \-\-enable\-portmon \-\-enable\-mldonkey \-\-enable\-debug \-\-enable\-double\-buffer \-\-enable\-xdamage \-\-enable\-x11\fR\*(T>
.TP
\fB\*(T<\fBmake\fR\*(T>\fR
.TP
@@ -341,10 +341,6 @@ Alpha of Xft font. Must be a value at or between 1 and 0.
\fB\*(T<\fBxftfont\fR\*(T>\fR
Xft font to use.
-.TP
-\fB\*(T<\fBxmms_player\fR\*(T>\fR
-Use specified player/plugin for the xmms status variables. Valid items are: none, xmms, bmp, audacious and infopipe. (default is none). Note that bmpx is currently handled separately.
-
.TP
\fB\*(T<\fBTEXT\fR\*(T>\fR
After this begins text to be formatted on screen
@@ -404,6 +400,58 @@ Display APM battery life in percent (FreeBSD only)
Display remaining APM battery life in hh:mm:ss or "unknown" if
AC adapterstatus is on-line or charging (FreeBSD only)
+.TP
+\fB\*(T<\fBaudacious_bar\fR\*(T>\fR \*(T<\fB(height),(width)\fR\*(T>
+Progress bar
+
+.TP
+\fB\*(T<\fBaudacious_bitrate\fR\*(T>\fR
+Bitrate of current tune
+
+.TP
+\fB\*(T<\fBaudacious_channels\fR\*(T>\fR
+Number of audio channels of current tune
+
+.TP
+\fB\*(T<\fBaudacious_filename\fR\*(T>\fR
+Full path and filename of current tune
+
+.TP
+\fB\*(T<\fBaudacious_frequency\fR\*(T>\fR
+Sampling frequency of current tune
+
+.TP
+\fB\*(T<\fBaudacious_length\fR\*(T>\fR
+Total length of current tune as MM:SS
+
+.TP
+\fB\*(T<\fBaudacious_length_seconds\fR\*(T>\fR
+Total length of current tune in seconds
+
+.TP
+\fB\*(T<\fBaudacious_playlist_position\fR\*(T>\fR
+Playlist position of current tune
+
+.TP
+\fB\*(T<\fBaudacious_playlist_length\fR\*(T>\fR
+Number of tunes in playlist
+
+.TP
+\fB\*(T<\fBaudacious_position\fR\*(T>\fR
+Position of current tune (MM:SS)
+
+.TP
+\fB\*(T<\fBaudacious_position_seconds\fR\*(T>\fR
+Position of current tune in seconds
+
+.TP
+\fB\*(T<\fBaudacious_status\fR\*(T>\fR
+Player status (Playing/Paused/Stopped/Not running)
+
+.TP
+\fB\*(T<\fBaudacious_title\fR\*(T>\fR
+Title of current tune
+
.TP
\fB\*(T<\fBbattery\fR\*(T>\fR \*(T<\fB(num)\fR\*(T>
Remaining capacity in ACPI or APM battery. ACPI battery number can be given as argument (default is BAT0).
@@ -661,6 +709,58 @@ Displays the number of messages in your global IMAP inbox by default. You can de
\fB\*(T<\fBimap_unseen\fR\*(T>\fR \*(T<\fB(args)\fR\*(T>
Displays the number of unseen messages in your global IMAP inbox by default. You can define individual IMAP inboxes seperately by passing arguments to this object. Arguments are: "host user pass [-i interval] [-p port] [-e command]". Default port is 110, default interval is 5 minutes. If the password is supplied as '*', you will be prompted to enter the password when Conky starts.
+.TP
+\fB\*(T<\fBinfopipe_bar\fR\*(T>\fR \*(T<\fB(height),(width)\fR\*(T>
+Progress bar
+
+.TP
+\fB\*(T<\fBinfopipe_bitrate\fR\*(T>\fR
+Bitrate of current tune
+
+.TP
+\fB\*(T<\fBinfopipe_channels\fR\*(T>\fR
+Number of audio channels of current tune
+
+.TP
+\fB\*(T<\fBinfopipe_filename\fR\*(T>\fR
+Full path and filename of current tune
+
+.TP
+\fB\*(T<\fBinfopipe_frequency\fR\*(T>\fR
+Sampling frequency of current tune
+
+.TP
+\fB\*(T<\fBinfopipe_length\fR\*(T>\fR
+Total length of current tune as MM:SS
+
+.TP
+\fB\*(T<\fBinfopipe_length_seconds\fR\*(T>\fR
+Total length of current tune in seconds
+
+.TP
+\fB\*(T<\fBinfopipe_playlist_position\fR\*(T>\fR
+Playlist position of current tune
+
+.TP
+\fB\*(T<\fBinfopipe_playlist_length\fR\*(T>\fR
+Number of tunes in playlist
+
+.TP
+\fB\*(T<\fBinfopipe_position\fR\*(T>\fR
+Position of current tune (MM:SS)
+
+.TP
+\fB\*(T<\fBinfopipe_position_seconds\fR\*(T>\fR
+Position of current tune in seconds
+
+.TP
+\fB\*(T<\fBinfopipe_status\fR\*(T>\fR
+Player status (Playing/Paused/Stopped/Not running)
+
+.TP
+\fB\*(T<\fBinfopipe_title\fR\*(T>\fR
+Title of current tune
+
.TP
\fB\*(T<\fBkernel\fR\*(T>\fR
Kernel version
@@ -986,58 +1086,6 @@ Returns CPU #n's voltage in V. CPUs are
counted from 1. If omitted, the parameter
defaults to 1.
-.TP
-\fB\*(T<\fBxmms_bar\fR\*(T>\fR \*(T<\fB(height),(width)\fR\*(T>
-xmms / bmp / audacious / infopipe: progress bar
-
-.TP
-\fB\*(T<\fBxmms_bitrate\fR\*(T>\fR
-xmms / bmp / audacious / infopipe: bitrate of current tune
-
-.TP
-\fB\*(T<\fBxmms_channels\fR\*(T>\fR
-xmms / bmp / audacious / infopipe: number of audio channels of current tune
-
-.TP
-\fB\*(T<\fBxmms_filename\fR\*(T>\fR
-xmms / bmp / audacious / infopipe: full path and filename of current tune
-
-.TP
-\fB\*(T<\fBxmms_frequency\fR\*(T>\fR
-xmms / bmp / audacious / infopipe: sampling frequency of current tune
-
-.TP
-\fB\*(T<\fBxmms_length\fR\*(T>\fR
-xmms / bmp / audacious / infopipe: total length of current tune as MM:SS
-
-.TP
-\fB\*(T<\fBxmms_length_seconds\fR\*(T>\fR
-xmms / bmp / audacious / infopipe: total length of current tune in seconds
-
-.TP
-\fB\*(T<\fBxmms_playlist_position\fR\*(T>\fR
-xmms / bmp / audacious / infopipe: playlist position of current tune
-
-.TP
-\fB\*(T<\fBxmms_playlist_length\fR\*(T>\fR
-xmms / bmp / audacious / infopipe: number of tunes in playlist
-
-.TP
-\fB\*(T<\fBxmms_position\fR\*(T>\fR
-xmms / bmp / audacious / infopipe: MM:SS position of current tune
-
-.TP
-\fB\*(T<\fBxmms_position_seconds\fR\*(T>\fR
-xmms / bmp / audacious / infopipe: position of current tune in seconds
-
-.TP
-\fB\*(T<\fBxmms_status\fR\*(T>\fR
-xmms / bmp / audacious / infopipe: player status (Playing/Paused/Stopped/Not running)
-
-.TP
-\fB\*(T<\fBxmms_title\fR\*(T>\fR
-xmms / bmp / audacious / infopipe: title of current tune
-
.SH EXAMPLES
.TP
\*(T\*(T<\fB\-t '${time %D %H:%m}' \-o \-u 30\fR\*(T>
diff --git a/doc/docs.xml b/doc/docs.xml
index 5f44e42e..2fd0587c 100644
--- a/doc/docs.xml
+++ b/doc/docs.xml
@@ -79,7 +79,7 @@
-
+
diff --git a/doc/variables.xml b/doc/variables.xml
index 8b2dc7f3..5a3ee952 100644
--- a/doc/variables.xml
+++ b/doc/variables.xml
@@ -111,6 +111,124 @@
+
+
+
+
+
+
+ Progress bar
+
+
+
+
+
+
+
+
+ Bitrate of current tune
+
+
+
+
+
+
+
+
+ Number of audio channels of current tune
+
+
+
+
+
+
+
+
+ Full path and filename of current tune
+
+
+
+
+
+
+
+
+ Sampling frequency of current tune
+
+
+
+
+
+
+
+
+ Total length of current tune as MM:SS
+
+
+
+
+
+
+
+
+ Total length of current tune in seconds
+
+
+
+
+
+
+
+
+ Playlist position of current tune
+
+
+
+
+
+
+
+
+ Number of tunes in playlist
+
+
+
+
+
+
+
+
+ Position of current tune (MM:SS)
+
+
+
+
+
+
+
+
+ Position of current tune in seconds
+
+
+
+
+
+
+
+
+ Player status (Playing/Paused/Stopped/Not running)
+
+
+
+
+
+
+
+
+ Title of current tune
+
+
+
@@ -725,6 +843,124 @@
+
+
+
+
+
+
+ Progress bar
+
+
+
+
+
+
+
+
+ Bitrate of current tune
+
+
+
+
+
+
+
+
+ Number of audio channels of current tune
+
+
+
+
+
+
+
+
+ Full path and filename of current tune
+
+
+
+
+
+
+
+
+ Sampling frequency of current tune
+
+
+
+
+
+
+
+
+ Total length of current tune as MM:SS
+
+
+
+
+
+
+
+
+ Total length of current tune in seconds
+
+
+
+
+
+
+
+
+ Playlist position of current tune
+
+
+
+
+
+
+
+
+ Number of tunes in playlist
+
+
+
+
+
+
+
+
+ Position of current tune (MM:SS)
+
+
+
+
+
+
+
+
+ Position of current tune in seconds
+
+
+
+
+
+
+
+
+ Player status (Playing/Paused/Stopped/Not running)
+
+
+
+
+
+
+
+
+ Title of current tune
+
+
+
@@ -1405,122 +1641,4 @@
-
-
-
-
-
-
- xmms / bmp / audacious / infopipe: progress bar
-
-
-
-
-
-
-
-
- xmms / bmp / audacious / infopipe: bitrate of current tune
-
-
-
-
-
-
-
-
- xmms / bmp / audacious / infopipe: number of audio channels of current tune
-
-
-
-
-
-
-
-
- xmms / bmp / audacious / infopipe: full path and filename of current tune
-
-
-
-
-
-
-
-
- xmms / bmp / audacious / infopipe: sampling frequency of current tune
-
-
-
-
-
-
-
-
- xmms / bmp / audacious / infopipe: total length of current tune as MM:SS
-
-
-
-
-
-
-
-
- xmms / bmp / audacious / infopipe: total length of current tune in seconds
-
-
-
-
-
-
-
-
- xmms / bmp / audacious / infopipe: playlist position of current tune
-
-
-
-
-
-
-
-
- xmms / bmp / audacious / infopipe: number of tunes in playlist
-
-
-
-
-
-
-
-
- xmms / bmp / audacious / infopipe: MM:SS position of current tune
-
-
-
-
-
-
-
-
- xmms / bmp / audacious / infopipe: position of current tune in seconds
-
-
-
-
-
-
-
-
- xmms / bmp / audacious / infopipe: player status (Playing/Paused/Stopped/Not running)
-
-
-
-
-
-
-
-
- xmms / bmp / audacious / infopipe: title of current tune
-
-
-
diff --git a/src/Makefile.am b/src/Makefile.am
index 62a1d48b..4f276bc5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,19 +1,11 @@
bin_PROGRAMS = conky
-if BUILD_XMMS
-xmms = xmms.c xmms.h
-endif
-
-if BUILD_BMP
-xmms = xmms.c xmms.h
-endif
-
if BUILD_AUDACIOUS
-xmms = xmms.c xmms.h
+audacious = audacious.c audacious.h
endif
if BUILD_INFOPIPE
-xmms = xmms.c xmms.h
+infopipe = infopipe.c infopipe.h
endif
if BUILD_BMPX
@@ -66,9 +58,56 @@ if BUILD_HDDTEMP
hddtemp = hddtemp.c
endif
-conky_SOURCES = common.c fs.c $(linux) mail.c mixer.c $(seti) $(mpd) $(xmms2) $(solaris) $(freebsd) $(netbsd) $(port_monitors) conky.c conky.h $(x11) $(mldonkey) remoted.c remoted.h remotec.c remotec.h $(xmms) $(bmpx) $(hddtemp)
+conky_SOURCES = \
+ $(audacious) \
+ $(bmpx) \
+ common.c \
+ conky.c \
+ conky.h \
+ $(freebsd) \
+ fs.c \
+ $(hddtemp) \
+ $(infopipe) \
+ $(linux) \
+ mail.c \
+ mixer.c \
+ $(mldonkey) \
+ $(mpd) \
+ $(netbsd) \
+ $(port_monitors) \
+ $(seti) \
+ $(solaris) \
+ remotec.c \
+ remotec.h \
+ remoted.c \
+ remoted.h \
+ $(x11) \
+ $(xmms2)
AM_LDFLAGS = $(X11_LIBS) $(XFT_LIBS) $(CAIRO_LIBS) $(PTHREAD_LIBS) -lm
-EXTRA_DIST = seti.c linux.c solaris.c freebsd.c netbsd.c mpd.c libmpdclient.c \
-libmpdclient.h xmms2.c top.h mldonkey.c ftp.c ftp.h x11.c hddtemp.c
+EXTRA_DIST = \
+ audacious.c \
+ audacious.h \
+ bmpx.c \
+ freebsd.c \
+ ftp.c \
+ ftp.h \
+ hash.c \
+ hash.h \
+ hddtemp.c \
+ infopipe.c \
+ infopipe.h \
+ linux.c \
+ libmpdclient.c \
+ libmpdclient.h \
+ libtcp-portmon.c \
+ libtcp-portmon.h \
+ mldonkey.c \
+ mpd.c \
+ netbsd.c \
+ seti.c \
+ solaris.c \
+ top.h \
+ x11.c \
+ xmms2.c
diff --git a/src/audacious.c b/src/audacious.c
new file mode 100644
index 00000000..02dd06a0
--- /dev/null
+++ b/src/audacious.c
@@ -0,0 +1,219 @@
+/* -------------------------------------------------------------------------
+ * audacious.c: conky support for audacious music player
+ *
+ * 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 "config.h"
+#include "conky.h"
+#include "audacious.h"
+
+/* access to this item array is synchronized */
+static audacious_t audacious_items;
+
+/* -----------------------------------------
+ * Conky update function for audacious data.
+ * ----------------------------------------- */
+void update_audacious(void)
+{
+ /*
+ The worker thread is updating audacious_items array asynchronously to the main
+ conky thread. We merely copy the audacious_items array into the main thread's
+ info structure when the main thread's update cycle fires.
+ */
+ pthread_mutex_lock(&info.audacious.item_mutex);
+ memcpy(&info.audacious.items,audacious_items,sizeof(audacious_items));
+ pthread_mutex_unlock(&info.audacious.item_mutex);
+}
+
+
+/* ------------------------------------------------------------
+ * Create a worker thread for audacious media player status.
+ *
+ * Returns 0 on success, -1 on error.
+ * ------------------------------------------------------------*/
+int create_audacious_thread(void)
+{
+ /* Is a worker is thread already running? */
+ if (info.audacious.thread)
+ return(-1);
+
+ /* Joinable thread for audacious activity */
+ pthread_attr_init(&info.audacious.thread_attr);
+ pthread_attr_setdetachstate(&info.audacious.thread_attr, PTHREAD_CREATE_JOINABLE);
+ /* Init mutexes */
+ pthread_mutex_init(&info.audacious.item_mutex, NULL);
+ pthread_mutex_init(&info.audacious.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))
+ return(-1);
+
+ return 0;
+}
+
+/* ------------------------------------------------
+ * Destroy audacious player status thread.
+ *
+ * Returns 0 on success, -1 on error.
+ * ------------------------------------------------ */
+int destroy_audacious_thread(void)
+{
+ /* Is a worker is thread running? If not, no error. */
+ if (!info.audacious.thread)
+ return(0);
+
+ /* Signal audacious thread to terminate */
+ pthread_mutex_lock(&info.audacious.runnable_mutex);
+ info.audacious.runnable=0;
+ pthread_mutex_unlock(&info.audacious.runnable_mutex);
+ /* Destroy thread attribute and wait for thread */
+ pthread_attr_destroy(&info.audacious.thread_attr);
+ if (pthread_join(info.audacious.thread, NULL))
+ return(-1);
+ /* Destroy mutexes */
+ pthread_mutex_destroy(&info.audacious.item_mutex);
+ pthread_mutex_destroy(&info.audacious.runnable_mutex);
+
+ info.audacious.thread=(pthread_t)0;
+ return 0;
+}
+
+/* ---------------------------------------------------
+ * Worker thread function for audacious data sampling.
+ * --------------------------------------------------- */
+void *audacious_thread_func(void *pvoid)
+{
+ int runnable;
+ static audacious_t items;
+ gint session,playpos,frames,length;
+ gint rate,freq,chans;
+ gchar *psong,*pfilename;
+
+ pvoid=(void *)pvoid; /* avoid warning */
+ session=0;
+ psong=NULL;
+ pfilename=NULL;
+
+ /* 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 = xmms_remote_get_playlist_pos (session);
+ psong = xmms_remote_get_playlist_title (session, playpos);
+ if (psong) {
+ strncpy(items[AUDACIOUS_TITLE],psong,sizeof(items[AUDACIOUS_TITLE])-1);
+ g_free (psong);
+ psong=NULL;
+ }
+
+ /* Current song length as MM:SS */
+ frames = xmms_remote_get_playlist_time (session,playpos);
+ length = frames / 1000;
+ snprintf(items[AUDACIOUS_LENGTH],sizeof(items[AUDACIOUS_LENGTH])-1,
+ "%d:%.2d", length / 60, length % 60);
+
+ /* Current song length in seconds */
+ snprintf(items[AUDACIOUS_LENGTH_SECONDS],sizeof(items[AUDACIOUS_LENGTH_SECONDS])-1,
+ "%d", length);
+
+ /* Current song position as MM:SS */
+ frames = xmms_remote_get_output_time (session);
+ length = frames / 1000;
+ snprintf(items[AUDACIOUS_POSITION],sizeof(items[AUDACIOUS_POSITION])-1,
+ "%d:%.2d", length / 60, length % 60);
+
+ /* Current song position in seconds */
+ snprintf(items[AUDACIOUS_POSITION_SECONDS],sizeof(items[AUDACIOUS_POSITION_SECONDS])-1,
+ "%d", length);
+
+ /* Current song bitrate */
+ xmms_remote_get_info (session, &rate, &freq, &chans);
+ snprintf(items[AUDACIOUS_BITRATE],sizeof(items[AUDACIOUS_BITRATE])-1, "%d", rate);
+
+ /* Current song frequency */
+ snprintf(items[AUDACIOUS_FREQUENCY],sizeof(items[AUDACIOUS_FREQUENCY])-1, "%d", freq);
+
+ /* Current song channels */
+ snprintf(items[AUDACIOUS_CHANNELS],sizeof(items[AUDACIOUS_CHANNELS])-1, "%d", chans);
+
+ /* Current song filename */
+ pfilename = xmms_remote_get_playlist_file (session,playpos);
+ if (pfilename) {
+ strncpy(items[AUDACIOUS_FILENAME],pfilename,sizeof(items[AUDACIOUS_FILENAME])-1);
+ g_free (pfilename);
+ pfilename=NULL;
+ }
+
+ /* Length of the Playlist (number of songs) */
+ length = xmms_remote_get_playlist_length (session);
+ snprintf(items[AUDACIOUS_PLAYLIST_LENGTH],sizeof(items[AUDACIOUS_PLAYLIST_LENGTH])-1, "%d", length);
+
+ /* Playlist position (index of song) */
+ snprintf(items[AUDACIOUS_PLAYLIST_POSITION],sizeof(items[AUDACIOUS_PLAYLIST_POSITION])-1, "%d", playpos+1);
+
+ break;
+ }
+
+ /* Deliver the refreshed items array to g_items. */
+ pthread_mutex_lock(&info.audacious.item_mutex);
+ memcpy(&audacious_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/xmms.h b/src/audacious.h
similarity index 52%
rename from src/xmms.h
rename to src/audacious.h
index 2c305583..c938aebf 100644
--- a/src/xmms.h
+++ b/src/audacious.h
@@ -1,9 +1,9 @@
/* -------------------------------------------------------------------------
- * xmms.h: conky support for XMMS-related projects
+ * audacious.h: conky support for audacious music player
*
* Copyright (C) 2005 Philip Kovacs kovacsp3@comcast.net
*
- * $Id$
+ * $Id $
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,49 +20,37 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* --------------------------------------------------------------------------- */
-#ifndef XMMS_H
-#define XMMS_H
+#ifndef AUDACIOUS_H
+#define AUDACIOUS_H
-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,
+enum _audacious_items {
+ AUDACIOUS_STATUS=0,
+ AUDACIOUS_TITLE,
+ AUDACIOUS_LENGTH,
+ AUDACIOUS_LENGTH_SECONDS,
+ AUDACIOUS_POSITION,
+ AUDACIOUS_POSITION_SECONDS,
+ AUDACIOUS_BITRATE,
+ AUDACIOUS_FREQUENCY,
+ AUDACIOUS_CHANNELS,
+ AUDACIOUS_FILENAME,
+ AUDACIOUS_PLAYLIST_LENGTH,
+ AUDACIOUS_PLAYLIST_POSITION,
};
-enum _xmms_projects {
- PROJECT_NONE = 0,
- PROJECT_XMMS = 1,
- PROJECT_BMP = 2,
- PROJECT_AUDACIOUS = 3,
- PROJECT_INFOPIPE = 4
-};
+/* 12 slots for the audacious values */
+typedef char audacious_t[12][128];
-#define SET_XMMS_PROJECT_AVAILABLE(mask,project) (mask |= (1<a, &obj->b);
END
#endif
+#ifdef INFOPIPE
+ OBJ(infopipe_status, INFO_INFOPIPE) END
+ OBJ(infopipe_title, INFO_INFOPIPE) END
+ OBJ(infopipe_length, INFO_INFOPIPE) END
+ OBJ(infopipe_length_seconds, INFO_INFOPIPE) END
+ OBJ(infopipe_position, INFO_INFOPIPE) END
+ OBJ(infopipe_position_seconds, INFO_INFOPIPE) END
+ OBJ(infopipe_bitrate, INFO_INFOPIPE) END
+ OBJ(infopipe_frequency, INFO_INFOPIPE) END
+ OBJ(infopipe_channels, INFO_INFOPIPE) END
+ OBJ(infopipe_filename, INFO_INFOPIPE) END
+ OBJ(infopipe_playlist_length, INFO_INFOPIPE) END
+ OBJ(infopipe_playlist_position, INFO_INFOPIPE) END
+ OBJ(infopipe_bar, INFO_INFOPIPE)
+ (void) scan_bar(arg, &obj->a, &obj->b);
+ END
+
+#endif
#ifdef BMPX
OBJ(bmpx_title, INFO_BMPX)
memset(&(info.bmpx), 0, sizeof(struct bmpx_s));
@@ -4553,47 +4580,91 @@ static void generate_text_internal(char *p, int p_max_size, struct text_object *
}
}
#endif
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE)
- OBJ(xmms_status) {
- snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_STATUS]);
+#ifdef AUDACIOUS
+ OBJ(audacious_status) {
+ snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_STATUS]);
}
- OBJ(xmms_title) {
- snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_TITLE]);
+ OBJ(audacious_title) {
+ snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_TITLE]);
}
- OBJ(xmms_length) {
- snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_LENGTH]);
+ OBJ(audacious_length) {
+ snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_LENGTH]);
}
- OBJ(xmms_length_seconds) {
- snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_LENGTH_SECONDS]);
+ OBJ(audacious_length_seconds) {
+ snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_LENGTH_SECONDS]);
}
- OBJ(xmms_position) {
- snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_POSITION]);
+ OBJ(audacious_position) {
+ snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_POSITION]);
}
- OBJ(xmms_position_seconds) {
- snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_POSITION_SECONDS]);
+ OBJ(audacious_position_seconds) {
+ snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_POSITION_SECONDS]);
}
- OBJ(xmms_bitrate) {
- snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_BITRATE]);
+ OBJ(audacious_bitrate) {
+ snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_BITRATE]);
}
- OBJ(xmms_frequency) {
- snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_FREQUENCY]);
+ OBJ(audacious_frequency) {
+ snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_FREQUENCY]);
}
- OBJ(xmms_channels) {
- snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_CHANNELS]);
+ OBJ(audacious_channels) {
+ snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_CHANNELS]);
}
- OBJ(xmms_filename) {
- snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_FILENAME]);
+ OBJ(audacious_filename) {
+ snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_FILENAME]);
}
- OBJ(xmms_playlist_length) {
- snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_PLAYLIST_LENGTH]);
+ OBJ(audacious_playlist_length) {
+ snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_PLAYLIST_LENGTH]);
}
- OBJ(xmms_playlist_position) {
- snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_PLAYLIST_POSITION]);
+ OBJ(audacious_playlist_position) {
+ snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_PLAYLIST_POSITION]);
}
- OBJ(xmms_bar) {
+ OBJ(audacious_bar) {
double progress;
- progress= atof(cur->xmms.items[XMMS_POSITION_SECONDS]) /
- atof(cur->xmms.items[XMMS_LENGTH_SECONDS]);
+ progress= atof(cur->audacious.items[AUDACIOUS_POSITION_SECONDS]) /
+ atof(cur->audacious.items[AUDACIOUS_LENGTH_SECONDS]);
+ new_bar(p,obj->a,obj->b,(int)(progress*255.0f));
+ }
+#endif
+#ifdef INFOPIPE
+ OBJ(infopipe_status) {
+ snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_STATUS]);
+ }
+ OBJ(infopipe_title) {
+ snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_TITLE]);
+ }
+ OBJ(infopipe_length) {
+ snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_LENGTH]);
+ }
+ OBJ(infopipe_length_seconds) {
+ snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_LENGTH_SECONDS]);
+ }
+ OBJ(infopipe_position) {
+ snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_POSITION]);
+ }
+ OBJ(infopipe_position_seconds) {
+ snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_POSITION_SECONDS]);
+ }
+ 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_filename) {
+ snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_FILENAME]);
+ }
+ OBJ(infopipe_playlist_length) {
+ snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_PLAYLIST_LENGTH]);
+ }
+ OBJ(infopipe_playlist_position) {
+ snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_PLAYLIST_POSITION]);
+ }
+ OBJ(infopipe_bar) {
+ double progress;
+ progress= atof(cur->infopipe.items[INFOPIPE_POSITION_SECONDS]) /
+ atof(cur->infopipe.items[INFOPIPE_LENGTH_SECONDS]);
new_bar(p,obj->a,obj->b,(int)(progress*255.0f));
}
#endif
@@ -6085,13 +6156,13 @@ void reload_config(void)
free(info.cpu_usage);
info.cpu_usage = NULL;
}
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE)
- if (info.xmms.thread) {
- if (destroy_xmms_thread()!=0)
- {
- ERR("error destroying xmms_player thread");
- }
- }
+#ifdef AUDACIOUS
+ if ( (info.audacious.thread) && (destroy_audacious_thread()!=0) )
+ ERR("error destroying audacious thread");
+#endif
+#ifdef INFOPIPE
+ if ( (info.infopipe.thread) && (destroy_infopipe_thread()!=0) )
+ ERR("error destroying audacious thread");
#endif
#ifdef TCP_PORT_MONITOR
destroy_tcp_port_monitor_collection( info.p_tcp_port_monitor_collection );
@@ -6109,12 +6180,13 @@ void reload_config(void)
#ifdef TCP_PORT_MONITOR
info.p_tcp_port_monitor_collection = NULL;
#endif
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE)
- if ( (!info.xmms.thread) && (info.xmms.current_project > PROJECT_NONE) &&
- (create_xmms_thread() !=0) )
- {
- CRIT_ERR("unable to create xmms_player thread!");
- }
+#ifdef AUDACIOUS
+ if ( (!info.audacious.thread) && (create_audacious_thread() !=0) )
+ CRIT_ERR("unable to create audacious thread!");
+#endif
+#ifdef INFOPIPE
+ if ( (!info.infopipe.thread) && (create_infopipe_thread() !=0) )
+ CRIT_ERR("unable to create infopipe thread!");
#endif
extract_variable_text(text);
free(text);
@@ -6180,11 +6252,13 @@ void clean_up(void)
destroy_tcp_port_monitor_collection( info.p_tcp_port_monitor_collection );
info.p_tcp_port_monitor_collection = NULL;
#endif
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE)
- if ( info.xmms.thread && (destroy_xmms_thread()!=0) )
- {
- ERR("error destroying xmms_player thread");
- }
+#ifdef AUDACIOUS
+ if ( info.audacious.thread && (destroy_audacious_thread()!=0) )
+ ERR("error destroying audacious thread");
+#endif
+#ifdef INFOPIPE
+ if ( info.infopipe.thread && (destroy_infopipe_thread()!=0) )
+ ERR("error destroying infopipe thread");
#endif
}
@@ -6313,10 +6387,6 @@ static void set_default_configurations(void)
tcp_port_monitor_collection_args.min_port_monitors = MIN_PORT_MONITORS_DEFAULT;
tcp_port_monitor_args.min_port_monitor_connections = MIN_PORT_MONITOR_CONNECTIONS_DEFAULT;
#endif
-
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE)
- info.xmms.current_project=PROJECT_NONE;
-#endif
}
static void load_config_file(const char *f)
@@ -6443,26 +6513,10 @@ else if (strcasecmp(name, a) == 0 || strcasecmp(name, b) == 0)
CONF_ERR;
}
#endif /* X11 */
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE)
CONF("xmms_player") {
- if (value) {
- if (strncmp(value,"none",4)==0)
- info.xmms.current_project=PROJECT_NONE;
- else if (strncmp(value,"xmms",4)==0)
- info.xmms.current_project=PROJECT_XMMS;
- else if (strncmp(value,"bmp",3)==0)
- info.xmms.current_project=PROJECT_BMP;
- else if (strncmp(value,"audacious",9)==0)
- info.xmms.current_project=PROJECT_AUDACIOUS;
- else if (strncmp(value,"infopipe",8)==0)
- info.xmms.current_project=PROJECT_INFOPIPE;
- else
- CONF_ERR;
- }
- else
- CONF_ERR;
+ if (value)
+ ERR("xmms_player is deprecated. see ./configure --help");
}
-#endif
CONF("imap") {
if (value) {
info.mail = parse_mail_args(IMAP, value);
@@ -6891,19 +6945,6 @@ int main(int argc, char **argv)
tcp_port_monitor_args.min_port_monitor_connections = MIN_PORT_MONITOR_CONNECTIONS_DEFAULT;
#endif
-#if defined(XMMS)
- SET_XMMS_PROJECT_AVAILABLE(info.xmms.project_mask, PROJECT_XMMS);
-#endif
-#if defined(BMP)
- SET_XMMS_PROJECT_AVAILABLE(info.xmms.project_mask, PROJECT_BMP);
-#endif
-#if defined(AUDACIOUS)
- SET_XMMS_PROJECT_AVAILABLE(info.xmms.project_mask, PROJECT_AUDACIOUS);
-#endif
-#if defined(INFOPIPE)
- SET_XMMS_PROJECT_AVAILABLE(info.xmms.project_mask, PROJECT_INFOPIPE);
-#endif
-
/* handle command line parameters that don't change configs */
#ifdef X11
char *s, *temp;
@@ -7183,21 +7224,23 @@ int main(int argc, char **argv)
ERR("error setting signal handler: %s", strerror(errno) );
}
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE)
- if ( (info.xmms.current_project > PROJECT_NONE) && (create_xmms_thread() !=0) )
+#ifdef AUDACIOUS
+ if ( (create_audacious_thread() !=0) )
{
- CRIT_ERR("unable to create xmms_player thread!");
+ CRIT_ERR("unable to create audacious thread!");
}
#endif
main_loop();
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE)
- if ( info.xmms.thread && (destroy_xmms_thread()!=0) )
- {
- ERR("error destroying xmms_player thread");
- }
+#ifdef AUDACIOUS
+ if ( info.audacious.thread && (destroy_audacious_thread()!=0) )
+ ERR("error destroying audacious thread");
#endif
+#ifdef INFOPIPE
+ if ( info.infopipe.thread && (destroy_infopipe_thread()!=0) )
+ ERR("error destroying infopipe thread");
+#endif
#if defined(__FreeBSD__)
kvm_close(kd);
diff --git a/src/conky.h b/src/conky.h
index 8fca7e87..017756f2 100644
--- a/src/conky.h
+++ b/src/conky.h
@@ -42,8 +42,12 @@
#include
#endif /* __FreeBSD__ */
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE)
-#include "xmms.h"
+#ifdef AUDACIOUS
+#include "audacious.h"
+#endif
+
+#ifdef INFOPIPE
+#include "infopipe.h"
#endif
#ifdef XMMS2
@@ -175,13 +179,22 @@ struct xmms2_s {
};
#endif
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE)
-struct xmms_s {
- unsigned int project_mask;
- unsigned int current_project;
- xmms_t items; /* e.g. items[XMMS_STATUS] yields char[] */
+#ifdef AUDACIOUS
+struct audacious_s {
+ audacious_t items; /* e.g. items[AUDACIOUS_STATUS] */
int runnable; /* used to signal worker thread to stop */
- pthread_t thread; /* worker thread for xmms updating */
+ pthread_t thread; /* worker thread */
+ 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 INFOPIPE
+struct infopipe_s {
+ infopipe_t items; /* e.g. items[INFOPIPE_STATUS] */
+ int runnable; /* used to signal worker thread to stop */
+ pthread_t thread; /* worker thread */
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 */
@@ -237,14 +250,17 @@ enum {
#ifdef TCP_PORT_MONITOR
INFO_TCP_PORT_MONITOR = 22,
#endif
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE)
- INFO_XMMS = 23,
+#ifdef AUDACIOUS
+ INFO_AUDACIOUS = 23,
+#endif
+#ifdef INFOPIPE
+ INFO_INFOPIPE = 24,
#endif
#ifdef BMPX
- INFO_BMPX = 24,
+ INFO_BMPX = 25,
#endif
#ifdef XMMS2
- INFO_XMMS2 = 25,
+ INFO_XMMS2 = 26,
#endif
};
@@ -298,8 +314,11 @@ struct information {
fd_set xmms2_fdset;
xmmsc_connection_t *xmms2_conn;
#endif
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS) || defined(INFOPIPE)
- struct xmms_s xmms;
+#ifdef AUDACIOUS
+ struct audacious_s audacious;
+#endif
+#ifdef INFOPIPE
+ struct infopipe_s infopipe;
#endif
#ifdef BMPX
struct bmpx_s bmpx;
diff --git a/src/infopipe.c b/src/infopipe.c
new file mode 100644
index 00000000..f0d6eab9
--- /dev/null
+++ b/src/infopipe.c
@@ -0,0 +1,268 @@
+/* -------------------------------------------------------------------------
+ * infopipe.c: conky support for infopipe plugin
+ *
+ * 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
+#include
+
+#include "config.h"
+#include "conky.h"
+#include "xmms.h"
+
+#define INFOPIPE_NAMED_PIPE "/tmp/xmms-info"
+
+/* 14 keys comprise the output of the infopipe plugin. */
+enum _infopipe_keys {
+ INFOPIPE_KEY_PROTOCOL=0,
+ INFOPIPE_KEY_VERSION,
+ INFOPIPE_KEY_STATUS,
+ INFOPIPE_KEY_PLAYLIST_TUNES,
+ INFOPIPE_KEY_PLAYLIST_CURRTUNE,
+ INFOPIPE_KEY_USEC_POSITION,
+ INFOPIPE_KEY_POSITION,
+ INFOPIPE_KEY_USEC_TIME,
+ INFOPIPE_KEY_TIME,
+ INFOPIPE_KEY_BITRATE,
+ INFOPIPE_KEY_FREQUENCY,
+ INFOPIPE_KEY_CHANNELS,
+ INFOPIPE_KEY_TITLE,
+ INFOPIPE_KEY_FILE
+};
+
+/* access to this item array is synchronized */
+static infopipe_t infopipe_items;
+
+/* ----------------------------------------
+ * Conky update function for infopipe data.
+ * ---------------------------------------- */
+void update_infopipe(void)
+{
+ /*
+ The worker thread is updating the infopipe_items array asynchronously to the main
+ conky thread. We merely copy the infopipe_items array into the main thread's info
+ structure when the main thread's update cycle fires.
+ */
+ pthread_mutex_lock(&info.infopipe.item_mutex);
+ memcpy(&info.infopipe.items,infopipe_items,sizeof(infopipe_items));
+ pthread_mutex_unlock(&info.infopipe.item_mutex);
+}
+
+
+/* ------------------------------------------------------------
+ * Create a worker thread for infopipe media player status.
+ *
+ * Returns 0 on success, -1 on error.
+ * ------------------------------------------------------------*/
+int create_infopipe_thread(void)
+{
+ /* Is a worker is thread already running? */
+ if (info.infopipe.thread)
+ return(-1);
+
+ /* Joinable thread for infopipe activity */
+ pthread_attr_init(&info.infopipe.thread_attr);
+ pthread_attr_setdetachstate(&info.infopipe.thread_attr, PTHREAD_CREATE_JOINABLE);
+ /* Init mutexes */
+ 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))
+ return(-1);
+
+ return 0;
+}
+
+/* ------------------------------------------------
+ * Destroy infopipe status thread.
+ *
+ * Returns 0 on success, -1 on error.
+ * ------------------------------------------------ */
+int destroy_infopipe_thread(void)
+{
+ /* Is a worker is thread running? If not, no error. */
+ if (!info.infopipe.thread)
+ return(0);
+
+ /* 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))
+ return(-1);
+ /* Destroy mutexes */
+ pthread_mutex_destroy(&info.infopipe.item_mutex);
+ pthread_mutex_destroy(&info.infopipe.runnable_mutex);
+
+ info.infopipe.thread=(pthread_t)0;
+ return 0;
+}
+
+/* --------------------------------------------------
+ * 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],line[128];
+ static infopipe_t items;
+ char *pbuf,c;
+
+ pvoid=(void*)pvoid; /* avoid 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 */
+ memset(line,0,sizeof(line));
+ if ( sscanf(pbuf,"%*[^:]: %[^\n]",line) == EOF )
+ break;
+ while((c = *pbuf++) && (c != '\n'));
+
+ switch(i) {
+ case INFOPIPE_KEY_PROTOCOL:
+ break;
+ case INFOPIPE_KEY_VERSION:
+ break;
+ case INFOPIPE_KEY_STATUS:
+ strncpy(items[INFOPIPE_STATUS],line,sizeof(items[INFOPIPE_STATUS])-1);
+ break;
+ case INFOPIPE_KEY_PLAYLIST_TUNES:
+ strncpy(items[INFOPIPE_PLAYLIST_LENGTH],line,sizeof(items[INFOPIPE_PLAYLIST_LENGTH])-1);
+ break;
+ case INFOPIPE_KEY_PLAYLIST_CURRTUNE:
+ strncpy(items[INFOPIPE_PLAYLIST_POSITION],line,sizeof(items[INFOPIPE_PLAYLIST_POSITION])-1);
+ break;
+ case INFOPIPE_KEY_USEC_POSITION:
+ snprintf(items[INFOPIPE_POSITION_SECONDS],sizeof(items[INFOPIPE_POSITION_SECONDS])-1,
+ "%d", atoi(line) / 1000);
+ break;
+ case INFOPIPE_KEY_POSITION:
+ strncpy(items[INFOPIPE_POSITION],line,sizeof(items[INFOPIPE_POSITION])-1);
+ break;
+ case INFOPIPE_KEY_USEC_TIME:
+ snprintf(items[INFOPIPE_LENGTH_SECONDS],sizeof(items[INFOPIPE_LENGTH_SECONDS])-1,
+ "%d", atoi(line) / 1000);
+ break;
+ case INFOPIPE_KEY_TIME:
+ strncpy(items[INFOPIPE_LENGTH],line,sizeof(items[INFOPIPE_LENGTH])-1);
+ break;
+ case INFOPIPE_KEY_BITRATE:
+ strncpy(items[INFOPIPE_BITRATE],line,sizeof(items[INFOPIPE_BITRATE])-1);
+ break;
+ case INFOPIPE_KEY_FREQUENCY:
+ strncpy(items[INFOPIPE_FREQUENCY],line,sizeof(items[INFOPIPE_FREQUENCY])-1);
+ break;
+ case INFOPIPE_KEY_CHANNELS:
+ strncpy(items[INFOPIPE_CHANNELS],line,sizeof(items[INFOPIPE_CHANNELS])-1);
+ break;
+ case INFOPIPE_KEY_TITLE:
+ strncpy(items[INFOPIPE_TITLE],line,sizeof(items[INFOPIPE_TITLE])-1);
+ break;
+ case INFOPIPE_KEY_FILE:
+ strncpy(items[INFOPIPE_FILENAME],line,sizeof(items[INFOPIPE_FILENAME])-1);
+ break;
+ default:
+ break;
+ }
+ }
+
+ /* -- 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(&infopipe_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
new file mode 100644
index 00000000..6731d542
--- /dev/null
+++ b/src/infopipe.h
@@ -0,0 +1,56 @@
+/* -------------------------------------------------------------------------
+ * infopipe.h: conky support for infopipe plugin
+ *
+ * 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
+ * --------------------------------------------------------------------------- */
+
+#ifndef INFOPIPE_H
+#define INFOPIPE_H
+
+enum _infopipe_items {
+ INFOPIPE_STATUS=0,
+ INFOPIPE_TITLE,
+ INFOPIPE_LENGTH,
+ INFOPIPE_LENGTH_SECONDS,
+ INFOPIPE_POSITION,
+ INFOPIPE_POSITION_SECONDS,
+ INFOPIPE_BITRATE,
+ INFOPIPE_FREQUENCY,
+ INFOPIPE_CHANNELS,
+ INFOPIPE_FILENAME,
+ INFOPIPE_PLAYLIST_LENGTH,
+ INFOPIPE_PLAYLIST_POSITION,
+};
+
+/* 12 slots for the infopipe values */
+typedef char infopipe_t[12][128];
+
+/* create a worker thread for infopipe media player status */
+int create_infopipe_thread(void);
+
+/* destroy infopipe media player worker thread */
+int destroy_infopipe_thread(void);
+
+/* Service routine for the conky main thread */
+void update_infopipe(void);
+
+/* Thread functions */
+void *infopipe_thread_func(void *);
+
+#endif
diff --git a/src/xmms.c b/src/xmms.c
deleted file mode 100644
index c992e2c6..00000000
--- a/src/xmms.c
+++ /dev/null
@@ -1,536 +0,0 @@
-/* -------------------------------------------------------------------------
- * 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
-
-#include "config.h"
-#include "conky.h"
-#include "xmms.h"
-
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS)
-#include
-#include
-#endif
-
-#if defined(INFOPIPE)
-#include
-#include
-#include
-#include
-
-#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
-
-static char *xmms_project_name[] = {
- "none",
- "xmms",
- "bmp",
- "audacious",
- "infopipe"
-};
-
-
-/* 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);
-}
-
-
-/* ------------------------------------------------------------
- * Create a worker thread for xmms-related media player status.
- *
- * Returns 0 on success, -1 on error.
- * ------------------------------------------------------------*/
-int create_xmms_thread(void)
-{
- /* Was an an available project requested? */
- if (!TEST_XMMS_PROJECT_AVAILABLE(info.xmms.project_mask, info.xmms.current_project)) {
- ERR("xmms_player '%s' not configured", xmms_project_name[info.xmms.current_project]);
- return(-1);
- }
-
- /* The project should not be PROJECT_NONE */
- if (info.xmms.current_project==PROJECT_NONE)
- return(-1);
-
- /* Is a worker is thread already running? */
- if (info.xmms.thread)
- return(-1);
-
- /* Joinable thread for xmms activity */
- pthread_attr_init(&info.xmms.thread_attr);
- pthread_attr_setdetachstate(&info.xmms.thread_attr, PTHREAD_CREATE_JOINABLE);
- /* Init mutexes */
- 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.xmms.runnable_mutex);
- info.xmms.runnable=1;
- pthread_mutex_unlock(&info.xmms.runnable_mutex);
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS)
- if (info.xmms.current_project==PROJECT_XMMS ||
- info.xmms.current_project==PROJECT_BMP ||
- info.xmms.current_project==PROJECT_AUDACIOUS) {
- if (pthread_create(&info.xmms.thread, &info.xmms.thread_attr, xmms_thread_func_dynamic, NULL))
- return(-1);
- }
-#endif
-#if defined(INFOPIPE)
- if (info.xmms.current_project==PROJECT_INFOPIPE) {
- if (pthread_create(&info.xmms.thread, &info.xmms.thread_attr, xmms_thread_func_infopipe, NULL))
- return(-1);
- }
-#endif
-
- return 0;
-}
-
-/* ------------------------------------------------
- * Destroy xmms-related media player status thread.
- *
- * Returns 0 on success, -1 on error.
- * ------------------------------------------------ */
-int destroy_xmms_thread(void)
-{
- /* Is a worker is thread running? If not, no error. */
- if (!info.xmms.thread)
- return(0);
-
- /* 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.xmms.thread_attr);
- if (pthread_join(info.xmms.thread, NULL))
- return(-1);
- /* Destroy mutexes */
- pthread_mutex_destroy(&info.xmms.item_mutex);
- pthread_mutex_destroy(&info.xmms.runnable_mutex);
-
- info.xmms.thread=(pthread_t)0;
- return 0;
-}
-
-#if defined(XMMS) || defined(BMP) || defined(AUDACIOUS)
-void check_dlerror(void)
-{
- static const char *error;
-
- if ((error = dlerror()) != NULL) {
- ERR("error grabbing function symbol");
- pthread_exit(NULL);
- }
-}
-
-/* ------------------------------------------------------------
- * Worker thread function for XMMS/BMP/Audacious data sampling.
- * ------------------------------------------------------------ */
-void *xmms_thread_func_dynamic(void *pvoid)
-{
- void *handle,*glib_v1_2_handle;
- int runnable;
- static xmms_t items;
- gint session,playpos,frames,length;
- gint rate,freq,chans;
- gchar *psong,*pfilename;
-
- /* Function pointers for the functions we load dynamically */
- void (*g_free_v1_2)(gpointer mem);
- gboolean (*xmms_remote_is_running)(gint session);
- gboolean (*xmms_remote_is_paused)(gint session);
- gboolean (*xmms_remote_is_playing)(gint session);
- gint (*xmms_remote_get_playlist_pos)(gint session);
- gchar *(*xmms_remote_get_playlist_title)(gint session, gint pos);
- gint (*xmms_remote_get_playlist_time)(gint session, gint pos);
- gint (*xmms_remote_get_output_time)(gint session);
- void (*xmms_remote_get_info)(gint session, gint *rate, gint *freq, gint *chans);
- gchar *(*xmms_remote_get_playlist_file)(gint session, gint pos);
- gint (*xmms_remote_get_playlist_length)(gint session);
-
- pvoid=(void *)pvoid; /* avoid warning */
- session=0;
- psong=NULL;
- pfilename=NULL;
- handle=NULL;
- glib_v1_2_handle=NULL;
- g_free_v1_2=NULL;
-
- /* Conky will likely be linked to libglib-2.0.so and not libglib-1.2.so.0. If conky is receiving
- * gchar * data from xmms, these strings need to be freed using g_free() from libglib-1.2.so.0.
- * This macro selects the g_free() from the correct library. */
- #define G_FREE(mem) (info.xmms.current_project==PROJECT_XMMS ? (*g_free_v1_2)(mem) : g_free(mem))
-
- switch(info.xmms.current_project) {
-
- case (PROJECT_XMMS) :
- /* make an effort to find the glib 1.2 shared lib */
- if ( ((glib_v1_2_handle = dlopen("libglib-1.2.so.0", RTLD_LAZY))==NULL) &&
- ((glib_v1_2_handle = dlopen("libglib-12.so.0", RTLD_LAZY))==NULL) &&
- ((glib_v1_2_handle = dlopen("libglib-12.so", RTLD_LAZY))==NULL) &&
- ((glib_v1_2_handle = dlopen("libglib12.so", RTLD_LAZY))==NULL) &&
- ((glib_v1_2_handle = dlopen("libglib.so", RTLD_LAZY))==NULL) )
- {
- ERR("unable to find glib 1.2 shared object lib!");
- pthread_exit(NULL);
- }
- g_free_v1_2=dlsym(glib_v1_2_handle, "g_free");
- check_dlerror();
-
- handle = dlopen("libxmms.so", RTLD_LAZY);
- if (!handle) {
- ERR("unable to open libxmms.so");
- pthread_exit(NULL);
- }
- break;
-
- case (PROJECT_BMP) :
- handle = dlopen("libbeep.so", RTLD_LAZY);
- if (!handle) {
- ERR("unable to open libbeep.so");
- pthread_exit(NULL);
- }
- break;
-
- case (PROJECT_AUDACIOUS) :
- handle = dlopen("libaudacious.so", RTLD_LAZY);
- if (!handle) {
- ERR("unable to open libaudacious.so");
- pthread_exit(NULL);
- }
- break;
-
- case (PROJECT_NONE) :
- default :
- pthread_exit(NULL);
- }
-
- /* Grab the function pointers from the library */
- xmms_remote_is_running = dlsym(handle, "xmms_remote_is_running");
- check_dlerror();
-
- xmms_remote_is_paused = dlsym(handle, "xmms_remote_is_paused");
- check_dlerror();
-
- xmms_remote_is_playing = dlsym(handle, "xmms_remote_is_playing");
- check_dlerror();
-
- xmms_remote_get_playlist_pos = dlsym(handle, "xmms_remote_get_playlist_pos");
- check_dlerror();
-
- xmms_remote_get_playlist_title = dlsym(handle, "xmms_remote_get_playlist_title");
- check_dlerror();
-
- xmms_remote_get_playlist_time = dlsym(handle, "xmms_remote_get_playlist_time");
- check_dlerror();
-
- xmms_remote_get_output_time = dlsym(handle, "xmms_remote_get_output_time");
- check_dlerror();
-
- xmms_remote_get_info = dlsym(handle, "xmms_remote_get_info");
-
- xmms_remote_get_playlist_file = dlsym(handle, "xmms_remote_get_playlist_file");
- check_dlerror();
-
- xmms_remote_get_playlist_length = dlsym(handle, "xmms_remote_get_playlist_length");
- check_dlerror();
-
- /* 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 = (*xmms_remote_get_playlist_pos)(session);
- psong = (*xmms_remote_get_playlist_title)(session, playpos);
- if (psong) {
- strncpy(items[XMMS_TITLE],psong,sizeof(items[XMMS_TITLE])-1);
- G_FREE(psong);
- psong=NULL;
- }
-
- /* 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])-1,
- "%d:%.2d", length / 60, length % 60);
-
- /* Current song length in seconds */
- snprintf(items[XMMS_LENGTH_SECONDS],sizeof(items[XMMS_LENGTH_SECONDS])-1,
- "%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])-1,
- "%d:%.2d", length / 60, length % 60);
-
- /* Current song position in seconds */
- snprintf(items[XMMS_POSITION_SECONDS],sizeof(items[XMMS_POSITION_SECONDS])-1,
- "%d", length);
-
- /* Current song bitrate */
- (*xmms_remote_get_info)(session, &rate, &freq, &chans);
- snprintf(items[XMMS_BITRATE],sizeof(items[XMMS_BITRATE])-1, "%d", rate);
-
- /* Current song frequency */
- snprintf(items[XMMS_FREQUENCY],sizeof(items[XMMS_FREQUENCY])-1, "%d", freq);
-
- /* Current song channels */
- snprintf(items[XMMS_CHANNELS],sizeof(items[XMMS_CHANNELS])-1, "%d", chans);
-
- /* Current song filename */
- pfilename = (*xmms_remote_get_playlist_file)(session,playpos);
- if (pfilename) {
- strncpy(items[XMMS_FILENAME],pfilename,sizeof(items[XMMS_FILENAME])-1);
- G_FREE(pfilename);
- pfilename=NULL;
- }
-
- /* Length of the Playlist (number of songs) */
- length = (*xmms_remote_get_playlist_length)(session);
- snprintf(items[XMMS_PLAYLIST_LENGTH],sizeof(items[XMMS_PLAYLIST_LENGTH])-1, "%d", length);
-
- /* Playlist position (index of song) */
- snprintf(items[XMMS_PLAYLIST_POSITION],sizeof(items[XMMS_PLAYLIST_POSITION])-1, "%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);
- }
-
- if (handle)
- dlclose(handle);
- if (glib_v1_2_handle)
- dlclose(glib_v1_2_handle);
-
- pthread_exit(NULL);
-}
-#endif
-
-#if defined(INFOPIPE)
-/* --------------------------------------------------
- * Worker thread function for InfoPipe data sampling.
- * -------------------------------------------------- */
-void *xmms_thread_func_infopipe(void *pvoid)
-{
- int i,rc,fd,runnable;
- fd_set readset;
- struct timeval tm;
- static char buf[2048],line[128];
- static xmms_t items;
- char *pbuf,c;
-
- pvoid=(void*)pvoid; /* avoid warning */
-
- /* 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 */
-
- 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[XMMS_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 */
- memset(line,0,sizeof(line));
- if ( sscanf(pbuf,"%*[^:]: %[^\n]",line) == EOF )
- break;
- while((c = *pbuf++) && (c != '\n'));
-
- switch(i) {
- case INFOPIPE_PROTOCOL:
- break;
- case INFOPIPE_VERSION:
- break;
- case INFOPIPE_STATUS:
- strncpy(items[XMMS_STATUS],line,sizeof(items[XMMS_STATUS])-1);
- break;
- case INFOPIPE_PLAYLIST_TUNES:
- strncpy(items[XMMS_PLAYLIST_LENGTH],line,sizeof(items[XMMS_PLAYLIST_LENGTH])-1);
- break;
- case INFOPIPE_PLAYLIST_CURRTUNE:
- strncpy(items[XMMS_PLAYLIST_POSITION],line,sizeof(items[XMMS_PLAYLIST_POSITION])-1);
- break;
- case INFOPIPE_USEC_POSITION:
- snprintf(items[XMMS_POSITION_SECONDS],sizeof(items[XMMS_POSITION_SECONDS])-1,
- "%d", atoi(line) / 1000);
- break;
- case INFOPIPE_POSITION:
- strncpy(items[XMMS_POSITION],line,sizeof(items[XMMS_POSITION])-1);
- break;
- case INFOPIPE_USEC_TIME:
- snprintf(items[XMMS_LENGTH_SECONDS],sizeof(items[XMMS_LENGTH_SECONDS])-1,
- "%d", atoi(line) / 1000);
- break;
- case INFOPIPE_TIME:
- strncpy(items[XMMS_LENGTH],line,sizeof(items[XMMS_LENGTH])-1);
- break;
- case INFOPIPE_BITRATE:
- strncpy(items[XMMS_BITRATE],line,sizeof(items[XMMS_BITRATE])-1);
- break;
- case INFOPIPE_FREQUENCY:
- strncpy(items[XMMS_FREQUENCY],line,sizeof(items[XMMS_FREQUENCY])-1);
- break;
- case INFOPIPE_CHANNELS:
- strncpy(items[XMMS_CHANNELS],line,sizeof(items[XMMS_CHANNELS])-1);
- break;
- case INFOPIPE_TITLE:
- strncpy(items[XMMS_TITLE],line,sizeof(items[XMMS_TITLE])-1);
- break;
- case INFOPIPE_FILE:
- strncpy(items[XMMS_FILENAME],line,sizeof(items[XMMS_FILENAME])-1);
- break;
- default:
- break;
- }
- }
-
- /* -- 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.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);
-}
-
-#endif