This is play.c in view mode; [Download] [Up]
/* * This file plays sounds from a pipe. * * Paul Lindner (lindner@boombox.micro.umn.edu) */ #import <stdio.h> #import <sound/sound.h> #define NUM_BUFFERS 2 #define BUF_SIZE 1024 #define SECONDS 10000.0 static SNDSoundStruct *buffers[NUM_BUFFERS]; static int requestedDataSize, recordedDataSize = 0; static int lastBufNum; static void playit(int tag); /* * Called before the sample is played */ static int beforePlay(SNDSoundStruct *s, int tag, int err) { int size; if (err) fprintf(stderr, "beforePlay: %s\n", SNDSoundError(err)); size = fread((void*)((char*)s + s->dataLocation), 1, s->dataSize, stdin); /*** If the size is zero, then we're probably done, This is a really ugly hack though...... ***/ if (size == 0) sleep(1), exit(0); /*** This is probably the last buffer, so we'll fill the excess with zeros ***/ if (size != s->dataSize) { bzero((void*)((char*)s + s->dataLocation + size), BUF_SIZE-size); } } static int playDone(SNDSoundStruct *s, int tag, int err) /* * Called when a buffer has been played. */ { playit((lastBufNum + 1) % NUM_BUFFERS); return 0; } static void playit(int bufNum) /* * Initiates playing into a buffers[bufNum]. */ { int err; static int tag = 1; lastBufNum = bufNum; if (err = SNDStartPlaying(buffers[bufNum], tag++, 0, 0, beforePlay, playDone)) fprintf(stderr, "play: %s\n", SNDSoundError(err)); } /* * Allocate n sound buffers. */ static void init(int n, int size) { int i, err; SNDSoundStruct s; for (i = 0; i < n; i++) if (err = SNDAlloc(&buffers[i], size, SND_FORMAT_MULAW_8, SND_RATE_CODEC, 1, 4)) fprintf(stderr, "init: %s\n", SNDSoundError(err)); } static void startup(void) /* * Read the soundfile header. */ { SNDSoundStruct s; s.magic = SND_MAGIC; s.dataLocation = sizeof(SNDSoundStruct); s.dataSize = recordedDataSize; s.dataFormat = SND_FORMAT_MULAW_8; s.samplingRate = SND_RATE_CODEC; s.channelCount = 1; if (fread((void *)&s, sizeof(SNDSoundStruct), 1, stdin) != 1) fprintf(stderr, "cleanup: could not read header\n"); /* if (s.magic != SND_MAGIC) fprintf(stderr, "Not a valid sound file....\n"), exit(-1); */ } main(int argc, char *argv[]) { int i; requestedDataSize = SECONDS * SND_RATE_CODEC; startup(); init(NUM_BUFFERS, BUF_SIZE); for (i=0; i<NUM_BUFFERS; i++) playit(i); SNDWait(0); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.