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

时间:2013-02-21 18:35:02

标签: macos cocoa core-audio sandbox 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;
}

请注意,AudioFileOpenURL()调用中的fileURL是从安全范围的书签数据获取的URL,并且是用户已拖入应用程序的文件的URL。

如果我设置com.apple.security.temporary-exception.audio-unit-host沙盒权利,当调用AUGraphOpen()时,会提示用户降低安全设置,并假设他们接受,再次播放工作正常(沙箱被禁用)。

因此,这指向AudioFilePlayer单元不是沙盒安全/兼容。这是真的?很难相信Apple不会将CoreAudio API的这么重要的部分固定为沙箱兼容。另请注意,我在传递给AUGraphAddNode的描述中指定了kAudioComponentFlag_SandboxSafe标志,并且该调用不会失败。此外,我只能找到一个对AudioFilePlayer的引用不是沙盒安全的在线,以this post的形式发送到CoreAudio邮件列表,并且它没有收到任何回复。也许我正在制造一些其他微妙的错误,这些错误恰好会导致启用沙盒的问题,但是当它关​​闭时却不会(我是Core Audio的新手)?

0 个答案:

没有答案