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 AudioDeviceDescriptorsWithSptr = std::vector<std::shared_ptr<AudioStandard::AudioDeviceDescriptor>>; 30 using DeviceChangeAction = AudioStandard::DeviceChangeAction; 31 using AudioDeviceDescriptor = AudioStandard::AudioDeviceDescriptor; 32 33 using AudioDeviceDescriptorsCallbackFunc = std::function<void(const AudioDeviceDescriptorsWithSptr&)>; 34 35 class AudioVolumeKeyEventCallback; 36 class AudioPreferredDeviceChangeCallback; 37 class AudioAllowedPlaybackCallback; 38 39 class AudioAdapter : public AudioStandard::AudioRendererStateChangeCallback, 40 public AudioStandard::AudioManagerDeviceChangeCallback, 41 public AudioStandard::AudioManagerAvailableDeviceChangeCallback, 42 public AudioStandard::AudioPreferredOutputDeviceChangeCallback, 43 public std::enable_shared_from_this<AudioAdapter> { 44 public: 45 using StateListener = std::function<void(const AudioRendererChangeInfos& infos)>; 46 using DeviceChangeListener = std::function<void(const DeviceChangeAction& deviceChangeAction)>; 47 using PreferOutputDeviceChangeListener = 48 std::function<void(const std::vector<std::shared_ptr<AudioDeviceDescriptor>> &desc)>; 49 static AudioAdapter& GetInstance(); 50 51 AudioAdapter(); 52 ~AudioAdapter() override; 53 54 void Init(); 55 56 void AddStreamRendererStateListener(const StateListener& listener); 57 58 void AddDeviceChangeListener(const PreferOutputDeviceChangeListener& listener); 59 60 int32_t MuteAudioStream(int32_t uid, int32_t pid); 61 62 int32_t UnMuteAudioStream(int32_t uid); 63 64 int32_t MuteAudioStream(int32_t uid, AudioStandard::StreamUsage usage); 65 66 int32_t UnMuteAudioStream(int32_t uid, AudioStandard::StreamUsage usage); 67 68 int32_t PauseAudioStream(int32_t uid, AudioStandard::StreamUsage usage); 69 70 void OnRendererStateChange(const AudioRendererChangeInfos& infos) override; 71 72 void OnDeviceChange(const DeviceChangeAction& deviceChangeAction) override; 73 74 void OnAvailableDeviceChange(const AudioStandard::AudioDeviceUsage usage, 75 const AudioStandard::DeviceChangeAction& deviceChangeAction) override; 76 77 void OnPreferredOutputDeviceUpdated(const AudioDeviceDescriptorsWithSptr& desc) override; 78 79 bool GetRendererRunning(int32_t uid); 80 81 int32_t SetVolume(int32_t volume); 82 int32_t GetVolume(); 83 int32_t RegisterVolumeKeyEventCallback(const std::function<void(int32_t)>& callback); 84 int32_t UnregisterVolumeKeyEventCallback(); 85 86 AudioDeviceDescriptorsWithSptr GetAvailableDevices(); 87 int32_t SetAvailableDeviceChangeCallback(const std::function<void( 88 const AudioDeviceDescriptorsWithSptr&)>& callback); 89 int32_t UnsetAvailableDeviceChangeCallback(); 90 91 AudioDeviceDescriptorsWithSptr GetDevices(); 92 int32_t SetDeviceChangeCallback(); 93 int32_t UnsetDeviceChangeCallback(); 94 95 AudioDeviceDescriptorsWithSptr GetPreferredOutputDeviceForRendererInfo(); 96 int32_t SetPreferredOutputDeviceChangeCallback(const std::function<void( 97 const AudioDeviceDescriptorsWithSptr&)>& callback); 98 int32_t UnsetPreferredOutputDeviceChangeCallback(); 99 100 int32_t SelectOutputDevice(const AudioDeviceDescriptorWithSptr& desc); 101 AudioDeviceDescriptorWithSptr FindRenderDeviceForUsage(const AudioDeviceDescriptorsWithSptr& devices, 102 const AudioDeviceDescriptorWithSptr& desc); 103 104 int32_t RegisterAllowedPlaybackCallback(const std::function<bool(int32_t, int32_t)>& callback); 105 private: 106 static std::shared_ptr<AudioAdapter> instance_; 107 static std::once_flag onceFlag_; 108 std::vector<StateListener> listeners_; 109 std::vector<PreferOutputDeviceChangeListener> deviceChangeListeners_; 110 const std::vector<AudioStandard::StreamUsage> BACKGROUND_MUTE_STREAM_USAGE { 111 AudioStandard::STREAM_USAGE_MUSIC, 112 AudioStandard::STREAM_USAGE_MOVIE, 113 AudioStandard::STREAM_USAGE_GAME, 114 AudioStandard::STREAM_USAGE_AUDIOBOOK 115 }; 116 std::recursive_mutex listenersLock_; 117 bool is2in1_ {false}; 118 119 int32_t volumeMax_ = 0; 120 int32_t volumeMin_ = 0; 121 std::shared_ptr<AudioVolumeKeyEventCallback> volumeCallback_; 122 std::shared_ptr<AudioPreferredDeviceChangeCallback> preferredDeviceChangeCallback_; 123 124 AudioDeviceDescriptorsCallbackFunc availableDeviceChangeCallbackFunc_; 125 std::shared_ptr<AudioAllowedPlaybackCallback> playbackCallback_; 126 }; 127 128 class AudioVolumeKeyEventCallback : public AudioStandard::VolumeKeyEventCallback { 129 public: AudioVolumeKeyEventCallback(const std::function<void (int32_t)> & callback)130 explicit AudioVolumeKeyEventCallback(const std::function<void(int32_t)>& callback) 131 : callback_(callback) { } 132 ~AudioVolumeKeyEventCallback() = default; 133 OnVolumeKeyEvent(AudioStandard::VolumeEvent volumeEvent)134 void OnVolumeKeyEvent(AudioStandard::VolumeEvent volumeEvent) override 135 { 136 callback_(volumeEvent.volume); 137 } 138 139 private: 140 const std::function<void(int32_t)> callback_; 141 }; 142 143 class AudioPreferredDeviceChangeCallback : public AudioStandard::AudioPreferredOutputDeviceChangeCallback { 144 public: AudioPreferredDeviceChangeCallback(const std::function<void (const AudioDeviceDescriptorsWithSptr &)> & callback)145 explicit AudioPreferredDeviceChangeCallback(const std::function<void( 146 const AudioDeviceDescriptorsWithSptr&)>& callback) : callback_(callback) { } 147 ~AudioPreferredDeviceChangeCallback() = default; 148 OnPreferredOutputDeviceUpdated(const AudioDeviceDescriptorsWithSptr & desc)149 void OnPreferredOutputDeviceUpdated(const AudioDeviceDescriptorsWithSptr& desc) override 150 { 151 auto device = AudioAdapter::GetInstance().GetPreferredOutputDeviceForRendererInfo(); 152 callback_(device); 153 } 154 155 private: 156 const AudioDeviceDescriptorsCallbackFunc callback_; 157 }; 158 159 class AudioAllowedPlaybackCallback : public AudioStandard::AudioQueryAllowedPlaybackCallback { 160 public: AudioAllowedPlaybackCallback(const std::function<bool (int32_t,int32_t)> & callback)161 explicit AudioAllowedPlaybackCallback(const std::function<bool( 162 int32_t, int32_t)>& callback) : callback_(callback) { } 163 ~AudioAllowedPlaybackCallback() = default; 164 OnQueryAllowedPlayback(int32_t uid,int32_t pid)165 bool OnQueryAllowedPlayback(int32_t uid, int32_t pid) override 166 { 167 return callback_(uid, pid); 168 } 169 170 private: 171 const std::function<bool(int32_t, int32_t)> callback_; 172 }; 173 } 174 #endif // AV_SESSION_AUDIO_ADAPTER_H 175