• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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 #ifdef RESSCHED_AUDIO_FRAMEWORK_ENABLE
16 #include "audio_observer.h"
17 
18 #include "res_sched_log.h"
19 #include "res_sched_mgr.h"
20 #include "res_type.h"
21 
22 namespace OHOS {
23 namespace ResourceSchedule {
MarshallingAudioRendererChangeInfo(const std::shared_ptr<AudioStandard::AudioRendererChangeInfo> & audioRendererChangeInfo,nlohmann::json & payload)24 void AudioObserver::MarshallingAudioRendererChangeInfo(
25     const std::shared_ptr<AudioStandard::AudioRendererChangeInfo> &audioRendererChangeInfo, nlohmann::json &payload)
26 {
27     if (audioRendererChangeInfo == nullptr) {
28         return;
29     }
30     payload["uid"] = std::to_string(audioRendererChangeInfo->clientUID);
31     payload["sessionId"] = std::to_string(audioRendererChangeInfo->sessionId);
32     payload["rendererState"] = static_cast<int32_t>(audioRendererChangeInfo->rendererState);
33     payload["pid"] = std::to_string(audioRendererChangeInfo->clientPid);
34     RESSCHED_LOGD("MarshallingAudioRendererChangeInfo, uid: %{public}d, pid: %{public}d",
35         audioRendererChangeInfo->clientUID, audioRendererChangeInfo->clientPid);
36     /* struct AudioRendererInfo */
37     payload["rendererInfo.contentType"] = static_cast<int32_t>(audioRendererChangeInfo->rendererInfo.contentType);
38     payload["rendererInfo.streamUsage"] = static_cast<int32_t>(audioRendererChangeInfo->rendererInfo.streamUsage);
39 }
40 
IsRenderStateChange(const std::shared_ptr<AudioStandard::AudioRendererChangeInfo> & info)41 bool AudioObserver::IsRenderStateChange(const std::shared_ptr<AudioStandard::AudioRendererChangeInfo>& info)
42 {
43     auto item = renderState_.find(info->sessionId);
44     if (item != renderState_.end()) {
45         return item->second != info->rendererState;
46     }
47     return true;
48 }
49 
OnRendererStateChange(const std::vector<std::shared_ptr<AudioStandard::AudioRendererChangeInfo>> & audioRendererChangeInfos)50 void AudioObserver::OnRendererStateChange(
51     const std::vector<std::shared_ptr<AudioStandard::AudioRendererChangeInfo>> &audioRendererChangeInfos)
52 {
53     for (const auto &audioRendererChangeInfo : audioRendererChangeInfos) {
54         RESSCHED_LOGD("enter AudioRenderStateObserver::OnRendererStateChange, state: %{public}d",
55             audioRendererChangeInfo->rendererState);
56         nlohmann::json payload;
57         MarshallingAudioRendererChangeInfo(audioRendererChangeInfo, payload);
58         if (IsRenderStateChange(audioRendererChangeInfo)) {
59             ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_AUDIO_RENDER_STATE_CHANGE,
60                 audioRendererChangeInfo->rendererState, payload);
61         }
62     }
63     renderState_.clear();
64     for (const auto &audioRendererChangeInfo : audioRendererChangeInfos) {
65         renderState_[audioRendererChangeInfo->sessionId] = audioRendererChangeInfo->rendererState;
66     }
67 }
68 
OnRingerModeUpdated(const AudioStandard::AudioRingerMode & ringerMode)69 void AudioObserver::OnRingerModeUpdated(const AudioStandard::AudioRingerMode &ringerMode)
70 {
71     if (ringerMode != mode_) {
72         RESSCHED_LOGI("enter AudioRingModeObserver::OnRingerModeUpdated, ringerMode: %{public}d", ringerMode);
73         mode_ = ringerMode;
74         const nlohmann::json payload = nlohmann::json::object();
75         ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_AUDIO_RING_MODE_CHANGE, ringerMode, payload);
76     }
77 }
78 
OnVolumeKeyEvent(AudioStandard::VolumeEvent volumeEvent)79 void AudioObserver::OnVolumeKeyEvent(AudioStandard::VolumeEvent volumeEvent)
80 {
81     RESSCHED_LOGI("enter AudioVolumeKeyObserver::OnVolumeKeyEvent, streamType: %{public}d, volumeLevel: %{public}d",
82         volumeEvent.volumeType, volumeEvent.volume);
83     auto item = volumeState_.find(volumeEvent.volumeType);
84     if (item != volumeState_.end() && item->second == volumeEvent.volume) {
85         RESSCHED_LOGI("volume not change");
86         return;
87     }
88     nlohmann::json payload;
89     payload["volumeType"] = std::to_string(volumeEvent.volumeType);
90     payload["volumeLevel"] = std::to_string(volumeEvent.volume);
91     volumeState_[volumeEvent.volumeType] = volumeEvent.volume;
92     ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_AUDIO_VOLUME_KEY_CHANGE,
93         volumeEvent.volume, payload);
94 }
95 
OnAudioSceneChange(const AudioStandard::AudioScene audioScene)96 void AudioObserver::OnAudioSceneChange(const AudioStandard::AudioScene audioScene)
97 {
98     RESSCHED_LOGD("enter audioSceneKeyObserver::OnAudioSceneChange, audioScene: %{public}d", audioScene);
99     nlohmann::json payload;
100     payload["audioScene"] = std::to_string(audioScene);
101     ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_AUDIO_SCENE_CHANGE, audioScene, payload);
102 }
103 
OnPreferredOutputDeviceUpdated(const std::vector<std::shared_ptr<AudioStandard::AudioDeviceDescriptor>> & descs)104 void AudioObserver::OnPreferredOutputDeviceUpdated(
105     const std::vector<std::shared_ptr<AudioStandard::AudioDeviceDescriptor>> &descs)
106 {
107     for (const auto &desc : descs) {
108         RESSCHED_LOGI("device change, type: %{public}d", desc->deviceType_);
109         nlohmann::json payload;
110         payload["deviceType"] = std::to_string(desc->deviceType_);
111         payload["deviceId"] = std::to_string(desc->deviceId_);
112         ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_OUTPUT_DEVICE_CHANGE,
113             desc->deviceId_, payload);
114     }
115 }
116 } // namespace ResourceSchedule
117 } // namespace OHOS
118 #endif
119