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