1
0
mirror of https://github.com/openbsd/src.git synced 2026-06-18 07:13:36 +02:00

libsndio: Don't use the hdl->wused counter to trigger AUDIO_START

No behavior change.

The hdl->wused variable counts the amount of data the program writes.
It doesn't take into account the silence inserted with sio_wsil().
AUDIO_START must be called when a full buffer is written to the device
regardless whether its silence or data. In the current implementation,
we don't insert silence (yet), so this commit is mostly to avoid
mistakes in future changes.
This commit is contained in:
ratchov
2025-10-21 11:49:01 +00:00
parent cf10c014bc
commit 26cb2b613e
+19 -17
View File
@@ -1,4 +1,4 @@
/* $OpenBSD: sio_sun.c,v 1.30 2022/12/27 17:10:07 jmc Exp $ */
/* $OpenBSD: sio_sun.c,v 1.31 2025/10/21 11:49:01 ratchov Exp $ */
/*
* Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org>
*
@@ -39,7 +39,7 @@
struct sio_sun_hdl {
struct sio_hdl sio;
int fd;
int filling;
int prime;
unsigned int ibpf, obpf; /* bytes per frame */
unsigned int ibytes, obytes; /* bytes the hw transferred */
unsigned int ierr, oerr; /* frames the hw dropped */
@@ -330,7 +330,7 @@ sio_sun_fdopen(int fd, unsigned int mode, int nbio)
return NULL;
}
hdl->fd = fd;
hdl->filling = 0;
hdl->prime = 0;
return (struct sio_hdl *)hdl;
}
@@ -380,7 +380,7 @@ sio_sun_start(struct sio_hdl *sh)
* keep the device paused and let sio_sun_pollfd() trigger the
* start later, to avoid buffer underruns
*/
hdl->filling = 1;
hdl->prime = hdl->sio.par.pchan * hdl->sio.par.bps * hdl->sio.par.bufsz;
} else {
/*
* no play buffers to fill, start now!
@@ -400,10 +400,9 @@ sio_sun_flush(struct sio_hdl *sh)
{
struct sio_sun_hdl *hdl = (struct sio_sun_hdl *)sh;
if (hdl->filling) {
hdl->filling = 0;
if (hdl->prime > 0)
return 1;
}
if (ioctl(hdl->fd, AUDIO_STOP) == -1) {
DPERROR("AUDIO_STOP");
hdl->sio.eof = 1;
@@ -512,6 +511,19 @@ sio_sun_write(struct sio_hdl *sh, const void *buf, size_t len)
}
return 0;
}
if (hdl->prime > 0) {
hdl->prime -= n;
if (hdl->prime <= 0) {
if (ioctl(hdl->fd, AUDIO_START) == -1) {
DPERROR("AUDIO_START");
hdl->sio.eof = 1;
return 0;
}
_sio_onmove_cb(&hdl->sio, 0);
}
}
return n;
}
@@ -528,16 +540,6 @@ sio_sun_pollfd(struct sio_hdl *sh, struct pollfd *pfd, int events)
pfd->fd = hdl->fd;
pfd->events = events;
if (hdl->filling && hdl->sio.wused == hdl->sio.par.bufsz *
hdl->sio.par.pchan * hdl->sio.par.bps) {
hdl->filling = 0;
if (ioctl(hdl->fd, AUDIO_START) == -1) {
DPERROR("AUDIO_START");
hdl->sio.eof = 1;
return 0;
}
_sio_onmove_cb(&hdl->sio, 0);
}
return 1;
}