This is SNDplay.c in view mode; [Download] [Up]
/*
* SNDplay
*
* Version 1.0 Written 1994 by Amir Guindehi
*
* Plays: Any .snd file and any .snd.gz files
*
*/
#include <sound/sound.h>
#include <stdio.h>
#include <libc.h>
#define VERSION "SNDplay 1.0 (01.04.94) written by Amir Guindehi.\n"
#define USAGE "\nUsage: SNDplay [-vh] file1 {file2 ...}\n" \
" file = name[.snd[.gz]]\n\n"
#define HELP VERSION USAGE \
" -v : Switch to verbose mode.\n" \
" -h : This help text.\n"
#define DEFAULT_RATE 22050
#define GZIP_PATH "/usr/bin/gunzip -c"
int verbose = 0, errflag = 0;
char rmfile[1024] = "\0";
void sig_handler(int sig)
{
signal(sig, sig_handler);
if (verbose)
fprintf(stderr, "Got signal %d.\n", sig);
switch (sig)
{
case SIGTERM:
case SIGQUIT:
case SIGINT:
if (rmfile)
{
if (verbose)
fprintf(stdout, "Unlinking temporary uncompressed sound.\n");
unlink(rmfile);
}
exit(0);
}
return;
}
int playfile(char *name)
{
SNDSoundStruct *sound;
int err;
if (verbose) fprintf(stdout, "Allocating sound structure.\n");
err = SNDAlloc(&sound, 100000, SND_FORMAT_LINEAR_16, DEFAULT_RATE, 1, 0);
if (err)
{
fprintf(stderr,"playfile: Failed to allocate sound structure.\n");
exit(1);
}
if (verbose) fprintf(stdout, "Reading sound file '%s'.\n", name);
err = SNDReadSoundfile(name, &sound);
if (err)
{
fprintf(stderr,"playfile: Failed to load sound.\n");
exit(1);
}
if (rmfile)
{
if (verbose)
fprintf(stdout, "Unlinking temporary uncompressed sound.\n");
unlink(rmfile);
*rmfile = '\0';
}
if (verbose) fprintf(stdout, "Waiting for empty sound queue ...\n");
err = SNDWait(0);
if (err)
{
fprintf(stderr, "playfile: %s\n", SNDSoundError(err));
exit(1);
}
if (verbose) fprintf(stdout, "Start playing ...\n");
if (verbose)
{
fprintf(stdout, "SND-Type: %d samples, %d sampling rate, %d channels.\n",
SNDSampleCount(sound), sound->samplingRate, sound->channelCount);
fprintf(stdout, "SND-Encoding: ");
switch (sound->dataFormat)
{
case SND_FORMAT_UNSPECIFIED : fprintf(stdout, "Unspecified\n"); break;
case SND_FORMAT_MULAW_8 : fprintf(stdout, "Mulaw 8\n"); break;
case SND_FORMAT_LINEAR_8 : fprintf(stdout, "Linear 8\n"); break;
case SND_FORMAT_LINEAR_16 : fprintf(stdout, "Linear 16\n"); break;
case SND_FORMAT_LINEAR_24 : fprintf(stdout, "Linear 24\n"); break;
case SND_FORMAT_LINEAR_32 : fprintf(stdout, "Linear 32\n"); break;
case SND_FORMAT_FLOAT : fprintf(stdout, "Float\n"); break;
case SND_FORMAT_DOUBLE : fprintf(stdout, "Double\n"); break;
case SND_FORMAT_INDIRECT : fprintf(stdout, "Indirect\n"); break;
case SND_FORMAT_DISPLAY : fprintf(stdout, "Display\n"); break;
case SND_FORMAT_MULAW_SQUELCH: fprintf(stdout, "Mulaw squelch\n"); break;
case SND_FORMAT_EMPHASIZED : fprintf(stdout, "Emphasized\n"); break;
case SND_FORMAT_COMPRESSED : fprintf(stdout, "Compressed\n"); break;
case SND_FORMAT_COMPRESSED_EMPHASIZED: fprintf(stdout, "Compressed emphasized\n"); break;
default : fprintf(stdout, "Unknown format.\n"); break;
}
}
err = SNDStartPlaying(sound, 1, 5, 0, 0, 0);
if (err)
{
fprintf(stderr, "playfile: %s\n", SNDSoundError(err));
exit(1);
}
if (verbose) fprintf(stdout, "Waiting for end of sound ...\n");
err = SNDWait(1);
if (err)
{
fprintf(stderr, "playfile: %s\n", SNDSoundError(err));
exit(1);
}
if (verbose) fprintf(stdout, "Freeing sound structure.\n");
SNDFree(sound);
return 0;
}
int main(int argc, char **argv)
{
int c, i;
extern int optind;
while ((c = getopt(argc, argv, "vh")) != EOF)
switch (c)
{
case 'h':
fprintf(stdout, HELP);
exit(0);
case 'v':
verbose++;
break;
default:
errflag++;
break;
}
if (errflag || (argc-optind < 1))
{
fprintf(stderr, VERSION USAGE);
exit(2);
}
if (verbose) fprintf(stdout, VERSION);
signal(SIGQUIT, sig_handler);
signal(SIGTERM, sig_handler);
signal(SIGINT, sig_handler);
for (i=optind; i<argc; i++)
{
char name[1024];
char *p;
*rmfile = '\0';
strcpy(name, argv[i]);
if (p = strchr(name,'.'))
{
char *s;
if (s = strrchr(p,'.'))
{
/* A *.*.* file ... test for .snd.gz */
if ((!strcmp(s,".gz")) || (!strcmp(s,".z")) || (!strcmp(s,".Z")))
{
char buf[1024];
int pid;
/* a .gz file -> uncompress it */
if (verbose)
fprintf(stdout, "Gzip compressed ... will uncompress.\n");
pid = getpid();
sprintf(buf, GZIP_PATH " %s > /tmp/tmp%d.snd",
name, pid);
system(buf);
sprintf(name,"/tmp/tmp%d.snd", pid);
strcpy(rmfile, name);
}
}
else
{
/* A *.* file ... test for .snd */
}
}
else strcat(name, ".snd");
playfile(name);
}
exit(0);
}These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.