• 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_policy_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 #include "audio_service_enum.h"
44 
45 namespace OHOS {
46 namespace AudioStandard {
47 
48 class AudioCapturerSession {
49 public:
GetInstance()50     static AudioCapturerSession& GetInstance()
51     {
52         static AudioCapturerSession instance;
53         return instance;
54     }
55     void Init(std::shared_ptr<AudioA2dpOffloadManager> audioA2dpOffloadManager);
56     void DeInit();
57     void SetConfigParserFlag();
58     int32_t OnCapturerSessionAdded(uint64_t sessionID, SessionInfo sessionInfo, AudioStreamInfo streamInfo);
59     void OnCapturerSessionRemoved(uint64_t sessionID);
60 
61     int32_t SetWakeUpAudioCapturerFromAudioServer(const AudioProcessConfig &config);
62     int32_t CloseWakeUpAudioCapturer();
63 
64     void ReloadSourceForDeviceChange(const AudioDeviceDescriptor &inputDevice,
65         const AudioDeviceDescriptor &outputDevice, const std::string &caller);
66     void ReloadSourceForEffect(const AudioEffectPropertyArrayV3 &oldPropertyArray,
67         const AudioEffectPropertyArrayV3 &newPropertyArray);
68     void ReloadSourceForEffect(const AudioEnhancePropertyArray &oldPropertyArray,
69         const AudioEnhancePropertyArray &newPropertyArray);
70     CapturerState GetCapturerState();
71     int32_t ReloadCaptureSession(uint32_t sessionId, SessionOperation operation);
72     int32_t ReloadCaptureSessionSoftLink();
73 private:
AudioCapturerSession()74     AudioCapturerSession() : audioPolicyManager_(AudioPolicyManagerFactory::GetAudioPolicyManager()),
75         audioRouterCenter_(AudioRouterCenter::GetAudioRouterCenter()),
76         audioIOHandleMap_(AudioIOHandleMap::GetInstance()),
77         audioActiveDevice_(AudioActiveDevice::GetInstance()),
78         audioConfigManager_(AudioPolicyConfigManager::GetInstance()),
79         audioConnectedDevice_(AudioConnectedDevice::GetInstance()),
80         audioEcManager_(AudioEcManager::GetInstance()),
81         audioDeviceCommon_(AudioDeviceCommon::GetInstance()),
82         audioVolumeManager_(AudioVolumeManager::GetInstance())
83     {
84         inputDeviceForReload_.deviceType_ = DEVICE_TYPE_DEFAULT;
85     }
~AudioCapturerSession()86     ~AudioCapturerSession() {}
87 
88     void HandleRemoteCastDevice(bool isConnected, AudioStreamInfo streamInfo = {});
89 
90     void LoadInnerCapturerSink(std::string moduleName, AudioStreamInfo streamInfo);
91     void UnloadInnerCapturerSink(std::string moduleName);
92 
93     bool ConstructWakeupAudioModuleInfo(const AudioStreamInfo &streamInfo,
94         AudioModuleInfo &audioModuleInfo);
95     bool FillWakeupStreamPropInfo(const AudioStreamInfo &streamInfo, std::shared_ptr<AdapterPipeInfo> pipeInfo,
96         AudioModuleInfo &audioModuleInfo);
97     int32_t SetWakeUpAudioCapturer(InternalAudioCapturerOptions options);
98 
99     void SetInputDeviceTypeForReload(const AudioDeviceDescriptor &inputDevice);
100     const AudioDeviceDescriptor& GetInputDeviceTypeForReload();
101     bool IsVoipDeviceChanged(const AudioDeviceDescriptor &inputDevcie, const AudioDeviceDescriptor &outputDevice);
102     bool FindRunningNormalSession(uint32_t sessionId, AudioCapturerChangeInfo &runingSessionInfo);
103 
104     std::string GetEnhancePropByName(const AudioEnhancePropertyArray &propertyArray, const std::string &propName);
105     std::string GetEnhancePropByNameV3(const AudioEffectPropertyArrayV3 &oldPropertyArray, const std::string &propName);
106 private:
107     IAudioPolicyInterface& audioPolicyManager_;
108     AudioRouterCenter& audioRouterCenter_;
109     AudioIOHandleMap& audioIOHandleMap_;
110     AudioActiveDevice& audioActiveDevice_;
111     AudioPolicyConfigManager& audioConfigManager_;
112     AudioConnectedDevice& audioConnectedDevice_;
113     AudioEcManager& audioEcManager_;
114     AudioDeviceCommon& audioDeviceCommon_;
115     AudioVolumeManager& audioVolumeManager_;
116 
117     std::atomic<bool> isPolicyConfigParsered_ = false;
118     std::mutex onCapturerSessionChangedMutex_;
119     std::unordered_map<uint32_t, SessionInfo> sessionWithNormalSourceType_;
120     std::unordered_set<uint32_t> sessionIdisRemovedSet_;
121     // sourceType is SOURCE_TYPE_PLAYBACK_CAPTURE, SOURCE_TYPE_WAKEUP or SOURCE_TYPE_VIRTUAL_CAPTURE
122     std::unordered_map<uint32_t, SessionInfo> sessionWithSpecialSourceType_;
123 
124     std::mutex inputDeviceReloadMutex_;
125     AudioDeviceDescriptor inputDeviceForReload_;
126     std::shared_ptr<AudioA2dpOffloadManager> audioA2dpOffloadManager_ = nullptr;
127 };
128 
129 }
130 }
131 
132 #endif
133