2 * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.Diagnostics;
21 namespace Tizen.Multimedia.Remoting
24 /// Provides the ability to control audio/video track.
26 /// <since_tizen> 9 </since_tizen>
27 public sealed class MediaStreamTrack : IDisplayable<WebRTCErrorCode>
29 private WebRTC _webRtc;
30 private uint _trackId;
31 private Display _display;
33 internal MediaStreamTrack(WebRTC webRtc, MediaType type, uint trackId)
41 /// Gets the the of media stream track.
43 /// <value><see cref="MediaType"/></value>
44 /// <since_tizen> 9 </since_tizen>
45 public MediaType Type { get; }
47 private WebRTCErrorCode SetDisplay(Display display)
48 => display.ApplyTo(this);
50 private void ReplaceDisplay(Display newDisplay)
52 _display?.SetOwner(null);
53 _display = newDisplay;
54 _display?.SetOwner(this);
58 /// Gets or sets the display to show remote video.
60 /// <value>A <see cref="Multimedia.Display"/> that specifies the display.</value>
62 /// If user set video source with <see cref="TransceiverDirection.SendRecv"/>, <see cref="Display"/> must be set.<br/>
63 /// If not, the received video will fill entire screen.<br/>
64 /// If remote track, <see cref="Display"/> must be set in <see cref="WebRTC.TrackAdded"/> event.<br/>
65 /// The display is created with <see cref="MediaView"/>.
67 /// <exception cref="ObjectDisposedException">The WebRTC has already been disposed of.</exception>
68 /// <exception cref="ArgumentException">The value has already been assigned to another WebRTC.</exception>
69 /// <exception cref="InvalidOperationException">
70 /// The WebRTC is not called in <see cref="WebRTC.TrackAdded"/> event.
72 /// This MediaStreamTrack is not Video.
74 /// <since_tizen> 9 </since_tizen>
75 public Display Display
80 if (Type != MediaType.Video)
82 throw new InvalidOperationException("This property is only for video track.");
87 throw new ArgumentNullException(nameof(value), "Display cannot be null.");
90 if (value?.Owner != null)
92 if (ReferenceEquals(this, value.Owner))
94 throw new ArgumentException("The display has already been assigned to another.");
99 SetDisplay(value).ThrowIfFailed("Failed to configure display of the MediaStreamTrack");
100 ReplaceDisplay(value);
105 WebRTCErrorCode IDisplayable<WebRTCErrorCode>.ApplyEvasDisplay(DisplayType type, ElmSharp.EvasObject evasObject)
107 Debug.Assert(Enum.IsDefined(typeof(DisplayType), type));
108 Debug.Assert(type != DisplayType.None);
110 return NativeWebRTC.SetDisplay(_webRtc.Handle, _trackId,
111 type == DisplayType.Overlay ? WebRTCDisplayType.Overlay : WebRTCDisplayType.Evas, evasObject);
114 WebRTCErrorCode IDisplayable<WebRTCErrorCode>.ApplyEcoreWindow(IntPtr windowHandle)
116 return NativeWebRTC.SetEcoreDisplay(_webRtc.Handle, _trackId, windowHandle);
120 /// Gets or sets the display mode.
123 /// This property is meaningful only in overlay or EVAS surface display type.
125 /// <value>A <see cref="WebRTCDisplayMode"/> that specifies the display mode.</value>
126 /// <exception cref="ArgumentException">Display mode type is incorrect.</exception>
127 /// <exception cref="InvalidOperationException"><see cref="Display"/> is not set.</exception>
128 /// <since_tizen> 9 </since_tizen>
129 public WebRTCDisplayMode DisplayMode
133 if (Type != MediaType.Video)
135 throw new InvalidOperationException("This property is only for video track.");
138 NativeWebRTC.GetDisplayMode(_webRtc.Handle, _trackId, out var val).
139 ThrowIfFailed("Failed to get WebRTC display mode");
145 if (Type != MediaType.Video)
147 throw new InvalidOperationException("This property is only for video track.");
150 ValidationUtil.ValidateEnum(typeof(WebRTCDisplayMode), value, nameof(value));
152 NativeWebRTC.SetDisplayMode(_webRtc.Handle, _trackId, value).
153 ThrowIfFailed("Failed to set WebRTC display mode.");
158 /// Gets or sets the display visibility.
160 /// <value>true if WebRTC display is visible, otherwise false.</value>
162 /// This property is meaningful only in overlay or EVAS surface display type.
164 /// <exception cref="InvalidOperationException"><see cref="Display"/> is not set.</exception>
165 /// <since_tizen> 9 </since_tizen>
166 public bool DisplayVisible
170 if (Type != MediaType.Video)
172 throw new InvalidOperationException("This property is only for video track.");
175 NativeWebRTC.GetDisplayVisible(_webRtc.Handle, _trackId, out bool val).
176 ThrowIfFailed("Failed to get visible status");
182 if (Type != MediaType.Video)
184 throw new InvalidOperationException("This property is only for video track.");
187 NativeWebRTC.SetDisplayVisible(_webRtc.Handle, _trackId, value).
188 ThrowIfFailed("Failed to set display status.");
193 /// Gets or sets the mute status of the audio track.
195 /// <value>true if audio is muted, otherwise false. The default value is false.</value>
196 /// <exception cref="ObjectDisposedException">The WebRTC has already been disposed.</exception>
197 /// <exception cref="InvalidOperationException">This MediaStreamTrack is not Audio.</exception>
198 /// <since_tizen> 11 </since_tizen>
203 if (Type != MediaType.Audio)
205 throw new InvalidOperationException("This property is only for audio track.");
208 NativeWebRTC.GetAudioMute(_webRtc.Handle, _trackId, out bool val).
209 ThrowIfFailed("Failed to get audio mute status");
215 if (Type != MediaType.Audio)
217 throw new InvalidOperationException("This property is only for audio track.");
220 NativeWebRTC.SetAudioMute(_webRtc.Handle, _trackId, value).
221 ThrowIfFailed("Failed to set audio mute status.");
226 /// Applies the audio stream policy to remote track.
228 /// <param name="policy">The <see cref="AudioStreamPolicy"/> to apply.</param>
230 /// This must be called in <see cref="WebRTC.TrackAdded"/> event.<br/>
232 /// <see cref="WebRTC"/> does not support all <see cref="AudioStreamType"/>.<br/>
233 /// Supported types are <see cref="AudioStreamType.Media"/>, <see cref="AudioStreamType.Voip"/>,
234 /// <see cref="AudioStreamType.MediaExternalOnly"/>.
236 /// <exception cref="ArgumentNullException"><paramref name="policy"/> is null.</exception>
237 /// <exception cref="InvalidOperationException">
238 /// <see cref="WebRTC.AudioFrameEncoded"/> was set.<br/>
240 /// This method was not called in <see cref="WebRTC.TrackAdded"/> event.
242 /// This MediaStreamTrack is not Audio.
244 /// <exception cref="NotSupportedException">
245 /// <see cref="AudioStreamType"/> of <paramref name="policy"/> is not supported on the current platform.
247 /// <exception cref="ObjectDisposedException">
248 /// The WebRTC has already been disposed.<br/>
250 /// <paramref name="policy"/> has already been disposed.
252 /// <seealso cref="AudioStreamPolicy"/>
253 /// <seealso cref="WebRTC.TrackAdded"/>
254 /// <since_tizen> 9 </since_tizen>
255 public void ApplyAudioStreamPolicy(AudioStreamPolicy policy)
259 throw new ArgumentNullException(nameof(policy));
262 if (Type != MediaType.Audio)
264 throw new InvalidOperationException("This method is only for audio track.");
267 var ret = NativeWebRTC.SetAudioStreamPolicy(_webRtc.Handle, _trackId, policy.Handle);
269 if (ret == WebRTCErrorCode.InvalidArgument)
271 throw new NotSupportedException("The specified policy is not supported on the current system.");
274 ret.ThrowIfFailed("Failed to set the audio stream policy to the WebRTC");