diff --git a/README.md b/README.md index 5d82bc0..13c5931 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ products: | Holographic Remoting version | :-----------------: | -|2.6.0 | +|2.6.1 | The [Holographic Remoting Samples](https://github.com/microsoft/MixedReality-HolographicRemoting-Samples) repository hosts sample applications for [Holographic Remoting](https://docs.microsoft.com/en-us/windows/mixed-reality/holographic-remoting-player). The two remote samples show how to write an application for streaming content to a Microsoft HoloLens 2 or a PC running Windows Mixed Reality. diff --git a/player/sample/Package.appxmanifest b/player/sample/Package.appxmanifest index f0c2e40..bbca59f 100644 --- a/player/sample/Package.appxmanifest +++ b/player/sample/Package.appxmanifest @@ -1,6 +1,6 @@  - + Sample Holographic AppRemoting Player diff --git a/player/sample/SamplePlayer.vcxproj b/player/sample/SamplePlayer.vcxproj index a0aa3ec..c558d00 100644 --- a/player/sample/SamplePlayer.vcxproj +++ b/player/sample/SamplePlayer.vcxproj @@ -342,6 +342,6 @@ - + \ No newline at end of file diff --git a/player/sample/SamplePlayerMain.cpp b/player/sample/SamplePlayerMain.cpp index e4f904b..53f47ad 100644 --- a/player/sample/SamplePlayerMain.cpp +++ b/player/sample/SamplePlayerMain.cpp @@ -424,14 +424,27 @@ void SamplePlayerMain::SetWindow(const CoreWindow& window) #ifdef ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE try { - m_playerContext.OnDataChannelCreated([this](const IDataChannel& dataChannel, uint8_t channelId) { - std::lock_guard lock(m_customDataChannelLock); - m_customDataChannel = dataChannel.as(); + m_playerContext.OnDataChannelCreated([weakThis = get_weak()](const IDataChannel& dataChannel, uint8_t channelId) { + if (auto strongThis = weakThis.get()) + { + std::lock_guard lock(strongThis->m_customDataChannelLock); + strongThis->m_customDataChannel = dataChannel.as(); - m_customChannelDataReceivedEventRevoker = m_customDataChannel.OnDataReceived( - winrt::auto_revoke, [this](winrt::array_view dataView) { OnCustomDataChannelDataReceived(); }); + strongThis->m_customChannelDataReceivedEventRevoker = strongThis->m_customDataChannel.OnDataReceived( + winrt::auto_revoke, [weakThis](winrt::array_view dataView) { + if (auto strongThis = weakThis.get()) + { + strongThis->OnCustomDataChannelDataReceived(); + } + }); - m_customChannelClosedEventRevoker = m_customDataChannel.OnClosed(winrt::auto_revoke, [this]() { OnCustomDataChannelClosed(); }); + strongThis->m_customChannelClosedEventRevoker = strongThis->m_customDataChannel.OnClosed(winrt::auto_revoke, [weakThis]() { + if (auto strongThis = weakThis.get()) + { + strongThis->OnCustomDataChannelClosed(); + } + }); + } }); } catch (winrt::hresult_error err) diff --git a/player/sample/packages.config b/player/sample/packages.config index 365b43b..5bc0eca 100644 --- a/player/sample/packages.config +++ b/player/sample/packages.config @@ -1,5 +1,5 @@  - - \ No newline at end of file + + diff --git a/remote/desktop/Content/QRCodeRenderer.cpp b/remote/desktop/Content/QRCodeRenderer.cpp index 18614a9..b5634fb 100644 --- a/remote/desktop/Content/QRCodeRenderer.cpp +++ b/remote/desktop/Content/QRCodeRenderer.cpp @@ -29,12 +29,6 @@ QRCodeRenderer::QRCodeRenderer(const std::shared_ptr& { } -void QRCodeRenderer::OnAddedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code) -{ - std::scoped_lock lock(m_mutex); - m_qrCodes.insert({code, nullptr}); -} - void QRCodeRenderer::OnUpdatedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code) { std::scoped_lock lock(m_mutex); diff --git a/remote/desktop/Content/QRCodeRenderer.h b/remote/desktop/Content/QRCodeRenderer.h index 42cfa57..5d48d56 100644 --- a/remote/desktop/Content/QRCodeRenderer.h +++ b/remote/desktop/Content/QRCodeRenderer.h @@ -32,8 +32,6 @@ public: void Update(winrt::Windows::Perception::Spatial::SpatialCoordinateSystem renderingCoordinateSystem); - void OnAddedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code); - void OnUpdatedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code); void Reset(); diff --git a/remote/desktop/Package.appxmanifest b/remote/desktop/Package.appxmanifest index 2e7f902..600b201 100644 --- a/remote/desktop/Package.appxmanifest +++ b/remote/desktop/Package.appxmanifest @@ -1,6 +1,6 @@ - + - + SampleRemote diff --git a/remote/desktop/SampleRemote.vcxproj b/remote/desktop/SampleRemote.vcxproj index 0c31729..6e2a64c 100644 --- a/remote/desktop/SampleRemote.vcxproj +++ b/remote/desktop/SampleRemote.vcxproj @@ -332,6 +332,6 @@ - + \ No newline at end of file diff --git a/remote/desktop/SampleRemoteApp.cpp b/remote/desktop/SampleRemoteApp.cpp index 716da10..4707630 100644 --- a/remote/desktop/SampleRemoteApp.cpp +++ b/remote/desktop/SampleRemoteApp.cpp @@ -159,7 +159,15 @@ void SampleRemoteApp::OnResize(int width, int height) if (m_swapChain) { - winrt::check_hresult(m_swapChain->ResizeBuffers(2, m_width, m_height, DXGI_FORMAT_B8G8R8A8_UNORM, 0)); + winrt::hresult hr = m_swapChain->ResizeBuffers(2, m_width, m_height, DXGI_FORMAT_B8G8R8A8_UNORM, 0); + if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET) + { + m_swapChain = nullptr; + } + else + { + winrt::check_hresult(hr); + } } } } @@ -573,16 +581,15 @@ void SampleRemoteApp::Render(HolographicFrame holographicFrame) // * Holographic streamer // * Renderer // * Holographic space - // The InitializeRemoteContext() function will call the functions necessary to recreate these resources. + // Call the InitializeRemoteContextAndConnectOrListen() function will call the functions necessary to recreate these resources. ShutdownRemoteContext(); - InitializeRemoteContextAndConnectOrListen(); } // Determine whether or not to copy to the preview buffer. bool copyPreview; { std::lock_guard remoteContextLock(m_remoteContextAccess); - copyPreview = m_remoteContext == nullptr || m_remoteContext.ConnectionState() != ConnectionState::Connected; + copyPreview = m_swapChain && (m_remoteContext == nullptr || m_remoteContext.ConnectionState() != ConnectionState::Connected); } if (copyPreview && m_isInitialized) { @@ -710,16 +717,29 @@ void SampleRemoteApp::InitializeRemoteContextAndConnectOrListen() }); #ifdef ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE - m_onDataChannelCreatedEventRevoker = - m_remoteContext.OnDataChannelCreated(winrt::auto_revoke, [this](const IDataChannel& dataChannel, uint8_t channelId) { - std::lock_guard lock(m_customDataChannelLock); - m_customDataChannel = dataChannel.as(); + m_onDataChannelCreatedEventRevoker = m_remoteContext.OnDataChannelCreated( + winrt::auto_revoke, [weakThis = weak_from_this()](const IDataChannel& dataChannel, uint8_t channelId) { + if (auto strongThis = weakThis.lock()) + { + std::lock_guard lock(strongThis->m_customDataChannelLock); + strongThis->m_customDataChannel = dataChannel.as(); - m_customChannelDataReceivedEventRevoker = m_customDataChannel.OnDataReceived( - winrt::auto_revoke, [this](winrt::array_view dataView) { OnCustomDataChannelDataReceived(dataView); }); + strongThis->m_customChannelDataReceivedEventRevoker = strongThis->m_customDataChannel.OnDataReceived( + winrt::auto_revoke, [weakThis](winrt::array_view dataView) { + if (auto strongThis = weakThis.lock()) + { + strongThis->OnCustomDataChannelDataReceived(dataView); + } + }); - m_customChannelClosedEventRevoker = - m_customDataChannel.OnClosed(winrt::auto_revoke, [this]() { OnCustomDataChannelClosed(); }); + strongThis->m_customChannelClosedEventRevoker = + strongThis->m_customDataChannel.OnClosed(winrt::auto_revoke, [weakThis]() { + if (auto strongThis = weakThis.lock()) + { + strongThis->OnCustomDataChannelClosed(); + } + }); + } }); #endif @@ -866,23 +886,26 @@ void SampleRemoteApp::SavePosition() auto position = SpatialAnchor::TryCreateRelativeTo(m_referenceFrame.CoordinateSystem(), m_spinningCubeRenderer->GetPosition()); - auto storeRequest = SpatialAnchorManager::RequestStoreAsync(); - storeRequest.Completed([position](winrt::Windows::Foundation::IAsyncOperation result, auto asyncStatus) { - if (result.Status() != winrt::Windows::Foundation::AsyncStatus::Completed) - { - return; - } - - const SpatialAnchorStore& store = result.GetResults(); - if (store) - { - store.Clear(); - if (store.TrySave(L"position", position)) + if (position) + { + auto storeRequest = SpatialAnchorManager::RequestStoreAsync(); + storeRequest.Completed([position](winrt::Windows::Foundation::IAsyncOperation result, auto asyncStatus) { + if (result.Status() != winrt::Windows::Foundation::AsyncStatus::Completed) { - OutputDebugStringW(L"Saved cube position to SpatialAnchorStore.\n"); + return; } - } - }); + + const SpatialAnchorStore& store = result.GetResults(); + if (store) + { + store.Clear(); + if (store.TrySave(L"position", position)) + { + OutputDebugStringW(L"Saved cube position to SpatialAnchorStore.\n"); + } + } + }); + } } winrt::fire_and_forget SampleRemoteApp::ExportPosition() @@ -1087,17 +1110,6 @@ winrt::fire_and_forget SampleRemoteApp::RequestQRCodeWatcherUpdates() m_qrWatcher = QRCodeWatcher(); - m_qrAddedRevoker = m_qrWatcher.Added( - winrt::auto_revoke, - [&, weakThis = weak_from_this()]( - const winrt::Microsoft::MixedReality::QR::QRCodeWatcher&, - const winrt::Microsoft::MixedReality::QR::QRCodeAddedEventArgs& args) { - if (auto strongThis = weakThis.lock()) - { - m_qrCodeRenderer->OnAddedQRCode(args.Code()); - } - }); - m_qrUpdatedRevoker = m_qrWatcher.Updated( winrt::auto_revoke, [&, weakThis = weak_from_this()]( @@ -1290,8 +1302,15 @@ void SampleRemoteApp::OnDisconnected(winrt::Microsoft::Holographic::AppRemoting: m_hasSceneObserverAccess = false; - m_sceneUnderstandingRenderer->Reset(); - m_qrCodeRenderer->Reset(); + if (m_sceneUnderstandingRenderer) + { + m_sceneUnderstandingRenderer->Reset(); + } + + if (m_qrCodeRenderer) + { + m_qrCodeRenderer->Reset(); + } } void SampleRemoteApp::OnSendFrame(const winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DSurface& texture) diff --git a/remote/desktop/packages.config b/remote/desktop/packages.config index 33d8345..d362109 100644 --- a/remote/desktop/packages.config +++ b/remote/desktop/packages.config @@ -1,8 +1,8 @@  - + - \ No newline at end of file + diff --git a/remote/uwp/Content/QRCodeRenderer.cpp b/remote/uwp/Content/QRCodeRenderer.cpp index 18614a9..b5634fb 100644 --- a/remote/uwp/Content/QRCodeRenderer.cpp +++ b/remote/uwp/Content/QRCodeRenderer.cpp @@ -29,12 +29,6 @@ QRCodeRenderer::QRCodeRenderer(const std::shared_ptr& { } -void QRCodeRenderer::OnAddedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code) -{ - std::scoped_lock lock(m_mutex); - m_qrCodes.insert({code, nullptr}); -} - void QRCodeRenderer::OnUpdatedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code) { std::scoped_lock lock(m_mutex); diff --git a/remote/uwp/Content/QRCodeRenderer.h b/remote/uwp/Content/QRCodeRenderer.h index 42cfa57..5d48d56 100644 --- a/remote/uwp/Content/QRCodeRenderer.h +++ b/remote/uwp/Content/QRCodeRenderer.h @@ -32,8 +32,6 @@ public: void Update(winrt::Windows::Perception::Spatial::SpatialCoordinateSystem renderingCoordinateSystem); - void OnAddedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code); - void OnUpdatedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code); void Reset(); diff --git a/remote/uwp/Package.appxmanifest b/remote/uwp/Package.appxmanifest index 2e7f902..600b201 100644 --- a/remote/uwp/Package.appxmanifest +++ b/remote/uwp/Package.appxmanifest @@ -1,6 +1,6 @@ - + - + SampleRemote diff --git a/remote/uwp/SampleRemote.vcxproj b/remote/uwp/SampleRemote.vcxproj index 647a4b3..81e3c9c 100644 --- a/remote/uwp/SampleRemote.vcxproj +++ b/remote/uwp/SampleRemote.vcxproj @@ -389,6 +389,6 @@ - + \ No newline at end of file diff --git a/remote/uwp/SampleRemoteApp.cpp b/remote/uwp/SampleRemoteApp.cpp index 716da10..4707630 100644 --- a/remote/uwp/SampleRemoteApp.cpp +++ b/remote/uwp/SampleRemoteApp.cpp @@ -159,7 +159,15 @@ void SampleRemoteApp::OnResize(int width, int height) if (m_swapChain) { - winrt::check_hresult(m_swapChain->ResizeBuffers(2, m_width, m_height, DXGI_FORMAT_B8G8R8A8_UNORM, 0)); + winrt::hresult hr = m_swapChain->ResizeBuffers(2, m_width, m_height, DXGI_FORMAT_B8G8R8A8_UNORM, 0); + if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET) + { + m_swapChain = nullptr; + } + else + { + winrt::check_hresult(hr); + } } } } @@ -573,16 +581,15 @@ void SampleRemoteApp::Render(HolographicFrame holographicFrame) // * Holographic streamer // * Renderer // * Holographic space - // The InitializeRemoteContext() function will call the functions necessary to recreate these resources. + // Call the InitializeRemoteContextAndConnectOrListen() function will call the functions necessary to recreate these resources. ShutdownRemoteContext(); - InitializeRemoteContextAndConnectOrListen(); } // Determine whether or not to copy to the preview buffer. bool copyPreview; { std::lock_guard remoteContextLock(m_remoteContextAccess); - copyPreview = m_remoteContext == nullptr || m_remoteContext.ConnectionState() != ConnectionState::Connected; + copyPreview = m_swapChain && (m_remoteContext == nullptr || m_remoteContext.ConnectionState() != ConnectionState::Connected); } if (copyPreview && m_isInitialized) { @@ -710,16 +717,29 @@ void SampleRemoteApp::InitializeRemoteContextAndConnectOrListen() }); #ifdef ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE - m_onDataChannelCreatedEventRevoker = - m_remoteContext.OnDataChannelCreated(winrt::auto_revoke, [this](const IDataChannel& dataChannel, uint8_t channelId) { - std::lock_guard lock(m_customDataChannelLock); - m_customDataChannel = dataChannel.as(); + m_onDataChannelCreatedEventRevoker = m_remoteContext.OnDataChannelCreated( + winrt::auto_revoke, [weakThis = weak_from_this()](const IDataChannel& dataChannel, uint8_t channelId) { + if (auto strongThis = weakThis.lock()) + { + std::lock_guard lock(strongThis->m_customDataChannelLock); + strongThis->m_customDataChannel = dataChannel.as(); - m_customChannelDataReceivedEventRevoker = m_customDataChannel.OnDataReceived( - winrt::auto_revoke, [this](winrt::array_view dataView) { OnCustomDataChannelDataReceived(dataView); }); + strongThis->m_customChannelDataReceivedEventRevoker = strongThis->m_customDataChannel.OnDataReceived( + winrt::auto_revoke, [weakThis](winrt::array_view dataView) { + if (auto strongThis = weakThis.lock()) + { + strongThis->OnCustomDataChannelDataReceived(dataView); + } + }); - m_customChannelClosedEventRevoker = - m_customDataChannel.OnClosed(winrt::auto_revoke, [this]() { OnCustomDataChannelClosed(); }); + strongThis->m_customChannelClosedEventRevoker = + strongThis->m_customDataChannel.OnClosed(winrt::auto_revoke, [weakThis]() { + if (auto strongThis = weakThis.lock()) + { + strongThis->OnCustomDataChannelClosed(); + } + }); + } }); #endif @@ -866,23 +886,26 @@ void SampleRemoteApp::SavePosition() auto position = SpatialAnchor::TryCreateRelativeTo(m_referenceFrame.CoordinateSystem(), m_spinningCubeRenderer->GetPosition()); - auto storeRequest = SpatialAnchorManager::RequestStoreAsync(); - storeRequest.Completed([position](winrt::Windows::Foundation::IAsyncOperation result, auto asyncStatus) { - if (result.Status() != winrt::Windows::Foundation::AsyncStatus::Completed) - { - return; - } - - const SpatialAnchorStore& store = result.GetResults(); - if (store) - { - store.Clear(); - if (store.TrySave(L"position", position)) + if (position) + { + auto storeRequest = SpatialAnchorManager::RequestStoreAsync(); + storeRequest.Completed([position](winrt::Windows::Foundation::IAsyncOperation result, auto asyncStatus) { + if (result.Status() != winrt::Windows::Foundation::AsyncStatus::Completed) { - OutputDebugStringW(L"Saved cube position to SpatialAnchorStore.\n"); + return; } - } - }); + + const SpatialAnchorStore& store = result.GetResults(); + if (store) + { + store.Clear(); + if (store.TrySave(L"position", position)) + { + OutputDebugStringW(L"Saved cube position to SpatialAnchorStore.\n"); + } + } + }); + } } winrt::fire_and_forget SampleRemoteApp::ExportPosition() @@ -1087,17 +1110,6 @@ winrt::fire_and_forget SampleRemoteApp::RequestQRCodeWatcherUpdates() m_qrWatcher = QRCodeWatcher(); - m_qrAddedRevoker = m_qrWatcher.Added( - winrt::auto_revoke, - [&, weakThis = weak_from_this()]( - const winrt::Microsoft::MixedReality::QR::QRCodeWatcher&, - const winrt::Microsoft::MixedReality::QR::QRCodeAddedEventArgs& args) { - if (auto strongThis = weakThis.lock()) - { - m_qrCodeRenderer->OnAddedQRCode(args.Code()); - } - }); - m_qrUpdatedRevoker = m_qrWatcher.Updated( winrt::auto_revoke, [&, weakThis = weak_from_this()]( @@ -1290,8 +1302,15 @@ void SampleRemoteApp::OnDisconnected(winrt::Microsoft::Holographic::AppRemoting: m_hasSceneObserverAccess = false; - m_sceneUnderstandingRenderer->Reset(); - m_qrCodeRenderer->Reset(); + if (m_sceneUnderstandingRenderer) + { + m_sceneUnderstandingRenderer->Reset(); + } + + if (m_qrCodeRenderer) + { + m_qrCodeRenderer->Reset(); + } } void SampleRemoteApp::OnSendFrame(const winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DSurface& texture) diff --git a/remote/uwp/packages.config b/remote/uwp/packages.config index 00bcca1..9140447 100644 --- a/remote/uwp/packages.config +++ b/remote/uwp/packages.config @@ -1,7 +1,7 @@  - + - \ No newline at end of file + diff --git a/remote_openxr/desktop/SampleRemoteOpenXR.vcxproj b/remote_openxr/desktop/SampleRemoteOpenXR.vcxproj index 8c31b5b..62f309d 100644 --- a/remote_openxr/desktop/SampleRemoteOpenXR.vcxproj +++ b/remote_openxr/desktop/SampleRemoteOpenXR.vcxproj @@ -259,6 +259,6 @@ - + \ No newline at end of file diff --git a/remote_openxr/desktop/packages.config b/remote_openxr/desktop/packages.config index c9ff9bf..8e69f1f 100644 --- a/remote_openxr/desktop/packages.config +++ b/remote_openxr/desktop/packages.config @@ -3,5 +3,5 @@ - + diff --git a/remote_openxr/specification.html b/remote_openxr/specification.html index 31d9019..4b4bf50 100644 --- a/remote_openxr/specification.html +++ b/remote_openxr/specification.html @@ -4363,7 +4363,7 @@ No such structures are defined in core OpenXR or this extension.

Revision
-

2

+

3

Extension and Version Dependencies
@@ -4381,7 +4381,7 @@ No such structures are defined in core OpenXR or this extension.

Last Modified Date
-

2021-06-01

+

2021-07-20

IP Status
@@ -4400,7 +4400,7 @@ Felix Reeh, Microsoft

1.2.1. Overview

-

This holographic remoting extension allows the remote application to react to speech commands detected by the player application.

+

This holographic remoting extension allows the remote application to react to speech commands recognized by the player application using Windows Speech Recognition API.

The xrInitializeRemotingSpeechMSFT function is defined as:

@@ -4433,7 +4433,7 @@ Felix Reeh, Microsoft

-

To initialize a speech recognizer on the player application, the remote application can call xrInitializeRemotingSpeechMSFT. This transmits speech initialization parameters, i.e. a language, a dictionary of phrases, and the contents of a grammar file, to the player application. The speech recognizer must only be initialized once per XrSession.

+

To initialize a speech recognizer on the player application, the remote application can call xrInitializeRemotingSpeechMSFT. This transmits speech initialization parameters, i.e. a language, a dictionary of phrases, and the contents of a grammar file, to the player application. it can also be used to reinitialize the speech recognizer with new parameters during a running XrSession.

@@ -4493,9 +4493,6 @@ Felix Reeh, Microsoft

  • XR_ERROR_VALIDATION_FAILURE

  • -
  • -

    XR_ERROR_REMOTING_SPEECH_ALREADY_INITIALIZED_MSFT

    -
  • @@ -4739,10 +4736,10 @@ No such structures are defined in core OpenXR or this extension.

    packetId is the is a XrRemotingSpeechPacketIdMSFT handle identifing the received recognized speech packet.

  • -

    confidence is the XrRemotingSpeechRecognitionConfidenceMSFT. it represents the confidence level: high, medium and low as returned by the Windows Speech Recognition API.

    +

    confidence is the XrRemotingSpeechRecognitionConfidenceMSFT. it represents the confidence level: high, medium and low as returned by Windows Speech Recognition API.

  • -

    rawConfidence is the confidence level of the speech recognition result on a scale from 0 to 1, as returned by the Windows Speech Recognition API.

    +

    rawConfidence is the confidence level of the speech recognition result on a scale from 0 to 1, as returned by Windows Speech Recognition API.

  • @@ -4792,7 +4789,7 @@ No such structures are defined in core OpenXR or this extension.

    -

    The XrRemotingSpeechRecognitionConfidenceMSFT is a direct mapping of the SpeechRecognitionConfidence enum returned with the speech recognition result by the Windows Speech Recognition API. It is defined as:

    +

    The XrRemotingSpeechRecognitionConfidenceMSFT is a direct mapping of the SpeechRecognitionConfidence enum returned with the speech recognition result by Windows Speech Recognition API. It is defined as:

    @@ -4831,7 +4828,7 @@ No such structures are defined in core OpenXR or this extension.

    Retrieve recognized speech text

    -

    When the remote application is notified about a recognized text, it can query the recognized speech text by calling xrRetrieveRemotingSpeechRecognizedTextMSFT.

    +

    When the remote application is notified about a recognized speech, it can query the recognized speech text by calling xrRetrieveRemotingSpeechRecognizedTextMSFT.

    The xrRetrieveRemotingSpeechRecognizedTextMSFT function is defined as:

    @@ -4985,9 +4982,6 @@ No such structures are defined in core OpenXR or this extension.

    • -

      XR_ERROR_REMOTING_SPEECH_ALREADY_INITIALIZED_MSFT

      -
    • -
    • XR_ERROR_REMOTING_SPEECH_PACKET_EXPIRED_MSFT

    @@ -5067,7 +5061,17 @@ No such structures are defined in core OpenXR or this extension.

    +
    + +
  • +

    Revision 3, 2021-07-20 (Felix Reeh, Hanaa Elghobashi)

    +
    +
    @@ -5075,7 +5079,6 @@ No such structures are defined in core OpenXR or this extension.

  • -

    1.3. XR_MSFT_remoting_frame_mirroring