[alsa-devel] aoss never returns POLLIN

Mark Hills mark at pogo.org.uk
Sun Jul 29 02:08:26 CEST 2007


Hi,

When using the aoss wrapper, poll() is never woken by POLLIN.

This happens with devices opened in either O_RDWR or O_RDONLY and is 
demonstrated by the trivial example below, which never prints "POLLIN".

The example performs correctly using the kernel OSS emulation. Is this a 
(known) bug in aoss? I've now seen it on different distributions and in 
the latest code from the repository.

Enabling ALSA_OSS_DEBUG shows that the struct pollfd is being correctly 
manipulated:

Orig enter POLL nfds: 1, timeout: 1000
fd=3, events=d, revents=0
Changed enter POLL nfds: 2, timeout: 1000
fd=5, events=2c, revents=0
fd=6, events=29, revents=0

Changed exit POLL nfds: 2, timeout: 1000
fd=5, events=2c, revents=4
fd=6, events=29, revents=0
Orig exit POLL nfds: 1, timeout: 1000
fd=3, events=d, revents=4

The file descriptors are:

lrwx------ 1 mark users 64 Jul 29 00:46 /proc/5399/fd/3 -> /dev/null
lrwx------ 1 mark users 64 Jul 29 00:46 /proc/5399/fd/5 -> /dev/snd/pcmC0D0p
lrwx------ 1 mark users 64 Jul 29 00:46 /proc/5399/fd/6 -> /dev/snd/pcmC0D0c

The pass through to the _poll() call inside poll_with_pcm() in alsa-oss.c 
isn't being woken by POLLIN for the capture device.

Mark


#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/poll.h>
#include <sys/soundcard.h>

#define CHANNELS 2
#define SAMPLES 64

int main(int argc, char *argv[]) {
      int fd, p, r;
      struct pollfd pe;
      char buf[CHANNELS * SAMPLES];

      /* Change below to O_RDWR, O_RDONLY or O_WRONLY */

      fd = open("/dev/dsp", O_RDWR, 0);
      if(fd == -1) {
          perror("open");
          return -1;
      }

      p = AFMT_S16_LE;
      if(ioctl(fd, SNDCTL_DSP_SETFMT, &p) == -1) {
          perror("SNDCTL_DSP_SETFMT");
          return -1;
      }

      p = CHANNELS;
      if(ioctl(fd, SNDCTL_DSP_CHANNELS, &p) == -1) {
          perror("SNDCTL_DSP_CHANNELS");
          return -1;
      }

      p = 44100;
      if(ioctl(fd, SNDCTL_DSP_SPEED, &p) == -1) {
          perror("SNDCTL_DSP_SPEED");
          return -1;
      }

      if(fcntl(fd, F_SETFL, O_NONBLOCK) == -1) {
          perror("fcntl");
          return -1;
      }

      pe.fd = fd;
      pe.events = POLLERR | POLLIN | POLLOUT;

      for(;;) {
          fputs("poll", stderr);

          pe.revents = 0;
          poll(&pe, 1, 1000);

          if(pe.revents & POLLOUT) {
              fputs(" POLLOUT", stderr);
              r = write(fd, buf, CHANNELS * SAMPLES);
              if(r == -1 && errno != EAGAIN) {
                  perror("read");
                  return -1;
              }
          }

          if(pe.revents & POLLIN) {
              fputs(" POLLIN", stderr);
              r = read(fd, buf, CHANNELS * SAMPLES);
              if(r == -1 && errno != EAGAIN) {
                  perror("read");
                  return -1;
              }
          }

          fputc('\n', stderr);
      }

      close(fd);
      return 0;
}


More information about the Alsa-devel mailing list