Пользовательские каналы данных с holographic удаленное взаимодействие и API Опенкср

Используйте пользовательские каналы данных для отправки пользовательских данных через установленное удаленное соединение.

Важно!

Для пользовательских каналов данных требуется пользовательское удаленное приложение и пользовательское приложение проигрывателя. Это позволяет обмениваться данными между двумя пользовательскими приложениями.

Совет

Простой пример для проверки связи можно найти в примерах для удаленного доступа и проигрывателя в репозитории GitHub с примерами удаленного взаимодействия. Раскомментируйте #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE в файлах опенксрпрограмм. cpp и самплеплайермаин. h, чтобы включить пример кода.

Создание пользовательского канала данных

Пользовательский канал данных определяется с помощью XrRemotingDataChannelMSFT маркера:

XrRemotingDataChannelMSFT m_userDataChannel;

После успешной установки подключения можно создать новые каналы данных с xrCreateRemotingDataChannelMSFT помощью функции:

XrRemotingDataChannelCreateInfoMSFT channelInfo{static_cast<XrStructureType>(XR_TYPE_REMOTING_DATA_CHANNEL_CREATE_INFO_MSFT)};
channelInfo.channelId = 0;
channelInfo.channelPriority = XR_REMOTING_DATA_CHANNEL_PRIORITY_LOW_MSFT;
CHECK_XRCMD(m_extensions.xrCreateRemotingDataChannelMSFT(m_instance.Get(), m_systemId, &channelInfo, &m_userDataChannel));

Пользовательские каналы данных можно создавать из проигрывателя и из удаленного приложения, даже если среды выполнения различаются. Если канал данных создается на стороне проигрывателя, то удаленная сторона получает сообщение со XrEventDataRemotingDataChannelCreatedMSFT структурой событий:

XrEventDataBuffer eventData{};
while (pollEvent(eventData)) 
{
    switch (eventData.type) 
    {
        case XR_TYPE_EVENT_DATA_REMOTING_DATA_CHANNEL_CREATED_MSFT: 
        {
            auto channelCreatedEventData = reinterpret_cast<const XrEventDataRemotingDataChannelCreatedMSFT*>(&eventData);
            m_userDataChannel = channelCreatedEventData->channel;
            break;
        }
    }
}

Начальное XrRemotingDataChannelStatusMSFT состояние после вызова xrCreateRemotingDataChannelMSFTXR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT . После полной установки канала данных состояние канала переключается на XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT . XrEventDataRemotingDataChannelOpenedMSFTСтруктура событий помещается в очередь событий, когда состояние ранее созданного канала данных переключается с XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT на XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT .

Получение состояния канала

xrGetRemotingDataChannelStateMSFTФункцию можно использовать для запроса состояния канала данных:

XrRemotingDataChannelStateMSFT channelState{static_cast<XrStructureType>(XR_TYPE_REMOTING_DATA_CHANNEL_STATE_MSFT)};
CHECK_XRCMD(m_extensions.xrGetRemotingDataChannelStateMSFT(m_userDataChannel, &channelState));

Отправка данных

Если канал открыт xrSendRemotingDataMSFT , функция используется для отправки данных на сторону проигрывателя:

if (channelState.connectionStatus == XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT) {
    // Only send the packet if the send queue is smaller than 1MiB
    if (channelState.sendQueueSize >= 1 * 1024 * 1024) {
        return;
    }
    uint8_t data[] = {1};

    XrRemotingDataChannelSendDataInfoMSFT sendInfo{
        static_cast<XrStructureType>(XR_TYPE_REMOTING_DATA_CHANNEL_SEND_DATA_INFO_MSFT)};
    sendInfo.data = data;
    sendInfo.size = sizeof(data);
    sendInfo.guaranteedDelivery = true;
    CHECK_XRCMD(m_extensions.xrSendRemotingDataMSFT(m_userDataChannel, &sendInfo));
}

Примечание

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

Получение данных

Каждый раз, когда данные поступают через канал данных, XrEventDataRemotingDataChannelDataReceivedMSFT Структура событий помещается в очередь событий. Полученные пакеты можно получить с помощью xrRetrieveRemotingDataMSFT функции:

XrEventDataBuffer eventData{};
while (pollEvent(eventData)) 
{
    switch (eventData.type) 
    {
        case XR_TYPE_EVENT_DATA_REMOTING_DATA_CHANNEL_DATA_RECEIVED_MSFT: 
        {
            auto dataReceivedEventData = reinterpret_cast<const XrEventDataRemotingDataChannelDataReceivedMSFT*>(&eventData);
            std::vector<uint8_t> packet(dataReceivedEventData->size);
            uint32_t dataBytesCount;
            CHECK_XRCMD(m_extensions.xrRetrieveRemotingDataMSFT(dataReceivedEventData->channel,
                                                                dataReceivedEventData->packetId,
                                                                static_cast<uint32_t>(packet.size()),
                                                                &dataBytesCount,
                                                                packet.data()));
            break;
        }
    }
}

Уничтожение канала данных

Канал данных можно уничтожить с помощью xrDestroyRemotingDataChannelMSFT :

CHECK_XRCMD(m_extensions.xrDestroyRemotingDataChannelMSFT(m_userDataChannel));

XrRemotingDataChannelMSFTМаркер является недопустимым после xrDestroyRemotingDataChannelMSFT вызова, и обработчик канала данных не должен использоваться впоследствии.

Объект XrEventDataRemotingDataChannelClosedMSFT будет помещен в очередь событий в том случае, если сторона проигрывателя закроет или удалит канал данных. Состояние канала данных переключается в XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT . Для закрытого канала XrRemotingDataChannelMSFT данных маркер остается действительным.

См. также: