Search code examples
xcodeios5core-audio

AU Preset (.aupreset) resource path issue in iOS LoadPresetDemo sample code


I've been working with the iOS LoadPresetDemo sample code - if loads AUPreset files to configure different types of samplers (pretty cool) - and have run into a question/issue.

The demo code runs fine but when I try to reuse the .aupreset files in test project built from scratch, the Trombone.aupreset doesn't work. Digging into it, I noticed what seems like oddness with the audio sample paths in the .aupreset file.

The paths in the plist (images below) point to:

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

but that is not the correct path - according to the project directory structure. There are no "Library/Audio" directories - virtual or real. So I'm confused. The Apple demo works fine but my from scratch project does not (get error -43 when trying to load the samples). The code that loads the samples (at bottom) is not doing anything to relativize the paths at runtime.

Does anyone see what I am misunderstanding here? - Thanks!

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;
}

Solution

  • I had the same Problem and after 2 hours of comparing the "load preset"-Demo with my code I found the solution:

    When adding the sound-folder check the options:

    • Copy items
    • Create folder references for any added folders -- and the added folders will be blue like in the "load preset"-demo-project!