diff --git a/Samples/BetaSamples/RemoteMediaSamples/IncidentBot/IncidentBot.csproj b/Samples/BetaSamples/RemoteMediaSamples/IncidentBot/IncidentBot.csproj index 220e6e29..36aebb82 100644 --- a/Samples/BetaSamples/RemoteMediaSamples/IncidentBot/IncidentBot.csproj +++ b/Samples/BetaSamples/RemoteMediaSamples/IncidentBot/IncidentBot.csproj @@ -1,4 +1,4 @@ - + net471 @@ -29,5 +29,5 @@ - + diff --git a/Samples/BetaSamples/RemoteMediaSamples/IncidentBot/Properties/launchSettings.json b/Samples/BetaSamples/RemoteMediaSamples/IncidentBot/Properties/launchSettings.json index dbd0af26..85996c1f 100644 --- a/Samples/BetaSamples/RemoteMediaSamples/IncidentBot/Properties/launchSettings.json +++ b/Samples/BetaSamples/RemoteMediaSamples/IncidentBot/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:4213/", + "applicationUrl": "http://localhost:9442/", "sslPort": 44308 } }, @@ -11,7 +11,7 @@ "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, - "launchUrl": "http://localhost:4213/", + "launchUrl": "http://localhost:9442/", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } @@ -19,11 +19,11 @@ "IcMBot": { "commandName": "Project", "launchBrowser": true, - "launchUrl": "api/values", + "launchUrl": "http://localhost:9442/", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, - "applicationUrl": "http://localhost:4214/" + "applicationUrl": "http://localhost:9442/" } } } diff --git a/Samples/Common/Sample.Common/Logging/SampleObserver.cs b/Samples/Common/Sample.Common/Logging/SampleObserver.cs index bdc81997..73ca4808 100644 --- a/Samples/Common/Sample.Common/Logging/SampleObserver.cs +++ b/Samples/Common/Sample.Common/Logging/SampleObserver.cs @@ -67,7 +67,7 @@ public string GetLogs(int skip = 0, int take = int.MaxValue) var filteredLogs = this.logs .Skip(skip) .Take(take); - return string.Join(string.Empty, filteredLogs); + return string.Join(Environment.NewLine, filteredLogs); } } @@ -89,7 +89,7 @@ public string GetLogs(string filter, int skip = 0, int take = int.MaxValue) .Where(log => log.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0) .Skip(skip) .Take(take); - return string.Join(string.Empty, filteredLogs); + return string.Join(Environment.NewLine, filteredLogs); } } diff --git a/Samples/CommsSamples.sln b/Samples/CommsSamples.sln index 20ba09df..95a74e36 100644 --- a/Samples/CommsSamples.sln +++ b/Samples/CommsSamples.sln @@ -14,7 +14,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "RemoteMediaSamples", "Remot EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AudioVideoPlaybackBot", "AudioVideoPlaybackBot", "{540514B8-BFF4-47D6-8F21-B8B824521A1B}" ProjectSection(SolutionItems) = preProject - V1.0Samples\LocalMediaSamples\configure_cloud.ps1 = V1.0Samples\LocalMediaSamples\configure_cloud.ps1 V1.0Samples\LocalMediaSamples\AudioVideoPlaybackBot\README.md = V1.0Samples\LocalMediaSamples\AudioVideoPlaybackBot\README.md EndProjectSection EndProject @@ -39,6 +38,9 @@ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.Common", "Common\Sample.Common\Sample.Common.csproj", "{3268E59C-90DC-4D7B-97EA-A1DBB2716DF3}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "HueBot", "HueBot", "{2092372D-EEE2-4F2C-963D-2A0F9ECAF82C}" + ProjectSection(SolutionItems) = preProject + V1.0Samples\LocalMediaSamples\HueBot\README.md = V1.0Samples\LocalMediaSamples\HueBot\README.md + EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HueBot", "V1.0Samples\LocalMediaSamples\HueBot\HueBot\HueBot.csproj", "{64538D87-16CD-4A13-ADA9-63EBA7C80BBE}" EndProject diff --git a/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/FrontEnd/Http/HttpConfigurationInitializer.cs b/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/FrontEnd/Http/HttpConfigurationInitializer.cs index 62b530b4..584c6cf9 100644 --- a/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/FrontEnd/Http/HttpConfigurationInitializer.cs +++ b/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/FrontEnd/Http/HttpConfigurationInitializer.cs @@ -29,7 +29,7 @@ public void ConfigureSettings(IAppBuilder app, IGraphLogger logger) { HttpConfiguration httpConfig = new HttpConfiguration(); httpConfig.MapHttpAttributeRoutes(); - httpConfig.MessageHandlers.Add(new LoggingMessageHandler(isIncomingMessageHandler: true, logger: logger)); + httpConfig.MessageHandlers.Add(new LoggingMessageHandler(isIncomingMessageHandler: true, logger: logger, urlIgnorers: new[] { "/logs" })); httpConfig.Services.Add(typeof(IExceptionLogger), new Common.Logging.ExceptionLogger(logger)); diff --git a/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/FrontEnd/IConfiguration.cs b/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/FrontEnd/IConfiguration.cs index 83b6d6b9..fe955224 100644 --- a/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/FrontEnd/IConfiguration.cs +++ b/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/FrontEnd/IConfiguration.cs @@ -54,11 +54,6 @@ public interface IConfiguration : IDisposable /// Uri PlaceCallEndpointUrl { get; } - /// - /// Gets the Base URL for this particular azure instance. - /// - Uri AzureInstanceBaseUrl { get; } - /// /// Gets the AadAppId generated at the time of registration of the bot. /// diff --git a/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/ServiceDefinition.csdef b/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/ServiceDefinition.csdef index 8cbe9547..7d013f31 100644 --- a/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/ServiceDefinition.csdef +++ b/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/ServiceDefinition.csdef @@ -29,7 +29,7 @@ - + diff --git a/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/WorkerRole/AzureConfiguration.cs b/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/WorkerRole/AzureConfiguration.cs index 58bba58b..b10c3d3a 100644 --- a/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/WorkerRole/AzureConfiguration.cs +++ b/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/WorkerRole/AzureConfiguration.cs @@ -121,11 +121,11 @@ internal class AzureConfiguration : IConfiguration private const string InstanceIdToken = "in_"; /// - /// localPort specified in + /// localPort specified in /// in .csdef. This is needed for running in emulator. Currently only messaging can be debugged in the emulator. /// Media debugging in emulator will be supported in future releases. /// - private const int DefaultPort = 9440; + private const int DefaultPort = 9443; /// /// Graph logger. @@ -159,9 +159,6 @@ public AzureConfiguration(IGraphLogger logger) /// public Uri PlaceCallEndpointUrl { get; private set; } - /// - public Uri AzureInstanceBaseUrl { get; private set; } - /// public MediaPlatformSettings MediaPlatformSettings { get; private set; } @@ -233,7 +230,7 @@ public void Initialize() int instanceCallControlPublicPort = RoleEnvironment.IsEmulated ? DefaultPort : instanceCallControlEndpoint.PublicIPEndpoint.Port; int mediaInstanceInternalPort = RoleEnvironment.IsEmulated ? 8445 : mediaControlEndpoint.IPEndpoint.Port; - int mediaInstancePublicPort = RoleEnvironment.IsEmulated ? 20100 : mediaControlEndpoint.PublicIPEndpoint.Port; + int mediaInstancePublicPort = RoleEnvironment.IsEmulated ? 13016 : mediaControlEndpoint.PublicIPEndpoint.Port; string instanceCallControlIpEndpoint = string.Format("{0}:{1}", instanceCallControlInternalIpAddress, instanceCallControlInternalPort); @@ -280,31 +277,32 @@ public void Initialize() this.AudioVideoFileLengthInSec = avFileLengthInSec; - // Create structured config objects for service. - this.CallControlBaseUrl = new Uri(string.Format( - "https://{0}:{1}/{2}", - this.ServiceCname, - instanceCallControlPublicPort, - HttpRouteConstants.CallSignalingRoutePrefix)); - - this.AzureInstanceBaseUrl = new Uri(string.Format( - "https://{0}:{1}/", - this.ServiceCname, - instanceCallControlPublicPort)); - - this.TraceConfigValue("CallControlCallbackUri", this.CallControlBaseUrl); List controlListenUris = new List(); - if (RoleEnvironment.IsEmulated) { + // Create structured config objects for service. + this.CallControlBaseUrl = new Uri(string.Format( + "https://{0}/{1}", + this.ServiceCname, + HttpRouteConstants.CallSignalingRoutePrefix)); + controlListenUris.Add(new Uri("https://" + defaultEndpoint.IPEndpoint.Address + ":" + DefaultPort + "/")); + controlListenUris.Add(new Uri("http://" + defaultEndpoint.IPEndpoint.Address + ":" + (DefaultPort - 1) + "/")); } else { + // Create structured config objects for service. + this.CallControlBaseUrl = new Uri(string.Format( + "https://{0}:{1}/{2}", + this.ServiceCname, + instanceCallControlPublicPort, + HttpRouteConstants.CallSignalingRoutePrefix)); + controlListenUris.Add(new Uri("https://" + instanceCallControlIpEndpoint + "/")); controlListenUris.Add(new Uri("https://" + defaultEndpoint.IPEndpoint + "/")); } + this.TraceConfigValue("CallControlCallbackUri", this.CallControlBaseUrl); this.CallControlListeningUrls = controlListenUris; foreach (Uri uri in this.CallControlListeningUrls) @@ -313,7 +311,7 @@ public void Initialize() } IPAddress publicInstanceIpAddress = RoleEnvironment.IsEmulated - ? IPAddress.Loopback + ? IPAddress.Any : this.GetInstancePublicIpAddress(this.ServiceDnsName); this.MediaPlatformSettings = new MediaPlatformSettings() diff --git a/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/WorkerRole/app.config b/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/WorkerRole/app.config index 39bfae32..8965276b 100644 --- a/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/WorkerRole/app.config +++ b/Samples/V1.0Samples/LocalMediaSamples/AudioVideoPlaybackBot/WorkerRole/app.config @@ -1,4 +1,4 @@ - + @@ -42,14 +42,6 @@ - - - - - - - - @@ -62,10 +54,22 @@ + + + + + + + + + + + + diff --git a/Samples/V1.0Samples/LocalMediaSamples/HueBot/HueBot/ARM_Deployment/AzureDeploy.json b/Samples/V1.0Samples/LocalMediaSamples/HueBot/HueBot/ARM_Deployment/AzureDeploy.json index db404d64..2c91966b 100644 --- a/Samples/V1.0Samples/LocalMediaSamples/HueBot/HueBot/ARM_Deployment/AzureDeploy.json +++ b/Samples/V1.0Samples/LocalMediaSamples/HueBot/HueBot/ARM_Deployment/AzureDeploy.json @@ -441,7 +441,7 @@ { "name": "MediaNatPool", "properties": { - "backendPort": "8000", + "backendPort": "8445", "frontendIPConfiguration": { "id": "[variables('lbIPConfig0')]" }, diff --git a/Samples/V1.0Samples/LocalMediaSamples/HueBot/HueBot/PackageRoot/ServiceManifest.xml b/Samples/V1.0Samples/LocalMediaSamples/HueBot/HueBot/PackageRoot/ServiceManifest.xml index 8b156961..3294f647 100644 --- a/Samples/V1.0Samples/LocalMediaSamples/HueBot/HueBot/PackageRoot/ServiceManifest.xml +++ b/Samples/V1.0Samples/LocalMediaSamples/HueBot/HueBot/PackageRoot/ServiceManifest.xml @@ -43,7 +43,7 @@ - + diff --git a/Samples/V1.0Samples/LocalMediaSamples/HueBot/HueBot/README.md b/Samples/V1.0Samples/LocalMediaSamples/HueBot/README.md similarity index 98% rename from Samples/V1.0Samples/LocalMediaSamples/HueBot/HueBot/README.md rename to Samples/V1.0Samples/LocalMediaSamples/HueBot/README.md index 27c29c04..f84beded 100644 --- a/Samples/V1.0Samples/LocalMediaSamples/HueBot/HueBot/README.md +++ b/Samples/V1.0Samples/LocalMediaSamples/HueBot/README.md @@ -52,7 +52,7 @@ For running locally, we need to use a tunneling mechanism to route traffic to yo addr: 9442 proto: http media: - addr: 8000 + addr: 8445 proto: tcp ``` @@ -72,7 +72,7 @@ For running locally, we need to use a tunneling mechanism to route traffic to yo * `%AppId%` and `%AppSecret%` that you obtained during application registration. * Replace all `huebotsxxxxx.xxxx.cloudapp.azure.com` with your full cluster name. * Replace all certificate thumbprint `ABC0000000000000000000000000000000000CBA` with your certificate. - * in HueBot/PackageRoot/ServiceManifest.xml file, for Startup.cmd, add `8000 your certificate thumbprint` for \. For example \`8000 ABC0000000000000000000000000000000000CBA`\ + * in HueBot/PackageRoot/ServiceManifest.xml file, for Startup.cmd, add `8445 your certificate thumbprint` for \. For example \`8445 ABC0000000000000000000000000000000000CBA`\ ### Deploy #### [Azure] deployment diff --git a/docs/articles/calls/appHostedMediaCalls.html b/docs/articles/calls/appHostedMediaCalls.html index cdfeaf0c..3c08a612 100644 --- a/docs/articles/calls/appHostedMediaCalls.html +++ b/docs/articles/calls/appHostedMediaCalls.html @@ -83,7 +83,7 @@

