This is sndrealloc.c in view mode; [Download] [Up]
/* Test Mike Minnick's sndRealloc() function */ #import <stdio.h> #import <sound/sound.h> #import <math.h> #import <mach/mach_error.h> #define AMP 32768 #define PI M_PI void CheckError(int err) { if (err != 0) printf("err=%d\n", err); } SNDSoundStruct *sndRealloc(SNDSoundStruct *Osound, int NewDataSize) { SNDSoundStruct *TmpSound ; int OldSize = Osound->dataSize + Osound->dataLocation; int error ; /* * Allocate memory for the new sound. */ error = vm_allocate(task_self(),(vm_address_t *)&TmpSound, NewDataSize, 1); if ( error != KERN_SUCCESS ) { mach_error("vm_allocate returned value of: ", error); exit(1); } /* * Round up old size to next highest page multiple. */ if (OldSize & (vm_page_size-1)) OldSize = (OldSize + vm_page_size) & ~(vm_page_size-1); /* * Copy the old sound to the new, including the header. */ error = vm_copy(task_self(), (vm_address_t) Osound, (vm_size_t) OldSize, (vm_address_t) TmpSound) ; if ( error != KERN_SUCCESS ) { mach_error("vm_copy returned value of: ", error); exit(1); } /* * Set the new sound's data size to the new size. */ TmpSound->dataSize = NewDataSize; /* * Free the old sound's memory. */ SNDFree(Osound); return(TmpSound); } void main(int argc, char *argv[]) { SNDSoundStruct *NewSound ; /* sound structures */ short *SoundBuffer, *StartSoundBuffer ; int SRate = 44100, dataFormat = 3, dataSize, channels = 1, infoSize = 4; int DurationInSamples, BytesPerSample, i = 0 ; float omega ; float Duration ; if (argc != 2) { fprintf(stderr, "%s - Test sndRealloc() function for changing sound size in place.\n" "\nUsage: %s <duration> \n" " A sine wave at requested duration is generated and played,\n" " Then its duration is doubled and played again, with the second" " half being an octave higher.\n", argv[0], argv[0]); exit(1); } Duration = atof(argv[1]) ; dataSize = Duration * SRate * sizeof(short); CheckError(SNDAlloc(&NewSound, dataSize, dataFormat, SRate, channels,infoSize)); CheckError(SNDGetDataPointer(NewSound, (char **)&SoundBuffer, &DurationInSamples, &BytesPerSample)); StartSoundBuffer = SoundBuffer ; omega = 2 * PI * 440 / SRate ; fprintf(stderr,"DurationInSamples = %d\n", DurationInSamples); while ( DurationInSamples-- ) *SoundBuffer++ = AMP * sin( omega * i++ ) ; CheckError(SNDStartPlaying(NewSound,1,0,0,0,0)); CheckError(SNDWait(1)); dataSize = 2 * Duration * SRate * sizeof(short); NewSound = sndRealloc(NewSound, dataSize); CheckError(SNDGetDataPointer(NewSound, (char **)&SoundBuffer, &DurationInSamples, &BytesPerSample)); fprintf(stderr,"DurationInSamples = %d\n", DurationInSamples); i = 0 ; DurationInSamples /= 2 ; SoundBuffer += DurationInSamples ; omega = 2 * PI * 880 / SRate ; while ( DurationInSamples-- ) *SoundBuffer++ = AMP * sin( omega * i++ ) ; CheckError(SNDStartPlaying(NewSound,1,0,0,0,0)); CheckError(SNDWait(1)); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.