• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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