>
> On Tue, Oct 16, 2001 at 08:27:43AM +0200, Ralf Habacker wrote:
> >4. cygwin uses a fixed buffer size of 16384. r&d like to use a 512
> byte buffer,
> >which cygwin does ignore.
> >   This causes delay in 1.
>
> That sounds fixable.  How is the buffer size controlled on linux?
>
Below is a part from src/libgame/sound.c of the rocks&diamonds source
distribution, which initialize the sound.
The size is set with ioctl(SNDCTL_DSP_SETFRAGMENT...) and later recalled with
ioctl(SNDCTL_DSP_GETBLKSIZE...) .

Ralf

          unsigned long fragment_spec = 0;

          /* determine logarithm (log2) of the fragment size */
          for (fragment_spec=0; (1 << fragment_spec) < fragment_size;
               fragment_spec++);

          /* use two fragments (play one fragment, prepare the other);
             one fragment would result in interrupted audio output, more
             than two fragments would raise audio output latency to much */
          fragment_spec |= 0x00020000;

          /* Example for fragment specification:
             - 2 buffers / 512 bytes (giving 1/16 second resolution for 8 kHz)
             - (with stereo the effective buffer size will shrink to 256)
             => fragment_size = 0x00020009 */

          if (ioctl(audio.device_fd,SNDCTL_DSP_SETFRAGMENT,&fragment_spec) < 0)
            Error(ERR_EXIT_SOUND_SERVER,
                  "cannot set fragment size of /dev/dsp - no sounds");

          /* try if we can use stereo sound */
          if (ioctl(audio.device_fd, SNDCTL_DSP_STEREO, &stereo) < 0)
          {
          if (ioctl(audio.device_fd, SNDCTL_DSP_SPEED, &sample_rate) < 0)
            Error(ERR_EXIT_SOUND_SERVER,
                  "cannot set sample rate of /dev/dsp - no sounds");

          /* get the real fragmentation size; this should return 512 */
          if (ioctl(audio.device_fd, SNDCTL_DSP_GETBLKSIZE,&fragment_size) < 0)
            Error(ERR_EXIT_SOUND_SERVER,
                  "cannot get fragment size of /dev/dsp - no sounds");

          max_sample_size = fragment_size / (stereo ? 2 : 1);
        }


Reply via email to