mirror of https://github.com/ericonr/sndio.git
oss: add support for sio_setvol().
From Tobias Kortkamp <tobik@FreeBSD.org>, thanks.
This commit is contained in:
parent
31cfb9b6dc
commit
f1cd80bb72
|
@ -108,6 +108,8 @@ static int sio_oss_xrun(struct sio_oss_hdl *);
|
||||||
static size_t sio_oss_read(struct sio_hdl *, void *, size_t);
|
static size_t sio_oss_read(struct sio_hdl *, void *, size_t);
|
||||||
static size_t sio_oss_write(struct sio_hdl *, const void *, size_t);
|
static size_t sio_oss_write(struct sio_hdl *, const void *, size_t);
|
||||||
static void sio_oss_close(struct sio_hdl *);
|
static void sio_oss_close(struct sio_hdl *);
|
||||||
|
static int sio_oss_setvol(struct sio_hdl *, unsigned int);
|
||||||
|
static void sio_oss_getvol(struct sio_hdl *);
|
||||||
|
|
||||||
static struct sio_ops sio_oss_ops = {
|
static struct sio_ops sio_oss_ops = {
|
||||||
sio_oss_close,
|
sio_oss_close,
|
||||||
|
@ -121,8 +123,8 @@ static struct sio_ops sio_oss_ops = {
|
||||||
sio_oss_nfds,
|
sio_oss_nfds,
|
||||||
sio_oss_pollfd,
|
sio_oss_pollfd,
|
||||||
sio_oss_revents,
|
sio_oss_revents,
|
||||||
NULL, /* setvol */
|
sio_oss_setvol,
|
||||||
NULL, /* getvol */
|
sio_oss_getvol,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -768,4 +770,40 @@ sio_oss_revents(struct sio_hdl *sh, struct pollfd *pfd)
|
||||||
return revents;
|
return revents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
sio_oss_setvol(struct sio_hdl *sh, unsigned int vol)
|
||||||
|
{
|
||||||
|
struct sio_oss_hdl *hdl = (struct sio_oss_hdl *)sh;
|
||||||
|
int newvol;
|
||||||
|
|
||||||
|
/* Scale to 0..100 */
|
||||||
|
newvol = 1.0 * 100 * vol / SIO_MAXVOL;
|
||||||
|
newvol = newvol | (newvol << 8);
|
||||||
|
|
||||||
|
if (ioctl(hdl->fd, SNDCTL_DSP_SETPLAYVOL, &newvol) < 0) {
|
||||||
|
DPERROR("sio_oss_setvol");
|
||||||
|
hdl->sio.eof = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sio_oss_getvol(struct sio_hdl *sh)
|
||||||
|
{
|
||||||
|
struct sio_oss_hdl *hdl = (struct sio_oss_hdl *)sh;
|
||||||
|
int vol;
|
||||||
|
|
||||||
|
if (ioctl(hdl->fd, SNDCTL_DSP_GETPLAYVOL, &vol) < 0) {
|
||||||
|
DPERROR("sio_oss_getvol");
|
||||||
|
hdl->sio.eof = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use left channel volume and scale to SIO_MAXVOL */
|
||||||
|
vol = SIO_MAXVOL * 1.0 * (vol & 0x7f) / 100;
|
||||||
|
_sio_onvol_cb(&hdl->sio, vol);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* defined USE_OSS */
|
#endif /* defined USE_OSS */
|
||||||
|
|
Loading…
Reference in New Issue