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 "IpcOfflineStreamStub"
17 #endif
18 
19 #include "ipc_offline_stream_stub.h"
20 #include "audio_service_log.h"
21 #include "audio_errors.h"
22 
23 namespace OHOS {
24 namespace AudioStandard {
IpcOfflineStreamStub()25 IpcOfflineStreamStub::IpcOfflineStreamStub()
26 {
27     handlerMap_ = {
28         {CREATE_OFFLINE_EFFECT_CHAIN, [this](MessageParcel &data, MessageParcel &reply) {
29             return HandleCreateOfflineEffectChain(data, reply);
30         }},
31         {CONFIGURE_OFFLINE_EFFECT_CHAIN, [this](MessageParcel &data, MessageParcel &reply) {
32             return HandleConfigureOfflineEffectChain(data, reply);
33         }},
34         {PROCESS_OFFLINE_EFFECT_CHAIN, [this](MessageParcel &data, MessageParcel &reply) {
35             return HandleProcessOfflineEffectChain(data, reply);
36         }},
37         {PREPARE_OFFLINE_EFFECT_CHAIN, [this](MessageParcel &data, MessageParcel &reply) {
38             return HandlePrepareOfflineEffectChain(data, reply);
39         }},
40         {RELEASE_OFFLINE_EFFECT_CHAIN, [this](MessageParcel &data, MessageParcel &reply) {
41             return HandleReleaseOfflineEffectChain(data, reply);
42         }}
43     };
44 }
45 
CheckInterfaceToken(MessageParcel & data)46 bool IpcOfflineStreamStub::CheckInterfaceToken(MessageParcel &data)
47 {
48     static auto localDescriptor = IpcOfflineStream::GetDescriptor();
49     auto remoteDescriptor = data.ReadInterfaceToken();
50     if (remoteDescriptor != localDescriptor) {
51         AUDIO_ERR_LOG("CheckInterFfaceToken failed.");
52         return false;
53     }
54     return true;
55 }
56 
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)57 int32_t IpcOfflineStreamStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply,
58     MessageOption &option)
59 {
60     CHECK_AND_RETURN_RET(CheckInterfaceToken(data), AUDIO_ERR);
61     auto it = handlerMap_.find(code);
62     if (it != handlerMap_.end()) {
63         return it->second(data, reply);
64     }
65     AUDIO_WARNING_LOG("OnRemoteRequest unsupported request code:%{public}d.", code);
66     return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
67 }
68 
HandleCreateOfflineEffectChain(MessageParcel & data,MessageParcel & reply)69 int32_t IpcOfflineStreamStub::HandleCreateOfflineEffectChain(MessageParcel &data, MessageParcel &reply)
70 {
71     std::string chainName = data.ReadString();
72     int32_t ret = CreateOfflineEffectChain(chainName);
73     reply.WriteInt32(ret);
74     return AUDIO_OK;
75 }
76 
HandleConfigureOfflineEffectChain(MessageParcel & data,MessageParcel & reply)77 int32_t IpcOfflineStreamStub::HandleConfigureOfflineEffectChain(MessageParcel &data, MessageParcel &reply)
78 {
79     AudioStreamInfo inInfo;
80     AudioStreamInfo outInfo;
81     inInfo.Unmarshalling(data);
82     outInfo.Unmarshalling(data);
83     int32_t ret = ConfigureOfflineEffectChain(inInfo, outInfo);
84     reply.WriteInt32(ret);
85     return AUDIO_OK;
86 }
87 
HandlePrepareOfflineEffectChain(MessageParcel & data,MessageParcel & reply)88 int32_t IpcOfflineStreamStub::HandlePrepareOfflineEffectChain(MessageParcel &data, MessageParcel &reply)
89 {
90     (void)data;
91     std::shared_ptr<AudioSharedMemory> inBuf = nullptr;
92     std::shared_ptr<AudioSharedMemory> outBuf = nullptr;
93     int32_t ret = PrepareOfflineEffectChain(inBuf, outBuf);
94     AudioSharedMemory::WriteToParcel(inBuf, reply);
95     AudioSharedMemory::WriteToParcel(outBuf, reply);
96     reply.WriteInt32(ret);
97     return AUDIO_OK;
98 }
99 
HandleProcessOfflineEffectChain(MessageParcel & data,MessageParcel & reply)100 int32_t IpcOfflineStreamStub::HandleProcessOfflineEffectChain(MessageParcel &data, MessageParcel &reply)
101 {
102     uint32_t inSize;
103     uint32_t outSize;
104     inSize = data.ReadUint32();
105     outSize = data.ReadUint32();
106     int32_t ret = ProcessOfflineEffectChain(inSize, outSize);
107     return ret;
108 }
109 
HandleReleaseOfflineEffectChain(MessageParcel & data,MessageParcel & reply)110 int32_t IpcOfflineStreamStub::HandleReleaseOfflineEffectChain(MessageParcel &data, MessageParcel &reply)
111 {
112     ReleaseOfflineEffectChain();
113     return SUCCESS;
114 }
115 
116 } // namespace AudioStandard
117 } // namespace OHOS
118