static void vox_close (struct sound_device *sd) { if (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. */ #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); sd->fd = -1; } }
static void vox_close (struct sound_device *sd) { if (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. */ #ifdef USABLE_SIGIO sigset_t blocked, oldset; sigemptyset (&blocked); sigaddset (&blocked, SIGIO); pthread_sigmask (SIG_BLOCK, &blocked, &oldset); #endif turn_on_atimers (0); /* Flush sound data, and reset the device. */ ioctl (sd->fd, SNDCTL_DSP_SYNC, NULL); turn_on_atimers (1); #ifdef USABLE_SIGIO pthread_sigmask (SIG_SETMASK, &oldset, 0); #endif /* Close the device. */ emacs_close (sd->fd); sd->fd = -1; } }
static void vox_configure (struct sound_device *sd) { int val; #ifdef USABLE_SIGIO sigset_t oldset, blocked; #endif eassert (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 USABLE_SIGIO sigemptyset (&blocked); sigaddset (&blocked, SIGIO); pthread_sigmask (SIG_BLOCK, &blocked, &oldset); #endif val = sd->format; if (ioctl (sd->fd, SNDCTL_DSP_SETFMT, &sd->format) < 0 || val != sd->format) sound_perror ("Could not set sound format"); val = sd->channels != 1; if (ioctl (sd->fd, SNDCTL_DSP_STEREO, &val) < 0 || val != (sd->channels != 1)) sound_perror ("Could not set stereo/mono"); /* I think bps and sampling_rate are the same, but who knows. Check this. and use SND_DSP_SPEED for both. */ if (sd->sample_rate > 0) { val = sd->sample_rate; if (ioctl (sd->fd, SNDCTL_DSP_SPEED, &sd->sample_rate) < 0) sound_perror ("Could not set sound speed"); else if (val != sd->sample_rate) sound_warning ("Could not set sample rate"); } if (sd->volume > 0) { int volume = sd->volume & 0xff; volume |= volume << 8; /* This may fail if there is no mixer. Ignore the failure. */ ioctl (sd->fd, SOUND_MIXER_WRITE_PCM, &volume); } turn_on_atimers (1); #ifdef USABLE_SIGIO pthread_sigmask (SIG_SETMASK, &oldset, 0); #endif }
static void sound_perror (const char *msg) { int saved_errno = errno; turn_on_atimers (1); #ifdef SIGIO sigunblock (sigmask (SIGIO)); #endif if (saved_errno != 0) error ("%s: %s", msg, strerror (saved_errno)); else error ("%s", msg); }
static _Noreturn void sound_perror (const char *msg) { int saved_errno = errno; turn_on_atimers (1); #ifdef USABLE_SIGIO { sigset_t unblocked; sigemptyset (&unblocked); sigaddset (&unblocked, SIGIO); pthread_sigmask (SIG_UNBLOCK, &unblocked, 0); } #endif if (saved_errno != 0) error ("%s: %s", msg, strerror (saved_errno)); else error ("%s", msg); }