home *** CD-ROM | disk | FTP | other *** search
/ ftp.muug.mb.ca / 2014.06.ftp.muug.mb.ca.tar / ftp.muug.mb.ca / pub / src / gopher / gopher1.01 / misc / NeXT / play.c < prev    next >
Text File  |  1991-08-13  |  2KB  |  117 lines

  1. /*
  2.  * This file plays sounds from a pipe.
  3.  * 
  4.  * Paul Lindner (lindner@boombox.micro.umn.edu)
  5.  */ 
  6. #import    <stdio.h>
  7. #import    <sound/sound.h>
  8.  
  9. #define    NUM_BUFFERS    2
  10. #define    BUF_SIZE    1024
  11. #define    SECONDS        10000.0
  12.  
  13. static SNDSoundStruct *buffers[NUM_BUFFERS];
  14. static int requestedDataSize, recordedDataSize = 0;
  15. static int lastBufNum;
  16.  
  17. static void playit(int tag);
  18.  
  19. /*
  20.  * Called before the sample is played
  21.  */
  22.  
  23. static int beforePlay(SNDSoundStruct *s, int tag, int err)
  24. {
  25.      int size;
  26.  
  27.      if (err)
  28.       fprintf(stderr, "beforePlay: %s\n", SNDSoundError(err));
  29.  
  30.      size = fread((void*)((char*)s + s->dataLocation), 1, s->dataSize, stdin);
  31.  
  32.      /*** If the size is zero, then we're probably done,
  33.           This is a really ugly hack though...... ***/
  34.  
  35.      if (size == 0)
  36.           sleep(1), exit(0);
  37.  
  38.      /*** This is probably the last buffer, so we'll fill the excess with
  39.           zeros ***/
  40.      if (size != s->dataSize) {
  41.     bzero((void*)((char*)s + s->dataLocation + size), BUF_SIZE-size);
  42.      }
  43. }
  44.  
  45. static int playDone(SNDSoundStruct *s, int tag, int err)
  46. /*
  47.  * Called when a buffer has been played.
  48.  */
  49. {
  50.     playit((lastBufNum + 1) % NUM_BUFFERS);
  51.     return 0;
  52. }
  53.  
  54. static void playit(int bufNum)
  55. /*
  56.  * Initiates playing into a buffers[bufNum].
  57.  */
  58. {
  59.     int err;
  60.     static int tag = 1;
  61.     
  62.     lastBufNum = bufNum;
  63.     if (err = SNDStartPlaying(buffers[bufNum], tag++, 0, 0, beforePlay,
  64.                 playDone))
  65.         fprintf(stderr, "play: %s\n", SNDSoundError(err));
  66. }
  67.  
  68.  
  69. /*
  70.  * Allocate n sound buffers.
  71.  */
  72. static void init(int n, int size)
  73. {
  74.     int i, err;
  75.     SNDSoundStruct s;
  76.  
  77.     for (i = 0; i < n; i++)
  78.         if (err = SNDAlloc(&buffers[i], size, SND_FORMAT_MULAW_8,
  79.                SND_RATE_CODEC, 1, 4))
  80.         fprintf(stderr, "init: %s\n", SNDSoundError(err));
  81. }
  82.  
  83. static void startup(void)
  84. /*
  85.  * Read the soundfile header.
  86.  */
  87. {
  88.     SNDSoundStruct s;
  89.  
  90.     s.magic = SND_MAGIC;
  91.     s.dataLocation = sizeof(SNDSoundStruct);
  92.     s.dataSize = recordedDataSize;
  93.     s.dataFormat = SND_FORMAT_MULAW_8;
  94.     s.samplingRate = SND_RATE_CODEC;
  95.     s.channelCount = 1;
  96.  
  97.     if (fread((void *)&s, sizeof(SNDSoundStruct), 1, stdin) != 1)
  98.     fprintf(stderr, "cleanup: could not read header\n");
  99.  
  100. /*    if (s.magic != SND_MAGIC)
  101.      fprintf(stderr, "Not a valid sound file....\n"), exit(-1);
  102. */
  103. }
  104.  
  105. main(int argc, char *argv[])
  106. {
  107.     int i;
  108.  
  109.     requestedDataSize = SECONDS * SND_RATE_CODEC;
  110.     startup();
  111.     init(NUM_BUFFERS, BUF_SIZE);
  112.     for (i=0; i<NUM_BUFFERS; i++)
  113.         playit(i);
  114.     SNDWait(0);
  115. }
  116.  
  117.