#include "oss.h" #include "../util.h" #include #include #include #include typedef struct { int fd; int pcm; int vol; int mute; } mixer_data; static mixer_data main_mixer; #define ioctl_checked(fd, request, arg) _ioctl_checked(fd, request, #request, arg) static void _ioctl_checked(int fd, unsigned long request, const char *rq_name, void *arg) { if (ioctl(fd, request, arg) < 0) { qtb_log("ioctl request %s failed", rq_name); qtb_die(); } } static void open_mixer(const char *path, mixer_data *mixer) { mixer->fd = open(path, O_RDONLY); if (mixer->fd < 0) { qtb_log("could not open mixer '%s'", path); qtb_die(); } } static void read_mixer(mixer_data *mixer) { ioctl_checked(mixer->fd, SOUND_MIXER_READ_PCM, &mixer->pcm); mixer->pcm >>= 8; ioctl_checked(mixer->fd, SOUND_MIXER_READ_VOLUME, &mixer->vol); mixer->vol >>= 8; mixer->mute = !(mixer->vol * mixer->pcm); } void oss_module_init() { open_mixer("/dev/mixer", &main_mixer); } static const char *get_volume_icon(int volume, int mute) { if (mute) { return "ﱝ"; } else if (volume > 50) { return "墳"; } else if (volume > 0) { return "奔"; } return "奄"; } char *oss_module_poll() { read_mixer(&main_mixer); const char *icon = get_volume_icon(main_mixer.vol, main_mixer.mute); char *buff = qtb_malloc(32); sprintf(buff, "%s%3d%%",icon, main_mixer.vol); return buff; }