【问题标题】:iOS SDK 4.3 OpenAL alGenSources results in AL_INVALID_OPERATIONiOS SDK 4.3 OpenAL alGenSources 导致 AL_INVALID_OPERATION
【发布时间】: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 中,一切正常,尽管播放是花栗鼠式的高音。

标签: iphone ios openal


【解决方案1】:

对于您的音高问题,请确保您加载的声音文件与您输入 alBufferData 的采样率相匹配。您的 caf 文件可能以 22050 Hz 的频率保存。

AudioStreamBasicDescription 的 mSampleRate 会告诉您音频文件的实际采样率是多少。

您还应该检查 mChannelsPerFrame 以确保它确实是立体声。

此外,默认情况下,iOS 上的 OpenAL 仅生成 4 个立体声源。如果您尝试使用立体声数据加载超过 4 个源,您的音频听起来像垃圾。您可以通过在创建上下文时指定属性 ALC_STEREO_SOURCES 和 ALC_MONO_SOURCES 来更改它。您最多有 32 个音源(默认设置 28 个单声道和 4 个立体声源)。

【讨论】:

  • 您好,Karl,感谢您的回复 - 非常有用的信息。从技术上讲,这不是原始问题的答案,所以我想我无法将其标记为答案 - 抱歉!
【解决方案2】:

我犯了一个愚蠢的错误——我在 initWithNibName 中初始化了 OpenAL,但从未被调用过。将 init 移到 viewDidLoad 中,一切正常,尽管播放速度是花栗鼠式的高速

【讨论】:

    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多