Представление аудиоустройства

Почти каждому аудиоустройству нужен графический интерфейс, чтобы позволить пользователю скорректировать работу аудиоустройства и видеть то, что это делает. В терминологии Core Audio такой графический интерфейс вызывают представлением. Когда Вы понимаете, как работают представления и как создать их, можно добавить много имеющее значение для аудиоустройств, которые Вы создаете.

Типы представлений

Существует два основных типа представлений:

Разделение проблем

С точки зрения пользователя представление является аудиоустройством. С Вашей точки зрения как разработчик ситуация является немного более тонкой.

Вы создаете представление, чтобы быть логически отдельными от исполняемого кода аудиоустройства, все же упакованного в том же пакете. Для достижения этого программируемого разделения Apple рекомендует разработать пользовательские представления так, чтобы они работали бы, работая в отдельном адресном пространстве в отдельном процессе, и на отдельной машине от исполняемого кода аудиоустройства. Например, Вы передаете данные между исполняемым кодом аудиоустройства и его представлением только значением, никогда ссылкой.

Не посягая на это формальное разделение, однако, часто удобно совместно использовать заголовочный файл между исполняемым кодом аудиоустройства и его представлением. Вы будете видеть сделанный в проекте SDK’s FilterDemo. Совместно используемый заголовочный файл может обеспечить, например, типы данных и константы для пользовательских свойств, которые могут оба использовать исполняемый код аудиоустройства и его представление.

И универсальные и пользовательские представления используют механизм уведомления для передачи с их связанным исполняемым кодом аудиоустройства, как описано в Событиях Параметра и Свойства.

Универсальное представление

Хост-приложения создают универсальное представление для Вашего аудиоустройства на основе Вашего параметра и определений свойства. Начиная с OS X v10.4, Тайгер, хост-приложения могут генерировать Углерод или Какао универсальные представления.

Вот является Какао универсальным представлением для аудиоустройства FilterDemo, одного из демонстрационных проектов в Core Audio SDK:

../Art/generic_view.jpg

Аудиоустройство, связанное с этим представлением, имеет два параметра с плавкой регулировкой, каждый представленный в представлении простым ползунком вместе с текстовым полем, показывающим текущую стоимость параметра. Универсальное представление для Вашего аудиоустройства будет иметь подобный взгляд.

Таблица 3-1 описывает, куда каждый элемент пользовательского интерфейса в универсальном представлении прибывает из. Столбец «Source of value» в таблице относится к файлам, которые Вы видите в аудиоустройстве, проект XCode создал использование шаблона «Audio Unit Effect with Cocoa View».

Табличные 3-1  Элементы интерфейса пользователя в аудиоустройстве универсальное представление

Элемент интерфейса пользователя

Значение в качестве примера

Источник имеющий значение

Имя аудиоустройства, в верхнем левом из окна утилиты представления

Аудиоустройство: фильтр

NAME определенная константа в<className>.r файл

Имя аудиоустройства, в строке заголовка окна утилиты представления и в раскрывающемся

Фильтр

NAME определенная константа в <className>.r файл

Имя производителя, в верхнем правом из окна утилиты представления

Демонстрация Apple

NAME определенная константа в <className>.r файл

Название параметра

частота отсечки

kParameterOneName CFStringRef представляют значение в виде строки в <className>.h файл

Максимальное значение параметра

22050

GetParameterInfo метод в <className>.cpp файл

Минимальное значение параметра

12.00

GetParameterInfo метод в <className>.cpp файл

Значение по умолчанию параметра

1000

kDefaultValue_ParamOne пустите в ход значение от <className>.h файл

Измерительное имя модулей

Гц

Измерительный модуль, как указано в GetParameterInfo метод в <className>.cpp файл.

Ползунок

Корректируемый пользователь. Первоначально набор для указания значения по умолчанию параметра.

Универсальный механизм представления представляет ползунок для этого параметра. Это вызвано тем, что единица измерения параметра, как определено в GetParameterInfo метод, “линейное усиление “.

Как показано затем пользовательское представление может обеспечить значительно больше значения и утилиты, чем универсальное представление.

Пользовательские представления

