This is stos.c in view mode; [Download] [Up]
#import "sndio.h"
// short to short output functions
void stos(short *sp_in,long begin,long end,int chan_num)
{
if(ascii_out == YES) astos(sp_in,begin,end,chan_num);
else if(chanspec == NULL) ncstos(sp_in,begin,end);
else cstos(sp_in,begin,end,chan_num);
}
// short to short--pipe or file output with no channel filtering
void ncstos(short *sp_in,long begin,long end,int chan_num)
{
register long i;
register short *sp;
register long full;
register int bmax = (BUFSIZE / sizeof(short)) - 1;
sp = sp_in;
full = -1;
for(i = begin; i < end; i++, sp++) {
sbuffer[++full] = *sp;
if(full == bmax) {
fwrite((void *) sbuffer,BUFSIZE,1,ofp);
full = -1;
}
}
if(full >= 0) fwrite((void *) sbuffer,((full + 1) * sizeof(short)),1,ofp);
}
// short to short--pipe or file output with channel filtering
void cstos(short *sp_in,long begin,long end,int chan_num)
{
register long i;
register short *sp;
register int nc;
register long full;
register int bmax = (BUFSIZE / sizeof(short)) - 1;
register int y = -1;
sp = sp_in;
nc = chan_num;
full = -1;
for(i = begin; i < end; i++, sp++) {
if(!chans[++y >= nc ? (y = 0) : y]) continue;
sbuffer[++full] = *sp;
if(full == bmax) {
fwrite((void *) sbuffer,BUFSIZE,1,ofp);
full = -1;
}
}
if(full >= 0) fwrite((void *) sbuffer,((full + 1) * sizeof(short)),1,ofp);
}
// short to short--ascii output
void astos(short *sp_in,long begin,long end,int chan_num)
{
register long i;
register short *sp;
register int nc;
register int y = -1;
int floor;
sp = sp_in;
nc = chan_num;
if(out_index == 's') {
for(i = begin; i < end; i++, sp++) {
if(chans[++y >= nc ? (y = 0) : y]) fprintf(ofp,"%d\t%d\n",(int) i / nc,*sp);
}
}
else if(out_index == 't') {
for(i = begin; i < end; i++, sp++) {
if(chans[++y >= nc ? (y = 0) : y]) {
floor = (int) i / nc;
fprintf(ofp,"%f\t%d\n",((float) floor) / samrate,*sp);
}
}
}
else {
for(i = begin; i < end; i++, sp++) {
if(chans[++y >= nc ? (y = 0) : y]) fprintf(ofp,"%d\n",*sp);
}
}
}
// short to short--"headless file" binary buffering before call to stos()
// we know dataSize but have no snd_pointer to data
void stoshf(FILE *bbfp,long begin,long end,int chan_total)
{
short *nhp;
int whole_frms; // number of sample frames to buffer
int pass_end;
whole_frms = (int) BUFSIZE / chan_total;
whole_frms *= chan_total;
pass_end = begin + whole_frms;
if(pass_end > end) pass_end = end;
while(begin < end) {
fread((void *) sinbuf,sizeof(short),pass_end - begin,bbfp);
nhp = sinbuf; // nhp subs for snd_pointer
stos(nhp,begin,pass_end,chan_total);
begin = pass_end;
pass_end = begin + whole_frms;
if(pass_end > end) pass_end = end;
}
}
// short to short--piped binary input buffering before call to stos()
// we don't know dataSize or have snd_pointer to data
void stosp(FILE *bbfp,long begin,long end,int chan_total)
{
short *nhp;
int whole_frms; // number of sample frames to buffer
int pass_end;
unsigned long num_in; // actual number of smaples in sobuf[]
whole_frms = (int) BUFSIZE / chan_total;
whole_frms *= chan_total; // want to process by whole frames
pass_end = begin + whole_frms;
if(pass_end > end) pass_end = end;
while(begin < end) {
num_in = fread((void *) sinbuf,sizeof(short),pass_end - begin,bbfp);
nhp = sinbuf; // nhp subs for snd_pointer
if(num_in < (pass_end - begin)) { // ran out of data
pass_end = begin + num_in;
stos(nhp,begin,pass_end,chan_total);
begin = end; // we are done
}
else {
stos(nhp,begin,pass_end,chan_total);
begin = pass_end;
pass_end = begin + whole_frms;
if(pass_end > end) pass_end = end;
}
}
}
// short to short--ascii input buffering before call to stos()
// we don't know dataSize or have snd_pointer to data
void stosa(FILE *bbfp,long begin,long end,int chan_total)
{
short *nhp;
int i_tmp;
int whole_frms; // number of sample frames to buffer
int pass_end;
unsigned long num_in; // actual number of smaples in sobuf[]
whole_frms = (int) BUFSIZE / chan_total;
whole_frms *= chan_total; // want to process by whole frames
pass_end = begin + whole_frms;
if(pass_end > end) pass_end = end;
while(begin < end) {
for(num_in = 0; num_in < whole_frms; num_in++) {
if(in_index == 's') {
if(fscanf(ifp,"%*d %d",&i_tmp) == EOF) break;
}
else if(in_index == 't') {
if(fscanf(ifp,"%*f %d",&i_tmp) == EOF) break;
}
else {
if(fscanf(ifp,"%d",&i_tmp) == EOF) break;
}
sinbuf[num_in] = (short) i_tmp;
}
nhp = sinbuf; // nhp subs for snd_pointer
if(num_in < (pass_end - begin)) { // ran out of data
pass_end = begin + num_in;
stos(nhp,begin,pass_end,chan_total);
begin = end; // we are done
}
else {
stos(nhp,begin,pass_end,chan_total);
begin = pass_end;
pass_end = begin + whole_frms;
if(pass_end > end) pass_end = end;
}
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.