• 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 #ifndef LOG_TAG
16 #define LOG_TAG "AudioInterruptService"
17 #endif
18 
19 #include "audio_interrupt_service.h"
20 
21 #include "audio_focus_parser.h"
22 #include "audio_policy_manager_listener_proxy.h"
23 #include "media_monitor_manager.h"
24 
25 #include "dfx_utils.h"
26 #include "app_mgr_client.h"
27 #include "dfx_msg_manager.h"
28 
29 namespace OHOS {
30 namespace AudioStandard {
AudioInterruptZoneDump(std::string & dumpString)31 void AudioInterruptService::AudioInterruptZoneDump(std::string &dumpString)
32 {
33     std::unordered_map<int32_t, std::shared_ptr<AudioInterruptZone>> audioInterruptZonesMapDump;
34     AddDumpInfo(audioInterruptZonesMapDump);
35     dumpString += "\nAudioInterrupt Zone:\n";
36     AppendFormat(dumpString, "- %zu AudioInterruptZoneDump (s) available:\n",
37         zonesMap_.size());
38     for (const auto&[zoneID, audioInterruptZoneDump] : audioInterruptZonesMapDump) {
39         if (zoneID < 0) {
40             continue;
41         }
42         AppendFormat(dumpString, "  - Zone ID: %d\n", zoneID);
43         AppendFormat(dumpString, "  - Pids size: %zu\n", audioInterruptZoneDump->pids.size());
44         for (auto pid : audioInterruptZoneDump->pids) {
45             AppendFormat(dumpString, "    - pid: %d\n", pid);
46         }
47 
48         AppendFormat(dumpString, "  - Interrupt callback size: %zu\n",
49             audioInterruptZoneDump->interruptCbStreamIdsMap.size());
50         AppendFormat(dumpString, "    - The streamIds as follow:\n");
51         for (auto streamId : audioInterruptZoneDump->interruptCbStreamIdsMap) {
52             AppendFormat(dumpString, "      - StreamId: %u -- have interrupt callback.\n", streamId);
53         }
54 
55         AppendFormat(dumpString, "  - Audio policy client proxy callback size: %zu\n",
56             audioInterruptZoneDump->audioPolicyClientProxyCBClientPidMap.size());
57         AppendFormat(dumpString, "    - The clientPids as follow:\n");
58         for (auto pid : audioInterruptZoneDump->audioPolicyClientProxyCBClientPidMap) {
59             AppendFormat(dumpString, "      - ClientPid: %d -- have audiopolicy client proxy callback.\n", pid);
60         }
61 
62         std::list<std::pair<AudioInterrupt, AudioFocuState>> audioFocusInfoList
63             = audioInterruptZoneDump->audioFocusInfoList;
64         AppendFormat(dumpString, "  - %zu Audio Focus Info (s) available:\n", audioFocusInfoList.size());
65         uint32_t invalidStreamId = static_cast<uint32_t>(-1);
66         for (auto iter = audioFocusInfoList.begin(); iter != audioFocusInfoList.end(); ++iter) {
67             if ((iter->first).streamId == invalidStreamId) {
68                 continue;
69             }
70             AppendFormat(dumpString, "    - Pid: %d\n", (iter->first).pid);
71             AppendFormat(dumpString, "    - StreamId: %u\n", (iter->first).streamId);
72             AppendFormat(dumpString, "    - Audio Focus isPlay Id: %d\n", (iter->first).audioFocusType.isPlay);
73             AppendFormat(dumpString, "    - Stream Name: %s\n",
74                 AudioInfoDumpUtils::GetStreamName((iter->first).audioFocusType.streamType).c_str());
75             AppendFormat(dumpString, "    - Source Name: %s\n",
76                 AudioInfoDumpUtils::GetSourceName((iter->first).audioFocusType.sourceType).c_str());
77             AppendFormat(dumpString, "    - Audio Focus State: %d\n", iter->second);
78             dumpString += "\n";
79         }
80         dumpString += "\n";
81     }
82     return;
83 }
84 
AudioSessionInfoDump(std::string & dumpString)85 void AudioInterruptService::AudioSessionInfoDump(std::string &dumpString)
86 {
87     AppendFormat(dumpString, "    - The AudioSession as follow:\n");
88     if (sessionService_ == nullptr) {
89         AppendFormat(dumpString, "    - The AudioSessionService is null.\n");
90         return;
91     }
92     sessionService_->AudioSessionInfoDump(dumpString);
93 }
94 
95 // AudioInterruptDeathRecipient impl begin
AudioInterruptDeathRecipient(const std::shared_ptr<AudioInterruptService> & service,uint32_t streamId)96 AudioInterruptService::AudioInterruptDeathRecipient::AudioInterruptDeathRecipient(
97     const std::shared_ptr<AudioInterruptService> &service,
98     uint32_t streamId)
99     : service_(service), streamId_(streamId)
100 {
101 }
102 
OnRemoteDied(const wptr<IRemoteObject> & remote)103 void AudioInterruptService::AudioInterruptDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
104 {
105     std::shared_ptr<AudioInterruptService> service = service_.lock();
106     if (service != nullptr) {
107         service->RemoveClient(ZONEID_DEFAULT, streamId_);
108     }
109 }
110 
111 // AudioInterruptClient impl begin
AudioInterruptClient(const std::shared_ptr<AudioInterruptCallback> & callback,const sptr<IRemoteObject> & object,const sptr<AudioInterruptDeathRecipient> & deathRecipient)112 AudioInterruptService::AudioInterruptClient::AudioInterruptClient(
113     const std::shared_ptr<AudioInterruptCallback> &callback,
114     const sptr<IRemoteObject> &object,
115     const sptr<AudioInterruptDeathRecipient> &deathRecipient)
116     : callback_(callback), object_(object), deathRecipient_(deathRecipient)
117 {
118 }
119 
~AudioInterruptClient()120 AudioInterruptService::AudioInterruptClient::~AudioInterruptClient()
121 {
122     if (object_ != nullptr) {
123         object_->RemoveDeathRecipient(deathRecipient_);
124     }
125 }
126 
OnInterrupt(const InterruptEventInternal & interruptEvent)127 void AudioInterruptService::AudioInterruptClient::OnInterrupt(const InterruptEventInternal &interruptEvent)
128 {
129     if (callback_ != nullptr) {
130         callback_->OnInterrupt(interruptEvent);
131     }
132 }
133 
SetCallingUid(uint32_t uid)134 void AudioInterruptService::AudioInterruptClient::SetCallingUid(uint32_t uid)
135 {
136     AUDIO_INFO_LOG("uid: %{public}u", uid);
137     callingUid_ = uid;
138 }
139 
GetCallingUid()140 uint32_t AudioInterruptService::AudioInterruptClient::GetCallingUid()
141 {
142     AUDIO_INFO_LOG("callingUid_: %{public}u", callingUid_);
143     return callingUid_;
144 }
145 
146 }
147 } // namespace OHOS
148