Перечисление устройств ACX
В этом разделе рассматриваются перечисление устройств ACX, запуск и завершение работы, а также перебалансирование устройств. Общие сведения о расширениях класса ACX см. в разделе "Общие сведения о расширениях аудиофайла ACX". Сведения об управлении питанием ACX и PnP см. в разделе управления питанием ACX.
Перечисление и запуск устройств ACX для статических звуковых устройств
Чтобы узнать, как работает запуск ACX, описан следующий сценарий.
- Звуковое устройство представлено одним каналом.
- Время существования аудио-канала связано со временем существования устройства PnP.
- Одно устройство может создавать несколько каналов для разных звуковых устройств.
- Среда режима ядра KMDF.
Последовательность запуска:
WDM DriverEntry. Область действия драйвера. Подпрограмма DriverEntry для драйверов WDF
- Трассировка инициализации.
- При необходимости зарегистрируйтесь для выгрузки.
- Создайте WDFDRIVER.
- Вызовите ACX для выполнения любого инициализации драйвера post.
- При необходимости инициализация любого драйвера post.
WDF DeviceAdd. Область действия устройства. функция обратного вызова EVT_WDF_DRIVER_DEVICE_ADD
- Вызов ACX для инициализации контекста инициализации устройства —
ACX_DEVICEINIT_CONFIG_INIT(&devInitCfg)
функция ACX_DEVICEINIT_CONFIG_INIT - Регистрация обратного вызова WDF PnP Power
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 для динамических звуковых устройств
В этом сценарии предполагается следующее.
- Динамическая поддержка звука (создание и удаление звуковых устройств во время выполнения).
- Время существования устройства не привязано к времени существования канала.
- Одно устройство может создавать несколько каналов для разных звуковых устройств.
- Piggybacks в простом статическом шаблоне, описанном выше, путем добавления только элементов, относящихся к динамическому шаблону.
- Использует дочерние необработанные PDOS.
- Среда режима ядра KMDF.
Последовательность запуска для этого сценария:
WDM DriverEntry. Область действия драйвера.
- Трассировка инициализации.
- При необходимости зарегистрируйтесь для выгрузки.
- Создайте WDFDRIVER.
- Вызовите ACX для выполнения любого инициализации драйвера post.
- При необходимости инициализация любого драйвера post.
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
Справочная документация по ACX
Последовательности обратных вызовов PnP и управления питанием