Make ALSA mixers available on Linux, and added $if_mixer_mute.
authorJérôme Plût <Jerome.Plut@normalesup.org>
Tue, 28 Apr 2009 16:56:49 +0000 (10:56 -0600)
committerBrenden Matthews <brenden@rty.ca>
Tue, 28 Apr 2009 16:56:49 +0000 (10:56 -0600)
ChangeLog
README
configure.ac.in
doc/conky.1
doc/variables.xml
src/conky.c
src/mixer.c
src/mixer.h
src/text_object.h

index adc122c..0456010 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2009-04-28
        * Various XMMS2 updates (thanks Lassi)
+       * Make ALSA mixers available on Linux, and added $if_mixer_mute (thanks
+       Jérôme)
 
 2009-04-19
        * Make it possible to place spaces in front of RSS-items as a workaround
diff --git a/README b/README
index 79fdbdf..bb022fc 100644 (file)
--- a/README
+++ b/README
@@ -1072,9 +1072,14 @@ conky(1)                                                              conky(1)
               Valid operands are: '>', '<', '>=', '<=', '==', '!='.
 
 
+       \e[1mif_mixer_mute (mixer)\e[0m
+              If mixer exists, display everything between  $if_mixer_mute  and
+              the matching $endif. If no mixer is specified, "Master" is used.
+
+
        \e[1mif_running (process)\e[0m
-              if PROCESS is running, display everything  $if_running  and  the
-              matching  $endif.  This  uses  the  ``pidof'' command, so the -x
+              if  PROCESS  is  running, display everything $if_running and the
+              matching $endif. This uses the  ``pidof''  command,  so  the  -x
               switch is also supported.
 
 
@@ -1084,8 +1089,8 @@ conky(1)                                                              conky(1)
 
 
        \e[1mif_smapi_bat_installed (INDEX)\e[0m
-              when  using smapi, if the battery with index INDEX is installed,
-              display  everything  between  $if_smapi_bat_installed  and   the
+              when using smapi, if the battery with index INDEX is  installed,
+              display   everything  between  $if_smapi_bat_installed  and  the
               matching $endif
 
 
@@ -1095,17 +1100,17 @@ conky(1)                                                              conky(1)
 
 
        \e[1mif_updatenr (updatenr)\e[0m
-              If it's the UPDATENR-th time that conky updates, display  every‐
+              If  it's the UPDATENR-th time that conky updates, display every‐
               thing between $if_updatenr and the matching $endif.  The counter
-              resets  when  the  highest  UPDATENR  is  reached.   Example   :
+              resets   when  the  highest  UPDATENR  is  reached.   Example  :
               "{$if_updatenr 1}foo$endif{$if_updatenr 2}bar$endif{$if_updatenr
-              4}$endif" shows foo 25% of the time followed by bar 25%  of  the
+              4}$endif"  shows  foo 25% of the time followed by bar 25% of the
               time followed by nothing the other half of the time.
 
 
        \e[1mimap_messages (args)\e[0m
               Displays the number of messages in your global IMAP inbox by de‐
-              fault. You can define  individual  IMAP  inboxes  seperately  by
+              fault.  You  can  define  individual  IMAP inboxes seperately by
               passing arguments to this object. Arguments are: "host user pass
               [-i interval] [-p port] [-e command] [-r retries]". Default port
               is 143, default interval is 5 minutes, and default number of re‐
@@ -1124,7 +1129,7 @@ conky(1)                                                              conky(1)
 
 
        \e[1mioscheduler disk\e[0m
-              Prints  the  current  ioscheduler  used  for the given disk name
+              Prints the current ioscheduler used  for  the  given  disk  name
               (i.e. e.g. "hda" or "sdb")
 
 
@@ -1142,8 +1147,8 @@ conky(1)                                                              conky(1)
 
        \e[1mloadgraph ("normal"|"log") (height),(width) (gradient colour 1) (gradi‐\e[0m
        \e[1ment colour 2) (scale)\e[0m
-              Load1 average graph, similar to xload, with optional colours  in
-              hex,  minus  the  #. Uses a logarithmic scale (to see small num‐
+              Load1  average graph, similar to xload, with optional colours in
+              hex, minus the #. Uses a logarithmic scale (to  see  small  num‐
               bers) when you use "log" instead of "normal".
 
 
@@ -1156,9 +1161,9 @@ conky(1)                                                              conky(1)
 
 
        \e[1mmails (mailbox) (interval)\e[0m
-              Mail count in the specified mailbox or your mail spool  if  not.
-              Both  mbox and maildir type mailboxes are supported. You can use
-              a program like fetchmail to get mails  from  some  server  using
+              Mail  count  in the specified mailbox or your mail spool if not.
+              Both mbox and maildir type mailboxes are supported. You can  use
+              a  program  like  fetchmail  to get mails from some server using
               your favourite protocol. See also new_mails.
 
 
@@ -1168,32 +1173,32 @@ conky(1)                                                              conky(1)
 
 
        \e[1mseen_mails (maildir) (interval)\e[0m
-              Number of mails marked as seen in the specified mailbox or  mail
-              spool  if  not.  Only maildir type mailboxes are supported, mbox
+              Number  of mails marked as seen in the specified mailbox or mail
+              spool if not. Only maildir type mailboxes  are  supported,  mbox
               type will return -1.
 
 
        \e[1munseen_mails (maildir) (interval)\e[0m
-              Number of new or unseen mails in the specified mailbox  or  mail
-              spool  if  not.  Only maildir type mailboxes are supported, mbox
+              Number  of  new or unseen mails in the specified mailbox or mail
+              spool if not. Only maildir type mailboxes  are  supported,  mbox
               type will return -1.
 
 
        \e[1mflagged_mails (maildir) (interval)\e[0m
-              Number of mails marked as flagged in the  specified  mailbox  or
-              mail  spool  if  not. Only maildir type mailboxes are supported,
+              Number  of  mails  marked as flagged in the specified mailbox or
+              mail spool if not. Only maildir type  mailboxes  are  supported,
               mbox type will return -1.
 
 
        \e[1munflagged_mails (maildir) (interval)\e[0m
-              Number of mails not marked as flagged in the  specified  mailbox
+              Number  of  mails not marked as flagged in the specified mailbox
               or mail spool if not. Only maildir type mailboxes are supported,
               mbox type will return -1.
 
 
        \e[1mforwarded_mails (maildir) (interval)\e[0m
-              Number of mails marked as forwarded in the specified mailbox  or
-              mail  spool  if  not. Only maildir type mailboxes are supported,
+              Number  of mails marked as forwarded in the specified mailbox or
+              mail spool if not. Only maildir type  mailboxes  are  supported,
               mbox type will return -1.
 
 
@@ -1204,33 +1209,33 @@ conky(1)                                                              conky(1)
 
 
        \e[1mreplied_mails (maildir) (interval)\e[0m
-              Number of mails marked as replied in the  specified  mailbox  or
-              mail  spool  if  not. Only maildir type mailboxes are supported,
+              Number  of  mails  marked as replied in the specified mailbox or
+              mail spool if not. Only maildir type  mailboxes  are  supported,
               mbox type will return -1.
 
 
        \e[1munreplied_mails (maildir) (interval)\e[0m
-              Number of mails not marked as replied in the  specified  mailbox
+              Number  of  mails not marked as replied in the specified mailbox
               or mail spool if not. Only maildir type mailboxes are supported,
               mbox type will return -1.
 
 
        \e[1mdraft_mails (maildir) (interval)\e[0m
               Number of mails marked as draft in the specified mailbox or mail
-              spool  if  not.  Only maildir type mailboxes are supported, mbox
+              spool if not. Only maildir type mailboxes  are  supported,  mbox
               type will return -1.
 
 
        \e[1mtrashed_mails (maildir) (interval)\e[0m
-              Number of mails marked as trashed in the  specified  mailbox  or
-              mail  spool  if  not. Only maildir type mailboxes are supported,
+              Number  of  mails  marked as trashed in the specified mailbox or
+              mail spool if not. Only maildir type  mailboxes  are  supported,
               mbox type will return -1.
 
 
        \e[1mmboxscan (-n number of messages to print) (-fw from width) (-sw subject\e[0m
        \e[1mwidth) mbox\e[0m
-              Print  a  summary  of recent messages in an mbox format mailbox.
-              mbox parameter is the filename of the mailbox (can  be  encapsu‐
+              Print a summary of recent messages in an  mbox  format  mailbox.
+              mbox  parameter  is the filename of the mailbox (can be encapsu‐
               lated using '"', ie. ${mboxscan -n 10 "/home/brenden/some box"}
 
 
@@ -1245,14 +1250,14 @@ conky(1)                                                              conky(1)
               Gauge that shows amount of memory in use (see cpugauge)
 
 
-       \e[1mmemgraph  ("normal"|"log") (height),(width) (gradient colour 1) (gradi‐\e[0m
+       \e[1mmemgraph ("normal"|"log") (height),(width) (gradient colour 1)  (gradi‐\e[0m
        \e[1ment colour 2) (scale)\e[0m
-              Memory usage graph. Uses a logarithmic scale (to see small  num‐
+              Memory  usage graph. Uses a logarithmic scale (to see small num‐
               bers) when you use "log" instead of "normal".
 
 
        \e[1mmemeasyfree\e[0m
-              Amount  of  free memory including the memory that is very easily
+              Amount of free memory including the memory that is  very  easily
               freed (buffers/cache)
 
 
@@ -1268,39 +1273,39 @@ conky(1)                                                              conky(1)
 
 
        \e[1mmixer (device)\e[0m
-              Prints the mixer value as reported by the OS. Default  mixer  is
-              "vol",  but  you can specify one of the following optional argu‐
+              Prints  the  mixer value as reported by the OS. Default mixer is
+              "vol", but you can specify one of the following  optional  argu‐
               ments:  "vol",  "bass",  "treble",  "synth",  "pcm",  "speaker",
-              "line",  "mic",  "cd",  "mix",  "pcm2", "rec", "igain", "ogain",
+              "line", "mic", "cd", "mix",  "pcm2",  "rec",  "igain",  "ogain",
               "line1",  "line2",  "line3",  "dig1",  "dig2",  "dig3",  "phin",
               "phout", "video", "radio", "monitor". Refer to the definition of
-              SOUND_DEVICE_NAMES in <linux/soundcard.h>  (on  Linux),  <sound‐
+              SOUND_DEVICE_NAMES  in  <linux/soundcard.h>  (on Linux), <sound‐
               card.h> (on OpenBSD), or <sys/soundcard.h> to find the exact op‐
               tions available on your system.
 
 
        \e[1mmixerbar (device)\e[0m
-              Displays mixer value in a bar as reported by the  OS.  See  docs
+              Displays  mixer  value  in a bar as reported by the OS. See docs
               for $mixer for details on arguments.
 
 
        \e[1mmixerr (device)\e[0m
-              Prints  the right channel mixer value as reported by the OS. See
+              Prints the right channel mixer value as reported by the OS.  See
               docs for $mixer for details on arguments.
 
 
        \e[1mmixerrbar (device)\e[0m
-              Displays the right channel mixer value in a bar as  reported  by
+              Displays  the  right channel mixer value in a bar as reported by
               the OS. See docs for $mixer for details on arguments.
 
 
        \e[1mmixerl (device)\e[0m
-              Prints  the  left channel mixer value as reported by the OS. See
+              Prints the left channel mixer value as reported by the  OS.  See
               docs for $mixer for details on arguments.
 
 
        \e[1mmixerlbar (device)\e[0m
-              Displays the left channel mixer value in a bar  as  reported  by
+              Displays  the  left  channel mixer value in a bar as reported by
               the OS. See docs for $mixer for details on arguments.
 
 
@@ -1422,12 +1427,12 @@ conky(1)                                                              conky(1)
 
 
        \e[1mif_mpd_playing\e[0m
-              if  mpd  is  playing  or  paused,  display  everything   between
+              if   mpd  is  playing  or  paused,  display  everything  between
               $if_mpd_playing and the matching $endif
 
 
        \e[1mnameserver (index)\e[0m
-              Print  a  nameserver  from /etc/resolv.conf. Index starts at and
+              Print a nameserver from /etc/resolv.conf. Index  starts  at  and
               defaults to 0.
 
 
@@ -1436,8 +1441,8 @@ conky(1)                                                              conky(1)
 
 
        \e[1mnvidia threshold temp ambient gpufreq memfreq imagequality\e[0m
-              Nvidia graficcard support for the XNVCtrl library.  Each  option
-              can  be  shortened  to the least significant part.  Temperatures
+              Nvidia  graficcard support for the XNVCtrl library.  Each option
+              can be shortened to the least  significant  part.   Temperatures
               are printed as float, all other values as integer.
 
               \e[1mthreshold\e[22m: the thresholdtemperature at which the gpu slows down
@@ -1455,25 +1460,25 @@ conky(1)                                                              conky(1)
 
        \e[1mpb_battery item\e[0m
               If running on Apple powerbook/ibook, display information on bat‐
-              tery status. The item parameter specifies, what  information  to
+              tery  status.  The item parameter specifies, what information to
               display. Exactly one item must be specified. Valid items are:
 
               \e[1mstatus\e[22m: Display if battery is fully charged, charging, discharg‐
               ing or absent (running on AC)
-              \e[1mpercent\e[22m: Display charge of battery in percent,  if  charging  or
-              discharging.  Nothing  will  be  displayed,  if battery is fully
+              \e[1mpercent\e[22m:  Display  charge  of battery in percent, if charging or
+              discharging. Nothing will be  displayed,  if  battery  is  fully
               charged or absent.
               \e[1mtime\e[22m: Display the time remaining until the battery will be fully
-              charged  or discharged at current rate. Nothing is displayed, if
-              battery is absent or if it's present but fully charged  and  not
+              charged or discharged at current rate. Nothing is displayed,  if
+              battery  is  absent or if it's present but fully charged and not
               discharging.
 
 
        \e[1mplatform (dev) type n\e[0m
-              Platform  sensor  from  sysfs  (Linux 2.6). Parameter dev may be
-              omitted if you have only one platform device. Platform  type  is
-              either  'in' or 'vol' meaning voltage; 'fan' meaning fan; 'temp'
-              meaning temperature. Parameter n is number of  the  sensor.  See
+              Platform sensor from sysfs (Linux 2.6).  Parameter  dev  may  be
+              omitted  if  you have only one platform device. Platform type is
+              either 'in' or 'vol' meaning voltage; 'fan' meaning fan;  'temp'
+              meaning  temperature.  Parameter  n is number of the sensor. See
               /sys/bus/platform/devices/ on your local computer.
 
 
@@ -1488,13 +1493,13 @@ conky(1)                                                              conky(1)
 
 
        \e[1mpop3_used (args)\e[0m
-              Displays  the amount of space (in MiB, 2^20) used in your global
-              POP3 inbox by default. You can define  individual  POP3  inboxes
-              seperately  by  passing arguments to this object. Arguments are:
-              "host user pass [-i interval] [-p port]  [-e  command]  [-r  re‐
+              Displays the amount of space (in MiB, 2^20) used in your  global
+              POP3  inbox  by  default. You can define individual POP3 inboxes
+              seperately by passing arguments to this object.  Arguments  are:
+              "host  user  pass  [-i  interval] [-p port] [-e command] [-r re‐
               tries]". Default port is 110, default interval is 5 minutes, and
               default number of retries before giving up is 5. If the password
-              is  supplied  as '*', you will be prompted to enter the password
+              is supplied as '*', you will be prompted to enter  the  password
               when Conky starts.
 
 
@@ -1512,14 +1517,14 @@ conky(1)                                                              conky(1)
 
 
        \e[1mscroll length (step) text\e[0m
-              Scroll  'text'  by  'step' characters showing 'length' number of
-              characters at the same time. The text  may  also  contain  vari‐
+              Scroll 'text' by 'step' characters showing  'length'  number  of
+              characters  at  the  same  time. The text may also contain vari‐
               ables. 'step' is optional and defaults to 1 if not set. If a var
-              creates output on multiple lines then the lines are  placed  be‐
-              hind  each other separated with a '|'-sign. Do NOT use vars that
-              change colors or otherwise affect the design inside a  scrolling
-              text.  If  you  want  spaces  between  the  start and the end of
-              'text', place them at the end of 'text' not at the front  ("foo‐
+              creates  output  on multiple lines then the lines are placed be‐
+              hind each other separated with a '|'-sign. Do NOT use vars  that
+              change  colors or otherwise affect the design inside a scrolling
+              text. If you want spaces  between  the  start  and  the  end  of
+              'text',  place them at the end of 'text' not at the front ("foo‐
               bar" and " foobar" can both generate "barfoo" but "foobar " will
               keep the spaces like this "bar foo").
 
@@ -1529,35 +1534,35 @@ conky(1)                                                              conky(1)
 
 
        \e[1msmapi (ARGS)\e[0m
-              when using smapi, display  contents  of  the  /sys/devices/plat‐
-              form/smapi  directory. ARGS are either '(FILENAME)' or 'bat (IN‐
-              DEX) (FILENAME)' to display the  corresponding  files'  content.
-              This  is  a  very raw method of accessing the smapi values. When
+              when  using  smapi,  display  contents of the /sys/devices/plat‐
+              form/smapi directory. ARGS are either '(FILENAME)' or 'bat  (IN‐
+              DEX)  (FILENAME)'  to  display the corresponding files' content.
+              This is a very raw method of accessing the  smapi  values.  When
               available, better use one of the smapi_* variables instead.
 
 
        \e[1msmapi_bat_bar (INDEX),(height),(width)\e[0m
-              when using smapi, display the remaining capacity of the  battery
+              when  using smapi, display the remaining capacity of the battery
               with index INDEX as a bar.
 
 
        \e[1msmapi_bat_perc (INDEX)\e[0m
-              when  using  smapi, display the remaining capacity in percent of
-              the battery with index INDEX. This is a  separate  variable  be‐
+              when using smapi, display the remaining capacity in  percent  of
+              the  battery  with  index INDEX. This is a separate variable be‐
               cause it supports the 'use_spacer' configuration option.
 
 
        \e[1msmapi_bat_power INDEX\e[0m
-              when  using smapi, display the current power of the battery with
-              index INDEX in watt. This is a  separate  variable  because  the
-              original  read out value is being converted from mW. The sign of
-              the output reflects charging (positive)  or  discharging  (nega‐
+              when using smapi, display the current power of the battery  with
+              index  INDEX  in  watt.  This is a separate variable because the
+              original read out value is being converted from mW. The sign  of
+              the  output  reflects  charging (positive) or discharging (nega‐
               tive) state.
 
 
        \e[1msmapi_bat_temp INDEX\e[0m
               when using smapi, display the current temperature of the battery
-              with index INDEX in degree Celsius. This is a separate  variable
+              with  index INDEX in degree Celsius. This is a separate variable
               because the original read out value is being converted from mil‐
               li degree Celsius.
 
@@ -1602,36 +1607,36 @@ conky(1)                                                              conky(1)
               The connection index provides you with access to each connection
               in the port monitor. The monitor will return information for in‐
               dex values from 0 to n-1 connections. Values higher than n-1 are
-              simply ignored. For the "count" item, the connection index  must
+              simply  ignored. For the "count" item, the connection index must
               be omitted. It is required for all other items.
 
               Examples:
-              \e[1m${tcp_portmon  6881 6999 count} \e[22m- displays the number of connec‐
+              \e[1m${tcp_portmon 6881 6999 count} \e[22m- displays the number of  connec‐
               tions in the bittorrent port range
-              \e[1m${tcp_portmon 22 22 rip 0} \e[22m- displays the remote host ip of  the
+              \e[1m${tcp_portmon  22 22 rip 0} \e[22m- displays the remote host ip of the
               first sshd connection
-              \e[1m${tcp_portmon  22 22 rip 9} \e[22m- displays the remote host ip of the
+              \e[1m${tcp_portmon 22 22 rip 9} \e[22m- displays the remote host ip of  the
               tenth sshd connection
               \e[1m${tcp_portmon 1 1024 rhost 0} \e[22m- displays the remote host name of
               the first connection on a privileged port
               \e[1m${tcp_portmon 1 1024 rport 4} \e[22m- displays the remote host port of
               the fifth connection on a privileged port
-              \e[1m${tcp_portmon 1 65535 lservice 14} \e[22m- displays the local  service
+              \e[1m${tcp_portmon  1 65535 lservice 14} \e[22m- displays the local service
               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‐
               gle port range for different items and different indexes all use
-              the same monitor internally. In other words, the program  avoids
+              the  same monitor internally. In other words, the program avoids
               creating redundant monitors.
 
        \e[1mtexeci interval command\e[0m
-              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‐
-              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  in‐
+              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‐
+              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 in‐
               terval at least 6 seconds. See also $execi.
 
 
@@ -1639,10 +1644,11 @@ conky(1)                                                              conky(1)
               Move text over by N pixels. See also $voffset.
 
 
-       \e[1mrss url delay_in_minutes action item_num\e[0m
-              Download  and  parse RSS feeds. Action may be one of the follow‐
-              ing: feed_title, item_title (with num par), item_desc (with  num
-              par) and item_titles.
+       \e[1mrss url delay_in_minutes action (num_par (spaces_in_front))\e[0m
+              Download and parse RSS feeds. Action may be one of  the  follow‐
+              ing:  feed_title, item_title (with num par), item_desc (with num
+              par) and item_titles (when using this action and spaces_in_front
+              is given conky places that many spaces in front of each item).
 
 
        \e[1mtab (width, (start))\e[0m
index dcd4cb5..b55dd02 100644 (file)
@@ -547,10 +547,27 @@ if test x$WANT_OSSLIB = xyes; then
 fi
 
 dnl
+dnl ALSA for Linux
+dnl
+AC_ARG_ENABLE([alsa],
+              AC_HELP_STRING([--disable-alsa], [disable if you do not
+  want ALSA support @<:@default=yes@:>@]),
+              [want_alsa="$enableval"], [want_alsa=yes])
+
+if test x$want_alsa = xyes; then
+    AC_CHECK_HEADER(alsa/asoundlib.h,, want_alsa=no)
+fi
+if test x$want_alsa = xyes; then
+    AC_CHECK_LIB(asound, snd_pcm_open,LIBS="$LIBS -lasound", want_alsa=no)
+fi
+if test x$want_alsa = xyes; then
+AC_DEFINE(MIXER_IS_ALSA, 1, [Define if the mixers use ALSA])
+fi
+dnl
 dnl Some headers
 dnl
 
-AC_CHECK_HEADERS([signal.h unistd.h sys/utsname.h sys/stat.h linux/soundcard.h dirent.h mcheck.h \
+AC_CHECK_HEADERS([signal.h unistd.h sys/utsname.h sys/stat.h linux/soundcard.h alsa/asoundlib.h dirent.h mcheck.h \
       sys/statfs.h sys/param.h pthread.h assert.h errno.h time.h])
 AC_CHECK_HEADERS([sys/mount.h], [], [],
      [#ifdef HAVE_SYS_PARAM_H
@@ -733,4 +750,5 @@ $PACKAGE $VERSION configured successfully:
   nvidia:           $want_nvidia
   eve-online:       $want_eve
   config-output:    $want_config_output
+  ALSA mixer:       $want_alsa
 EOF
index 870cb60..958619e 100644 (file)
@@ -920,6 +920,11 @@ Valid operands are:
 \&'>', '<', '>=', '<=', '==', '!='.
 
 .TP 
+\fB\*(T<\fBif_mixer_mute\fR\*(T>\fR \*(T<\fB(mixer)\fR\*(T> 
+If mixer exists, display everything between $if_mixer_mute and the
+matching $endif. If no mixer is specified, "Master" is used.
+
+.TP 
 \fB\*(T<\fBif_running\fR\*(T>\fR \*(T<\fB(process)\fR\*(T> 
 if PROCESS is running, display everything $if_running
 and the matching $endif. This uses the ``pidof'' command, so the
index f5d5ab9..c7dea16 100644 (file)
 
        <varlistentry>
                <term>
+                       <command><option>if_mixer_mute</option></command>
+                       <option>(mixer)</option>
+               </term>
+               <listitem>
+                       If mixer exists, display everything between $if_mixer_mute and the
+                       matching $endif.  If no mixer is specified, "Master" is used.
+                       <para></para></listitem>
+       </varlistentry>
+
+       <varlistentry>
+               <term>
                        <command><option>if_running</option></command>
                        <option>(process)</option>
                </term>
index a4f156f..4f46364 100644 (file)
@@ -210,6 +210,9 @@ static void print_version(void)
 #ifdef CONFIG_OUTPUT
                   "  * config-output\n"
 #endif /* CONFIG_OUTPUT */
+#ifdef MIXER_IS_ALSA
+                  "  * ALSA mixer support\n"
+#endif /* MIXER_IS_ALSA */
        );
 
        exit(0);
@@ -2099,6 +2102,8 @@ static struct text_object *construct_text_object(const char *s,
        END OBJ(mixerrbar, INFO_MIXER)
                scan_mixer_bar(arg, &obj->data.mixerbar.l, &obj->data.mixerbar.w,
                        &obj->data.mixerbar.h);
+       END OBJ_IF(if_mixer_mute, INFO_MIXER)
+               obj->data.ifblock.i = mixer_init(arg);
 #ifdef X11
        END OBJ(monitor, INFO_X11)
        END OBJ(monitor_number, INFO_X11)
@@ -4128,15 +4133,20 @@ static void generate_text_internal(char *p, int p_max_size,
                        }
                        OBJ(mixerbar) {
                                new_bar(p, obj->data.mixerbar.w, obj->data.mixerbar.h,
-                                       mixer_get_avg(obj->data.mixerbar.l) * 255 / 100);
+                                       mixer_to_255(obj->data.mixerbar.l,mixer_get_avg(obj->data.mixerbar.l)));
                        }
                        OBJ(mixerlbar) {
                                new_bar(p, obj->data.mixerbar.w, obj->data.mixerbar.h,
-                                       mixer_get_left(obj->data.mixerbar.l) * 255 / 100);
+                                       mixer_to_255(obj->data.mixerbar.l,mixer_get_left(obj->data.mixerbar.l)));
                        }
                        OBJ(mixerrbar) {
                                new_bar(p, obj->data.mixerbar.w, obj->data.mixerbar.h,
-                                       mixer_get_right(obj->data.mixerbar.l) * 255 / 100);
+                                       mixer_to_255(obj->data.mixerbar.l,mixer_get_right(obj->data.mixerbar.l)));
+                       }
+                       OBJ(if_mixer_mute) {
+                               if (!mixer_is_mute(obj->data.ifblock.i)) {
+                                       DO_JUMP;
+                               }
                        }
 #ifdef X11
                        OBJ(monitor) {
index 328fa7d..974081a 100644 (file)
 #include <sys/ioctl.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <ctype.h>
 
 
+#ifdef MIXER_IS_ALSA
+#include <alsa/asoundlib.h>
+#else
 #ifdef HAVE_LINUX_SOUNDCARD_H
 #include <linux/soundcard.h>
 #else
 #include <sys/soundcard.h>
 #endif /* __OpenBSD__ */
 #endif /* HAVE_LINUX_SOUNDCARD_H */
+#endif /* MIXER_IS_ALSA */
 
 #define MIXER_DEV "/dev/mixer"
 
+#ifdef MIXER_IS_ALSA
+#define MAX_MIXERS 8
+struct mixer_control {
+       char name[64];
+       snd_mixer_t *mixer;
+       snd_mixer_selem_id_t *sid;
+       snd_mixer_elem_t *elem;
+       long vol_min, vol_max;
+};
+
+static struct mixer_control mixer_data[MAX_MIXERS];
+int num_mixers = 0;
+static char soundcard[64] = "default";
+#else
 static int mixer_fd;
 static const char *devs[] = SOUND_DEVICE_NAMES;
+#endif
+
+#ifdef MIXER_IS_ALSA
+static int parse_simple_id(const char *str, snd_mixer_selem_id_t *sid)
+{
+       int c, size;
+       char buf[128];
+       char *ptr = buf;
+
+       while (*str == ' ' || *str == '\t')
+               str++;
+       if (!(*str))
+               return -EINVAL;
+       size = 1;       /* for '\0' */
+       if (*str != '"' && *str != '\'') {
+               while (*str && *str != ',') {
+                       if (size < (int)sizeof(buf)) {
+                               *ptr++ = *str;
+                               size++;
+                       }
+                       str++;
+               }
+       } else {
+               c = *str++;
+               while (*str && *str != c) {
+                       if (size < (int)sizeof(buf)) {
+                               *ptr++ = *str;
+                               size++;
+                       }
+                       str++;
+               }
+               if (*str == c)
+                       str++;
+       }
+       if (*str == '\0') {
+               snd_mixer_selem_id_set_index(sid, 0);
+               *ptr = 0;
+               goto _set;
+       }
+       if (*str != ',')
+               return -EINVAL;
+       *ptr = 0;       /* terminate the string */
+       str++;
+       if (!isdigit(*str))
+               return -EINVAL;
+       snd_mixer_selem_id_set_index(sid, atoi(str));
+       _set:
+       snd_mixer_selem_id_set_name(sid, buf);
+       return 0;
+}
 
+int mixer_init (const char *name)
+{
+       /* from amixer.c, replaced -EINVAL with -1 */
+       int i, err;
+       if (!name)
+               name = "Master";
+
+       for (i = 0; i < num_mixers; i++) {
+               if (!strcasecmp (mixer_data[i].name, name)) {
+                       return i;
+               }
+       }
+       if (i == MAX_MIXERS) {
+               fprintf (stderr, "max mixers (%d) reached\n", MAX_MIXERS);
+               return -1;
+       };
+
+       num_mixers++;
+#define data mixer_data[i]
+
+       strncpy (mixer_data[i].name, name, 63);
+       mixer_data[i].name[63] = '\0';
+       snd_mixer_selem_id_alloca (&data.sid);
+       data.mixer = NULL;
+       if (parse_simple_id (name, data.sid) < 0) {
+               fprintf (stderr, "Wrong mixer identifier: %s\n", name);
+               return -1;
+       }
+       if ((err = snd_mixer_open (&data.mixer, 0)) < 0) {
+               fprintf (stderr, "snd_mixer_open: %s\n", snd_strerror (err));
+               return -1;
+       }
+       if ((err = snd_mixer_attach (data.mixer, soundcard)) < 0) {
+               fprintf (stderr, "snd_mixer_attach: %s\n", snd_strerror (err));
+               return -1;
+       }
+       if ((err = snd_mixer_selem_register (data.mixer, NULL, NULL)) < 0) {
+               fprintf (stderr, "snd_mixer_selem_register: %s\n",
+                        snd_strerror (err));
+               return -1;
+       }
+       if ((err = snd_mixer_load (data.mixer)) < 0) {
+               fprintf (stderr, "snd_mixer_load: %s\n", snd_strerror (err));
+               return -1;
+       }
+       if (!(data.elem = snd_mixer_find_selem (data.mixer, data.sid))) {
+               fprintf (stderr, "snd_mixer_find_selem (\"%s\", %i)\n",
+                        snd_mixer_selem_id_get_name (data.sid),
+                        snd_mixer_selem_id_get_index (data.sid));
+               return -1;
+       }
+       snd_mixer_selem_get_playback_volume_range(data.elem, &data.vol_min, &data.vol_max);
+       return i;
+}
+int mixer_get_avg (int i)
+{
+  long val;
+
+  snd_mixer_handle_events (data.mixer);
+  snd_mixer_selem_get_playback_volume (data.elem, 0, &val);
+  return (int) val;
+}
+int mixer_get_left (int i)
+{
+  /* stub */
+  return mixer_get_avg (i);
+}
+int mixer_get_right (int i)
+{
+  /* stub */
+  return mixer_get_avg (i);
+}
+int mixer_to_255(int i, int x)
+{
+  return (x-data.vol_min)*255/(data.vol_max-data.vol_min);
+}
+int mixer_is_mute(int i)
+{
+       snd_mixer_handle_events (data.mixer);
+       if (snd_mixer_selem_has_playback_switch (data.elem)) {
+               int val, err;
+               if ((err = snd_mixer_selem_get_playback_switch(data.elem, 0, &val)) < 0)
+                       fprintf (stderr, "playback_switch: %s\n", snd_strerror (err));
+               return !val;
+       } else {
+               return !mixer_get_avg(i);
+       }
+}
+#undef data
+
+#else
 int mixer_init(const char *name)
 {
        unsigned int i;
@@ -106,3 +266,8 @@ int mixer_get_right(int i)
 {
        return mixer_get(i) & 0xFF;
 }
+int mixer_is_mute(int i)
+{
+       return !mixer_get(i);
+}
+#endif
index 06c62bb..568f911 100644 (file)
@@ -1,9 +1,17 @@
 #ifndef MIXER_H_
 #define MIXER_H_
 
+
+#ifdef MIXER_IS_ALSA
+int mixer_to_255(int, int);
+#else
+#define mixer_to_255(l,x) x
+#endif
+
 int mixer_init(const char *);
 int mixer_get_avg(int);
 int mixer_get_left(int);
 int mixer_get_right(int);
+int mixer_is_mute(int);
 
 #endif /*MIXER_H_*/
index e36b31c..43dadf4 100644 (file)
@@ -213,6 +213,7 @@ enum text_object_type {
        OBJ_mixerbar,
        OBJ_mixerlbar,
        OBJ_mixerrbar,
+       OBJ_if_mixer_mute,
 #ifdef X11
        OBJ_monitor,
        OBJ_monitor_number,