I pinpointed the problem and wrote a small program
to illustrate the problem.

When compiling the program given below with:

  gcc -DUSE_DSP_SETFMT=0 troep.c

it runs fine.

But, when compiling it with:

  gcc -DUSE_DSP_SETFMT=1 troep.c

It stops rather quickly with reading data.

Example output of the latter:

~>a.out
Fragment size: 1024
Number of fragments: 32767
Number of channels: 1
Sample rate: 22050
Read 1024 bytes.
Number of full fragments that can be read or written without blocking: 0
Total number of fragments allocated for buffering: 2
Size of a fragment in bytes: 1024
Number of bytes that can be read or written immediately without blocking: 0
#fragments, #bytes: 0, 0
#fragments, #bytes: 1, 1632
Read 1024 bytes.
#fragments, #bytes: 2, 2048
Read 1024 bytes.
#fragments, #bytes: 1, 1024
Read 1024 bytes.
#fragments, #bytes: 0, 0
#fragments, #bytes: 0, 0
#fragments, #bytes: 0, 0
...etc

-- 
Carlo Wood <[EMAIL PROTECTED]>


The program:


#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <linux/soundcard.h>
#include <time.h>

int main(void)
{
  int res;
  char buf[1024];

  int fd = open("/dev/dsp", O_RDONLY);
  if (fd == -1)
  {
    perror("open");
    exit(1);
  }

  res = 0x7fff000a;
  if (ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &res) == -1)
  {
    perror("ioctl");
    exit(1);
  }
  printf("Fragment size: %d\n", 1 << (res & 0xffff));
  printf("Number of fragments: %d\n", res >> 16);

#if USE_DSP_SETFMT
  res = AFMT_S16_LE;
  if (ioctl(fd, SNDCTL_DSP_SETFMT, &res) == -1)
  {
    perror("ioctl");
    exit(1);
  }
#endif

  res = 0;      // Not stereo (1 channel).
  if (ioctl(fd, SNDCTL_DSP_STEREO, &res) == -1)
  {
    perror("ioctl");
    exit(1);
  }
  printf("Number of channels: %d\n", res ? 2 : 1);

  res = 22050;
  if (ioctl(fd, SOUND_PCM_READ_RATE, 0xbfffdcfc) == -1)
  {
    perror("ioctl");
    exit(1);
  }
  printf("Sample rate: %d\n", res);

  ssize_t rlen = read(fd, buf, sizeof(buf));
  if (rlen <= 0)
  {
    perror("read");
    exit(1);
  }
  printf("Read %d bytes.\n", rlen);

  audio_buf_info info;

  if (ioctl(fd, SNDCTL_DSP_GETISPACE, &info) == -1)
  {
    perror("read");
    exit(1);
  }
  printf("Number of full fragments that can be read or written without blocking: 
%d\n", info.fragments);
  printf("Total number of fragments allocated for buffering: %d\n", info.fragstotal);
  printf("Size of a fragment in bytes: %d\n", info.fragsize);
  printf("Number of bytes that can be read or written immediately without blocking: 
%d\n", info.bytes);

  int i;
  for (i = 0; i < 100; ++i)
  {
    if (ioctl(fd, SNDCTL_DSP_GETISPACE, &info) == -1)
    {
      perror("read");
      exit(1);
    }
    printf("#fragments, #bytes: %d, %d\n", info.fragments, info.bytes);
    if (info.fragments > 0)
    {
      ssize_t rlen = read(fd, buf, sizeof(buf));
      if (rlen <= 0)
      {
        perror("read");
        exit(1);
      }
      printf("Read %d bytes.\n", rlen);
    }
    static struct timespec naptime = { 0, 100000000 };
    nanosleep(&naptime, 0);
  }

  close(fd);
  return 0;
}


-------------------------------------------------------
This SF.Net email sponsored by: Parasoft
Error proof Web apps, automate testing & more.
Download & eval WebKing and get a free book.
www.parasoft.com/bulletproofapps
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to