blob: a74fb89403cb55dd281c5a97340f258f2ebbc6dc [file] [log] [blame]
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -08001/*
2 * Copyright (C) 2016 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 <string.h>
18
19#include "HidlUtils.h"
20
21using ::android::hardware::audio::common::V2_0::AudioChannelMask;
22using ::android::hardware::audio::common::V2_0::AudioDevice;
23using ::android::hardware::audio::common::V2_0::AudioFormat;
24using ::android::hardware::audio::common::V2_0::AudioGainMode;
25using ::android::hardware::audio::common::V2_0::AudioMixLatencyClass;
26using ::android::hardware::audio::common::V2_0::AudioPortConfigMask;
27using ::android::hardware::audio::common::V2_0::AudioPortRole;
28using ::android::hardware::audio::common::V2_0::AudioPortType;
29using ::android::hardware::audio::common::V2_0::AudioSource;
30using ::android::hardware::audio::common::V2_0::AudioStreamType;
vivek mehta92360362017-04-06 18:27:34 -070031using ::android::hardware::audio::common::V2_0::AudioUsage;
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -080032
33namespace android {
34
35void HidlUtils::audioConfigFromHal(const audio_config_t& halConfig, AudioConfig* config) {
36 config->sampleRateHz = halConfig.sample_rate;
37 config->channelMask = AudioChannelMask(halConfig.channel_mask);
38 config->format = AudioFormat(halConfig.format);
39 audioOffloadInfoFromHal(halConfig.offload_info, &config->offloadInfo);
40 config->frameCount = halConfig.frame_count;
41}
42
43void HidlUtils::audioConfigToHal(const AudioConfig& config, audio_config_t* halConfig) {
44 memset(halConfig, 0, sizeof(audio_config_t));
45 halConfig->sample_rate = config.sampleRateHz;
46 halConfig->channel_mask = static_cast<audio_channel_mask_t>(config.channelMask);
47 halConfig->format = static_cast<audio_format_t>(config.format);
48 audioOffloadInfoToHal(config.offloadInfo, &halConfig->offload_info);
49 halConfig->frame_count = config.frameCount;
50}
51
Kevin Rocarddc874e02017-12-14 18:50:12 -080052void HidlUtils::audioGainConfigFromHal(const struct audio_gain_config& halConfig,
53 AudioGainConfig* config) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -080054 config->index = halConfig.index;
55 config->mode = AudioGainMode(halConfig.mode);
56 config->channelMask = AudioChannelMask(halConfig.channel_mask);
57 for (size_t i = 0; i < sizeof(audio_channel_mask_t) * 8; ++i) {
58 config->values[i] = halConfig.values[i];
59 }
60 config->rampDurationMs = halConfig.ramp_duration_ms;
61}
62
Kevin Rocarddc874e02017-12-14 18:50:12 -080063void HidlUtils::audioGainConfigToHal(const AudioGainConfig& config,
64 struct audio_gain_config* halConfig) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -080065 halConfig->index = config.index;
66 halConfig->mode = static_cast<audio_gain_mode_t>(config.mode);
67 halConfig->channel_mask = static_cast<audio_channel_mask_t>(config.channelMask);
68 memset(halConfig->values, 0, sizeof(halConfig->values));
69 for (size_t i = 0; i < sizeof(audio_channel_mask_t) * 8; ++i) {
70 halConfig->values[i] = config.values[i];
71 }
72 halConfig->ramp_duration_ms = config.rampDurationMs;
73}
74
75void HidlUtils::audioGainFromHal(const struct audio_gain& halGain, AudioGain* gain) {
76 gain->mode = AudioGainMode(halGain.mode);
77 gain->channelMask = AudioChannelMask(halGain.channel_mask);
78 gain->minValue = halGain.min_value;
79 gain->maxValue = halGain.max_value;
80 gain->defaultValue = halGain.default_value;
81 gain->stepValue = halGain.step_value;
82 gain->minRampMs = halGain.min_ramp_ms;
83 gain->maxRampMs = halGain.max_ramp_ms;
84}
85
86void HidlUtils::audioGainToHal(const AudioGain& gain, struct audio_gain* halGain) {
87 halGain->mode = static_cast<audio_gain_mode_t>(gain.mode);
88 halGain->channel_mask = static_cast<audio_channel_mask_t>(gain.channelMask);
89 halGain->min_value = gain.minValue;
90 halGain->max_value = gain.maxValue;
91 halGain->default_value = gain.defaultValue;
92 halGain->step_value = gain.stepValue;
93 halGain->min_ramp_ms = gain.minRampMs;
94 halGain->max_ramp_ms = gain.maxRampMs;
95}
96
Kevin Rocarddc874e02017-12-14 18:50:12 -080097void HidlUtils::audioOffloadInfoFromHal(const audio_offload_info_t& halOffload,
98 AudioOffloadInfo* offload) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -080099 offload->sampleRateHz = halOffload.sample_rate;
100 offload->channelMask = AudioChannelMask(halOffload.channel_mask);
Mikhail Naganov685f0e32016-12-16 17:18:08 -0800101 offload->format = AudioFormat(halOffload.format);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800102 offload->streamType = AudioStreamType(halOffload.stream_type);
103 offload->bitRatePerSecond = halOffload.bit_rate;
104 offload->durationMicroseconds = halOffload.duration_us;
105 offload->hasVideo = halOffload.has_video;
106 offload->isStreaming = halOffload.is_streaming;
vivek mehta92360362017-04-06 18:27:34 -0700107 offload->bitWidth = halOffload.bit_width;
108 offload->bufferSize = halOffload.offload_buffer_size;
109 offload->usage = static_cast<AudioUsage>(halOffload.usage);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800110}
111
Kevin Rocarddc874e02017-12-14 18:50:12 -0800112void HidlUtils::audioOffloadInfoToHal(const AudioOffloadInfo& offload,
113 audio_offload_info_t* halOffload) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800114 *halOffload = AUDIO_INFO_INITIALIZER;
115 halOffload->sample_rate = offload.sampleRateHz;
116 halOffload->channel_mask = static_cast<audio_channel_mask_t>(offload.channelMask);
Mikhail Naganov685f0e32016-12-16 17:18:08 -0800117 halOffload->format = static_cast<audio_format_t>(offload.format);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800118 halOffload->stream_type = static_cast<audio_stream_type_t>(offload.streamType);
119 halOffload->bit_rate = offload.bitRatePerSecond;
120 halOffload->duration_us = offload.durationMicroseconds;
121 halOffload->has_video = offload.hasVideo;
122 halOffload->is_streaming = offload.isStreaming;
Mikhail Naganovc2920562016-11-21 18:33:52 -0800123 halOffload->bit_width = offload.bitWidth;
124 halOffload->offload_buffer_size = offload.bufferSize;
125 halOffload->usage = static_cast<audio_usage_t>(offload.usage);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800126}
127
Kevin Rocarddc874e02017-12-14 18:50:12 -0800128void HidlUtils::audioPortConfigFromHal(const struct audio_port_config& halConfig,
129 AudioPortConfig* config) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800130 config->id = halConfig.id;
131 config->role = AudioPortRole(halConfig.role);
132 config->type = AudioPortType(halConfig.type);
133 config->configMask = AudioPortConfigMask(halConfig.config_mask);
134 config->sampleRateHz = halConfig.sample_rate;
135 config->channelMask = AudioChannelMask(halConfig.channel_mask);
136 config->format = AudioFormat(halConfig.format);
137 audioGainConfigFromHal(halConfig.gain, &config->gain);
138 switch (halConfig.type) {
Kevin Rocarddc874e02017-12-14 18:50:12 -0800139 case AUDIO_PORT_TYPE_NONE:
140 break;
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800141 case AUDIO_PORT_TYPE_DEVICE: {
142 config->ext.device.hwModule = halConfig.ext.device.hw_module;
143 config->ext.device.type = AudioDevice(halConfig.ext.device.type);
Kevin Rocarddc874e02017-12-14 18:50:12 -0800144 memcpy(config->ext.device.address.data(), halConfig.ext.device.address,
145 AUDIO_DEVICE_MAX_ADDRESS_LEN);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800146 break;
147 }
148 case AUDIO_PORT_TYPE_MIX: {
149 config->ext.mix.hwModule = halConfig.ext.mix.hw_module;
150 config->ext.mix.ioHandle = halConfig.ext.mix.handle;
151 if (halConfig.role == AUDIO_PORT_ROLE_SOURCE) {
152 config->ext.mix.useCase.source = AudioSource(halConfig.ext.mix.usecase.source);
153 } else if (halConfig.role == AUDIO_PORT_ROLE_SINK) {
154 config->ext.mix.useCase.stream = AudioStreamType(halConfig.ext.mix.usecase.stream);
155 }
156 break;
157 }
158 case AUDIO_PORT_TYPE_SESSION: {
159 config->ext.session.session = halConfig.ext.session.session;
160 break;
161 }
162 }
163}
164
Kevin Rocarddc874e02017-12-14 18:50:12 -0800165void HidlUtils::audioPortConfigToHal(const AudioPortConfig& config,
166 struct audio_port_config* halConfig) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800167 memset(halConfig, 0, sizeof(audio_port_config));
168 halConfig->id = config.id;
169 halConfig->role = static_cast<audio_port_role_t>(config.role);
170 halConfig->type = static_cast<audio_port_type_t>(config.type);
171 halConfig->config_mask = static_cast<unsigned int>(config.configMask);
172 halConfig->sample_rate = config.sampleRateHz;
173 halConfig->channel_mask = static_cast<audio_channel_mask_t>(config.channelMask);
174 halConfig->format = static_cast<audio_format_t>(config.format);
175 audioGainConfigToHal(config.gain, &halConfig->gain);
176 switch (config.type) {
Kevin Rocarddc874e02017-12-14 18:50:12 -0800177 case AudioPortType::NONE:
178 break;
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800179 case AudioPortType::DEVICE: {
180 halConfig->ext.device.hw_module = config.ext.device.hwModule;
181 halConfig->ext.device.type = static_cast<audio_devices_t>(config.ext.device.type);
Kevin Rocarddc874e02017-12-14 18:50:12 -0800182 memcpy(halConfig->ext.device.address, config.ext.device.address.data(),
183 AUDIO_DEVICE_MAX_ADDRESS_LEN);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800184 break;
185 }
186 case AudioPortType::MIX: {
187 halConfig->ext.mix.hw_module = config.ext.mix.hwModule;
188 halConfig->ext.mix.handle = config.ext.mix.ioHandle;
189 if (config.role == AudioPortRole::SOURCE) {
190 halConfig->ext.mix.usecase.source =
Kevin Rocarddc874e02017-12-14 18:50:12 -0800191 static_cast<audio_source_t>(config.ext.mix.useCase.source);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800192 } else if (config.role == AudioPortRole::SINK) {
193 halConfig->ext.mix.usecase.stream =
Kevin Rocarddc874e02017-12-14 18:50:12 -0800194 static_cast<audio_stream_type_t>(config.ext.mix.useCase.stream);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800195 }
196 break;
197 }
198 case AudioPortType::SESSION: {
199 halConfig->ext.session.session =
Kevin Rocarddc874e02017-12-14 18:50:12 -0800200 static_cast<audio_session_t>(config.ext.session.session);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800201 break;
202 }
203 }
204}
205
Kevin Rocarddc874e02017-12-14 18:50:12 -0800206void HidlUtils::audioPortConfigsFromHal(unsigned int numHalConfigs,
207 const struct audio_port_config* halConfigs,
208 hidl_vec<AudioPortConfig>* configs) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800209 configs->resize(numHalConfigs);
210 for (unsigned int i = 0; i < numHalConfigs; ++i) {
211 audioPortConfigFromHal(halConfigs[i], &(*configs)[i]);
212 }
213}
214
215std::unique_ptr<audio_port_config[]> HidlUtils::audioPortConfigsToHal(
Kevin Rocarddc874e02017-12-14 18:50:12 -0800216 const hidl_vec<AudioPortConfig>& configs) {
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800217 std::unique_ptr<audio_port_config[]> halConfigs(new audio_port_config[configs.size()]);
218 for (size_t i = 0; i < configs.size(); ++i) {
219 audioPortConfigToHal(configs[i], &halConfigs[i]);
220 }
221 return halConfigs;
222}
223
224void HidlUtils::audioPortFromHal(const struct audio_port& halPort, AudioPort* port) {
225 port->id = halPort.id;
226 port->role = AudioPortRole(halPort.role);
227 port->type = AudioPortType(halPort.type);
228 port->name.setToExternal(halPort.name, strlen(halPort.name));
229 port->sampleRates.resize(halPort.num_sample_rates);
230 for (size_t i = 0; i < halPort.num_sample_rates; ++i) {
231 port->sampleRates[i] = halPort.sample_rates[i];
232 }
233 port->channelMasks.resize(halPort.num_channel_masks);
234 for (size_t i = 0; i < halPort.num_channel_masks; ++i) {
235 port->channelMasks[i] = AudioChannelMask(halPort.channel_masks[i]);
236 }
237 port->formats.resize(halPort.num_formats);
238 for (size_t i = 0; i < halPort.num_formats; ++i) {
239 port->formats[i] = AudioFormat(halPort.formats[i]);
240 }
241 port->gains.resize(halPort.num_gains);
242 for (size_t i = 0; i < halPort.num_gains; ++i) {
243 audioGainFromHal(halPort.gains[i], &port->gains[i]);
244 }
245 audioPortConfigFromHal(halPort.active_config, &port->activeConfig);
246 switch (halPort.type) {
Kevin Rocarddc874e02017-12-14 18:50:12 -0800247 case AUDIO_PORT_TYPE_NONE:
248 break;
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800249 case AUDIO_PORT_TYPE_DEVICE: {
250 port->ext.device.hwModule = halPort.ext.device.hw_module;
251 port->ext.device.type = AudioDevice(halPort.ext.device.type);
Kevin Rocarddc874e02017-12-14 18:50:12 -0800252 memcpy(port->ext.device.address.data(), halPort.ext.device.address,
253 AUDIO_DEVICE_MAX_ADDRESS_LEN);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800254 break;
255 }
256 case AUDIO_PORT_TYPE_MIX: {
257 port->ext.mix.hwModule = halPort.ext.mix.hw_module;
258 port->ext.mix.ioHandle = halPort.ext.mix.handle;
259 port->ext.mix.latencyClass = AudioMixLatencyClass(halPort.ext.mix.latency_class);
260 break;
261 }
262 case AUDIO_PORT_TYPE_SESSION: {
263 port->ext.session.session = halPort.ext.session.session;
264 break;
265 }
266 }
267}
268
269void HidlUtils::audioPortToHal(const AudioPort& port, struct audio_port* halPort) {
270 memset(halPort, 0, sizeof(audio_port));
271 halPort->id = port.id;
272 halPort->role = static_cast<audio_port_role_t>(port.role);
273 halPort->type = static_cast<audio_port_type_t>(port.type);
Kevin Rocarddc874e02017-12-14 18:50:12 -0800274 memcpy(halPort->name, port.name.c_str(),
275 std::min(port.name.size(), static_cast<size_t>(AUDIO_PORT_MAX_NAME_LEN)));
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800276 halPort->num_sample_rates =
Kevin Rocarddc874e02017-12-14 18:50:12 -0800277 std::min(port.sampleRates.size(), static_cast<size_t>(AUDIO_PORT_MAX_SAMPLING_RATES));
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800278 for (size_t i = 0; i < halPort->num_sample_rates; ++i) {
279 halPort->sample_rates[i] = port.sampleRates[i];
280 }
281 halPort->num_channel_masks =
Kevin Rocarddc874e02017-12-14 18:50:12 -0800282 std::min(port.channelMasks.size(), static_cast<size_t>(AUDIO_PORT_MAX_CHANNEL_MASKS));
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800283 for (size_t i = 0; i < halPort->num_channel_masks; ++i) {
284 halPort->channel_masks[i] = static_cast<audio_channel_mask_t>(port.channelMasks[i]);
285 }
286 halPort->num_formats =
Kevin Rocarddc874e02017-12-14 18:50:12 -0800287 std::min(port.formats.size(), static_cast<size_t>(AUDIO_PORT_MAX_FORMATS));
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800288 for (size_t i = 0; i < halPort->num_formats; ++i) {
289 halPort->formats[i] = static_cast<audio_format_t>(port.formats[i]);
290 }
291 halPort->num_gains = std::min(port.gains.size(), static_cast<size_t>(AUDIO_PORT_MAX_GAINS));
292 for (size_t i = 0; i < halPort->num_gains; ++i) {
293 audioGainToHal(port.gains[i], &halPort->gains[i]);
294 }
295 audioPortConfigToHal(port.activeConfig, &halPort->active_config);
296 switch (port.type) {
Kevin Rocarddc874e02017-12-14 18:50:12 -0800297 case AudioPortType::NONE:
298 break;
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800299 case AudioPortType::DEVICE: {
300 halPort->ext.device.hw_module = port.ext.device.hwModule;
301 halPort->ext.device.type = static_cast<audio_devices_t>(port.ext.device.type);
Kevin Rocarddc874e02017-12-14 18:50:12 -0800302 memcpy(halPort->ext.device.address, port.ext.device.address.data(),
303 AUDIO_DEVICE_MAX_ADDRESS_LEN);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800304 break;
305 }
306 case AudioPortType::MIX: {
307 halPort->ext.mix.hw_module = port.ext.mix.hwModule;
308 halPort->ext.mix.handle = port.ext.mix.ioHandle;
309 halPort->ext.mix.latency_class =
Kevin Rocarddc874e02017-12-14 18:50:12 -0800310 static_cast<audio_mix_latency_class_t>(port.ext.mix.latencyClass);
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -0800311 break;
312 }
313 case AudioPortType::SESSION: {
314 halPort->ext.session.session = static_cast<audio_session_t>(port.ext.session.session);
315 break;
316 }
317 }
318}
319
320void HidlUtils::uuidFromHal(const audio_uuid_t& halUuid, Uuid* uuid) {
321 uuid->timeLow = halUuid.timeLow;
322 uuid->timeMid = halUuid.timeMid;
323 uuid->versionAndTimeHigh = halUuid.timeHiAndVersion;
324 uuid->variantAndClockSeqHigh = halUuid.clockSeq;
325 memcpy(uuid->node.data(), halUuid.node, uuid->node.size());
326}
327
328void HidlUtils::uuidToHal(const Uuid& uuid, audio_uuid_t* halUuid) {
329 halUuid->timeLow = uuid.timeLow;
330 halUuid->timeMid = uuid.timeMid;
331 halUuid->timeHiAndVersion = uuid.versionAndTimeHigh;
332 halUuid->clockSeq = uuid.variantAndClockSeqHigh;
333 memcpy(halUuid->node, uuid.node.data(), uuid.node.size());
334}
335
336} // namespace android