Состав нескольких контуров ACX

В этом разделе обсуждается состав нескольких контуров ACX. Общие сведения о acX и списке терминов ACX см. в обзоре расширений аудиоклассов ACX.

Как описано в сводке объектов ACX, AcxCircuit представляет собой частичный или полный звуковой путь к звуковому устройству, воспринимаемому пользователем (динамики, микрофон и т.д.). AcxCircuit имеет по крайней мере один входной пин и один выходной пин (ACXPIN), и он может агрегировать один или несколько объектов, подобных AcxElements. Общие сведения см. в разделе "Каналы ACX".

Композиция канала ACX

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

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

Схема, демонстрирующая целевую архитектуру ACX с ACXCIRCUITTEMPLATE, ACXCOMPOSITEMANAGER, ACXMANAGER, ACXCIRCUITFACTORY и ACXCIRCUIT.

Это важно

Обратите внимание, что только типы, отображаемые в синем виде, являются общедоступными: ACXCIRCUITTEMPLATE, ACXCOMPOSITETEMPLATE (не показан), ACXMANAGER, ACXCIRCUITFACTORY и ACXCIRCUITUIT. Все типы, отображаемые в фиолете, являются внутренними, и они перечислены здесь только для иллюстрации. Внутренние типы не гарантируют сохранение неизменности или доступности в различных выпусках ACX, и их не следует вызывать или использовать непосредственно.

