Перечисление устройств ACX
В этом разделе рассматриваются перечисление устройств ACX, запуск и завершение работы, а также перебалансирование устройств. Общие сведения об ACX см. в расширениях аудиоклассов ACX. Сведения об управлении питанием ACX и PnP см. в разделе «Управление питанием ACX» и.
Перечисление и запуск устройств ACX для статических звуковых устройств
Чтобы узнать, как работает запуск ACX, описан следующий сценарий.
- Звуковое устройство представлено одним каналом.
- Время существования аудио-канала связано со временем существования устройства PnP.
- Одно устройство может создавать несколько каналов для разных звуковых устройств.
- Среда режима ядра KMDF.
Последовательность запуска:
WDM DriverEntry. Область действия драйвера. Рутинная функция DriverEntry для драйверов WDF
- Инициализация трассировки.
- При необходимости зарегистрируйтесь для выгрузки.
- Создайте WDFDRIVER.
- Вызовите ACX для выполнения любой инициализации post-драйвера.
- По желанию выполните инициализацию драйвера после загрузки.
WDF DeviceAdd. Область действия устройства. функция обратного вызова EVT_WDF_DRIVER_DEVICE_ADD
- Вызов ACX для инициализации контекста устройства —
ACX_DEVICEINIT_CONFIG_INIT(&devInitCfg)
функция ACX_DEVICEINIT_CONFIG_INIT - Регистрация функций обратного вызова PnP Power в WDF с кодом
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
- Создайте устройство с использованием AcxDeviceInitialize
- Вызовите ACX, чтобы выполнить последующую инициализацию устройства.
- При необходимости выполните любую постинициализацию устройства.
- Вызов ACX для инициализации контекста устройства —
WDF PrepareHardware. Область действия устройства. Функция обратного вызова EVT_WDF_DEVICE_PREPARE_HARDWARE.
Создание и инициализация аппаратных ресурсов (для прерываний и потоков регистрируйте их в ACX).
Создайте одну или несколько цепей (однократное создание).
- Создайте контекст AcxCircuitInit.
- Добавьте обратные вызовы.
- Создайте AcxCircuit.
- При необходимости выполните дополнительную инициализацию цепи.
- Зарегистрируйте контур с помощью AcxDeviceAddCircuitDevice.
Обратный вызов устройства WDF D0. Область действия устройства. Функция обратного вызова EVT_WDF_DEVICE_D0_ENTRY.
ACX вызывает функцию обратного вызова EvtAcxCircuitPowerUp на всех цепях. Область действия цепи.
ACX перемещает потоки (если таковые) в предыдущее состояние до отключения устройства. Область действия экземпляра потока.
Очереди WDF перезапускаются.
Функция обратного вызова EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT. Привязан к устройству.
Функция обратного вызова EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART. Область действия устройства. - Инициализация после каждого включения от Dx.
Добавить поток ACX
- AcX Stream Add (instance) on ACX Circuit (ACX callback on ACX circuits) — вызывается в любое время после вызова самоуправляемого ввода-вывода или перезапуска WDF, и устройство находится в D0. Область действия контура.
- Входные данные: контекст AcxStreamInit, ACXCIRCUIT.
- Добавьте обратные вызовы.
- Создайте AcxStream (экземпляр).
- При необходимости выполните инициализацию любого экземпляра post stream.
- При возвращении ACX активирует этот экземпляр потока, и так как он в этом сценарии является единственным на аудио пути, он позволяет передавать потоковые сообщения.
Перечисление и запуск устройств ACX для динамических звуковых устройств
В этом сценарии предполагается следующее.
- Динамическая поддержка звука (создание и удаление звуковых устройств во время выполнения).
- Время существования устройства не привязано к времени существования канала.
- Одно устройство может создавать несколько каналов для разных звуковых устройств.
- Использует простой статический шаблон, описанный выше, добавляя только элементы, специфичные для динамического шаблона.
- Использует дочерние необработанные PDOS.
- Среда режима ядра KMDF.
Последовательность запуска для этого сценария:
WDM DriverEntry. Область действия драйвера.
- Запуск трассировки.
- При необходимости зарегистрируйтесь для выгрузки.
- Создайте WDFDRIVER.
- Вызовите ACX для выполнения любой динамической инициализации драйвера.
- При необходимости выполните постинициализацию любого драйвера.
WDF DeviceAdd. Область действия устройства.
- Вызовите ACX для инициализации контекста инициализации устройства.
- Создание устройства.
- Вызовите ACX для выполнения любых действий после инициализации устройства.
- При необходимости выполните любые действия после инициализации устройства.
WDF PrepareHardware. Область действия устройства.
- Создание и инициализация аппаратных ресурсов (для прерываний и потоков регистрируйте их в ACX).
Обратный вызов устройства WDF D0. Область действия устройства.
Очереди WDF перезапускаются.
WDF DeviceSelfManagedIoInit. Область действия устройства.
WDF DeviceSelfManagedIoRestart. Область действия устройства.
- Инициализация после каждого включения от Dx.
Динамическое создание схемы (в любое время)
- Драйвер выделяет структуры
WDFDEVICE_INIT путем вызова WdfPdoInitAllocate . Драйвер отвечает за вызов WdfDeviceInitFree в случае, если он сталкивается с ошибками перед успешным созданием устройства. - Драйвер указывает любые обратные вызовы PnP/power, которые он желает получать.
- Управляющая программа создает устройство.
- Драйвер инициализирует новое устройство или схему путем вызова AcxDeviceAddCircuitDevice.
- WDF/PnP берет на себя управление, и выполняется простой шаблон работы перечисления и запуска, описанный в предыдущем разделе.
AcxFactoryCircuit
Драйвер ACX также может создавать объекты AcxFactoryCircuit (поставщики каналов) во время последовательности питания, используя функцию AcxFactoryCircuitCreate и функцию AcxDeviceAddFactoryCircuit .
Поскольку драйвер ACX зарегистрировал себя в ACX в качестве фабрики контуров, среда ACX использует зарегистрированную фабрику, чтобы запросить у драйвера создание нового контура.
AcxFactoryCircuitCreate(Device, &attributes, &factoryInit, &factory);
AcxDeviceAddFactoryCircuit(Device, factory);
Перебалансация устройства ACX
Перебалансирование выполняется, когда системное использование ресурсов требует от операционной системы перебалансировать ресурсы между устройствами. Общие сведения о перебалансе см. в разделе Реализация перебаланса PnP для драйверов аудио portCls.
ACX поддерживает перебалансацию устройств следующим образом:
В последовательности завершения работы WDF/ACX драйвер освобождает все ресурсы потоков данных (EvtAcxStreamPowerDown, EvtAcxStreamReleaseHardware), схемные ресурсы (EvtAcxCircuitPowerDown, EvtAcxCircuitReleaseHardware) и ресурсы устройства (EvtDeviceReleaseHardware).
Все запросы зафиксированы, а дескрипторы остаются открытыми.
В процессе запуска последовательности WDF/ACX драйвер следит за тем, чтобы новые ресурсы были совместимы с текущими, и вносит все разрешенные корректировки в свои настройки. Если ресурсы несовместимы с текущей инициализацией устройства или канала, драйвер должен удалить текущие каналы и создать новые. Дополнительные сведения см. ниже.
В последовательности включения WDF вызывает свою EvtDevicePrepareHardware и EvtDeviceD0, а ACX вызывает соответствующую запись EvtAcxCircuitPrepareHardware и EvtAcxCircuitPowerUp и перемещает все потоки в существующие состояния.
Как только очереди переходят в активный режим, поток ввода-вывода возобновляется.
ACX не позволяет выполнять удаление (сбой при запросе удаления) или перебалансировку (сбой при остановке запроса), если имеются потоки в активном состоянии (RUN).
Драйверы могут выбрать всегда уничтожать и заново создавать звуковые устройства при изменении балансировки. Это тот же сценарий выше, когда устройство обнаруживает, что новые параметры несовместимы со старыми. Удаление схемы необходимо выполнить в обратных вызовах EvtDevicePrepareHardware/EvtDeviceReleaseHardware, а новая схема создается в EvtDevicePrepareHardware. Драйвер удаляет контур, отменив регистрацию контура (с помощью AcxDeviceRemoveCircuit). Обычно схемы завода не следует удалять во время перебаланса.
Дескриптор файла в режиме пользователя
ACX не ожидает закрытия дескрипторов файлов в режиме пользователя перед повторным созданием новых цепей. Время существования дескрипторов файловой системы не связано с временем существования аппаратных ресурсов, используемых устройством или цепями. Клиенты обязаны отслеживать появление и удаление интерфейса, а также закрывать и повторно открывать дескрипторы файлов.
Старые дескрипторы файлов помечены как устаревшие, и ACX отклоняет все запросы ввода-вывода, связанные с ними.
См. также
Общие сведения о расширениях аудиоклассов ACX