1 /*
2  * Copyright (C) 2021-2022 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 #include "a2dp_state_machine.h"
17 #include "a2dp_codec_thread.h"
18 #include "a2dp_service.h"
19 #include "a2dp_sink.h"
20 #include "compat.h"
21 #include "log.h"
22 #include "power_manager.h"
23 #include "securec.h"
24 
25 namespace OHOS {
26 namespace bluetooth {
27 std::recursive_mutex g_stateMutex {};
Entry()28 void A2dpStateIdle::Entry()
29 {
30     A2dpCodecThread *codecThread = A2dpCodecThread::GetInstance();
31     if (codecThread->GetInitStatus()) {
32         codecThread->StopA2dpCodecThread();
33         delete codecThread;
34     }
35 }
36 
Dispatch(const utility::Message & msg)37 bool A2dpStateIdle::Dispatch(const utility::Message &msg)
38 {
39     if (msg.arg2_ == nullptr) {
40         LOG_ERROR("[A2dpStateIdle]%{public}s input error parameter\n", __func__);
41         return false;
42     }
43     uint8_t label = 0;
44     A2dpAvdtMsgData msgData = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->a2dpMsg;
45     uint8_t role = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->role;
46     A2dpAvdtp avdtp(role);
47     switch (msg.what_) {
48         case EVT_CONNECT_REQ:
49             avdtp.ConnectReq(msgData.connectInfo.addr);
50             break;
51         case EVT_DISCOVER_REQ:
52             ProcessDiscoverReq(msgData.connectInfo.addr, role, msgData.connectInfo.errCode);
53             break;
54         case EVT_GET_ALLCAP_REQ:
55             avdtp.GetAllCapabilityReq(msgData.stream.addr, msgData.stream.acpSeid, label);
56             break;
57         case EVT_GET_CAP_REQ:
58             avdtp.GetCapabilityReq(msgData.stream.addr, msgData.stream.acpSeid, label);
59             break;
60         case EVT_SETCONFIG_REQ:
61             ProcessSetConfigReq(msgData, role);
62             break;
63         case EVT_DISCONNECT_REQ:
64             ProcessDisconnectReq(msgData.connectInfo.addr, role);
65             break;
66         case EVT_SDP_CFM:
67             ProcessSDPFailure(msgData.stream.addr, role);
68             break;
69         case EVT_SETCONFIG_IND:
70             ProcessSetConfigInd(msgData, role);
71             break;
72         case EVT_DISCONNECT_IND:
73             ProcessDisconnectInd(msgData.stream.addr, msgData.stream.handle, role);
74             break;
75         case EVT_DISCONNECT_CFM:
76             ProcessDisconnectCfm(msgData.stream.addr, msgData.stream.handle, role);
77             break;
78         case EVT_TIME_OUT:
79             ProcessTimeout(msgData.stream.addr, role);
80             break;
81         default:
82             break;
83     }
84     return true;
85 }
86 
ProcessDisconnectCfm(BtAddr addr,uint16_t handle,uint8_t role) const87 void A2dpStateIdle::ProcessDisconnectCfm(BtAddr addr, uint16_t handle, uint8_t role) const
88 {
89     LOG_INFO("[A2dpStateIdle]%{public}s\n", __func__);
90 
91     CallbackParameter param = {A2DP_ROLE_INT, true, handle};
92     A2dpProfile *profile = GetProfileInstance(role);
93     if (profile == nullptr) {
94         LOG_ERROR("[A2dpStateIdle]%{public}s Failed to get profile instance\n", __func__);
95         return;
96     }
97 
98     if (role == A2DP_ROLE_SOURCE) {
99         IPowerManager::GetInstance().StatusUpdate(
100             RequestStatus::CONNECT_OFF, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
101     }
102 
103     profile->ConnectStateChangedNotify(addr, STREAM_DISCONNECT, (void *)&param);
104 }
105 
SetStateName(std::string state)106 void A2dpStateIdle::SetStateName(std::string state)
107 {
108     std::lock_guard<std::recursive_mutex> lock(g_stateMutex);
109     Transition(state);
110 }
111 
ProcessDisconnectReq(BtAddr addr,uint8_t role)112 void A2dpStateIdle::ProcessDisconnectReq(BtAddr addr, uint8_t role)
113 {
114     LOG_INFO("[A2dpStateIdle]%{public}s\n", __func__);
115 
116     A2dpAvdtp avdtp(role);
117 
118     SetStateName(A2DP_PROFILE_CLOSING);
119     avdtp.DisconnectReq(addr);
120 
121     A2dpProfile *profile = GetProfileInstance(role);
122     CallbackParameter param = {role, true, 0};
123     profile->ConnectStateChangedNotify(addr, STREAM_DISCONNECT, (void *)&param);
124 }
125 
ProcessTimeout(BtAddr addr,uint8_t role)126 void A2dpStateIdle::ProcessTimeout(BtAddr addr, uint8_t role)
127 {
128     LOG_INFO("[A2dpStateIdle]%{public}s\n", __func__);
129 
130     A2dpAvdtp avdtp(role);
131 
132     SetStateName(A2DP_PROFILE_CLOSING);
133     avdtp.DisconnectReq(addr);
134 }
135 
ProcessDisconnectInd(BtAddr addr,uint16_t handle,uint8_t role)136 void A2dpStateIdle::ProcessDisconnectInd(BtAddr addr, uint16_t handle, uint8_t role)
137 {
138     LOG_INFO("[A2dpStateIdle]%{public}s\n", __func__);
139 
140     CallbackParameter param = {A2DP_ROLE_ACP, false, handle};
141     A2dpProfile *profile = GetProfileInstance(role);
142     if (profile == nullptr) {
143         LOG_ERROR("[A2dpStateIdle]%{public}s Failed to get profile instance\n", __func__);
144         return;
145     }
146 
147     if (role == A2DP_ROLE_SOURCE) {
148         IPowerManager::GetInstance().StatusUpdate(
149             RequestStatus::CONNECT_OFF, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
150     }
151     profile->ConnectStateChangedNotify(addr, STREAM_DISCONNECT, (void *)&param);
152 }
153 
ProcessSetConfigReq(A2dpAvdtMsgData msgData,uint8_t role)154 void A2dpStateIdle::ProcessSetConfigReq(A2dpAvdtMsgData msgData, uint8_t role)
155 {
156     LOG_INFO("[A2dpStateIdle]%{public}s\n", __func__);
157 
158     A2dpAvdtp avdtp(role);
159     uint8_t label = 0;
160 
161     SetStateName(A2DP_PROFILE_CONFIG);
162     avdtp.SetConfigureReq(msgData.configStream.addr,
163         msgData.configStream.intSeid,
164         msgData.configStream.acpSeid,
165         msgData.configStream.cfg,
166         label);
167 }
168 
ProcessSetConfigInd(A2dpAvdtMsgData msgData,uint8_t role)169 void A2dpStateIdle::ProcessSetConfigInd(A2dpAvdtMsgData msgData, uint8_t role)
170 {
171     LOG_INFO("[A2dpStateIdle]%{public}s\n", __func__);
172     A2dpProfile *profile = GetProfileInstance(role);
173     CallbackParameter param = {A2DP_ROLE_ACP, false, 0};
174     A2dpAvdtp avdtp(role);
175     A2dpProfilePeer *profilePeer = nullptr;
176     uint8_t resultConfig[A2DP_CODEC_SIZE];
177     (void)memset_s(resultConfig, A2DP_CODEC_SIZE, 0, A2DP_CODEC_SIZE);
178     uint8_t *pResultConfig = &resultConfig[0];
179     A2dpCodecCapability userConfig = {};
180     bool reconfig = false;
181     bool ret = false;
182     if (profile == nullptr) {
183         return;
184     }
185     profilePeer = profile->FindPeerByAddress(msgData.configRsp.addr);
186     if (profilePeer == nullptr) {
187         return;
188     }
189     A2dpCodecFactory *codecFactory = profilePeer->GetCodecConfigure();
190     if (codecFactory == nullptr) {
191         return;
192     }
193     uint8_t *pCodecInfo = msgData.configRsp.codecInfo;
194     SetStateName(A2DP_PROFILE_CONFIG);
195     avdtp.SetConfigureRsp(msgData.configRsp.handle, msgData.configRsp.label, msgData.configRsp.category);
196     profile->ConnectStateChangedNotify(msgData.configRsp.addr, STREAM_CONNECTING, static_cast<void *>(&param));
197     if (role == A2DP_ROLE_SOURCE) {
198         ret = codecFactory->SetCodecConfig(pCodecInfo, pResultConfig);
199         LOG_INFO("[A2dpStateIdle]%{public}s SetConfig result(%{public}d)\n", __func__, ret);
200     } else {
201         if (codecFactory->FindSourceCodec(pCodecInfo) == nullptr ||
202             codecFactory->GetIndexedSinkCodecs().front() == nullptr) {
203             return;
204         }
205         if (codecFactory->GetIndexedSinkCodecs().front()->GetCodecIndex() ==
206             (codecFactory->FindSourceCodec(pCodecInfo)->GetCodecIndex() + A2DP_SINK_CODEC_INDEX_MIN -
207             A2DP_SOURCE_CODEC_INDEX_SBC)) {
208             ret = codecFactory->SetSinkCodecConfig(pCodecInfo, pResultConfig);
209             LOG_INFO("[A2dpStateIdle]%{public}s SetSinkCodecConfig result(%{public}d)\n", __func__, ret);
210         } else {
211             userConfig.codecIndex_ = codecFactory->FindSourceCodec(pCodecInfo)->GetCodecIndex();
212             userConfig.codecPriority_ = A2DP_CODEC_PRIORITY_HIGHEST;
213             ret = codecFactory->SetCodecUserConfig(userConfig, pCodecInfo, pResultConfig, &reconfig);
214             LOG_INFO("[A2dpStateIdle]%{public}s SetuserConfig result(%{public}d)\n", __func__, ret);
215         }
216     }
217 }
218 
ProcessDiscoverReq(BtAddr addr,uint8_t role,uint8_t errCode)219 void A2dpStateIdle::ProcessDiscoverReq(BtAddr addr, uint8_t role, uint8_t errCode)
220 {
221     LOG_INFO("[A2dpStateIdle]%{public}s\n", __func__);
222 
223     A2dpProfile *profile = GetProfileInstance(role);
224     CallbackParameter param = {A2DP_ROLE_INT, true, 0};
225     A2dpAvdtp avdtp(role);
226     uint8_t label = 0;
227     if (profile == nullptr) {
228         LOG_ERROR("[A2dpStateIdle]%{public}s Failed to get profile instance\n", __func__);
229         return;
230     }
231 
232     A2dpProfilePeer *peer = profile->FindPeerByAddress(addr);
233     if (peer == nullptr) {
234         LOG_ERROR("[A2dpStateIdle]%{public}s Failed to get profilePeer instance\n", __func__);
235         return;
236     }
237     if (errCode != AVDT_SUCCESS) {
238         profile->ConnectStateChangedNotify(addr, STREAM_CONNECT_FAILED, (void *)&param);
239     } else if (peer->GetDisconnectIndication()) {
240         ProcessDisconnectReq(addr, role);
241         peer->SetDisconnectIndication(false);
242     } else {
243         avdtp.DiscoverReq(addr, AVDT_NUM_SEPS, label);
244     }
245 }
246 
ProcessSDPFailure(BtAddr addr,uint8_t role) const247 void A2dpStateIdle::ProcessSDPFailure(BtAddr addr, uint8_t role) const
248 {
249     LOG_INFO("[A2dpStateIdle]%{public}s\n", __func__);
250 
251     A2dpProfile *profile = GetProfileInstance(role);
252     CallbackParameter param = {A2DP_ROLE_INT, true, 0};
253     if (profile == nullptr) {
254         LOG_ERROR("[A2dpStateIdle]%{public}s Failed to get profile instance\n", __func__);
255         return;
256     }
257 
258     profile->DeletePeer(addr);
259     profile->ConnectStateChangedNotify(addr, STREAM_CONNECT_FAILED, (void *)&param);
260 }
261 
Dispatch(const utility::Message & msg)262 bool A2dpStateConfigure::Dispatch(const utility::Message &msg)
263 {
264     LOG_INFO("[A2dpStateConfigure]%{public}s\n", __func__);
265     if (msg.arg2_ == nullptr) {
266         LOG_ERROR("[A2dpStateConfigure]%{public}s input error parameter\n", __func__);
267         return false;
268     }
269 
270     uint8_t label = 0;
271     A2dpAvdtMsgData msgData = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->a2dpMsg;
272     uint8_t role = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->role;
273     A2dpAvdtp avdtp(role);
274 
275     switch (msg.what_) {
276         case EVT_GET_ALLCAP_REQ:
277             avdtp.GetAllCapabilityReq(msgData.stream.addr, msgData.stream.acpSeid, label);
278             break;
279         case EVT_GET_CAP_REQ:
280             avdtp.GetCapabilityReq(msgData.stream.addr, msgData.stream.acpSeid, label);
281             break;
282         case EVT_OPEN_REQ:
283             ProcessOpenReq(msgData.stream.addr, msgData.stream.handle, role);
284             break;
285         case EVT_DISCONNECT_REQ:
286             ProcessDisconnectReq(msgData.connectInfo.addr, role);
287             break;
288         case EVT_SETCONFIG_IND:
289             ProcessSetConfigInd(msgData, role);
290             break;
291         case EVT_OPEN_IND:
292             ProcessOpenInd(msgData, role);
293             break;
294         case EVT_DISCONNECT_IND:
295             ProcessDisconnectInd(msgData.stream.addr, msgData.stream.handle, role);
296             break;
297         case EVT_TIME_OUT:
298             avdtp.DisconnectReq(msgData.stream.addr);
299             SetStateName(A2DP_PROFILE_CLOSING);
300             break;
301         case EVT_DELAY_IND:
302             ProcessDelayReportInd(msgData, role);
303             break;
304         default:
305             break;
306     }
307     return true;
308 }
309 
SetStateName(std::string state)310 void A2dpStateConfigure::SetStateName(std::string state)
311 {
312     std::lock_guard<std::recursive_mutex> lock(g_stateMutex);
313     Transition(state);
314 }
315 
ProcessOpenReq(BtAddr addr,uint16_t handle,uint8_t role)316 void A2dpStateConfigure::ProcessOpenReq(BtAddr addr, uint16_t handle, uint8_t role)
317 {
318     LOG_INFO("[A2dpStateConfigure]%{public}s\n", __func__);
319 
320     A2dpAvdtp avdtp(role);
321     uint8_t label = 0;
322 
323     SetStateName(A2DP_PROFILE_OPENING);
324     avdtp.OpenReq(handle, label);
325 }
326 
ProcessDisconnectReq(BtAddr addr,uint8_t role)327 void A2dpStateConfigure::ProcessDisconnectReq(BtAddr addr, uint8_t role)
328 {
329     LOG_INFO("[A2dpStateConfigure]%{public}s\n", __func__);
330 
331     A2dpAvdtp avdtp(role);
332 
333     SetStateName(A2DP_PROFILE_CLOSING);
334     avdtp.DisconnectReq(addr);
335 }
336 
ProcessDisconnectInd(BtAddr addr,uint16_t handle,uint8_t role)337 void A2dpStateConfigure::ProcessDisconnectInd(BtAddr addr, uint16_t handle, uint8_t role)
338 {
339     LOG_INFO("[A2dpStateIdle]%{public}s\n", __func__);
340 
341     CallbackParameter param = {A2DP_ROLE_ACP, false, handle};
342     A2dpProfile *profile = GetProfileInstance(role);
343 
344     if (profile == nullptr) {
345         LOG_ERROR("[A2dpStateIdle]%{public}s Failed to get profile instance\n", __func__);
346         return;
347     }
348 
349     if (role == A2DP_ROLE_SOURCE) {
350         IPowerManager::GetInstance().StatusUpdate(
351             RequestStatus::CONNECT_OFF, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
352     }
353 
354     SetStateName(A2DP_PROFILE_IDLE);
355     profile->ConnectStateChangedNotify(addr, STREAM_DISCONNECT, (void *)&param);
356 }
357 
ProcessOpenInd(A2dpAvdtMsgData msgData,uint8_t role)358 void A2dpStateConfigure::ProcessOpenInd(A2dpAvdtMsgData msgData, uint8_t role)
359 {
360     LOG_INFO("[A2dpStateConfigure]%{public}s\n", __func__);
361 
362     CallbackParameter param = {A2DP_ROLE_ACP, false, 0};
363     A2dpProfile *profile = GetProfileInstance(role);
364     if (profile == nullptr) {
365         LOG_ERROR("[A2dpStateIdle]%{public}s Failed to get profile instance\n", __func__);
366         return;
367     }
368 
369     SetStateName(A2DP_PROFILE_OPEN);
370     param.handle = msgData.stream.handle;
371     profile->CodecChangedNotify(msgData.stream.addr, nullptr);
372     LOG_INFO("[A2dpStateOpen]%{public}s open handle[%u]\n", __func__, param.handle);
373     profile->ConnectStateChangedNotify(msgData.stream.addr, STREAM_CONNECT, static_cast<void *>(&param));
374 
375     if (role == A2DP_ROLE_SOURCE) {
376         IPowerManager::GetInstance().StatusUpdate(RequestStatus::CONNECT_ON,
377             PROFILE_NAME_A2DP_SRC,
378             bluetooth::RawAddress::ConvertToString(msgData.stream.addr.addr));
379     }
380 }
381 
ProcessSetConfigInd(A2dpAvdtMsgData msgData,uint8_t role)382 void A2dpStateConfigure::ProcessSetConfigInd(A2dpAvdtMsgData msgData, uint8_t role)
383 {
384     LOG_INFO("[A2dpStateConfigure]%{public}s\n", __func__);
385 
386     A2dpProfile *profile = GetProfileInstance(role);
387     A2dpAvdtp avdtp(role);
388     A2dpProfilePeer *profilePeer = nullptr;
389     uint8_t resultConfig[A2DP_CODEC_SIZE];
390     uint8_t *pResultConfig = &resultConfig[0];
391     A2dpCodecCapability userConfig = {};
392     bool reconfig = false;
393 
394     (void)memset_s(resultConfig, A2DP_CODEC_SIZE, 0, A2DP_CODEC_SIZE);
395     if (profile == nullptr) {
396         LOG_ERROR("[A2dpStateIdle]%{public}s Failed to get profile instance\n", __func__);
397         return;
398     }
399     profilePeer = profile->FindPeerByAddress(msgData.configRsp.addr);
400     if (profilePeer == nullptr) {
401         LOG_ERROR("[A2dpStateIdle]%{public}s Failed to get profilePeer instance\n", __func__);
402         return;
403     }
404 
405     A2dpCodecFactory *codecFactory = profilePeer->GetCodecConfigure();
406     uint8_t *pCodecInfo = msgData.configRsp.codecInfo;
407 
408     if (role == A2DP_ROLE_SOURCE) {
409         codecFactory->SetCodecConfig(pCodecInfo, pResultConfig);
410     } else {
411         if (codecFactory->GetIndexedSinkCodecs().front() == nullptr ||
412             codecFactory->FindSourceCodec(pCodecInfo) == nullptr) {
413             return;
414         }
415         if (codecFactory->GetIndexedSinkCodecs().front()->GetCodecIndex() ==
416             (codecFactory->FindSourceCodec(pCodecInfo)->GetCodecIndex() + A2DP_SINK_CODEC_INDEX_MIN -
417             A2DP_SOURCE_CODEC_INDEX_SBC)) {
418             codecFactory->SetSinkCodecConfig(pCodecInfo, pResultConfig);
419         } else {
420             userConfig.codecIndex_ = codecFactory->FindSourceCodec(pCodecInfo)->GetCodecIndex();
421             userConfig.codecPriority_ = A2DP_CODEC_PRIORITY_HIGHEST;
422             codecFactory->SetCodecUserConfig(userConfig, pCodecInfo, pResultConfig, &reconfig);
423         }
424     }
425 
426     avdtp.SetConfigureRsp(msgData.configRsp.handle, msgData.configRsp.label, msgData.configRsp.category);
427 }
428 
ProcessDelayReportInd(A2dpAvdtMsgData msgData,uint8_t role) const429 void A2dpStateConfigure::ProcessDelayReportInd(A2dpAvdtMsgData msgData, uint8_t role) const
430 {
431     LOG_INFO("[A2dpStateConfigure]%{public}s\n", __func__);
432     if (role == A2DP_ROLE_SINK) {
433         LOG_INFO("[A2dpStateConfigure]%{public}s sink role does not handle delay report ind return.", __func__);
434         return;
435     }
436 
437     A2dpProfile *profile = GetProfileInstance(role);
438     if (profile == nullptr) {
439         LOG_ERROR("[A2dpStateConfigure]%{public}s Failed to get profile instance\n", __func__);
440         return;
441     }
442 
443     BtAddr addr =  msgData.delayReportInfo.addr;
444     uint16_t value = msgData.delayReportInfo.delayValue;
445     profile->DelayReportNotify(addr, value);
446 }
447 
Dispatch(const utility::Message & msg)448 bool A2dpStateOpening::Dispatch(const utility::Message &msg)
449 {
450     LOG_INFO("[A2dpStateOpening]%{public}s\n", __func__);
451     if (msg.arg2_ == nullptr) {
452         LOG_ERROR("[A2dpStateOpening]%{public}s input error parameter\n", __func__);
453         return false;
454     }
455 
456     A2dpAvdtMsgData msgData = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->a2dpMsg;
457     uint8_t role = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->role;
458     A2dpAvdtp avdtp(role);
459     uint8_t label = 0;
460 
461     switch (msg.what_) {
462         case EVT_GET_ALLCAP_REQ:
463             avdtp.GetAllCapabilityReq(msgData.stream.addr, msgData.stream.acpSeid, label);
464             break;
465         case EVT_GET_CAP_REQ:
466             avdtp.GetCapabilityReq(msgData.stream.addr, msgData.stream.acpSeid, label);
467             break;
468         case EVT_DISCONNECT_REQ:
469             ProcessDisconnectReq(msgData.connectInfo.addr, role);
470             break;
471         case EVT_DISCONNECT_IND:
472             ProcessDisconnectInd(msgData.stream.addr, msgData.stream.handle, role);
473             break;
474         case EVT_OPEN_CFM:
475             ProcessOpenCfm(msgData, role);
476             break;
477         case EVT_TIME_OUT:
478             avdtp.DisconnectReq(msgData.stream.addr);
479             SetStateName(A2DP_PROFILE_CLOSING);
480             break;
481         case EVT_DELAY_IND:
482             ProcessDelayReportInd(msgData, role);
483             break;
484         default:
485             break;
486     }
487     return true;
488 }
489 
SetStateName(std::string state)490 void A2dpStateOpening::SetStateName(std::string state)
491 {
492     std::lock_guard<std::recursive_mutex> lock(g_stateMutex);
493     Transition(state);
494 }
495 
ProcessOpenCfm(A2dpAvdtMsgData msgData,uint8_t role)496 void A2dpStateOpening::ProcessOpenCfm(A2dpAvdtMsgData msgData, uint8_t role)
497 {
498     LOG_INFO("[A2dpStateOpening]%{public}s\n", __func__);
499 
500     CallbackParameter param = {A2DP_ROLE_INT, true, msgData.stream.handle};
501     A2dpAvdtp avdtp(role);
502     A2dpProfile *profile = GetProfileInstance(role);
503     if (profile == nullptr) {
504         LOG_ERROR("[A2dpStateOpening]%{public}s Failed to get profile instance\n", __func__);
505         return;
506     }
507 
508     if (msgData.stream.errCode != AVDT_SUCCESS) {
509         LOG_ERROR("[A2dpStateOpening]%{public}s [errcode: %u]", __func__, msgData.stream.errCode);
510         profile->ConnectStateChangedNotify(msgData.stream.addr, STREAM_CONNECT_FAILED, static_cast<void *>(&param));
511     } else {
512         SetStateName(A2DP_PROFILE_OPEN);
513         profile->CodecChangedNotify(msgData.stream.addr, nullptr);
514         LOG_INFO("[A2dpStateOpen]%{public}s open handle[%u]\n", __func__, param.handle);
515         if (role == A2DP_ROLE_SOURCE) {
516             IPowerManager::GetInstance().StatusUpdate(RequestStatus::CONNECT_ON,
517                 PROFILE_NAME_A2DP_SRC,
518                 bluetooth::RawAddress::ConvertToString(msgData.stream.addr.addr));
519         }
520         profile->ConnectStateChangedNotify(msgData.stream.addr, STREAM_CONNECT, static_cast<void *>(&param));
521     }
522 }
523 
ProcessDisconnectReq(BtAddr addr,uint8_t role)524 void A2dpStateOpening::ProcessDisconnectReq(BtAddr addr, uint8_t role)
525 {
526     LOG_INFO("[A2dpStateOpening]%{public}s\n", __func__);
527 
528     A2dpAvdtp avdtp(role);
529 
530     SetStateName(A2DP_PROFILE_CLOSING);
531     avdtp.DisconnectReq(addr);
532 }
533 
ProcessDisconnectInd(BtAddr addr,uint16_t handle,uint8_t role)534 void A2dpStateOpening::ProcessDisconnectInd(BtAddr addr, uint16_t handle, uint8_t role)
535 {
536     LOG_INFO("[A2dpStateOpening]%{public}s\n", __func__);
537 
538     CallbackParameter param = {A2DP_ROLE_ACP, false, handle};
539     A2dpProfile *profile = GetProfileInstance(role);
540 
541     if (profile == nullptr) {
542         LOG_ERROR("[A2dpStateOpening]%{public}s Failed to get profile instance\n", __func__);
543         return;
544     }
545 
546     if (role == A2DP_ROLE_SOURCE) {
547         IPowerManager::GetInstance().StatusUpdate(
548             RequestStatus::CONNECT_OFF, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
549     }
550     SetStateName(A2DP_PROFILE_IDLE);
551     profile->ConnectStateChangedNotify(addr, STREAM_DISCONNECT, (void *)&param);
552 }
553 
ProcessDelayReportInd(A2dpAvdtMsgData msgData,uint8_t role) const554 void A2dpStateOpening::ProcessDelayReportInd(A2dpAvdtMsgData msgData, uint8_t role) const
555 {
556     LOG_INFO("[A2dpStateOpening]%{public}s\n", __func__);
557     if (role == A2DP_ROLE_SINK) {
558         LOG_INFO("[A2dpStateOpening]%{public}s sink role does not handle delay report ind return.", __func__);
559         return;
560     }
561 
562     A2dpProfile *profile = GetProfileInstance(role);
563     if (profile == nullptr) {
564         LOG_ERROR("[A2dpStateOpening]%{public}s Failed to get profile instance\n", __func__);
565         return;
566     }
567 
568     BtAddr addr =  msgData.delayReportInfo.addr;
569     uint16_t value = msgData.delayReportInfo.delayValue;
570     profile->DelayReportNotify(addr, value);
571 }
572 
Dispatch(const utility::Message & msg)573 bool A2dpStateOpen::Dispatch(const utility::Message &msg)
574 {
575     if (msg.arg2_ == nullptr) {
576         return false;
577     }
578     A2dpAvdtMsgData msgData = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->a2dpMsg;
579     uint8_t role = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->role;
580     A2dpAvdtp avdtp(role);
581 
582     switch (msg.what_) {
583         case EVT_START_IND:
584             ProcessStartInd(msgData, role);
585             break;
586         case EVT_CLOSE_IND:
587             ProcessCloseInd(msgData, role);
588             break;
589         case EVT_DISCONNECT_IND:
590             ProcessDisconnectInd(msgData.stream.addr, msgData.stream.handle, role);
591             break;
592         case EVT_RECONFIG_IND:
593             avdtp.ReconfigureRsp(msgData.configRsp.handle, msgData.configRsp.label, msgData.configRsp.category);
594             break;
595         case EVT_CLOSE_REQ:
596             avdtp.CloseReq(msgData.stream.handle);
597             break;
598         case EVT_DISCONNECT_REQ:
599             ProcessDisconnectReq(msgData.connectInfo.addr, role);
600             break;
601         case EVT_START_REQ:
602             avdtp.StartReq(msgData.stream.handle, label_);
603             break;
604         case EVT_RECONFIG_REQ:
605             avdtp.ReconfigureReq(msgData.configStream.intSeid, msgData.configStream.cfg, label_);
606             break;
607         case EVT_RECONFIG_CFM:
608             ProcessReconfigCfm(msgData.stream.addr, role, msgData.stream.handle);
609             break;
610         case EVT_CLOSE_CFM:
611             ProcessCloseCfm(msgData.stream.addr, role);
612             break;
613         case EVT_START_CFM:
614             ProcessStartCfm(msgData.stream.addr, role);
615             break;
616         case EVT_DELAY_IND:
617             ProcessDelayReportInd(msgData, role);
618             break;
619         default:
620             ProcessSubOpenState(msgData, role, msg.what_);
621             break;
622     }
623     return true;
624 }
625 
SetStateName(std::string state)626 void A2dpStateOpen::SetStateName(std::string state)
627 {
628     std::lock_guard<std::recursive_mutex> lock(g_stateMutex);
629     Transition(state);
630 }
631 
ProcessSubOpenState(A2dpAvdtMsgData msgData,uint8_t role,int cmd)632 void A2dpStateOpen::ProcessSubOpenState(A2dpAvdtMsgData msgData, uint8_t role, int cmd)
633 {
634     LOG_INFO("[A2dpStateOpen]%{public}s cmd(%{public}d)\n", __func__, cmd);
635 
636     A2dpAvdtp avdtp(role);
637     uint8_t label = 0;
638 
639     switch (cmd) {
640         case EVT_GET_ALLCAP_REQ:
641             avdtp.GetAllCapabilityReq(msgData.stream.addr, msgData.stream.acpSeid, label);
642             break;
643         case EVT_GET_CAP_REQ:
644             avdtp.GetCapabilityReq(msgData.stream.addr, msgData.stream.acpSeid, label);
645             break;
646         case EVT_TIME_OUT:
647             ProcessTimeout(msgData.stream.addr, role);
648             break;
649         default:
650             break;
651     }
652 }
653 
ProcessCloseInd(A2dpAvdtMsgData msgData,uint8_t role)654 void A2dpStateOpen::ProcessCloseInd(A2dpAvdtMsgData msgData, uint8_t role)
655 {
656     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
657 
658     A2dpAvdtp avdtp(role);
659 
660     SetStateName(A2DP_PROFILE_CLOSING);
661     avdtp.CloseRsp(msgData.stream.handle, msgData.stream.label, 0);
662 }
663 
ProcessStartInd(A2dpAvdtMsgData msgData,uint8_t role)664 void A2dpStateOpen::ProcessStartInd(A2dpAvdtMsgData msgData, uint8_t role)
665 {
666     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
667 
668     A2dpProfile *profile = GetProfileInstance(role);
669     uint8_t gavdpRole = A2DP_ROLE_ACP;
670     A2dpAvdtp avdtp(role);
671     if (profile == nullptr) {
672         LOG_ERROR("[A2dpStateIdle]%{public}s Failed to get profile instance\n", __func__);
673         return;
674     }
675 
676     SetStateName(A2DP_PROFILE_STREAMING);
677     if (avdtp.StartRsp(msgData.stream.handle, msgData.stream.label, 0, 0) == AVDT_SUCCESS) {
678         profile->AudioStateChangedNotify(msgData.stream.addr, A2DP_IS_PLAYING, (void *)&gavdpRole);
679         if (role == A2DP_ROLE_SOURCE) {
680             profile->NotifyEncoder(msgData.stream.addr);
681         } else {
682             profile->NotifyDecoder(msgData.stream.addr);
683         }
684     } else {
685         SetStateName(A2DP_PROFILE_OPEN);
686     }
687 }
688 
ProcessDisconnectInd(BtAddr addr,uint16_t handle,uint8_t role)689 void A2dpStateOpen::ProcessDisconnectInd(BtAddr addr, uint16_t handle, uint8_t role)
690 {
691     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
692 
693     CallbackParameter param = {A2DP_ROLE_ACP, false, handle};
694     A2dpProfile *profile = GetProfileInstance(role);
695     if (profile == nullptr) {
696         LOG_ERROR("[A2dpStateOpen]%{public}s Failed to get profile instance\n", __func__);
697         return;
698     }
699 
700     if (role == A2DP_ROLE_SOURCE) {
701         IPowerManager::GetInstance().StatusUpdate(
702             RequestStatus::CONNECT_OFF, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
703     }
704 
705     SetStateName(A2DP_PROFILE_IDLE);
706     profile->ConnectStateChangedNotify(addr, STREAM_DISCONNECT, (void *)&param);
707 }
708 
ProcessDisconnectReq(BtAddr addr,uint8_t role)709 void A2dpStateOpen::ProcessDisconnectReq(BtAddr addr, uint8_t role)
710 {
711     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
712 
713     A2dpAvdtp avdtp(role);
714 
715     SetStateName(A2DP_PROFILE_CLOSING);
716     avdtp.DisconnectReq(addr);
717 }
718 
ProcessReconfigCfm(BtAddr addr,uint8_t role,uint16_t handle)719 void A2dpStateOpen::ProcessReconfigCfm(BtAddr addr, uint8_t role, uint16_t handle)
720 {
721     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
722 
723     A2dpProfile *profile = GetProfileInstance(role);
724     A2dpAvdtp avdtp(role);
725     if (profile == nullptr) {
726         LOG_ERROR("[A2dpStateOpen]%{public}s Failed to get profile instance\n", __func__);
727         return;
728     }
729 
730     profile->FindPeerByAddress(addr)->SetRestart(false);
731     if (Compat::CompatCheck(CompatType::COMPAT_REJECT_AVDTP_RECONFIGURE,
732         bluetooth::RawAddress::ConvertToString(addr.addr).GetAddress())) {
733         LOG_ERROR("[A2dpStateOpen]%{public}s The remote device is disable to reconfigure\n", __func__);
734         avdtp.CloseReq(handle);
735         return;
736     }
737     profile->CodecChangedNotify(addr, nullptr);
738 
739     if (profile->IsActiveDevice(addr)) {
740         uint8_t label = 0;
741         avdtp.StartReq(handle, label);
742     }
743 }
744 
ProcessCloseCfm(BtAddr addr,uint8_t role)745 void A2dpStateOpen::ProcessCloseCfm(BtAddr addr, uint8_t role)
746 {
747     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
748 
749     A2dpProfile *profile = GetProfileInstance(role);
750     if (profile == nullptr) {
751         LOG_ERROR("[A2dpStateOpen]%{public}s Failed to get profile instance\n", __func__);
752         return;
753     }
754 
755     SetStateName(A2DP_PROFILE_IDLE);
756     if (profile->FindPeerByAddress(addr)->GetRestart()) {
757         profile->FindPeerByAddress(addr)->UpdateConfigure();
758     }
759     if (!profile->HasOpen() && profile->GetDisalbeTag()) {
760         profile->Disable();
761     }
762 }
763 
ProcessStartCfm(BtAddr addr,uint8_t role)764 void A2dpStateOpen::ProcessStartCfm(BtAddr addr, uint8_t role)
765 {
766     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
767 
768     A2dpProfile *profile = GetProfileInstance(role);
769     uint8_t gavdpRole = A2DP_ROLE_INT;
770     if (profile == nullptr) {
771         LOG_ERROR("[A2dpStateOpen]%{public}s Failed to get profile instance\n", __func__);
772         return;
773     }
774 
775     SetStateName(A2DP_PROFILE_STREAMING);
776     profile->AudioStateChangedNotify(addr, A2DP_IS_PLAYING, (void *)&gavdpRole);
777 
778     if (role == A2DP_ROLE_SOURCE) {
779         profile->NotifyEncoder(addr);
780     } else {
781         profile->NotifyDecoder(addr);
782     }
783 }
784 
ProcessDelayReportInd(A2dpAvdtMsgData msgData,uint8_t role) const785 void A2dpStateOpen::ProcessDelayReportInd(A2dpAvdtMsgData msgData, uint8_t role) const
786 {
787     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
788     if (role == A2DP_ROLE_SINK) {
789         LOG_INFO("[A2dpStateOpen]%{public}s sink role does not handle delay report ind return.", __func__);
790         return;
791     }
792 
793     A2dpProfile *profile = GetProfileInstance(role);
794     if (profile == nullptr) {
795         LOG_ERROR("[A2dpStateOpen]%{public}s Failed to get profile instance\n", __func__);
796         return;
797     }
798 
799     BtAddr addr =  msgData.delayReportInfo.addr;
800     uint16_t value = msgData.delayReportInfo.delayValue;
801     profile->DelayReportNotify(addr, value);
802 }
803 
ProcessTimeout(BtAddr addr,uint8_t role)804 void A2dpStateOpen::ProcessTimeout(BtAddr addr, uint8_t role)
805 {
806     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
807 
808     A2dpAvdtp avdtp(role);
809 
810     SetStateName(A2DP_PROFILE_CLOSING);
811     avdtp.DisconnectReq(addr);
812 }
813 
Entry()814 void A2dpStateStreaming::Entry()
815 {
816     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
817     A2dpCodecThread *codecThread = A2dpCodecThread::GetInstance();
818     if (codecThread == nullptr) {
819         return;
820     }
821     if (codecThread->GetInitStatus()) {
822         codecThread->StartTimer();
823     } else {
824         if (codecThread != nullptr) {
825             codecThread->StartA2dpCodecThread();
826         }
827     }
828 }
829 
Exit()830 void A2dpStateStreaming::Exit()
831 {
832     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
833     A2dpCodecThread *codecThread = A2dpCodecThread::GetInstance();
834     if (codecThread->GetInitStatus()) {
835         codecThread->StopTimer();
836     }
837 }
838 
Dispatch(const utility::Message & msg)839 bool A2dpStateStreaming::Dispatch(const utility::Message &msg)
840 {
841     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
842     if (msg.arg2_ == nullptr) {
843         LOG_ERROR("[A2dpStateStreaming]%{public}s input error parameter\n", __func__);
844         return false;
845     }
846     A2dpAvdtMsgData msgData = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->a2dpMsg;
847     uint8_t role = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->role;
848     A2dpAvdtp avdtp(role);
849     uint8_t label = 0;
850 
851     switch (msg.what_) {
852         case EVT_GET_ALLCAP_REQ:
853             avdtp.GetAllCapabilityReq(msgData.stream.addr, msgData.stream.acpSeid, label);
854             break;
855         case EVT_GET_CAP_REQ:
856             avdtp.GetCapabilityReq(msgData.stream.addr, msgData.stream.acpSeid, label);
857             break;
858         case EVT_SUSPEND_IND:
859             ProcessSuspendInd(msgData, role);
860             break;
861         case EVT_CLOSE_IND:
862             SetStateName(A2DP_PROFILE_IDLE);
863             avdtp.CloseRsp(msgData.stream.handle, msgData.stream.label, 0);
864             break;
865         case EVT_DISCONNECT_IND:
866             ProcessDisconnectInd(msgData.stream.addr, msgData.stream.handle, role);
867             break;
868         case EVT_DISCONNECT_REQ:
869             ProcessDisconnectReq(msgData.connectInfo.addr, role);
870             break;
871         case EVT_CLOSE_REQ:
872             avdtp.CloseReq(msgData.stream.handle);
873             break;
874         case EVT_SUSPEND_REQ:
875             ProcessSuspendReq(msgData.stream.handle, role);
876             break;
877         case EVT_CLOSE_CFM:
878             ProcessCloseCfm(msgData.stream.addr, role);
879             break;
880         case EVT_SUSPEND_CFM:
881             ProcessSuspendCfm(msgData, role);
882             break;
883         case EVT_WRITE_CFM:
884             ProcessWriteCfm(msgData, role);
885             break;
886         case EVT_DELAY_IND:
887             ProcessDelayReportInd(msgData, role);
888             break;
889         default:
890             break;
891     }
892     return true;
893 }
894 
SetStateName(std::string state)895 void A2dpStateStreaming::SetStateName(std::string state)
896 {
897     std::lock_guard<std::recursive_mutex> lock(g_stateMutex);
898     Transition(state);
899 }
900 
ProcessSuspendInd(A2dpAvdtMsgData msgData,uint8_t role)901 void A2dpStateStreaming::ProcessSuspendInd(A2dpAvdtMsgData msgData, uint8_t role)
902 {
903     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
904 
905     A2dpProfile *profile = GetProfileInstance(role);
906     uint8_t gavdpRole = A2DP_ROLE_ACP;
907     A2dpAvdtp avdtp(role);
908     if (profile == nullptr) {
909         LOG_ERROR("[A2dpStateStreaming]%{public}s Failed to get profile instance\n", __func__);
910         return;
911     }
912 
913     /// check the stream status
914     if (avdtp.SuspendRsp(msgData.stream.handle, msgData.stream.label, 0, 0) == AVDT_SUCCESS) {
915         SetStateName(A2DP_PROFILE_OPEN);
916         profile->AudioStateChangedNotify(msgData.stream.addr, A2DP_NOT_PLAYING, (void *)&gavdpRole);
917     }
918 }
919 
ProcessSuspendCfm(A2dpAvdtMsgData msgData,uint8_t role)920 void A2dpStateStreaming::ProcessSuspendCfm(A2dpAvdtMsgData msgData, uint8_t role)
921 {
922     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
923 
924     A2dpProfile *profile = GetProfileInstance(role);
925     uint8_t gavdpRole = A2DP_ROLE_INT;
926     A2dpAvdtp avdtp(role);
927     if (profile == nullptr) {
928         LOG_ERROR("[A2dpStateStreaming]%{public}s Failed to get profile instance\n", __func__);
929         return;
930     }
931 
932     if (role == A2DP_ROLE_SOURCE) {
933         IPowerManager::GetInstance().StatusUpdate(RequestStatus::CONNECT_ON,
934             PROFILE_NAME_A2DP_SRC,
935             bluetooth::RawAddress::ConvertToString(msgData.stream.addr.addr));
936     }
937     SetStateName(A2DP_PROFILE_OPEN);
938     profile->AudioStateChangedNotify(msgData.stream.addr, A2DP_NOT_PLAYING, (void *)&gavdpRole);
939     A2dpService *service = GetServiceInstance(role);
940     if (service != nullptr) {
941         std::string addr = service->GetActiveSinkDevice().GetAddress();
942         if (strcmp(addr.c_str(), RawAddress::ConvertToString(msgData.stream.addr.addr).GetAddress().c_str()) != 0) {
943             service->ActiveDevice();
944         }
945     }
946     if (profile->GetDisalbeTag()) {
947         profile->CloseAll();
948     }
949     if (profile->FindPeerByAddress(msgData.stream.addr)->GetRestart()) {
950         avdtp.ReconfigureReq(
951             msgData.stream.handle, profile->FindPeerByAddress(msgData.stream.addr)->GetReconfig(), label_);
952     }
953 }
954 
ProcessWriteCfm(A2dpAvdtMsgData msgData,uint8_t role)955 void A2dpStateStreaming::ProcessWriteCfm(A2dpAvdtMsgData msgData, uint8_t role)
956 {
957     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
958     A2dpProfile *profile = GetProfileInstance(A2DP_ROLE_SOURCE);
959     profile->DequeuePacket();
960 }
961 
ProcessDisconnectReq(BtAddr addr,uint8_t role)962 void A2dpStateStreaming::ProcessDisconnectReq(BtAddr addr, uint8_t role)
963 {
964     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
965 
966     A2dpAvdtp avdtp(role);
967 
968     SetStateName(A2DP_PROFILE_CLOSING);
969     avdtp.DisconnectReq(addr);
970     if (role == A2DP_ROLE_SOURCE) {
971         IPowerManager::GetInstance().StatusUpdate(
972             RequestStatus::IDLE, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
973     }
974 }
975 
ProcessSuspendReq(uint16_t handle,uint8_t role)976 void A2dpStateStreaming::ProcessSuspendReq(uint16_t handle, uint8_t role)
977 {
978     LOG_INFO("[A2dpStateStreaming]%{public}s role(%u)\n", __func__, role);
979 
980     A2dpAvdtp avdtp(role);
981     avdtp.SuspendReq(handle, label_);
982 }
983 
ProcessDisconnectInd(BtAddr addr,uint16_t handle,uint8_t role)984 void A2dpStateStreaming::ProcessDisconnectInd(BtAddr addr, uint16_t handle, uint8_t role)
985 {
986     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
987 
988     CallbackParameter param = {A2DP_ROLE_ACP, false, handle};
989     A2dpProfile *profile = GetProfileInstance(role);
990     uint8_t gavdpRole = A2DP_ROLE_ACP;
991     if (profile == nullptr) {
992         LOG_ERROR("[A2dpStateStreaming]%{public}s Failed to get profile instance\n", __func__);
993         return;
994     }
995 
996     if (role == A2DP_ROLE_SOURCE) {
997         IPowerManager::GetInstance().StatusUpdate(
998             RequestStatus::CONNECT_OFF, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
999     }
1000     SetStateName(A2DP_PROFILE_IDLE);
1001     profile->AudioStateChangedNotify(addr, A2DP_NOT_PLAYING, (void *)&gavdpRole);
1002     profile->ConnectStateChangedNotify(addr, STREAM_DISCONNECT, (void *)&param);
1003 }
1004 
ProcessCloseCfm(BtAddr addr,uint8_t role)1005 void A2dpStateStreaming::ProcessCloseCfm(BtAddr addr, uint8_t role)
1006 {
1007     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
1008 
1009     A2dpProfile *profile = GetProfileInstance(role);
1010     if (profile == nullptr) {
1011         LOG_ERROR("[A2dpStateOpen]%{public}s Failed to get profile instance\n", __func__);
1012         return;
1013     }
1014 
1015     if (role == A2DP_ROLE_SOURCE) {
1016         IPowerManager::GetInstance().StatusUpdate(
1017             RequestStatus::IDLE, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
1018     }
1019 
1020     SetStateName(A2DP_PROFILE_IDLE);
1021     if (profile->FindPeerByAddress(addr)->GetRestart()) {
1022         profile->FindPeerByAddress(addr)->UpdateConfigure();
1023     }
1024 }
1025 
ProcessDelayReportInd(A2dpAvdtMsgData msgData,uint8_t role) const1026 void A2dpStateStreaming::ProcessDelayReportInd(A2dpAvdtMsgData msgData, uint8_t role) const
1027 {
1028     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
1029     if (role == A2DP_ROLE_SINK) {
1030         LOG_INFO("[A2dpStateStreaming]%{public}s sink role does not handle delay report ind return.", __func__);
1031         return;
1032     }
1033 
1034     A2dpProfile *profile = GetProfileInstance(role);
1035     if (profile == nullptr) {
1036         LOG_ERROR("[A2dpStateStreaming]%{public}s Failed to get profile instance\n", __func__);
1037         return;
1038     }
1039 
1040     BtAddr addr =  msgData.delayReportInfo.addr;
1041     uint16_t value = msgData.delayReportInfo.delayValue;
1042     profile->DelayReportNotify(addr, value);
1043 }
1044 
Dispatch(const utility::Message & msg)1045 bool A2dpStateClosing::Dispatch(const utility::Message &msg)
1046 {
1047     LOG_INFO("[A2dpStateClosing]%{public}s\n", __func__);
1048 
1049     if (msg.arg2_ == nullptr) {
1050         LOG_ERROR("[A2dpStateClosing]%{public}s input error parameter\n", __func__);
1051         return false;
1052     }
1053 
1054     A2dpAvdtMsgData msgData = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->a2dpMsg;
1055     uint8_t role = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->role;
1056 
1057     switch (msg.what_) {
1058         case EVT_DISCONNECT_IND:
1059             ProcessDisconnectInd(msgData.stream.addr, msgData.stream.handle, role);
1060             break;
1061         case EVT_CLOSE_TRANS_IND:
1062             ProcessCloseStreamInd(msgData.stream.addr, msgData.stream.handle, role);
1063             break;
1064         case EVT_DISCONNECT_CFM:
1065             ProcessDisconnectCfm(msgData.stream.addr, msgData.stream.handle, role);
1066             break;
1067         default:
1068             break;
1069     }
1070     return true;
1071 }
1072 
SetStateName(std::string state)1073 void A2dpStateClosing::SetStateName(std::string state)
1074 {
1075     std::lock_guard<std::recursive_mutex> lock(g_stateMutex);
1076     Transition(state);
1077 }
1078 
ProcessCloseStreamInd(BtAddr addr,uint16_t handle,uint8_t role)1079 void A2dpStateClosing::ProcessCloseStreamInd(BtAddr addr, uint16_t handle, uint8_t role)
1080 {
1081     LOG_INFO("[A2dpStateClosing]%{public}s\n", __func__);
1082     A2dpProfile *profile = GetProfileInstance(role);
1083     if (profile == nullptr) {
1084         LOG_ERROR("[A2dpStateClosing]%{public}s Failed to get profile instance\n", __func__);
1085         return;
1086     }
1087 
1088     SetStateName(A2DP_PROFILE_IDLE);
1089     A2dpProfilePeer *peer = profile->FindOrCreatePeer(addr, role);
1090     if (peer == nullptr) {
1091         LOG_ERROR("[A2dpStateClosing]%{public}s Failed to get profile Peer\n", __func__);
1092         return;
1093     }
1094     peer->SetCurrentCmd(EVT_DISCONNECT_IND);
1095     peer->SetSignalingTimer(A2DP_ACCEPT_SIGNALLING_TIMEOUT_MS, false);
1096 }
1097 
ProcessDisconnectInd(BtAddr addr,uint16_t handle,uint8_t role)1098 void A2dpStateClosing::ProcessDisconnectInd(BtAddr addr, uint16_t handle, uint8_t role)
1099 {
1100     LOG_INFO("[A2dpStateClosing]%{public}s\n", __func__);
1101 
1102     CallbackParameter param = {A2DP_ROLE_INT, false, handle};
1103     A2dpProfile *profile = GetProfileInstance(role);
1104     if (profile == nullptr) {
1105         LOG_ERROR("[A2dpStateClosing]%{public}s Failed to get profile instance\n", __func__);
1106         return;
1107     }
1108 
1109     if (role == A2DP_ROLE_SOURCE) {
1110         IPowerManager::GetInstance().StatusUpdate(
1111             RequestStatus::CONNECT_OFF, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
1112     }
1113 
1114     SetStateName(A2DP_PROFILE_IDLE);
1115     profile->ConnectStateChangedNotify(addr, STREAM_DISCONNECT, (void *)&param);
1116 }
1117 
ProcessDisconnectCfm(BtAddr addr,uint16_t handle,uint8_t role)1118 void A2dpStateClosing::ProcessDisconnectCfm(BtAddr addr, uint16_t handle, uint8_t role)
1119 {
1120     LOG_INFO("[A2dpStateClosing]%{public}s\n", __func__);
1121 
1122     CallbackParameter param = {A2DP_ROLE_INT, true, handle};
1123     uint8_t gavdpRole = A2DP_ROLE_INT;
1124     A2dpProfile *profile = GetProfileInstance(role);
1125     if (profile == nullptr) {
1126         LOG_ERROR("[A2dpStateClosing]%{public}s Failed to get profile instance\n", __func__);
1127         return;
1128     }
1129 
1130     if (role == A2DP_ROLE_SOURCE) {
1131         IPowerManager::GetInstance().StatusUpdate(
1132             RequestStatus::CONNECT_OFF, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
1133     }
1134 
1135     SetStateName(A2DP_PROFILE_IDLE);
1136     profile->AudioStateChangedNotify(addr, A2DP_NOT_PLAYING, (void *)&gavdpRole);
1137     profile->ConnectStateChangedNotify(addr, STREAM_DISCONNECT, (void *)&param);
1138 }
1139 
GetStateName(void) const1140 const std::string A2dpStateMachine::GetStateName(void) const
1141 {
1142     std::lock_guard<std::recursive_mutex> lock(g_stateMutex);
1143     return GetState()->Name();
1144 }
1145 }  // namespace bluetooth
1146 }  // namespace OHOS