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