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