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 >
Wrap
Text File
|
1991-08-13
|
2KB
|
117 lines
/*
* 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);
}