• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 #ifndef ST_AUDIO_OFFLOAD_STREAM_H
16 #define ST_AUDIO_OFFLOAD_STREAM_H
17 
18 #include <bitset>
19 #include <list>
20 #include <string>
21 #include <unordered_map>
22 #include <unordered_set>
23 #include <mutex>
24 #include "singleton.h"
25 #include "audio_group_handle.h"
26 #include "power_mgr_client.h"
27 #include "audio_manager_base.h"
28 #include "audio_module_info.h"
29 #include "audio_volume_config.h"
30 #include "audio_system_manager.h"
31 #include "audio_router_center.h"
32 #include "audio_errors.h"
33 #include "audio_policy_manager_factory.h"
34 #include "audio_stream_collector.h"
35 #include "ipc_skeleton.h"
36 
37 #include "audio_router_map.h"
38 #include "audio_iohandle_map.h"
39 #include "audio_active_device.h"
40 #include "audio_stream_collector.h"
41 
42 namespace OHOS {
43 namespace AudioStandard {
44 
45 class AudioOffloadStream {
46 public:
GetInstance()47     static AudioOffloadStream& GetInstance()
48     {
49         static AudioOffloadStream instance;
50         return instance;
51     }
52     void OffloadStreamSetCheck(uint32_t sessionId);
53     void OffloadStreamReleaseCheck(uint32_t sessionId);
54     void HandlePowerStateChanged(PowerMgr::PowerState state);
55     void ResetOffloadMode(int32_t sessionId);
56     int32_t MoveToNewPipe(const uint32_t sessionId, const AudioPipeType pipeType);
57     void RemoteOffloadStreamRelease(uint32_t sessionId);
58     bool CheckStreamMultichannelMode(const int64_t activateSessionId);
59     int32_t MoveToOutputDevice(uint32_t sessionId, std::string portName);
60     std::vector<SinkInput> FilterSinkInputs(int32_t sessionId, std::vector<SinkInput> sinkInputs);
61     void SetOffloadAvailableFromXML(AudioModuleInfo &moduleInfo);
62     int32_t DynamicUnloadOffloadModule();
63     int32_t UnloadMchModule();
64     int32_t LoadMchModule();
65     bool GetOffloadAvailableFromXml() const;
66     void ResetOffloadModeOnSpatializationChanged(std::vector<int32_t> &allSessions);
67     void SetOffloadStatus(uint32_t sessionId);
68     void ResetOffloadStatus(uint32_t sessionId);
69 private:
AudioOffloadStream()70     AudioOffloadStream() : audioPolicyManager_(AudioPolicyManagerFactory::GetAudioPolicyManager()),
71         audioRouterCenter_(AudioRouterCenter::GetAudioRouterCenter()),
72         streamCollector_(AudioStreamCollector::GetAudioStreamCollector()),
73         audioIOHandleMap_(AudioIOHandleMap::GetInstance()),
74         audioRouteMap_(AudioRouteMap::GetInstance()),
75         audioActiveDevice_(AudioActiveDevice::GetInstance()) {}
~AudioOffloadStream()76     ~AudioOffloadStream() {}
77     bool CheckStreamOffloadMode(int64_t activateSessionId, AudioStreamType streamType);
78     bool CheckSpatializationAndEffectState();
79     void SetOffloadMode();
80     int32_t MoveToNewPipeInner(const uint32_t sessionId, const AudioPipeType pipeType);
81     int32_t SwitchToNewPipe(const uint32_t sessionId, const AudioPipeType pipeType);
82     int32_t LoadOffloadModule();
83     int32_t UnloadOffloadModule();
84     AudioModuleInfo ConstructMchAudioModuleInfo(DeviceType deviceType);
85     AudioModuleInfo ConstructOffloadAudioModuleInfo(DeviceType deviceType);
86 private:
87     std::optional<uint32_t> offloadSessionID_;
88     PowerMgr::PowerState currentPowerState_ = PowerMgr::PowerState::AWAKE;
89     std::mutex offloadMutex_;
90     bool currentOffloadSessionIsBackground_ = false;
91     bool isOffloadAvailable_ = false;
92 
93     std::mutex offloadCloseMutex_;
94     std::mutex offloadOpenMutex_;
95     std::atomic<bool> isOffloadOpened_ = false;
96     std::condition_variable offloadCloseCondition_;
97 
98     IAudioPolicyInterface& audioPolicyManager_;
99     AudioRouterCenter& audioRouterCenter_;
100     AudioStreamCollector& streamCollector_;
101     AudioIOHandleMap& audioIOHandleMap_;
102     AudioRouteMap& audioRouteMap_;
103     AudioActiveDevice& audioActiveDevice_;
104 };
105 
106 }
107 }
108 
109 #endif