This is sndscale.c in view mode; [Download] [Up]
# include <stdio.h>
# include <local/sfheader.h>
# include <sys/file.h>
# include <carl/carl.h>
# include <carl/libsf.h>
# include <sys/file.h>
/* %W %G% IRCAM */
#define HIGHBIT 0100000
short aflg = 1, dflg;
char newname[1024];
main(argc,argv)
char **argv;
{
int fd,rnum,bufs = 1,fdone = 0;
double rdur = 1.0 ,zdur = 2.0 ,atof();
register double x;
double inc = 0;
long zerodur , rampdur ,totbytes ;
SFHEADER hd;
char *getsfname(), ch;
unsigned short buf[8*1024];
register unsigned short *sptr;
short ask;
int ofd;
short firstin = 0,firstout = 0;
setbuf(stdout,NULL);
/* rdur is the ramp time and zdur is the duration of zeros */
while ((ch = crack(argc, argv, "na|d|f|", TRUE)) != NULL) {
switch (ch) {
case 'a':
zdur = sfexpr(arg_option, 1.0);
if (zdur == 0)
aflg = 0;
aflg++;
break;
case 'd':
rdur = sfexpr(arg_option, 1.0);
dflg++;
break;
case 'z':
aflg = 0; /* No added zeros */
break;
case 'f':
strcpy(newname,getsfname(arg_option));
break;
}
}
if((fd = open(getsfname(argv[arg_index]),O_RDWR)) < 0) {
perror(getsfname(argv[arg_index]));
exit(1);
}
if(rheader(fd,&hd)) {
printf("Bad header read\n");
exit(1);
}
if(sfclass(&hd) != SF_SHORT) {
printf("File not short integers\n");
exit(1);
}
if(aflg) {
if(*newname == NULL)
sprintf(newname,"%s.%s",getsfname(argv[arg_index]),"scale");
if((ofd = open(newname,O_CREAT | O_RDWR | O_TRUNC,0644)) < 0) {
printf("Can't creat new soundfile [%s]\n",newname);
exit(1);
}
if(wheader(ofd,&hd)) {
printf("Bad header read\n");
exit(1);
}
}
else
ofd = fd;
totbytes = 0;
rampdur = rdur * (double) (sfsrate(&hd) * sfclass(&hd) * sfchans(&hd));
zerodur = (zdur + rdur) * (double) (sfsrate(&hd) * sfclass(&hd) * sfchans(&hd));
if(rampdur != 0)
inc = 1./ (double) (rampdur / sfclass(&hd)); /* samples */
if(aflg)
bzero((char *) buf,sizeof(buf));
else
zerodur = rampdur;
x = 0;
if(rampdur)
fprintf(stdout,"Fade in (%d bytes) ",rampdur);
for(;;) {
if(totbytes < rampdur)
if(rampdur - totbytes < 16 * 1024)
ask = rampdur - totbytes;
else
if(zerodur && zerodur - rampdur < 16* 1024)
ask = zerodur - rampdur;
else
ask = 16 * 1024;
else
if(totbytes < zerodur) {
if(firstin == 0) {
fprintf(stdout," (zeros %d bytes) ",
zerodur - rampdur);
firstin++;
}
if(zerodur - totbytes < 16 * 1024)
ask = zerodur - totbytes;
else
ask = 16 * 1024;
}
else
ask = 16* 1024;
if(!aflg || totbytes >= zerodur)
rnum = read(fd,buf, ask);
else { /* clear out buffer */
rnum = ask;
bzero((char *) buf, rnum);
}
if(rnum <= 0)
break;
for(sptr = buf; sptr < &buf[rnum/sfclass(&hd)];sptr++) {
*sptr += HIGHBIT;
*sptr >>= 1;
}
if(totbytes < rampdur) { /* do ramp */
register short *fred;
for(fred = (short *) buf;
fred < (short *) &buf[rnum/sizeof(short)]; fred++ ) {
*fred = (short) ((double) *fred * x);
x += inc;
}
}
if(totbytes > zerodur)
if(!fdone) {
printf("\n");
bufs = 1;
fdone++;
}
if(fd == ofd)
lseek(fd,-rnum,1);
write(ofd,buf,rnum);
fprintf(stdout,".%c",bufs % 10 ? ' ' : '\n');
bufs++;
totbytes += rnum;
}
if(rnum < 0) {
printf("Bad read\n");
exit(1);
}
/* At end of file */
if(rampdur || zerodur) {
if(aflg) {
zerodur -= rampdur; /* amount of zeros to add */
fprintf(stdout,"\n(zeros %d bytes) ",zerodur);
}
bufs = 1;
x = 1;
if(ofd == fd)
lseek(fd,-rampdur,2); /* Start fade out */
else
bzero((char *) buf,sizeof(buf));
for(;;) {
register short *fred;
if(!aflg)
rnum = read(fd,buf,16*1024);
else {
if(zerodur > 0)
rnum = zerodur < 16 * 1024 ? zerodur : 16 *1024;
else
rnum = rampdur < 16 * 1024 ? rampdur : 16 *1024;
for(sptr = buf; sptr < &buf[rnum/sfclass(&hd)];sptr++) {
*sptr = HIGHBIT; /* That is zero + */
*sptr >>= 1;
}
}
if(rnum <= 0)
break;
if(zerodur <= 0) {
if(firstout == 0) {
fprintf(stdout," Fade out (%d bytes)",
rampdur);
firstout++;
}
for(fred = (short *) buf;
fred < (short *)&buf[rnum/sfclass(&hd)]; fred++ ) {
*fred = (short) ((double) *fred * x);
x -= inc;
}
}
if(ofd == fd)
lseek(fd,-rnum,1);
else
if(zerodur > 0)
zerodur -= rnum;
else
rampdur -= rnum;
write(ofd,buf,rnum);
fprintf(stdout,".%c",bufs % 10 ? ' ' : '\n');
bufs++;
}
}
printf("\nDone\n");
close(fd);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.