home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.ee.lbl.gov
/
2014.05.ftp.ee.lbl.gov.tar
/
ftp.ee.lbl.gov
/
sst.tar.Z
/
sst.tar
/
sst
/
mactosun.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-01-10
|
5KB
|
163 lines
/************************************************************************/
/* Copyright 1989 by Rich Gopstein and Harris Corporation */
/* */
/* Permission to use, copy, modify, and distribute this software */
/* and its documentation for any purpose and without fee is */
/* hereby granted, provided that the above copyright notice */
/* appears in all copies and that both that copyright notice and */
/* this permission notice appear in supporting documentation, and */
/* that the name of Rich Gopstein and Harris Corporation not be */
/* used in advertising or publicity pertaining to distribution */
/* of the software without specific, written prior permission. */
/* Rich Gopstein and Harris Corporation make no representations */
/* about the suitability of this software for any purpose. It */
/* provided "as is" without express or implied warranty. */
/************************************************************************/
/************************************************************************/
/* mactosun.c - Convert sampled audio files into uLAW format for the */
/* Sparcstation 1. */
/* Send comments to ..!rutgers!soleil!gopstein */
/* Modified by jef@helios.ee.lbl.gov. */
/************************************************************************/
#include <stdio.h>
#define DEFAULT_FREQUENCY 11000
/* convert two's complement ch into uLAW format */
unsigned int cvt(ch)
int ch;
{
int mask;
if (ch < 0) {
ch = -ch;
mask = 0x7f;
} else {
mask = 0xff;
}
if (ch < 32) {
ch = 0xF0 | 15 - (ch / 2);
} else if (ch < 96) {
ch = 0xE0 | 15 - (ch - 32) / 4;
} else if (ch < 224) {
ch = 0xD0 | 15 - (ch - 96) / 8;
} else if (ch < 480) {
ch = 0xC0 | 15 - (ch - 224) / 16;
} else if (ch < 992) {
ch = 0xB0 | 15 - (ch - 480) / 32;
} else if (ch < 2016) {
ch = 0xA0 | 15 - (ch - 992) / 64;
} else if (ch < 4064) {
ch = 0x90 | 15 - (ch - 2016) / 128;
} else if (ch < 8160) {
ch = 0x80 | 15 - (ch - 4064) / 256;
} else {
ch = 0x80;
}
return (mask & ch);
}
/*******************************************************
/* */
/* Usage is "mactosun [-f frequency] [infile]" */
/* */
/* "frequency" is the samples per second of the infile */
/* The output is always 8000 samples per second. */
/* */
/*******************************************************/
/***********************************************************************/
/* */
/* The input file is expected to be a stream of one-byte excess-128 */
/* samples. Each sample is converted to 2's complement by subtracting */
/* 128, then converted to uLAW and output. We calculate the proper */
/* number of input bytes to skip in order to make the sample frequency */
/* convert to 8000/sec properly. Interpolation could be added, but it */
/* doesn't appear to be necessary. */
/* */
/***********************************************************************/
main(argc, argv)
int argc;
char *argv[];
{
float sum = 0;
float frequency, increment;
unsigned char ch;
unsigned char ulaw;
int argn, chr;
char *usage = "usage: %s [-f frequency] [infile]\n";
argn = 1;
frequency = DEFAULT_FREQUENCY;
if (argn + 1 < argc && argv[argn][0] == '-') {
if (strcmp(argv[argn], "-f") != 0) {
fprintf(stderr, usage, argv[0]);
exit(1);
} else {
++argn;
frequency = atoi(argv[argn]);
++argn;
}
}
if ( argn < argc ) {
if (freopen(argv[argn], "r", stdin) == NULL) {
perror("Error opening infile");
exit(0);
}
++argn;
}
if (argn != argc) {
fprintf(stderr, usage, argv[0]);
exit(1);
}
/* increment is the number of bytes to read each time */
increment = frequency / 8000;
ch = fgetc(stdin);
while (!feof(stdin)) {
/* convert the excess 128 to two's complement */
chr = 0x80 - ch;
/* increase the volume */
/* convert to uLAW */
ulaw = cvt(chr * 16);
/* output it */
fputc((char) ulaw, stdout);
/* skip enough input bytes to compensate for sampling frequency diff */
sum += increment;
while(sum > 0) {
if (!feof(stdin)) ch = fgetc(stdin);
sum--;
}
}
fclose(stdin);
fclose(stdout);
}