main.c
#include <time.h> #include <math.h> #include <stdio.h> #include <string.h> #include <stdarg.h> #include <stdlib.h> #include <stdint.h> #include <fcntl.h> #include <unistd.h> #include <pthread.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <sys/time.h> #include <sys/time.h> #include <syslog.h> #include <linux/input.h> #include "mi_ao.h" #include "mi_sys.h" #include "mi_common_datatype.h" #define SND_DEV "/dev/mi_ao" #define MIN_RAW_VALUE -60 #define MAX_RAW_VALUE 30 #define MI_AO_SETVOLUME 0x4008690b #define MI_AO_GETVOLUME 0xc008690c #define MI_AO_SETMUTE 0x4008690d static int set_vol(int vol) { int fd = -1; int pre_val = 0; int val[2] = { 0 }; uint64_t buf[] = { sizeof(val), (uintptr_t)val }; fd = open(SND_DEV, O_RDWR); if (fd < 0) { printf("failed to open \"%s\"\n", SND_DEV); return 0; } if (vol > MAX_RAW_VALUE) { vol = MAX_RAW_VALUE; } else if (vol < MIN_RAW_VALUE) { vol = MIN_RAW_VALUE; } ioctl(fd, MI_AO_GETVOLUME, buf); pre_val = val[1]; val[1] = vol; ioctl(fd, MI_AO_SETVOLUME, buf); if ((pre_val <= MIN_RAW_VALUE) && (vol > MIN_RAW_VALUE)) { val[1] = 0; ioctl(fd, MI_AO_SETMUTE, buf); } else if ((pre_val > MIN_RAW_VALUE) && (vol <= MIN_RAW_VALUE)) { val[1] = 1; ioctl(fd, MI_AO_SETMUTE, buf); } close(fd); return vol; } int main(int argc, char *argv[]) { int fd = -1; int vol = -10; struct input_event ev = {0}; fd = open("/dev/input/event0", O_RDONLY | O_NONBLOCK | O_CLOEXEC); if (fd < 0) { printf("failed to open event0\n"); return -1; } set_vol(vol); while (read(fd, &ev, sizeof(struct input_event))) { if (ev.type == EV_KEY) { if ((ev.code == 115) && (ev.value == 1)) { vol += 3; set_vol(vol); } if ((ev.code == 114) && (ev.value == 1)) { vol -= 3; set_vol(vol); } } } close(fd); return 0; }