1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "migrate_avsession_server.h"
17
18 #include <chrono>
19 #include <thread>
20
21 #include "audio_device_manager.h"
22 #include "avsession_errors.h"
23 #include "avsession_item.h"
24 #include "avsession_log.h"
25 #include "avsession_service.h"
26 #include "softbus/softbus_session_utils.h"
27 #include "migrate_avsession_constant.h"
28 #include "avsession_pixel_map_adapter.h"
29 #include "pixel_map.h"
30 #include "image_packer.h"
31 #include "avsession_event_handler.h"
32
33 namespace OHOS::AVSession {
34
LocalFrontSessionArrive(std::string & sessionId)35 void MigrateAVSessionServer::LocalFrontSessionArrive(std::string &sessionId)
36 {
37 if (sessionId.empty()) {
38 SLOGE("LocalFrontSessionArrive with sessionId EMPTY");
39 return;
40 }
41 AVSessionEventHandler::GetInstance().AVSessionPostTask(
42 [this, sessionId]() {
43 SLOGI("LocalFrontSessionArrive with sessionId:%{public}s",
44 AVSessionUtils::GetAnonySessionId(sessionId).c_str());
45 CreateController(sessionId);
46 sptr<AVControllerItem> controller = nullptr;
47 {
48 std::lock_guard lockGuard(migrateControllerLock_);
49 controller = playerIdToControllerMap_[sessionId];
50 CHECK_AND_RETURN_LOG(controller != nullptr, "LocalFrontSessionArrive but get controller null");
51 }
52
53 controller->isFromSession_ = false;
54 lastSessionId_ = sessionId;
55 if (isSoftbusConnecting_) {
56 UpdateFrontSessionInfoToRemote(controller);
57 } else {
58 SLOGE("LocalFrontSessionArrive without connect");
59 }
60 SLOGI("LocalFrontSessionArrive finish");
61 },
62 "LocalFrontSessionArrive");
63 }
64
LocalFrontSessionChange(std::string & sessionId)65 void MigrateAVSessionServer::LocalFrontSessionChange(std::string &sessionId)
66 {
67 SLOGI("LocalFrontSessionChange in");
68 std::lock_guard lockGuard(migrateControllerLock_);
69 sptr<AVControllerItem> controller = playerIdToControllerMap_[lastSessionId_];
70 if (controller != nullptr) {
71 controller->UnregisterAVControllerCallback();
72 } else {
73 SLOGE("LocalFrontSessionLeave but get controller null");
74 }
75 ClearCacheBySessionId(sessionId);
76 auto it = playerIdToControllerMap_.find(sessionId);
77 if (it != playerIdToControllerMap_.end()) {
78 playerIdToControllerMap_.erase(it);
79 } else {
80 SLOGE("LocalFrontSessionLeave no find sessionId:%{public}s",
81 AVSessionUtils::GetAnonySessionId(sessionId).c_str());
82 }
83 LocalFrontSessionArrive(sessionId);
84 }
85
LocalFrontSessionLeave(std::string & sessionId)86 void MigrateAVSessionServer::LocalFrontSessionLeave(std::string &sessionId)
87 {
88 SLOGI("LocalFrontSessionLeave in");
89 std::lock_guard lockGuard(migrateControllerLock_);
90 sptr<AVControllerItem> controller = playerIdToControllerMap_[lastSessionId_];
91 if (controller != nullptr) {
92 controller->UnregisterAVControllerCallback();
93 } else {
94 SLOGE("LocalFrontSessionLeave but get controller null");
95 }
96 ClearCacheBySessionId(sessionId);
97 auto it = playerIdToControllerMap_.find(sessionId);
98 if (it != playerIdToControllerMap_.end()) {
99 playerIdToControllerMap_.erase(it);
100 } else {
101 SLOGE("LocalFrontSessionLeave no find sessionId:%{public}s",
102 AVSessionUtils::GetAnonySessionId(sessionId).c_str());
103 }
104 UpdateEmptyInfoToRemote();
105 lastSessionId_ = "";
106 }
107
HandleFocusPlaybackStateChange(const std::string & sessionId,const AVPlaybackState & state)108 void MigrateAVSessionServer::HandleFocusPlaybackStateChange(const std::string &sessionId, const AVPlaybackState &state)
109 {
110 DoPlaybackStateSyncToRemote(state);
111 }
112
HandleFocusMetaDataChange(const std::string & sessionId,const AVMetaData & data)113 void MigrateAVSessionServer::HandleFocusMetaDataChange(const std::string &sessionId, const AVMetaData &data)
114 {
115 std::shared_ptr<AVSessionPixelMap> innerPixelMap = data.GetMediaImage();
116 if (innerPixelMap != nullptr) {
117 DoMediaImageSyncToRemote(innerPixelMap);
118 }
119 DoMetaDataSyncToRemote(data);
120 }
121
HandleFocusValidCommandChange(const std::string & sessionId,const std::vector<int32_t> & cmds)122 void MigrateAVSessionServer::HandleFocusValidCommandChange(const std::string &sessionId,
123 const std::vector<int32_t> &cmds)
124 {
125 DoValidCommandsSyncToRemote(cmds);
126 }
127
DoMetaDataSyncToRemote(const AVMetaData & data)128 void MigrateAVSessionServer::DoMetaDataSyncToRemote(const AVMetaData& data)
129 {
130 Json::Value metaData;
131 curAssetId_ = data.GetAssetId();
132 metaData[METADATA_ASSET_ID] = DEFAULT_STRING;
133 if (data.GetMetaMask().test(AVMetaData::META_KEY_TITLE)) {
134 metaData[METADATA_TITLE] = data.GetTitle();
135 }
136 if (data.GetMetaMask().test(AVMetaData::META_KEY_ARTIST)) {
137 metaData[METADATA_ARTIST] = data.GetArtist();
138 }
139 {
140 std::lock_guard lockGuard(cacheJsonLock_);
141 if (metaData == metaDataCache_ || metaData.empty()) {
142 SLOGI("DoMetaDataSyncToRemote with repeat title:%{public}s|empty:%{public}d",
143 data.GetTitle().c_str(), metaData.empty());
144 return;
145 }
146 }
147 std::string msg = std::string({MSG_HEAD_MODE, SYNC_FOCUS_META_INFO});
148 SoftbusSessionUtils::TransferJsonToStr(metaData, msg);
149 AVSessionEventHandler::GetInstance().AVSessionPostTask(
150 [this, msg]() {
151 SendByte(deviceId_, msg);
152 },
153 "DoMetaDataSyncToRemote");
154 SLOGI("DoMetaDataSyncToRemote async title:%{public}s done", data.GetTitle().c_str());
155 {
156 std::lock_guard lockGuard(cacheJsonLock_);
157 metaDataCache_ = metaData;
158 }
159 }
160
DoMediaImageSyncToRemote(std::shared_ptr<AVSessionPixelMap> innerPixelMap)161 void MigrateAVSessionServer::DoMediaImageSyncToRemote(std::shared_ptr<AVSessionPixelMap> innerPixelMap)
162 {
163 CHECK_AND_RETURN_LOG(innerPixelMap != nullptr, "DoMediaImageSyncToRemote with innerPixelMap null");
164 std::vector<uint8_t> imgBuffer = innerPixelMap->GetInnerImgBuffer();
165 SLOGI("DoMediaImageSyncToRemote with img size:%{public}d", static_cast<int>(imgBuffer.size()));
166
167 if (imgBuffer.size() <= 0) {
168 std::string msg = std::string({MSG_HEAD_MODE, SYNC_FOCUS_MEDIA_IMAGE});
169 SoftbusSessionUtils::TransferJsonToStr(DEFAULT_STRING, msg);
170 AVSessionEventHandler::GetInstance().AVSessionPostTask(
171 [this, msg]() {
172 SendByte(deviceId_, msg);
173 },
174 "DoMediaImageSyncToRemote_EMPTY");
175 return;
176 }
177 std::shared_ptr<Media::PixelMap> pixelMap;
178 pixelMap = AVSessionPixelMapAdapter::ConvertFromInner(innerPixelMap);
179 CHECK_AND_RETURN_LOG(pixelMap != nullptr, "DoMediaImageSyncToRemote with pixelMap null");
180 std::shared_ptr<AVSessionPixelMap> innerPixelMapMin = AVSessionPixelMapAdapter::ConvertToInnerWithMinSize(pixelMap);
181 CHECK_AND_RETURN_LOG(innerPixelMapMin != nullptr, "DoMediaImageSyncToRemote with innerPixelMapMin null");
182 std::vector<uint8_t> imgBufferMin = innerPixelMapMin->GetInnerImgBuffer();
183 std::string imgStrMin(imgBufferMin.begin(), imgBufferMin.end());
184 std::string msg = std::string({MSG_HEAD_MODE, SYNC_FOCUS_MEDIA_IMAGE});
185 msg += imgStrMin;
186
187 AVSessionEventHandler::GetInstance().AVSessionPostTask(
188 [this, msg]() {
189 SendByte(deviceId_, msg);
190 },
191 "DoMediaImageSyncToRemote");
192 SLOGI("DoMediaImageSyncToRemote async size:%{public}d", static_cast<int>(msg.size()));
193 }
194
DoPlaybackStateSyncToRemote(const AVPlaybackState & state)195 void MigrateAVSessionServer::DoPlaybackStateSyncToRemote(const AVPlaybackState& state)
196 {
197 Json::Value playbackState;
198 if (state.GetMask().test(AVPlaybackState::PLAYBACK_KEY_STATE)) {
199 playbackState[PLAYBACK_STATE] = state.GetState();
200 }
201 if (state.GetMask().test(AVPlaybackState::PLAYBACK_KEY_IS_FAVORITE)) {
202 playbackState[FAVOR_STATE] = state.GetFavorite();
203 }
204 {
205 std::lock_guard lockGuard(cacheJsonLock_);
206 if (playbackState == playbackStateCache_ || playbackState.empty()) {
207 SLOGI("DoPlaybackStateSyncToRemote with repeat state:%{public}d|isFavor:%{public}d|empty:%{public}d",
208 state.GetState(), state.GetFavorite(), playbackState.empty());
209 return;
210 }
211 }
212 std::string msg = std::string({MSG_HEAD_MODE, SYNC_FOCUS_PLAY_STATE});
213 SoftbusSessionUtils::TransferJsonToStr(playbackState, msg);
214 AVSessionEventHandler::GetInstance().AVSessionPostTask(
215 [this, msg]() {
216 SendByte(deviceId_, msg);
217 },
218 "DoPlaybackStateSyncToRemote");
219 SLOGI("DoPlaybackStateSyncToRemote sync state:%{public}d|isFavor:%{public}d done",
220 state.GetState(), state.GetFavorite());
221 {
222 std::lock_guard lockGuard(cacheJsonLock_);
223 playbackStateCache_ = playbackState;
224 }
225 }
226
DoValidCommandsSyncToRemote(const std::vector<int32_t> & commands)227 void MigrateAVSessionServer::DoValidCommandsSyncToRemote(const std::vector<int32_t>& commands)
228 {
229 SLOGI("DoValidCommandsSyncToRemote async commands num:%{public}d", static_cast<int>(commands.size()));
230 Json::Value validCommands;
231 std::string commandsStr;
232 for (int32_t cmd : commands) {
233 commandsStr.push_back(static_cast<char>(cmd + '0'));
234 }
235 validCommands[VALID_COMMANDS] = commandsStr;
236 std::string msg = std::string({MSG_HEAD_MODE, SYNC_FOCUS_VALID_COMMANDS});
237 SoftbusSessionUtils::TransferJsonToStr(validCommands, msg);
238 AVSessionEventHandler::GetInstance().AVSessionPostTask(
239 [this, msg]() {
240 SendByte(deviceId_, msg);
241 },
242 "DoValidCommandsSyncToRemote");
243 }
244
DoBundleInfoSyncToRemote(sptr<AVControllerItem> controller)245 void MigrateAVSessionServer::DoBundleInfoSyncToRemote(sptr<AVControllerItem> controller)
246 {
247 CHECK_AND_RETURN_LOG(controller != nullptr, "DoBundleInfoSyncToRemote with controller null");
248 AppExecFwk::ElementName elementName = controller->GetElementOfSession();
249 std::string bundleName = elementName.GetBundleName();
250 std::string iconStr;
251 if (!BundleStatusAdapter::GetInstance().GetBundleIcon(bundleName, iconStr)) {
252 SLOGE("DoBundleInfoSyncToRemote get bundle icon fail for bundleName:%{public}s", bundleName.c_str());
253 }
254
255 uint32_t errorCode = 0;
256 Media::SourceOptions opts;
257 auto imageSource = Media::ImageSource::CreateImageSource(reinterpret_cast<const uint8_t*>(iconStr.c_str()),
258 iconStr.length(), opts, errorCode);
259 CHECK_AND_RETURN_LOG(imageSource != nullptr,
260 "DoBundleInfoSyncToRemote CreateImageSource fail for bundleName:%{public}s", bundleName.c_str());
261 Media::DecodeOptions decodeOpts;
262 decodeOpts.allocatorType = Media::AllocatorType::HEAP_ALLOC;
263 std::shared_ptr<Media::PixelMap> pixelMap = imageSource->CreatePixelMap(decodeOpts, errorCode);
264 CHECK_AND_RETURN_LOG(pixelMap != nullptr,
265 "DoBundleInfoSyncToRemote CreatePixelMap fail for bundleName:%{public}s", bundleName.c_str());
266
267 std::shared_ptr<AVSessionPixelMap> innerPixelMapMin = AVSessionPixelMapAdapter::ConvertToInnerWithMinSize(pixelMap);
268 CHECK_AND_RETURN_LOG(innerPixelMapMin != nullptr, "DoBundleInfoSyncToRemote with innerPixelMapMin null");
269 std::vector<uint8_t> imgBufferMin = innerPixelMapMin->GetInnerImgBuffer();
270 std::string imgStrMin(imgBufferMin.begin(), imgBufferMin.end());
271 std::string msg = std::string({MSG_HEAD_MODE, SYNC_FOCUS_BUNDLE_IMG});
272 msg += imgStrMin;
273
274 AVSessionEventHandler::GetInstance().AVSessionPostTask(
275 [this, msg]() {
276 SendByte(deviceId_, msg);
277 },
278 "DoBundleInfoSyncToRemote");
279 SLOGI("DoBundleInfoSyncToRemote async size:%{public}d", static_cast<int>(msg.size()));
280 }
281
UpdateFrontSessionInfoToRemote(sptr<AVControllerItem> controller)282 void MigrateAVSessionServer::UpdateFrontSessionInfoToRemote(sptr<AVControllerItem> controller)
283 {
284 CHECK_AND_RETURN_LOG(controller != nullptr, "UpdateFrontSessionInfoToRemote get controller null");
285 SLOGI("UpdateFrontSessionInfoToRemote with sessionId clearCache:%{public}s",
286 AVSessionUtils::GetAnonySessionId(controller->GetSessionId()).c_str());
287
288 Json::Value sessionInfo;
289 sessionInfo[MIGRATE_SESSION_ID] = controller->GetSessionId();
290 AppExecFwk::ElementName elementName = controller->GetElementOfSession();
291 sessionInfo[MIGRATE_BUNDLE_NAME] = elementName.GetBundleName();
292 sessionInfo[MIGRATE_ABILITY_NAME] = elementName.GetAbilityName();
293 std::string msg = std::string({MSG_HEAD_MODE, SYNC_FOCUS_SESSION_INFO});
294 SoftbusSessionUtils::TransferJsonToStr(sessionInfo, msg);
295 AVSessionEventHandler::GetInstance().AVSessionPostTask(
296 [this, msg]() {
297 SendByte(deviceId_, msg);
298 },
299 "UpdateFrontSessionInfoToRemote");
300
301 {
302 std::lock_guard lockGuard(cacheJsonLock_);
303 metaDataCache_.clear();
304 playbackStateCache_.clear();
305 }
306 AVMetaData metaData;
307 int32_t ret = controller->GetAVMetaData(metaData);
308 if (AVSESSION_SUCCESS == ret || ERR_INVALID_PARAM == ret) {
309 std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData.GetMediaImage();
310 if (innerPixelMap != nullptr) {
311 DoMediaImageSyncToRemote(innerPixelMap);
312 }
313 DoMetaDataSyncToRemote(metaData);
314 } else {
315 SLOGE("UpdateFrontSessionInfoToRemote get metadata fail:%{public}d", ret);
316 }
317
318 AVPlaybackState playbackState;
319 ret = controller->GetAVPlaybackState(playbackState);
320 if (AVSESSION_SUCCESS == ret) {
321 DoPlaybackStateSyncToRemote(playbackState);
322 } else {
323 SLOGE("UpdateFrontSessionInfoToRemote get playbackstate fail:%{public}d", ret);
324 }
325
326 std::vector<int32_t> commands;
327 controller->GetValidCommands(commands);
328 DoValidCommandsSyncToRemote(commands);
329 DoBundleInfoSyncToRemote(controller);
330 SLOGI("UpdateFrontSessionInfoToRemote done");
331 }
332
UpdateEmptyInfoToRemote()333 void MigrateAVSessionServer::UpdateEmptyInfoToRemote()
334 {
335 SLOGI("UpdateEmptyInfoToRemote in async");
336 Json::Value sessionInfo;
337 sessionInfo[MIGRATE_SESSION_ID] = EMPTY_SESSION;
338 std::string msg = std::string({MSG_HEAD_MODE, SYNC_FOCUS_SESSION_INFO});
339 SoftbusSessionUtils::TransferJsonToStr(sessionInfo, msg);
340 AVSessionEventHandler::GetInstance().AVSessionPostTask(
341 [this, msg]() {
342 SendByte(deviceId_, msg);
343 },
344 "UpdateEmptyInfoToRemote");
345 }
346
ProcFromNext(const std::string & deviceId,const std::string & data)347 void MigrateAVSessionServer::ProcFromNext(const std::string &deviceId, const std::string &data)
348 {
349 if (data.length() <= MSG_HEAD_LENGTH) {
350 SLOGE("ProcFromNext with data too short:%{public}s", data.c_str());
351 return;
352 }
353 int32_t messageType = data[1];
354 std::string commandStr = data.substr(MSG_HEAD_LENGTH);
355 Json::Value commandJsonValue;
356 if (!SoftbusSessionUtils::TransferStrToJson(commandStr, commandJsonValue)) {
357 SLOGE("ProcFromNext parse json fail");
358 return;
359 }
360
361 switch (messageType) {
362 case SYNC_COMMAND:
363 ProcControlCommandFromNext(commandJsonValue);
364 break;
365 case SYNC_SET_VOLUME_COMMAND:
366 VolumeControlCommand(commandJsonValue);
367 break;
368 case SYNC_SWITCH_AUDIO_DEVICE_COMMAND:
369 SwitchAudioDeviceCommand(commandJsonValue);
370 break;
371 case COLD_START:
372 ProcessColdStartFromNext(commandJsonValue);
373 break;
374 default:
375 SLOGE("messageType %{public}d not support", messageType);
376 break;
377 }
378 }
379
ProcControlCommandFromNext(Json::Value commandJsonValue)380 void MigrateAVSessionServer::ProcControlCommandFromNext(Json::Value commandJsonValue)
381 {
382 int32_t commandCode = -1;
383 std::string commandArgs;
384 if (commandJsonValue.isMember(COMMAND_CODE)) {
385 commandCode = commandJsonValue[COMMAND_CODE].isInt() ?
386 commandJsonValue[COMMAND_CODE].asInt() : DEFAULT_NUM;
387 }
388 if (commandJsonValue.isMember(COMMAND_ARGS)) {
389 commandArgs = commandJsonValue[COMMAND_ARGS].isString() ?
390 commandJsonValue[COMMAND_ARGS].asString() : "";
391 }
392
393 sptr<AVControllerItem> controller = nullptr;
394 {
395 std::lock_guard lockGuard(migrateControllerLock_);
396 controller = playerIdToControllerMap_[lastSessionId_];
397 CHECK_AND_RETURN_LOG(controller != nullptr, "ProcControlCommandFromNext but get controller null");
398 }
399 AVControlCommand command;
400 if (AVSESSION_SUCCESS == command.SetCommand(commandCode)) {
401 if (commandCode == AVControlCommand::SESSION_CMD_TOGGLE_FAVORITE) {
402 commandArgs = (commandArgs.empty() || commandArgs == DEFAULT_STRING) ? curAssetId_ : commandArgs;
403 command.SetAssetId(commandArgs);
404 SLOGI("ProcControlCommandFromNext toggle fav for:%{public}s", commandArgs.c_str());
405 }
406 controller->SendControlCommand(command);
407 SLOGI("ProcControlCommandFromNext code:%{public}d done", commandCode);
408 } else {
409 SLOGE("ProcControlCommandFromNext parse invalid command type:%{public}d", commandCode);
410 return;
411 }
412 }
413
ProcessColdStartFromNext(Json::Value commandJsonValue)414 void MigrateAVSessionServer::ProcessColdStartFromNext(Json::Value commandJsonValue)
415 {
416 std::string bundleName;
417 if (commandJsonValue.isMember(MIGRATE_BUNDLE_NAME)) {
418 bundleName = commandJsonValue[MIGRATE_BUNDLE_NAME].isString() ?
419 commandJsonValue[MIGRATE_BUNDLE_NAME].asString() : "";
420 }
421 SLOGI("ProcessColdStartFromNext with bundleName:%{public}s", bundleName.c_str());
422 CHECK_AND_RETURN_LOG(servicePtr_ != nullptr, "ProcessColdStartFromNext without servicePtr, return");
423 servicePtr_->StartAVPlayback(bundleName, "");
424 }
425
GetVolumeKeyEventCallbackFunc()426 std::function<void(int32_t)> MigrateAVSessionServer::GetVolumeKeyEventCallbackFunc()
427 {
428 return [this](int32_t volumeNum) {
429 std::lock_guard lockGuard(migrateDeviceChangeLock_);
430 Json::Value value;
431 std::string msg = std::string({MSG_HEAD_MODE, SYNC_SET_VOLUME_COMMAND});
432 value[AUDIO_VOLUME] = volumeNum;
433 SoftbusSessionUtils::TransferJsonToStr(value, msg);
434 SLOGI("server send set volume num async:%{public}d", volumeNum);
435 AVSessionEventHandler::GetInstance().AVSessionPostTask(
436 [this, msg]() {
437 SendByte(deviceId_, msg);
438 },
439 "GetVolumeKeyEventCallbackFunc");
440 };
441 }
442
GetAvailableDeviceChangeCallbackFunc()443 AudioDeviceDescriptorsCallbackFunc MigrateAVSessionServer::GetAvailableDeviceChangeCallbackFunc()
444 {
445 return [this](const AudioDeviceDescriptorsWithSptr& devices) {
446 std::lock_guard lockGuard(migrateDeviceChangeLock_);
447 Json::Value value = ConvertAudioDeviceDescriptorsToJson(devices);
448 std::string msg = std::string({MSG_HEAD_MODE, SYNC_AVAIL_DEVICES_LIST});
449 SoftbusSessionUtils::TransferJsonToStr(value, msg);
450 SLOGI("server send get available device change callback async");
451 AVSessionEventHandler::GetInstance().AVSessionPostTask(
452 [this, msg]() {
453 SendJsonStringByte(deviceId_, msg);
454 },
455 "GetVolumeKeyEventCallbackFunc");
456 };
457 }
458
GetPreferredDeviceChangeCallbackFunc()459 AudioDeviceDescriptorsCallbackFunc MigrateAVSessionServer::GetPreferredDeviceChangeCallbackFunc()
460 {
461 return [this](const AudioDeviceDescriptorsWithSptr& devices) {
462 std::lock_guard lockGuard(migrateDeviceChangeLock_);
463 Json::Value value = ConvertAudioDeviceDescriptorsToJson(devices);
464 std::string msg = std::string({MSG_HEAD_MODE, SYNC_CURRENT_DEVICE});
465 SoftbusSessionUtils::TransferJsonToStr(value, msg);
466 SLOGI("server send get preferred device change callback async");
467 AVSessionEventHandler::GetInstance().AVSessionPostTask(
468 [this, msg]() {
469 SendJsonStringByte(deviceId_, msg);
470 },
471 "GetPreferredDeviceChangeCallbackFunc");
472 volumeKeyEventCallbackFunc_(AudioAdapter::GetInstance().GetVolume());
473 };
474 }
475
ConvertAudioDeviceDescriptorsToJson(const AudioDeviceDescriptorsWithSptr & devices)476 Json::Value MigrateAVSessionServer::ConvertAudioDeviceDescriptorsToJson(
477 const AudioDeviceDescriptorsWithSptr& devices)
478 {
479 Json::Value jsonArray(Json::arrayValue);
480 int32_t deviceNum = 0;
481 for (auto& device : devices) {
482 if (device == nullptr) {
483 continue;
484 }
485 Json::Value jsonObject = ConvertAudioDeviceDescriptorToJson(device);
486 jsonArray[deviceNum++] = jsonObject;
487 }
488 Json::Value jsonData;
489 jsonData[MEDIA_AVAILABLE_DEVICES_LIST] = jsonArray;
490
491 return jsonData;
492 }
493
ConvertAudioDeviceDescriptorToJson(const AudioDeviceDescriptorWithSptr & desc)494 Json::Value MigrateAVSessionServer::ConvertAudioDeviceDescriptorToJson(
495 const AudioDeviceDescriptorWithSptr& desc)
496 {
497 Json::Value device;
498 device[AUDIO_DEVICE_TYPE] = static_cast<int32_t>(desc->deviceType_);
499 device[AUDIO_MAC_ADDRESS] = desc->macAddress_;
500 device[AUDIO_NETWORK_ID] = desc->networkId_;
501 device[AUDIO_DEVICE_ROLE] = static_cast<int32_t>(desc->deviceRole_);
502 device[AUDIO_DEVICE_CATEGORY] = static_cast<int32_t>(desc->deviceCategory_);
503 device[AUDIO_DEVICE_NAME] = desc->deviceName_;
504
505 return device;
506 }
507
VolumeControlCommand(Json::Value commandJsonValue)508 void MigrateAVSessionServer::VolumeControlCommand(Json::Value commandJsonValue)
509 {
510 SLOGI("server recv in VolumeControlCommand case");
511 if (!commandJsonValue.isMember(AUDIO_VOLUME)) {
512 SLOGE("json parse with error member");
513 return;
514 }
515
516 int audioVolume = commandJsonValue[AUDIO_VOLUME].isInt() ? commandJsonValue[AUDIO_VOLUME].asInt() : -1;
517 AudioAdapter::GetInstance().SetVolume(audioVolume);
518 }
519
SwitchAudioDeviceCommand(Json::Value jsonObject)520 void MigrateAVSessionServer::SwitchAudioDeviceCommand(Json::Value jsonObject)
521 {
522 SLOGI("server recv in SwitchAudioDeviceCommand case");
523 int deviceCategory = jsonObject[AUDIO_DEVICE_CATEGORY].isInt() ? jsonObject[AUDIO_DEVICE_CATEGORY].asInt() : -1;
524 int deviceType = jsonObject[AUDIO_DEVICE_TYPE].isInt() ? jsonObject[AUDIO_DEVICE_TYPE].asInt() : -1;
525 int deviceRole = jsonObject[AUDIO_DEVICE_ROLE].isInt() ? jsonObject[AUDIO_DEVICE_ROLE].asInt() : -1;
526 std::string networkId = jsonObject[AUDIO_NETWORK_ID].isString() ?
527 jsonObject[AUDIO_NETWORK_ID].asString() : "ERROR_VALUE";
528 std::string deviceName = jsonObject[AUDIO_DEVICE_NAME].isString() ?
529 jsonObject[AUDIO_DEVICE_NAME].asString() : "ERROR_VALUE";
530 std::string macAddress = jsonObject[AUDIO_MAC_ADDRESS].isString() ?
531 jsonObject[AUDIO_MAC_ADDRESS].asString() : "ERROR_VALUE";
532
533 std::shared_ptr<AudioDeviceDescriptor> device = std::make_shared<AudioDeviceDescriptor>();
534 device->deviceCategory_ = static_cast<AudioStandard::DeviceCategory>(deviceCategory);
535 device->deviceType_ = static_cast<AudioStandard::DeviceType>(deviceType);
536 device->deviceRole_ = static_cast<AudioStandard::DeviceRole>(deviceRole);
537 device->networkId_ = networkId;
538 device->deviceName_ = deviceName;
539 device->macAddress_ = macAddress;
540
541 AudioAdapter::GetInstance().SelectOutputDevice(device);
542 }
543 }
544
545