1 /*
2 * Copyright (c) 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 "audio_container_base.h"
17 #include "audio_stream_death_recipient.h"
18 #include "audio_log.h"
19 #include "unistd.h"
20 #include "securec.h"
21 #include "system_ability_definition.h"
22
23 using namespace std;
24
25 namespace OHOS {
26 namespace AudioStandard {
27
28 static bool g_isConnected = false;
29 static sptr<IAudioContainerService> g_sProxy = nullptr;
30
InitAudioStreamManagerGa(int serviceId)31 void AudioContainerBase::InitAudioStreamManagerGa(int serviceId)
32 {
33 AUDIO_ERR_LOG("AudioContainerBase::InitAudioStreamManagerGa serviceId %d", serviceId);
34 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
35 CHECK_AND_RETURN_LOG(samgr != nullptr, "AudioContainerBase::init failed");
36
37 sptr<IRemoteObject> object = samgr->GetSystemAbility(serviceId);
38 CHECK_AND_RETURN_LOG(object != nullptr, "AudioContainerBase::object is NULL");
39
40 g_sProxy = iface_cast<IAudioContainerService>(object);
41 CHECK_AND_RETURN_LOG(g_sProxy != nullptr, "AudioContainerBase::init g_sProxy is NULL");
42 g_isConnected = true;
43 RegisterAudioStreamDeathRecipient(object);
44 AUDIO_INFO_LOG("AudioContainerBase::init g_sProxy is assigned.");
45 }
46
RegisterAudioStreamDeathRecipient(sptr<IRemoteObject> & object)47 void AudioContainerBase::RegisterAudioStreamDeathRecipient(sptr<IRemoteObject> &object)
48 {
49 AUDIO_INFO_LOG("AudioContainerBase Register audio renderer death recipient");
50 pid_t pid = 0;
51 sptr<AudioStreamDeathRecipient> recipient = new(std::nothrow) AudioStreamDeathRecipient(pid);
52 if (recipient != nullptr) {
53 recipient->SetServerDiedCallback([](auto &&PH1) {
54 AudioStreamDeathRecipient(std::forward<decltype(PH1)>(PH1));
55 });
56 bool result = object->AddDeathRecipient(recipient);
57 if (!result) {
58 AUDIO_ERR_LOG("AudioContainerBase failed to add recipient");
59 }
60 }
61 }
62
AudioStreamDied(pid_t pid)63 void AudioContainerBase::AudioStreamDied(pid_t pid)
64 {
65 AUDIO_INFO_LOG("AudioContainerBase, Audio renderer died, reestablish connection");
66 g_isConnected = false;
67 }
68
Initialize(ASClientType eClientType,int serviceId)69 int32_t AudioContainerBase::Initialize(ASClientType eClientType, int serviceId)
70 {
71 InitAudioStreamManagerGa(serviceId);
72 return g_sProxy->InitializeGa(eClientType);
73 }
74
CreateStream(AudioStreamParams audioParams,AudioStreamType audioType)75 int32_t AudioContainerBase::CreateStream(AudioStreamParams audioParams, AudioStreamType audioType)
76 {
77 return g_sProxy->CreateStreamGa(audioParams, audioType);
78 }
79
GetSessionID(uint32_t & sessionID,const int32_t & trackId) const80 int32_t AudioContainerBase::GetSessionID(uint32_t &sessionID, const int32_t &trackId) const
81 {
82 return g_sProxy->GetSessionIDGa(sessionID, trackId);
83 }
84
StartStream(const int32_t & trackId)85 int32_t AudioContainerBase::StartStream(const int32_t &trackId)
86 {
87 return g_sProxy->StartStreamGa(trackId);
88 }
89
PauseStream(const int32_t & trackId)90 int32_t AudioContainerBase::PauseStream(const int32_t &trackId)
91 {
92 return g_sProxy->PauseStreamGa(trackId);
93 }
94
StopStream(const int32_t & trackId)95 int32_t AudioContainerBase::StopStream(const int32_t &trackId)
96 {
97 return g_sProxy->StopStreamGa(trackId);
98 }
99
FlushStream(const int32_t & trackId)100 int32_t AudioContainerBase::FlushStream(const int32_t &trackId)
101 {
102 return g_sProxy->FlushStreamGa(trackId);
103 }
104
DrainStream(const int32_t & trackId)105 int32_t AudioContainerBase::DrainStream(const int32_t &trackId)
106 {
107 return g_sProxy->DrainStreamGa(trackId);
108 }
109
SetAudioRenderMode(AudioRenderMode renderMode,const int32_t & trackId)110 int32_t AudioContainerBase::SetAudioRenderMode(AudioRenderMode renderMode, const int32_t &trackId)
111 {
112 return g_sProxy->SetAudioRenderModeGa(renderMode, trackId);
113 }
114
GetAudioRenderMode()115 AudioRenderMode AudioContainerBase::GetAudioRenderMode()
116 {
117 return g_sProxy->GetAudioRenderModeGa();
118 }
119
WriteStreamInCb(const StreamBuffer & stream,int32_t & pError,const int32_t & trackId)120 size_t AudioContainerBase::WriteStreamInCb(const StreamBuffer &stream, int32_t &pError, const int32_t &trackId)
121 {
122 return g_sProxy->WriteStreamInCbGa(stream, pError, trackId);
123 }
124
WriteStream(const StreamBuffer & stream,int32_t & pError,const int32_t & trackId)125 size_t AudioContainerBase::WriteStream(const StreamBuffer &stream, int32_t &pError, const int32_t &trackId)
126 {
127 return g_sProxy->WriteStreamGa(stream, pError, trackId);
128 }
129
ReadStream(StreamBuffer & stream,bool isBlocking,const int32_t & trackId)130 int32_t AudioContainerBase::ReadStream(StreamBuffer &stream, bool isBlocking, const int32_t &trackId)
131 {
132 return g_sProxy->ReadStreamGa(stream, isBlocking, trackId);
133 }
134
ReleaseStream(const int32_t & trackId)135 int32_t AudioContainerBase::ReleaseStream(const int32_t &trackId)
136 {
137 return g_sProxy->ReleaseStreamGa(trackId);
138 }
139
GetMinimumBufferSize(size_t & minBufferSize,const int32_t & trackId) const140 int32_t AudioContainerBase::GetMinimumBufferSize(size_t &minBufferSize, const int32_t &trackId) const
141 {
142 return g_sProxy->GetMinimumBufferSizeGa(minBufferSize, trackId);
143 }
144
GetMinimumFrameCount(uint32_t & frameCount,const int32_t & trackId) const145 int32_t AudioContainerBase::GetMinimumFrameCount(uint32_t &frameCount, const int32_t &trackId) const
146 {
147 return g_sProxy->GetMinimumFrameCountGa(frameCount, trackId);
148 }
149
GetAudioStreamParams(AudioStreamParams & audioParams,const int32_t & trackId)150 int32_t AudioContainerBase::GetAudioStreamParams(AudioStreamParams& audioParams, const int32_t &trackId)
151 {
152 return g_sProxy->GetAudioStreamParamsGa(audioParams, trackId);
153 }
154
GetCurrentTimeStamp(uint64_t & timeStamp,const int32_t & trackId)155 int32_t AudioContainerBase::GetCurrentTimeStamp(uint64_t &timeStamp, const int32_t &trackId)
156 {
157 return g_sProxy->GetCurrentTimeStampGa(timeStamp, trackId);
158 }
159
GetAudioLatency(uint64_t & latency,const int32_t & trackId) const160 int32_t AudioContainerBase::GetAudioLatency(uint64_t &latency, const int32_t &trackId) const
161 {
162 return g_sProxy->GetAudioLatencyGa(latency, trackId);
163 }
164
SetStreamType(AudioStreamType audioStreamType,const int32_t & trackId)165 int32_t AudioContainerBase::SetStreamType(AudioStreamType audioStreamType, const int32_t &trackId)
166 {
167 return g_sProxy->SetStreamTypeGa(audioStreamType, trackId);
168 }
169
SetStreamVolume(float volume,const int32_t & trackId)170 int32_t AudioContainerBase::SetStreamVolume(float volume, const int32_t &trackId)
171 {
172 return g_sProxy->SetStreamVolumeGa(volume, trackId);
173 }
174
GetStreamVolume()175 float AudioContainerBase::GetStreamVolume()
176 {
177 return g_sProxy->GetStreamVolumeGa();
178 }
179
SetStreamRenderRate(AudioRendererRate audioRendererRate,const int32_t & trackId)180 int32_t AudioContainerBase::SetStreamRenderRate(AudioRendererRate audioRendererRate, const int32_t &trackId)
181 {
182 return g_sProxy->SetStreamRenderRateGa(audioRendererRate, trackId);
183 }
184
GetStreamRenderRate()185 AudioRendererRate AudioContainerBase::GetStreamRenderRate()
186 {
187 return g_sProxy->GetStreamRenderRateGa();
188 }
189
SaveStreamCallback(const std::weak_ptr<AudioStreamCallback> & callback)190 void AudioContainerBase::SaveStreamCallback(const std::weak_ptr<AudioStreamCallback> &callback)
191 {
192 return g_sProxy->SaveStreamCallbackGa(callback);
193 }
194
SetBufferSizeInMsec(int32_t bufferSizeInMsec)195 int32_t AudioContainerBase::SetBufferSizeInMsec(int32_t bufferSizeInMsec)
196 {
197 return g_sProxy->SetBufferSizeInMsecGa(bufferSizeInMsec);
198 }
199
SetRendererPositionCallback(int64_t markPosition,const std::shared_ptr<RendererPositionCallback> & callback)200 void AudioContainerBase::SetRendererPositionCallback(int64_t markPosition,
201 const std::shared_ptr<RendererPositionCallback> &callback)
202 {
203 return g_sProxy->SetRendererPositionCallbackGa(markPosition, callback);
204 }
205
UnsetRendererPositionCallback()206 void AudioContainerBase::UnsetRendererPositionCallback()
207 {
208 return g_sProxy->UnsetRendererPositionCallbackGa();
209 }
210
SetRendererPeriodPositionCallback(int64_t periodPosition,const std::shared_ptr<RendererPeriodPositionCallback> & callback)211 void AudioContainerBase::SetRendererPeriodPositionCallback(int64_t periodPosition,
212 const std::shared_ptr<RendererPeriodPositionCallback> &callback)
213 {
214 return g_sProxy->SetRendererPeriodPositionCallbackGa(periodPosition, callback);
215 }
216
UnsetRendererPeriodPositionCallback()217 void AudioContainerBase::UnsetRendererPeriodPositionCallback()
218 {
219 return g_sProxy->UnsetRendererPeriodPositionCallbackGa();
220 }
221
SetCapturerPositionCallback(int64_t markPosition,const std::shared_ptr<CapturerPositionCallback> & callback)222 void AudioContainerBase::SetCapturerPositionCallback(int64_t markPosition,
223 const std::shared_ptr<CapturerPositionCallback> &callback)
224 {
225 return g_sProxy->SetCapturerPositionCallbackGa(markPosition, callback);
226 }
227
UnsetCapturerPositionCallback()228 void AudioContainerBase::UnsetCapturerPositionCallback()
229 {
230 return g_sProxy->UnsetCapturerPositionCallbackGa();
231 }
232
SetCapturerPeriodPositionCallback(int64_t periodPosition,const std::shared_ptr<CapturerPeriodPositionCallback> & callback)233 void AudioContainerBase::SetCapturerPeriodPositionCallback(int64_t periodPosition,
234 const std::shared_ptr<CapturerPeriodPositionCallback> &callback)
235 {
236 return g_sProxy->SetCapturerPeriodPositionCallbackGa(periodPosition, callback);
237 }
238
UnsetCapturerPeriodPositionCallback()239 void AudioContainerBase::UnsetCapturerPeriodPositionCallback()
240 {
241 return g_sProxy->UnsetCapturerPeriodPositionCallbackGa();
242 }
243
OnTimeOut()244 void AudioContainerBase::OnTimeOut()
245 {
246 AUDIO_ERR_LOG("Inside read timeout callback");
247 }
248
SetAudioCaptureMode(AudioCaptureMode captureMode)249 int32_t AudioContainerBase::SetAudioCaptureMode(AudioCaptureMode captureMode)
250 {
251 return g_sProxy->SetAudioCaptureMode(captureMode);
252 }
253
SaveReadCallback(const std::weak_ptr<AudioCapturerReadCallback> & callback)254 int32_t AudioContainerBase::SaveReadCallback(const std::weak_ptr<AudioCapturerReadCallback> &callback)
255 {
256 return g_sProxy->SaveReadCallback(callback);
257 }
258
GetAudioCaptureMode()259 AudioCaptureMode AudioContainerBase::GetAudioCaptureMode()
260 {
261 return g_sProxy->GetAudioCaptureMode();
262 }
263
SetAppCachePath(const std::string cachePath)264 void AudioContainerBase::SetAppCachePath(const std::string cachePath)
265 {
266 AUDIO_INFO_LOG("SetAppCachePath cachePath %{public}s", cachePath.c_str());
267 }
268
SaveWriteCallback(const std::weak_ptr<AudioRendererWriteCallback> & callback,const int32_t & trackId)269 int32_t AudioContainerBase::SaveWriteCallback(const std::weak_ptr<AudioRendererWriteCallback> &callback,
270 const int32_t &trackId)
271 {
272 AUDIO_INFO_LOG("AudioContainerBase::SaveWriteCallback");
273 return g_sProxy->SaveWriteCallbackGa(callback, trackId);
274 }
275 } // namespace AudioStandard
276 } // namespace OHOS
277