How to play loop with OpenAL on iPhone

I follow the guide for playing sound using OpenAL. Now everything works fine, except that I cannot make a sound. I believe that I used AL_LOOPING for the source. Now he can play only once, and when he finishes the game, the application is blocked (does not respond to my click on the play button). Any ideas on what's wrong with the code?

 // start up openAL // init device and context -(void)initOpenAL { // Initialization mDevice = alcOpenDevice(NULL); // select the "preferred device" if (mDevice) { // use the device to make a context mContext = alcCreateContext(mDevice, NULL); // set my context to the currently active one alcMakeContextCurrent(mContext); } } // open the audio file // returns a big audio ID struct -(AudioFileID)openAudioFile:(NSString*)filePath { AudioFileID outAFID; // use the NSURl instead of a cfurlref cuz it is easier NSURL * afUrl = [NSURL fileURLWithPath:filePath]; // do some platform specific stuff.. #if TARGET_OS_IPHONE OSStatus result = AudioFileOpenURL((CFURLRef)afUrl, kAudioFileReadPermission, 0, &outAFID); #else OSStatus result = AudioFileOpenURL((CFURLRef)afUrl, fsRdPerm, 0, &outAFID); #endif if (result != 0) NSLog(@"cannot openf file: %@",filePath); return outAFID; } // find the audio portion of the file // return the size in bytes -(UInt32)audioFileSize:(AudioFileID)fileDescriptor { UInt64 outDataSize = 0; UInt32 thePropSize = sizeof(UInt64); OSStatus result = AudioFileGetProperty(fileDescriptor, kAudioFilePropertyAudioDataByteCount, &thePropSize, &outDataSize); if(result != 0) NSLog(@"cannot find file size"); return (UInt32)outDataSize; } - (void)stopSound { alSourceStop(sourceID); } -(void)cleanUpOpenAL:(id)sender { // delete the sources alDeleteSources(1, &sourceID); // delete the buffers alDeleteBuffers(1, &bufferID); // destroy the context alcDestroyContext(mContext); // close the device alcCloseDevice(mDevice); } -(IBAction)play:(id)sender { alSourcePlay(sourceID); } #pragma mark - // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; [self initOpenAL]; // get the full path of the file NSString* fileName = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"caf"]; // first, open the file AudioFileID fileID = [self openAudioFile:fileName]; // find out how big the actual audio data is UInt32 fileSize = [self audioFileSize:fileID]; // this is where the audio data will live for the moment unsigned char * outData = malloc(fileSize); // this where we actually get the bytes from the file and put them // into the data buffer OSStatus result = noErr; result = AudioFileReadBytes(fileID, false, 0, &fileSize, outData); AudioFileClose(fileID); //close the file if (result != 0) NSLog(@"cannot load effect: %@", fileName); //NSUInteger bufferID; // buffer is defined in head file // grab a buffer ID from openAL alGenBuffers(1, &bufferID); // jam the audio data into the new buffer alBufferData(bufferID, AL_FORMAT_STEREO16, outData, fileSize, 8000); //NSUInteger sourceID; // source is defined in head file // grab a source ID from openAL alGenSources(1, &sourceID); // attach the buffer to the source alSourcei(sourceID, AL_BUFFER, bufferID); // set some basic source prefs alSourcef(sourceID, AL_PITCH, 1.0f); alSourcef(sourceID, AL_GAIN, 1.0f); alSourcei(sourceID, AL_LOOPING, AL_TRUE); // clean up the buffer if (outData) { free(outData); outData = NULL; } } 
+4
source share
1 answer

You should be able to issue OutData immediately after calling alBufferData (). This excludes him as the culprit, you can try the static extension and manage the memory yourself. This is something like:

 alBufferDataStaticProcPtr alBufferDataStaticProc = (alBufferDataStaticProcPtr)alcGetProcAddress(0, (const ALCchar *)"alBufferDataStatic"); alBufferDataStaticProc(bufferID, bitChanFormat, audioData, audioDataSize, dataFormat.mSampleRate); 
0
source

All Articles