/// <summary> /// Initializes a new instance of the <see cref="BotMediaStream"/> class. /// </summary> /// <param name="mediaSession">The media session.</param> /// <param name="logger">Graph logger.</param> /// <exception cref="InvalidOperationException">Throws when no audio socket is passed in.</exception> public BotMediaStream(ILocalMediaSession mediaSession, IGraphLogger logger) { ArgumentVerifier.ThrowOnNullArgument(mediaSession, "mediaSession"); this.mediaSession = mediaSession; this.logger = logger; this.audioSendStatusActive = new TaskCompletionSource <bool>(); this.videoSendStatusActive = new TaskCompletionSource <bool>(); this.startVideoPlayerCompleted = new TaskCompletionSource <bool>(); this.audioSocket = this.mediaSession.AudioSocket; if (this.audioSocket == null) { throw new InvalidOperationException("A mediaSession needs to have at least an audioSocket"); } this.audioSocket.AudioSendStatusChanged += this.OnAudioSendStatusChanged; this.mainVideoSocket = this.mediaSession.VideoSockets?.FirstOrDefault(); if (this.mainVideoSocket != null) { this.mainVideoSocket.VideoSendStatusChanged += this.OnVideoSendStatusChanged; this.mainVideoSocket.VideoKeyFrameNeeded += this.OnVideoKeyFrameNeeded; } this.videoSockets = this.mediaSession.VideoSockets?.ToList(); this.vbssSocket = this.mediaSession.VbssSocket; if (this.vbssSocket != null) { this.vbssSocket.VideoSendStatusChanged += this.OnVbssSocketSendStatusChanged; } var ignoreTask = this.StartAudioVideoFramePlayerAsync().ForgetAndLogExceptionAsync(this.logger, "Failed to start the player"); }
/// <summary> /// Initializes a new instance of the <see cref="BotMediaStream"/> class. /// </summary> /// <param name="mediaSession">The media session.</param> /// <param name="logger">Graph logger.</param> /// <exception cref="InvalidOperationException">Throws when no audio socket is passed in.</exception> public BotMediaStream(ILocalMediaSession mediaSession, IGraphLogger logger) : base(logger) { ArgumentVerifier.ThrowOnNullArgument(mediaSession, nameof(mediaSession)); ArgumentVerifier.ThrowOnNullArgument(logger, nameof(logger)); this.mediaSession = mediaSession; // Subscribe to the audio media. this.audioSocket = mediaSession.AudioSocket; if (this.audioSocket == null) { throw new InvalidOperationException("A mediaSession needs to have at least an audioSocket"); } this.audioSocket.AudioMediaReceived += this.OnAudioMediaReceived; // Subscribe to the video media. this.videoSockets = this.mediaSession.VideoSockets?.ToList(); if (this.videoSockets?.Any() == true) { this.videoSockets.ForEach(videoSocket => videoSocket.VideoMediaReceived += this.OnVideoMediaReceived); } // Subscribe to the VBSS media. this.vbssSocket = this.mediaSession.VbssSocket; if (this.vbssSocket != null) { this.mediaSession.VbssSocket.VideoMediaReceived += this.OnVbssMediaReceived; } }