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