This is sndulaw.c in view mode; [Download] [Up]
/*
* Author : Reimer A. Mellin
* Date : 4.12.1991
* no copyrights
*
*
* ulaw: based on recordchaintest.c
* it writes a endless stream of Sound to stdout until terminated or
* interrupted.
* sndrecord can't be used, since it can not write to stdout :-(
*/
#import <stdio.h>
#import <signal.h>
#import <sound/sound.h>
#define NUM_BUFFERS 5
#define BUF_SIZE 8000
static SNDSoundStruct *buffers[NUM_BUFFERS];
static FILE *sfp;
static void record(int tag);
static int recordDone(SNDSoundStruct *s, int tag, int err)
/*
* Called when a buffer has been recorded.
* Appends the buffer to the soundfile.
*/
{
if (err)
fprintf(stderr, "recordDone: %s\n", SNDSoundError(err));
if (fwrite((void *)((char *)s + s->dataLocation), 1, s->dataSize, sfp) !=
s->dataSize)
fprintf(stderr, "recordDone: could not write data to soundfile\n");
return 0;
}
static void record(int bufNum)
/*
* Initiates recording into a buffers[bufNum].
*/
{
int err;
if (err = SNDStartRecording(buffers[bufNum], bufNum+1, 0, 0, SND_NULL_FUN,
recordDone))
fprintf(stderr, "record: %s\n", SNDSoundError(err));
}
static void init(int n, int size)
/*
* Allocate n sound buffers.
* Creates the soundfile.
*/
{
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));
s.magic = SND_MAGIC;
s.dataLocation = sizeof(SNDSoundStruct);
s.dataSize = 0;
s.dataFormat = SND_FORMAT_MULAW_8;
s.samplingRate = SND_RATE_CODEC;
s.channelCount = 1;
(void)strcpy( s.info, "ram");
if (fwrite((void *)&s, sizeof(SNDSoundStruct), 1, sfp) != 1)
fprintf(stderr, "init: could not write dummy header to soundfile\n");
}
static void cleanup(void)
/*
* Write the soundfile header.
*/
{
SNDSoundStruct s;
s.magic = SND_MAGIC;
s.dataLocation = sizeof(SNDSoundStruct);
s.dataSize = 0;
s.dataFormat = SND_FORMAT_MULAW_8;
s.samplingRate = SND_RATE_CODEC;
s.channelCount = 1;
(void)strcpy( s.info, "ram");
if(!isatty(fileno(sfp))) {
rewind(sfp);
if (fwrite((void *)&s, sizeof(SNDSoundStruct), 1, sfp) != 1)
fprintf(stderr, "cleanup: could not write header to soundfile\n");
}
fflush(sfp);
exit(0);
}
main(int argc, char *argv[])
{
int i;
if( argc > 1 ) {
fprintf(stderr, "%s: Records sound from CODEC and writes it to stdout\n",
argv[0]);
exit(1);
}
sfp = stdout;
(void)signal( SIGTERM, (void *)cleanup);
(void)signal( SIGINT, (void *)cleanup);
/* prepare sound and start the first 5 recordings */
init(NUM_BUFFERS, BUF_SIZE);
for (i = 0; i < NUM_BUFFERS; i++) {
record(i);
}
for(;;){
/* As soon as the first is finished, restart it */
for (i = 0; i < NUM_BUFFERS; i++) {
SNDWait(i+1);
record(i);
}
}
cleanup();
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.