[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