• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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