Когда узел открывает Ваше аудиоустройство, он спрашивает, существует ли пользовательское доступное представление. Если так, это может использовать его, как описано в поле зрения Инстанцирование и Инициализация.

Вот является пользовательское представление для того же аудиоустройства, описанного в Универсальном Представлении, а именно, аудиоустройстве FilterDemo от Core Audio SDK:

../Art/custom_view.jpg

Основная функция этого пользовательского представления является кривой частотной характеристики в реальном времени. Это делает пользовательское представление (и, по ассоциации, аудиоустройство) более привлекательный и намного более полезный. Вместо того, чтобы видеть просто пару чисел, пользователь может теперь видеть частотную характеристику, включая то, как резонансная частота фильтра и частота отсечки влияют на ответ. Независимо от того, какой аудиоустройство Вы создаете, можно предоставить подобные преимущества пользователям при включении пользовательского представления с аудиоустройством.

Преимущества пользовательских представлений по универсальным представлениям включают:

Проект аудиоустройства 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];
}

Если Вы не предоставите пользовательское представление свое аудиоустройство, то узел создаст универсальное представление на основе параметра Вашего аудиоустройства и определений свойства.

Вот то, что происходит, с точки зрения представления представления пользователю, когда узел открывает аудиоустройство:

  1. Хост-приложение вызывает GetProperty метод на аудиоустройстве, чтобы узнать, имеет ли это пользовательское представление, как показано в Перечислении 3-1. Если аудиоустройство обеспечивает представление Cocoa, аудиоустройство должно реализовать kAudioUnitProperty_CocoaUI свойство. Если аудиоустройство обеспечивает представление Carbon, аудиоустройство должно реализовать kAudioUnitProperty_GetUIComponentList свойство. Остальная часть этой последовательности принимает использование Какао пользовательское представление.

  2. Узел вызывает GetPropertyInfo метод для kAudioUnitProperty_CocoaUI свойство для обнаружения, сколько Какао пользовательские представления доступно. Как короткий путь, узел может пропустить вызов к GetPropertyInfo. В этом случае узел получил бы первое представление в массиве класса представления при помощи кода такой как показано в упоминании выше, с помощью индекса массива 0: factoryClassName = (NSString *) cocoaViewInfo -> mCocoaAUViewClass[0];. В этом случае перейдите непосредственно к шагу 4.

  3. Аудиоустройство возвращает размер AudioUnitCocoaViewInfo структура как целочисленное значение, указывая, сколько Какао пользовательские представления доступно. Как правило, разработчики создают одно представление на аудиоустройство.

  4. Узел исследует значение cocoaViewInfo для обнаружения, где пакет представления и что основной класс представления для представления (или для указанного представления, если аудиоустройство обеспечивает больше чем один).

  5. Нагрузки хоста пакет представления, запускающийся путем загрузки основного класса представления для инстанцирования его.

Существуют некоторые правила о том, как структурировать основной класс представления для представления Cocoa:

Представление аудиоустройства должно работать, инстанцируют ли аудиоустройство просто или было ли это инициализировано. Если узел деинициализирует аудиоустройство, представление должно продолжать работать. Т.е. представление не должно предполагать, что инициализируется его аудиоустройство. Это достаточно важно на практике что 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;

Вот то, как работает эта структура:

  1. Идентифицирует тип уведомления, как определено в AudioUnitEventType перечисление.

  2. Идентифицирует параметр, вовлеченный в уведомление, для уведомлений, которые являются, начинают или заканчивают жесты или изменения в параметрах. (См. Жесты Параметра.) AudioUnitParameter тип данных используется Событием Аудиоустройства API а не платформой Аудиоустройства, даже при том, что это определяется в платформе Аудиоустройства.

  3. Идентифицирует свойство, вовлеченное в уведомление, для уведомлений, которые являются уведомлениями изменения свойства.

Соответствие 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 папка.

../Art/gestures_1.jpg../Art/gestures_1.jpg

2. Нажмите Build для разрабатывания проекта аудиоустройства. (Можно видеть некоторые предупреждения о “невиртуальных деструкторах “. Проигнорируйте эти предупреждения.)

