X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fmixer.c;h=17a71694e776744c4c9e830d9dc779a79be6a269;hb=3293e076c500eef4ca11a72bfb6954412c341228;hp=fbcfbbd58a3d5be96d9cc262717e223e59face75;hpb=7ea81e19134a7f8ec8777d2f96607d1c4a7f7fc2;p=monky diff --git a/src/mixer.c b/src/mixer.c index fbcfbbd..17a7169 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -1,4 +1,7 @@ -/* Conky, a system monitor, based on torsmo +/* -*- mode: c; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: t -*- + * vim: ts=4 sw=4 noet ai cindent syntax=c + * + * Conky, a system monitor, based on torsmo * * Any original torsmo code is licensed under the BSD license * @@ -7,7 +10,7 @@ * Please see COPYING for details * * Copyright (c) 2004, Hannu Saransaari and Lauri Hakkarainen - * Copyright (c) 2005-2008 Brenden Matthews, Philip Kovacs, et. al. + * Copyright (c) 2005-2010 Brenden Matthews, Philip Kovacs, et. al. * (see AUTHORS) * All rights reserved. * @@ -23,12 +26,16 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * - * $Id$ */ + */ #include "conky.h" +#include "logging.h" +#include "specials.h" +#include "text_object.h" #include #include #include +#include #ifdef HAVE_LINUX_SOUNDCARD_H @@ -58,14 +65,13 @@ int mixer_init(const char *name) if (mixer_fd <= 0) { mixer_fd = open(MIXER_DEV, O_RDONLY); if (mixer_fd == -1) { - ERR("can't open %s: %s", MIXER_DEV, strerror(errno)); + NORM_ERR("can't open %s: %s", MIXER_DEV, strerror(errno)); return -1; } } for (i = 0; i < sizeof(devs) / sizeof(const char *); i++) { if (strcasecmp(devs[i], name) == 0) { - printf("dicks @ %i\n", i); return i; } } @@ -80,7 +86,7 @@ static int mixer_get(int i) if (ioctl(mixer_fd, MIXER_READ(i), &val) == -1) { if (!rep) { - ERR("mixer ioctl: %s", strerror(errno)); + NORM_ERR("mixer ioctl: %s", strerror(errno)); } rep = 1; return 0; @@ -90,19 +96,118 @@ static int mixer_get(int i) return val; } -int mixer_get_avg(int i) +static int mixer_get_avg(int i) { int v = mixer_get(i); return ((v >> 8) + (v & 0xFF)) / 2; } -int mixer_get_left(int i) +static int mixer_get_left(int i) { return mixer_get(i) >> 8; } -int mixer_get_right(int i) +static int mixer_get_right(int i) { return mixer_get(i) & 0xFF; } +int mixer_is_mute(int i) +{ + return !mixer_get(i); +} + +#define mixer_to_255(i, x) x * 2.55 + +void parse_mixer_arg(struct text_object *obj, const char *arg) +{ + obj->data.l = mixer_init(arg); +} + +/* chan specifies the channel to print: + * -1 := left channel + * 0 := channel average + * 1 := right channel + */ +static void print_mixer_chan(struct text_object *obj, int chan, char *p, int p_max_size) +{ + int val; + + if (chan < 0) + val = mixer_get_left(obj->data.l); + else if (chan == 0) + val = mixer_get_avg(obj->data.l); + else + val = mixer_get_right(obj->data.l); + + percent_print(p, p_max_size, val); +} + +void print_mixer(struct text_object *obj, char *p, int p_max_size) +{ + print_mixer_chan(obj, 0, p, p_max_size); +} + +void print_mixerl(struct text_object *obj, char *p, int p_max_size) +{ + print_mixer_chan(obj, -1, p, p_max_size); +} + +void print_mixerr(struct text_object *obj, char *p, int p_max_size) +{ + print_mixer_chan(obj, 1, p, p_max_size); +} + +int check_mixer_muted(struct text_object *obj) +{ + if (!mixer_is_mute(obj->data.l)) + return 0; + return 1; +} + +void scan_mixer_bar(struct text_object *obj, const char *arg) +{ + char buf1[64]; + int n; + + if (arg && sscanf(arg, "%63s %n", buf1, &n) >= 1) { + obj->data.i = mixer_init(buf1); + scan_bar(obj, arg + n); + } else { + obj->data.i = mixer_init(NULL); + scan_bar(obj, arg); + } +} + +/* see print_mixer() above for a description of 'chan' */ +static void print_mixer_bar_chan(struct text_object *obj, int chan, char *p, int p_max_size) +{ + int val; + + if (!p_max_size) + return; + + if (chan < 0) + val = mixer_get_left(obj->data.i); + else if (chan == 0) + val = mixer_get_avg(obj->data.i); + else + val = mixer_get_right(obj->data.i); + + new_bar(obj, p, p_max_size, mixer_to_255(obj->data.i, val)); +} + +void print_mixer_bar(struct text_object *obj, char *p, int p_max_size) +{ + print_mixer_bar_chan(obj, 0, p, p_max_size); +} + +void print_mixerl_bar(struct text_object *obj, char *p, int p_max_size) +{ + print_mixer_bar_chan(obj, -1, p, p_max_size); +} + +void print_mixerr_bar(struct text_object *obj, char *p, int p_max_size) +{ + print_mixer_bar_chan(obj, 1, p, p_max_size); +}