Каналы ACX
В этом разделе рассматриваются каналы ACX. Общие сведения о acX и списке терминов ACX см. в обзоре расширений аудиоклассов ACX.
Как описано в сводке объектов ACX, объект AcxCircuit представляет частичный или полный звуковой путь пользователю (динамики, микрофон и т. д.). AcxCircuit имеет по крайней мере один входной пин-код и один выходной пин-код (ACXPIN), и он может агрегировать один или несколько acxElements, таких как объекты. Канал представляет существующую конечную точку и ее возможности.
И ACX Stream — это компонент драйвера, созданный для представления звукового потока, созданного каналом. Поток состоит из списка элементов, созданных на основе элементов родительского канала. Канал Stream — это канал в архитектуре многоуровневый стек (частичный звуковой путь), который напрямую взаимодействует со службой потоковой передачи в верхнем режиме пользователя. Основной канал — это канал в архитектуре многоуровневый стек (частичный звуковой путь), который предоставляет удостоверение устройства аудио конечной точки.
Идентификация цепи ACX
Каждый канал ACX имеет идентификатор канала. ACX определяет следующее:
Имя (str), однозначно идентифицирует этот тип звукового устройства канала. Он используется для поиска параметра INF и является частью символьной ссылки, используемой для доступа к этому каналу с удаленного устройства. Пример: Render0, Render1 или Capture0.
Символьная ссылка. Символьная ссылка связана со всеми предоставленными каналами. Клиенты используют эту символьную ссылку для открытия пути связи с устройством или каналом.
Идентификатор компонента канала (GUID). Уникально идентифицирует экземпляр канала (конкретный поставщик). Его нельзя использовать в привязках AcxCircuitTemplate, если был указан URI канала.
URI компонента канала (str). Уникально идентифицирует экземпляр канала (конкретный поставщик). Его нельзя использовать в привязках AcxCircuitTemplate, если был указан идентификатор канала.
Идентификатор компонента фабрики каналов (GUID). Уникально идентифицирует экземпляр фабрики каналов (конкретный поставщик). Его нельзя использовать в привязках AcxCircuitTemplate, если был указан URI фабрики каналов.
URI компонента фабрики каналов (str). Уникально идентифицирует экземпляр фабрики каналов (конкретный поставщик). Его нельзя использовать в привязках AcxCircuitTemplate, если был указан идентификатор фабрики каналов.
AcxCircuitCreate
Функция AcxCircuitCreate используется для создания ACXCIRCUIT. Непрозрачная структура ACXCIRCUIT_INIT, используемая функцией AcxCircuitCreate. AcxCircuitInitAllocate используется для инициализации структуры ACXCIRCUIT_INIT.
AcxFactoryCircuit
Драйвер ACX также может создавать объекты AcxFactoryCircuit (поставщики каналов) во время последовательности питания с помощью функции AcxFactoryCircuitCreate и функции AcxDeviceAddFactoryCircuit.
Композиция канала ACX
ACX связывает каналы вместе, пока они не образуют полный звуковой путь. ACX использует звуковые привязки для соединения звуковых каналов. Дополнительные сведения см. в статье о составе с мультициркуитом ACX.
Динамическое создание канала ACX (в любое время)
ACX может создавать динамический канал по запросу. Для этого драйвер выделяет структуру WDFDEVICE_INIT путем вызова WdfPdoInitAllocate. Затем драйвер указывает любые обратные вызовы PnP/power, которые он хочет получить и создает устройство. Драйвер создает экземпляр нового устройства или канала, вызвав AcxDeviceAddCircuitDeviceDevice. Дополнительные сведения см. в описании перечисления устройств ACX.
Динамическое удаление канала ACX
Драйвер вызывает AcxDeviceRemoveCircuitDevice , чтобы удалить звуковое устройство из списка устройств. Это активирует последовательность выключения питания на устройстве или сущности канала ACX. Устройство канала или канал удаляются асинхронно. Дополнительные сведения см. в описании перечисления устройств ACX.
AcxDeviceRemoveCircuit и AcxDeviceDetachCircuit
Существует два распространенных способа управления завершением канала. AcxDeviceDetachCircuit или AcxDeviceRemoveCircuit.
Если вызывающий объект вызывает AcxDeviceDetachCircuit , он не должен вызывать AcxDeviceRemoveCircuit. Если вызывающий драйвер хочет удалить канал после AcxDeviceDetachCircuit, он должен использовать WdfObjectDelete.
При вызове AcxDeviceRemoveCircuit вызывающий драйвер сообщает ACX удалить этот канал и удалить его с устройства. В этом случае нет необходимости вызывать WdfObjectDelete в канале.
В итоге AcxDeviceDetachCircuit означает, что драйвер владеет управлением временем существования объектов цепи, AcxDeviceRemoveCircuit означает, что канал будет удален и удален.
Общие сведения об управлении жизненным циклом объектов WDF см. в разделе "Жизненный цикл объектов Framework".
AcxDeviceRemoveCircuitDevice
Отличается от завершения цепи, описанной выше, AcxDeviceRemoveCircuitDevice используется драйвером звука для удаления существующей конечной точки звука и может вызываться в любое время во время жизненного цикла драйвера.
Драйверы также могут отказаться всегда уничтожать и повторно создавать звуковые устройства при перебалансе. Это тот же сценарий выше, когда устройство обнаруживает, что новые параметры несовместимы со старыми.
Удаление канала необходимо выполнить в EvtDevicePrepareHardware/EvtDeviceReleaseHardware, а новый канал создается в EvtDevicePrepareHardware. Драйвер удаляет канал, отменив регистрацию канала (с помощью AcxDeviceRemoveCircuit).
Функция обратного вызова EvtAcxCircuitReleaseHardware (EVT_ACX_CIRCUIT_RELEASE_HARDWARE)
Если драйвер зарегистрировал функцию обратного вызова EvtAcxCircuitReleaseHardware, платформа вызывает ее во время следующих переходов:
- Перебалансирование ресурсов
- Упорядочение удаления
- Удаление сюрпризов
Платформа ACX вызывает функцию обратного вызова EvtAcxCircuitReleaseHardware после остановки отправки запросов ввода-вывода на устройство, все прерывания, назначенные устройству, отключены и отключены, а устройство отключено.
Платформа ACX вызывает функцию обратного вызова EvtAcxCircuitReleaseHardware, прежде чем платформа WDF вызывает функцию обратного вызова EvtDeviceReleaseHardware драйвера.
Когда платформа вызывает EvtAcxCircuitReleaseHardware PDO для устройства по-прежнему существует и может запрашиваться сведения об устройстве, доступные в состоянии выключенного питания, например состояние конфигурации PCI.
Кроме того, преобразованные аппаратные ресурсы, предоставляемые платформой evtDeviceReleaseHardware, по-прежнему назначаются устройству. Основная цель этой функции обратного вызова — освободить эти ресурсы и, в частности, отменить сопоставление ресурсов памяти, сопоставленных функцией обратного вызова EvtAcxCircuitPrepareHardware. Драйвер также может использовать этот обратный вызов для выполнения любых других действий управления ACXCIRCUIT, которые могут потребоваться в состоянии выключенного питания. Обычно все остальные операции завершения работы оборудования должны выполняться в функции обратного вызова EvtDeviceD0Exit драйвера.
Платформа ACX всегда вызывает функцию обратного вызова EvtAcxCircuitReleaseHardware, если функция обратного вызова EvtAcxCircuitPrepareHardware была вызвана, если не был возвращен код сбоя EvtAcxCircuitPrepareHardware.
Дополнительные сведения об аппаратных ресурсах см. в разделе "Общие сведения о аппаратных ресурсах".
Функция обратного вызова EvtAcxFactoryCircuitReleaseHardware (EVT_ACX_FACTORY_CIRCUIT_RELEASE_HARDWARE)
Когда платформа вызывает EvtAcxFactoryCircuitReleaseHardware PDO для устройства по-прежнему существует и может запрашиваться сведения об устройстве, доступные в состоянии выключенного питания, например состояние конфигурации PCI.
Кроме того, преобразованные аппаратные ресурсы, предоставляемые платформой evtDeviceReleaseHardware, по-прежнему назначаются устройству. Основная цель этой функции обратного вызова — освободить эти ресурсы и, в частности, отменить сопоставление ресурсов памяти, сопоставленных функцией обратного вызова EvtAcxCircuitPrepareHardware. Драйвер также может использовать этот обратный вызов для выполнения любых других действий управления ACXCIRCUIT, которые могут потребоваться в состоянии выключенного питания. Обычно все остальные операции завершения работы оборудования должны выполняться в функции обратного вызова EvtDeviceD0Exit драйвера.
Платформа ACX всегда вызывает функцию обратного вызова EvtAcxFactoryCircuitReleaseHardware, если функция обратного вызова EvtAcxFactoryCircuitPrepareHardware была вызвана, если не был вызван код сбоя EvtAcxFactoryCircuitPrepareHardware.
Дополнительные сведения об управлении объектами WDF и канала см. в статье ACX WDF Driver Lifetime Management.
См. также
Общие сведения о расширениях аудиоклассов ACX
Обмен данными между драйверами с несколькими стеками ACX