1 /* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef AV_SESSION_AUDIO_ADAPTER_H 17 #define AV_SESSION_AUDIO_ADAPTER_H 18 19 #include <functional> 20 #include <memory> 21 #include <mutex> 22 #include "audio_stream_manager.h" 23 #include "audio_routing_manager.h" 24 25 namespace OHOS::AVSession { 26 using AudioRendererChangeInfos = std::vector<std::shared_ptr<AudioStandard::AudioRendererChangeInfo>>; 27 using AudioDeviceDescriptors = std::vector<std::shared_ptr<AudioStandard::AudioDeviceDescriptor>>; 28 using AudioDeviceDescriptorWithSptr = std::shared_ptr<AudioStandard::AudioDeviceDescriptor>; 29 using DeviceChangeAction = AudioStandard::DeviceChangeAction; 30 using AudioDeviceDescriptor = AudioStandard::AudioDeviceDescriptor; 31 32 using AudioDeviceDescriptorsCallbackFunc = std::function<void(const AudioDeviceDescriptors&)>; 33 34 class AudioVolumeKeyEventCallback; 35 class AudioPreferredDeviceChangeCallback; 36 class AudioAllowedPlaybackCallback; 37 38 class AudioAdapter : public AudioStandard::AudioRendererStateChangeCallback, 39 public AudioStandard::AudioManagerDeviceChangeCallback, 40 public AudioStandard::AudioManagerAvailableDeviceChangeCallback, 41 public AudioStandard::AudioPreferredOutputDeviceChangeCallback, 42 public std::enable_shared_from_this<AudioAdapter> { 43 public: 44 using StateListener = std::function<void(const AudioRendererChangeInfos& infos)>; 45 using DeviceChangeListener = std::function<void(const DeviceChangeAction& deviceChangeAction)>; 46 using PreferOutputDeviceChangeListener = 47 std::function<void(const std::vector<std::shared_ptr<AudioDeviceDescriptor>> &desc)>; 48 static AudioAdapter& GetInstance(); 49 50 AudioAdapter(); 51 ~AudioAdapter() override; 52 53 void Init(); 54 55 void AddStreamRendererStateListener(const StateListener& listener); 56 57 void AddDeviceChangeListener(const PreferOutputDeviceChangeListener& listener); 58 59 int32_t MuteAudioStream(int32_t uid, int32_t pid); 60 61 int32_t UnMuteAudioStream(int32_t uid); 62 63 int32_t MuteAudioStream(int32_t uid, AudioStandard::StreamUsage usage); 64 65 int32_t UnMuteAudioStream(int32_t uid, AudioStandard::StreamUsage usage); 66 67 int32_t PauseAudioStream(int32_t uid, AudioStandard::StreamUsage usage); 68 69 void OnRendererStateChange(const AudioRendererChangeInfos& infos) override; 70 71 void OnDeviceChange(const DeviceChangeAction& deviceChangeAction) override; 72 73 void OnAvailableDeviceChange(const AudioStandard::AudioDeviceUsage usage, 74 const AudioStandard::DeviceChangeAction& deviceChangeAction) override; 75 76 void OnPreferredOutputDeviceUpdated(const AudioDeviceDescriptors& desc) override; 77 78 bool GetRendererRunning(int32_t uid, int32_t pid); 79 80 int32_t SetVolume(int32_t volume); 81 int32_t GetVolume(); 82 int32_t RegisterVolumeKeyEventCallback(const std::function<void(int32_t)>& callback); 83 int32_t UnregisterVolumeKeyEventCallback(); 84 85 AudioDeviceDescriptors GetAvailableDevices(); 86 int32_t SetAvailableDeviceChangeCallback(const std::function<void( 87 const AudioDeviceDescriptors&)>& callback); 88 int32_t UnsetAvailableDeviceChangeCallback(); 89 90 AudioDeviceDescriptors GetDevices(); 91 int32_t SetDeviceChangeCallback(); 92 int32_t UnsetDeviceChangeCallback(); 93 94 AudioDeviceDescriptors GetPreferredOutputDeviceForRendererInfo(); 95 int32_t SetPreferredOutputDeviceChangeCallback(const std::function<void( 96 const AudioDeviceDescriptors&)>& callback); 97 int32_t UnsetPreferredOutputDeviceChangeCallback(); 98 99 int32_t SelectOutputDevice(const AudioDeviceDescriptorWithSptr& desc); 100 AudioDeviceDescriptorWithSptr FindRenderDeviceForUsage(const AudioDeviceDescriptors& devices, 101 const AudioDeviceDescriptorWithSptr& desc); 102 103 int32_t RegisterAllowedPlaybackCallback(const std::function<bool(int32_t, int32_t)>& callback); 104 private: 105 static std::shared_ptr<AudioAdapter> instance_; 106 static std::once_flag onceFlag_; 107 std::vector<StateListener> listeners_; 108 std::vector<PreferOutputDeviceChangeListener> deviceChangeListeners_; 109 const std::vector<AudioStandard::StreamUsage> BACKGROUND_MUTE_STREAM_USAGE { 110 AudioStandard::STREAM_USAGE_MUSIC, 111 AudioStandard::STREAM_USAGE_MOVIE, 112 AudioStandard::STREAM_USAGE_GAME, 113 AudioStandard::STREAM_USAGE_AUDIOBOOK 114 }; 115 std::recursive_mutex listenersLock_; 116 bool is2in1_ {false}; 117 118 int32_t volumeMax_ = 0; 119 int32_t volumeMin_ = 0; 120 std::shared_ptr<AudioVolumeKeyEventCallback> volumeCallback_; 121 std::shared_ptr<AudioPreferredDeviceChangeCallback> preferredDeviceChangeCallback_; 122 123 AudioDeviceDescriptorsCallbackFunc availableDeviceChangeCallbackFunc_; 124 std::shared_ptr<AudioAllowedPlaybackCallback> playbackCallback_; 125 }; 126 127 class AudioVolumeKeyEventCallback : public AudioStandard::VolumeKeyEventCallback { 128 public: AudioVolumeKeyEventCallback(const std::function<void (int32_t)> & callback)129 explicit AudioVolumeKeyEventCallback(const std::function<void(int32_t)>& callback) 130 : callback_(callback) { } 131 ~AudioVolumeKeyEventCallback() = default; 132 OnVolumeKeyEvent(AudioStandard::VolumeEvent volumeEvent)133 void OnVolumeKeyEvent(AudioStandard::VolumeEvent volumeEvent) override 134 { 135 callback_(volumeEvent.volume); 136 } 137 138 private: 139 const std::function<void(int32_t)> callback_; 140 }; 141 142 class AudioPreferredDeviceChangeCallback : public AudioStandard::AudioPreferredOutputDeviceChangeCallback { 143 public: AudioPreferredDeviceChangeCallback(const std::function<void (const AudioDeviceDescriptors &)> & callback)144 explicit AudioPreferredDeviceChangeCallback(const std::function<void( 145 const AudioDeviceDescriptors&)>& callback) : callback_(callback) { } 146 ~AudioPreferredDeviceChangeCallback() = default; 147 OnPreferredOutputDeviceUpdated(const AudioDeviceDescriptors & desc)148 void OnPreferredOutputDeviceUpdated(const AudioDeviceDescriptors& desc) override 149 { 150 auto device = AudioAdapter::GetInstance().GetPreferredOutputDeviceForRendererInfo(); 151 callback_(device); 152 } 153 154 private: 155 const AudioDeviceDescriptorsCallbackFunc callback_; 156 }; 157 158 class AudioAllowedPlaybackCallback : public AudioStandard::AudioQueryAllowedPlaybackCallback { 159 public: AudioAllowedPlaybackCallback(const std::function<bool (int32_t,int32_t)> & callback)160 explicit AudioAllowedPlaybackCallback(const std::function<bool( 161 int32_t, int32_t)>& callback) : callback_(callback) { } 162 ~AudioAllowedPlaybackCallback() = default; 163 OnQueryAllowedPlayback(int32_t uid,int32_t pid)164 bool OnQueryAllowedPlayback(int32_t uid, int32_t pid) override 165 { 166 return callback_(uid, pid); 167 } 168 169 private: 170 const std::function<bool(int32_t, int32_t)> callback_; 171 }; 172 } 173 #endif // AV_SESSION_AUDIO_ADAPTER_H 174