blob: f25fc5ce5f257fbfb5fcd2ff8bfc5d0ef4b0c0b3 [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;
31
32namespace android {
33
34void HidlUtils::audioConfigFromHal(const audio_config_t& halConfig, AudioConfig* config) {
35 config->sampleRateHz = halConfig.sample_rate;
36 config->channelMask = AudioChannelMask(halConfig.channel_mask);
37 config->format = AudioFormat(halConfig.format);
38 audioOffloadInfoFromHal(halConfig.offload_info, &config->offloadInfo);
39 config->frameCount = halConfig.frame_count;
40}
41
42void HidlUtils::audioConfigToHal(const AudioConfig& config, audio_config_t* halConfig) {
43 memset(halConfig, 0, sizeof(audio_config_t));
44 halConfig->sample_rate = config.sampleRateHz;
45 halConfig->channel_mask = static_cast<audio_channel_mask_t>(config.channelMask);
46 halConfig->format = static_cast<audio_format_t>(config.format);
47 audioOffloadInfoToHal(config.offloadInfo, &halConfig->offload_info);
48 halConfig->frame_count = config.frameCount;
49}
50
51void HidlUtils::audioGainConfigFromHal(
52 const struct audio_gain_config& halConfig, AudioGainConfig* config) {
53 config->index = halConfig.index;
54 config->mode = AudioGainMode(halConfig.mode);
55 config->channelMask = AudioChannelMask(halConfig.channel_mask);
56 for (size_t i = 0; i < sizeof(audio_channel_mask_t) * 8; ++i) {
57 config->values[i] = halConfig.values[i];
58 }
59 config->rampDurationMs = halConfig.ramp_duration_ms;
60}
61
62void HidlUtils::audioGainConfigToHal(
63 const AudioGainConfig& config, struct audio_gain_config* halConfig) {
64 halConfig->index = config.index;
65 halConfig->mode = static_cast<audio_gain_mode_t>(config.mode);
66 halConfig->channel_mask = static_cast<audio_channel_mask_t>(config.channelMask);
67 memset(halConfig->values, 0, sizeof(halConfig->values));
68 for (size_t i = 0; i < sizeof(audio_channel_mask_t) * 8; ++i) {
69 halConfig->values[i] = config.values[i];
70 }
71 halConfig->ramp_duration_ms = config.rampDurationMs;
72}
73
74void HidlUtils::audioGainFromHal(const struct audio_gain& halGain, AudioGain* gain) {
75 gain->mode = AudioGainMode(halGain.mode);
76 gain->channelMask = AudioChannelMask(halGain.channel_mask);
77 gain->minValue = halGain.min_value;
78 gain->maxValue = halGain.max_value;
79 gain->defaultValue = halGain.default_value;
80 gain->stepValue = halGain.step_value;
81 gain->minRampMs = halGain.min_ramp_ms;
82 gain->maxRampMs = halGain.max_ramp_ms;
83}
84
85void HidlUtils::audioGainToHal(const AudioGain& gain, struct audio_gain* halGain) {
86 halGain->mode = static_cast<audio_gain_mode_t>(gain.mode);
87 halGain->channel_mask = static_cast<audio_channel_mask_t>(gain.channelMask);
88 halGain->min_value = gain.minValue;
89 halGain->max_value = gain.maxValue;
90 halGain->default_value = gain.defaultValue;
91 halGain->step_value = gain.stepValue;
92 halGain->min_ramp_ms = gain.minRampMs;
93 halGain->max_ramp_ms = gain.maxRampMs;
94}
95
96void HidlUtils::audioOffloadInfoFromHal(
97 const audio_offload_info_t& halOffload, AudioOffloadInfo* offload) {
98 offload->sampleRateHz = halOffload.sample_rate;
99 offload->channelMask = AudioChannelMask(halOffload.channel_mask);
100 offload->streamType = AudioStreamType(halOffload.stream_type);
101 offload->bitRatePerSecond = halOffload.bit_rate;
102 offload->durationMicroseconds = halOffload.duration_us;
103 offload->hasVideo = halOffload.has_video;
104 offload->isStreaming = halOffload.is_streaming;
105}
106
107void HidlUtils::audioOffloadInfoToHal(
108 const AudioOffloadInfo& offload, audio_offload_info_t* halOffload) {
109 *halOffload = AUDIO_INFO_INITIALIZER;
110 halOffload->sample_rate = offload.sampleRateHz;
111 halOffload->channel_mask = static_cast<audio_channel_mask_t>(offload.channelMask);
112 halOffload->stream_type = static_cast<audio_stream_type_t>(offload.streamType);
113 halOffload->bit_rate = offload.bitRatePerSecond;
114 halOffload->duration_us = offload.durationMicroseconds;
115 halOffload->has_video = offload.hasVideo;
116 halOffload->is_streaming = offload.isStreaming;
117}
118
119void HidlUtils::audioPortConfigFromHal(
120 const struct audio_port_config& halConfig, AudioPortConfig* config) {
121 config->id = halConfig.id;
122 config->role = AudioPortRole(halConfig.role);
123 config->type = AudioPortType(halConfig.type);
124 config->configMask = AudioPortConfigMask(halConfig.config_mask);
125 config->sampleRateHz = halConfig.sample_rate;
126 config->channelMask = AudioChannelMask(halConfig.channel_mask);
127 config->format = AudioFormat(halConfig.format);
128 audioGainConfigFromHal(halConfig.gain, &config->gain);
129 switch (halConfig.type) {
130 case AUDIO_PORT_TYPE_NONE: break;
131 case AUDIO_PORT_TYPE_DEVICE: {
132 config->ext.device.hwModule = halConfig.ext.device.hw_module;
133 config->ext.device.type = AudioDevice(halConfig.ext.device.type);
134 memcpy(config->ext.device.address.data(),
135 halConfig.ext.device.address,
136 AUDIO_DEVICE_MAX_ADDRESS_LEN);
137 break;
138 }
139 case AUDIO_PORT_TYPE_MIX: {
140 config->ext.mix.hwModule = halConfig.ext.mix.hw_module;
141 config->ext.mix.ioHandle = halConfig.ext.mix.handle;
142 if (halConfig.role == AUDIO_PORT_ROLE_SOURCE) {
143 config->ext.mix.useCase.source = AudioSource(halConfig.ext.mix.usecase.source);
144 } else if (halConfig.role == AUDIO_PORT_ROLE_SINK) {
145 config->ext.mix.useCase.stream = AudioStreamType(halConfig.ext.mix.usecase.stream);
146 }
147 break;
148 }
149 case AUDIO_PORT_TYPE_SESSION: {
150 config->ext.session.session = halConfig.ext.session.session;
151 break;
152 }
153 }
154}
155
156void HidlUtils::audioPortConfigToHal(
157 const AudioPortConfig& config, struct audio_port_config* halConfig) {
158 memset(halConfig, 0, sizeof(audio_port_config));
159 halConfig->id = config.id;
160 halConfig->role = static_cast<audio_port_role_t>(config.role);
161 halConfig->type = static_cast<audio_port_type_t>(config.type);
162 halConfig->config_mask = static_cast<unsigned int>(config.configMask);
163 halConfig->sample_rate = config.sampleRateHz;
164 halConfig->channel_mask = static_cast<audio_channel_mask_t>(config.channelMask);
165 halConfig->format = static_cast<audio_format_t>(config.format);
166 audioGainConfigToHal(config.gain, &halConfig->gain);
167 switch (config.type) {
168 case AudioPortType::NONE: break;
169 case AudioPortType::DEVICE: {
170 halConfig->ext.device.hw_module = config.ext.device.hwModule;
171 halConfig->ext.device.type = static_cast<audio_devices_t>(config.ext.device.type);
172 memcpy(halConfig->ext.device.address,
173 config.ext.device.address.data(),
174 AUDIO_DEVICE_MAX_ADDRESS_LEN);
175 break;
176 }
177 case AudioPortType::MIX: {
178 halConfig->ext.mix.hw_module = config.ext.mix.hwModule;
179 halConfig->ext.mix.handle = config.ext.mix.ioHandle;
180 if (config.role == AudioPortRole::SOURCE) {
181 halConfig->ext.mix.usecase.source =
182 static_cast<audio_source_t>(config.ext.mix.useCase.source);
183 } else if (config.role == AudioPortRole::SINK) {
184 halConfig->ext.mix.usecase.stream =
185 static_cast<audio_stream_type_t>(config.ext.mix.useCase.stream);
186 }
187 break;
188 }
189 case AudioPortType::SESSION: {
190 halConfig->ext.session.session =
191 static_cast<audio_session_t>(config.ext.session.session);
192 break;
193 }
194 }
195}
196
197void HidlUtils::audioPortConfigsFromHal(
198 unsigned int numHalConfigs, const struct audio_port_config *halConfigs,
199 hidl_vec<AudioPortConfig> *configs) {
200 configs->resize(numHalConfigs);
201 for (unsigned int i = 0; i < numHalConfigs; ++i) {
202 audioPortConfigFromHal(halConfigs[i], &(*configs)[i]);
203 }
204}
205
206std::unique_ptr<audio_port_config[]> HidlUtils::audioPortConfigsToHal(
207 const hidl_vec<AudioPortConfig>& configs) {
208 std::unique_ptr<audio_port_config[]> halConfigs(new audio_port_config[configs.size()]);
209 for (size_t i = 0; i < configs.size(); ++i) {
210 audioPortConfigToHal(configs[i], &halConfigs[i]);
211 }
212 return halConfigs;
213}
214
215void HidlUtils::audioPortFromHal(const struct audio_port& halPort, AudioPort* port) {
216 port->id = halPort.id;
217 port->role = AudioPortRole(halPort.role);
218 port->type = AudioPortType(halPort.type);
219 port->name.setToExternal(halPort.name, strlen(halPort.name));
220 port->sampleRates.resize(halPort.num_sample_rates);
221 for (size_t i = 0; i < halPort.num_sample_rates; ++i) {
222 port->sampleRates[i] = halPort.sample_rates[i];
223 }
224 port->channelMasks.resize(halPort.num_channel_masks);
225 for (size_t i = 0; i < halPort.num_channel_masks; ++i) {
226 port->channelMasks[i] = AudioChannelMask(halPort.channel_masks[i]);
227 }
228 port->formats.resize(halPort.num_formats);
229 for (size_t i = 0; i < halPort.num_formats; ++i) {
230 port->formats[i] = AudioFormat(halPort.formats[i]);
231 }
232 port->gains.resize(halPort.num_gains);
233 for (size_t i = 0; i < halPort.num_gains; ++i) {
234 audioGainFromHal(halPort.gains[i], &port->gains[i]);
235 }
236 audioPortConfigFromHal(halPort.active_config, &port->activeConfig);
237 switch (halPort.type) {
238 case AUDIO_PORT_TYPE_NONE: break;
239 case AUDIO_PORT_TYPE_DEVICE: {
240 port->ext.device.hwModule = halPort.ext.device.hw_module;
241 port->ext.device.type = AudioDevice(halPort.ext.device.type);
242 memcpy(port->ext.device.address.data(),
243 halPort.ext.device.address,
244 AUDIO_DEVICE_MAX_ADDRESS_LEN);
245 break;
246 }
247 case AUDIO_PORT_TYPE_MIX: {
248 port->ext.mix.hwModule = halPort.ext.mix.hw_module;
249 port->ext.mix.ioHandle = halPort.ext.mix.handle;
250 port->ext.mix.latencyClass = AudioMixLatencyClass(halPort.ext.mix.latency_class);
251 break;
252 }
253 case AUDIO_PORT_TYPE_SESSION: {
254 port->ext.session.session = halPort.ext.session.session;
255 break;
256 }
257 }
258}
259
260void HidlUtils::audioPortToHal(const AudioPort& port, struct audio_port* halPort) {
261 memset(halPort, 0, sizeof(audio_port));
262 halPort->id = port.id;
263 halPort->role = static_cast<audio_port_role_t>(port.role);
264 halPort->type = static_cast<audio_port_type_t>(port.type);
265 memcpy(halPort->name,
266 port.name.c_str(),
267 std::min(port.name.size(), static_cast<size_t>(AUDIO_PORT_MAX_NAME_LEN)));
268 halPort->num_sample_rates =
269 std::min(port.sampleRates.size(), static_cast<size_t>(AUDIO_PORT_MAX_SAMPLING_RATES));
270 for (size_t i = 0; i < halPort->num_sample_rates; ++i) {
271 halPort->sample_rates[i] = port.sampleRates[i];
272 }
273 halPort->num_channel_masks =
274 std::min(port.channelMasks.size(), static_cast<size_t>(AUDIO_PORT_MAX_CHANNEL_MASKS));
275 for (size_t i = 0; i < halPort->num_channel_masks; ++i) {
276 halPort->channel_masks[i] = static_cast<audio_channel_mask_t>(port.channelMasks[i]);
277 }
278 halPort->num_formats =
279 std::min(port.formats.size(), static_cast<size_t>(AUDIO_PORT_MAX_FORMATS));
280 for (size_t i = 0; i < halPort->num_formats; ++i) {
281 halPort->formats[i] = static_cast<audio_format_t>(port.formats[i]);
282 }
283 halPort->num_gains = std::min(port.gains.size(), static_cast<size_t>(AUDIO_PORT_MAX_GAINS));
284 for (size_t i = 0; i < halPort->num_gains; ++i) {
285 audioGainToHal(port.gains[i], &halPort->gains[i]);
286 }
287 audioPortConfigToHal(port.activeConfig, &halPort->active_config);
288 switch (port.type) {
289 case AudioPortType::NONE: break;
290 case AudioPortType::DEVICE: {
291 halPort->ext.device.hw_module = port.ext.device.hwModule;
292 halPort->ext.device.type = static_cast<audio_devices_t>(port.ext.device.type);
293 memcpy(halPort->ext.device.address,
294 port.ext.device.address.data(),
295 AUDIO_DEVICE_MAX_ADDRESS_LEN);
296 break;
297 }
298 case AudioPortType::MIX: {
299 halPort->ext.mix.hw_module = port.ext.mix.hwModule;
300 halPort->ext.mix.handle = port.ext.mix.ioHandle;
301 halPort->ext.mix.latency_class =
302 static_cast<audio_mix_latency_class_t>(port.ext.mix.latencyClass);
303 break;
304 }
305 case AudioPortType::SESSION: {
306 halPort->ext.session.session = static_cast<audio_session_t>(port.ext.session.session);
307 break;
308 }
309 }
310}
311
312void HidlUtils::uuidFromHal(const audio_uuid_t& halUuid, Uuid* uuid) {
313 uuid->timeLow = halUuid.timeLow;
314 uuid->timeMid = halUuid.timeMid;
315 uuid->versionAndTimeHigh = halUuid.timeHiAndVersion;
316 uuid->variantAndClockSeqHigh = halUuid.clockSeq;
317 memcpy(uuid->node.data(), halUuid.node, uuid->node.size());
318}
319
320void HidlUtils::uuidToHal(const Uuid& uuid, audio_uuid_t* halUuid) {
321 halUuid->timeLow = uuid.timeLow;
322 halUuid->timeMid = uuid.timeMid;
323 halUuid->timeHiAndVersion = uuid.versionAndTimeHigh;
324 halUuid->clockSeq = uuid.variantAndClockSeqHigh;
325 memcpy(halUuid->node, uuid.node.data(), uuid.node.size());
326}
327
328} // namespace android