• 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 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