структура KSMIDILOOPED_REGISTERS (ksmedia.h)

Структура KSMIDILOOPED_REGISTERS содержит указатели на регистры позиций чтения и записи для операций потоковой передачи с циклом MIDI.

Синтаксис

typedef struct {
  PVOID WritePosition;
  PVOID ReadPosition;
} KSMIDILOOPED_REGISTERS, *PKSMIDILOOPED_REGISTERS;

Members

WritePosition

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

ReadPosition

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

Замечания

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

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

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

Пример кода

HRESULT
    LoopedBufferCall(
        _In_ ULONG& bufferSize
    )
    {
        KSMIDILOOPED_BUFFER_PROPERTY property {0};
        KSMIDILOOPED_BUFFER buffer{0};
        ULONG propertySize {sizeof(property)};

        property.Property.Set           = KSPROPSETID_MidiLoopedStreaming; 
        property.Property.Id            = KSPROPERTY_MIDILOOPEDSTREAMING_BUFFER;       
        property.Property.Flags         = KSPROPERTY_TYPE_GET;
        property.RequestedBufferSize    = bufferSize;

        RETURN_IF_FAILED(SyncIoctl(
            m_Pin.get(),
            IOCTL_KS_PROPERTY,
            &property,
            propertySize,
            &buffer,
            sizeof(buffer),
            nullptr));

        bufferSize = buffer.ActualBufferSize;

        return S_OK;
    }

Требования

Требование Ценность
Header ksmedia.h (include Ksmedia.h)

См. также