64 lines
1.4 KiB
C
64 lines
1.4 KiB
C
|
#include "oss.h"
|
||
|
#include "../util.h"
|
||
|
|
||
|
#include <fcntl.h>
|
||
|
#include <unistd.h>
|
||
|
#include <sys/soundcard.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
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;
|
||
|
}
|