And*_*sen 6 macos cocoa sandbox core-audio audiounit
我使用AudioFilePlayer音频单元遇到问题,在OS X 10.8上启用了应用程序沙盒.我有一个只有两个节点的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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,AudioFileOpenURL()调用中的fileURL是从安全范围的书签数据获取的URL,并且是用户已拖入应用程序的文件的URL.
如果我设置com.apple.security.temporary-exception.audio-unit-host沙盒权利,当调用AUGraphOpen()时,系统会提示用户降低安全设置,并假设他们接受,再次播放工作正常(沙箱)被禁用).
因此,这指向AudioFilePlayer单元不是沙盒安全/兼容.这是真的?很难相信Apple不会将CoreAudio API的这么重要的部分固定为沙箱兼容.另请注意,我kAudioComponentFlag_SandboxSafe
在传递给AUGraphAddNode的描述中指定了标志,并且该调用不会失败.此外,我只能找到一个对AudioFilePlayer的引用不是沙盒安全的在线,以此帖子的形式发送到CoreAudio邮件列表,并且它没有收到任何回复.也许我正在制造一些其他微妙的错误,这些错误恰好会导致启用沙盒的问题,但是当它关闭时(我是Core Audio的新手)不会?
归档时间: |
|
查看次数: |
584 次 |
最近记录: |