Поделиться через


функция обратного вызова EVT_ACX_STREAM_PREPARE_HARDWARE (acxstreams.h)

Событие EvtAcxStreamPrepareHardware сообщает драйверу подготовить оборудование для потоковой передачи.

Синтаксис

EVT_ACX_STREAM_PREPARE_HARDWARE EvtAcxStreamPrepareHardware;

NTSTATUS EvtAcxStreamPrepareHardware(
  ACXSTREAM Stream
)
{...}

Параметры

Stream

Объект ACXSTREAM представляет звуковой поток, созданный каналом. Поток состоит из списка элементов, созданных на основе элементов родительского канала. Дополнительные сведения см. в разделе ACX — сводка по объектам ACX.

Возвращаемое значение

Возвращает STATUS_SUCCESS, если вызов выполнен успешно. В противном случае возвращается соответствующий код ошибки. Дополнительные сведения см. в использовании значений NTSTATUS.

Замечания

AcxStream поддерживает различные состояния. Эти состояния указывают, когда поток звука (состояние RUN), звук не выполняется, но звуковое оборудование подготовлено (состояние PAUSE), или звук не выполняется, а звуковое оборудование не подготовлено (состояние STOP).

Событие EvtAcxStreamPrepareHardware передаст состояние потока из состояния Stop в состояние "Пауза". Драйвер должен выделить все аппаратные ресурсы, необходимые для потоковой передачи в этом событии, например обработчики DMA.

Когда поток находится в состоянии Приостановки, драйвер может получить событие EvtAcxStreamRun для перехода в состояние выполнения или драйвер может получить событие EvtAcxStreamReleaseHardware для перехода в состояние Stop.

События ACX аналогичны состояниям KS, как описано в этой таблице.

Состояние запуска Конечное состояние Вызывается событие драйвера ACX Примечания
ОСТАНОВКА ПРИОБРЕТАТЬ PrepareHardware Драйвер выполняет выделение оборудования и подготовку
ПРИОБРЕТАТЬ ПАУЗА (Без вызова)
ПАУЗА БЕЖАТЬ Бежать
БЕЖАТЬ ПАУЗА Пауза
ПАУЗА ПРИОБРЕТАТЬ (Без вызова)
ПРИОБРЕТАТЬ ОСТАНОВКА ReleaseHardware Выпуски аппаратных выделений драйверов

EvtAcxStreamAllocateRtPackets вызывается перед EvtAcxStreamPrepareHardware, чтобы разрешить выделение пакетов RT до EvtAcxStreamPrepareHardware.

Выделение буферов и DMA

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

Очистка памяти

Выделение пакетов (физическая память в системе) выполняется до выпуска EvtAcxStreamPrepareHardware и их выпуска (EvtAcxStreamFreeRtPackets) после evtAcxStreamReleaseHardware. Этот шаблон представляет собой существующее устаревшее поведение, внедренное в поток установки аудиопотока верхнего уровня (ks выделяет буфер prop init).

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

Обратный вызов уничтожения вызывается после того, как последний ссылочный объект исчезает, когда он неизвестен.

Обратный вызов очистки потока вызывается при закрытии дескриптора. Одно из исключений заключается в том, что драйвер создал поток в обратном вызове. Если acX не удалось добавить этот поток в его поток-мост незадолго до возвращения из операции создания потока, поток отменяется асинхронный, а текущий поток возвращает ошибку клиенту create-stream. На данный момент поток не должен выделять выделения mem.

Пример

Ниже показан пример использования.

    ACX_STREAM_CALLBACKS streamCallbacks;
    ACX_STREAM_CALLBACKS_INIT(&streamCallbacks);
    streamCallbacks.EvtAcxStreamPrepareHardware     = Codec_EvtStreamPrepareHardware;
    ...
    status = AcxStreamInitAssignAcxStreamCallbacks(StreamInit, &streamCallbacks);
#pragma code_seg("PAGE")
NTSTATUS
Codec_EvtStreamPrepareHardware(
    _In_ ACXSTREAM Stream
    )
{
    PSTREAM_CONTEXT ctx;
    NTSTATUS        status;

    PAGED_CODE();

    ctx = GetStreamContext(Stream);

    status = AllocateStreamHardware(Stream);

    if (NT_SUCCESS(status))
    {
        ctx->StreamState = AcxStreamStatePause;
    }

    return status;
}

Требования к ACX

минимальная версия ACX: 1.0

Дополнительные сведения о версиях ACX см. в обзоре версий ACX.

Требования

Требование Ценность
заголовка acxstreams.h
IRQL PASSIVE_LEVEL

См. также