• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024-2025 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 #ifndef ST_AUDIO_CAPTURER_SESSION_H
16 #define ST_AUDIO_CAPTURER_SESSION_H
17 
18 #include <bitset>
19 #include <list>
20 #include <string>
21 #include <unordered_map>
22 #include <unordered_set>
23 #include <mutex>
24 #include "singleton.h"
25 #include "audio_group_handle.h"
26 #include "audio_manager_base.h"
27 #include "audio_module_info.h"
28 #include "audio_volume_config.h"
29 #include "audio_adapter_info.h"
30 #include "audio_errors.h"
31 
32 #include "audio_policy_manager_factory.h"
33 #include "audio_router_center.h"
34 
35 #include "audio_iohandle_map.h"
36 #include "audio_active_device.h"
37 #include "audio_config_manager.h"
38 #include "audio_connected_device.h"
39 #include "audio_ec_manager.h"
40 #include "audio_device_common.h"
41 #include "audio_volume_manager.h"
42 #include "audio_a2dp_offload_manager.h"
43 
44 namespace OHOS {
45 namespace AudioStandard {
46 
47 class AudioCapturerSession {
48 public:
GetInstance()49     static AudioCapturerSession& GetInstance()
50     {
51         static AudioCapturerSession instance;
52         return instance;
53     }
54     void Init(std::shared_ptr<AudioA2dpOffloadManager> audioA2dpOffloadManager);
55     void DeInit();
56     void SetConfigParserFlag();
57     int32_t OnCapturerSessionAdded(uint64_t sessionID, SessionInfo sessionInfo, AudioStreamInfo streamInfo);
58     void OnCapturerSessionRemoved(uint64_t sessionID);
59 
60     int32_t SetWakeUpAudioCapturerFromAudioServer(const AudioProcessConfig &config);
61     int32_t CloseWakeUpAudioCapturer();
62 
63     void ReloadSourceForDeviceChange(const AudioDeviceDescriptor &inputDevice,
64         const AudioDeviceDescriptor &outputDevice, const std::string &caller);
65     void ReloadSourceForEffect(const AudioEffectPropertyArrayV3 &oldPropertyArray,
66         const AudioEffectPropertyArrayV3 &newPropertyArray);
67     void ReloadSourceForEffect(const AudioEnhancePropertyArray &oldPropertyArray,
68         const AudioEnhancePropertyArray &newPropertyArray);
69 private:
AudioCapturerSession()70     AudioCapturerSession() : audioPolicyManager_(AudioPolicyManagerFactory::GetAudioPolicyManager()),
71         audioRouterCenter_(AudioRouterCenter::GetAudioRouterCenter()),
72         audioIOHandleMap_(AudioIOHandleMap::GetInstance()),
73         audioActiveDevice_(AudioActiveDevice::GetInstance()),
74         audioConfigManager_(AudioConfigManager::GetInstance()),
75         audioConnectedDevice_(AudioConnectedDevice::GetInstance()),
76         audioEcManager_(AudioEcManager::GetInstance()),
77         audioDeviceCommon_(AudioDeviceCommon::GetInstance()),
78         audioVolumeManager_(AudioVolumeManager::GetInstance())
79     {
80         inputDeviceForReload_.deviceType_ = DEVICE_TYPE_DEFAULT;
81     }
~AudioCapturerSession()82     ~AudioCapturerSession() {}
83 
84     void HandleRemainingSource();
85     void HandleRemoteCastDevice(bool isConnected, AudioStreamInfo streamInfo = {});
86 
87     void LoadInnerCapturerSink(std::string moduleName, AudioStreamInfo streamInfo);
88     void UnloadInnerCapturerSink(std::string moduleName);
89 
90     bool ConstructWakeupAudioModuleInfo(const AudioStreamInfo &streamInfo,
91         AudioModuleInfo &audioModuleInfo);
92     bool FillWakeupStreamPropInfo(const AudioStreamInfo &streamInfo, PipeInfo *pipeInfo,
93         AudioModuleInfo &audioModuleInfo);
94     int32_t SetWakeUpAudioCapturer(InternalAudioCapturerOptions options);
95 
96     void SetInputDeviceTypeForReload(const AudioDeviceDescriptor &inputDevice);
97     const AudioDeviceDescriptor& GetInputDeviceTypeForReload();
98     bool IsVoipDeviceChanged(const AudioDeviceDescriptor &inputDevcie, const AudioDeviceDescriptor &outputDevice);
99 
100     std::string GetEnhancePropByName(const AudioEnhancePropertyArray &propertyArray, const std::string &propName);
101     std::string GetEnhancePropByNameV3(const AudioEffectPropertyArrayV3 &oldPropertyArray, const std::string &propName);
102 private:
103     IAudioPolicyInterface& audioPolicyManager_;
104     AudioRouterCenter& audioRouterCenter_;
105     AudioIOHandleMap& audioIOHandleMap_;
106     AudioActiveDevice& audioActiveDevice_;
107     AudioConfigManager& audioConfigManager_;
108     AudioConnectedDevice& audioConnectedDevice_;
109     AudioEcManager& audioEcManager_;
110     AudioDeviceCommon& audioDeviceCommon_;
111     AudioVolumeManager& audioVolumeManager_;
112 
113     std::atomic<bool> isPolicyConfigParsered_ = false;
114     std::mutex onCapturerSessionChangedMutex_;
115     std::unordered_map<uint32_t, SessionInfo> sessionWithNormalSourceType_;
116     std::unordered_set<uint32_t> sessionIdisRemovedSet_;
117     // sourceType is SOURCE_TYPE_PLAYBACK_CAPTURE, SOURCE_TYPE_WAKEUP or SOURCE_TYPE_VIRTUAL_CAPTURE
118     std::unordered_map<uint32_t, SessionInfo> sessionWithSpecialSourceType_;
119     uint64_t sessionIdUsedToOpenSource_ = 0;
120 
121     std::mutex inputDeviceReloadMutex_;
122     AudioDeviceDescriptor inputDeviceForReload_;
123     std::shared_ptr<AudioA2dpOffloadManager> audioA2dpOffloadManager_ = nullptr;
124 };
125 
126 }
127 }
128 
129 #endif