1 /*
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 
21 using ::android::hardware::audio::common::V2_0::AudioChannelMask;
22 using ::android::hardware::audio::common::V2_0::AudioDevice;
23 using ::android::hardware::audio::common::V2_0::AudioFormat;
24 using ::android::hardware::audio::common::V2_0::AudioGainMode;
25 using ::android::hardware::audio::common::V2_0::AudioMixLatencyClass;
26 using ::android::hardware::audio::common::V2_0::AudioPortConfigMask;
27 using ::android::hardware::audio::common::V2_0::AudioPortRole;
28 using ::android::hardware::audio::common::V2_0::AudioPortType;
29 using ::android::hardware::audio::common::V2_0::AudioSource;
30 using ::android::hardware::audio::common::V2_0::AudioStreamType;
31 using ::android::hardware::audio::common::V2_0::AudioUsage;
32 
33 namespace android {
34 
audioConfigFromHal(const audio_config_t & halConfig,AudioConfig * config)35 void 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 
audioConfigToHal(const AudioConfig & config,audio_config_t * halConfig)43 void 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 
audioGainConfigFromHal(const struct audio_gain_config & halConfig,AudioGainConfig * config)52 void HidlUtils::audioGainConfigFromHal(
53         const struct audio_gain_config& halConfig, AudioGainConfig* config) {
54     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 
audioGainConfigToHal(const AudioGainConfig & config,struct audio_gain_config * halConfig)63 void HidlUtils::audioGainConfigToHal(
64         const AudioGainConfig& config, struct audio_gain_config* halConfig) {
65     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 
audioGainFromHal(const struct audio_gain & halGain,AudioGain * gain)75 void 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 
audioGainToHal(const AudioGain & gain,struct audio_gain * halGain)86 void 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 
audioOffloadInfoFromHal(const audio_offload_info_t & halOffload,AudioOffloadInfo * offload)97 void HidlUtils::audioOffloadInfoFromHal(
98         const audio_offload_info_t& halOffload, AudioOffloadInfo* offload) {
99     offload->sampleRateHz = halOffload.sample_rate;
100     offload->channelMask = AudioChannelMask(halOffload.channel_mask);
101     offload->format = AudioFormat(halOffload.format);
102     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;
107     offload->bitWidth = halOffload.bit_width;
108     offload->bufferSize = halOffload.offload_buffer_size;
109     offload->usage = static_cast<AudioUsage>(halOffload.usage);
110 }
111 
audioOffloadInfoToHal(const AudioOffloadInfo & offload,audio_offload_info_t * halOffload)112 void HidlUtils::audioOffloadInfoToHal(
113         const AudioOffloadInfo& offload, audio_offload_info_t* halOffload) {
114     *halOffload = AUDIO_INFO_INITIALIZER;
115     halOffload->sample_rate = offload.sampleRateHz;
116     halOffload->channel_mask = static_cast<audio_channel_mask_t>(offload.channelMask);
117     halOffload->format = static_cast<audio_format_t>(offload.format);
118     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;
123     halOffload->bit_width = offload.bitWidth;
124     halOffload->offload_buffer_size = offload.bufferSize;
125     halOffload->usage = static_cast<audio_usage_t>(offload.usage);
126 }
127 
audioPortConfigFromHal(const struct audio_port_config & halConfig,AudioPortConfig * config)128 void HidlUtils::audioPortConfigFromHal(
129         const struct audio_port_config& halConfig, AudioPortConfig* config) {
130     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) {
139         case AUDIO_PORT_TYPE_NONE: break;
140         case AUDIO_PORT_TYPE_DEVICE: {
141             config->ext.device.hwModule = halConfig.ext.device.hw_module;
142             config->ext.device.type = AudioDevice(halConfig.ext.device.type);
143             memcpy(config->ext.device.address.data(),
144                     halConfig.ext.device.address,
145                     AUDIO_DEVICE_MAX_ADDRESS_LEN);
146             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 
audioPortConfigToHal(const AudioPortConfig & config,struct audio_port_config * halConfig)165 void HidlUtils::audioPortConfigToHal(
166         const AudioPortConfig& config, struct audio_port_config* halConfig) {
167     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) {
177         case AudioPortType::NONE: break;
178         case AudioPortType::DEVICE: {
179             halConfig->ext.device.hw_module = config.ext.device.hwModule;
180             halConfig->ext.device.type = static_cast<audio_devices_t>(config.ext.device.type);
181             memcpy(halConfig->ext.device.address,
182                     config.ext.device.address.data(),
183                     AUDIO_DEVICE_MAX_ADDRESS_LEN);
184             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 =
191                         static_cast<audio_source_t>(config.ext.mix.useCase.source);
192             } else if (config.role == AudioPortRole::SINK) {
193                 halConfig->ext.mix.usecase.stream =
194                         static_cast<audio_stream_type_t>(config.ext.mix.useCase.stream);
195             }
196             break;
197         }
198         case AudioPortType::SESSION: {
199             halConfig->ext.session.session =
200                     static_cast<audio_session_t>(config.ext.session.session);
201             break;
202         }
203     }
204 }
205 
audioPortConfigsFromHal(unsigned int numHalConfigs,const struct audio_port_config * halConfigs,hidl_vec<AudioPortConfig> * configs)206 void HidlUtils::audioPortConfigsFromHal(
207         unsigned int numHalConfigs, const struct audio_port_config *halConfigs,
208         hidl_vec<AudioPortConfig> *configs) {
209     configs->resize(numHalConfigs);
210     for (unsigned int i = 0; i < numHalConfigs; ++i) {
211         audioPortConfigFromHal(halConfigs[i], &(*configs)[i]);
212     }
213 }
214 
audioPortConfigsToHal(const hidl_vec<AudioPortConfig> & configs)215 std::unique_ptr<audio_port_config[]> HidlUtils::audioPortConfigsToHal(
216         const hidl_vec<AudioPortConfig>& configs) {
217     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 
audioPortFromHal(const struct audio_port & halPort,AudioPort * port)224 void 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) {
247         case AUDIO_PORT_TYPE_NONE: break;
248         case AUDIO_PORT_TYPE_DEVICE: {
249             port->ext.device.hwModule = halPort.ext.device.hw_module;
250             port->ext.device.type = AudioDevice(halPort.ext.device.type);
251             memcpy(port->ext.device.address.data(),
252                     halPort.ext.device.address,
253                     AUDIO_DEVICE_MAX_ADDRESS_LEN);
254             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 
audioPortToHal(const AudioPort & port,struct audio_port * halPort)269 void 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);
274     memcpy(halPort->name,
275             port.name.c_str(),
276             std::min(port.name.size(), static_cast<size_t>(AUDIO_PORT_MAX_NAME_LEN)));
277     halPort->num_sample_rates =
278             std::min(port.sampleRates.size(), static_cast<size_t>(AUDIO_PORT_MAX_SAMPLING_RATES));
279     for (size_t i = 0; i < halPort->num_sample_rates; ++i) {
280         halPort->sample_rates[i] = port.sampleRates[i];
281     }
282     halPort->num_channel_masks =
283             std::min(port.channelMasks.size(), static_cast<size_t>(AUDIO_PORT_MAX_CHANNEL_MASKS));
284     for (size_t i = 0; i < halPort->num_channel_masks; ++i) {
285         halPort->channel_masks[i] = static_cast<audio_channel_mask_t>(port.channelMasks[i]);
286     }
287     halPort->num_formats =
288             std::min(port.formats.size(), static_cast<size_t>(AUDIO_PORT_MAX_FORMATS));
289     for (size_t i = 0; i < halPort->num_formats; ++i) {
290         halPort->formats[i] = static_cast<audio_format_t>(port.formats[i]);
291     }
292     halPort->num_gains = std::min(port.gains.size(), static_cast<size_t>(AUDIO_PORT_MAX_GAINS));
293     for (size_t i = 0; i < halPort->num_gains; ++i) {
294         audioGainToHal(port.gains[i], &halPort->gains[i]);
295     }
296     audioPortConfigToHal(port.activeConfig, &halPort->active_config);
297     switch (port.type) {
298         case AudioPortType::NONE: break;
299         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);
302             memcpy(halPort->ext.device.address,
303                     port.ext.device.address.data(),
304                     AUDIO_DEVICE_MAX_ADDRESS_LEN);
305             break;
306         }
307         case AudioPortType::MIX: {
308             halPort->ext.mix.hw_module = port.ext.mix.hwModule;
309             halPort->ext.mix.handle = port.ext.mix.ioHandle;
310             halPort->ext.mix.latency_class =
311                     static_cast<audio_mix_latency_class_t>(port.ext.mix.latencyClass);
312             break;
313         }
314         case AudioPortType::SESSION: {
315             halPort->ext.session.session = static_cast<audio_session_t>(port.ext.session.session);
316             break;
317         }
318     }
319 }
320 
uuidFromHal(const audio_uuid_t & halUuid,Uuid * uuid)321 void HidlUtils::uuidFromHal(const audio_uuid_t& halUuid, Uuid* uuid) {
322     uuid->timeLow = halUuid.timeLow;
323     uuid->timeMid = halUuid.timeMid;
324     uuid->versionAndTimeHigh = halUuid.timeHiAndVersion;
325     uuid->variantAndClockSeqHigh = halUuid.clockSeq;
326     memcpy(uuid->node.data(), halUuid.node, uuid->node.size());
327 }
328 
uuidToHal(const Uuid & uuid,audio_uuid_t * halUuid)329 void HidlUtils::uuidToHal(const Uuid& uuid, audio_uuid_t* halUuid) {
330     halUuid->timeLow = uuid.timeLow;
331     halUuid->timeMid = uuid.timeMid;
332     halUuid->timeHiAndVersion = uuid.versionAndTimeHigh;
333     halUuid->clockSeq = uuid.variantAndClockSeqHigh;
334     memcpy(halUuid->node, uuid.node.data(), uuid.node.size());
335 }
336 
337 }  // namespace android
338