This is fragSounds.m in view mode; [Download] [Up]
#import <stdio.h>
#import <soundkit/Sound.h>
/* castration of jwp's mixSounds. To copy segment of fragmented sound to
* single buffer */
/* Shorthand macros to handle SNDSoundStructs.
* NSAMPS(s) = number of samples in fragment s
* DATA(s) = Pointer to samples in fragment s
*/
#define NSAMPS(s) (s->dataSize / 2)
#define DATA(s) ((char *)s + s->dataLocation)
#define MIN(a,b) ((a > b) ? b : a)
#define CHANS(s) s->channelCount
int fragSounds(inSound,outSound,inskip,nsamps)
id inSound; /* Input Sound object */
short *outSound; /* Output Sound (the one we mix to) */
int inskip; /* First sample from input sound */
int nsamps; /* Total number of samples to mix */
{
SNDSoundStruct **inList; /* Pointers to the
* lists of Sound
* fragments*/
SNDSoundStruct *fakein[2]; /* Phoney fragment
* lists for un-
* fragmented Sounds*/
SNDSoundStruct *inStruct; /* Pointers to the
* actual fragments*/
short *in, *out; /* Pointers to data */
int insamps; /* Number of samples in fragments */
int n, blocksize; /* For loop control */
int i = 0;
if ([inSound needsCompacting])
inList = (SNDSoundStruct **)[inSound data];
else {
fakein[0] = [inSound soundStruct];
fakein[1] = NULL;
inList = fakein;
}
inStruct = *inList++;
while (inskip) {
if (NSAMPS(inStruct) > inskip)
break;
inskip -= NSAMPS(inStruct);
if ((inStruct = *inList++) == NULL) {
fprintf(stderr,"mixSounds: inskip too large\n");
return -1;
}
}
in = (short *)DATA(inStruct) + inskip;
insamps = NSAMPS(inStruct) - inskip; /* # of samples left in frag */
i=0;
out = outSound;
if(CHANS(inStruct) == 2) {
while (nsamps > 0) {
blocksize = insamps;
for (n = MIN(blocksize,nsamps); n; n--, out++, in++)
*out = *in;
if (!(insamps -= blocksize)) {
if ((inStruct = *inList++) == NULL)
break;
insamps = NSAMPS(inStruct);
in = (short *)DATA(inStruct);
}
nsamps -= blocksize;
}
}
else {
while (nsamps > 0) {
blocksize = insamps;
for (n = MIN(blocksize,nsamps); n; n-=2, out+=2, in++) {
*out = *in;
*(out+1) = *in;
}
if (!(insamps -= blocksize)) {
if ((inStruct = *inList++) == NULL)
break;
insamps = NSAMPS(inStruct);
in = (short *)DATA(inStruct);
}
nsamps -= blocksize;
}
}
return 1;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.