XCode создает новое build папка в FilterDemo папка проекта.

3. Откройтесь build папка и взгляд в Development целевая папка.

../Art/gestures_2.jpg

Недавно созданный пакет аудиоустройства называют FilterDemo.component, как показано в числе.

4. Скопируйте FilterDemo.component свяжитесь к ~/Library/Audio/Plug-Ins/Components папка. В этом расположении недавно созданное аудиоустройство доступно хост-приложениям.

5. Запустите хост-приложение аудиоустройства AU Lab (в /Developer/Applications/Audio/) и создайте новый документ AU Lab. Если Вы не сконфигурировали AU Lab для использования стиля документа по умолчанию, Создавание Нового Окна документа открывается. Если AU Lab уже работала, выберите File> New для получения этого окна.

../Art/au_lab_new_doc_1.jpg

Гарантируйте, что конфигурация соответствует настройки, показанные в числе: встроенное Аудио для Аудиоустройства, Строки В для Входного Источника и Стерео для Каналов вывода. Оставьте вкладку Inputs окна несконфигурированной; Вы укажете ввод позже. Нажать «OK».

Новое окно AU Lab открывается, показывая канал вывода, который Вы указали.

../Art/au_lab_new_doc_2.jpg

6. Щелкните по треугольной кнопке меню в одной строке раздела Effects в Ведущем устройстве, отслеживают в AU Lab, как показано в числе.

../Art/gestures_3.jpg

В меню, открывающемся, выберите аудиоустройство Фильтра из Демонстрационной группы Apple:

../Art/gestures_4.jpg

Пользовательское представление для аудиоустройства Фильтра открывается.

../Art/gestures_5.jpg

Кривая частотной характеристики пользовательского представления нарисована в режиме реального времени на основе фактической частотной характеристики аудиоустройства. Аудиоустройство делает свои доступные данные частотной характеристики к пользовательскому представлению путем объявления пользовательского свойства. Аудиоустройство совершенствует значение своего пользовательского свойства. Пользовательское представление запрашивает пользовательское свойство аудиоустройства для рисования кривой частотной характеристики.

7. Щелчок опции имя аудиоустройства в строке Эффектов.

../Art/gestures_6.jpg

Второй экземпляр представления для аудиоустройства Фильтра открывается.

../Art/gestures_7.jpg../Art/gestures_7.jpg

8. Щелкните по всплывающему меню типа представления в одном экземпляре представления аудиоустройства, как показано в числе:

../Art/gestures_8.jpg../Art/gestures_8.jpg

В меню, открывающемся, выберите Универсальный элемент Представления:

../Art/gestures_9.jpg../Art/gestures_9.jpg

Представление изменяется на универсальное представление, как показано в следующем числе. Вы теперь устанавливаетесь для демонстрации событий аудиоустройства и жестов.

9. Щелкните и содержите один из ползунков в универсальном представлении, как показано в числе. Когда Вы щелкаете, замечаете, что крест нитей в пользовательском представлении становится выделенным в ярком синем. Они остаются выделенными, пока Вы удерживаете кнопку мыши.

../Art/gestures_10.jpg../Art/gestures_10.jpg

Поскольку Вы перемещаете ползунок в универсальное представление, кривая частотной характеристики в пользовательском представлении идет в ногу с новой установкой.

  • Выделение и невыделение креста нитей в пользовательском представлении, когда Вы щелкаете и выпускаете на ползунке в универсальном представлении, следуете из событий жеста.

  • Изменения в частотной характеристике изгибаются в пользовательском представлении, поскольку Вы перемещаете ползунок в универсальное представление, следуете из событий изменения параметра

10. Наконец, щелкните и содержите на пересечении креста нитей в пользовательском представлении. Когда Вы щелкаете, замечаете, что ползунки в универсальном представлении становятся выделенными. Поскольку Вы перемещаете крест нитей в пользовательское представление, ползунки в универсальном представлении идут в ногу с новыми настройками.

../Art/gestures_11.jpg../Art/gestures_11.jpg

Это демонстрирует, что оба представления и само аудиоустройство, остаются в синхронизации посредством событий аудиоустройства.