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