Release 4.0.0-preview1-00051
[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     internal static class AudioVolumeLog
22     {
23         internal const string Tag = "Tizen.Multimedia.AudioVolume";
24     }
25
26     /// <summary>
27     /// The AudioVolume API provides functions to check and control volumes.
28     /// </summary>
29     public class AudioVolume
30     {
31         private static int _volumeChangedCallbackId = -1;
32         private EventHandler<VolumeChangedEventArgs> _volumeChanged;
33         private Interop.SoundManagerVolumeChangedCallback _volumeChangedCallback;
34
35         internal AudioVolume()
36         {
37             Level = new VolumeLevel();
38             MaxLevel = new MaxVolumeLevel();
39         }
40
41         /// <summary>
42         /// Registers a function to be invoked when the volume level is changed.
43         /// </summary>
44         public event EventHandler<VolumeChangedEventArgs> Changed {
45             add {
46                 Tizen.Log.Info(AudioVolumeLog.Tag, "VolumeController Changed Event added....");
47                 if(_volumeChanged == null) {
48                     RegisterVolumeChangedEvent();
49                 }
50                 _volumeChanged += value;
51             }
52             remove {
53                 Tizen.Log.Info(AudioVolumeLog.Tag, "VolumeController Changed Event removed....");
54                 if(_volumeChanged?.GetInvocationList()?.GetLength(0) == 1) {
55                     UnregisterVolumeChangedEvent();
56                 }
57                 _volumeChanged -= value;
58             }
59         }
60
61         /// <summary>
62         /// The Audio Manager has predefined volume types.(system, notification, alarm, ringtone, media, call, voip, voice).
63         /// The volume type of the sound being currently played.
64         /// </summary>
65         public AudioVolumeType CurrentPlaybackType {
66             get {
67                 AudioVolumeType currentType;
68                 int ret = Interop.AudioVolume.GetCurrentSoundType(out currentType);
69                 if(ret != 0) {
70                     Tizen.Log.Info(AudioVolumeLog.Tag, "Unable to get current playback sound type" + (AudioManagerError)ret);
71                     return AudioVolumeType.None;
72                 }
73                 return currentType;
74             }
75         }
76
77         /// <summary>
78         /// The indexer class which is used to get/set volume level specified for a particular sound type.
79         /// </summary>
80         public VolumeLevel Level;
81
82         /// <summary>
83         /// The indexer class which is used to get maximum volume level supported for a particular sound type.
84         /// </summary>
85         public MaxVolumeLevel MaxLevel;
86
87         private void RegisterVolumeChangedEvent()
88         {
89             _volumeChangedCallback = (AudioVolumeType type, uint volume, IntPtr userData) => {
90                 VolumeChangedEventArgs eventArgs = new VolumeChangedEventArgs(type, volume);
91                 _volumeChanged.Invoke(this, eventArgs);
92             };
93             int error = Interop.AudioVolume.AddVolumeChangedCallback(_volumeChangedCallback, IntPtr.Zero, out _volumeChangedCallbackId);
94             Tizen.Log.Info(AudioVolumeLog.Tag, "VolumeController Add Changed Event return id:" + _volumeChangedCallbackId + "error:" + error);
95             AudioManagerErrorFactory.CheckAndThrowException(error, "unable to add level changed callback");
96         }
97
98         private void UnregisterVolumeChangedEvent()
99         {
100             if (_volumeChangedCallbackId > 0) {
101                 int error = Interop.AudioVolume.RemoveVolumeChangedCallback(_volumeChangedCallbackId);
102                 Tizen.Log.Info(AudioVolumeLog.Tag, "VolumeController Remove Changed Event(id:" + _volumeChangedCallbackId + ") return error: " + error);
103                 AudioManagerErrorFactory.CheckAndThrowException(error, "unable to remove level changed callback");
104             }
105         }
106     }
107 }