This is SoundPlayer.m in view mode; [Download] [Up]
#import <soundkit/soundkit.h> #import <sound/sound.h> #import <appkit/appkit.h> #import "SoundPlayer.h" @implementation SoundPlayer - init { [super init]; device = [[NXSoundOut alloc] init]; // set up sound out device stream = [[NXPlayStream alloc] initOnDevice:device]; [stream activate]; // set up our output stream soundListList = [[List alloc] initCount:NUMTYPES]; soundType = 0; [self loadSounds]; return self; } - loadSounds // gameBrain calls this in appDidInit method { int i; for (i=0; i<NUMTYPES; i++) [self loadSounds:NUMSOUNDS type:i]; return self; } - loadSounds:(int)numSounds type:(int)type { int err, j; id tempSnd, tempList = [[List alloc] initCount:NUMSOUNDS]; char *slashPos, *appPath = (char *)malloc(1024); char *soundFile = (char *)malloc(1024); strcpy(appPath, NXArgv[0]); if (slashPos = strrchr(appPath, '/')) slashPos[1] = '\0'; else strcpy(appPath, "./"); for (j=0; j<numSounds; j++) { // load in the the sounds sprintf(soundFile, "%sSound%d.%d.snd", appPath, j, type); tempSnd = [[Sound alloc] initFromSoundfile:soundFile]; // Convert to 16 bit linear 22050.0 kHz (idea is that this // doesn't require conversion on the fly. Since we play the // sounds so often, why convert each time? It's a waste of // CPU. This should also provide faster playback response. if (err = [tempSnd convertToFormat:SND_FORMAT_LINEAR_16 samplingRate:SND_RATE_LOW channelCount:2]) { fprintf(stderr, "%s: sound #%d type #%d convert error %s\n", [NXApp appName], j, type, SNDSoundError(err)); } [tempList addObject:tempSnd]; } [soundListList addObject:tempList]; free(appPath); free(soundFile); return self; } - play0:sender { return [self playNum:0]; } - play2:sender { return [self playNum:2]; } - play1:sender { return [self playNum:1]; } - play:sender { return [self playNum:[sender tag]]; } - playNum:(int)num { SNDSoundStruct *sound; // make sure we have the sound if ((num < 0) || (num >= [[soundListList objectAt:0] count])) return nil; // get pointer to appropriate sound data sound = [[[soundListList objectAt:soundType] objectAt:num] soundStruct]; // enqueue sound data to be played if (sound) [stream playBuffer:(char *)sound+sound->dataLocation size:sound->dataSize tag:num channelCount:sound->channelCount samplingRate:sound->samplingRate]; return self; } - setSoundType:(int)num { soundType = num; return self; } - (int)soundType { return soundType; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.