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 if (g_sProxy == nullptr) {
72 InitAudioStreamManagerGa(serviceId);
73 }
74
75 return g_sProxy->InitializeGa(eClientType);
76 }
77
CreateStream(AudioStreamParams audioParams,AudioStreamType audioType)78 int32_t AudioContainerBase::CreateStream(AudioStreamParams audioParams, AudioStreamType audioType)
79 {
80 return g_sProxy->CreateStreamGa(audioParams, audioType);
81 }
82
GetSessionID(uint32_t & sessionID,const int32_t & trackId) const83 int32_t AudioContainerBase::GetSessionID(uint32_t &sessionID, const int32_t &trackId) const
84 {
85 return g_sProxy->GetSessionIDGa(sessionID, trackId);
86 }
87
StartStream(const int32_t & trackId)88 int32_t AudioContainerBase::StartStream(const int32_t &trackId)
89 {
90 return g_sProxy->StartStreamGa(trackId);
91 }
92
PauseStream(const int32_t & trackId)93 int32_t AudioContainerBase::PauseStream(const int32_t &trackId)
94 {
95 return g_sProxy->PauseStreamGa(trackId);
96 }
97
StopStream(const int32_t & trackId)98 int32_t AudioContainerBase::StopStream(const int32_t &trackId)
99 {
100 return g_sProxy->StopStreamGa(trackId);
101 }
102
FlushStream(const int32_t & trackId)103 int32_t AudioContainerBase::FlushStream(const int32_t &trackId)
104 {
105 return g_sProxy->FlushStreamGa(trackId);
106 }
107
DrainStream(const int32_t & trackId)108 int32_t AudioContainerBase::DrainStream(const int32_t &trackId)
109 {
110 return g_sProxy->DrainStreamGa(trackId);
111 }
112
SetAudioRenderMode(AudioRenderMode renderMode,const int32_t & trackId)113 int32_t AudioContainerBase::SetAudioRenderMode(AudioRenderMode renderMode, const int32_t &trackId)
114 {
115 return g_sProxy->SetAudioRenderModeGa(renderMode, trackId);
116 }
117
GetAudioRenderMode()118 AudioRenderMode AudioContainerBase::GetAudioRenderMode()
119 {
120 return g_sProxy->GetAudioRenderModeGa();
121 }
122
SetStreamVolume(uint32_t sessionID,uint32_t volume)123 int32_t AudioContainerBase::SetStreamVolume(uint32_t sessionID, uint32_t volume)
124 {
125 return g_sProxy->SetStreamVolumeGa(sessionID, volume);
126 }
127
WriteStreamInCb(const StreamBuffer & stream,int32_t & pError,const int32_t & trackId)128 size_t AudioContainerBase::WriteStreamInCb(const StreamBuffer &stream, int32_t &pError, const int32_t &trackId)
129 {
130 return g_sProxy->WriteStreamInCbGa(stream, pError, trackId);
131 }
132
WriteStream(const StreamBuffer & stream,int32_t & pError,const int32_t & trackId)133 size_t AudioContainerBase::WriteStream(const StreamBuffer &stream, int32_t &pError, const int32_t &trackId)
134 {
135 return g_sProxy->WriteStreamGa(stream, pError, trackId);
136 }
137
ReadStream(StreamBuffer & stream,bool isBlocking,const int32_t & trackId)138 int32_t AudioContainerBase::ReadStream(StreamBuffer &stream, bool isBlocking, const int32_t &trackId)
139 {
140 return g_sProxy->ReadStreamGa(stream, isBlocking, trackId);
141 }
142
ReleaseStream(const int32_t & trackId)143 int32_t AudioContainerBase::ReleaseStream(const int32_t &trackId)
144 {
145 return g_sProxy->ReleaseStreamGa(trackId);
146 }
147
GetMinimumBufferSize(size_t & minBufferSize,const int32_t & trackId) const148 int32_t AudioContainerBase::GetMinimumBufferSize(size_t &minBufferSize, const int32_t &trackId) const
149 {
150 return g_sProxy->GetMinimumBufferSizeGa(minBufferSize, trackId);
151 }
152
GetMinimumFrameCount(uint32_t & frameCount,const int32_t & trackId) const153 int32_t AudioContainerBase::GetMinimumFrameCount(uint32_t &frameCount, const int32_t &trackId) const
154 {
155 return g_sProxy->GetMinimumFrameCountGa(frameCount, trackId);
156 }
157
GetAudioStreamParams(AudioStreamParams & audioParams,const int32_t & trackId)158 int32_t AudioContainerBase::GetAudioStreamParams(AudioStreamParams& audioParams, const int32_t &trackId)
159 {
160 return g_sProxy->GetAudioStreamParamsGa(audioParams, trackId);
161 }
162
GetStreamVolume(uint32_t sessionID)163 uint32_t AudioContainerBase::GetStreamVolume(uint32_t sessionID)
164 {
165 return g_sProxy->GetStreamVolumeGa();
166 }
167
GetCurrentTimeStamp(uint64_t & timeStamp,const int32_t & trackId)168 int32_t AudioContainerBase::GetCurrentTimeStamp(uint64_t &timeStamp, const int32_t &trackId)
169 {
170 return g_sProxy->GetCurrentTimeStampGa(timeStamp, trackId);
171 }
172
GetAudioLatency(uint64_t & latency,const int32_t & trackId) const173 int32_t AudioContainerBase::GetAudioLatency(uint64_t &latency, const int32_t &trackId) const
174 {
175 return g_sProxy->GetAudioLatencyGa(latency, trackId);
176 }
177
SetStreamType(AudioStreamType audioStreamType,const int32_t & trackId)178 int32_t AudioContainerBase::SetStreamType(AudioStreamType audioStreamType, const int32_t &trackId)
179 {
180 return g_sProxy->SetStreamTypeGa(audioStreamType, trackId);
181 }
182
SetStreamVolume(float volume,const int32_t & trackId)183 int32_t AudioContainerBase::SetStreamVolume(float volume, const int32_t &trackId)
184 {
185 return g_sProxy->SetStreamVolumeGa(volume, trackId);
186 }
187
GetStreamVolume()188 float AudioContainerBase::GetStreamVolume()
189 {
190 return g_sProxy->GetStreamVolumeGa();
191 }
192
SetStreamRenderRate(AudioRendererRate audioRendererRate,const int32_t & trackId)193 int32_t AudioContainerBase::SetStreamRenderRate(AudioRendererRate audioRendererRate, const int32_t &trackId)
194 {
195 return g_sProxy->SetStreamRenderRateGa(audioRendererRate, trackId);
196 }
197
GetStreamRenderRate()198 AudioRendererRate AudioContainerBase::GetStreamRenderRate()
199 {
200 return g_sProxy->GetStreamRenderRateGa();
201 }
202
SaveStreamCallback(const std::weak_ptr<AudioStreamCallback> & callback)203 void AudioContainerBase::SaveStreamCallback(const std::weak_ptr<AudioStreamCallback> &callback)
204 {
205 return g_sProxy->SaveStreamCallbackGa(callback);
206 }
207
SetBufferSizeInMsec(int32_t bufferSizeInMsec)208 int32_t AudioContainerBase::SetBufferSizeInMsec(int32_t bufferSizeInMsec)
209 {
210 return g_sProxy->SetBufferSizeInMsecGa(bufferSizeInMsec);
211 }
212
SetRendererPositionCallback(int64_t markPosition,const std::shared_ptr<RendererPositionCallback> & callback)213 void AudioContainerBase::SetRendererPositionCallback(int64_t markPosition,
214 const std::shared_ptr<RendererPositionCallback> &callback)
215 {
216 return g_sProxy->SetRendererPositionCallbackGa(markPosition, callback);
217 }
218
UnsetRendererPositionCallback()219 void AudioContainerBase::UnsetRendererPositionCallback()
220 {
221 return g_sProxy->UnsetRendererPositionCallbackGa();
222 }
223
SetRendererPeriodPositionCallback(int64_t periodPosition,const std::shared_ptr<RendererPeriodPositionCallback> & callback)224 void AudioContainerBase::SetRendererPeriodPositionCallback(int64_t periodPosition,
225 const std::shared_ptr<RendererPeriodPositionCallback> &callback)
226 {
227 return g_sProxy->SetRendererPeriodPositionCallbackGa(periodPosition, callback);
228 }
229
UnsetRendererPeriodPositionCallback()230 void AudioContainerBase::UnsetRendererPeriodPositionCallback()
231 {
232 return g_sProxy->UnsetRendererPeriodPositionCallbackGa();
233 }
234
SetCapturerPositionCallback(int64_t markPosition,const std::shared_ptr<CapturerPositionCallback> & callback)235 void AudioContainerBase::SetCapturerPositionCallback(int64_t markPosition,
236 const std::shared_ptr<CapturerPositionCallback> &callback)
237 {
238 return g_sProxy->SetCapturerPositionCallbackGa(markPosition, callback);
239 }
240
UnsetCapturerPositionCallback()241 void AudioContainerBase::UnsetCapturerPositionCallback()
242 {
243 return g_sProxy->UnsetCapturerPositionCallbackGa();
244 }
245
SetCapturerPeriodPositionCallback(int64_t periodPosition,const std::shared_ptr<CapturerPeriodPositionCallback> & callback)246 void AudioContainerBase::SetCapturerPeriodPositionCallback(int64_t periodPosition,
247 const std::shared_ptr<CapturerPeriodPositionCallback> &callback)
248 {
249 return g_sProxy->SetCapturerPeriodPositionCallbackGa(periodPosition, callback);
250 }
251
UnsetCapturerPeriodPositionCallback()252 void AudioContainerBase::UnsetCapturerPeriodPositionCallback()
253 {
254 return g_sProxy->UnsetCapturerPeriodPositionCallbackGa();
255 }
256
OnTimeOut()257 void AudioContainerBase::OnTimeOut()
258 {
259 AUDIO_ERR_LOG("Inside read timeout callback");
260 }
261
SetAudioCaptureMode(AudioCaptureMode captureMode)262 int32_t AudioContainerBase::SetAudioCaptureMode(AudioCaptureMode captureMode)
263 {
264 return g_sProxy->SetAudioCaptureMode(captureMode);
265 }
266
SaveReadCallback(const std::weak_ptr<AudioCapturerReadCallback> & callback)267 int32_t AudioContainerBase::SaveReadCallback(const std::weak_ptr<AudioCapturerReadCallback> &callback)
268 {
269 return g_sProxy->SaveReadCallback(callback);
270 }
271
GetAudioCaptureMode()272 AudioCaptureMode AudioContainerBase::GetAudioCaptureMode()
273 {
274 return g_sProxy->GetAudioCaptureMode();
275 }
276
SetAppCachePath(const std::string cachePath)277 void AudioContainerBase::SetAppCachePath(const std::string cachePath)
278 {
279 AUDIO_INFO_LOG("SetAppCachePath cachePath %{public}s", cachePath.c_str());
280 }
281
SaveWriteCallback(const std::weak_ptr<AudioRendererWriteCallback> & callback,const int32_t & trackId)282 int32_t AudioContainerBase::SaveWriteCallback(const std::weak_ptr<AudioRendererWriteCallback> &callback,
283 const int32_t &trackId)
284 {
285 AUDIO_INFO_LOG("AudioContainerBase::SaveWriteCallback");
286 return g_sProxy->SaveWriteCallbackGa(callback, trackId);
287 }
288 } // namespace AudioStandard
289 } // namespace OHOS
290