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