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
21 internal static class AudioVolumeLog
23 internal const string Tag = "Tizen.Multimedia.AudioVolume";
27 /// The AudioVolume API provides functions to check and control volumes.
29 public class AudioVolume
31 private static int _volumeChangedCallbackId = -1;
32 private EventHandler<VolumeChangedEventArgs> _volumeChanged;
33 private Interop.SoundManagerVolumeChangedCallback _volumeChangedCallback;
35 internal AudioVolume()
37 Level = new VolumeLevel();
38 MaxLevel = new MaxVolumeLevel();
42 /// Registers a function to be invoked when the volume level is changed.
44 public event EventHandler<VolumeChangedEventArgs> Changed {
46 Tizen.Log.Info(AudioVolumeLog.Tag, "VolumeController Changed Event added....");
47 if(_volumeChanged == null) {
48 RegisterVolumeChangedEvent();
50 _volumeChanged += value;
53 Tizen.Log.Info(AudioVolumeLog.Tag, "VolumeController Changed Event removed....");
54 if(_volumeChanged?.GetInvocationList()?.GetLength(0) == 1) {
55 UnregisterVolumeChangedEvent();
57 _volumeChanged -= value;
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.
65 public AudioVolumeType CurrentPlaybackType {
67 AudioVolumeType currentType;
68 int ret = Interop.AudioVolume.GetCurrentSoundType(out currentType);
70 Tizen.Log.Info(AudioVolumeLog.Tag, "Unable to get current playback sound type" + (AudioManagerError)ret);
71 return AudioVolumeType.None;
78 /// The indexer class which is used to get/set volume level specified for a particular sound type.
80 public VolumeLevel Level;
83 /// The indexer class which is used to get maximum volume level supported for a particular sound type.
85 public MaxVolumeLevel MaxLevel;
87 private void RegisterVolumeChangedEvent()
89 _volumeChangedCallback = (AudioVolumeType type, uint volume, IntPtr userData) => {
90 VolumeChangedEventArgs eventArgs = new VolumeChangedEventArgs(type, volume);
91 _volumeChanged.Invoke(this, eventArgs);
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");
98 private void UnregisterVolumeChangedEvent()
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");