KSPROPERTY_MIDILOOPEDSTREAMING_BUFFER

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

В следующей таблице перечислены функции этого свойства.

Сводная таблица использования

Get Установить Цель Тип дескриптора свойства Тип значения свойства
Да нет Закрепить KSMIDILOOPED_BUFFER_PROPERTY KSMIDILOOPED_BUFFER

Дескриптор свойства состоит из KSMIDILOOPED_BUFFER_PROPERTY, включая KSPROPERTY и запрошенный размер буфера. Тип значения свойства — KSMIDILOOPED_BUFFER, который возвращает циклический (циклический) буфер, сопоставленный с пространством процесса вызывающих абонентов, и фактическим размером, выделенным.

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

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

Код состояния Meaning
STATUS_ALREADY_INITIALIZED Возвращается, если регистры уже выделены или если KSPROPERTY_MIDILOOPEDSTREAMING_BUFFER был вызван другим процессом, то есть буфер циклизованной памяти уже выделен и сопоставлен с другим процессом, запрашивающим регистры.
STATUS_DEVICE_NOT_READY Устройство не готово
СТАТУС_НЕДОСТАТОЧНО_РЕСУРСОВ Возвращается, если недостаточно памяти для выделения регистров.
STATUS_INVALID_PARAMETER Если KSPROPERTY_MIDILOOPEDSTREAMING_BUFFER или предоставленные KSMIDILOOPED_BUFFER недопустимы или запрашиваются недопустимый размер буфера.
STATUS_SUCCESS Указывает успешное завершение.
STATUS_UNSUCCESSFUL Циклический буфер с указанным сочетанием атрибутов буфера нельзя выделить.

Замечания

KSPROPERTY_MIDILOOPEDSTREAMING_BUFFER вызывается с KSMIDILOOPED_BUFFER_PROPERTY, содержащей запрошенный размер буфера. Возвращается KSMIDILOOPED_BUFFER , содержащая выделенный буфер, сопоставленный с пространством процесса вызывающего объекта, а также фактический размер буфера.

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

Сообщения MIDI считываются или записываются в буфер по одному за раз, поэтому максимальный размер одного сообщения, примененный, является UMP128, который составляет 16 байт. Максимальное число операций чтения или записи в конце первичного буфера в двойной сопоставленный буфер составляет 16 байтов, что меньше размера сопоставления.

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

Одновременно можно открыть только один дескриптор пин-кода, который является тем же требованием, что драйвер MIDI версии 1 и многие другие драйверы KS/ACX. Только процесс, содержащий открытый пин-код, может выделить буфер общей памяти.

Звуковой драйвер выделяет и управляет буфером общей памяти. Выделения выполняются на границах страниц, чтобы предотвратить непреднамеренное воздействие памяти ядра. Если дескриптор пин-кода закрыт или процесс вызова завершается, рабочие потоки завершаются и выделенные буферы, освобожденные драйвером.

Пример кода

_Use_decl_annotations_
HRESULT
KSMidiDevice::ConfigureLoopedBuffer(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));

    m_MidiPipe->Data.BufferAddress = (PBYTE) buffer.BufferAddress;
    bufferSize = m_MidiPipe->Data.BufferSize = buffer.ActualBufferSize;

    return S_OK;
}

Требования

Item Description
Версия Доступно в Windows 11 версии 25H2 и более поздних версий.
Header Ksmedia.h

См. также