Аудио на OS X
Эта глава дает обзор аудио на OS X, описывая его возможности, его взаимосвязанные технологии и его архитектуру. Чтение этой главы поможет Вам понять, как семья Audio Набора I/O совмещается и взаимодействует с другими частями аудио программного обеспечения на OS X.
Возможности аудио OS X
В версиях системного программного обеспечения Macintosh до OS X звуковые возможности системы в основном зависели от доступности стороннего аудио и протоколов MIDI и служб. Apple разработал аудиосистему OS X, чтобы консолидировать, интегрировать, и стандартизировать эти службы и протоколы, таким образом оптимизировав конфигурацию аудиоустройств и MIDI-устройств и разработки будущего аудио и технологий MIDI.
Аудио на OS X включает несколько аудио технологий, взятый вместе, предлагающих следующие возможности:
Встроенная поддержка множества форматов аудио, включая форматы на основе импульсно-кодовой модуляции (PCM) и закодированные форматы, такие как AC 3 и MP3
Многоканальный аудио I/O, который является масштабируемым к фактически неограниченному количеству каналов
Переменные частоты дискретизации
Удивительно чистый сигнальный тракт, требующий мало наверху
Одновременный доступ для многократных клиентов ко всем аудиоустройствам, присоединенным к узлу, независимо от того как соединение сделано (PCI, USB, FireWire, и т.д.)
Вне ядра OS X представляет аудио как 32-разрядные данные с плавающей запятой; этот формат позволяет эффективную обработку данных с сегодняшними усовершенствованными аудио периферийными устройствами (например, способные к 24-разрядной, работе на 192 кГц) и гарантирует, что система может масштабироваться к будущим форматам с высокой разрешающей способностью.
Архитектура аудио OS X
Аудио возможности OS X являются результатом нескольких программных технологий, которые доступны через их общедоступные интерфейсы программирования. Эти технологии расположены на разных уровнях операционной системы, где их отношения друг с другом могут быть охарактеризованы как клиент и провайдер. Другими словами, программное обеспечение аудио OS X разделено на уровни, с одним уровнем, зависящим от уровня «под» ним и передачи, через определенные интерфейсы, со смежными уровнями (см. рисунок 1-1).
Относительные расположения этих технологий на уровнях системного программного обеспечения предлагают свою степень абстракции и свою близость к аудио аппаратным средствам. Некоторые аудио технологии в OS X включены в среду ядра (т.е. Дарвин), в то время как другие упаковываются как платформы для использования средами приложения, приложениями и другими пользовательскими процессами.
На самом низком уровне аудио OS X штабель является драйвером, управляющим аудио аппаратными средствами. Драйвер основывается на аудио семье Набора I/O, обеспечивающей большую часть функциональности и структур данных, необходимых драйверу. Например, семья Audio реализует основные механизмы синхронизации, обеспечивает пользовательские объекты клиента, связывающиеся с верхними уровнями, и поддерживает выборку и буферы соединения (которые содержат аудиоданные для аппаратных средств и клиентов аппаратных средств, соответственно).
Основная роль драйвера аудио должна управлять процессом, перемещающим аудиоданные между аппаратными средствами и демонстрационным буфером. Это ответственно за предоставление тех демонстрационных данных верхним уровням системы при необходимости, делая любые необходимые преобразования формата в процессе. Кроме того, драйвер аудио должен выполнить необходимые вызовы к аудио аппаратным средствам в ответ на формат и изменения управления (например, объем и бесшумный режим).
Сразу выше драйвера и семьи Audio Набора I/O — и только через границу между ядром и пространство пользователя — Аудио Уровень аппаратной абстракции (HAL). Аудио HAL функционирует как интерфейс устройства для семьи I/O Kit Audio и ее драйверов. Для входных потоков его задание должно сделать аудиоданные, которые это получает от драйверов, доступных для его клиентов. Для потоков вывода его задание должно взять аудиоданные от его клиентов и передать их определенному драйверу аудио.
Аудиоустройства и Аудио платформы Панели инструментов являются двумя другими платформами, предоставляющими специализированные аудио услуги. Они оба создаются поверх Аудио HAL, реализованный в платформе Core Audio.
Системные службы MIDI, который включает две других платформы, не непосредственно зависят от Аудио HAL. Как его имя предполагает, Системные службы MIDI делает службы MIDI доступными для приложений и представляет API для создания драйверов MIDI.
Наконец, окончательные клиенты аудио на OS X — приложения, платформы, и другие пользовательские процессы — могут непосредственно получить доступ к Аудио HAL или косвенно получить доступ к нему через одну из высокоуровневых аудио платформ. Они могут также косвенно получить доступ к Аудио HAL через связанный с аудио APIs сред приложения, которым они принадлежат: Звучите как менеджер в Углероде, NSSound
в Какао и Java звучат как APIs.
Следующие разделы исследуют каждую из этих аудио технологий OS X более подробно.
Аудио HAL (Core Audio)
Аудио Уровень аппаратной абстракции (HAL) является уровнем аудиосистемы OS X, выступающей в качестве посредника между драйверами Набора I/O, управляющими аудио аппаратными средствами и программами и платформами в пространстве пользователя, которые являются клиентами аппаратных средств. Более в частности Аудио HAL является стандартизированным интерфейсом устройства для семьи Audio Набора I/O. Это реализовано в платформе Core Audio (CoreAudio.framework
) и подарки и язык C и Java APIs. В Аудио HAL все аудиоданные находятся в 32-разрядном формате с плавающей точкой.
API Аудио HAL включает три основных абстракции: аудио аппаратные средства, аудиоустройство и аудиопоток.
Аудио аппаратный API предоставляет клиентский доступ к аудио объектам, существующим в «глобальном» пространстве, таком как список текущих устройств и устройства по умолчанию.
API аудиоустройства позволяет клиентам управлять и запросить определенное аудиоустройство и механизмы I/O, которые оно содержит. Аудиоустройство в Аудио, HAL представляет единственный цикл I/O, источник часов на основе его и все буферы, синхронизирующиеся с этим циклом. Методы аудиоустройства разрешают, чтобы клиент к, среди прочего, запустил и остановил аудиопотоки, получил и перевел время, и получил и установил свойства аудиоустройства.
Аудиопоток API позволяет клиенту управлять и запросить аудиопоток. Каждое аудиоустройство имеет один или несколько аудиопотоков, инкапсулирующих буфер памяти, используемой для передачи аудиоданных через границу пользователя/ядра. Они также указывают формат аудиоданных.
Абстракции аудиоустройства и аудиопотока свободно соответствуют различным объектам семьи I/O Kit Audio в ядре (см. Аудио семью). Например, объект, называемый «аудиоустройством» в Аудио HAL, соответствует комбинации IOAudioDevice
и IOAudioEngine
в ядре. Для каждого IOAudioEngine
Аудио, которое HAL находит в ядре, оно генерирует идентификатор аудиоустройства. Однако существует значительное перекрытие роли среди различной семьи Audio и Аудио объекты HAL и объекты.
Критическая часть APIs для аудио аппаратных средств, устройств и потоков включает аудио свойства и их связанные уведомления. Этот APIs позволяет клиентам получать и устанавливать свойства аудио аппаратных средств. «Получить» методы синхронны, но работа методов «набора» асинхронным способом, использующим уведомления. Клиенты Аудио HAL реализуют “слушателя procs” — функции обратного вызова для свойств, связанных с аудио аппаратными средствами, аудиоустройствами или аудиопотоками. Когда драйвер аудио изменяет свойство аппаратных средств, или в результате пользовательского манипулирования физической проверкой или в ответ на метод «набора», это отправляет уведомления заинтересованному Аудио клиенты HAL. Это приводит к соответствующему “слушателю procs” быть вызванным.
Столь важный, как свойство APIs является прототипом обратного вызова (AudioDeviceIOProc
) то, что подмножество аудиоустройства Аудио HAL API определяет для управления I/O. Клиенты Аудио HAL должны реализовать функцию или метод, соответствующий этому прототипу для выполнения транзакций I/O для данного устройства. Через эту функцию Аудио HAL представляет все вводы и выводы одновременно в цикле I/O клиенту для обработки. В этой функции клиенте Аудио HAL должен отправить аудиоданные в аудиоустройство (для вывода), или скопировать и обработать аудиоданные, полученные от аудиоустройства (для ввода).
Вторичные аудио платформы
OS X имеет несколько платформ кроме платформы Core Audio, предлагающих связанную с аудио функциональность приложениям. Две из этих платформ — Аудиоустройств и Аудио Панели инструментов — создаются непосредственно на платформе Core Audio. Системные службы MIDI (состоящий из Core MIDI и Серверных инфраструктур Core MIDI) непосредственно не зависят от платформы Core Audio, но являются все еще потребителем служб аудио платформ.
Все эти вторичные платформы реализованы на языке C и представляют их общедоступные интерфейсы программирования в C. Таким образом любое приложение или другая программа в любой среде приложения могут использовать в своих интересах их возможности.
Аудиоустройства
Платформа Аудиоустройств (AudioUnits.framework
) предоставляет поддержку для генерации, обработки, получения, и управления или преобразования потоков аудиоданных. Эта функциональность основывается на понятии аудиоустройств.
Аудиоустройства являются одной формой стандартного блока, названного компонентом. Компонент является частью кода, обеспечивающего определенный набор служб одному или более клиентам. В случае аудиоустройств эти клиенты могут использовать компоненты аудиоустройства или отдельно или соединенный вместе для формирования графика звукового сигнала. Для создания графика звукового сигнала клиенты могут использовать API AUGraph в Аудио платформе Панели инструментов — посмотрите Аудио Панель инструментов для подробных данных.
Аудиоустройство может иметь один или несколько вводов и выводов. Вводы могут принять или закодированные аудиоданные или данные MIDI. Вывод обычно является буфером аудиоданных. Используя “получение по запросу I/O” модель, аудиоустройство указывает число и формат его вводов и выводов через его свойства. Каждый вывод является сам по себе потоком произвольного числа чередованных звуковых каналов, полученных из вводов аудиоустройства. Клиенты также управляют соединениями между модулями через свойства.
Примерами аудиоустройств являются процессоры DSP (такие как реверберации, фильтры и микшеры), преобразователи форматов (например, 16-разрядное целое число к преобразователям с плавающей точкой), interleavers-deinterleavers, и преобразователям частоты дискретизации. В дополнение к определению интерфейса для пользовательских аудиоустройств в платформе Аудиоустройств Apple поставляет ряд аудиоустройств. Один из них является компонентом MusicDevice, представляющим API, предназначенный в частности к синтезу программного обеспечения.
Аудио панель инструментов
Аудио платформа Панели инструментов (AudioToolbox.framework
) дополняет платформу Аудиоустройств двумя основными абстракциями: AUGraph и Аудиоплеер.
AUGraph предоставляет полное описание сети обработки звукового сигнала. Это - программируемый объект, представляющий ряд аудиоустройств и соединений (ввод и вывод) среди них. С APIs AUGraph можно создать пути произвольного сигнала, через которые может быть обработано аудио. Аудио графики предписывают изменения маршрутизации в реальном времени, в то время как аудио обрабатывается, создавая и повреждая соединения между аудиоустройствами «на лету», таким образом поддерживая представление графика, даже когда не инстанцировали составляющие аудиоустройства.
APIs Аудиоплеера использует AUGraphs для предоставления услуг панели инструментов упорядочивания, собирающей аудио события в дорожки, которые могут тогда быть скопированы, вставлены и циклично выполнены в последовательности. APIs самостоятельно состоит из многих связанных программируемых объектов. Аудиоплеер играет Музыкальную Последовательность, которая может быть создана из стандартного файла MIDI. Музыкальная Последовательность содержит произвольное число дорожек (Музыкальные треки), каждый из которых содержит аудио события с меткой времени в возрастающем временном порядке. Музыкальная Последовательность обычно имеет AUGraph, связанный с ним, и Музыкальный трек обычно адресует свои аудио события к определенному Аудиоустройству в графике. События могут включить темп и расширенные события, а также регулярные события MIDI.
Аудио платформа Панели инструментов также включает APIs для преобразования аудиоданных между различными форматами.
Системные службы MIDI
Системные службы MIDI являются технологией, позволяющей приложениям и MIDI-устройствам связываться друг с другом единственным, объединенным способом. Это включает две платформы: Core MIDI (CoreMIDI.framework
) и сервер Core MIDI (CoreMIDIServer.framework
).
Системные службы MIDI предоставляют пользовательским процессам высокоэффективный доступ к аппаратным средствам MIDI. Способом, подобным Аудио HAL, Системные службы MIDI реализуют сменный интерфейс, позволяющий клиентам связаться с драйвером MIDI-устройства.
Apple обеспечивает несколько драйверов MIDI по умолчанию для интерфейсов, соответствующих USB и стандартам MIDI-интерфейса FireWire. Используя Серверную инфраструктуру Core MIDI, сторонние производители MIDI могут создать свои собственные плагины драйвера, чтобы поддерживать дополнительные специфичные для устройства функции. Сервер MIDI может тогда загрузить и управлять теми драйверами.
Приложения могут передать с драйверами MIDI через клиентскую сторону APIs платформы Core MIDI.
Аудио семья
Семья Audio Набора I/O упрощает создание драйверов для аудио аппаратных средств. Драйверы, создаваемые через семью Audio, могут поддерживать любые аппаратные средства в системе, включая PCI, USB и устройства FireWire. По существу драйвер аудио Набора I/O передает аудиоданные между аппаратными средствами и Аудио HAL. Это обеспечивает один или несколько демонстрационные буферы вместе с процессом, перемещающим данные между аппаратными средствами и теми демонстрационными буферами. Обычно это сделано с механизмом DMA аудио аппаратных средств.
Поскольку собственный формат аудиоданных по OS X является 32-разрядной плавающей точкой, драйвер должен обеспечить подпрограммы для преобразования между аппаратным форматом данных в демонстрационной буферной и 32-разрядной плавающей точке. Последовательность шагов, которые выполняет драйвер, зависит от направления потока. Например, с входными аудиоданными, драйвер просят относительно блока данных. Это получает его из демонстрационного буфера, преобразовывает его в ожидаемый клиентский формат (32-разрядная плавающая точка) и возвращает его. Те данные тогда передаются семьей Аудио HAL через механизм пользователя-клиента.
Взаимодействия между механизмом DMA, драйвером, и Аудио HAL, основываются на предположении, что в любом направлении поток аудиоданных продолжается постоянно на том же уровне. Семья Audio устанавливает несколько таймеров (на основе регулярно бравшихся меток времени) для синхронизации действий агентов, вовлеченных в эту передачу данных. Эти механизмы синхронизации гарантируют, что аудиоданные обрабатываются в максимальной скорости и с минимальной задержкой.
Возьмите снова входной поток в качестве примера. Вскоре после демонстрационных кадров записей механизма DMA к водительскому демонстрационному буферу драйвер считывает те данные, преобразовывает целочисленный формат в 32-разрядную плавающую точку и пишет получающиеся кадры в буфер микшера, откуда они передаются Аудио HAL. Дополнительно, непосредственно перед тем, как механизм DMA пишет новые кадры в то же расположение в демонстрационном буфере, нуль «стирающей головки» - инициализирует просто обработанные кадры. (По умолчанию, однако, стирающая головка только работает на потоках вывода.)
Для больше на демонстрационном буфере и механизмах таймера, используемых семьей Audio, посмотрите Аудио Модель I/O на OS X.
Драйвер аудио Набора I/O состоит из многих объектов, самый важный из которых получены из IOAudioDevice
, IOAudioEngine
, IOAudioStream
, и IOAudioControl
классы. Эти объекты выполняют следующие роли для драйвера:
Единственный экземпляр пользовательского подкласса
IOAudioDevice
представляет само аудиоустройство.IOAudioDevice
подкласс является корневым объектом полного драйвера аудио. Это ответственно за отображение всех аппаратных ресурсов от куска поставщика услуг и для управления всем доступом к аппаратным средствам (обработанный автоматически через предоставленный логический элемент команды).IOAudioDevice
объект управляет один или большеIOAudioEngine
объекты.Драйвер аудио должен содержать один или несколько экземпляров пользовательского подкласса
IOAudioEngine
. Этот пользовательский подкласс управляет каждым аудио механизмом I/O, связанным с аудиоустройством. Его задание должно управлять процессом, передающим данные между аппаратными средствами и демонстрационным буфером. Обычно процесс I/O реализован как аппаратные средства механизм DMA (несмотря на то, что это не должно быть). Демонстрационный буфер должен быть реализован как кольцевой буфер так, чтобы когда процесс I/O выполненияIOAudioEngine
достигает конца буфера, он повторяется назад к началу и продолжает идти.IOAudioEngine
объект также ответственен за запуск и остановку механизма, и за взятие метки времени каждый раз, когда демонстрационный буфер повторяется к началу. Это содержит один или большеIOAudioStream
объекты и могут содержать любое числоIOAudioControl
объекты.Вся выборка буферизует в сингле
IOAudioEngine
должен быть тот же размер и работающий на том же уровне. Если необходимо обработать больше чем один размер буфера или частоту дискретизации, необходимо использовать больше чем одинIOAudioEngine
.Экземпляр
IOAudioStream
представляет демонстрационный буфер, связанный буфер соединения и направление потока.IOAudioStream
объект также содержит представление текущего формата демонстрационного буфера, а также списка позволенных форматов для того буфера.Экземпляр
IOAudioControl
представляет любой управляемый атрибут аудиоустройства, такого как объем или бесшумный режим.
Драйвер аудио Набора I/O использует два пользовательских объекта клиента для передачи с уровнем Audio HAL. Аудио HAL связывается с IOAudioEngine
и IOAudioControl
объекты через IOAudioEngineUserClient
и IOAudioControlUserClient
объекты, соответственно. Аудио семья создает эти объекты, поскольку они необходимы. IOAudioEngineUserClient
класс обеспечивает основную связь с IOAudioEngine
подкласс; это позволяет Аудио HAL для управления IOAudioEngine
и это позволяет механизму пасовать назад уведомления об изменениях в Аудио HAL. Для каждого IOAudioControl
объект в драйвере, IOAudioControlUserClient
возразите передает уведомления об изменениях значения в Аудио HAL.
Для более подробной информации о классах и общей архитектуре семьи Audio, см. главу Проект семьи Аудио.
Драйверы аудио Apple
Apple поставляет несколько драйверов аудиоустройства со стандартной установкой OS X. Эти драйверы подходят для большой части аудио аппаратных средств, обычно находимых на Питании компьютеры PC. “Встроенный драйвер” расширение ядра —AppleOnboardAudio.kext
— содержит почти полдюжину драйверов аудио, упакованных как плагины. Каждый из этих драйверов основывается на определенном подклассе IOAudioDevice
и каждый использует код в расширении ядра AppleDBDMAAudio для IOAudioEngine
подкласс. Набор I/O, посредством его соответствия процесса, находит и загружает надлежащие плагины на основе существующих аудио аппаратных средств. Для аппаратных средств аудио USB Apple включает драйвер, определенный в AppleUSBAudio.kext
расширение ядра.
Аудио Модель I/O на OS X
Mac OS 9 и OS X выполняет аудио I/O совсем другими способами. Различия между ними являются самыми существенными на нижних уровнях аудио штабеля, особенно модель драйвера аудио и аудио библиотек доступа.
В Mac OS 9, механизм DMA драйвера аудио передает аудиоданные между демонстрационным буфером, который предоставлен драйвером и аппаратными средствами. Буфер содержит сегмент аудиоданных, содержащих последовательность демонстрационных кадров во временном порядке.
Mac OS 9 моделей драйвера используют двойную буферизацию для обмена аудиоданными между драйвером и его клиентами, таким образом, существует фактически два демонстрационных буфера. В случае аудиовыхода, после того, как водительские клиенты (использующий Звукового менеджера API) заполняют один из буферов, аппаратные средства (обычно через его механизм DMA) сигнализируют драйвер (обычно через прерывание), что это закончено, играя другое буферное и готовое к большему количеству данных. Драйвер тогда дает аппаратным средствам буфер, это просто заполнило, получает просто играемый буфер от аппаратных средств и сигнализирует приложение, что требуется больше данных.
Архитектура и цели OS X сделали этот проект несостоятельным. С ядром OS X драйвер аудио несет большие расходы, чем на Mac OS 9, когда это сигнализирует приложение, что больше аудиоданных необходимо (или что новые данные доступны). Кроме того, главная цель аудиосистемы OS X состоит в том, чтобы поддерживать многократные одновременные клиенты, который не возможен с Mac OS 9 моделей. Новая аудио модель I/O была необходима не только для этой цели, но также и обеспечить максимально возможную производительность и самую низкую задержку. Рисунок 1-3 изображает аудио модель I/O на OS X.
Ключевой фасет аудио OS X модель I/O включает прогнозирующие механизмы синхронизации. Вместо того, чтобы требовать, чтобы драйвер передал приложение непосредственно, когда цикл I/O завершился, механизмы синхронизации включают Аудио HAL для предсказания, когда завершится цикл. HAL Аудио использует чрезвычайно точный код времени на OS X, чтобы гарантировать, чтобы клиенты выполнили свой I/O в свое время, на основе размера их буферов. Драйвер аудио вносит свой вклад для создания этого возможным путем установки демонстрационного буфера аппаратных средств как кольцевого буфера и путем взятия точной метки времени каждый раз обертки механизма I/O к началу буфера.
Аудио HAL отслеживает каждую метку времени и использует последовательность меток времени для предсказания текущего расположения аудио механизма I/O (с точки зрения демонстрационного чтения кадра или записанный) в любое время. Когда цикл завершит и устанавливает свою метку времени пробуждения соответственно, учитывая, что информация, это может предсказать. Эта модель, объединенная с возможностью семьи I/O Kit Audio получить аудиоданные от каждого клиента асинхронно, позволяет любому числу клиентов обеспечивать аудиоданные, смешанные в окончательный результат. Это также позволяет различные клиентские буферные размеры; один клиент может действовать в очень низком размере буфера (и соответственно низкая задержка), в то время как одновременно другой клиент может использовать намного более крупный буфер. Пока метки времени, предоставленные драйвером, точны, семья и Аудио, HAL выполняет всю работу для создания этого возможным.
Другое важное различие между аудио моделью I/O на Mac OS 9 и той на OS X является собственным форматом аудиоданных в системе. В Mac OS 9, потому что приложение (через Звукового менеджера) имеет прямой доступ к аппаратному буферу, это должно иметь дело с форматом собственного оборудования. Из-за этой действительности Mac OS 9 аудио библиотек только поддерживают 16-разрядный один канал или аудиоданные PCM с двумя каналами для упрощения вещей.
В OS X приложение не может непосредственно получить доступ к демонстрационному буферу. Эта косвенность разрешает использование 32-разрядного формата с плавающей точкой между Аудио HAL и драйвером аудио. Следовательно, драйвер ответственен за обеспечение подпрограммы, которая может отсечь и преобразовать тот 32-разрядные выходные данные с плавающей точкой в собственный формат буфера. Этому, возможно, также придется реализовать подпрограмму для преобразования входных данных в 32-разрядную плавающую точку. Обе подпрограммы вызывают асинхронно как Аудио, клиенты HAL передают аудиоданные драйверу и получают данные от него.
Для получения дальнейшей информации на аудио OS X модель I/O, посмотрите Аудио Модель I/O Близко.