mupen64plus-oldsvn/jttl_audio/volume.c

95 lines
2.2 KiB
C

/**
* Mupen64 - volume.c
* Copyright (C) 2002 Hacktarux
*
* Mupen64 homepage: http://mupen64.emulation64.com
* email address: hacktarux@yahoo.fr
*
* If you want to contribute to the project please contact
* me first (maybe someone is already making what you are
* planning to do).
*
*
* This program is free software; you can redistribute it and/
* or modify it under the terms of the GNU General Public Li-
* cence as published by the Free Software Foundation; either
* version 2 of the Licence, or any later version.
*
* This program is distributed in the hope that it will be use-
* ful, but WITHOUT ANY WARRANTY; without even the implied war-
* ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public Licence for more details.
*
* You should have received a copy of the GNU General Public
* Licence along with this program; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
* USA.
*
**/
/* Sound volume functions.
*/
#include <sys/soundcard.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include "volume.h"
#include "../main/translate.h"
/* volSet
* Sets volume of left and right PCM channels to given percentage (0-100) value.
*/
void volSet(int percent)
{
int ret, vol;
int mixerfd = open("/dev/mixer", O_RDONLY);
if(mixerfd < 0)
{
perror("/dev/mixer: ");
return;
}
if(percent > 100)
percent = 100;
else if(percent < 0)
percent = 0;
vol = (percent << 8) + percent; // set both left/right channels to same vol
ret = ioctl(mixerfd, MIXER_WRITE(SOUND_MIXER_PCM), &vol);
if(ret < 0)
perror("Setting PCM volume: ");
close(mixerfd);
}
/* volGet
* Returns volume of PCM channel as a percentage (0-100).
*/
int volGet(void)
{
int vol, ret;
int mixerfd = open("/dev/mixer", O_RDONLY);
if(mixerfd < 0)
{
perror("/dev/mixer: ");
return;
}
ret = ioctl(mixerfd, MIXER_READ(SOUND_MIXER_PCM), &vol);
if(ret < 0)
perror("Reading PCM volume: ");
close(mixerfd);
return vol & 0xff; // just return the left channel
}