Application Hosted Media Calls

Building a CommunicationsClient with Media Platform Settings

  1. Create the an instance of the ICommunicationsClientBuilder.
  2. -
  3. Create an instance of MediaPlatformSettings and use MediaCommunicationsClientBuilderExtensions.SetMediaPlatformSettings method to pass the MediaPlatformSettings to build the ICommunicationsClient
  4. +
  5. Create an instance of MediaPlatformSettings and use MediaCommunicationsClientBuilderExtensions.SetMediaPlatformSettings method to pass the MediaPlatformSettings to build the ICommunicationsClient
  6. Once the builder builds the ICommunicationsClient, a media session can be created using either MediaCommunicationsClientExtension.CreateMediaSession or MediaCommunicationsClientExtension.CreateMediaSession depending on how many video sockets are required.
  7. When creating an object of the Call resource, MediaConfig needs to be set to AppHostedMediaConfig.
diff --git a/docs/calls/index.html b/docs/calls/index.html index 6b6fc074..8c5aad86 100644 --- a/docs/calls/index.html +++ b/docs/calls/index.html @@ -79,13 +79,13 @@

Graph Calling SDK

-

The Calling components can be found in the @Microsoft.Graph.Calls namespace.

+

The Calling components can be found in the Microsoft.Graph.Communications.Calls namespace.

