blob: 08002c878867985407c26c54693cfba8a4fe91bc [file] [log] [blame]
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -08001/*
Kevin Rocard96d2cd92018-11-14 16:22:07 -08002 * Copyright (C) 2018 The Android Open Source Project
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -08003 *
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
Kevin Rocard96d2cd92018-11-14 16:22:07 -080017#include "HidlUtils.h"
Kevin Rocard6891d7e2017-12-14 18:39:39 -080018
Kevin Rocardb3f36c02018-02-26 18:45:07 -080019#include <common/all-versions/VersionUtils.h>
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -080020#include <string.h>
21
Kevin Rocardf5305b32018-11-13 10:41:53 -080022using ::android::hardware::audio::common::utils::EnumBitfield;
Kevin Rocardb3f36c02018-02-26 18:45:07 -080023
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -080024namespace android {
Kevin Rocard6891d7e2017-12-14 18:39:39 -080025namespace hardware {
26namespace audio {
27namespace common {
Kevin Rocard96d2cd92018-11-14 16:22:07 -080028namespace CPP_VERSION {
Mikhail Naganov543bf9c2018-12-11 16:36:53 -080029namespace implementation {
30
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -080031void HidlUtils::audioConfigFromHal(const audio_config_t& halConfig, AudioConfig* config) {
32 config->sampleRateHz = halConfig.sample_rate;
Kevin Rocardf5305b32018-11-13 10:41:53 -080033 config->channelMask = EnumBitfield<AudioChannelMask>(halConfig.channel_mask);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -080034 config->format = AudioFormat(halConfig.format);
35 audioOffloadInfoFromHal(halConfig.offload_info, &config->offloadInfo);
36 config->frameCount = halConfig.frame_count;
37}
38
39void HidlUtils::audioConfigToHal(const AudioConfig& config, audio_config_t* halConfig) {
40 memset(halConfig, 0, sizeof(audio_config_t));
41 halConfig->sample_rate = config.sampleRateHz;
42 halConfig->channel_mask = static_cast<audio_channel_mask_t>(config.channelMask);
43 halConfig->format = static_cast<audio_format_t>(config.format);
44 audioOffloadInfoToHal(config.offloadInfo, &halConfig->offload_info);
45 halConfig->frame_count = config.frameCount;
46}
47
Kevin Rocarddc874e02017-12-14 18:50:12 -080048void HidlUtils::audioGainConfigFromHal(const struct audio_gain_config& halConfig,
49 AudioGainConfig* config) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -080050 config->index = halConfig.index;
Kevin Rocardf5305b32018-11-13 10:41:53 -080051 config->mode = EnumBitfield<AudioGainMode>(halConfig.mode);
52 config->channelMask = EnumBitfield<AudioChannelMask>(halConfig.channel_mask);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -080053 for (size_t i = 0; i < sizeof(audio_channel_mask_t) * 8; ++i) {
54 config->values[i] = halConfig.values[i];
55 }
56 config->rampDurationMs = halConfig.ramp_duration_ms;
57}
58
Kevin Rocarddc874e02017-12-14 18:50:12 -080059void HidlUtils::audioGainConfigToHal(const AudioGainConfig& config,
60 struct audio_gain_config* halConfig) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -080061 halConfig->index = config.index;
62 halConfig->mode = static_cast<audio_gain_mode_t>(config.mode);
63 halConfig->channel_mask = static_cast<audio_channel_mask_t>(config.channelMask);
64 memset(halConfig->values, 0, sizeof(halConfig->values));
65 for (size_t i = 0; i < sizeof(audio_channel_mask_t) * 8; ++i) {
66 halConfig->values[i] = config.values[i];
67 }
68 halConfig->ramp_duration_ms = config.rampDurationMs;
69}
70
71void HidlUtils::audioGainFromHal(const struct audio_gain& halGain, AudioGain* gain) {
Kevin Rocardf5305b32018-11-13 10:41:53 -080072 gain->mode = EnumBitfield<AudioGainMode>(halGain.mode);
73 gain->channelMask = EnumBitfield<AudioChannelMask>(halGain.channel_mask);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -080074 gain->minValue = halGain.min_value;
75 gain->maxValue = halGain.max_value;
76 gain->defaultValue = halGain.default_value;
77 gain->stepValue = halGain.step_value;
78 gain->minRampMs = halGain.min_ramp_ms;
79 gain->maxRampMs = halGain.max_ramp_ms;
80}
81
82void HidlUtils::audioGainToHal(const AudioGain& gain, struct audio_gain* halGain) {
83 halGain->mode = static_cast<audio_gain_mode_t>(gain.mode);
84 halGain->channel_mask = static_cast<audio_channel_mask_t>(gain.channelMask);
85 halGain->min_value = gain.minValue;
86 halGain->max_value = gain.maxValue;
87 halGain->default_value = gain.defaultValue;
88 halGain->step_value = gain.stepValue;
89 halGain->min_ramp_ms = gain.minRampMs;
90 halGain->max_ramp_ms = gain.maxRampMs;
91}
92
Kevin Rocard97331362018-02-23 18:43:39 -080093AudioUsage HidlUtils::audioUsageFromHal(const audio_usage_t halUsage) {
94 switch (halUsage) {
95 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
96 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
97 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
98 case AUDIO_USAGE_NOTIFICATION_EVENT:
99 return AudioUsage::NOTIFICATION;
100 default:
101 return static_cast<AudioUsage>(halUsage);
102 }
103}
104
105audio_usage_t HidlUtils::audioUsageToHal(const AudioUsage usage) {
106 return static_cast<audio_usage_t>(usage);
107}
108
Kevin Rocarddc874e02017-12-14 18:50:12 -0800109void HidlUtils::audioOffloadInfoFromHal(const audio_offload_info_t& halOffload,
110 AudioOffloadInfo* offload) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800111 offload->sampleRateHz = halOffload.sample_rate;
Kevin Rocardf5305b32018-11-13 10:41:53 -0800112 offload->channelMask = EnumBitfield<AudioChannelMask>(halOffload.channel_mask);
Mikhail Naganov685f0e32016-12-16 17:18:08 -0800113 offload->format = AudioFormat(halOffload.format);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800114 offload->streamType = AudioStreamType(halOffload.stream_type);
115 offload->bitRatePerSecond = halOffload.bit_rate;
116 offload->durationMicroseconds = halOffload.duration_us;
117 offload->hasVideo = halOffload.has_video;
118 offload->isStreaming = halOffload.is_streaming;
vivek mehta92360362017-04-06 18:27:34 -0700119 offload->bitWidth = halOffload.bit_width;
120 offload->bufferSize = halOffload.offload_buffer_size;
Kevin Rocard97331362018-02-23 18:43:39 -0800121 offload->usage = audioUsageFromHal(halOffload.usage);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800122}
123
Kevin Rocarddc874e02017-12-14 18:50:12 -0800124void HidlUtils::audioOffloadInfoToHal(const AudioOffloadInfo& offload,
125 audio_offload_info_t* halOffload) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800126 *halOffload = AUDIO_INFO_INITIALIZER;
127 halOffload->sample_rate = offload.sampleRateHz;
128 halOffload->channel_mask = static_cast<audio_channel_mask_t>(offload.channelMask);
Mikhail Naganov685f0e32016-12-16 17:18:08 -0800129 halOffload->format = static_cast<audio_format_t>(offload.format);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800130 halOffload->stream_type = static_cast<audio_stream_type_t>(offload.streamType);
131 halOffload->bit_rate = offload.bitRatePerSecond;
132 halOffload->duration_us = offload.durationMicroseconds;
133 halOffload->has_video = offload.hasVideo;
134 halOffload->is_streaming = offload.isStreaming;
Mikhail Naganovc2920562016-11-21 18:33:52 -0800135 halOffload->bit_width = offload.bitWidth;
136 halOffload->offload_buffer_size = offload.bufferSize;
Kevin Rocard97331362018-02-23 18:43:39 -0800137 halOffload->usage = audioUsageToHal(offload.usage);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800138}
139
Kevin Rocarddc874e02017-12-14 18:50:12 -0800140void HidlUtils::audioPortConfigFromHal(const struct audio_port_config& halConfig,
141 AudioPortConfig* config) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800142 config->id = halConfig.id;
143 config->role = AudioPortRole(halConfig.role);
144 config->type = AudioPortType(halConfig.type);
Kevin Rocardf5305b32018-11-13 10:41:53 -0800145 config->configMask = EnumBitfield<AudioPortConfigMask>(halConfig.config_mask);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800146 config->sampleRateHz = halConfig.sample_rate;
Kevin Rocardf5305b32018-11-13 10:41:53 -0800147 config->channelMask = EnumBitfield<AudioChannelMask>(halConfig.channel_mask);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800148 config->format = AudioFormat(halConfig.format);
149 audioGainConfigFromHal(halConfig.gain, &config->gain);
150 switch (halConfig.type) {
Kevin Rocarddc874e02017-12-14 18:50:12 -0800151 case AUDIO_PORT_TYPE_NONE:
152 break;
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800153 case AUDIO_PORT_TYPE_DEVICE: {
154 config->ext.device.hwModule = halConfig.ext.device.hw_module;
155 config->ext.device.type = AudioDevice(halConfig.ext.device.type);
Kevin Rocarddc874e02017-12-14 18:50:12 -0800156 memcpy(config->ext.device.address.data(), halConfig.ext.device.address,
157 AUDIO_DEVICE_MAX_ADDRESS_LEN);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800158 break;
159 }
160 case AUDIO_PORT_TYPE_MIX: {
161 config->ext.mix.hwModule = halConfig.ext.mix.hw_module;
162 config->ext.mix.ioHandle = halConfig.ext.mix.handle;
163 if (halConfig.role == AUDIO_PORT_ROLE_SOURCE) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800164 config->ext.mix.useCase.stream = AudioStreamType(halConfig.ext.mix.usecase.stream);
Mikhail Naganov93b57782018-07-09 14:28:57 -0700165 } else if (halConfig.role == AUDIO_PORT_ROLE_SINK) {
166 config->ext.mix.useCase.source = AudioSource(halConfig.ext.mix.usecase.source);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800167 }
168 break;
169 }
170 case AUDIO_PORT_TYPE_SESSION: {
171 config->ext.session.session = halConfig.ext.session.session;
172 break;
173 }
174 }
175}
176
Kevin Rocarddc874e02017-12-14 18:50:12 -0800177void HidlUtils::audioPortConfigToHal(const AudioPortConfig& config,
178 struct audio_port_config* halConfig) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800179 memset(halConfig, 0, sizeof(audio_port_config));
180 halConfig->id = config.id;
181 halConfig->role = static_cast<audio_port_role_t>(config.role);
182 halConfig->type = static_cast<audio_port_type_t>(config.type);
183 halConfig->config_mask = static_cast<unsigned int>(config.configMask);
184 halConfig->sample_rate = config.sampleRateHz;
185 halConfig->channel_mask = static_cast<audio_channel_mask_t>(config.channelMask);
186 halConfig->format = static_cast<audio_format_t>(config.format);
187 audioGainConfigToHal(config.gain, &halConfig->gain);
188 switch (config.type) {
Kevin Rocarddc874e02017-12-14 18:50:12 -0800189 case AudioPortType::NONE:
190 break;
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800191 case AudioPortType::DEVICE: {
192 halConfig->ext.device.hw_module = config.ext.device.hwModule;
193 halConfig->ext.device.type = static_cast<audio_devices_t>(config.ext.device.type);
Kevin Rocarddc874e02017-12-14 18:50:12 -0800194 memcpy(halConfig->ext.device.address, config.ext.device.address.data(),
195 AUDIO_DEVICE_MAX_ADDRESS_LEN);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800196 break;
197 }
198 case AudioPortType::MIX: {
199 halConfig->ext.mix.hw_module = config.ext.mix.hwModule;
200 halConfig->ext.mix.handle = config.ext.mix.ioHandle;
201 if (config.role == AudioPortRole::SOURCE) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800202 halConfig->ext.mix.usecase.stream =
Kevin Rocarddc874e02017-12-14 18:50:12 -0800203 static_cast<audio_stream_type_t>(config.ext.mix.useCase.stream);
Mikhail Naganov93b57782018-07-09 14:28:57 -0700204 } else if (config.role == AudioPortRole::SINK) {
205 halConfig->ext.mix.usecase.source =
206 static_cast<audio_source_t>(config.ext.mix.useCase.source);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800207 }
208 break;
209 }
210 case AudioPortType::SESSION: {
211 halConfig->ext.session.session =
Kevin Rocarddc874e02017-12-14 18:50:12 -0800212 static_cast<audio_session_t>(config.ext.session.session);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800213 break;
214 }
215 }
216}
217
Kevin Rocarddc874e02017-12-14 18:50:12 -0800218void HidlUtils::audioPortConfigsFromHal(unsigned int numHalConfigs,
219 const struct audio_port_config* halConfigs,
220 hidl_vec<AudioPortConfig>* configs) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800221 configs->resize(numHalConfigs);
222 for (unsigned int i = 0; i < numHalConfigs; ++i) {
223 audioPortConfigFromHal(halConfigs[i], &(*configs)[i]);
224 }
225}
226
227std::unique_ptr<audio_port_config[]> HidlUtils::audioPortConfigsToHal(
Kevin Rocarddc874e02017-12-14 18:50:12 -0800228 const hidl_vec<AudioPortConfig>& configs) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800229 std::unique_ptr<audio_port_config[]> halConfigs(new audio_port_config[configs.size()]);
230 for (size_t i = 0; i < configs.size(); ++i) {
231 audioPortConfigToHal(configs[i], &halConfigs[i]);
232 }
233 return halConfigs;
234}
235
236void HidlUtils::audioPortFromHal(const struct audio_port& halPort, AudioPort* port) {
237 port->id = halPort.id;
238 port->role = AudioPortRole(halPort.role);
239 port->type = AudioPortType(halPort.type);
240 port->name.setToExternal(halPort.name, strlen(halPort.name));
241 port->sampleRates.resize(halPort.num_sample_rates);
242 for (size_t i = 0; i < halPort.num_sample_rates; ++i) {
243 port->sampleRates[i] = halPort.sample_rates[i];
244 }
245 port->channelMasks.resize(halPort.num_channel_masks);
246 for (size_t i = 0; i < halPort.num_channel_masks; ++i) {
Kevin Rocardf5305b32018-11-13 10:41:53 -0800247 port->channelMasks[i] = EnumBitfield<AudioChannelMask>(halPort.channel_masks[i]);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800248 }
249 port->formats.resize(halPort.num_formats);
250 for (size_t i = 0; i < halPort.num_formats; ++i) {
251 port->formats[i] = AudioFormat(halPort.formats[i]);
252 }
253 port->gains.resize(halPort.num_gains);
254 for (size_t i = 0; i < halPort.num_gains; ++i) {
255 audioGainFromHal(halPort.gains[i], &port->gains[i]);
256 }
257 audioPortConfigFromHal(halPort.active_config, &port->activeConfig);
258 switch (halPort.type) {
Kevin Rocarddc874e02017-12-14 18:50:12 -0800259 case AUDIO_PORT_TYPE_NONE:
260 break;
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800261 case AUDIO_PORT_TYPE_DEVICE: {
262 port->ext.device.hwModule = halPort.ext.device.hw_module;
263 port->ext.device.type = AudioDevice(halPort.ext.device.type);
Kevin Rocarddc874e02017-12-14 18:50:12 -0800264 memcpy(port->ext.device.address.data(), halPort.ext.device.address,
265 AUDIO_DEVICE_MAX_ADDRESS_LEN);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800266 break;
267 }
268 case AUDIO_PORT_TYPE_MIX: {
269 port->ext.mix.hwModule = halPort.ext.mix.hw_module;
270 port->ext.mix.ioHandle = halPort.ext.mix.handle;
271 port->ext.mix.latencyClass = AudioMixLatencyClass(halPort.ext.mix.latency_class);
272 break;
273 }
274 case AUDIO_PORT_TYPE_SESSION: {
275 port->ext.session.session = halPort.ext.session.session;
276 break;
277 }
278 }
279}
280
281void HidlUtils::audioPortToHal(const AudioPort& port, struct audio_port* halPort) {
282 memset(halPort, 0, sizeof(audio_port));
283 halPort->id = port.id;
284 halPort->role = static_cast<audio_port_role_t>(port.role);
285 halPort->type = static_cast<audio_port_type_t>(port.type);
Kevin Rocard7ee6fee2018-02-27 10:56:32 -0800286 strncpy(halPort->name, port.name.c_str(), AUDIO_PORT_MAX_NAME_LEN);
287 halPort->name[AUDIO_PORT_MAX_NAME_LEN - 1] = '\0';
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800288 halPort->num_sample_rates =
Kevin Rocarddc874e02017-12-14 18:50:12 -0800289 std::min(port.sampleRates.size(), static_cast<size_t>(AUDIO_PORT_MAX_SAMPLING_RATES));
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800290 for (size_t i = 0; i < halPort->num_sample_rates; ++i) {
291 halPort->sample_rates[i] = port.sampleRates[i];
292 }
293 halPort->num_channel_masks =
Kevin Rocarddc874e02017-12-14 18:50:12 -0800294 std::min(port.channelMasks.size(), static_cast<size_t>(AUDIO_PORT_MAX_CHANNEL_MASKS));
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800295 for (size_t i = 0; i < halPort->num_channel_masks; ++i) {
296 halPort->channel_masks[i] = static_cast<audio_channel_mask_t>(port.channelMasks[i]);
297 }
298 halPort->num_formats =
Kevin Rocarddc874e02017-12-14 18:50:12 -0800299 std::min(port.formats.size(), static_cast<size_t>(AUDIO_PORT_MAX_FORMATS));
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800300 for (size_t i = 0; i < halPort->num_formats; ++i) {
301 halPort->formats[i] = static_cast<audio_format_t>(port.formats[i]);
302 }
303 halPort->num_gains = std::min(port.gains.size(), static_cast<size_t>(AUDIO_PORT_MAX_GAINS));
304 for (size_t i = 0; i < halPort->num_gains; ++i) {
305 audioGainToHal(port.gains[i], &halPort->gains[i]);
306 }
307 audioPortConfigToHal(port.activeConfig, &halPort->active_config);
308 switch (port.type) {
Kevin Rocarddc874e02017-12-14 18:50:12 -0800309 case AudioPortType::NONE:
310 break;
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800311 case AudioPortType::DEVICE: {
312 halPort->ext.device.hw_module = port.ext.device.hwModule;
313 halPort->ext.device.type = static_cast<audio_devices_t>(port.ext.device.type);
Kevin Rocarddc874e02017-12-14 18:50:12 -0800314 memcpy(halPort->ext.device.address, port.ext.device.address.data(),
315 AUDIO_DEVICE_MAX_ADDRESS_LEN);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800316 break;
317 }
318 case AudioPortType::MIX: {
319 halPort->ext.mix.hw_module = port.ext.mix.hwModule;
320 halPort->ext.mix.handle = port.ext.mix.ioHandle;
321 halPort->ext.mix.latency_class =
Kevin Rocarddc874e02017-12-14 18:50:12 -0800322 static_cast<audio_mix_latency_class_t>(port.ext.mix.latencyClass);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800323 break;
324 }
325 case AudioPortType::SESSION: {
326 halPort->ext.session.session = static_cast<audio_session_t>(port.ext.session.session);
327 break;
328 }
329 }
330}
331
332void HidlUtils::uuidFromHal(const audio_uuid_t& halUuid, Uuid* uuid) {
333 uuid->timeLow = halUuid.timeLow;
334 uuid->timeMid = halUuid.timeMid;
335 uuid->versionAndTimeHigh = halUuid.timeHiAndVersion;
336 uuid->variantAndClockSeqHigh = halUuid.clockSeq;
337 memcpy(uuid->node.data(), halUuid.node, uuid->node.size());
338}
339
340void HidlUtils::uuidToHal(const Uuid& uuid, audio_uuid_t* halUuid) {
341 halUuid->timeLow = uuid.timeLow;
342 halUuid->timeMid = uuid.timeMid;
343 halUuid->timeHiAndVersion = uuid.versionAndTimeHigh;
344 halUuid->clockSeq = uuid.variantAndClockSeqHigh;
345 memcpy(halUuid->node, uuid.node.data(), uuid.node.size());
346}
347
Mikhail Naganov543bf9c2018-12-11 16:36:53 -0800348} // namespace implementation
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800349} // namespace CPP_VERSION
Kevin Rocard6891d7e2017-12-14 18:39:39 -0800350} // namespace common
351} // namespace audio
352} // namespace hardware
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800353} // namespace android