Subject: audio recording problem
To: None <tech-kern@netbsd.org, port-i386@netbsd.org>
From: Sachin Goel <sgoel@liberate.com>
List: tech-kern
Date: 09/23/1999 18:48:12
Guys,

I am seeing problem with audio recording in non blocking mode with
netbsd1.3I on the x86 platform [I tried with sb and mss dvice and it
occurs on both]. If i open the device in read mode and do a select  on
the fd, the select times out. See the small program and its output at
the end of the e-mail

If there is fix / workaround, please let me know.

Thanks in advance,
Sachin (sgoel@liberate.com)

ps - Forgot to put the subject in my earlier message. Sorry about
duplicate message

-------------------------------------------------------------------------------------

#include <fcntl.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/uio.h>
#include <unistd.h>
#include <sys/audioio.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <string.h>


int fd;

int open_recorder( void )
{
  audio_info_t info;

  char buffer[512];

    AUDIO_INITINFO( &info );

    info.blocksize = 128;
    info.mode = AUMODE_PLAY;
    info.play.encoding = AUDIO_ENCODING_ULAW;
    info.play.sample_rate = 8000;
    info.play.precision = 8;
    info.play.channels = 1;
    info.hiwat = 34;
    info.lowat = 5;


    if( ( fd = open( "/dev/audio", O_RDONLY | O_NONBLOCK) ) == -1 )
    {
      perror( "open device" );
      return( -1 );
    }

    if (ioctl(fd, AUDIO_SETINFO, &info) == -1)
    {
         perror("set info");
         return(-1);
     }

    return 0;
}

main( int argc, char** argv )
{
int outfd, nbytes;
fd_set readfds;
struct timeval to;
int err, bufout;
char buf[512];

  if( open_recorder() == -1 )
    exit(0);

  to.tv_sec = 10;
  to.tv_usec = 0;
  FD_ZERO( &readfds );
  FD_SET( fd, &readfds );


  if( ( outfd = open( "/nchome/sac.au", O_WRONLY | O_CREAT)) < 0 ) {
    perror( "test.out");
    exit(0);
  }
  while( (err = select( fd+1, &readfds, NULL, NULL, &to ) ) > 0 )
  {
    nbytes = read(fd, buf, 512);
    bufout = write( outfd, buf, nbytes);
    printf("no. of bytes written = %d\n", bufout);
  }

  close( outfd );
  close( fd );
    if( err < 0 ) perror( "select");
    if( err == 0 ) printf( "timeout\n");
    else printf( "number of fds: %d\n",err);

}



OUPPUT is "timeout"

-------------------------------------------------------------------------------------