• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright (c) 2021-2025 Huawei Device Co., Ltd.
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ST_AUDIO_RECOVERY_DEVICE_H
18 #define ST_AUDIO_RECOVERY_DEVICE_H
19 
20 #include <bitset>
21 #include <list>
22 #include <string>
23 #include <unordered_map>
24 #include <unordered_set>
25 #include <mutex>
26 #include "audio_device_info.h"
27 #include "audio_stream_collector.h"
28 #include "audio_device_manager.h"
29 #include "audio_affinity_manager.h"
30 #include "media_monitor_manager.h"
31 
32 #include "audio_connected_device.h"
33 #include "audio_router_map.h"
34 #include "audio_device_common.h"
35 #include "audio_active_device.h"
36 #include "audio_scene_manager.h"
37 #include "audio_a2dp_offload_manager.h"
38 #include "audio_capturer_session.h"
39 #include "audio_state_manager.h"
40 
41 namespace OHOS {
42 namespace AudioStandard {
43 class AudioRecoveryDevice {
44 public:
GetInstance()45     static AudioRecoveryDevice& GetInstance()
46     {
47         static AudioRecoveryDevice instance;
48         return instance;
49     }
50     void Init(std::shared_ptr<AudioA2dpOffloadManager> audioA2dpOffloadManager);
51     void DeInit();
52     void RecoveryPreferredDevices();
53     void RecoverExcludedOutputDevices();
54 
55     int32_t SelectOutputDevice(sptr<AudioRendererFilter> audioRendererFilter,
56         std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors);
57     int32_t SelectInputDevice(sptr<AudioCapturerFilter> audioCapturerFilter,
58         std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors);
59     int32_t ExcludeOutputDevices(AudioDeviceUsage audioDevUsage,
60         std::vector<std::shared_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors);
61     int32_t UnexcludeOutputDevices(AudioDeviceUsage audioDevUsage,
62         std::vector<std::shared_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors);
63     int32_t UnexcludeOutputDevicesInner(AudioDeviceUsage audioDevUsage,
64         std::vector<std::shared_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors);
65 private:
AudioRecoveryDevice()66     AudioRecoveryDevice() : streamCollector_(AudioStreamCollector::GetAudioStreamCollector()),
67         audioDeviceManager_(AudioDeviceManager::GetAudioDeviceManager()),
68         audioAffinityManager_(AudioAffinityManager::GetAudioAffinityManager()),
69         audioActiveDevice_(AudioActiveDevice::GetInstance()),
70         audioSceneManager_(AudioSceneManager::GetInstance()),
71         audioRouteMap_(AudioRouteMap::GetInstance()),
72         audioConnectedDevice_(AudioConnectedDevice::GetInstance()),
73         audioDeviceCommon_(AudioDeviceCommon::GetInstance()),
74         audioCapturerSession_(AudioCapturerSession::GetInstance()),
75         audioStateManager_(AudioStateManager::GetAudioStateManager()) {}
~AudioRecoveryDevice()76     ~AudioRecoveryDevice() {}
77     int32_t HandleRecoveryPreferredDevices(int32_t preferredType, int32_t deviceType,
78         int32_t usageOrSourceType);
79     int32_t HandleExcludedOutputDevicesRecovery(AudioDeviceUsage audioDevUsage,
80         std::vector<std::shared_ptr<Media::MediaMonitor::MonitorDeviceInfo>> &excludedDevices);
81 
82     // selectoutputdevice
83     int32_t SelectOutputDeviceForFastInner(sptr<AudioRendererFilter> audioRendererFilter,
84         std::vector<std::shared_ptr<AudioDeviceDescriptor>> selectedDesc);
85     int32_t SetRenderDeviceForUsage(StreamUsage streamUsage, std::shared_ptr<AudioDeviceDescriptor> desc);
86     int32_t ConnectVirtualDevice(std::shared_ptr<AudioDeviceDescriptor> &desc);
87     void HandleFetchDeviceChange(const AudioStreamDeviceChangeReason &reason, const std::string &caller);
88     void WriteSelectOutputSysEvents(const std::vector<std::shared_ptr<AudioDeviceDescriptor>> &selectedDesc,
89         StreamUsage strUsage);
90     int32_t SelectFastOutputDevice(sptr<AudioRendererFilter> audioRendererFilter,
91         std::shared_ptr<AudioDeviceDescriptor> deviceDescriptor);
92     int32_t SelectOutputDeviceByFilterInner(sptr<AudioRendererFilter> audioRendererFilter,
93         std::vector<std::shared_ptr<AudioDeviceDescriptor>> selectedDesc);
94     void SetDeviceEnableAndUsage(const std::shared_ptr<AudioDeviceDescriptor> &deviceDesc);
95 
96     // selectinputdevice
97     void SetCaptureDeviceForUsage(AudioScene scene, SourceType srcType, std::shared_ptr<AudioDeviceDescriptor> desc);
98     int32_t SelectFastInputDevice(sptr<AudioCapturerFilter> audioCapturerFilter,
99         std::shared_ptr<AudioDeviceDescriptor> deviceDescriptor);
100     void WriteSelectInputSysEvents(const std::vector<std::shared_ptr<AudioDeviceDescriptor>> &selectedDesc,
101         SourceType srcType, AudioScene scene);
102 
103     void WriteExcludeOutputSysEvents(AudioDeviceUsage audioDevUsage,
104         const std::shared_ptr<AudioDeviceDescriptor> &desc);
105     void WriteUnexcludeOutputSysEvents(AudioDeviceUsage audioDevUsage,
106         const std::shared_ptr<AudioDeviceDescriptor> &desc);
107 private:
108     AudioStreamCollector& streamCollector_;
109     AudioDeviceManager &audioDeviceManager_;
110     AudioAffinityManager &audioAffinityManager_;
111     AudioActiveDevice& audioActiveDevice_;
112     AudioSceneManager& audioSceneManager_;
113     AudioRouteMap& audioRouteMap_;
114     AudioConnectedDevice& audioConnectedDevice_;
115     AudioDeviceCommon& audioDeviceCommon_;
116     AudioCapturerSession& audioCapturerSession_;
117     AudioStateManager &audioStateManager_;
118     std::shared_ptr<AudioA2dpOffloadManager> audioA2dpOffloadManager_ = nullptr;
119 };
120 }
121 }
122 #endif