2 * Copyright (c) 2016 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.
19 namespace Tizen.Multimedia
22 /// Provides the ability to control the volume levels.
24 /// <seealso cref="AudioManager"/>
25 /// <since_tizen> 3 </since_tizen>
26 public class AudioVolume
28 private const string Tag = "Tizen.Multimedia.AudioVolume";
30 private int _volumeChangedCallbackId = -1;
31 private EventHandler<VolumeChangedEventArgs> _volumeChanged;
32 private Interop.AudioVolume.VolumeChangedCallback _volumeChangedCallback;
34 private object _eventLock = new object();
36 internal AudioVolume()
38 Level = new VolumeLevel();
39 MaxLevel = new MaxVolumeLevel();
43 /// Occurs when the volume level is changed.
45 /// <since_tizen> 3 </since_tizen>
46 public event EventHandler<VolumeChangedEventArgs> Changed
52 if (_volumeChanged == null)
54 RegisterVolumeChangedEvent();
56 _volumeChanged += value;
68 if (_volumeChanged == value)
70 UnregisterVolumeChangedEvent();
72 _volumeChanged -= value;
78 /// Gets the volume type of the sound being currently played.
80 /// <value>The volume type of the sound being currently played.</value>
81 /// <since_tizen> 3 </since_tizen>
82 public AudioVolumeType CurrentPlaybackType
86 var ret = Interop.AudioVolume.GetCurrentSoundType(out var currentType);
87 if (ret == AudioManagerError.NoPlayingSound)
89 return AudioVolumeType.None;
91 ret.Validate("Failed to get current volume type");
98 /// Gets the <see cref="VolumeLevel"/>.
100 /// <value>The <see cref="VolumeLevel"/>.</value>
101 /// <since_tizen> 3 </since_tizen>
102 public VolumeLevel Level { get; }
105 /// Gets the <see cref="MaxVolumeLevel"/>.
107 /// <value>The <see cref="MaxVolumeLevel"/>.</value>
108 /// <since_tizen> 3 </since_tizen>
109 public MaxVolumeLevel MaxLevel { get; }
111 private void RegisterVolumeChangedEvent()
113 _volumeChangedCallback = (AudioVolumeType type, uint volume, IntPtr userData) =>
115 _volumeChanged?.Invoke(this, new VolumeChangedEventArgs(type, volume));
117 var error = Interop.AudioVolume.AddVolumeChangedCallback(_volumeChangedCallback, IntPtr.Zero,
118 out _volumeChangedCallbackId);
119 Log.Info(Tag, $"VolumeController callback id:{_volumeChangedCallbackId}");
121 error.Validate("Failed to add volume changed event");
124 private void UnregisterVolumeChangedEvent()
126 Interop.AudioVolume.RemoveVolumeChangedCallback(_volumeChangedCallbackId).
127 Validate("Failed to remove volume changed event");