我在 OS X 10.8 上使用启用了应用沙盒的 AudioFilePlayer 音频单元时遇到了问题。我有一个只有两个节点的 AUGraph,由一个连接到 DefaultOutput 单元的 AudioFilePlayer 单元组成。目标(现在)是简单地播放单个音频文件。如果未启用沙盒,一切正常。如果我启用沙盒,则AUGraphOpen()
返回错误 -3000 (invalidComponentID)。如果我从 AUGraph 中删除文件播放器节点,错误就会消失,这至少意味着音频文件播放器导致了问题。
这是我用来设置文件播放器节点的代码:
OSStatus AddFileToGraph(AUGraph graph, NSURL *fileURL, AudioFileInfo *outFileInfo, AUNode *outFilePlayerNode)
{
OSStatus error = noErr;
if ((error = AudioFileOpenURL((__bridge CFURLRef)fileURL, kAudioFileReadPermission, 0, &outFileInfo->inputFile))) {
NSLog(@"Could not open audio file at %@ (%ld)", fileURL, (long)error);
return error;
}
// Get the audio data format from the file
UInt32 propSize = sizeof(outFileInfo->inputFormat);
if ((error = AudioFileGetProperty(outFileInfo->inputFile, kAudioFilePropertyDataFormat, &propSize, &outFileInfo->inputFormat))) {
NSLog(@"Couldn't get format of input file %@", fileURL);
return error;
}
// Add AUAudioFilePlayer node
AudioComponentDescription fileplayercd = {0};
fileplayercd.componentType = kAudioUnitType_Generator;
fileplayercd.componentSubType = kAudioUnitSubType_AudioFilePlayer;
fileplayercd.componentManufacturer = kAudioUnitManufacturer_Apple;
fileplayercd.componentFlags = kAudioComponentFlag_SandboxSafe;
if ((error = AUGraphAddNode(graph, &fileplayercd, outFilePlayerNode))) {
NSLog(@"AUAudioFilePlayer node not found (%ld)", (long)error);
return error;
}
return error;
}
请注意,AudioFileOpenURL() 调用中的 fileURL 是从安全范围的书签数据中获取的 URL,并且是指向已被用户拖入应用程序的文件的 URL。
如果我设置了 com.apple.security.temporary-exception.audio-unit-host 沙盒权利,当调用 AUGraphOpen() 时,系统会提示用户降低安全设置,并假设他们接受,再次播放正常(沙盒被禁用)。
因此,这表明 AudioFilePlayer 单元不是沙盒安全/兼容的。这是真的?很难相信 Apple 不会将 CoreAudio API 中如此重要的部分修复为与沙盒兼容。另请注意,我kAudioComponentFlag_SandboxSafe
在传递给 AUGraphAddNode 的描述中指定了标志,并且该调用不会失败。此外,我只能在 CoreAudio 邮件列表的这篇文章中找到一个关于 AudioFilePlayer 在线沙盒安全的参考,但它没有收到任何回复。也许我犯了一些其他微妙的错误,碰巧会导致启用沙盒的问题,但不是在它关闭时(我是 Core Audio 的新手)?