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
ハンドルは有効なままです。