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         case EVT_SUSPEND_REQ:
650             ProcessSuspendReq(msgData.stream.handle, role);
651             break;
652         case EVT_SUSPEND_IND:
653             ProcessSuspendInd(msgData, role);
654             break;
655         case EVT_SUSPEND_CFM:
656             ProcessSuspendCfm(msgData, role);
657             break;
658         default:
659             break;
660     }
661 }
662 
ProcessCloseInd(A2dpAvdtMsgData msgData, uint8_t role)663 void A2dpStateOpen::ProcessCloseInd(A2dpAvdtMsgData msgData, uint8_t role)
664 {
665     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
666 
667     A2dpAvdtp avdtp(role);
668 
669     SetStateName(A2DP_PROFILE_CLOSING);
670     avdtp.CloseRsp(msgData.stream.handle, msgData.stream.label, 0);
671 }
672 
ProcessStartInd(A2dpAvdtMsgData msgData, uint8_t role)673 void A2dpStateOpen::ProcessStartInd(A2dpAvdtMsgData msgData, uint8_t role)
674 {
675     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
676 
677     A2dpProfile *profile = GetProfileInstance(role);
678     uint8_t gavdpRole = A2DP_ROLE_ACP;
679     A2dpAvdtp avdtp(role);
680     if (profile == nullptr) {
681         LOG_ERROR("[A2dpStateIdle]%{public}s Failed to get profile instance\n", __func__);
682         return;
683     }
684 
685     SetStateName(A2DP_PROFILE_STREAMING);
686     if (avdtp.StartRsp(msgData.stream.handle, msgData.stream.label, 0, 0) == AVDT_SUCCESS) {
687         profile->AudioStateChangedNotify(msgData.stream.addr, A2DP_IS_PLAYING, (void *)&gavdpRole);
688         if (role == A2DP_ROLE_SOURCE) {
689             profile->NotifyEncoder(msgData.stream.addr);
690         } else {
691             profile->NotifyDecoder(msgData.stream.addr);
692         }
693     } else {
694         SetStateName(A2DP_PROFILE_OPEN);
695     }
696 }
697 
ProcessDisconnectInd(BtAddr addr, uint16_t handle, uint8_t role)698 void A2dpStateOpen::ProcessDisconnectInd(BtAddr addr, uint16_t handle, uint8_t role)
699 {
700     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
701 
702     CallbackParameter param = {A2DP_ROLE_ACP, false, handle};
703     A2dpProfile *profile = GetProfileInstance(role);
704     if (profile == nullptr) {
705         LOG_ERROR("[A2dpStateOpen]%{public}s Failed to get profile instance\n", __func__);
706         return;
707     }
708 
709     if (role == A2DP_ROLE_SOURCE) {
710         IPowerManager::GetInstance().StatusUpdate(
711             RequestStatus::CONNECT_OFF, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
712     }
713 
714     SetStateName(A2DP_PROFILE_IDLE);
715     profile->ConnectStateChangedNotify(addr, STREAM_DISCONNECT, (void *)&param);
716 }
717 
ProcessDisconnectReq(BtAddr addr, uint8_t role)718 void A2dpStateOpen::ProcessDisconnectReq(BtAddr addr, uint8_t role)
719 {
720     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
721 
722     A2dpAvdtp avdtp(role);
723 
724     SetStateName(A2DP_PROFILE_CLOSING);
725     avdtp.DisconnectReq(addr);
726 }
727 
ProcessReconfigCfm(BtAddr addr, uint8_t role, uint16_t handle)728 void A2dpStateOpen::ProcessReconfigCfm(BtAddr addr, uint8_t role, uint16_t handle)
729 {
730     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
731 
732     A2dpProfile *profile = GetProfileInstance(role);
733     A2dpAvdtp avdtp(role);
734     if (profile == nullptr) {
735         LOG_ERROR("[A2dpStateOpen]%{public}s Failed to get profile instance\n", __func__);
736         return;
737     }
738 
739     profile->FindPeerByAddress(addr)->SetRestart(false);
740     if (Compat::CompatCheck(CompatType::COMPAT_REJECT_AVDTP_RECONFIGURE,
741         bluetooth::RawAddress::ConvertToString(addr.addr).GetAddress())) {
742         LOG_ERROR("[A2dpStateOpen]%{public}s The remote device is disable to reconfigure\n", __func__);
743         avdtp.CloseReq(handle);
744         return;
745     }
746     profile->CodecChangedNotify(addr, nullptr);
747 
748     if (profile->IsActiveDevice(addr)) {
749         uint8_t label = 0;
750         avdtp.StartReq(handle, label);
751     }
752 }
753 
ProcessCloseCfm(BtAddr addr, uint8_t role)754 void A2dpStateOpen::ProcessCloseCfm(BtAddr addr, uint8_t role)
755 {
756     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
757 
758     A2dpProfile *profile = GetProfileInstance(role);
759     if (profile == nullptr) {
760         LOG_ERROR("[A2dpStateOpen]%{public}s Failed to get profile instance\n", __func__);
761         return;
762     }
763 
764     SetStateName(A2DP_PROFILE_IDLE);
765     if (profile->FindPeerByAddress(addr)->GetRestart()) {
766         profile->FindPeerByAddress(addr)->UpdateConfigure();
767     }
768     if (!profile->HasOpen() && profile->GetDisalbeTag()) {
769         profile->Disable();
770     }
771 }
772 
ProcessStartCfm(BtAddr addr, uint8_t role)773 void A2dpStateOpen::ProcessStartCfm(BtAddr addr, uint8_t role)
774 {
775     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
776 
777     A2dpProfile *profile = GetProfileInstance(role);
778     uint8_t gavdpRole = A2DP_ROLE_INT;
779     if (profile == nullptr) {
780         LOG_ERROR("[A2dpStateOpen]%{public}s Failed to get profile instance\n", __func__);
781         return;
782     }
783 
784     SetStateName(A2DP_PROFILE_STREAMING);
785     profile->AudioStateChangedNotify(addr, A2DP_IS_PLAYING, (void *)&gavdpRole);
786 
787     if (role == A2DP_ROLE_SOURCE) {
788         profile->NotifyEncoder(addr);
789     } else {
790         profile->NotifyDecoder(addr);
791     }
792 }
793 
ProcessDelayReportInd(A2dpAvdtMsgData msgData, uint8_t role) const794 void A2dpStateOpen::ProcessDelayReportInd(A2dpAvdtMsgData msgData, uint8_t role) const
795 {
796     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
797     if (role == A2DP_ROLE_SINK) {
798         LOG_INFO("[A2dpStateOpen]%{public}s sink role does not handle delay report ind return.", __func__);
799         return;
800     }
801 
802     A2dpProfile *profile = GetProfileInstance(role);
803     if (profile == nullptr) {
804         LOG_ERROR("[A2dpStateOpen]%{public}s Failed to get profile instance\n", __func__);
805         return;
806     }
807 
808     BtAddr addr =  msgData.delayReportInfo.addr;
809     uint16_t value = msgData.delayReportInfo.delayValue;
810     profile->DelayReportNotify(addr, value);
811 }
812 
ProcessTimeout(BtAddr addr, uint8_t role)813 void A2dpStateOpen::ProcessTimeout(BtAddr addr, uint8_t role)
814 {
815     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
816 
817     A2dpAvdtp avdtp(role);
818 
819     SetStateName(A2DP_PROFILE_CLOSING);
820     avdtp.DisconnectReq(addr);
821 }
822 
ProcessSuspendReq(uint16_t handle, uint8_t role)823 void A2dpStateOpen::ProcessSuspendReq(uint16_t handle, uint8_t role)
824 {
825     LOG_INFO("[A2dpStateOpen]%{public}s role(%u)\n", __func__, role);
826 
827     A2dpAvdtp avdtp(role);
828     avdtp.SuspendReq(handle, label_);
829 }
830 
ProcessSuspendInd(A2dpAvdtMsgData msgData, uint8_t role)831 void A2dpStateOpen::ProcessSuspendInd(A2dpAvdtMsgData msgData, uint8_t role)
832 {
833     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
834 
835     A2dpProfile *profile = GetProfileInstance(role);
836     uint8_t gavdpRole = A2DP_ROLE_ACP;
837     A2dpAvdtp avdtp(role);
838     if (profile == nullptr) {
839         LOG_ERROR("[A2dpStateOpen]%{public}s Failed to get profile instance\n", __func__);
840         return;
841     }
842 
843     /// check the stream status
844     if (avdtp.SuspendRsp(msgData.stream.handle, msgData.stream.label, 0, 0) == AVDT_SUCCESS) {
845         profile->AudioStateChangedNotify(msgData.stream.addr, A2DP_NOT_PLAYING, (void *)&gavdpRole);
846     }
847 }
848 
ProcessSuspendCfm(A2dpAvdtMsgData msgData, uint8_t role)849 void A2dpStateOpen::ProcessSuspendCfm(A2dpAvdtMsgData msgData, uint8_t role)
850 {
851     LOG_INFO("[A2dpStateOpen]%{public}s\n", __func__);
852 
853     A2dpProfile *profile = GetProfileInstance(role);
854     uint8_t gavdpRole = A2DP_ROLE_INT;
855     A2dpAvdtp avdtp(role);
856     if (profile == nullptr) {
857         LOG_ERROR("[A2dpStateOpen]%{public}s Failed to get profile instance\n", __func__);
858         return;
859     }
860 
861     if (role == A2DP_ROLE_SOURCE) {
862         IPowerManager::GetInstance().StatusUpdate(RequestStatus::CONNECT_ON,
863             PROFILE_NAME_A2DP_SRC,
864             bluetooth::RawAddress::ConvertToString(msgData.stream.addr.addr));
865     }
866 
867     profile->AudioStateChangedNotify(msgData.stream.addr, A2DP_NOT_PLAYING, (void *)&gavdpRole);
868     A2dpService *service = GetServiceInstance(role);
869     if (service != nullptr) {
870         std::string addr = service->GetActiveSinkDevice().GetAddress();
871         if (strcmp(addr.c_str(), RawAddress::ConvertToString(msgData.stream.addr.addr).GetAddress().c_str()) != 0) {
872             service->ActiveDevice();
873         }
874     }
875     if (profile->GetDisalbeTag()) {
876         profile->CloseAll();
877     }
878     if (profile->FindPeerByAddress(msgData.stream.addr)->GetRestart()) {
879         avdtp.ReconfigureReq(
880             msgData.stream.handle, profile->FindPeerByAddress(msgData.stream.addr)->GetReconfig(), label_);
881     }
882 }
883 
Entry()884 void A2dpStateStreaming::Entry()
885 {
886     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
887     A2dpCodecThread *codecThread = A2dpCodecThread::GetInstance();
888     if (codecThread == nullptr) {
889         return;
890     }
891     if (codecThread->GetInitStatus()) {
892         codecThread->StartTimer();
893     } else {
894         if (codecThread != nullptr) {
895             codecThread->StartA2dpCodecThread();
896         }
897     }
898 }
899 
Exit()900 void A2dpStateStreaming::Exit()
901 {
902     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
903     A2dpCodecThread *codecThread = A2dpCodecThread::GetInstance();
904     if (codecThread->GetInitStatus()) {
905         codecThread->StopTimer();
906     }
907 }
908 
Dispatch(const utility::Message &msg)909 bool A2dpStateStreaming::Dispatch(const utility::Message &msg)
910 {
911     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
912     if (msg.arg2_ == nullptr) {
913         LOG_ERROR("[A2dpStateStreaming]%{public}s input error parameter\n", __func__);
914         return false;
915     }
916     A2dpAvdtMsgData msgData = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->a2dpMsg;
917     uint8_t role = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->role;
918     A2dpAvdtp avdtp(role);
919     uint8_t label = 0;
920 
921     switch (msg.what_) {
922         case EVT_GET_ALLCAP_REQ:
923             avdtp.GetAllCapabilityReq(msgData.stream.addr, msgData.stream.acpSeid, label);
924             break;
925         case EVT_GET_CAP_REQ:
926             avdtp.GetCapabilityReq(msgData.stream.addr, msgData.stream.acpSeid, label);
927             break;
928         case EVT_SUSPEND_IND:
929             ProcessSuspendInd(msgData, role);
930             break;
931         case EVT_CLOSE_IND:
932             SetStateName(A2DP_PROFILE_IDLE);
933             avdtp.CloseRsp(msgData.stream.handle, msgData.stream.label, 0);
934             break;
935         case EVT_DISCONNECT_IND:
936             ProcessDisconnectInd(msgData.stream.addr, msgData.stream.handle, role);
937             break;
938         case EVT_DISCONNECT_REQ:
939             ProcessDisconnectReq(msgData.connectInfo.addr, role);
940             break;
941         case EVT_CLOSE_REQ:
942             avdtp.CloseReq(msgData.stream.handle);
943             break;
944         case EVT_SUSPEND_REQ:
945             ProcessSuspendReq(msgData.stream.handle, role);
946             break;
947         case EVT_CLOSE_CFM:
948             ProcessCloseCfm(msgData.stream.addr, role);
949             break;
950         case EVT_SUSPEND_CFM:
951             ProcessSuspendCfm(msgData, role);
952             break;
953         case EVT_WRITE_CFM:
954             ProcessWriteCfm(msgData, role);
955             break;
956         default:
957             ProcessSubStreamingState(msgData, role, msg.what_);
958             break;
959     }
960     return true;
961 }
962 
SetStateName(std::string state)963 void A2dpStateStreaming::SetStateName(std::string state)
964 {
965     std::lock_guard<std::recursive_mutex> lock(g_stateMutex);
966     Transition(state);
967 }
968 
ProcessSubStreamingState(A2dpAvdtMsgData msgData, uint8_t role, int cmd)969 void A2dpStateStreaming::ProcessSubStreamingState(A2dpAvdtMsgData msgData, uint8_t role, int cmd)
970 {
971     LOG_INFO("[A2dpStateStreaming]%{public}s cmd(%{public}d)\n", __func__, cmd);
972 
973     A2dpAvdtp avdtp(role);
974     switch (cmd) {
975         case EVT_DELAY_IND:
976             ProcessDelayReportInd(msgData, role);
977             break;
978         case EVT_START_REQ:
979             LOG_INFO("[A2dpStateStreaming]%{public}s EVT_START_REQ\n", __func__);
980             avdtp.StartReq(msgData.stream.handle, label_);
981             break;
982         case EVT_START_IND:
983             LOG_INFO("[A2dpStateStreaming]%{public}s EVT_START_IND)\n", __func__);
984             ProcessStartInd(msgData, role);
985             break;
986         case EVT_START_CFM:
987             LOG_INFO("[A2dpStateStreaming]%{public}s EVT_START_CFM)\n", __func__);
988             ProcessStartCfm(msgData.stream.addr, role);
989             break;
990         default:
991             break;
992     }
993 }
994 
ProcessStartInd(A2dpAvdtMsgData msgData, uint8_t role)995 void A2dpStateStreaming::ProcessStartInd(A2dpAvdtMsgData msgData, uint8_t role)
996 {
997     LOG_INFO("[A2dpStateStreaming] ProcessStartInd %{public}s\n", __func__);
998 
999     A2dpProfile *profile = GetProfileInstance(role);
1000     uint8_t gavdpRole = A2DP_ROLE_ACP;
1001     A2dpAvdtp avdtp(role);
1002     if (profile == nullptr) {
1003         LOG_ERROR("[A2dpStateStreaming]%{public}s Failed to get profile instance\n", __func__);
1004         return;
1005     }
1006 
1007     if (avdtp.StartRsp(msgData.stream.handle, msgData.stream.label, 0, 0) == AVDT_SUCCESS) {
1008         profile->AudioStateChangedNotify(msgData.stream.addr, A2DP_IS_PLAYING, (void *)&gavdpRole);
1009         if (role == A2DP_ROLE_SOURCE) {
1010             profile->NotifyEncoder(msgData.stream.addr);
1011         } else {
1012             profile->NotifyDecoder(msgData.stream.addr);
1013         }
1014     } else {
1015         SetStateName(A2DP_PROFILE_OPEN);
1016     }
1017 }
1018 
ProcessStartCfm(BtAddr addr, uint8_t role)1019 void A2dpStateStreaming::ProcessStartCfm(BtAddr addr, uint8_t role)
1020 {
1021     LOG_INFO("[A2dpStateStreaming] ProcessStartCfm %{public}s\n", __func__);
1022 
1023     A2dpProfile *profile = GetProfileInstance(role);
1024     uint8_t gavdpRole = A2DP_ROLE_INT;
1025     if (profile == nullptr) {
1026         LOG_ERROR("[A2dpStateStreaming]%{public}s Failed to get profile instance\n", __func__);
1027         return;
1028     }
1029 
1030     profile->AudioStateChangedNotify(addr, A2DP_IS_PLAYING, (void *)&gavdpRole);
1031 
1032     if (role == A2DP_ROLE_SOURCE) {
1033         profile->NotifyEncoder(addr);
1034     } else {
1035         profile->NotifyDecoder(addr);
1036     }
1037 }
1038 
ProcessSuspendInd(A2dpAvdtMsgData msgData, uint8_t role)1039 void A2dpStateStreaming::ProcessSuspendInd(A2dpAvdtMsgData msgData, uint8_t role)
1040 {
1041     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
1042 
1043     A2dpProfile *profile = GetProfileInstance(role);
1044     uint8_t gavdpRole = A2DP_ROLE_ACP;
1045     A2dpAvdtp avdtp(role);
1046     if (profile == nullptr) {
1047         LOG_ERROR("[A2dpStateStreaming]%{public}s Failed to get profile instance\n", __func__);
1048         return;
1049     }
1050 
1051     /// check the stream status
1052     if (avdtp.SuspendRsp(msgData.stream.handle, msgData.stream.label, 0, 0) == AVDT_SUCCESS) {
1053         SetStateName(A2DP_PROFILE_OPEN);
1054         profile->AudioStateChangedNotify(msgData.stream.addr, A2DP_NOT_PLAYING, (void *)&gavdpRole);
1055     }
1056 }
1057 
ProcessSuspendCfm(A2dpAvdtMsgData msgData, uint8_t role)1058 void A2dpStateStreaming::ProcessSuspendCfm(A2dpAvdtMsgData msgData, uint8_t role)
1059 {
1060     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
1061 
1062     A2dpProfile *profile = GetProfileInstance(role);
1063     uint8_t gavdpRole = A2DP_ROLE_INT;
1064     A2dpAvdtp avdtp(role);
1065     if (profile == nullptr) {
1066         LOG_ERROR("[A2dpStateStreaming]%{public}s Failed to get profile instance\n", __func__);
1067         return;
1068     }
1069 
1070     if (role == A2DP_ROLE_SOURCE) {
1071         IPowerManager::GetInstance().StatusUpdate(RequestStatus::CONNECT_ON,
1072             PROFILE_NAME_A2DP_SRC,
1073             bluetooth::RawAddress::ConvertToString(msgData.stream.addr.addr));
1074     }
1075     SetStateName(A2DP_PROFILE_OPEN);
1076     profile->AudioStateChangedNotify(msgData.stream.addr, A2DP_NOT_PLAYING, (void *)&gavdpRole);
1077     A2dpService *service = GetServiceInstance(role);
1078     if (service != nullptr) {
1079         std::string addr = service->GetActiveSinkDevice().GetAddress();
1080         if (strcmp(addr.c_str(), RawAddress::ConvertToString(msgData.stream.addr.addr).GetAddress().c_str()) != 0) {
1081             service->ActiveDevice();
1082         }
1083     }
1084     if (profile->GetDisalbeTag()) {
1085         profile->CloseAll();
1086     }
1087     if (profile->FindPeerByAddress(msgData.stream.addr)->GetRestart()) {
1088         avdtp.ReconfigureReq(
1089             msgData.stream.handle, profile->FindPeerByAddress(msgData.stream.addr)->GetReconfig(), label_);
1090     }
1091 }
1092 
ProcessWriteCfm(A2dpAvdtMsgData msgData, uint8_t role)1093 void A2dpStateStreaming::ProcessWriteCfm(A2dpAvdtMsgData msgData, uint8_t role)
1094 {
1095     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
1096     A2dpProfile *profile = GetProfileInstance(A2DP_ROLE_SOURCE);
1097     profile->DequeuePacket();
1098 }
1099 
ProcessDisconnectReq(BtAddr addr, uint8_t role)1100 void A2dpStateStreaming::ProcessDisconnectReq(BtAddr addr, uint8_t role)
1101 {
1102     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
1103 
1104     A2dpAvdtp avdtp(role);
1105 
1106     SetStateName(A2DP_PROFILE_CLOSING);
1107     avdtp.DisconnectReq(addr);
1108     if (role == A2DP_ROLE_SOURCE) {
1109         IPowerManager::GetInstance().StatusUpdate(
1110             RequestStatus::IDLE, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
1111     }
1112 }
1113 
ProcessSuspendReq(uint16_t handle, uint8_t role)1114 void A2dpStateStreaming::ProcessSuspendReq(uint16_t handle, uint8_t role)
1115 {
1116     LOG_INFO("[A2dpStateStreaming]%{public}s role(%u)\n", __func__, role);
1117 
1118     A2dpAvdtp avdtp(role);
1119     avdtp.SuspendReq(handle, label_);
1120 }
1121 
ProcessDisconnectInd(BtAddr addr, uint16_t handle, uint8_t role)1122 void A2dpStateStreaming::ProcessDisconnectInd(BtAddr addr, uint16_t handle, uint8_t role)
1123 {
1124     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
1125 
1126     CallbackParameter param = {A2DP_ROLE_ACP, false, handle};
1127     A2dpProfile *profile = GetProfileInstance(role);
1128     uint8_t gavdpRole = A2DP_ROLE_ACP;
1129     if (profile == nullptr) {
1130         LOG_ERROR("[A2dpStateStreaming]%{public}s Failed to get profile instance\n", __func__);
1131         return;
1132     }
1133 
1134     if (role == A2DP_ROLE_SOURCE) {
1135         IPowerManager::GetInstance().StatusUpdate(
1136             RequestStatus::CONNECT_OFF, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
1137     }
1138     SetStateName(A2DP_PROFILE_IDLE);
1139     profile->AudioStateChangedNotify(addr, A2DP_NOT_PLAYING, (void *)&gavdpRole);
1140     profile->ConnectStateChangedNotify(addr, STREAM_DISCONNECT, (void *)&param);
1141 }
1142 
ProcessCloseCfm(BtAddr addr, uint8_t role)1143 void A2dpStateStreaming::ProcessCloseCfm(BtAddr addr, uint8_t role)
1144 {
1145     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
1146 
1147     A2dpProfile *profile = GetProfileInstance(role);
1148     if (profile == nullptr) {
1149         LOG_ERROR("[A2dpStateOpen]%{public}s Failed to get profile instance\n", __func__);
1150         return;
1151     }
1152 
1153     if (role == A2DP_ROLE_SOURCE) {
1154         IPowerManager::GetInstance().StatusUpdate(
1155             RequestStatus::IDLE, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
1156     }
1157 
1158     SetStateName(A2DP_PROFILE_IDLE);
1159     if (profile->FindPeerByAddress(addr)->GetRestart()) {
1160         profile->FindPeerByAddress(addr)->UpdateConfigure();
1161     }
1162 }
1163 
ProcessDelayReportInd(A2dpAvdtMsgData msgData, uint8_t role) const1164 void A2dpStateStreaming::ProcessDelayReportInd(A2dpAvdtMsgData msgData, uint8_t role) const
1165 {
1166     LOG_INFO("[A2dpStateStreaming]%{public}s\n", __func__);
1167     if (role == A2DP_ROLE_SINK) {
1168         LOG_INFO("[A2dpStateStreaming]%{public}s sink role does not handle delay report ind return.", __func__);
1169         return;
1170     }
1171 
1172     A2dpProfile *profile = GetProfileInstance(role);
1173     if (profile == nullptr) {
1174         LOG_ERROR("[A2dpStateStreaming]%{public}s Failed to get profile instance\n", __func__);
1175         return;
1176     }
1177 
1178     BtAddr addr =  msgData.delayReportInfo.addr;
1179     uint16_t value = msgData.delayReportInfo.delayValue;
1180     profile->DelayReportNotify(addr, value);
1181 }
1182 
Dispatch(const utility::Message &msg)1183 bool A2dpStateClosing::Dispatch(const utility::Message &msg)
1184 {
1185     LOG_INFO("[A2dpStateClosing]%{public}s\n", __func__);
1186 
1187     if (msg.arg2_ == nullptr) {
1188         LOG_ERROR("[A2dpStateClosing]%{public}s input error parameter\n", __func__);
1189         return false;
1190     }
1191 
1192     A2dpAvdtMsgData msgData = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->a2dpMsg;
1193     uint8_t role = (static_cast<A2dpAvdtMsg*>(msg.arg2_))->role;
1194 
1195     switch (msg.what_) {
1196         case EVT_DISCONNECT_IND:
1197             ProcessDisconnectInd(msgData.stream.addr, msgData.stream.handle, role);
1198             break;
1199         case EVT_CLOSE_TRANS_IND:
1200             ProcessCloseStreamInd(msgData.stream.addr, msgData.stream.handle, role);
1201             break;
1202         case EVT_DISCONNECT_CFM:
1203             ProcessDisconnectCfm(msgData.stream.addr, msgData.stream.handle, role);
1204             break;
1205         default:
1206             break;
1207     }
1208     return true;
1209 }
1210 
SetStateName(std::string state)1211 void A2dpStateClosing::SetStateName(std::string state)
1212 {
1213     std::lock_guard<std::recursive_mutex> lock(g_stateMutex);
1214     Transition(state);
1215 }
1216 
ProcessCloseStreamInd(BtAddr addr, uint16_t handle, uint8_t role)1217 void A2dpStateClosing::ProcessCloseStreamInd(BtAddr addr, uint16_t handle, uint8_t role)
1218 {
1219     LOG_INFO("[A2dpStateClosing]%{public}s\n", __func__);
1220     A2dpProfile *profile = GetProfileInstance(role);
1221     if (profile == nullptr) {
1222         LOG_ERROR("[A2dpStateClosing]%{public}s Failed to get profile instance\n", __func__);
1223         return;
1224     }
1225 
1226     SetStateName(A2DP_PROFILE_IDLE);
1227     A2dpProfilePeer *peer = profile->FindOrCreatePeer(addr, role);
1228     if (peer == nullptr) {
1229         LOG_ERROR("[A2dpStateClosing]%{public}s Failed to get profile Peer\n", __func__);
1230         return;
1231     }
1232     peer->SetCurrentCmd(EVT_DISCONNECT_IND);
1233     peer->SetSignalingTimer(A2DP_ACCEPT_SIGNALLING_TIMEOUT_MS, false);
1234 }
1235 
ProcessDisconnectInd(BtAddr addr, uint16_t handle, uint8_t role)1236 void A2dpStateClosing::ProcessDisconnectInd(BtAddr addr, uint16_t handle, uint8_t role)
1237 {
1238     LOG_INFO("[A2dpStateClosing]%{public}s\n", __func__);
1239 
1240     CallbackParameter param = {A2DP_ROLE_INT, false, handle};
1241     A2dpProfile *profile = GetProfileInstance(role);
1242     if (profile == nullptr) {
1243         LOG_ERROR("[A2dpStateClosing]%{public}s Failed to get profile instance\n", __func__);
1244         return;
1245     }
1246 
1247     if (role == A2DP_ROLE_SOURCE) {
1248         IPowerManager::GetInstance().StatusUpdate(
1249             RequestStatus::CONNECT_OFF, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
1250     }
1251 
1252     SetStateName(A2DP_PROFILE_IDLE);
1253     profile->ConnectStateChangedNotify(addr, STREAM_DISCONNECT, (void *)&param);
1254 }
1255 
ProcessDisconnectCfm(BtAddr addr, uint16_t handle, uint8_t role)1256 void A2dpStateClosing::ProcessDisconnectCfm(BtAddr addr, uint16_t handle, uint8_t role)
1257 {
1258     LOG_INFO("[A2dpStateClosing]%{public}s\n", __func__);
1259 
1260     CallbackParameter param = {A2DP_ROLE_INT, true, handle};
1261     uint8_t gavdpRole = A2DP_ROLE_INT;
1262     A2dpProfile *profile = GetProfileInstance(role);
1263     if (profile == nullptr) {
1264         LOG_ERROR("[A2dpStateClosing]%{public}s Failed to get profile instance\n", __func__);
1265         return;
1266     }
1267 
1268     if (role == A2DP_ROLE_SOURCE) {
1269         IPowerManager::GetInstance().StatusUpdate(
1270             RequestStatus::CONNECT_OFF, PROFILE_NAME_A2DP_SRC, bluetooth::RawAddress::ConvertToString(addr.addr));
1271     }
1272 
1273     SetStateName(A2DP_PROFILE_IDLE);
1274     profile->AudioStateChangedNotify(addr, A2DP_NOT_PLAYING, (void *)&gavdpRole);
1275     profile->ConnectStateChangedNotify(addr, STREAM_DISCONNECT, (void *)&param);
1276 }
1277 
GetStateName(void) const1278 const std::string A2dpStateMachine::GetStateName(void) const
1279 {
1280     std::lock_guard<std::recursive_mutex> lock(g_stateMutex);
1281     return GetState()->Name();
1282 }
1283 }  // namespace bluetooth
1284 }  // namespace OHOS