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);  | 
