Merge remote-tracking branch 'origin/master' into tizen
[platform/core/csapi/tizenfx.git] / src / Tizen.Multimedia / AudioManager / AudioVolume.cs
1 /*
2  * Copyright (c) 2016 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
19 namespace Tizen.Multimedia
20 {
21     /// <summary>
22     /// Provides the ability to control the volume levels.
23     /// </summary>
24     /// <seealso cref="AudioManager"/>
25     /// <since_tizen> 3 </since_tizen>
26     public class AudioVolume
27     {
28         private const string Tag = "Tizen.Multimedia.AudioVolume";
29
30         private int _volumeChangedCallbackId = -1;
31         private EventHandler<VolumeChangedEventArgs> _volumeChanged;
32         private Interop.AudioVolume.VolumeChangedCallback _volumeChangedCallback;
33
34         private object _eventLock = new object();
35
36         internal AudioVolume()
37         {
38             Level = new VolumeLevel();
39             MaxLevel = new MaxVolumeLevel();
40         }
41
42         /// <summary>
43         /// Occurs when the volume level is changed.
44         /// </summary>
45         /// <since_tizen> 3 </since_tizen>
46         public event EventHandler<VolumeChangedEventArgs> Changed
47         {
48             add
49             {
50                 lock (_eventLock)
51                 {
52                     if (_volumeChanged == null)
53                     {
54                         RegisterVolumeChangedEvent();
55                     }
56                     _volumeChanged += value;
57                 }
58             }
59             remove
60             {
61                 if (value == null)
62                 {
63                     return;
64                 }
65
66                 lock (_eventLock)
67                 {
68                     if (_volumeChanged == value)
69                     {
70                         UnregisterVolumeChangedEvent();
71                     }
72                     _volumeChanged -= value;
73                 }
74             }
75         }
76
77         /// <summary>
78         /// Gets the volume type of the sound being currently played.
79         /// </summary>
80         /// <value>The volume type of the sound being currently played.</value>
81         /// <since_tizen> 3 </since_tizen>
82         public AudioVolumeType CurrentPlaybackType
83         {
84             get
85             {
86                 var ret = Interop.AudioVolume.GetCurrentSoundType(out var currentType);
87                 if (ret == AudioManagerError.NoPlayingSound)
88                 {
89                     return AudioVolumeType.None;
90                 }
91                 ret.Validate("Failed to get current volume type");
92
93                 return currentType;
94             }
95         }
96
97         /// <summary>
98         /// Gets the <see cref="VolumeLevel"/>.
99         /// </summary>
100         /// <value>The <see cref="VolumeLevel"/>.</value>
101         /// <since_tizen> 3 </since_tizen>
102         public VolumeLevel Level { get; }
103
104         /// <summary>
105         /// Gets the <see cref="MaxVolumeLevel"/>.
106         /// </summary>
107         /// <value>The <see cref="MaxVolumeLevel"/>.</value>
108         /// <since_tizen> 3 </since_tizen>
109         public MaxVolumeLevel MaxLevel { get; }
110
111         private void RegisterVolumeChangedEvent()
112         {
113             _volumeChangedCallback = (AudioVolumeType type, uint volume, IntPtr userData) =>
114             {
115                 _volumeChanged?.Invoke(this, new VolumeChangedEventArgs(type, volume));
116             };
117             var error = Interop.AudioVolume.AddVolumeChangedCallback(_volumeChangedCallback, IntPtr.Zero,
118                 out _volumeChangedCallbackId);
119             Log.Info(Tag, $"VolumeController callback id:{_volumeChangedCallbackId}");
120
121             error.Validate("Failed to add volume changed event");
122         }
123
124         private void UnregisterVolumeChangedEvent()
125         {
126             Interop.AudioVolume.RemoveVolumeChangedCallback(_volumeChangedCallbackId).
127                 Validate("Failed to remove volume changed event");
128         }
129     }
130 }