This is NeXTplay.c in view mode; [Download] [Up]
/*****************************************************************/
/*****************************************************************/
/*** ***/
/*** ***/
/*** Play out a file on the NeXT ***/
/*** ***/
/*** ***/
/*** B. Stuyts 21-feb-94 ***/
/*** ***/
/*** ***/
/*****************************************************************/
/*****************************************************************/
#include <sound/sound.h>
#include <stdio.h>
#include <libc.h>
#include "proto.h"
#include "getargs.h"
#include "hplay.h"
#undef DEBUG
#define SAMP_RATE SND_RATE_CODEC
long samp_rate = SAMP_RATE;
SNDSoundStruct *sound;
int
audio_init(int argc, char *argv[])
{
int err;
int rate_set = 0;
#ifdef DEBUG
int i;
printf("audio_init: %d\n", argc);
for (i = 0; i < argc; i++)
printf("audio_init arg %d = %s\n", i, argv[i]);
#endif
argc = getargs("NeXT audio",argc, argv,
"r", "%d", &rate_set, "Sample rate",
NULL);
if (help_only)
return argc;
if (rate_set)
samp_rate = rate_set;
err = SNDAlloc(&sound, 1000000, SND_FORMAT_LINEAR_16, samp_rate, 1, 0);
if (err)
{
fprintf(stderr, "audio_init: %s\n", SNDSoundError(err));
exit(1);
}
return argc;
}
void
audio_play(int n, short *data)
{
int err;
#ifdef DEBUG
printf("audio_play: %d words\n", n);
#if 0
printf("audio_play: sound = %ld\n", sound);
printf("audio_play: dataLocation = %ld\n", sound->dataLocation);
printf("audio_play: sum = %ld\n", (char *) sound + sound->dataLocation);
#endif
#endif
if (n > 0)
{
/* Wait for previous sound to finish before changing
fields in sound
*/
err = SNDWait(0);
if (err)
{
fprintf(stderr, "SNDWait: %s\n", SNDSoundError(err));
exit(1);
}
sound->dataSize = n * sizeof(short);
/* Patch from benstn@olivetti.nl (Ben Stuyts)
Thanks to ugubser@avalon.unizh.ch for finding out why the NEXTSTEP
version of rsynth didn't work on Intel systems. As suspected, it was a
byte-order problem.
*/
#if i386
swab((char *) data, (char *) sound + sound->dataLocation, n * sizeof(short));
#else /* i386 */
bcopy(data, (char *) sound + sound->dataLocation, n * sizeof(short));
#endif
err = SNDStartPlaying(sound, 1, 5, 0, 0, 0);
if (err)
{
fprintf(stderr, "audio_play: %s\n", SNDSoundError(err));
exit(1);
}
}
}
void
audio_term()
{
int err;
#ifdef DEBUG
printf("audio_term\n");
#endif
err = SNDWait(0);
if (err)
{
fprintf(stderr, "audio_play: %s\n", SNDSoundError(err));
exit(1);
}
err = SNDFree(sound);
if (err)
{
fprintf(stderr, "audio_term: %s\n", SNDSoundError(err));
exit(1);
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.