Диспетчер ACX анализирует шаблоны каналов во время инициализации драйверов, когда драйверы ACX регистрируют их в диспетчере ACX. Драйверы ACX регистрируют составные шаблоны или привязки с помощью ACXCIRCUTTEMPLATES (#1).

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

Для шаблонов экземпляров ACX создает ACXCOMPOSITEMANAGER (#4), для универсальных шаблонов классов ACX создает ACXCOMPOSITEFACTORY (#2), который отвечает за создание объектов ACXCOMPOSITEMANAGER (#3) при обнаружении основной схемы составного элемента. Основные схемы — это схемы, которые определяют идентичность составного аудиоустройства.

ACXCOMPOSITEMANAGER поочередно создает ACXCOMPOSITE (#5) для представления составной звуковой конечной точки. Композитный менеджер отвечает за мониторинг любого дополнительного сегмента цепи, который может возникнуть после создания или инициализации композита.

ACXCOMPOSITE в свою очередь создает ACXCIRCUITMANAGER (#6) для каждой схемы, которая является частью составной. ACXCIRCUITMANAGER отвечает за создание, мониторинг и управление одним каналом (#7).

Возможно, цепь будет помечена как «по запросу», в этом случае ACXCIRCUITMANAGER находит свою фабрику цепей и запрашивает новую цепь для составного элемента (#8). ACXCIRCUITFACTORY создает ACXCIRCUIT по запросу (#9).

Когда обнаруживаются и активны все ACXCIRCUIT, ACXCOMPOSITE становится активным, а также указывает ACXCIRCUITMANAGERS включить интерфейсы аудио для своих каналов.

На следующей диаграмме последовательности показано, как два канала ACX (канал A и канал B) связаны вместе для создания полного аудиопути, который представлен построителем аудиоконечных устройств (AEB) с программным аудиоустройством.

Схема со столбцами с метками Driver A, Driver B, ACX Interface B, Circuit Manager A и B, ACX Composite и ACX Manager, иллюстрируя последовательность вызовов со стрелками потока между столбцами.

Согласование формата нескольких каналов

В этом разделе описываются переговоры о формате, когда звуковая конечная точка составляется двумя или более цепями. Общую информацию о схемах ACX см. в ACX multi stack cross driver communications.

Ниспадающее закрепление моста

Пины мостов нижнего уровня — это контакты, которые отправляют данные на визуализацию или получают данные с физического аудиоустройства напрямую или косвенно. Этот тип контактов может быть связан или не связан с "ACXMODEFORMATLISTs". Эти штифты моста имеют типы 'AcxPinQualifierBridgeB' или 'AcxPinQualifierBridgeDevice'. Дополнительные сведения об ACXMODEFORMATLIST см. в заголовке acxdataformat.h.

Схема, показывающая поток данных рендера и захвата между стриминг-пином, двумя контурами и устройством.

На этой схеме и в статье используются термины "вверх по уровню" и "вниз по уровню" для описания направления потока данных, поскольку это направление зависит от того, отправляются ли данные контактами для отрисовки или принимаются для записи.

Пониженные штифты моста без ACXMODEFORMATLIST(ов)

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

  • Каналы, доступные только для потоковой передачи, которые могут быть подключены к каналу DSP, каналу CODEC или непосредственно к звуковому устройству. Эти каналы просто перемещают данные из точки А в точку B без изменения. Эти каналы не изменяют частоту выборки данных входящих и исходящих потоков. В этом случае списки форматов режима связаны с пин-кодом uplevel.

  • Однопотоковые каналы без элементов, которые изменяют частоту входящих и исходящих выборок. Примером этого является канал USB-аудиоустройства. В этом сценарии списки форматов режима связаны с верхним контактом.

Отсутствие списка форматов данных подразумевает, что формат данных потока, исходящий из этого пина, совместим с одним из форматов данных высокоуровневого пина подключенной цепи.

Мостовые контакты более низкого уровня с использованием ACXMODEFORMATLIST(ов)

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

Некоторые возможные сценарии, в которых используются данные списки режимов-форматов, включают следующее:

  • Каналы DSP — обычно этот тип каналов поддерживает несколько потоков, работающих с разными скоростями выборки, эти потоки внутренне преобразуются в общую частоту выборки и смешиваются перед переходом данных к следующему каналу. Элемент управления списком форматирования данных задает окончательную (для этой схемы) частоту выборки.

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

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

Дополнительные сведения о списках форматов см. в заголовке acxdataformat.h.

Крепления моста вверх

Контактные штыри моста uplevel — это контакты, которые получают данные от (отрисовки) или отправляют данные в (захват) программный модуль напрямую или косвенно. Этот тип контактов должен иметь связанные с ним элементы ACXMODEFORMATLISTs. Эти штифты мостового соединителя имеют тип AcxPinQualifierBridgeA.

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

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

Обновление узлов [Bridge] без ACXMODEFORMATLIST(s)

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

Обновить контакты [Bridge] с помощью ACXMODEFORMQATLIST(s)

Пин-коды uplevel должны всегда иметь один или несколько ACXMODEFORMATLISTS. Списки форматов режима указывают все возможные частоты выборки для режима и ее частоту выборки по умолчанию. В разных режимах могут быть разные наборы выборок. Частота выборки по умолчанию — предпочтительная частота выборки для этого режима.

Режимы и каналы

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

Сопоставление режима

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

Режим RAW: поток или канал не применяет каких-либо эффектов к потоку (за исключением регулировки громкости, отключения звука и ограничений безопасности, таких как защита динамиков).

Режим DEFAULT: поток или канал выполняет некоторый эффект по умолчанию.

<mode_name> mode: поток или канал применяют эффекты, относящиеся к выбранному режиму <mode_name> .

Для потоковых пинов обязательно требуется поддержка режима raw и/или режима по умолчанию. Необязательно, чтобы потоковые пины поддерживали что-либо ещё <mode_name> modes.

В составной конечной точке возможно, что канал uplevel поддерживает несколько режимов, в то время как каналы нижнего уровня поддерживают только RAW и/или DEFAULT.

Пример в двухконтурном конечном устройстве:

  • Выходной контакт низкоуровневой цепи поддерживает режимы и связанные форматы m1{f1, f2} и m2{f3, f4}, то есть поток контакта имеет формат f1 или f2, если используется m1, или формат f3 или f4 при использовании m2. Предполагается, что высокоуровневый контур является однопотоковым.

  • Пин-код канала нижнего уровня поддерживает режим по умолчанию{f1,f2,f3}.

В этом случае режим потока преобразуется из <режима mode_name> в режим по умолчанию, сохраняя одинаковые показатели выборки.

m1/f1 по > умолчанию/f1

m1/f2 по > умолчанию/f2

m2/f3 по > умолчанию/f3

Недопустимая запись: m2/f4 до > None

Сопоставление режима выполняется драйвером с помощью ACX. В приведенной выше таблице последняя запись недопустима, нижнее поле канала uplevel должно удалить m2/f4 в качестве параметра для поддерживаемых форматов. Обратите внимание, что это могло произойти в обратном направлении, т. е., контакт повышенного уровня цепи мог бы поддерживать также f4 и f5. В этом случае default-f4 поддерживался, но default-f5 не поддерживался. В таком случае отключение отображения m?/f5 в списке является ответственностью контакта верхнего уровня цепи нижнего уровня. Дополнительные разделы ниже объясняют этот процесс.

Переговоры о формате

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

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

Текущая логика панели управления звуком отображает список форматов устройства следующим образом:

  • Если звуковое устройство поддерживает элемент звукового модуля, список форматов данных, отображаемых на панели управления, — это список форматов данных устройства, т. е. список форматов данных, подключенный к пин-коду нижнего уровня (который подключен к выходному пин-коду элемента звукового модуля).
  • Если звуковое устройство не поддерживает элемент аудиодвижка, список форматов данных, отображаемых на панели управления, — это список форматов данных для потоковой передачи, то есть список форматов данных, присоединенный к верхнему пину.

Автоматическое создание пониженного уровня потока с несколькими цепями

ACX использует объекты ACXSTREAMBRIDGE, связанные с разъемом моста предыдущего уровня, для автоматического распространения запроса на создание потока(ов) к удаленным контурам.

Когда клиентское приложение создает поток, этот запрос сначала обрабатывается стриминговым пином. ACX уведомляет драйвер, связанный с пин-кодом потоковой передачи, о запросе на создание потока через обратный вызов, предоставленный во время создания цепи. Во время обратного вызова драйвер создает объект ACXSTREAM, представляющий поток, а затем возвращает управление обратно в ACX. Когда ACX получает управление обратно, он проверяет, нужно ли пересылать этот запрос на следующий нижележащий контур. При необходимости драйвер может перенаправить запрос на создание потока в следующий (нижний) канал перед возвратом из функции обратного вызова create-stream. Последний вариант позволяет драйверу выполнять любые операции после завершения операций после того, как каналы нижнего уровня имели возможность обрабатывать их запросы на создание.

ACX использует следующую логику по умолчанию для создания потока:

  • Если нет нижнего мостового контакта, работа завершена.
  • Если драйвер уже связыл поток с ACXSTREAMBRIDGE вручную, все готово.
  • Если контакт моста нижнего уровня не имеет ACXSTREAMBRIDGE для указанного РЕЖИМА, запрос завершится сбоем.
  • ACX добавляет новый поток, созданный драйвером с извлеченным ACXSTREAMBRIDGE.

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

ACXSTREAMBRIDGE использует следующую логику для выбора режима потока и формата данных.

  • Если режим для внепотока не указан, проверьте, существует ли список форматов по умолчанию.

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

  • Если режим NULL_GUID, проверьте, есть ли список форматов, связанный с РЕЖИМом первого в потоке.

  • Если указан режим, проверьте, есть ли список форматов для этого РЕЖИМА.

  • Если список форматов найден, получите формат по умолчанию из списка форматов.

  • Если формат не найден, ACXSTREAMBRIDGE использует формат первого элемента потока.

  • ACXSTREAMBRIDGE создает запрос на создание потока, используя ACXTARGETSTREAM, с полученными РЕЖИМОМ и форматом данных следующим образом:

    • Если задан режим, используется этот режим.
    • Если режим был NULL_GUID, используется режим первого в потоке.
    • В противном случае режим не используется.

ACX заботится об удалении или закрытии целевого потока, когда последний внутренний поток удаляется.

Еще одним заданием ACXSTREAMCIRCUIT является автоматическое распространение состояния потока вдоль цепочки потоковой передачи.

Драйвер имеет возможность отключить удаленное создание моста потока по умолчанию, вызвав AcxCircuitInitDisableDefaultStreamBridgeHandling или вручную связав объект ACXSTREAM с ACXSTREAMBRIDGE перед возвратом управления в ACX. В последнем случае удаленный поток создается перед возвратом драйвера из функции обратного вызова EVT_ACX_CIRCUIT_CREATE_STREAM в create-stream.

Для схем, использующих несколько пинов захвата и воспроизведения, таких как host/offload/loopback/kws, т. е. при поддержке элемента аудио-движка, драйвер должен создать потоковый мост без указания режимов на входе и вручную добавлять входящие объекты ACXSTREAM в потоковый мост при обработке обратного вызова create-stream.

Дополнительные сведения о создании моста потоков см. в следующем разделе:

Распространение состояния автоматического потока с несколькими каналами на потоки нижнего уровня

ACXSTREAMBRIDGE автоматически распространяет запрос состояния потока на удаленные каналы. При изменении состояния потока ACXSTREAMBRIDGE вычисляет смешанное состояние внепотока и отправляет новый запрос "stream-state" в удаленный поток с помощью ACXTARGETSTREAM.

ACXSTREAM вместе с ACXSTREAMBRIDGE использует следующую логику:

  • Измените состояния вышестоящих потоков в следующих сценариях:

    • Отрисовка и из состояния 'Стоп' в 'Запуск'>
    • Запись &&& из остановки запуска>
    • Другие && переходы из состояния запуска в остановку
  • Измените состояния потоков более высокого уровня последними в следующих сценариях:

    • Отрисовка && переход от выполнения к остановке
    • Запись && переход от Стоп к Запустить
    • Другие и переход от остановки к запуску>

Драйверы могут изменить этот порядок с помощью параметра конфигурации.

Замечание

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

См. также

Цепи ACX

Общие сведения о расширениях аудиоклассов ACX

Междрайверная коммуникация в мультистековой архитектуре ACX

Сводка объектов ACX