Steward
分享是一種喜悅、更是一種幸福
掌機 - Anbernic RetroGame - 如何設定聲音大小
雖然RetroGame不是開源的掌機,不過為了可以讓它更趨近完美,司徒最終逆向出廠預設的模擬器,藉此得知如何控制聲音,整理後的程式如下:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/soundcard.h>
#include <sys/ioctl.h>
#define MIXER_DEV "/dev/mixer"
typedef enum {
AUDIO_VOLUME_SET,
AUDIO_VOLUME_GET,
} audio_volume_action;
int audio_volume(audio_volume_action action, long* outvol)
{
int ret = 0;
int fd, devs;
if ((fd = open(MIXER_DEV, O_WRONLY)) > 0) {
if (action == AUDIO_VOLUME_SET) {
if (*outvol < 0 || *outvol > 100) {
return -2;
}
*outvol = (*outvol << 8) | *outvol;
ioctl(fd, SOUND_MIXER_WRITE_VOLUME, outvol);
}
else if (action == AUDIO_VOLUME_GET) {
ioctl(fd, SOUND_MIXER_READ_VOLUME, outvol);
*outvol = *outvol & 0xff;
}
close(fd);
return 0;
}
return -1;
}
int main(void)
{
long ret = 0, vol = 0;
vol = -1;
ret = audio_volume(AUDIO_VOLUME_GET, &vol);
printf("old volume: %d\n", vol);
vol = 100;
ret = audio_volume(AUDIO_VOLUME_SET, &vol);
printf("set volume to %d\n", vol);
vol = -1;
ret = audio_volume(AUDIO_VOLUME_GET, &vol);
printf("new volume is: %d\n", vol);
return 0;
}