home *** CD-ROM | disk | FTP | other *** search
/ ftp.ee.lbl.gov / 2014.05.ftp.ee.lbl.gov.tar / ftp.ee.lbl.gov / sst.tar.Z / sst.tar / sst / play.c < prev    next >
C/C++ Source or Header  |  1990-01-10  |  2KB  |  129 lines

  1. /* play.c - play a sound file on the speaker
  2. **
  3. ** Copyright (C) 1989 by Jef Poskanzer.
  4. **
  5. ** Permission to use, copy, modify, and distribute this software and its
  6. ** documentation for any purpose and without fee is hereby granted, provided
  7. ** that the above copyright notice appear in all copies and that both that
  8. ** copyright notice and this permission notice appear in supporting
  9. ** documentation.  This software is provided "as is" without express or
  10. ** implied warranty.
  11. */
  12.  
  13. #include <stdio.h>
  14. #include <fcntl.h>
  15. #include <sys/file.h>
  16. #include <sys/signal.h>
  17. #include "libsst.h"
  18.  
  19. #define MYBUF 256
  20.  
  21. int sst_fd;
  22.  
  23. main( argc, argv )
  24. int argc;
  25. char *argv[];
  26.     {
  27.     int rrtn, wrtn;
  28.     unsigned char buf[MYBUF];
  29.     int file_fd;
  30.     int argn, loop;
  31.     int sighandler();
  32.     char *usage = "usage:  %s [-l] [<file>]\n";
  33.  
  34.     sst_fd = sst_open( );
  35.     (void) signal( SIGHUP, sighandler );
  36.     (void) signal( SIGINT, sighandler );
  37.  
  38.     argn = 1;
  39.     loop = 0;
  40.  
  41.     if ( argn < argc && argv[argn][0] == '-' )
  42.     {
  43.     if ( argv[argn][1] == 'l' && argv[argn][2] == '\0' )
  44.         loop = 1;
  45.     else
  46.         {
  47.         fprintf( stderr, usage, argv[0] );
  48.         exit( 1 );
  49.         }
  50.     argn++;
  51.     }
  52.     if ( argn == argc )
  53.     {
  54.     if ( loop )
  55.         {
  56.         fprintf( stderr, "can't loop stdin, aye!\n" );
  57.         exit( 1 );
  58.         }
  59.     file_fd = 0;
  60.     }
  61.     else
  62.     {
  63.     file_fd = open( argv[argn], O_RDONLY );
  64.     if ( file_fd < 0 )
  65.         {
  66.         perror( argv[argn] );
  67.         exit( 1 );
  68.         }
  69.     argn++;
  70.     }
  71.     if ( argn != argc )
  72.     {
  73.     fprintf( stderr, usage, argv[0] );
  74.     exit( 1 );
  75.     }
  76.  
  77.     for ( ; ; )
  78.     {
  79.     rrtn = read( file_fd, buf, MYBUF );
  80.     if ( rrtn < 0 )
  81.         {
  82.         perror( "read" );
  83.         exit( 1 );
  84.         }
  85.     if ( rrtn == 0 )
  86.         {
  87.         if ( loop )
  88.         {
  89.         if ( lseek( file_fd, 0, L_SET ) == -1 )
  90.             {
  91.             perror( "lseek" );
  92.             exit( 1 );
  93.             }
  94.         continue;
  95.         }
  96.         else
  97.         break;
  98.         }
  99.  
  100.     for ( ; ; )
  101.         {
  102.         wrtn = write( sst_fd, buf, rrtn );
  103.         if ( wrtn < 0 )
  104.         {
  105.         perror( "write" );
  106.         exit( 1 );
  107.         }
  108.         if ( wrtn != 0 )
  109.         break;
  110.         usleep( 1000 );
  111.         }
  112.     if ( wrtn != rrtn )
  113.         {
  114.         fprintf( stderr, "play: rrtn = %d, wrtn = %d\n", rrtn, wrtn );
  115.         exit( 1 );
  116.         }
  117.     }
  118.  
  119.     sst_close( sst_fd );
  120.     exit( 0 );
  121.     }
  122.  
  123. int
  124. sighandler( )
  125.     {
  126.     sst_close( sst_fd );
  127.     exit( 1 );
  128.     }
  129.