ftp.nice.ch/pub/next/unix/audio/cmusic.bs.N.tar.gz#/NeXT_updates/sndio/ftos.c

This is ftos.c in view mode; [Download] [Up]

#import "sndio.h"

// float to short output conversion functions

int ftos(float *sp_in,long begin,long end,int chan_num)
{
    if(ascii_out == YES)	return(aftos(sp_in,begin,end,chan_num));

    else if(chanspec == NULL)	return(ncftos(sp_in,begin,end));

    else			return(cftos(sp_in,begin,end,chan_num));
}

// float to short--pipe or file output with no channel filtering

int ncftos(float *sp_in,long begin,long end,int chan_num)
{
    int			clip = 0;
    register long	i;
    register float	*sp;
    register long	full;
    register int	bmax = (BUFSIZE / sizeof(short)) - 1;

    sp = sp_in;

    full = -1;

    for(i = begin; i < end; i++, sp++) {

	if(*sp > 1.0) {
	    *sp = 1.0;		clip++;
	}
	else if(*sp < -1.0) {
	    *sp = -1.0;		clip++;
	}
	sbuffer[++full] = (short) (*sp * 32767.0);

	if(full == bmax) {
	    fwrite((void *) sbuffer,BUFSIZE,1,ofp);
	    full = -1;
	}
    }
    if(full >= 0)	fwrite((void *) sbuffer,((full + 1) * sizeof(short)),1,ofp);

    return(clip);
}

// float to short--pipe or file output with channel filtering

int cftos(float *sp_in,long begin,long end,int chan_num)
{
    int			clip = 0;
    register long	i;
    register float	*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;

	if(*sp > 1.0) {
	    *sp = 1.0;		clip++;
	}
	else if(*sp < -1.0) {
	    *sp = -1.0;		clip++;
	}
	sbuffer[++full] = (short) (*sp * 32767.0);

	if(full == bmax) {
	    fwrite((void *) sbuffer,BUFSIZE,1,ofp);
	    full = -1;
	}
    }
    if(full >= 0)	fwrite((void *) sbuffer,((full + 1) * sizeof(short)),1,ofp);

    return(clip);
}

// float to short--ascii output

int aftos(float *sp_in,long begin,long end,int chan_num)
{
    int			clip = 0;
    register long	i;
    register float	*sp;
    register int	nc;
    register int	y = -1;
    int			floor;

    sp = sp_in;
    nc = chan_num;

    for(i = begin; i < end; i++, sp++) {

	if(chans[++y >= nc ? (y = 0) : y]) {

	    if(*sp > 1.0) {
		*sp = 1.0;		clip++;
	    }
	    else if(*sp < -1.0) {
		*sp = -1.0;		clip++;
	    }
	    if(out_index == 's')    fprintf(ofp,"%d\t%d\n",(int) i / nc,(int) (*sp * 32767.0));

	    else if(out_index == 't') {

		floor = (int) i / nc;

		fprintf(ofp,"%f\t%d\n",((float) floor) / samrate,(int) (*sp * 32767.0));
	    }
	    else	fprintf(ofp,"%d\n",(int) (*sp * 32767.0));
	}
    }
    return(clip);
}

// float to short--"headless file" binary buffering before call to ftos()
//		    we know dataSize but have no snd_pointer to data

int ftoshf(FILE *bbfp,long begin,long end,int chan_total)
{
    float	*nhp;
    int		whole_frms;		// number of sample frames to buffer
    int		pass_end;
    int		clip = 0;

    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 *) finbuf,(sizeof(float) * (pass_end - begin)),1,bbfp);

	nhp = finbuf;			// nhp subs for snd_pointer

	clip += ftos(nhp,begin,pass_end,chan_total);

	begin = pass_end;

	pass_end = begin + whole_frms;

	if(pass_end > end)	pass_end = end;
    }
    return(clip);
}

// float to short--piped binary input buffering before call to ftos()
//		    we don't know dataSize or have snd_pointer to data

int ftosp(FILE *bbfp,long begin,long end,int chan_total)
{
    float		*nhp;
    int			whole_frms;	// number of sample frames to buffer
    int			pass_end;
    unsigned long	num_in;		// actual number of smaples in sobuf[]
    int			clip = 0;

    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 *) finbuf,sizeof(float),pass_end - begin,bbfp);

	nhp = finbuf;			// nhp subs for snd_pointer
    
	if(num_in < (pass_end - begin)) {	// ran out of data

	    pass_end = begin + num_in;

	    clip += ftos(nhp,begin,pass_end,chan_total);

	    begin = end;		// we are done
	}
	else {
    
	    clip += ftos(nhp,begin,pass_end,chan_total);
    
	    begin = pass_end;
    
	    pass_end = begin + whole_frms;
    
	    if(pass_end > end)	pass_end = end;
	}
    }
    return(clip);
}

// float to short--ascii input buffering before call to ftos()
//		    we don't know dataSize or have snd_pointer to data

int ftosa(FILE *bbfp,long begin,long end,int chan_total)
{
    float		*nhp;
    float		f_tmp;
    int			whole_frms;	// number of sample frames to buffer
    int			pass_end;
    unsigned long	num_in;		// actual number of smaples in sobuf[]
    int			clip = 0;

    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 %f",&f_tmp) == EOF)	break;		
	    }
	    else if(in_index == 't') {
	
		if(fscanf(ifp,"%*f %f",&f_tmp) == EOF)	break;		
	    }
	    else {
		if(fscanf(ifp,"%f",&f_tmp) == EOF)	break;		
	    }
	    finbuf[num_in] = f_tmp;
	}
	nhp = finbuf;			// nhp subs for snd_pointer
    
	if(num_in < (pass_end - begin)) {	// ran out of data

	    pass_end = begin + num_in;

	    clip += ftos(nhp,begin,pass_end,chan_total);

	    begin = end;		// we are done
	}
	else {
    
	    clip += ftos(nhp,begin,pass_end,chan_total);
    
	    begin = pass_end;
    
	    pass_end = begin + whole_frms;
    
	    if(pass_end > end)	pass_end = end;
	}
    }
    return(clip);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.