次の方法で共有


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

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

重要

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

ヒント

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

Note

詳細な仕様については、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));
}

Note

カスタム データ チャネル経由で送信するデータは、Holographic Remoting で使用される他のデータ チャネルと帯域幅を共有します。

データを取得する

データ チャネルを介してデータが到着するたびに、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 ハンドルは有効なままです。

参照