• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 
16 #ifndef ST_AUDIO_ZONE_SERVICE_H
17 #define ST_AUDIO_ZONE_SERVICE_H
18 
19 #include <unordered_map>
20 #include <memory>
21 #include "audio_interrupt_service.h"
22 #include "istandard_audio_zone_client.h"
23 #include "audio_policy_server_handler.h"
24 
25 namespace OHOS {
26 namespace AudioStandard {
27 class AudioZone;
28 class AudioZoneClientManager;
29 
30 class AudioZoneService {
31 public:
32     static AudioZoneService &GetInstance();
33 
34     void Init(std::shared_ptr<AudioPolicyServerHandler> handler,
35         std::shared_ptr<AudioInterruptService> interruptService);
36     void DeInit();
37 
38     int32_t CreateAudioZone(const std::string &name, const AudioZoneContext &context, pid_t clientPid);
39     void ReleaseAudioZone(int32_t zoneId);
40     const std::vector<std::shared_ptr<AudioZoneDescriptor>> GetAllAudioZone();
41     const std::shared_ptr<AudioZoneDescriptor> GetAudioZone(int32_t zoneId);
42     int32_t GetAudioZoneByName(std::string name);
43 
44     int32_t BindDeviceToAudioZone(int32_t zoneId,
45         std::vector<std::shared_ptr<AudioDeviceDescriptor>> devices);
46     int32_t UnBindDeviceToAudioZone(int32_t zoneId,
47         std::vector<std::shared_ptr<AudioDeviceDescriptor>> devices);
48     void MoveDeviceToGlobalFromZones(std::shared_ptr<AudioDeviceDescriptor> device);
49     int32_t UpdateDeviceFromGlobalForAllZone(std::shared_ptr<AudioDeviceDescriptor> device);
50 
51     int32_t RegisterAudioZoneClient(pid_t clientPid, sptr<IStandardAudioZoneClient> client);
52     void UnRegisterAudioZoneClient(pid_t clientPid);
53     int32_t EnableAudioZoneReport(pid_t clientPid, bool enable);
54     int32_t EnableAudioZoneChangeReport(pid_t clientPid, int32_t zoneId, bool enable);
55 
56     int32_t AddUidToAudioZone(int32_t zoneId, int32_t uid);
57     int32_t RemoveUidFromAudioZone(int32_t zoneId, int32_t uid);
58     int32_t AddStreamToAudioZone(int32_t zoneId, AudioZoneStream stream);
59     int32_t AddStreamsToAudioZone(int32_t zoneId, std::vector<AudioZoneStream> streams);
60     int32_t RemoveStreamFromAudioZone(int32_t zoneId, AudioZoneStream stream);
61     int32_t RemoveStreamsFromAudioZone(int32_t zoneId, std::vector<AudioZoneStream> streams);
62     void SetZoneDeviceVisible(bool visible);
63     bool IsZoneDeviceVisible();
64     int32_t FindAudioZoneByUid(int32_t uid);
65     int32_t FindAudioZone(int32_t uid, StreamUsage usage);
66 
67     int32_t EnableSystemVolumeProxy(pid_t clientPid, int32_t zoneId, bool enable);
68     bool IsSystemVolumeProxyEnable(int32_t zoneId);
69     int32_t SetSystemVolumeLevel(int32_t zoneId, AudioVolumeType volumeType, int32_t volumeLevel, int32_t volumeFlag);
70     int32_t GetSystemVolumeLevel(int32_t zoneId, AudioVolumeType volumeType);
71 
72     std::list<std::pair<AudioInterrupt, AudioFocuState>> GetAudioInterruptForZone(int32_t zoneId);
73     std::list<std::pair<AudioInterrupt, AudioFocuState>> GetAudioInterruptForZone(int32_t zoneId,
74         const std::string &deviceTag);
75     int32_t EnableAudioZoneInterruptReport(pid_t clientPid, int32_t zoneId,
76         const std::string &deviceTag, bool enable);
77 
78     int32_t ActivateAudioInterrupt(int32_t zoneId, const AudioInterrupt &audioInterrupt,
79         bool isUpdatedAudioStrategy = false);
80     int32_t DeactivateAudioInterrupt(int32_t zoneId, const AudioInterrupt &audioInterrupt);
81     int32_t InjectInterruptToAudioZone(int32_t zoneId,
82         const std::list<std::pair<AudioInterrupt, AudioFocuState>> &interrupts);
83     int32_t InjectInterruptToAudioZone(int32_t zoneId, const std::string &deviceTag,
84         const std::list<std::pair<AudioInterrupt, AudioFocuState>> &interrupts);
85 
86     std::vector<std::shared_ptr<AudioDeviceDescriptor>> FetchOutputDevices(int32_t zoneId,
87         StreamUsage streamUsage, int32_t clientUid, const RouterType &bypassType);
88     std::shared_ptr<AudioDeviceDescriptor> FetchInputDevice(int32_t zoneId,
89        SourceType sourceType, int32_t clientUid);
90 
91     const std::string GetZoneStringDescriptor(int32_t zoneId);
92     int32_t ClearAudioFocusBySessionID(const int32_t &sessionID);
93     bool CheckZoneExist(int32_t zoneId);
94     int32_t FindAudioSessionZoneid(int32_t callerUid, int32_t callerPid, bool isActivate);
95 
96     void ReleaseAudioZoneByClientPid(pid_t clientPid);
97 
98 private:
99     AudioZoneService() = default;
100     ~AudioZoneService() = default;
101 
102     std::shared_ptr<AudioInterruptService> interruptService_;
103     std::shared_ptr<AudioZoneClientManager> zoneClientManager_;
104     std::unordered_map<int32_t, std::shared_ptr<AudioZone>> zoneMaps_;
105     std::set<pid_t> zoneReportClientList_;
106     std::mutex zoneMutex_;
107     bool zoneDeviceVisible_ = true;
108 
109     std::shared_ptr<AudioZone> FindZone(int32_t zoneId);
110     int32_t AddKeyToAudioZone(int32_t zoneId, int32_t uid, const std::string &deviceTag,
111         const std::string &streamTag, const StreamUsage &usage);
112     int32_t RemoveKeyFromAudioZone(int32_t zoneId, int32_t uid, const std::string &deviceTag,
113         const std::string &streamTag, const StreamUsage &usage);
114     int32_t FindAudioZoneByKey(int32_t uid, const std::string &deviceTag, const std::string &streamTag,
115         const StreamUsage &usage);
116     bool CheckIsZoneValid(int32_t zoneId);
117     void RemoveDeviceFromGlobal(std::shared_ptr<AudioDeviceDescriptor> device);
118 };
119 } // namespace AudioStandard
120 } // namespace OHOS
121 
122 #endif // ST_AUDIO_ZONE_SERVICE_H