#include "lisp.h"
#include "dispextern.h"
#include "atimer.h"
+#include <signal.h>
+#include "syssignal.h"
/* FreeBSD has machine/soundcard.h. Voxware sound driver docs mention
sys/soundcard.h. So, let's try whatever's there. */
xassert (sd->fd >= 0);
+ /* On GNU/Linux, it seems that the device driver doesn't like to be
+ interrupted by a signal. Block the ones we know to cause
+ troubles. */
turn_on_atimers (0);
+#ifdef SIGIO
+ sigblock (sigmask (SIGIO));
+#endif
val = sd->format;
if (ioctl (sd->fd, SNDCTL_DSP_SETFMT, &sd->format) < 0
}
turn_on_atimers (1);
+#ifdef SIGIO
+ sigunblock (sigmask (SIGIO));
+#endif
}
{
if (sd->fd >= 0)
{
- /* Flush sound data, and reset the device. */
+ /* On GNU/Linux, it seems that the device driver doesn't like to
+ be interrupted by a signal. Block the ones we know to cause
+ troubles. */
+#ifdef SIGIO
+ sigblock (sigmask (SIGIO));
+#endif
turn_on_atimers (0);
+
+ /* Flush sound data, and reset the device. */
ioctl (sd->fd, SNDCTL_DSP_SYNC, NULL);
+
turn_on_atimers (1);
+#ifdef SIGIO
+ sigunblock (sigmask (SIGIO));
+#endif
/* Close the device. */
emacs_close (sd->fd);