【发布时间】:2011-06-27 11:07:24
【问题描述】:
我正在尝试掌握 OpenAL,在此处完成教程:http://benbritten.com/2008/11/06/openal-sound-on-the-iphone/
我的问题是声音没有播放,虽然没有抛出 iOS 错误。但是有一个 OpenAL 错误。下面的代码示例是 IBAction 方法的主体,并在 alGenSources(1, &sourceID) 处产生 AL_INVALID_OPERATION。 sourceID 报告为 NULL。
我在设备和模拟器上都试过了。
这个代码示例似乎被广泛使用,但我找不到任何人抱怨这个特殊问题。任何人都可以对此有所了解吗?非常感谢您的帮助,
NSString *audioFileName = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"caf"];
AudioFileID fileID = [self openAudioFile:audioFileName];
UInt32 filesize = [self audioFileSize:fileID];
unsigned char *outData = malloc(filesize);
OSStatus result = noErr;
result = AudioFileReadBytes(fileID, false, 0, &filesize, outData);
AudioFileClose(fileID);
if (result != 0) {
NSLog(@"Can't load file..");
}
NSUInteger bufferID;
//NSLog(@"bufferID %@", [NSNumber numberWithUnsignedInteger:bufferID]);
alGenBuffers(1, &bufferID);
//NSLog(@"bufferID %@", [NSNumber numberWithUnsignedInteger:bufferID]);
alBufferData(bufferID, AL_FORMAT_STEREO16, outData, filesize, 44100);
[bufferStorageArray addObject:[NSNumber numberWithUnsignedInteger:bufferID]];
alGetError();
ALuint sourceID;
alGenSources(1, &sourceID);
if(alGetError() == AL_INVALID_OPERATION)
{
printf("\n++++ Error creating buffers INVALID_OPERATION!!\n");
//exit(1);
}
else
{
printf("No errors yet.");
}
alSourcei(sourceID, AL_BUFFER, bufferID);
alSourcef(sourceID, AL_PITCH, 1.0f);
alSourcef(sourceID, AL_GAIN, 1.0f);
if (loops) {
alSourcei(sourceID, AL_LOOPING, AL_TRUE);
}
[soundDictionary setObject:[NSNumber numberWithUnsignedInt:sourceID] forKey:@"sound"];
if (outData) {
free(outData);
outData = NULL;
}
[self playSound:@"sound"];
【问题讨论】:
-
我犯了一个愚蠢的错误——我在 initWithNibName 中初始化了 OpenAL,但从未被调用过。将 init 移到 viewDidLoad 中,一切正常,尽管播放是花栗鼠式的高音。