1 /*
2 * Copyright (c) 2023 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 "av_receiver_engine_transport.h"
17
18 #include <securec.h>
19 #include "daudio_constants.h"
20 #include "daudio_errorcode.h"
21 #include "daudio_log.h"
22 #include "daudio_util.h"
23
24 #undef DH_LOG_TAG
25 #define DH_LOG_TAG "AVTransReceiverTransport"
26
27 namespace OHOS {
28 namespace DistributedHardware {
InitEngine(IAVEngineProvider * providerPtr)29 int32_t AVTransReceiverTransport::InitEngine(IAVEngineProvider *providerPtr)
30 {
31 DHLOGI("InitReceiverEngine enter.");
32 if (receiverAdapter_ == nullptr) {
33 receiverAdapter_ = std::make_shared<AVTransReceiverAdapter>();
34 }
35 int32_t ret = receiverAdapter_->Initialize(providerPtr, devId_);
36 if (ret != DH_SUCCESS) {
37 DHLOGE("initialize av receiver adapter failed.");
38 return ERR_DH_AUDIO_TRANS_NULL_VALUE;
39 }
40 ret = receiverAdapter_->RegisterAdapterCallback(shared_from_this());
41 if (ret != DH_SUCCESS) {
42 DHLOGE("InitReceiverEngine register callback error.");
43 }
44 return ret;
45 }
46
SetUp(const AudioParam & localParam,const AudioParam & remoteParam,const std::shared_ptr<IAudioDataTransCallback> & callback,const PortCapType capType)47 int32_t AVTransReceiverTransport::SetUp(const AudioParam &localParam, const AudioParam &remoteParam,
48 const std::shared_ptr<IAudioDataTransCallback> &callback, const PortCapType capType)
49 {
50 (void)remoteParam;
51 (void)callback;
52 (void)capType;
53 return SetParameter(localParam);
54 }
55
CreateCtrl()56 int32_t AVTransReceiverTransport::CreateCtrl()
57 {
58 DHLOGI("Create ctrl enter.");
59 if (receiverAdapter_ == nullptr) {
60 DHLOGE("av transport receiver adapter is null");
61 return ERR_DH_AUDIO_TRANS_NULL_VALUE;
62 }
63 int32_t ret = receiverAdapter_->CreateControlChannel(devId_);
64 if (ret != DH_SUCCESS) {
65 DHLOGE("create av receiver control channel failed.");
66 return ERR_DH_AUDIO_TRANS_NULL_VALUE;
67 }
68 return DH_SUCCESS;
69 }
70
Start()71 int32_t AVTransReceiverTransport::Start()
72 {
73 DHLOGI("StartReceiverEngine enter.");
74 if (receiverAdapter_ == nullptr) {
75 DHLOGE("av transport receiver adapter is null");
76 return ERR_DH_AUDIO_TRANS_NULL_VALUE;
77 }
78 int32_t ret = receiverAdapter_->Start();
79 if (ret != DH_SUCCESS) {
80 DHLOGE("start av receiver engine failed");
81 return ERR_DH_AUDIO_TRANS_NULL_VALUE;
82 }
83 return DH_SUCCESS;
84 }
85
Stop()86 int32_t AVTransReceiverTransport::Stop()
87 {
88 DHLOGI("StopReceiverEngine enter.");
89 if (receiverAdapter_ == nullptr) {
90 DHLOGE("StopReceiverEngine adapter is null");
91 return ERR_DH_AUDIO_TRANS_NULL_VALUE;
92 }
93 int32_t ret = receiverAdapter_->Stop();
94 if (ret != DH_SUCCESS) {
95 DHLOGE("StopReceiveEngine error.");
96 return ERR_DH_AUDIO_TRANS_NULL_VALUE;
97 }
98 return DH_SUCCESS;
99 }
100
Release()101 int32_t AVTransReceiverTransport::Release()
102 {
103 DHLOGI("ReleaseReceiverEngine enter.");
104 if (receiverAdapter_ == nullptr) {
105 DHLOGE("ReleaseReceiverEngine adapter is null");
106 return ERR_DH_AUDIO_TRANS_NULL_VALUE;
107 }
108 int32_t ret = receiverAdapter_->Release();
109 if (ret != DH_SUCCESS) {
110 DHLOGE("ReleaseReceiverEngine error.");
111 return ERR_DH_AUDIO_TRANS_NULL_VALUE;
112 }
113 return DH_SUCCESS;
114 }
115
Pause()116 int32_t AVTransReceiverTransport::Pause()
117 {
118 DHLOGI("AVTransReceiverTransport Pause enter.");
119 if (receiverAdapter_ == nullptr) {
120 DHLOGE("Pause error. receiver adapter is null.");
121 return ERR_DH_AUDIO_NULLPTR;
122 }
123 return receiverAdapter_->SetParameter(AVTransTag::ENGINE_PAUSE, "");
124 }
125
Restart(const AudioParam & localParam,const AudioParam & remoteParam)126 int32_t AVTransReceiverTransport::Restart(const AudioParam &localParam, const AudioParam &remoteParam)
127 {
128 (void)localParam;
129 (void)remoteParam;
130 DHLOGI("AVTransReceiverTransport Restart enter.");
131 if (receiverAdapter_ == nullptr) {
132 DHLOGE("Restart error. receiver adapter is null.");
133 return ERR_DH_AUDIO_NULLPTR;
134 }
135 return receiverAdapter_->SetParameter(AVTransTag::ENGINE_RESUME, "");
136 }
137
FeedAudioData(std::shared_ptr<AudioData> & audioData)138 int32_t AVTransReceiverTransport::FeedAudioData(std::shared_ptr<AudioData> &audioData)
139 {
140 DHLOGI("ReceiverEngine feed audiodata not support.");
141 (void)audioData;
142 return DH_SUCCESS;
143 }
144
SendMessage(uint32_t type,std::string content,std::string dstDevId)145 int32_t AVTransReceiverTransport::SendMessage(uint32_t type, std::string content, std::string dstDevId)
146 {
147 DHLOGI("Send message to remote. type: %u, content: %s.", type, content.c_str());
148 if (receiverAdapter_ == nullptr) {
149 DHLOGE("FeedAudioData receiver adapter is null.");
150 return ERR_DH_AUDIO_TRANS_NULL_VALUE;
151 }
152 auto message = std::make_shared<AVTransMessage>(type, content, dstDevId);
153 int32_t ret = receiverAdapter_->SendMessageToRemote(message);
154 if (ret != DH_SUCCESS) {
155 DHLOGE("Send message to remote engine failed");
156 return ret;
157 }
158 return DH_SUCCESS;
159 }
160
OnEngineEvent(const AVTransEvent & event)161 void AVTransReceiverTransport::OnEngineEvent(const AVTransEvent &event)
162 {
163 if (transCallback_ == nullptr) {
164 DHLOGE("Trans callback is nullptr.");
165 return;
166 }
167 transCallback_->OnEngineTransEvent(event);
168 }
169
OnEngineMessage(const std::shared_ptr<AVTransMessage> & message)170 void AVTransReceiverTransport::OnEngineMessage(const std::shared_ptr<AVTransMessage> &message)
171 {
172 if (message == nullptr) {
173 DHLOGE("The parameter is nullptr");
174 return;
175 }
176 if (transCallback_ == nullptr) {
177 DHLOGE("Event callback is nullptr.");
178 return;
179 }
180 transCallback_->OnEngineTransMessage(message);
181 }
182
OnEngineDataAvailable(const std::shared_ptr<AVTransBuffer> & buffer)183 void AVTransReceiverTransport::OnEngineDataAvailable(const std::shared_ptr<AVTransBuffer> &buffer)
184 {
185 DHLOGE("On Engine Data available");
186 if (buffer == nullptr) {
187 DHLOGE("The parameter is nullptr");
188 return;
189 }
190 auto bufferData = buffer->GetBufferData(0);
191 std::shared_ptr<AudioData> audioData = std::make_shared<AudioData>(bufferData->GetSize());
192 int32_t ret = memcpy_s(audioData->Data(), audioData->Capacity(), bufferData->GetAddress(), bufferData->GetSize());
193 if (ret != EOK) {
194 DHLOGE("Copy audio data failed, error code %d.", ret);
195 return;
196 }
197 transCallback_->OnEngineTransDataAvailable(audioData);
198 }
199
SetParameter(const AudioParam & audioParam)200 int32_t AVTransReceiverTransport::SetParameter(const AudioParam &audioParam)
201 {
202 DHLOGI("SetParameter.");
203 if (receiverAdapter_ == nullptr) {
204 DHLOGE("SetParameter error. adapter is null.");
205 return ERR_DH_AUDIO_NULLPTR;
206 }
207 receiverAdapter_->SetParameter(AVTransTag::AUDIO_SAMPLE_RATE, std::to_string(audioParam.comParam.sampleRate));
208 receiverAdapter_->SetParameter(AVTransTag::AUDIO_SAMPLE_FORMAT, std::to_string(AudioSampleFormat::SAMPLE_F32LE));
209 receiverAdapter_->SetParameter(AVTransTag::AUDIO_CHANNEL_MASK, std::to_string(audioParam.comParam.channelMask));
210 receiverAdapter_->SetParameter(AVTransTag::AUDIO_CHANNEL_LAYOUT, std::to_string(audioParam.comParam.channelMask));
211 receiverAdapter_->SetParameter(AVTransTag::AUDIO_BIT_RATE, std::to_string(AUDIO_SET_HISTREAMER_BIT_RATE));
212 receiverAdapter_->SetParameter(AVTransTag::AUDIO_FRAME_SIZE, std::to_string(audioParam.comParam.frameSize));
213 receiverAdapter_->SetParameter(AVTransTag::AUDIO_CODEC_TYPE, std::to_string(audioParam.comParam.codecType));
214 receiverAdapter_->SetParameter(AVTransTag::ENGINE_READY, OWNER_NAME_D_SPEAKER);
215 return DH_SUCCESS;
216 }
217 } // namespace DistributedHardware
218 } // namespace OHOS