7

我在 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 的新手)?

4

0 回答 0