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 public class AudioVolume
27 private const string Tag = "Tizen.Multimedia.AudioVolume";
29 private int _volumeChangedCallbackId = -1;
30 private EventHandler<VolumeChangedEventArgs> _volumeChanged;
31 private Interop.AudioVolume.VolumeChangedCallback _volumeChangedCallback;
33 private object _eventLock = new object();
35 internal AudioVolume()
37 Level = new VolumeLevel();
38 MaxLevel = new MaxVolumeLevel();
42 /// Occurs when the volume level is changed.
44 public event EventHandler<VolumeChangedEventArgs> Changed
50 if (_volumeChanged == null)
52 RegisterVolumeChangedEvent();
54 _volumeChanged += value;
66 if (_volumeChanged == value)
68 UnregisterVolumeChangedEvent();
70 _volumeChanged -= value;
76 /// Gets the volume type of the sound being currently played.
78 /// <value>The volume type of the sound being currently played.</value>
79 public AudioVolumeType CurrentPlaybackType
83 var ret = Interop.AudioVolume.GetCurrentSoundType(out var currentType);
84 if (ret == AudioManagerError.NoPlayingSound)
86 return AudioVolumeType.None;
88 ret.Validate("Failed to get current volume type");
95 /// Gets the <see cref="VolumeLevel"/>.
97 /// <value>The <see cref="VolumeLevel"/>.</value>
98 public VolumeLevel Level { get; }
101 /// Gets the <see cref="MaxVolumeLevel"/>.
103 /// <value>The <see cref="MaxVolumeLevel"/>.</value>
104 public MaxVolumeLevel MaxLevel { get; }
106 private void RegisterVolumeChangedEvent()
108 _volumeChangedCallback = (AudioVolumeType type, uint volume, IntPtr userData) =>
110 _volumeChanged?.Invoke(this, new VolumeChangedEventArgs(type, volume));
112 var error = Interop.AudioVolume.AddVolumeChangedCallback(_volumeChangedCallback, IntPtr.Zero,
113 out _volumeChangedCallbackId);
114 Log.Info(Tag, $"VolumeController callback id:{_volumeChangedCallbackId}");
116 error.Validate("Failed to add volume changed event");
119 private void UnregisterVolumeChangedEvent()
121 Interop.AudioVolume.RemoveVolumeChangedCallback(_volumeChangedCallbackId).
122 Validate("Failed to remove volume changed event");