This is sndreverse.c in view mode; [Download] [Up]
/* would be nice to have general-purpose splice program.
-s input skip, -o output skip -d dur -r reverse?? */
# include <stdio.h>
#ifndef LINT
static char SccsId[] = "@(#)sndreverse.c 1.4 10/18/85 IRCAM";
#endif
# include <sys/types.h>
# include <sys/stat.h>
# include <sys/file.h>
# include "../H/sfheader.h"
# define SKIP error++; goto skip
/* This program is designed to reverse existing soundfiles.
The channels of the soundfile are kept in the original order
contrary to what an analog tape would do. */
main(argc,argv)
int argc;
char *argv[];
{
int sfd1,sfd2;
register int i;
off_t bytes;
int readbyte,error = 0;
SFHEADER hd;
char *forward,*back,*malloc();
struct stat st;
int backsu,units,nsu,nextsu;
char newname[1024];
/* Get memory for buffers */
forward = malloc(SF_BUFSIZE);
back = malloc(SF_BUFSIZE);
if(!forward || ! back) {
fprintf(stderr,"Bad allocation for buffers\n");
exit(1);
}
while(--argc) { /* Soundfile names from command line */
if((sfd1 = open(*++argv,O_RDONLY)) == -1) {
fprintf(stderr,"Can't open soundfile %s\n",*argv);
SKIP;
}
if(fstat(sfd1,&st) == -1) {
fprintf(stderr,"Can't fstat %s\n",*argv);
close(sfd1);
SKIP;
}
if(rheader(sfd1,&hd)) {
fprintf(stderr,"Read header for %s failed\n",*argv);
close(sfd1);
SKIP;
}
skip: printf("%s\n",*(argv+1));
/*
if(!strncmp("-f",*(argv+1),2)) {
argc -= 2;
argv += 2;
strcpy(newname,*argv);
}
else {
*/
strncpy(newname,*argv,1024-1);
strcat(newname,".r");
/*
}
*/
if(error) {
error = 0;
continue;
}
if((sfd2 = open(newname,O_CREAT|O_TRUNC|O_WRONLY,0644)) < 0) {
fprintf(stderr,"Can't create %s\n",newname);
close(sfd1);
continue;
}
if(wheader(sfd2,&hd)) { /* Duplicate header */
fprintf(stderr,"Write to header failed.\n");
close(sfd1);
close(sfd2);
continue;
}
bytes = sfbsize(&st);
readbyte = bytes % SF_BUFSIZE;
if(sflseek(sfd1,(long) -readbyte,2) == -1) {
fprintf(stderr,"Bad seek\n");
exit(1);
}
while(bytes > 0) { /* For all of the samples */
if((readbyte = read(sfd1,forward,SF_BUFSIZE)) < 0) {
fprintf(stderr,"Bad read on soundfile %s\n",*argv);
exit(1);
}
/* units = samples per read.
nsu = number of sample units per read.
(sample unit = all channels
for this sample slot).
nextsu = next sample unit.
backsu = current backward sample unit
starting channel. */
units = readbyte / sfclass(&hd);
nextsu = 0;
nsu = units - sfchans(&hd);
if(sfclass(&hd) == SF_FLOAT) { /* Do floating point file */
register float *fbuf = (float *) back;
float *fforward = (float *) forward;
while((char *) fbuf < back + readbyte) {
backsu = nsu - nextsu;
for(i = 0; i < sfchans(&hd); i++)
*fbuf++ = *(fforward + backsu + i);
nextsu += i;
}
}
else { /* Integer (short) file */
register short *sbuf = (short *) back;
short *sforward = (short *) forward;
while((char *) sbuf < back + readbyte) {
backsu = nsu - nextsu;
for(i = 0; i < sfchans(&hd); i++)
*sbuf++ = *(sforward + backsu + i);
nextsu += i;
}
}
if(write(sfd2,back,readbyte) != readbyte) {
fprintf(stderr,"Bad write on soundfile\n");
exit(1);
}
if((bytes -= readbyte) > 0)
if(sflseek(sfd1,(long) -(SF_BUFSIZE + readbyte),1) == -1) {
fprintf(stderr,"Bad seek\n");
exit(1);
}
}
close(sfd1);
close(sfd2);
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.