home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer) / NeXT_Developer-3.3.iso / NextDeveloper / Examples / SoundAndMusic / SoundLibrary / recordchaintest.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-28  |  2.8 KB  |  111 lines

  1. /*
  2.  * recordchaintest.c - this test shows how to chain small recordings
  3.  * and append them to a soundfile.
  4.  * 
  5.  * 2/28/94 -- Made architecture independent (rkd).
  6.  */ 
  7.  
  8. #import    <stdio.h>
  9. #import    <sound/sound.h>
  10. #import <architecture/byte_order.h>
  11.  
  12. #define    NUM_BUFFERS    2
  13. #define    BUF_SIZE    8192
  14. #define    SECONDS        5.0
  15.  
  16. static SNDSoundStruct *buffers[NUM_BUFFERS];
  17. static FILE *sfp;
  18. static int requestedDataSize, recordedDataSize = 0;
  19. static int lastBufNum;
  20.  
  21. static void record(int tag);
  22.  
  23. static int recordDone(SNDSoundStruct *s, int tag, int err)
  24. /*
  25.  * Called when a buffer has been recorded.
  26.  * Appends the buffer to the soundfile and initiates recording into it again.
  27.  */
  28. {
  29.     if (recordedDataSize >= requestedDataSize)
  30.     return 0;
  31.     if (err)
  32.         fprintf(stderr, "recordDone: %s\n", SNDSoundError(err));
  33.     if (fwrite((void *)((char *)s + s->dataLocation), 1, s->dataSize, sfp) !=
  34.     s->dataSize)
  35.     fprintf(stderr, "recordDone: could not write data to soundfile\n");
  36.     recordedDataSize += s->dataSize;
  37.     record((lastBufNum + 1) % NUM_BUFFERS);
  38.     return 0;
  39. }
  40.  
  41. static void record(int bufNum)
  42. /*
  43.  * Initiates recording into a buffers[bufNum].
  44.  */
  45. {
  46.     int err;
  47.     static int tag = 1;
  48.     
  49.     lastBufNum = bufNum;
  50.     if (err = SNDStartRecording(buffers[bufNum], tag++, 0, 0, SND_NULL_FUN,
  51.                 recordDone))
  52.         fprintf(stderr, "record: %s\n", SNDSoundError(err));
  53. }
  54.  
  55. static void init(int n, int size, char *fileName)
  56. /*
  57.  * Allocate n sound buffers.
  58.  * Creates the soundfile.
  59.  */
  60. {
  61.     int i, err;
  62.     SNDSoundStruct s;
  63.  
  64.     for (i = 0; i < n; i++)
  65.         if (err = SNDAlloc(&buffers[i], size, SND_FORMAT_MULAW_8,
  66.                SND_RATE_CODEC, 1, 4))
  67.         fprintf(stderr, "init: %s\n", SNDSoundError(err));
  68.     if ((sfp = fopen(fileName, "w")) == NULL)
  69.     fprintf(stderr, "init: could not open soundfile %s\n", fileName);
  70.     if (fwrite((void *)&s, sizeof(SNDSoundStruct), 1, sfp) != 1)
  71.     fprintf(stderr, "init: could not write dummy header to soundfile\n");
  72. }
  73.  
  74. static void cleanup(void)
  75. /*
  76.  * Write the soundfile header.
  77.  */
  78. {
  79.     SNDSoundStruct s;
  80.  
  81.     s.magic = NXSwapHostIntToBig(SND_MAGIC);
  82.     s.dataLocation = NXSwapHostIntToBig(sizeof(SNDSoundStruct));
  83.     s.dataSize = NXSwapHostIntToBig(recordedDataSize);
  84.     s.dataFormat = NXSwapHostIntToBig(SND_FORMAT_MULAW_8);
  85.     s.samplingRate = NXSwapHostIntToBig(SND_RATE_CODEC);
  86.     s.channelCount = NXSwapHostIntToBig(1);
  87.     s.info[0] = '\0';
  88.     
  89.     rewind(sfp);
  90.     if (fwrite((void *)&s, sizeof(SNDSoundStruct), 1, sfp) != 1)
  91.     fprintf(stderr, "cleanup: could not write header to soundfile\n");
  92. }
  93.  
  94. main(int argc, char *argv[])
  95. {
  96.     int i;
  97.  
  98.     if (argc != 2) {
  99.     fprintf(stderr, "usage: recordchaintest file\n");
  100.     exit(1);
  101.     }
  102.  
  103.     requestedDataSize = SECONDS * SND_RATE_CODEC;
  104.     init(NUM_BUFFERS, BUF_SIZE, argv[1]);
  105.     printf("recording...\n");
  106.     for (i = 0; i < NUM_BUFFERS; i++)
  107.     record(i);
  108.     SNDWait(0);
  109.     cleanup();
  110. }
  111.