path rather than waiting for the next device cycle. This fixes deadocks
when the slot uses the SIO_SYNC mode.
-/* $OpenBSD: dev.c,v 1.8 2013/12/20 08:47:37 ratchov Exp $ */
+/* $OpenBSD: dev.c,v 1.9 2013/12/31 12:27:49 ratchov Exp $ */
/*
* Copyright (c) 2008-2012 Alexandre Ratchov <alex@caoua.org>
*
void
slot_write(struct slot *s)
{
+ int drop;
+
if (s->pstate == SLOT_START && s->mix.buf.used == s->mix.buf.len) {
#ifdef DEBUG
if (log_level >= 4) {
s->pstate = SLOT_READY;
slot_ready(s);
}
+ drop = s->mix.drop;
+ slot_mix_drop(s);
+ while (drop > s->mix.drop) {
+#ifdef DEBUG
+ if (log_level >= 4) {
+ slot_log(s);
+ log_puts(": catching play block\n");
+ }
+#endif
+ s->ops->fill(s->arg);
+ drop--;
+ }
}
/*
void
slot_read(struct slot *s)
{
- /* nothing yet */
+ int sil;
+
+ sil = s->sub.silence;
+ slot_sub_sil(s);
+ while (sil > s->sub.silence) {
+#ifdef DEBUG
+ if (log_level >= 4) {
+ slot_log(s);
+ log_puts(": catching rec block\n");
+ }
+#endif
+ s->ops->flush(s->arg);
+ sil--;
+ }
}