Home | History | Annotate | Download | only in default
      1 /*
      2  * Copyright (C) 2018 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 "HidlUtils.h"
     18 
     19 #include <common/all-versions/VersionUtils.h>
     20 #include <string.h>
     21 
     22 using ::android::hardware::audio::common::utils::EnumBitfield;
     23 
     24 namespace android {
     25 namespace hardware {
     26 namespace audio {
     27 namespace common {
     28 namespace CPP_VERSION {
     29 namespace implementation {
     30 
     31 void HidlUtils::audioConfigFromHal(const audio_config_t& halConfig, AudioConfig* config) {
     32     config->sampleRateHz = halConfig.sample_rate;
     33     config->channelMask = EnumBitfield<AudioChannelMask>(halConfig.channel_mask);
     34     config->format = AudioFormat(halConfig.format);
     35     audioOffloadInfoFromHal(halConfig.offload_info, &config->offloadInfo);
     36     config->frameCount = halConfig.frame_count;
     37 }
     38 
     39 void 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 
     48 void HidlUtils::audioGainConfigFromHal(const struct audio_gain_config& halConfig,
     49                                        AudioGainConfig* config) {
     50     config->index = halConfig.index;
     51     config->mode = EnumBitfield<AudioGainMode>(halConfig.mode);
     52     config->channelMask = EnumBitfield<AudioChannelMask>(halConfig.channel_mask);
     53     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 
     59 void HidlUtils::audioGainConfigToHal(const AudioGainConfig& config,
     60                                      struct audio_gain_config* halConfig) {
     61     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 
     71 void HidlUtils::audioGainFromHal(const struct audio_gain& halGain, AudioGain* gain) {
     72     gain->mode = EnumBitfield<AudioGainMode>(halGain.mode);
     73     gain->channelMask = EnumBitfield<AudioChannelMask>(halGain.channel_mask);
     74     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 
     82 void 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 
     93 AudioUsage 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 
    105 audio_usage_t HidlUtils::audioUsageToHal(const AudioUsage usage) {
    106     return static_cast<audio_usage_t>(usage);
    107 }
    108 
    109 void HidlUtils::audioOffloadInfoFromHal(const audio_offload_info_t& halOffload,
    110                                         AudioOffloadInfo* offload) {
    111     offload->sampleRateHz = halOffload.sample_rate;
    112     offload->channelMask = EnumBitfield<AudioChannelMask>(halOffload.channel_mask);
    113     offload->format = AudioFormat(halOffload.format);
    114     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;
    119     offload->bitWidth = halOffload.bit_width;
    120     offload->bufferSize = halOffload.offload_buffer_size;
    121     offload->usage = audioUsageFromHal(halOffload.usage);
    122 }
    123 
    124 void HidlUtils::audioOffloadInfoToHal(const AudioOffloadInfo& offload,
    125                                       audio_offload_info_t* halOffload) {
    126     *halOffload = AUDIO_INFO_INITIALIZER;
    127     halOffload->sample_rate = offload.sampleRateHz;
    128     halOffload->channel_mask = static_cast<audio_channel_mask_t>(offload.channelMask);
    129     halOffload->format = static_cast<audio_format_t>(offload.format);
    130     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;
    135     halOffload->bit_width = offload.bitWidth;
    136     halOffload->offload_buffer_size = offload.bufferSize;
    137     halOffload->usage = audioUsageToHal(offload.usage);
    138 }
    139 
    140 void HidlUtils::audioPortConfigFromHal(const struct audio_port_config& halConfig,
    141                                        AudioPortConfig* config) {
    142     config->id = halConfig.id;
    143     config->role = AudioPortRole(halConfig.role);
    144     config->type = AudioPortType(halConfig.type);
    145     config->configMask = EnumBitfield<AudioPortConfigMask>(halConfig.config_mask);
    146     config->sampleRateHz = halConfig.sample_rate;
    147     config->channelMask = EnumBitfield<AudioChannelMask>(halConfig.channel_mask);
    148     config->format = AudioFormat(halConfig.format);
    149     audioGainConfigFromHal(halConfig.gain, &config->gain);
    150     switch (halConfig.type) {
    151         case AUDIO_PORT_TYPE_NONE:
    152             break;
    153         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);
    156             memcpy(config->ext.device.address.data(), halConfig.ext.device.address,
    157                    AUDIO_DEVICE_MAX_ADDRESS_LEN);
    158             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) {
    164                 config->ext.mix.useCase.stream = AudioStreamType(halConfig.ext.mix.usecase.stream);
    165             } else if (halConfig.role == AUDIO_PORT_ROLE_SINK) {
    166                 config->ext.mix.useCase.source = AudioSource(halConfig.ext.mix.usecase.source);
    167             }
    168             break;
    169         }
    170         case AUDIO_PORT_TYPE_SESSION: {
    171             config->ext.session.session = halConfig.ext.session.session;
    172             break;
    173         }
    174     }
    175 }
    176 
    177 void HidlUtils::audioPortConfigToHal(const AudioPortConfig& config,
    178                                      struct audio_port_config* halConfig) {
    179     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) {
    189         case AudioPortType::NONE:
    190             break;
    191         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);
    194             memcpy(halConfig->ext.device.address, config.ext.device.address.data(),
    195                    AUDIO_DEVICE_MAX_ADDRESS_LEN);
    196             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) {
    202                 halConfig->ext.mix.usecase.stream =
    203                     static_cast<audio_stream_type_t>(config.ext.mix.useCase.stream);
    204             } else if (config.role == AudioPortRole::SINK) {
    205                 halConfig->ext.mix.usecase.source =
    206                     static_cast<audio_source_t>(config.ext.mix.useCase.source);
    207             }
    208             break;
    209         }
    210         case AudioPortType::SESSION: {
    211             halConfig->ext.session.session =
    212                 static_cast<audio_session_t>(config.ext.session.session);
    213             break;
    214         }
    215     }
    216 }
    217 
    218 void HidlUtils::audioPortConfigsFromHal(unsigned int numHalConfigs,
    219                                         const struct audio_port_config* halConfigs,
    220                                         hidl_vec<AudioPortConfig>* configs) {
    221     configs->resize(numHalConfigs);
    222     for (unsigned int i = 0; i < numHalConfigs; ++i) {
    223         audioPortConfigFromHal(halConfigs[i], &(*configs)[i]);
    224     }
    225 }
    226 
    227 std::unique_ptr<audio_port_config[]> HidlUtils::audioPortConfigsToHal(
    228     const hidl_vec<AudioPortConfig>& configs) {
    229     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 
    236 void 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) {
    247         port->channelMasks[i] = EnumBitfield<AudioChannelMask>(halPort.channel_masks[i]);
    248     }
    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) {
    259         case AUDIO_PORT_TYPE_NONE:
    260             break;
    261         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);
    264             memcpy(port->ext.device.address.data(), halPort.ext.device.address,
    265                    AUDIO_DEVICE_MAX_ADDRESS_LEN);
    266             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 
    281 void 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);
    286     strncpy(halPort->name, port.name.c_str(), AUDIO_PORT_MAX_NAME_LEN);
    287     halPort->name[AUDIO_PORT_MAX_NAME_LEN - 1] = '\0';
    288     halPort->num_sample_rates =
    289         std::min(port.sampleRates.size(), static_cast<size_t>(AUDIO_PORT_MAX_SAMPLING_RATES));
    290     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 =
    294         std::min(port.channelMasks.size(), static_cast<size_t>(AUDIO_PORT_MAX_CHANNEL_MASKS));
    295     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 =
    299         std::min(port.formats.size(), static_cast<size_t>(AUDIO_PORT_MAX_FORMATS));
    300     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) {
    309         case AudioPortType::NONE:
    310             break;
    311         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);
    314             memcpy(halPort->ext.device.address, port.ext.device.address.data(),
    315                    AUDIO_DEVICE_MAX_ADDRESS_LEN);
    316             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 =
    322                 static_cast<audio_mix_latency_class_t>(port.ext.mix.latencyClass);
    323             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 
    332 void 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 
    340 void 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 
    348 }  // namespace implementation
    349 }  // namespace CPP_VERSION
    350 }  // namespace common
    351 }  // namespace audio
    352 }  // namespace hardware
    353 }  // namespace android
    354