1 /*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "HidlUtils.h"
18
19 #include <common/all-versions/VersionUtils.h>
20 #include <string.h>
21
22 using ::android::hardware::audio::common::utils::EnumBitfield;
23
24 namespace android {
25 namespace hardware {
26 namespace audio {
27 namespace common {
28 namespace CPP_VERSION {
29 namespace implementation {
30
audioConfigFromHal(const audio_config_t & halConfig,AudioConfig * config)31 status_t HidlUtils::audioConfigFromHal(const audio_config_t& halConfig, AudioConfig* config) {
32 config->sampleRateHz = halConfig.sample_rate;
33 config->channelMask = EnumBitfield<AudioChannelMask>(halConfig.channel_mask);
34 config->format = AudioFormat(halConfig.format);
35 status_t status = audioOffloadInfoFromHal(halConfig.offload_info, &config->offloadInfo);
36 config->frameCount = halConfig.frame_count;
37 return status;
38 }
39
audioConfigToHal(const AudioConfig & config,audio_config_t * halConfig)40 void HidlUtils::audioConfigToHal(const AudioConfig& config, audio_config_t* halConfig) {
41 memset(halConfig, 0, sizeof(audio_config_t));
42 halConfig->sample_rate = config.sampleRateHz;
43 halConfig->channel_mask = static_cast<audio_channel_mask_t>(config.channelMask);
44 halConfig->format = static_cast<audio_format_t>(config.format);
45 audioOffloadInfoToHal(config.offloadInfo, &halConfig->offload_info);
46 halConfig->frame_count = config.frameCount;
47 }
48
audioGainConfigFromHal(const struct audio_gain_config & halConfig,AudioGainConfig * config)49 void HidlUtils::audioGainConfigFromHal(const struct audio_gain_config& halConfig,
50 AudioGainConfig* config) {
51 config->index = halConfig.index;
52 config->mode = EnumBitfield<AudioGainMode>(halConfig.mode);
53 config->channelMask = EnumBitfield<AudioChannelMask>(halConfig.channel_mask);
54 for (size_t i = 0; i < sizeof(audio_channel_mask_t) * 8; ++i) {
55 config->values[i] = halConfig.values[i];
56 }
57 config->rampDurationMs = halConfig.ramp_duration_ms;
58 }
59
audioGainConfigToHal(const AudioGainConfig & config,struct audio_gain_config * halConfig)60 void HidlUtils::audioGainConfigToHal(const AudioGainConfig& config,
61 struct audio_gain_config* halConfig) {
62 halConfig->index = config.index;
63 halConfig->mode = static_cast<audio_gain_mode_t>(config.mode);
64 halConfig->channel_mask = static_cast<audio_channel_mask_t>(config.channelMask);
65 memset(halConfig->values, 0, sizeof(halConfig->values));
66 for (size_t i = 0; i < sizeof(audio_channel_mask_t) * 8; ++i) {
67 halConfig->values[i] = config.values[i];
68 }
69 halConfig->ramp_duration_ms = config.rampDurationMs;
70 }
71
audioGainFromHal(const struct audio_gain & halGain,AudioGain * gain)72 void HidlUtils::audioGainFromHal(const struct audio_gain& halGain, AudioGain* gain) {
73 gain->mode = EnumBitfield<AudioGainMode>(halGain.mode);
74 gain->channelMask = EnumBitfield<AudioChannelMask>(halGain.channel_mask);
75 gain->minValue = halGain.min_value;
76 gain->maxValue = halGain.max_value;
77 gain->defaultValue = halGain.default_value;
78 gain->stepValue = halGain.step_value;
79 gain->minRampMs = halGain.min_ramp_ms;
80 gain->maxRampMs = halGain.max_ramp_ms;
81 }
82
audioGainToHal(const AudioGain & gain,struct audio_gain * halGain)83 void HidlUtils::audioGainToHal(const AudioGain& gain, struct audio_gain* halGain) {
84 halGain->mode = static_cast<audio_gain_mode_t>(gain.mode);
85 halGain->channel_mask = static_cast<audio_channel_mask_t>(gain.channelMask);
86 halGain->min_value = gain.minValue;
87 halGain->max_value = gain.maxValue;
88 halGain->default_value = gain.defaultValue;
89 halGain->step_value = gain.stepValue;
90 halGain->min_ramp_ms = gain.minRampMs;
91 halGain->max_ramp_ms = gain.maxRampMs;
92 }
93
audioUsageFromHal(const audio_usage_t halUsage)94 AudioUsage HidlUtils::audioUsageFromHal(const audio_usage_t halUsage) {
95 switch (halUsage) {
96 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
97 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
98 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
99 case AUDIO_USAGE_NOTIFICATION_EVENT:
100 return AudioUsage::NOTIFICATION;
101 default:
102 return static_cast<AudioUsage>(halUsage);
103 }
104 }
105
audioUsageToHal(const AudioUsage usage)106 audio_usage_t HidlUtils::audioUsageToHal(const AudioUsage usage) {
107 return static_cast<audio_usage_t>(usage);
108 }
109
audioOffloadInfoFromHal(const audio_offload_info_t & halOffload,AudioOffloadInfo * offload)110 status_t HidlUtils::audioOffloadInfoFromHal(const audio_offload_info_t& halOffload,
111 AudioOffloadInfo* offload) {
112 offload->sampleRateHz = halOffload.sample_rate;
113 offload->channelMask = EnumBitfield<AudioChannelMask>(halOffload.channel_mask);
114 offload->format = AudioFormat(halOffload.format);
115 offload->streamType = AudioStreamType(halOffload.stream_type);
116 offload->bitRatePerSecond = halOffload.bit_rate;
117 offload->durationMicroseconds = halOffload.duration_us;
118 offload->hasVideo = halOffload.has_video;
119 offload->isStreaming = halOffload.is_streaming;
120 offload->bitWidth = halOffload.bit_width;
121 offload->bufferSize = halOffload.offload_buffer_size;
122 offload->usage = audioUsageFromHal(halOffload.usage);
123 #if MAJOR_VERSION >= 6
124 if (halOffload.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2) {
125 offload->encapsulationMode =
126 static_cast<AudioEncapsulationMode>(halOffload.encapsulation_mode);
127 offload->contentId = halOffload.content_id;
128 offload->syncId = halOffload.sync_id;
129 } else {
130 offload->encapsulationMode = AudioEncapsulationMode::NONE;
131 offload->contentId = 0;
132 offload->syncId = 0;
133 }
134 #else
135 // nonzero values here are not compatible with HAL versions below 6.
136 if (halOffload.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2 &&
137 (halOffload.encapsulation_mode != AUDIO_ENCAPSULATION_MODE_NONE ||
138 halOffload.content_id != 0 || halOffload.sync_id != 0)) {
139 return BAD_VALUE;
140 }
141 #endif
142 return OK;
143 }
144
audioOffloadInfoToHal(const AudioOffloadInfo & offload,audio_offload_info_t * halOffload)145 void HidlUtils::audioOffloadInfoToHal(const AudioOffloadInfo& offload,
146 audio_offload_info_t* halOffload) {
147 *halOffload = AUDIO_INFO_INITIALIZER;
148 halOffload->sample_rate = offload.sampleRateHz;
149 halOffload->channel_mask = static_cast<audio_channel_mask_t>(offload.channelMask);
150 halOffload->format = static_cast<audio_format_t>(offload.format);
151 halOffload->stream_type = static_cast<audio_stream_type_t>(offload.streamType);
152 halOffload->bit_rate = offload.bitRatePerSecond;
153 halOffload->duration_us = offload.durationMicroseconds;
154 halOffload->has_video = offload.hasVideo;
155 halOffload->is_streaming = offload.isStreaming;
156 halOffload->bit_width = offload.bitWidth;
157 halOffload->offload_buffer_size = offload.bufferSize;
158 halOffload->usage = audioUsageToHal(offload.usage);
159 #if MAJOR_VERSION >= 6
160 halOffload->encapsulation_mode =
161 static_cast<audio_encapsulation_mode_t>(offload.encapsulationMode);
162 halOffload->content_id = offload.contentId;
163 halOffload->sync_id = offload.syncId;
164 #else
165 // offload doesn't contain encapsulationMode, contentId, syncId, so this is OK.
166 #endif
167 }
168
audioPortConfigFromHal(const struct audio_port_config & halConfig,AudioPortConfig * config)169 void HidlUtils::audioPortConfigFromHal(const struct audio_port_config& halConfig,
170 AudioPortConfig* config) {
171 config->id = halConfig.id;
172 config->role = AudioPortRole(halConfig.role);
173 config->type = AudioPortType(halConfig.type);
174 config->configMask = EnumBitfield<AudioPortConfigMask>(halConfig.config_mask);
175 config->sampleRateHz = halConfig.sample_rate;
176 config->channelMask = EnumBitfield<AudioChannelMask>(halConfig.channel_mask);
177 config->format = AudioFormat(halConfig.format);
178 audioGainConfigFromHal(halConfig.gain, &config->gain);
179 switch (halConfig.type) {
180 case AUDIO_PORT_TYPE_NONE:
181 break;
182 case AUDIO_PORT_TYPE_DEVICE: {
183 config->ext.device.hwModule = halConfig.ext.device.hw_module;
184 config->ext.device.type = AudioDevice(halConfig.ext.device.type);
185 memcpy(config->ext.device.address.data(), halConfig.ext.device.address,
186 AUDIO_DEVICE_MAX_ADDRESS_LEN);
187 break;
188 }
189 case AUDIO_PORT_TYPE_MIX: {
190 config->ext.mix.hwModule = halConfig.ext.mix.hw_module;
191 config->ext.mix.ioHandle = halConfig.ext.mix.handle;
192 if (halConfig.role == AUDIO_PORT_ROLE_SOURCE) {
193 config->ext.mix.useCase.stream = AudioStreamType(halConfig.ext.mix.usecase.stream);
194 } else if (halConfig.role == AUDIO_PORT_ROLE_SINK) {
195 config->ext.mix.useCase.source = AudioSource(halConfig.ext.mix.usecase.source);
196 }
197 break;
198 }
199 case AUDIO_PORT_TYPE_SESSION: {
200 config->ext.session.session = halConfig.ext.session.session;
201 break;
202 }
203 }
204 }
205
audioPortConfigToHal(const AudioPortConfig & config,struct audio_port_config * halConfig)206 void HidlUtils::audioPortConfigToHal(const AudioPortConfig& config,
207 struct audio_port_config* halConfig) {
208 memset(halConfig, 0, sizeof(audio_port_config));
209 halConfig->id = config.id;
210 halConfig->role = static_cast<audio_port_role_t>(config.role);
211 halConfig->type = static_cast<audio_port_type_t>(config.type);
212 halConfig->config_mask = static_cast<unsigned int>(config.configMask);
213 halConfig->sample_rate = config.sampleRateHz;
214 halConfig->channel_mask = static_cast<audio_channel_mask_t>(config.channelMask);
215 halConfig->format = static_cast<audio_format_t>(config.format);
216 audioGainConfigToHal(config.gain, &halConfig->gain);
217 switch (config.type) {
218 case AudioPortType::NONE:
219 break;
220 case AudioPortType::DEVICE: {
221 halConfig->ext.device.hw_module = config.ext.device.hwModule;
222 halConfig->ext.device.type = static_cast<audio_devices_t>(config.ext.device.type);
223 memcpy(halConfig->ext.device.address, config.ext.device.address.data(),
224 AUDIO_DEVICE_MAX_ADDRESS_LEN);
225 break;
226 }
227 case AudioPortType::MIX: {
228 halConfig->ext.mix.hw_module = config.ext.mix.hwModule;
229 halConfig->ext.mix.handle = config.ext.mix.ioHandle;
230 if (config.role == AudioPortRole::SOURCE) {
231 halConfig->ext.mix.usecase.stream =
232 static_cast<audio_stream_type_t>(config.ext.mix.useCase.stream);
233 } else if (config.role == AudioPortRole::SINK) {
234 halConfig->ext.mix.usecase.source =
235 static_cast<audio_source_t>(config.ext.mix.useCase.source);
236 }
237 break;
238 }
239 case AudioPortType::SESSION: {
240 halConfig->ext.session.session =
241 static_cast<audio_session_t>(config.ext.session.session);
242 break;
243 }
244 }
245 }
246
audioPortConfigsFromHal(unsigned int numHalConfigs,const struct audio_port_config * halConfigs,hidl_vec<AudioPortConfig> * configs)247 void HidlUtils::audioPortConfigsFromHal(unsigned int numHalConfigs,
248 const struct audio_port_config* halConfigs,
249 hidl_vec<AudioPortConfig>* configs) {
250 configs->resize(numHalConfigs);
251 for (unsigned int i = 0; i < numHalConfigs; ++i) {
252 audioPortConfigFromHal(halConfigs[i], &(*configs)[i]);
253 }
254 }
255
audioPortConfigsToHal(const hidl_vec<AudioPortConfig> & configs)256 std::unique_ptr<audio_port_config[]> HidlUtils::audioPortConfigsToHal(
257 const hidl_vec<AudioPortConfig>& configs) {
258 std::unique_ptr<audio_port_config[]> halConfigs(new audio_port_config[configs.size()]);
259 for (size_t i = 0; i < configs.size(); ++i) {
260 audioPortConfigToHal(configs[i], &halConfigs[i]);
261 }
262 return halConfigs;
263 }
264
audioPortFromHal(const struct audio_port & halPort,AudioPort * port)265 void HidlUtils::audioPortFromHal(const struct audio_port& halPort, AudioPort* port) {
266 port->id = halPort.id;
267 port->role = AudioPortRole(halPort.role);
268 port->type = AudioPortType(halPort.type);
269 port->name.setToExternal(halPort.name, strlen(halPort.name));
270 port->sampleRates.resize(halPort.num_sample_rates);
271 for (size_t i = 0; i < halPort.num_sample_rates; ++i) {
272 port->sampleRates[i] = halPort.sample_rates[i];
273 }
274 port->channelMasks.resize(halPort.num_channel_masks);
275 for (size_t i = 0; i < halPort.num_channel_masks; ++i) {
276 port->channelMasks[i] = EnumBitfield<AudioChannelMask>(halPort.channel_masks[i]);
277 }
278 port->formats.resize(halPort.num_formats);
279 for (size_t i = 0; i < halPort.num_formats; ++i) {
280 port->formats[i] = AudioFormat(halPort.formats[i]);
281 }
282 port->gains.resize(halPort.num_gains);
283 for (size_t i = 0; i < halPort.num_gains; ++i) {
284 audioGainFromHal(halPort.gains[i], &port->gains[i]);
285 }
286 audioPortConfigFromHal(halPort.active_config, &port->activeConfig);
287 switch (halPort.type) {
288 case AUDIO_PORT_TYPE_NONE:
289 break;
290 case AUDIO_PORT_TYPE_DEVICE: {
291 port->ext.device.hwModule = halPort.ext.device.hw_module;
292 port->ext.device.type = AudioDevice(halPort.ext.device.type);
293 memcpy(port->ext.device.address.data(), halPort.ext.device.address,
294 AUDIO_DEVICE_MAX_ADDRESS_LEN);
295 break;
296 }
297 case AUDIO_PORT_TYPE_MIX: {
298 port->ext.mix.hwModule = halPort.ext.mix.hw_module;
299 port->ext.mix.ioHandle = halPort.ext.mix.handle;
300 port->ext.mix.latencyClass = AudioMixLatencyClass(halPort.ext.mix.latency_class);
301 break;
302 }
303 case AUDIO_PORT_TYPE_SESSION: {
304 port->ext.session.session = halPort.ext.session.session;
305 break;
306 }
307 }
308 }
309
audioPortToHal(const AudioPort & port,struct audio_port * halPort)310 void HidlUtils::audioPortToHal(const AudioPort& port, struct audio_port* halPort) {
311 memset(halPort, 0, sizeof(audio_port));
312 halPort->id = port.id;
313 halPort->role = static_cast<audio_port_role_t>(port.role);
314 halPort->type = static_cast<audio_port_type_t>(port.type);
315 strncpy(halPort->name, port.name.c_str(), AUDIO_PORT_MAX_NAME_LEN);
316 halPort->name[AUDIO_PORT_MAX_NAME_LEN - 1] = '\0';
317 halPort->num_sample_rates =
318 std::min(port.sampleRates.size(), static_cast<size_t>(AUDIO_PORT_MAX_SAMPLING_RATES));
319 for (size_t i = 0; i < halPort->num_sample_rates; ++i) {
320 halPort->sample_rates[i] = port.sampleRates[i];
321 }
322 halPort->num_channel_masks =
323 std::min(port.channelMasks.size(), static_cast<size_t>(AUDIO_PORT_MAX_CHANNEL_MASKS));
324 for (size_t i = 0; i < halPort->num_channel_masks; ++i) {
325 halPort->channel_masks[i] = static_cast<audio_channel_mask_t>(port.channelMasks[i]);
326 }
327 halPort->num_formats =
328 std::min(port.formats.size(), static_cast<size_t>(AUDIO_PORT_MAX_FORMATS));
329 for (size_t i = 0; i < halPort->num_formats; ++i) {
330 halPort->formats[i] = static_cast<audio_format_t>(port.formats[i]);
331 }
332 halPort->num_gains = std::min(port.gains.size(), static_cast<size_t>(AUDIO_PORT_MAX_GAINS));
333 for (size_t i = 0; i < halPort->num_gains; ++i) {
334 audioGainToHal(port.gains[i], &halPort->gains[i]);
335 }
336 audioPortConfigToHal(port.activeConfig, &halPort->active_config);
337 switch (port.type) {
338 case AudioPortType::NONE:
339 break;
340 case AudioPortType::DEVICE: {
341 halPort->ext.device.hw_module = port.ext.device.hwModule;
342 halPort->ext.device.type = static_cast<audio_devices_t>(port.ext.device.type);
343 memcpy(halPort->ext.device.address, port.ext.device.address.data(),
344 AUDIO_DEVICE_MAX_ADDRESS_LEN);
345 break;
346 }
347 case AudioPortType::MIX: {
348 halPort->ext.mix.hw_module = port.ext.mix.hwModule;
349 halPort->ext.mix.handle = port.ext.mix.ioHandle;
350 halPort->ext.mix.latency_class =
351 static_cast<audio_mix_latency_class_t>(port.ext.mix.latencyClass);
352 break;
353 }
354 case AudioPortType::SESSION: {
355 halPort->ext.session.session = static_cast<audio_session_t>(port.ext.session.session);
356 break;
357 }
358 }
359 }
360
uuidFromHal(const audio_uuid_t & halUuid,Uuid * uuid)361 void HidlUtils::uuidFromHal(const audio_uuid_t& halUuid, Uuid* uuid) {
362 uuid->timeLow = halUuid.timeLow;
363 uuid->timeMid = halUuid.timeMid;
364 uuid->versionAndTimeHigh = halUuid.timeHiAndVersion;
365 uuid->variantAndClockSeqHigh = halUuid.clockSeq;
366 memcpy(uuid->node.data(), halUuid.node, uuid->node.size());
367 }
368
uuidToHal(const Uuid & uuid,audio_uuid_t * halUuid)369 void HidlUtils::uuidToHal(const Uuid& uuid, audio_uuid_t* halUuid) {
370 halUuid->timeLow = uuid.timeLow;
371 halUuid->timeMid = uuid.timeMid;
372 halUuid->timeHiAndVersion = uuid.versionAndTimeHigh;
373 halUuid->clockSeq = uuid.variantAndClockSeqHigh;
374 memcpy(halUuid->node, uuid.node.data(), uuid.node.size());
375 }
376
377 } // namespace implementation
378 } // namespace CPP_VERSION
379 } // namespace common
380 } // namespace audio
381 } // namespace hardware
382 } // namespace android
383