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