確立されているリモート処理接続経由でカスタム データを送信するには、カスタム データ チャネルを使用します。
重要
カスタム データ チャネルには、カスタム リモート アプリとカスタム プレーヤー アプリが必要です。 これにより、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
ハンドルは有効なままです。