diff options
author | Gerd Moellmann <gerd@gnu.org> | 2000-12-07 22:09:00 +0000 |
---|---|---|
committer | Gerd Moellmann <gerd@gnu.org> | 2000-12-07 22:09:00 +0000 |
commit | 28fcb7dc3997d9b51ef770e887dbd6eefe564428 (patch) | |
tree | 611138527281db5d903c73cb77701f7d93d8c6e3 /src/sound.c | |
parent | 926b7e5e3ec4ddb93aaf8d1357020a6b7e8a55a1 (diff) | |
download | emacs-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.c | 46 |
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); |