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