Ошибка пути ресурса пресета AU (.aupreset) в примере кода iOS LoadPresetDemo - PullRequest
4 голосов
/ 04 февраля 2012

Я работал с iOS LoadPresetDemo пример кода - если загружает файлы AUPreset для настройки различных типов сэмплеров (довольно круто) - и столкнулся с вопросом / проблемой.

Демонстрационный код работает нормально, но когда я пытаюсь использовать файлы .aupreset в тестовом проекте, созданном с нуля, Trombone.aupreset не работает. Покопавшись в этом, я заметил странную траекторию сэмплов в файле .aupreset.

Пути в списке (изображения ниже) указывают на:

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 ]

5 голосов
/ 01 марта 2012

У меня возникла та же проблема, и после 2 часов сравнения «загрузки предустановки» - демонстрации с моим кодом я нашел решение:

При добавлении звуковой папки проверьте параметры:

  • Копирование элементов
  • Создание ссылок на папки для любых добавленных папок - и добавленные папки будут выделены синим цветом, как в "load preset" -demo-проект!
3 голосов
/ 21 ноября 2012

Ниже приведена техническая записка Apple TN2283, в которой обсуждается вопрос о путях, который был задан изначально.Очевидно, вам понадобится папка звуков, ваши активы и предустановленная часть файла вашего пакета.

Техническое примечание TN2283 AUSampler - отрывок загрузки инструментов

Когда AUSampler пытается загрузить аудиофайлы черезпути, указанные в части ссылок внешнего файла файла .aupreset или набора отдельных URL-адресов файлов, для разрешения каждого пути будут использоваться следующие правила:

Если аудиофайл найден по исходному пути, онзагружен.Если аудиофайл НЕ найден, AUSampler проверяет, содержит ли путь часть, соответствующую «/ Sounds /», «/ Sampler Files /» или «/ Apple Loops /» в этом порядке.

Еслипуть НЕ включает один из перечисленных подпутей, возвращается ошибка.Если путь включает в себя один из перечисленных подпутей, часть пути, предшествующего подпути, удаляется, и следующие константы расположения каталога заменяются в следующем порядке:

Bundle Directory 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 в папку с именем «Звуки».в вашем комплекте приложений, и AUSampler найдет аудиофайл, на который ссылается пресет.

0 голосов
/ 18 февраля 2012

Вам необходимо добавить обе предустановки к цели, чтобы они были частью пакета:

Show Package Contents of the Device Built executable

Вот что за строка:

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

говорит.

Также вы можете посмотреть Ссылка на внешние аудиофайлы внизу страницы.

...