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;
}