State Management

The Graph Calling SDK exposes a different set of APIs to manage states of resources in memory. Bots built using this SDK need to register event handlers for each newly created resource in order to be informed of any changes happening on that resource. The strengths and limitations of each are further explained in the State Management article.

Media Session

-

For calls with locally hosted media the ICallCollection has an extended AddAsync method which expects an @Microsoft.Graph.Calls.IMediaSession object. This object contains the IAudioSocket and IVideoSocket composition. The IMediaSession also knows how to construct the MediaConfiguration required by the back end services to enable the AV stream to flow through the call instance.

+

For calls with locally hosted media the ICallCollection has an extended AddAsync method which expects an IMediaSession object. This object contains the IAudioSocket and IVideoSocket composition. The IMediaSession also knows how to construct the MediaConfiguration required by the back end services to enable the AV stream to flow through the call instance.

A Media Extension SDK has been added on top of this SDK to support locally hosted media scenarios. To use this extension the ICommunicationsClient must be built with MediaCommunicationsClientBuilderExtensions.SetMediaPlatformSettings. The MediaCommunicationsClientExtensions.CreateMediaSession extension method facilitates the creation of IMediaSession objects.

-

Please see the calls with locally hosted media article for more information on the @Microsoft.Graph.Calls.IMediaSession object.

