iOS LoadPresetDemo示例代码中的AU Preset(.aupreset)资源路径问题

时间:2012-02-03 21:30:48

标签: xcode ios5 core-audio

我一直在使用iOS LoadPresetDemo示例代码 - 如果加载AUPreset文件来配置不同类型的采样器(非常酷) - 并遇到问题/问题。

演示代码运行正常但是当我尝试在从头开始构建的测试项目中重用.aupreset文件时,Trombone.aupreset不起作用。深入研究。我发现.aupreset文件中的音频样本路径看起来很奇怪。

plist中的路径(下图)指向:

file://localhost//Library/Audio/Sounds/Tbone/1a%23.caf

但根据项目目录结构,这不是正确的路径。没有“库/音频”目录 - 虚拟或真实。所以我很困惑。 Apple演示工作正常,但我从头开始项目没有(尝试加载示例时得到错误-43)。加载样本的代码(在底部)没有做任何事情来在运行时重新激活路径。

有谁看到我在这里误会了什么? - 谢谢!

directory structure

.aupreset plist

// Load a synthesizer preset file and apply it to the Sampler unit
- (OSStatus) loadSynthFromPresetURL: (NSURL *) presetURL {

CFDataRef propertyResourceData = 0;
Boolean status;
SInt32 errorCode = 0;
OSStatus result = noErr;

// Read from the URL and convert into a CFData chunk
status = CFURLCreateDataAndPropertiesFromResource (
            kCFAllocatorDefault,
            (__bridge CFURLRef) presetURL,
            &propertyResourceData,
            NULL,
            NULL,
            &errorCode
         );

NSAssert (status == YES && propertyResourceData != 0, @"Unable to create data and properties from a preset. Error code: %d '%.4s'", (int) errorCode, (const char *)&errorCode);

// Convert the data object into a property list
CFPropertyListRef presetPropertyList = 0;
CFPropertyListFormat dataFormat = 0;
CFErrorRef errorRef = 0;
presetPropertyList = CFPropertyListCreateWithData (
                        kCFAllocatorDefault,
                        propertyResourceData,
                        kCFPropertyListImmutable,
                        &dataFormat,
                        &errorRef
                    );

// Set the class info property for the Sampler unit using the property list as the value.
if (presetPropertyList != 0) {

    result = AudioUnitSetProperty(
                self.samplerUnit,
                kAudioUnitProperty_ClassInfo,
                kAudioUnitScope_Global,
                0,
                &presetPropertyList,
                sizeof(CFPropertyListRef)
            );

    CFRelease(presetPropertyList);
}

if (errorRef) CFRelease(errorRef);
CFRelease (propertyResourceData);

return result;
}

3 个答案:

答案 0 :(得分:5)

我遇到了同样的问题,经过2个小时的比较“加载预设”-Demo和我的代码后,我找到了解决方案:

添加声音文件夹时,请检查选项:

  • 复制项目
  • 为任何添加的文件夹创建文件夹参考 - 添加的文件夹将为蓝色,如“加载预设”-demo-project!

答案 1 :(得分:3)

以下内容来自Apple技术说明TN2283,并讨论了最初询问的路径问题。您显然需要将声音文件夹,资源和预设文件作为捆绑包的一部分。

技术说明TN2283 AUSampler - 加载仪器摘录

当AUSampler尝试通过.aupreset文件的外部文件引用部分或一组单独的文件URL中提供的路径加载音频文件时,它将使用以下规则来解析每个路径:

如果在原始路径中找到音频文件,则会加载该文件。 如果未找到音频文件,AUSampler将查看路径是否包含与该顺序匹配的“/ Sounds /”,“/ Sampler Files /”或“/ Apple Loops /”部分。

如果路径不包含列出的子路径之一,则返回错误。 如果路径DOES包含列出的子路径之一,则删除子路径之前的路径部分,并按以下顺序替换以下目录位置常量:

捆绑目录 NSLibraryDirectory NSDocumentDirectory NSDownloadsDirectory

例如,在iOS应用程序中,如果原始路径为“/Users/geddy/Library/Audio/Sounds/MyFavoriteHeadacheSound.caf”并且未找到此路径,则AUSampler将搜索以下音频文件四个地方:

<Bundle_Directory>/Sounds/MyFavoriteHeadacheSound.caf
<NSLibraryDirectory>/Sounds/MyFavoriteHeadacheSound.caf
<NSDocumentDirectory>/Sounds/MyFavoriteHeadacheSound.caf
<NSDownloadsDirectory>/Sounds/MyFavoriteHeadacheSound.caf

因此,使用上面的示例,如果您将在桌面上创建的预设移动到iOS应用程序,您只需将MyFavoriteHeadacheSound.caf文件放在应用程序包中名为“Sounds”的文件夹中,AUSampler就会找到音频预设引用的文件。

答案 2 :(得分:0)

您需要将两个预设添加到目标中,以便它们成为捆绑包的一部分:

Show Package Contents of the Device Built executable

这就是行:

NSURL *presetURL = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Trombone" ofType:@"aupreset"]];

说。

另外,您可能需要查看页面底部的Referencing External Audio Files