Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Свойство 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 |