[Multimedia] Deprecate constructors related to ElmSharp (#4540)
[platform/core/csapi/tizenfx.git] / src / Tizen.Multimedia.Remoting / WebRTC / MediaPacketSourceConfiguration.cs
1 /*
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 using System;
18 using static Interop;
19
20 namespace Tizen.Multimedia.Remoting
21 {
22     /// <summary>
23     /// Provides means to configure properties and handle events for <see cref="MediaPacketSource"/>.
24     /// </summary>
25     /// <seealso cref="MediaPacketSource"/>
26     /// <since_tizen> 9 </since_tizen>
27     public class MediaPacketSourceConfiguration
28     {
29         private readonly MediaPacketSource _owner;
30         NativeWebRTC.MediaPacketBufferStatusCallback _mediaPacketBufferStatusChangedCallback;
31
32         internal MediaPacketSourceConfiguration(MediaPacketSource owner)
33         {
34             _owner = owner;
35         }
36
37         /// <summary>
38         /// Occurs when the buffer underruns or overflows.
39         /// </summary>
40         /// <remarks>The event handler will be executed on an internal thread.</remarks>
41         /// <since_tizen> 9 </since_tizen>
42         public event EventHandler<MediaPacketBufferStatusChangedEventArgs> BufferStatusChanged;
43
44         private IntPtr Handle => _owner.WebRtc.Handle;
45
46         private uint SourceId => _owner.SourceId.Value;
47
48         internal void OnWebRTCSet()
49         {
50             if (_mediaPacketBufferStatusChangedCallback == null)
51             {
52                 RegisterBufferStatusChangedCallback();
53             }
54         }
55
56         internal void OnWebRTCUnset()
57         {
58             if (_mediaPacketBufferStatusChangedCallback != null)
59             {
60                 UnregisterBufferStatusChangedCallback();
61             }
62         }
63
64         private void RegisterBufferStatusChangedCallback()
65         {
66             _mediaPacketBufferStatusChangedCallback = (sourceId_, state, _) =>
67             {
68                 Log.Info(WebRTCLog.Tag, $"sourceId:{sourceId_}, state:{state}");
69
70                 BufferStatusChanged?.Invoke(this, new MediaPacketBufferStatusChangedEventArgs(sourceId_, state));
71             };
72
73             NativeWebRTC.SetBufferStateChangedCb(Handle, SourceId, _mediaPacketBufferStatusChangedCallback, IntPtr.Zero).
74                 ThrowIfFailed("Failed to set buffer status changed callback.");
75         }
76
77         private void UnregisterBufferStatusChangedCallback()
78         {
79             NativeWebRTC.UnsetBufferStateChangedCb(Handle, SourceId).
80                 ThrowIfFailed("Failed to unset buffer status changed callback.");
81         }
82     }
83 }