+

Please see the calls with locally hosted media article for more information on the IMediaSession object.


Select a class on the left to dive into the reference docs

diff --git a/docs/index.json b/docs/index.json index 96b575f8..11c60976 100644 --- a/docs/index.json +++ b/docs/index.json @@ -1,4 +1,9 @@ { + "index.html": { + "href": "index.html", + "title": "Graph Calling SDK", + "keywords": "Graph Calling SDK Introduction The Graph Calling SDK simplifies the creation of calling and meetings bots that use the Microsoft Graph Calling APIs . The SDK provides the functionality to manage states of resources in memory and simplify tasks like call setup and media session establishment. It provides interfaces for bot's service-to-service interactions with calls and meetings, including an optional Media Extension SDK that enables a bot developer to host media on their machines and gain access to low level Audio/Video sockets and media streams. SDK The Graph Calling SDK is built on top of the Microsoft Graph API and distributed as NuGet packages. The Core Concepts article is designed to better explain all the constructs used by the SDKs. To dive right in and deploy a Calling Bot refer to the documentation in each sample for further instructions. The SDK is divided into multiple nuget packages each described as below. Microsoft.Graph.Communications.Core ( nuget ): This library contains the calling contracts and is a duplicate of Microsoft.Graph SDK but only with Communication APIs. Microsoft.Graph.Communications.Common ( nuget ): This is the nuget containing all the utilities used throughout the Stateful SDK. It contains telemetry, http, obfuscation support along with helper methods. Microsoft.Graph.Communications.Client ( nuget ): This is the base client for the Stateful SDK. This implements all the common SDK features used within different verticals like calling, etc. Microsoft.Graph.Communications.Calls ( nuget ): This is the SDK that implements calling APIs. This supports making, receiving, and joining calls with Microsoft Teams users, and creating voice and video enabled bots. Microsoft.Graph.Communications.Calls.Media ( nuget ): This library allows developers to use the Microsoft.Graph.Communications.Calls SDK and gain direct access to the audio, video, screen sharing, and data streams. This is an optional library on top of Microsoft.Graph.Communications.Calls Microsoft.Skype.Bots.Media ( nuget ): The Real-Time Media Platform for Bots adds a new dimension to how bots can interact with users: by enabling real-time voice, video and screen sharing modalities. Concepts and Examples For more details on concepts used by the SDK and examples on joining calls and receiving calls please refer to the concepts and examples page. You can find samples using the following service: Stateful bot using Application Hosted Media on Azure Cloud Service Stateful bot using Application Hosted Media on Azure Service Fabric Stateful bot using Service Hosted Media running on Azure App Service . ICommunicationsClient and Extension Methods The Stateful SDK is exposed using a single class ICommunicationsClient . This class is defined in the Microsoft.Graph.Communications.Client nuget and has no dependency on the Microsoft.Graph.Communications.Calls calling vertical nuget package. The different verticals therefore make heavy usage of extension methods on ICommunicationsClient rather than standalone functions or properties. The intention here is to add new verticals into the ICommunicationsClient using the same pattern without the ICommunicationsClient itself taking a dependency on the new vertical's nuget, which provides greater decoupling between future verticals we will support. For a usage example please see the ICommunicationsClient.Calls() extension method." + }, "common/Microsoft.Graph.Communications.Common.OData.html": { "href": "common/Microsoft.Graph.Communications.Common.OData.html", "title": "Namespace Microsoft.Graph.Communications.Common.OData", @@ -1274,11 +1279,6 @@ "title": "Service Hosted Media Calls", "keywords": "Service Hosted Media Calls Service Hosted Media calls are those calls in which the bot offloads the media to the Microsoft infrastructure. This makes the bot much more lightweight, but it cannot access the raw audio/video streams. Creating a Service Hosted Media Call When creating an object of the Call resource, MediaConfig needs to be set to ServiceHostedMediaConfig ." }, - "articles/calls/appHostedMediaCalls.html": { - "href": "articles/calls/appHostedMediaCalls.html", - "title": "Application Hosted Media Calls", - "keywords": "Application Hosted Media Calls Application Hosted Media calls are those calls in which the bot manages the call's video and audio sockets. The bots send and receive raw audio and video data over the network. Building a CommunicationsClient with Media Platform Settings Create the an instance of the ICommunicationsClientBuilder . Create an instance of MediaPlatformSettings and use MediaCommunicationsClientBuilderExtensions.SetMediaPlatformSettings method to pass the MediaPlatformSettings to build the ICommunicationsClient Once the builder builds the ICommunicationsClient , a media session can be created using either MediaCommunicationsClientExtension.CreateMediaSession or MediaCommunicationsClientExtension.CreateMediaSession depending on how many video sockets are required. When creating an object of the Call resource, MediaConfig needs to be set to AppHostedMediaConfig . Important When creating a new call that uses application hosted media, an instance of IMediaSession needs to be passed into CallCollectionExtensions.AddAsync" - }, "articles/Logging.html": { "href": "articles/Logging.html", "title": "Logging in SDK", @@ -2724,11 +2724,6 @@ "title": "Graph Communications Media SDK", "keywords": "Graph Communications Media SDK The Media components can be found in the Microsoft.Graph.Communications.Calls.Media namespace. More information of utilizing Real-time Media Calling functionality in bots can be found here This is presented as an extension on top of the Graph Calling SDK to provide extra functionalities with Microsoft.Skype.Bots.Media library. IMediaSession The Media SDK provides very light integration with the Microsoft.Skype.Bots.Media library. There are only a few pieces of data that the signaling SDK requires to integrate with the media libraries. As a convenience the Media SDK provides an IMediaSession generator . For greater customization of media libraries developers are welcome to exclude this package and implement their own IMediaSession . Media Requirements The Communications SDK is quite flexible, however, the media library has it's own set of Requirements . Local Testing Local testing of Application Hosted Media scenarios is possible in some environments. Please refer to the testing guide to enable local testing. Select a class on the left to dive into the reference docs" }, - "calls/index.html": { - "href": "calls/index.html", - "title": "Graph Calling SDK", - "keywords": "Graph Calling SDK The Calling components can be found in the @Microsoft.Graph.Calls namespace. State Management The Graph Calling SDK exposes a different set of APIs to manage states of resources in memory. Bots built using this SDK need to register event handlers for each newly created resource in order to be informed of any changes happening on that resource. The strengths and limitations of each are further explained in the State Management article. Media Session For calls with locally hosted media the ICallCollection has an extended AddAsync method which expects an @Microsoft.Graph.Calls.IMediaSession object. This object contains the IAudioSocket and IVideoSocket composition. The IMediaSession also knows how to construct the MediaConfiguration required by the back end services to enable the AV stream to flow through the call instance. A Media Extension SDK has been added on top of this SDK to support locally hosted media scenarios. To use this extension the ICommunicationsClient must be built with MediaCommunicationsClientBuilderExtensions.SetMediaPlatformSettings . The MediaCommunicationsClientExtensions.CreateMediaSession extension method facilitates the creation of IMediaSession objects. Please see the calls with locally hosted media article for more information on the @Microsoft.Graph.Calls.IMediaSession object. Select a class on the left to dive into the reference docs" - }, "bot_media/index.html": { "href": "bot_media/index.html", "title": "Graph Communications Bot Media SDK", @@ -2789,14 +2784,19 @@ "title": "Graph Communications Core Calls SDK", "keywords": "Graph Communications Core Calls SDK This library contains the calling contracts not present in Microsoft.Graph SDK but only with Communication APIs. The Core components can be found in the Microsoft.Graph namespace. Select a class on the left to dive into the reference docs" }, - "index.html": { - "href": "index.html", - "title": "Graph Calling SDK", - "keywords": "Graph Calling SDK Introduction The Graph Calling SDK simplifies the creation of calling and meetings bots that use the Microsoft Graph Calling APIs . The SDK provides the functionality to manage states of resources in memory and simplify tasks like call setup and media session establishment. It provides interfaces for bot's service-to-service interactions with calls and meetings, including an optional Media Extension SDK that enables a bot developer to host media on their machines and gain access to low level Audio/Video sockets and media streams. SDK The Graph Calling SDK is built on top of the Microsoft Graph API and distributed as NuGet packages. The Core Concepts article is designed to better explain all the constructs used by the SDKs. To dive right in and deploy a Calling Bot refer to the documentation in each sample for further instructions. The SDK is divided into multiple nuget packages each described as below. Microsoft.Graph.Communications.Core ( nuget ): This library contains the calling contracts and is a duplicate of Microsoft.Graph SDK but only with Communication APIs. Microsoft.Graph.Communications.Common ( nuget ): This is the nuget containing all the utilities used throughout the Stateful SDK. It contains telemetry, http, obfuscation support along with helper methods. Microsoft.Graph.Communications.Client ( nuget ): This is the base client for the Stateful SDK. This implements all the common SDK features used within different verticals like calling, etc. Microsoft.Graph.Communications.Calls ( nuget ): This is the SDK that implements calling APIs. This supports making, receiving, and joining calls with Microsoft Teams users, and creating voice and video enabled bots. Microsoft.Graph.Communications.Calls.Media ( nuget ): This library allows developers to use the Microsoft.Graph.Communications.Calls SDK and gain direct access to the audio, video, screen sharing, and data streams. This is an optional library on top of Microsoft.Graph.Communications.Calls Microsoft.Skype.Bots.Media ( nuget ): The Real-Time Media Platform for Bots adds a new dimension to how bots can interact with users: by enabling real-time voice, video and screen sharing modalities. Concepts and Examples For more details on concepts used by the SDK and examples on joining calls and receiving calls please refer to the concepts and examples page. You can find samples using the following service: Stateful bot using Application Hosted Media on Azure Cloud Service Stateful bot using Application Hosted Media on Azure Service Fabric Stateful bot using Service Hosted Media running on Azure App Service . ICommunicationsClient and Extension Methods The Stateful SDK is exposed using a single class ICommunicationsClient . This class is defined in the Microsoft.Graph.Communications.Client nuget and has no dependency on the Microsoft.Graph.Communications.Calls calling vertical nuget package. The different verticals therefore make heavy usage of extension methods on ICommunicationsClient rather than standalone functions or properties. The intention here is to add new verticals into the ICommunicationsClient using the same pattern without the ICommunicationsClient itself taking a dependency on the new vertical's nuget, which provides greater decoupling between future verticals we will support. For a usage example please see the ICommunicationsClient.Calls() extension method." - }, "core/index.html": { "href": "core/index.html", "title": "Graph Communications Core SDK", "keywords": "Graph Communications Core SDK This library contains the common contracts and helpers not present in Microsoft.Graph SDK . The Core components can be found in the Microsoft.Graph namespace. Select a class on the left to dive into the reference docs" + }, + "calls/index.html": { + "href": "calls/index.html", + "title": "Graph Calling SDK", + "keywords": "Graph Calling SDK The Calling components can be found in the Microsoft.Graph.Communications.Calls namespace. State Management The Graph Calling SDK exposes a different set of APIs to manage states of resources in memory. Bots built using this SDK need to register event handlers for each newly created resource in order to be informed of any changes happening on that resource. The strengths and limitations of each are further explained in the State Management article. Media Session For calls with locally hosted media the ICallCollection has an extended AddAsync method which expects an IMediaSession object. This object contains the IAudioSocket and IVideoSocket composition. The IMediaSession also knows how to construct the MediaConfiguration required by the back end services to enable the AV stream to flow through the call instance. A Media Extension SDK has been added on top of this SDK to support locally hosted media scenarios. To use this extension the ICommunicationsClient must be built with MediaCommunicationsClientBuilderExtensions.SetMediaPlatformSettings . The MediaCommunicationsClientExtensions.CreateMediaSession extension method facilitates the creation of IMediaSession objects. Please see the calls with locally hosted media article for more information on the IMediaSession object. Select a class on the left to dive into the reference docs" + }, + "articles/calls/appHostedMediaCalls.html": { + "href": "articles/calls/appHostedMediaCalls.html", + "title": "Application Hosted Media Calls", + "keywords": "Application Hosted Media Calls Application Hosted Media calls are those calls in which the bot manages the call's video and audio sockets. The bots send and receive raw audio and video data over the network. Building a CommunicationsClient with Media Platform Settings Create the an instance of the ICommunicationsClientBuilder . Create an instance of MediaPlatformSettings and use MediaCommunicationsClientBuilderExtensions.SetMediaPlatformSettings method to pass the MediaPlatformSettings to build the ICommunicationsClient Once the builder builds the ICommunicationsClient , a media session can be created using either MediaCommunicationsClientExtension.CreateMediaSession or MediaCommunicationsClientExtension.CreateMediaSession depending on how many video sockets are required. When creating an object of the Call resource, MediaConfig needs to be set to AppHostedMediaConfig . Important When creating a new call that uses application hosted media, an instance of IMediaSession needs to be passed into CallCollectionExtensions.AddAsync" } } \ No newline at end of file diff --git a/docs/manifest.json b/docs/manifest.json index a43ebeb0..fdcb1300 100644 --- a/docs/manifest.json +++ b/docs/manifest.json @@ -102,7 +102,7 @@ "output": { ".html": { "relative_path": "articles/calls/appHostedMediaCalls.html", - "hash": "u2inK0PPdl9BwC5TeamdYg==" + "hash": "kaJzLavRPazJDGZm8UeWQw==" } }, "is_incremental": false, @@ -186,7 +186,7 @@ "output": { ".html": { "relative_path": "calls/index.html", - "hash": "cekwzP9FKI0otTjr2eon9Q==" + "hash": "8rlLMpT4Ubs1JLCaRvJZGQ==" } }, "is_incremental": false, @@ -6892,21 +6892,21 @@ "incrementalPhase": "build" }, "processors": { - "TocDocumentProcessor": { + "ResourceDocumentProcessor": { "can_incremental": false, - "details": "Processor TocDocumentProcessor cannot support incremental build because the processor doesn't implement ISupportIncrementalDocumentProcessor interface.", + "details": "Processor ResourceDocumentProcessor cannot support incremental build because the processor doesn't implement ISupportIncrementalDocumentProcessor interface.", "incrementalPhase": "build" }, - "ResourceDocumentProcessor": { + "TocDocumentProcessor": { "can_incremental": false, - "details": "Processor ResourceDocumentProcessor cannot support incremental build because the processor doesn't implement ISupportIncrementalDocumentProcessor interface.", + "details": "Processor TocDocumentProcessor cannot support incremental build because the processor doesn't implement ISupportIncrementalDocumentProcessor interface.", "incrementalPhase": "build" }, - "ManagedReferenceDocumentProcessor": { + "ConceptualDocumentProcessor": { "can_incremental": true, "incrementalPhase": "build" }, - "ConceptualDocumentProcessor": { + "ManagedReferenceDocumentProcessor": { "can_incremental": true, "incrementalPhase": "build" }