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 *)¶m);
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 *)¶m);
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 *)¶m);
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 *>(¶m));
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 *)¶m);
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 *)¶m);
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 *)¶m);
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 *>(¶m));
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 *>(¶m));
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 *>(¶m));
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 *)¶m);
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 *)¶m);
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 *)¶m);
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 *)¶m);
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 *)¶m);
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