summaryrefslogtreecommitdiff
path: root/src/sound.c
diff options
context:
space:
mode:
authorGerd Moellmann <gerd@gnu.org>2000-12-07 22:09:00 +0000
committerGerd Moellmann <gerd@gnu.org>2000-12-07 22:09:00 +0000
commit28fcb7dc3997d9b51ef770e887dbd6eefe564428 (patch)
tree611138527281db5d903c73cb77701f7d93d8c6e3 /src/sound.c
parent926b7e5e3ec4ddb93aaf8d1357020a6b7e8a55a1 (diff)
downloademacs-28fcb7dc3997d9b51ef770e887dbd6eefe564428.tar.gz
(vox_configure): Change order of ioctls. Don't
set SNDCTL_DSP_SPEED from bps, don't set SNDCTL_DSP_SAMPLESIZE. Ignore errors when changing volume. (vox_close): Don't reset the device.
Diffstat (limited to 'src/sound.c')
-rw-r--r--src/sound.c46
1 files changed, 20 insertions, 26 deletions
diff --git a/src/sound.c b/src/sound.c
index fc3adbdba6b..4e61a1f8f25 100644
--- a/src/sound.c
+++ b/src/sound.c
@@ -760,41 +760,36 @@ static void
vox_configure (sd)
struct sound_device *sd;
{
- int requested;
+ int val;
xassert (sd->fd >= 0);
- /* Device parameters apparently depend on each other in undocumented
- ways (not to imply that there is any real documentation). Be
- careful when reordering the calls below. */
- if (sd->sample_size > 0
- && ioctl (sd->fd, SNDCTL_DSP_SAMPLESIZE, &sd->sample_size) < 0)
- sound_perror ("Setting sample size");
-
- if (sd->bps > 0
- && ioctl (sd->fd, SNDCTL_DSP_SPEED, &sd->bps) < 0)
- sound_perror ("Setting speed");
-
- if (sd->sample_rate > 0
- && ioctl (sd->fd, SOUND_PCM_WRITE_RATE, &sd->sample_rate) < 0)
- sound_perror ("Setting sample rate");
+ val = sd->format;
+ if (ioctl (sd->fd, SNDCTL_DSP_SETFMT, &sd->format) < 0
+ || val != sd->format)
+ sound_perror ("Set sound format");
- requested = sd->format;
- if (ioctl (sd->fd, SNDCTL_DSP_SETFMT, &sd->format) < 0)
- sound_perror ("Setting format");
- else if (requested != sd->format)
- error ("Setting format");
+ val = sd->channels != 1;
+ if (ioctl (sd->fd, SNDCTL_DSP_STEREO, &val) < 0
+ || val != (sd->channels != 1))
+ sound_perror ("Set stereo/mono");
- if (sd->channels > 1
- && ioctl (sd->fd, SNDCTL_DSP_STEREO, &sd->channels) < 0)
- sound_perror ("Setting channels");
+ /* 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
+ || val != sd->sample_rate)
+ sound_perror ("Set sound speed");
+ }
if (sd->volume > 0)
{
int volume = sd->volume & 0xff;
volume |= volume << 8;
- if (ioctl (sd->fd, SOUND_MIXER_WRITE_PCM, &volume) < 0)
- sound_perror ("Setting volume");
+ /* This may fail if there is no mixer. Ignore the failure. */
+ ioctl (sd->fd, SOUND_MIXER_WRITE_PCM, &volume);
}
}
@@ -809,7 +804,6 @@ vox_close (sd)
{
/* Flush sound data, and reset the device. */
ioctl (sd->fd, SNDCTL_DSP_SYNC, NULL);
- ioctl (sd->fd, SNDCTL_DSP_RESET, NULL);
/* Close the device. */
emacs_close (sd->fd);