Представление аудиоустройства
Почти каждому аудиоустройству нужен графический интерфейс, чтобы позволить пользователю скорректировать работу аудиоустройства и видеть то, что это делает. В терминологии Core Audio такой графический интерфейс вызывают представлением. Когда Вы понимаете, как работают представления и как создать их, можно добавить много имеющее значение для аудиоустройств, которые Вы создаете.
Типы представлений
Существует два основных типа представлений:
Универсальные представления обеспечивают функциональный все же решительно нероскошный интерфейс. Вы получаете универсальное представление бесплатно. Это создается для Вас хост-приложением, открывающим Ваше аудиоустройство, на основе параметра и определений свойства в Ваших исходных файлах аудиоустройства.
Пользовательские представления являются графическими интерфейсами пользователя, которые Вы разрабатываете и создаете. Создание большого пользовательского представления может повлечь за собой больше чем половину времени разработки для аудиоустройства. Для Вашего усилия можно предложить что-то пользователям, которое не только более привлекательно, но и более функционально также.
Можно принять решение ожидать при разработке пользовательского представления, пока аудиоустройство не работает, или можно воздержаться от пользовательской опции представления полностью. При создании пользовательского представления можно использовать Углерод или Какао.
Разделение проблем
С точки зрения пользователя представление является аудиоустройством. С Вашей точки зрения как разработчик ситуация является немного более тонкой.
Вы создаете представление, чтобы быть логически отдельными от исполняемого кода аудиоустройства, все же упакованного в том же пакете. Для достижения этого программируемого разделения Apple рекомендует разработать пользовательские представления так, чтобы они работали бы, работая в отдельном адресном пространстве в отдельном процессе, и на отдельной машине от исполняемого кода аудиоустройства. Например, Вы передаете данные между исполняемым кодом аудиоустройства и его представлением только значением, никогда ссылкой.
Не посягая на это формальное разделение, однако, часто удобно совместно использовать заголовочный файл между исполняемым кодом аудиоустройства и его представлением. Вы будете видеть сделанный в проекте SDK’s FilterDemo. Совместно используемый заголовочный файл может обеспечить, например, типы данных и константы для пользовательских свойств, которые могут оба использовать исполняемый код аудиоустройства и его представление.
И универсальные и пользовательские представления используют механизм уведомления для передачи с их связанным исполняемым кодом аудиоустройства, как описано в Событиях Параметра и Свойства.
Универсальное представление
Хост-приложения создают универсальное представление для Вашего аудиоустройства на основе Вашего параметра и определений свойства. Начиная с OS X v10.4, Тайгер, хост-приложения могут генерировать Углерод или Какао универсальные представления.
Вот является Какао универсальным представлением для аудиоустройства FilterDemo, одного из демонстрационных проектов в Core Audio SDK:
Аудиоустройство, связанное с этим представлением, имеет два параметра с плавкой регулировкой, каждый представленный в представлении простым ползунком вместе с текстовым полем, показывающим текущую стоимость параметра. Универсальное представление для Вашего аудиоустройства будет иметь подобный взгляд.
Таблица 3-1 описывает, куда каждый элемент пользовательского интерфейса в универсальном представлении прибывает из. Столбец «Source of value» в таблице относится к файлам, которые Вы видите в аудиоустройстве, проект XCode создал использование шаблона «Audio Unit Effect with Cocoa View».
Элемент интерфейса пользователя | Значение в качестве примера | Источник имеющий значение |
---|---|---|
Имя аудиоустройства, в верхнем левом из окна утилиты представления | Аудиоустройство: фильтр |
|
Имя аудиоустройства, в строке заголовка окна утилиты представления и в раскрывающемся | Фильтр |
|
Имя производителя, в верхнем правом из окна утилиты представления | Демонстрация Apple |
|
Название параметра | частота отсечки |
|
Максимальное значение параметра | 22050 |
|
Минимальное значение параметра | 12.00 |
|
Значение по умолчанию параметра | 1000 |
|
Измерительное имя модулей | Гц | Измерительный модуль, как указано в |
Ползунок | Корректируемый пользователь. Первоначально набор для указания значения по умолчанию параметра. | Универсальный механизм представления представляет ползунок для этого параметра. Это вызвано тем, что единица измерения параметра, как определено в |
Как показано затем пользовательское представление может обеспечить значительно больше значения и утилиты, чем универсальное представление.
Пользовательские представления
Когда узел открывает Ваше аудиоустройство, он спрашивает, существует ли пользовательское доступное представление. Если так, это может использовать его, как описано в поле зрения Инстанцирование и Инициализация.
Вот является пользовательское представление для того же аудиоустройства, описанного в Универсальном Представлении, а именно, аудиоустройстве FilterDemo от Core Audio SDK:
Основная функция этого пользовательского представления является кривой частотной характеристики в реальном времени. Это делает пользовательское представление (и, по ассоциации, аудиоустройство) более привлекательный и намного более полезный. Вместо того, чтобы видеть просто пару чисел, пользователь может теперь видеть частотную характеристику, включая то, как резонансная частота фильтра и частота отсечки влияют на ответ. Независимо от того, какой аудиоустройство Вы создаете, можно предоставить подобные преимущества пользователям при включении пользовательского представления с аудиоустройством.
Преимущества пользовательских представлений по универсальным представлениям включают:
Возможность скрыть ненужную подробность или обеспечить прогрессивное раскрытие средств управления
Возможность предоставить поддержку для автоматизации параметра
Выбор средств управления пользовательским интерфейсом, например кнопки, регуляторы громкости или горизонтальные ползунки
Намного больше информации для пользователя через графики в реальном времени, такие как кривые частотной характеристики
Возможность брендинга для Вашей компании
Проект аудиоустройства SDK's FilterDemo является хорошим примером для следования при создании пользовательского представления для аудиоустройства. См. Учебное руководство: Демонстрация Жестов Параметра и Событий Аудиоустройства далее в этой главе для больше на пользовательских представлениях.
Инстанцирование представления и инициализация
Когда хост-приложение открывает аудиоустройство, оно может запросить аудиоустройство относительно того, имеет ли оно пользовательское представление. Узел делает это с кодом, таким как этот отрывок из проекта CocoaAUHost в SDK:
Перечисление 3-1 хост-приложение получает Какао пользовательское представление от аудиоустройства
if (AudioUnitGetProperty ( |
inAU, // the audio unit the host is checking |
kAudioUnitProperty_CocoaUI, // the property the host is querying |
kAudioUnitScope_Global, |
0, |
cocoaViewInfo, |
&dataSize) == noErr) { |
CocoaViewBundlePath = // the host gets the path to the view bundle |
(NSURL *) cocoaViewInfo -> mCocoaAUViewBundleLocation; |
factoryClassName = // the host gets the view's class name |
(NSString *) cocoaViewInfo -> mCocoaAUViewClass[0]; |
} |
Если Вы не предоставите пользовательское представление свое аудиоустройство, то узел создаст универсальное представление на основе параметра Вашего аудиоустройства и определений свойства.
Вот то, что происходит, с точки зрения представления представления пользователю, когда узел открывает аудиоустройство:
Хост-приложение вызывает
GetProperty
метод на аудиоустройстве, чтобы узнать, имеет ли это пользовательское представление, как показано в Перечислении 3-1. Если аудиоустройство обеспечивает представление Cocoa, аудиоустройство должно реализоватьkAudioUnitProperty_CocoaUI
свойство. Если аудиоустройство обеспечивает представление Carbon, аудиоустройство должно реализоватьkAudioUnitProperty_GetUIComponentList
свойство. Остальная часть этой последовательности принимает использование Какао пользовательское представление.Узел вызывает
GetPropertyInfo
метод дляkAudioUnitProperty_CocoaUI
свойство для обнаружения, сколько Какао пользовательские представления доступно. Как короткий путь, узел может пропустить вызов кGetPropertyInfo
. В этом случае узел получил бы первое представление в массиве класса представления при помощи кода такой как показано в упоминании выше, с помощью индекса массива0
:factoryClassName = (NSString *) cocoaViewInfo -> mCocoaAUViewClass[0];
. В этом случае перейдите непосредственно к шагу 4.Аудиоустройство возвращает размер
AudioUnitCocoaViewInfo
структура как целочисленное значение, указывая, сколько Какао пользовательские представления доступно. Как правило, разработчики создают одно представление на аудиоустройство.Узел исследует значение cocoaViewInfo для обнаружения, где пакет представления и что основной класс представления для представления (или для указанного представления, если аудиоустройство обеспечивает больше чем один).
Нагрузки хоста пакет представления, запускающийся путем загрузки основного класса представления для инстанцирования его.
Существуют некоторые правила о том, как структурировать основной класс представления для представления Cocoa:
Представление должно реализовать
AUCocoaUIBase
протокол. Этот протокол указывает, что класс представления действует как фабрика для представлений и возвращаетсяNSView
объект с помощьюuiViewForAudioUnit:withSize:
метод. Этот метод говорит представление, какое аудиоустройство владеет им и обеспечивает подсказку относительно размера экрана для представления в пикселях (использующийNSSize
структура).- (NSView *) uiViewForAudioUnit: (AudioUnit) inAudioUnit
withSize: (NSSize) inPreferredSize;
Если Вы используете файл пера для построения представления (в противоположность генерации представления программно), владелец файла пера является основным (фабрика) класс для представления.
Представление аудиоустройства должно работать, инстанцируют ли аудиоустройство просто или было ли это инициализировано. Если узел деинициализирует аудиоустройство, представление должно продолжать работать. Т.е. представление не должно предполагать, что инициализируется его аудиоустройство. Это достаточно важно на практике что auval
инструмент включает тест для отставания значений параметров через неинициализацию и реинициализацию.
Параметр и события свойства
Автоматизация аудиоустройства (как описано назад в Поддержке Автоматизации Параметра) является опцией, реализованной хост-приложениями и пользовательскими представлениями. Это полагается на параметр и события свойства — которые поочередно полагаются на Событие Аудиоустройства API, описанный затем.
Событие аудиоустройства API
Узлы, представления и аудиоустройства могут использовать в своих интересах уведомления Core Audio, чтобы гарантировать, чтобы все три из этих объектов остались в синхронизации с точки зрения корректировок параметра. Уведомления, к которым получают доступ через Событие Аудиоустройства API, работают независимо от того, какой из этих трех объектов вызывает изменение параметра. API объявляется в AudioUnitUtilities.h
заголовочный файл в Аудио платформе Панели инструментов.
Событие Аудиоустройства API определяет AudioUnitEvent
тип данных, показанный в Перечислении 3-2:
Перечисление 3-2 структура AudioUnitEvent
typedef struct AudioUnitEvent { |
AudioUnitEventType mEventType; // 1 |
union { |
AudioUnitParameter mParameter; // 2 |
AudioUnitProperty mProperty; // 3 |
} mArgument; |
} AudioUnitEvent; |
Вот то, как работает эта структура:
Идентифицирует тип уведомления, как определено в
AudioUnitEventType
перечисление.Идентифицирует параметр, вовлеченный в уведомление, для уведомлений, которые являются, начинают или заканчивают жесты или изменения в параметрах. (См. Жесты Параметра.)
AudioUnitParameter
тип данных используется Событием Аудиоустройства API а не платформой Аудиоустройства, даже при том, что это определяется в платформе Аудиоустройства.Идентифицирует свойство, вовлеченное в уведомление, для уведомлений, которые являются уведомлениями изменения свойства.
Соответствие AudioUnitEventType
перечисление перечисляет определенное различное AudioUnitEvent
типы событий, показанные в Перечислении 3-3:
Перечисление 3-3 перечисление AudioUnitEventType
typedef UInt32 AudioUnitEventType; |
enum { |
kAudioUnitEvent_ParameterValueChange = 0, |
kAudioUnitEvent_BeginParameterChangeGesture = 1, |
kAudioUnitEvent_EndParameterChangeGesture = 2, |
kAudioUnitEvent_PropertyChange = 3 |
}; |
- kAudioUnitEvent_ParameterValueChange
Указывает, что уведомление описывает изменение в значении параметра
- kAudioUnitEvent_BeginParameterChangeGesture
Указывает, что уведомление описывает параметр, «начинают» жест; значение параметра собирается измениться
- kAudioUnitEvent_EndParameterChangeGesture
Указывает, что уведомление описывает жест «конца» параметра; значение параметра закончило изменяться
- kAudioUnitEvent_PropertyChange
Указывает, что уведомление описывает изменение в значении свойства аудиоустройства
Жесты параметра
События пользовательского интерфейса, сигнализирующие запуск или конец изменения параметра, вызывают жестами. Эти события могут служить для передачи уведомлений среди узла, представления и аудиоустройства, что параметр собирается быть измененным, или только что закончил изменяться. Как параметр и изменения свойства, жесты передаются с помощью События Аудиоустройства API. В частности жесты используют kAudioUnitEvent_BeginParameterChangeGesture
и kAudioUnitEvent_EndParameterChangeGesture
типы событий, как показано в Перечислении 3-3, выше.
Корректировки основного параметра
Для корректировки основного параметра Core Audio обеспечивает AudioUnitSetParameter
функция, объявленная в AUComponent.h
заголовочный файл в платформе Аудиоустройства. Когда узел или представление вызывают эту функцию, это устанавливает указанный параметр в аудиоустройстве путем вызова SetParameter
метод в аудиоустройстве. Это не обеспечивает уведомление для поддержки автоматизации или обновления представлений.
Корректировки параметра с уведомлением
Для добавления уведомления, которое изменил параметр узел или пользовательское представление следуют за вызовом к AudioUnitSetParameter
функция с вызовом к AUParameterListenerNotify
функция от События Аудиоустройства API в AudioUnitUtilities.h
заголовочный файл.
Устанавливать параметр и уведомлять слушателей за один шаг, узел или пользовательское представление вызывают AUParameterSet
функция, также от События Аудиоустройства API.
Иногда само аудиоустройство изменяет значение одного из его параметров. В таком случае это должно выпустить уведомление об изменении значения. Для обсуждения этого вернитесь к Определению и Используя Параметры в Аудиоустройстве.
Учебное руководство: демонстрация жестов параметра и событий аудиоустройства
Это миниучебное руководство иллюстрирует, как жесты и события аудиоустройства работают:
Инстанцирование двух представлений для аудиоустройства
Выполнение корректировок в одном из представлений при наблюдении эффекта в другом представлении
По пути, это учебное руководство:
Представляет Вас компиляции проекта аудиоустройства с XCode
Показывает, как AU Lab может вывести на экран универсальное представление и пользовательское представление для того же аудиоустройства
Показывает, как пользовательское свойство поддерживает коммуникацию между аудиоустройством и пользовательским представлением
Перед запуском удостоверьтесь, что Вы установили XCode и Core Audio SDK, оба из которого являются частью установки Инструментов XCode Apple.
1. Откройтесь FilterDemo.xcodeproj
Файл проекта XCode в Developer/Examples/CoreAudio/AudioUnits/FilterDemo
папка.
2. Нажмите Build для разрабатывания проекта аудиоустройства. (Можно видеть некоторые предупреждения о “невиртуальных деструкторах “. Проигнорируйте эти предупреждения.)
XCode создает новое build
папка в FilterDemo
папка проекта.
3. Откройтесь build
папка и взгляд в Development
целевая папка.
Недавно созданный пакет аудиоустройства называют FilterDemo.component
, как показано в числе.
4. Скопируйте FilterDemo.component
свяжитесь к ~/Library/Audio/Plug-Ins/Components
папка. В этом расположении недавно созданное аудиоустройство доступно хост-приложениям.
5. Запустите хост-приложение аудиоустройства AU Lab (в /Developer/Applications/Audio/
) и создайте новый документ AU Lab. Если Вы не сконфигурировали AU Lab для использования стиля документа по умолчанию, Создавание Нового Окна документа открывается. Если AU Lab уже работала, выберите File> New для получения этого окна.
Гарантируйте, что конфигурация соответствует настройки, показанные в числе: встроенное Аудио для Аудиоустройства, Строки В для Входного Источника и Стерео для Каналов вывода. Оставьте вкладку Inputs окна несконфигурированной; Вы укажете ввод позже. Нажать «OK».
Новое окно AU Lab открывается, показывая канал вывода, который Вы указали.
6. Щелкните по треугольной кнопке меню в одной строке раздела Effects в Ведущем устройстве, отслеживают в AU Lab, как показано в числе.
В меню, открывающемся, выберите аудиоустройство Фильтра из Демонстрационной группы Apple:
Пользовательское представление для аудиоустройства Фильтра открывается.
Кривая частотной характеристики пользовательского представления нарисована в режиме реального времени на основе фактической частотной характеристики аудиоустройства. Аудиоустройство делает свои доступные данные частотной характеристики к пользовательскому представлению путем объявления пользовательского свойства. Аудиоустройство совершенствует значение своего пользовательского свойства. Пользовательское представление запрашивает пользовательское свойство аудиоустройства для рисования кривой частотной характеристики.
7. Щелчок опции имя аудиоустройства в строке Эффектов.
Второй экземпляр представления для аудиоустройства Фильтра открывается.
8. Щелкните по всплывающему меню типа представления в одном экземпляре представления аудиоустройства, как показано в числе:
В меню, открывающемся, выберите Универсальный элемент Представления:
Представление изменяется на универсальное представление, как показано в следующем числе. Вы теперь устанавливаетесь для демонстрации событий аудиоустройства и жестов.
9. Щелкните и содержите один из ползунков в универсальном представлении, как показано в числе. Когда Вы щелкаете, замечаете, что крест нитей в пользовательском представлении становится выделенным в ярком синем. Они остаются выделенными, пока Вы удерживаете кнопку мыши.
Поскольку Вы перемещаете ползунок в универсальное представление, кривая частотной характеристики в пользовательском представлении идет в ногу с новой установкой.
Выделение и невыделение креста нитей в пользовательском представлении, когда Вы щелкаете и выпускаете на ползунке в универсальном представлении, следуете из событий жеста.
Изменения в частотной характеристике изгибаются в пользовательском представлении, поскольку Вы перемещаете ползунок в универсальное представление, следуете из событий изменения параметра
10. Наконец, щелкните и содержите на пересечении креста нитей в пользовательском представлении. Когда Вы щелкаете, замечаете, что ползунки в универсальном представлении становятся выделенными. Поскольку Вы перемещаете крест нитей в пользовательское представление, ползунки в универсальном представлении идут в ногу с новыми настройками.
Это демонстрирует, что оба представления и само аудиоустройство, остаются в синхронизации посредством событий аудиоустройства.