Holographic Remoting と OpenXR API を使用したカスタム データ チャネル

確立されているリモート処理接続経由でカスタム データを送信するには、カスタム データ チャネルを使用します。

重要

カスタム データ チャネルには、カスタム リモート アプリとカスタム プレーヤー アプリが必要です。 これにより、2 つのカスタム アプリ間の通信が可能になります。

ヒント

単純なピンポンの例が Holographic Remoting のサンプルの GitHub リポジトリ内のリモートとプレーヤーのサンプルにあります。 OpenXrProgramm.cpp および SamplePlayerMain.h ファイル内の #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE のコメントを解除して、このサンプル コードを有効にしてください。

注意

詳細な仕様については、Holographic Remoting のサンプルの GitHub リポジトリを参照してください。

カスタム データ チャネルを作成する

カスタムデータチャネルは、 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;
        }
    }
}

xrCreateRemotingDataChannelMSFT を呼び出した後の初期の XrRemotingDataChannelStatusMSFT 状態は XR_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));
}

注意

カスタムデータチャネルを介して送信されるデータは、Holographic リモート処理で使用される他のデータチャネルと帯域幅を共有します。

データを取得する

データ チャネルを介してデータが到着するたびに、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));

xrDestroyRemotingDataChannelMSFT 呼び出し後の XrRemotingDataChannelMSFT ハンドルは無効であり、後でデータ チャネル ハンドルを使用することはできません。

プレーヤー側でデータ チャネルが閉じられたり破棄されたりした場合に備えて、XrEventDataRemotingDataChannelClosedMSFT はイベント キューに配置されます。 データ チャネルの状態は XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT に切り替わります。 閉じたデータ チャネルの場合、XrRemotingDataChannelMSFT ハンドルは有効なままです。

参照