# HG changeset patch # User Gerd Moellmann # Date 976226906 0 # Node ID db2901e01b72ba861d6d682151a08c7ed18955b1 # Parent e477bbc45459a0675daee13e12b32002c68f2209 (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. diff -r e477bbc45459 -r db2901e01b72 src/sound.c --- a/src/sound.c Thu Dec 07 15:53:18 2000 +0000 +++ b/src/sound.c Thu Dec 07 22:08:26 2000 +0000 @@ -760,41 +760,36 @@ 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"); + val = sd->format; + if (ioctl (sd->fd, SNDCTL_DSP_SETFMT, &sd->format) < 0 + || val != sd->format) + sound_perror ("Set sound 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->sample_rate > 0 - && ioctl (sd->fd, SOUND_PCM_WRITE_RATE, &sd->sample_rate) < 0) - sound_perror ("Setting sample rate"); - - 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"); - - 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 @@ { /* 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);