1 /*
2 * Copyright (c) 2022-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 "daudio_manager_callback.h"
17
18 #include <cstdint>
19 #include <hdf_base.h>
20 #include <securec.h>
21
22 #include "audio_types.h"
23
24 #include "daudio_constants.h"
25 #include "daudio_errorcode.h"
26 #include "daudio_log.h"
27
28 #undef DH_LOG_TAG
29 #define DH_LOG_TAG "DAudioManagerCallback"
30
31 using OHOS::HDI::DistributedAudio::Audioext::V1_0::AudioParameter;
32
33 namespace OHOS {
34 namespace DistributedHardware {
OpenDevice(const std::string & adpName,int32_t devId)35 int32_t DAudioManagerCallback::OpenDevice(const std::string& adpName, int32_t devId)
36 {
37 DHLOGI("Open device.");
38 if (callback_ == nullptr) {
39 DHLOGE("Register hdi callback is nullptr.");
40 return HDF_FAILURE;
41 }
42 int32_t ret = callback_->OpenDevice(adpName, devId);
43 if (ret != DH_SUCCESS) {
44 DHLOGE("Call hdi callback failed.");
45 return HDF_FAILURE;
46 }
47 return HDF_SUCCESS;
48 }
49
CloseDevice(const std::string & adpName,int32_t devId)50 int32_t DAudioManagerCallback::CloseDevice(const std::string& adpName, int32_t devId)
51 {
52 DHLOGI("Close device.");
53 if (callback_ == nullptr) {
54 DHLOGE("Register hdi callback is nullptr.");
55 return HDF_FAILURE;
56 }
57 int32_t ret = callback_->CloseDevice(adpName, devId);
58 if (ret != DH_SUCCESS) {
59 DHLOGE("Rall hdi callback failed.");
60 return HDF_FAILURE;
61 }
62 return HDF_SUCCESS;
63 }
64
GetAudioParamHDF(const AudioParameter & param,AudioParamHDF & paramHDF)65 int32_t DAudioManagerCallback::GetAudioParamHDF(const AudioParameter& param, AudioParamHDF& paramHDF)
66 {
67 paramHDF.sampleRate = static_cast<AudioSampleRate>(param.sampleRate);
68 paramHDF.channelMask = static_cast<AudioChannel>(param.channelCount);
69 switch (static_cast<AudioFormat>(param.format)) {
70 case AUDIO_FORMAT_TYPE_PCM_8_BIT:
71 paramHDF.bitFormat = AudioSampleFormat::SAMPLE_U8;
72 break;
73 case AUDIO_FORMAT_TYPE_PCM_16_BIT:
74 paramHDF.bitFormat = AudioSampleFormat::SAMPLE_S16LE;
75 break;
76 case AUDIO_FORMAT_TYPE_PCM_24_BIT:
77 paramHDF.bitFormat = AudioSampleFormat::SAMPLE_S24LE;
78 break;
79 default:
80 DHLOGE("Format [%zu] does not support conversion.", param.format);
81 return HDF_FAILURE;
82 }
83 switch (static_cast<AudioCategory>(param.streamUsage)) {
84 case AUDIO_IN_MEDIA:
85 paramHDF.streamUsage = StreamUsage::STREAM_USAGE_MEDIA;
86 break;
87 case AUDIO_IN_COMMUNICATION:
88 paramHDF.streamUsage = StreamUsage::STREAM_USAGE_VOICE_COMMUNICATION;
89 break;
90 case AUDIO_IN_RINGTONE:
91 paramHDF.streamUsage = StreamUsage::STREAM_USAGE_NOTIFICATION_RINGTONE;
92 break;
93 case AUDIO_MMAP_NOIRQ:
94 paramHDF.streamUsage = StreamUsage::STREAM_USAGE_MMAP;
95 break;
96 default:
97 DHLOGE("Stream usage [%zu] does not support conversion.", param.streamUsage);
98 return HDF_FAILURE;
99 }
100 paramHDF.frameSize = param.frameSize;
101 paramHDF.period = param.period;
102 paramHDF.ext = param.ext;
103 paramHDF.renderFlags = static_cast<OHOS::DistributedHardware::PortOperationMode>(param.renderFlags);
104 paramHDF.capturerFlags = static_cast<OHOS::DistributedHardware::PortOperationMode>(param.capturerFlags);
105 DHLOGI("HDF Param: sample rate %d, channel %d, bit format %d, stream usage %d, frame size %zu, " +
106 "period %zu, renderFlags %d, capturerFlags %d, ext {%s}.", paramHDF.sampleRate, paramHDF.channelMask,
107 paramHDF.bitFormat, paramHDF.streamUsage, paramHDF.frameSize, paramHDF.period, paramHDF.renderFlags,
108 paramHDF.capturerFlags, paramHDF.ext.c_str());
109 return HDF_SUCCESS;
110 }
111
SetParameters(const std::string & adpName,int32_t devId,const AudioParameter & param)112 int32_t DAudioManagerCallback::SetParameters(const std::string& adpName, int32_t devId, const AudioParameter& param)
113 {
114 DHLOGD("Set Parameters.");
115 if (callback_ == nullptr) {
116 DHLOGE("Register hdi callback is nullptr.");
117 return HDF_FAILURE;
118 }
119
120 AudioParamHDF paramHDF;
121 int32_t ret = GetAudioParamHDF(param, paramHDF);
122 if (ret != DH_SUCCESS) {
123 DHLOGE("Get audio HDF param failed.");
124 return HDF_FAILURE;
125 }
126 ret = callback_->SetParameters(adpName, devId, paramHDF);
127 if (ret != DH_SUCCESS) {
128 DHLOGE("Call hdi callback failed.");
129 return HDF_FAILURE;
130 }
131 return HDF_SUCCESS;
132 }
133
NotifyEvent(const std::string & adpName,int32_t devId,const OHOS::HDI::DistributedAudio::Audioext::V1_0::DAudioEvent & event)134 int32_t DAudioManagerCallback::NotifyEvent(const std::string& adpName, int32_t devId,
135 const OHOS::HDI::DistributedAudio::Audioext::V1_0::DAudioEvent& event)
136 {
137 DHLOGI("Notify event.");
138 if (callback_ == nullptr) {
139 DHLOGE("Register hdi callback is nullptr.");
140 return HDF_FAILURE;
141 }
142 AudioEvent newEvent(AudioEventType::EVENT_UNKNOWN, event.content);
143 switch (event.type) {
144 case AudioEventHDF::AUDIO_EVENT_VOLUME_SET:
145 newEvent.type = AudioEventType::VOLUME_SET;
146 break;
147 case AudioEventHDF::AUDIO_EVENT_MUTE_SET:
148 newEvent.type = AudioEventType::VOLUME_MUTE_SET;
149 break;
150 case AudioEventHDF::AUDIO_EVENT_CHANGE_PLAY_STATUS:
151 newEvent.type = AudioEventType::CHANGE_PLAY_STATUS;
152 break;
153 case AudioEventHDF::AUDIO_EVENT_MMAP_START_SPK:
154 newEvent.type = AudioEventType::MMAP_SPK_START;
155 break;
156 case AudioEventHDF::AUDIO_EVENT_MMAP_STOP_SPK:
157 newEvent.type = AudioEventType::MMAP_SPK_STOP;
158 break;
159 case AudioEventHDF::AUDIO_EVENT_MMAP_START_MIC:
160 newEvent.type = AudioEventType::MMAP_MIC_START;
161 break;
162 case AudioEventHDF::AUDIO_EVENT_MMAP_STOP_MIC:
163 newEvent.type = AudioEventType::MMAP_MIC_STOP;
164 break;
165 case AudioEventHDF::AUDIO_EVENT_START:
166 newEvent.type = AudioEventType::AUDIO_START;
167 break;
168 case AudioEventHDF::AUDIO_EVENT_STOP:
169 newEvent.type = AudioEventType::AUDIO_STOP;
170 break;
171 default:
172 DHLOGE("Unsupport event tpye.");
173 break;
174 }
175
176 int32_t ret = callback_->NotifyEvent(adpName, devId, newEvent);
177 if (ret != DH_SUCCESS) {
178 DHLOGE("Call hdi callback failed.");
179 return HDF_FAILURE;
180 }
181 return HDF_SUCCESS;
182 }
183
WriteStreamData(const std::string & adpName,int32_t devId,const OHOS::HDI::DistributedAudio::Audioext::V1_0::AudioData & data)184 int32_t DAudioManagerCallback::WriteStreamData(const std::string &adpName, int32_t devId,
185 const OHOS::HDI::DistributedAudio::Audioext::V1_0::AudioData &data)
186 {
187 DHLOGD("Write Stream Data.");
188 if (callback_ == nullptr) {
189 DHLOGE("Register hdi callback is nullptr.");
190 return HDF_FAILURE;
191 }
192 DHLOGD("Audio data param frameSize is %d.", data.param.frameSize);
193 if (data.param.frameSize == 0 || data.param.frameSize > DEFAULT_AUDIO_DATA_SIZE) {
194 DHLOGE("Audio data param frameSize is 0. or > 4096");
195 return HDF_FAILURE;
196 }
197
198 std::shared_ptr<AudioData> audioData = std::make_shared<AudioData>(data.param.frameSize);
199 int32_t ret = memcpy_s(audioData->Data(), audioData->Capacity(), data.data.data(), data.data.size());
200 if (ret != EOK) {
201 DHLOGE("Copy audio data failed, error code %d.", ret);
202 return HDF_FAILURE;
203 }
204 ret = callback_->WriteStreamData(adpName, devId, audioData);
205 if (ret != DH_SUCCESS) {
206 DHLOGE("WriteStreamData failed.");
207 return HDF_FAILURE;
208 }
209 return HDF_SUCCESS;
210 }
211
ReadStreamData(const std::string & adpName,int32_t devId,OHOS::HDI::DistributedAudio::Audioext::V1_0::AudioData & data)212 int32_t DAudioManagerCallback::ReadStreamData(const std::string &adpName, int32_t devId,
213 OHOS::HDI::DistributedAudio::Audioext::V1_0::AudioData &data)
214 {
215 DHLOGD("Read stream data.");
216 if (callback_ == nullptr) {
217 DHLOGE("Register hdi callback is nullptr.");
218 return HDF_FAILURE;
219 }
220
221 std::shared_ptr<AudioData> audioData = nullptr;
222 int32_t ret = callback_->ReadStreamData(adpName, devId, audioData);
223 if (ret != DH_SUCCESS || audioData == nullptr) {
224 DHLOGE("Read stream data failed.");
225 return HDF_FAILURE;
226 }
227 data.data.assign(audioData->Data(), audioData->Data()+audioData->Capacity());
228 DHLOGD("Read stream data success.");
229 return HDF_SUCCESS;
230 }
231
ReadMmapPosition(const std::string & adpName,int32_t devId,uint64_t & frames,OHOS::HDI::DistributedAudio::Audioext::V1_0::CurrentTime & time)232 int32_t DAudioManagerCallback::ReadMmapPosition(const std::string &adpName, int32_t devId,
233 uint64_t &frames, OHOS::HDI::DistributedAudio::Audioext::V1_0::CurrentTime &time)
234 {
235 DHLOGD("Read mmap position");
236 if (callback_ == nullptr) {
237 DHLOGE("Regisiter hdi callback id nullptr.");
238 return HDF_FAILURE;
239 }
240 CurrentTimeHDF timeHdf;
241 int32_t ret = callback_->ReadMmapPosition(adpName, devId, frames, timeHdf);
242 if (ret != DH_SUCCESS) {
243 DHLOGE("Read mmap position failed.");
244 return HDF_FAILURE;
245 }
246 time.tvSec = timeHdf.tvSec;
247 time.tvNSec = timeHdf.tvNSec;
248 DHLOGD("Read mmap position success.");
249 return HDF_SUCCESS;
250 }
251
RefreshAshmemInfo(const std::string & adpName,int32_t devId,int fd,int32_t ashmemLength,int32_t lengthPerTrans)252 int32_t DAudioManagerCallback::RefreshAshmemInfo(const std::string &adpName, int32_t devId,
253 int fd, int32_t ashmemLength, int32_t lengthPerTrans)
254 {
255 DHLOGD("Refresh ashmem info.");
256 if (callback_ == nullptr) {
257 DHLOGE("Regisiter hdi callback id nullptr.");
258 return HDF_FAILURE;
259 }
260 int32_t ret = callback_->RefreshAshmemInfo(adpName, devId, fd, ashmemLength, lengthPerTrans);
261 if (ret != DH_SUCCESS) {
262 DHLOGE("Refresh ashmem info failed.");
263 return HDF_FAILURE;
264 }
265 DHLOGD("Refresh ashmem info success.");
266 return HDF_SUCCESS;
267 }
268 } // DistributedHardware
269 } // OHOS
270