1 /*
2 * Copyright (c) 2024 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 LOG_TAG
16 #define LOG_TAG "OfflineStreamInClient"
17 #endif
18
19 #include "offline_stream_in_client.h"
20
21 #include <mutex>
22
23 #include "ipc_offline_stream.h"
24 #include "ipc_skeleton.h"
25 #include "iservice_registry.h"
26 #include "system_ability_definition.h"
27
28 #include "audio_manager_base.h"
29 #include "audio_service_log.h"
30 #include "audio_errors.h"
31
32 using namespace std;
33
34 namespace OHOS {
35 namespace AudioStandard {
36 namespace {
37 mutex g_audioServerProxyMutex;
38 sptr<IStandardAudioService> gAudioServerProxy = nullptr;
GetAudioServerProxy()39 static const sptr<IStandardAudioService> GetAudioServerProxy()
40 {
41 lock_guard<mutex> lock(g_audioServerProxyMutex);
42 if (gAudioServerProxy == nullptr) {
43 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
44 CHECK_AND_RETURN_RET_LOG(samgr != nullptr, nullptr, "get sa manager failed");
45 sptr<IRemoteObject> object = samgr->GetSystemAbility(AUDIO_DISTRIBUTED_SERVICE_ID);
46 CHECK_AND_RETURN_RET_LOG(object != nullptr, nullptr, "get audio service remote object failed");
47 gAudioServerProxy = iface_cast<IStandardAudioService>(object);
48 CHECK_AND_RETURN_RET_LOG(gAudioServerProxy != nullptr, nullptr, "get audio service proxy failed");
49 }
50 sptr<IStandardAudioService> gasp = gAudioServerProxy;
51 return gasp;
52 }
53 }
54
Create()55 shared_ptr<OfflineStreamInClient> OfflineStreamInClient::Create()
56 {
57 sptr<IStandardAudioService> gasp = GetAudioServerProxy();
58 CHECK_AND_RETURN_RET_LOG(gasp != nullptr, nullptr, "Create failed, can not get service.");
59 int32_t errCode = 0;
60 sptr<IRemoteObject> ipcProxy = gasp->CreateIpcOfflineStream(errCode);
61 CHECK_AND_RETURN_RET_LOG(errCode == 0, nullptr, "create audio stream fail, errcode is %{public}d.", errCode);
62 CHECK_AND_RETURN_RET_LOG(ipcProxy != nullptr, nullptr, "Create failed with null ipcProxy.");
63 sptr<IpcOfflineStream> iOfflineStreamProxy = iface_cast<IpcOfflineStream>(ipcProxy);
64 CHECK_AND_RETURN_RET_LOG(iOfflineStreamProxy != nullptr, nullptr, "Create failed when iface_cast.");
65 shared_ptr<OfflineStreamInClient> stream = make_shared<OfflineStreamInClient>(iOfflineStreamProxy);
66 return stream;
67 }
68
GetOfflineAudioEffectChains(std::vector<std::string> & effectChains)69 int32_t OfflineStreamInClient::GetOfflineAudioEffectChains(std::vector<std::string> &effectChains)
70 {
71 sptr<IStandardAudioService> gasp = GetAudioServerProxy();
72 CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERR_OPERATION_FAILED, "Create failed, can not get service.");
73 return gasp->GetOfflineAudioEffectChains(effectChains);
74 }
75
OfflineStreamInClient(const sptr<IpcOfflineStream> & ipcProxy)76 OfflineStreamInClient::OfflineStreamInClient(const sptr<IpcOfflineStream> &ipcProxy) : streamProxy_(ipcProxy) {}
77
CreateOfflineEffectChain(const std::string & effectName)78 int32_t OfflineStreamInClient::CreateOfflineEffectChain(const std::string &effectName)
79 {
80 CHECK_AND_RETURN_RET_LOG(streamProxy_ != nullptr, ERR_OPERATION_FAILED, "Create failed with null ipcProxy.");
81 return streamProxy_->CreateOfflineEffectChain(effectName);
82 }
83
ConfigureOfflineEffectChain(const AudioStreamInfo & inInfo,const AudioStreamInfo & outInfo)84 int32_t OfflineStreamInClient::ConfigureOfflineEffectChain(const AudioStreamInfo &inInfo,
85 const AudioStreamInfo &outInfo)
86 {
87 CHECK_AND_RETURN_RET_LOG(streamProxy_ != nullptr, ERR_OPERATION_FAILED, "Configure failed with null ipcProxy.");
88 return streamProxy_->ConfigureOfflineEffectChain(inInfo, outInfo);
89 }
90
PrepareOfflineEffectChain(std::shared_ptr<AudioSharedMemory> & clientInBuffer,std::shared_ptr<AudioSharedMemory> & clientOutBuffer)91 int32_t OfflineStreamInClient::PrepareOfflineEffectChain(std::shared_ptr<AudioSharedMemory> &clientInBuffer,
92 std::shared_ptr<AudioSharedMemory> &clientOutBuffer)
93 {
94 CHECK_AND_RETURN_RET_LOG(streamProxy_ != nullptr, ERR_OPERATION_FAILED, "Prepare failed with null ipcProxy.");
95 return streamProxy_->PrepareOfflineEffectChain(clientInBuffer, clientOutBuffer);
96 }
97
ProcessOfflineEffectChain(uint32_t inputSize,uint32_t outputSize)98 int32_t OfflineStreamInClient::ProcessOfflineEffectChain(uint32_t inputSize, uint32_t outputSize)
99 {
100 CHECK_AND_RETURN_RET_LOG(streamProxy_ != nullptr, ERR_OPERATION_FAILED, "Process failed with null ipcProxy.");
101 return streamProxy_->ProcessOfflineEffectChain(inputSize, outputSize);
102 }
103
ReleaseOfflineEffectChain()104 void OfflineStreamInClient::ReleaseOfflineEffectChain()
105 {
106 CHECK_AND_RETURN_LOG(streamProxy_ != nullptr, "Release failed with null ipcProxy.");
107 streamProxy_->ReleaseOfflineEffectChain();
108 }
109 } // namespace AudioStandard
110 } // namespace OHOS
111