]> git.eshelyaron.com Git - emacs.git/commitdiff
(vox_configure): Change order of ioctls. Don't
authorGerd Moellmann <gerd@gnu.org>
Thu, 7 Dec 2000 22:09:00 +0000 (22:09 +0000)
committerGerd Moellmann <gerd@gnu.org>
Thu, 7 Dec 2000 22:09:00 +0000 (22:09 +0000)
set SNDCTL_DSP_SPEED from bps, don't set SNDCTL_DSP_SAMPLESIZE.
Ignore errors when changing volume.
(vox_close): Don't reset the device.

src/ChangeLog
src/sound.c

index ca92994f0210ebf2cb6a081aee1f399781973abf..85c4691d4d364c5c80be80adfc729bf3c40bfbbd 100644 (file)
@@ -9,6 +9,11 @@
 
 2000-12-07  Gerd Moellmann  <gerd@gnu.org>
 
+       * sound.c (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.
+
        * process.c (read_process_output): Make sure the process marker's
        position is valid when the process buffer is changed in
        after-change functions.  W3 does that.
index fc3adbdba6b3b29c58c9eb83fad19fc4b0b2e593..4e61a1f8f25a8232d7bab43dd01dbff337b4d8e6 100644 (file)
@@ -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);