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