Canales de datos personalizados con la comunicación remota holográfica y la API de OpenXR

Use canales de datos personalizados para enviar datos personalizados a través de una conexión remota establecida.

Importante

Los canales de datos personalizados requieren una aplicación remota personalizada y una aplicación de reproductor personalizada. Esto permite la comunicación entre las dos aplicaciones personalizadas.

Sugerencia

Puede encontrar un ejemplo sencillo de ping-ping-ping en los ejemplos remotos y de reproductor dentro del repositorio de GitHub de ejemplos de comunicación remota holográfica. Descomprima #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE los archivos OpenXrProgramm.cpp y SamplePlayerMain.h para habilitar el código de ejemplo.

Nota

La especificación detallada se puede encontrar en el repositorio de GitHub de ejemplos de Holographic Remoting.

Creación de un canal de datos personalizado

El identificador define un canal de datos XrRemotingDataChannelMSFT personalizado:

XrRemotingDataChannelMSFT m_userDataChannel;

Una vez establecida correctamente una conexión, se pueden crear nuevos canales de datos a través de la xrCreateRemotingDataChannelMSFT función :

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));

Los canales de datos personalizados se pueden crear desde el reproductor y la aplicación remota, incluso si los tiempos de ejecución son diferentes. Si el lado del reproductor crea un canal de datos, se notifica al lado remoto con la estructura XrEventDataRemotingDataChannelCreatedMSFT de eventos:

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;
        }
    }
}

El estado inicial XrRemotingDataChannelStatusMSFT después de llamar a xrCreateRemotingDataChannelMSFT es XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT. Una vez que el canal de datos se ha establecido completamente, el estado del canal cambia a XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT. La XrEventDataRemotingDataChannelOpenedMSFT estructura de eventos se coloca en la cola de eventos cuando el estado de un canal de datos creado anteriormente cambia de XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT a XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT.

Obtener el estado del canal

La xrGetRemotingDataChannelStateMSFT función se puede usar para consultar el estado del canal de datos:

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

Enviar datos

Si el canal está abierto, la xrSendRemotingDataMSFT función se usa para enviar datos al lado del reproductor:

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));
}

Nota

Los datos que envía a través de un canal de datos personalizado comparten el ancho de banda con otros canales de datos que usa Holographic Remoting.

Recuperación de datos

Cada vez que llegan datos a través de un canal de datos, se XrEventDataRemotingDataChannelDataReceivedMSFT coloca una estructura de eventos en la cola de eventos. Los paquetes recibidos se pueden recuperar con la xrRetrieveRemotingDataMSFT función :

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;
        }
    }
}

Destruir un canal de datos

Puede destruir un canal de datos con xrDestroyRemotingDataChannelMSFT:

CHECK_XRCMD(m_extensions.xrDestroyRemotingDataChannelMSFT(m_userDataChannel));

El XrRemotingDataChannelMSFT identificador no es válido después de la xrDestroyRemotingDataChannelMSFT llamada y el identificador del canal de datos no se debe usar posteriormente.

se XrEventDataRemotingDataChannelClosedMSFT colocará en la cola de eventos en caso de que el lado del reproductor cierre o destruya el canal de datos. El estado del canal de datos cambia a XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT. Para un canal de datos cerrado, el XrRemotingDataChannelMSFT identificador sigue siendo válido.

Consulte también