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