• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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