1 /*
2  * Copyright (c) 2022-2024 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 AUDIO_STREAM_COLLECTOR_H
17 #define AUDIO_STREAM_COLLECTOR_H
18 
19 #include "audio_info.h"
20 #include "audio_policy_client.h"
21 #include "audio_system_manager.h"
22 #include "audio_policy_server_handler.h"
23 #include "audio_concurrency_service.h"
24 
25 namespace OHOS {
26 namespace AudioStandard {
27 
28 class AudioStreamCollector {
29 public:
GetAudioStreamCollector()30     static AudioStreamCollector& GetAudioStreamCollector()
31     {
32         static AudioStreamCollector audioStreamCollector;
33         return audioStreamCollector;
34     }
35 
36     AudioStreamCollector();
37     ~AudioStreamCollector();
38 
39     void AddAudioPolicyClientProxyMap(int32_t clientPid, const sptr<IAudioPolicyClient>& cb);
40     void ReduceAudioPolicyClientProxyMap(pid_t clientPid);
41     int32_t RegisterTracker(AudioMode &mode, AudioStreamChangeInfo &streamChangeInfo,
42         const sptr<IRemoteObject> &object);
43     int32_t UpdateTracker(AudioMode &mode, AudioStreamChangeInfo &streamChangeInfo);
44     int32_t UpdateTracker(const AudioMode &mode, DeviceInfo &deviceInfo);
45     int32_t UpdateTrackerInternal(AudioMode &mode, AudioStreamChangeInfo &streamChangeInfo);
46     AudioStreamType GetStreamType(ContentType contentType, StreamUsage streamUsage);
47     int32_t UpdateRendererDeviceInfo(int32_t clientUID, int32_t sessionId, DeviceInfo &outputDeviceInfo);
48     int32_t UpdateRendererPipeInfo(const int32_t sessionId, const AudioPipeType pipeType);
49     int32_t UpdateCapturerDeviceInfo(int32_t clientUID, int32_t sessionId, DeviceInfo &inputDeviceInfo);
50     int32_t GetCurrentRendererChangeInfos(std::vector<std::unique_ptr<AudioRendererChangeInfo>> &rendererChangeInfos);
51     int32_t GetCurrentCapturerChangeInfos(std::vector<std::unique_ptr<AudioCapturerChangeInfo>> &capturerChangeInfos);
52     void RegisteredTrackerClientDied(int32_t uid);
53     int32_t UpdateStreamState(int32_t clientUid, StreamSetStateEventInternal &streamSetStateEventInternal);
54     bool IsStreamActive(AudioStreamType volumeType);
55     int32_t GetRunningStream(AudioStreamType certainType = STREAM_DEFAULT, int32_t certainChannelCount = 0);
56     int32_t SetLowPowerVolume(int32_t streamId, float volume);
57     float GetLowPowerVolume(int32_t streamId);
58     int32_t SetOffloadMode(int32_t streamId, int32_t state, bool isAppBack);
59     int32_t UnsetOffloadMode(int32_t streamId);
60     bool IsOffloadAllowed(const int32_t sessionId);
61     float GetSingleStreamVolume(int32_t streamId);
62     bool GetAndCompareStreamType(StreamUsage targetUsage, AudioRendererInfo rendererInfo);
63     int32_t UpdateCapturerInfoMuteStatus(int32_t uid, bool muteStatus);
64     AudioStreamType GetStreamType(int32_t sessionId);
65     int32_t GetChannelCount(int32_t sessionId);
66     int32_t GetUid(int32_t sessionId);
67     void GetRendererStreamInfo(AudioStreamChangeInfo &streamChangeInfo, AudioRendererChangeInfo &rendererInfo);
68     void GetCapturerStreamInfo(AudioStreamChangeInfo &streamChangeInfo, AudioCapturerChangeInfo &capturerInfo);
69     int32_t GetPipeType(const int32_t sessionId, AudioPipeType &pipeType);
70     bool ExistStreamForPipe(AudioPipeType pipeType);
71     int32_t GetRendererDeviceInfo(const int32_t sessionId, DeviceInfo &outputDeviceInfo);
72 
73     int32_t SetAudioConcurrencyCallback(const uint32_t sessionID, const sptr<IRemoteObject> &object);
74     int32_t UnsetAudioConcurrencyCallback(const uint32_t sessionID);
75     int32_t ActivateAudioConcurrency(const AudioPipeType &pipeType);
76     void ResetRendererStreamDeviceInfo(const AudioDeviceDescriptor& updatedDesc);
77     void ResetCapturerStreamDeviceInfo(const AudioDeviceDescriptor& updatedDesc);
78     StreamUsage GetRunningStreamUsageNoUltrasonic();
79     SourceType GetRunningSourceTypeNoUltrasonic();
80     StreamUsage GetLastestRunningCallStreamUsage();
81     std::vector<uint32_t> GetAllRendererSessionIDForUID(int32_t uid);
82     bool HasVoipRendererStream();
83     bool ChangeVoipCapturerStreamToNormal();
84     bool IsCallStreamUsage(StreamUsage usage);
85     std::set<int32_t> GetSessionIdsOnRemoteDeviceByStreamUsage(StreamUsage streamUsage);
86     std::set<int32_t> GetSessionIdsOnRemoteDeviceBySourceType(SourceType sourceType);
87     std::set<int32_t> GetSessionIdsOnRemoteDeviceByDeviceType(DeviceType deviceType);
88     int32_t GetSessionIdsPauseOnRemoteDeviceByRemote(InterruptHint hintType);
89     bool HasRunningRendererStream();
90     bool HasRunningRecognitionCapturerStream();
91 
92 private:
93     std::mutex streamsInfoMutex_;
94     std::map<std::pair<int32_t, int32_t>, int32_t> rendererStatequeue_;
95     std::map<std::pair<int32_t, int32_t>, int32_t> capturerStatequeue_;
96     std::vector<std::unique_ptr<AudioRendererChangeInfo>> audioRendererChangeInfos_;
97     std::vector<std::unique_ptr<AudioCapturerChangeInfo>> audioCapturerChangeInfos_;
98     std::unordered_map<int32_t, std::shared_ptr<AudioClientTracker>> clientTracker_;
99     static const std::map<std::pair<ContentType, StreamUsage>, AudioStreamType> streamTypeMap_;
100     static std::map<std::pair<ContentType, StreamUsage>, AudioStreamType> CreateStreamMap();
101     int32_t AddRendererStream(AudioStreamChangeInfo &streamChangeInfo);
102     int32_t AddCapturerStream(AudioStreamChangeInfo &streamChangeInfo);
103     int32_t CheckRendererUpdataState(AudioStreamChangeInfo &streamChangeInfo);
104     int32_t UpdateRendererStream(AudioStreamChangeInfo &streamChangeInfo);
105     int32_t UpdateCapturerStream(AudioStreamChangeInfo &streamChangeInfo);
106     int32_t UpdateRendererDeviceInfo(DeviceInfo &outputDeviceInfo);
107     int32_t UpdateCapturerDeviceInfo(DeviceInfo &inputDeviceInfo);
108     int32_t UpdateRendererStreamInternal(AudioStreamChangeInfo &streamChangeInfo);
109     AudioStreamType GetVolumeTypeFromContentUsage(ContentType contentType, StreamUsage streamUsage);
110     AudioStreamType GetStreamTypeFromSourceType(SourceType sourceType);
111     void WriterStreamChangeSysEvent(AudioMode &mode, AudioStreamChangeInfo &streamChangeInfo);
112     void WriterRenderStreamChangeSysEvent(AudioStreamChangeInfo &streamChangeInfo);
113     void WriterCaptureStreamChangeSysEvent(AudioStreamChangeInfo &streamChangeInfo);
114     void WriteRenderStreamReleaseSysEvent(const std::unique_ptr<AudioRendererChangeInfo> &audioRendererChangeInfo);
115     void WriteCaptureStreamReleaseSysEvent(const std::unique_ptr<AudioCapturerChangeInfo> &audioCapturerChangeInfo);
116     void SetRendererStreamParam(AudioStreamChangeInfo &streamChangeInfo,
117         std::unique_ptr<AudioRendererChangeInfo> &rendererChangeInfo);
118     void SetCapturerStreamParam(AudioStreamChangeInfo &streamChangeInfo,
119         std::unique_ptr<AudioCapturerChangeInfo> &capturerChangeInfo);
120     void RegisteredRendererTrackerClientDied(const int32_t uid);
121     void RegisteredCapturerTrackerClientDied(const int32_t uid);
122     bool CheckRendererStateInfoChanged(AudioStreamChangeInfo &streamChangeInfo);
123     bool CheckRendererInfoChanged(AudioStreamChangeInfo &streamChangeInfo);
124     AudioSystemManager *audioSystemMgr_;
125     std::shared_ptr<AudioPolicyServerHandler> audioPolicyServerHandler_;
126     std::shared_ptr<AudioConcurrencyService> audioConcurrencyService_;
127 };
128 } // namespace AudioStandard
129 } // namespace OHOS
130 #endif
131