AudioFilePlayer音频单元沙箱是否兼容?

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的新手)不会?