xref: /aosp_15_r20/hardware/interfaces/audio/common/all-versions/default/HidlUtils.h (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
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 #ifndef android_hardware_audio_Hidl_Utils_H_
18*4d7e907cSAndroid Build Coastguard Worker #define android_hardware_audio_Hidl_Utils_H_
19*4d7e907cSAndroid Build Coastguard Worker 
20*4d7e907cSAndroid Build Coastguard Worker // clang-format off
21*4d7e907cSAndroid Build Coastguard Worker #include PATH(android/hardware/audio/common/COMMON_TYPES_FILE_VERSION/types.h)
22*4d7e907cSAndroid Build Coastguard Worker // clang-format on
23*4d7e907cSAndroid Build Coastguard Worker 
24*4d7e907cSAndroid Build Coastguard Worker #include <memory>
25*4d7e907cSAndroid Build Coastguard Worker #include <string>
26*4d7e907cSAndroid Build Coastguard Worker #include <vector>
27*4d7e907cSAndroid Build Coastguard Worker 
28*4d7e907cSAndroid Build Coastguard Worker #include <system/audio.h>
29*4d7e907cSAndroid Build Coastguard Worker 
30*4d7e907cSAndroid Build Coastguard Worker namespace android {
31*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
32*4d7e907cSAndroid Build Coastguard Worker namespace audio {
33*4d7e907cSAndroid Build Coastguard Worker namespace common {
34*4d7e907cSAndroid Build Coastguard Worker namespace COMMON_TYPES_CPP_VERSION {
35*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
36*4d7e907cSAndroid Build Coastguard Worker 
37*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::hidl_vec;
38*4d7e907cSAndroid Build Coastguard Worker using namespace ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION;
39*4d7e907cSAndroid Build Coastguard Worker 
40*4d7e907cSAndroid Build Coastguard Worker struct HidlUtils {
41*4d7e907cSAndroid Build Coastguard Worker     static status_t audioConfigFromHal(const audio_config_t& halConfig, bool isInput,
42*4d7e907cSAndroid Build Coastguard Worker                                        AudioConfig* config);
43*4d7e907cSAndroid Build Coastguard Worker     static status_t audioConfigToHal(const AudioConfig& config, audio_config_t* halConfig);
44*4d7e907cSAndroid Build Coastguard Worker #if MAJOR_VERSION >= 4
45*4d7e907cSAndroid Build Coastguard Worker     static status_t audioContentTypeFromHal(const audio_content_type_t halContentType,
46*4d7e907cSAndroid Build Coastguard Worker                                             AudioContentType* contentType);
47*4d7e907cSAndroid Build Coastguard Worker     static status_t audioContentTypeToHal(const AudioContentType& contentType,
48*4d7e907cSAndroid Build Coastguard Worker                                           audio_content_type_t* halContentType);
49*4d7e907cSAndroid Build Coastguard Worker #endif
50*4d7e907cSAndroid Build Coastguard Worker     static status_t audioGainConfigFromHal(const struct audio_gain_config& halConfig, bool isInput,
51*4d7e907cSAndroid Build Coastguard Worker                                            AudioGainConfig* config);
52*4d7e907cSAndroid Build Coastguard Worker     static status_t audioGainConfigToHal(const AudioGainConfig& config,
53*4d7e907cSAndroid Build Coastguard Worker                                          struct audio_gain_config* halConfig);
54*4d7e907cSAndroid Build Coastguard Worker     static status_t audioGainFromHal(const struct audio_gain& halGain, bool isInput,
55*4d7e907cSAndroid Build Coastguard Worker                                      AudioGain* gain);
56*4d7e907cSAndroid Build Coastguard Worker     static status_t audioGainToHal(const AudioGain& gain, struct audio_gain* halGain);
57*4d7e907cSAndroid Build Coastguard Worker     static status_t audioUsageFromHal(audio_usage_t halUsage, AudioUsage* usage);
58*4d7e907cSAndroid Build Coastguard Worker     static status_t audioUsageToHal(const AudioUsage& usage, audio_usage_t* halUsage);
59*4d7e907cSAndroid Build Coastguard Worker     static status_t audioOffloadInfoFromHal(const audio_offload_info_t& halOffload,
60*4d7e907cSAndroid Build Coastguard Worker                                             AudioOffloadInfo* offload);
61*4d7e907cSAndroid Build Coastguard Worker     static status_t audioOffloadInfoToHal(const AudioOffloadInfo& offload,
62*4d7e907cSAndroid Build Coastguard Worker                                           audio_offload_info_t* halOffload);
63*4d7e907cSAndroid Build Coastguard Worker     static status_t audioPortConfigFromHal(const struct audio_port_config& halConfig,
64*4d7e907cSAndroid Build Coastguard Worker                                            AudioPortConfig* config);
65*4d7e907cSAndroid Build Coastguard Worker     static status_t audioPortConfigToHal(const AudioPortConfig& config,
66*4d7e907cSAndroid Build Coastguard Worker                                          struct audio_port_config* halConfig);
67*4d7e907cSAndroid Build Coastguard Worker     static status_t audioPortConfigsFromHal(unsigned int numHalConfigs,
68*4d7e907cSAndroid Build Coastguard Worker                                             const struct audio_port_config* halConfigs,
69*4d7e907cSAndroid Build Coastguard Worker                                             hidl_vec<AudioPortConfig>* configs);
70*4d7e907cSAndroid Build Coastguard Worker     static status_t audioPortConfigsToHal(const hidl_vec<AudioPortConfig>& configs,
71*4d7e907cSAndroid Build Coastguard Worker                                           std::unique_ptr<audio_port_config[]>* halConfigs);
72*4d7e907cSAndroid Build Coastguard Worker     static status_t audioPortFromHal(const struct audio_port& halPort, AudioPort* port);
73*4d7e907cSAndroid Build Coastguard Worker     static status_t audioPortToHal(const AudioPort& port, struct audio_port* halPort);
74*4d7e907cSAndroid Build Coastguard Worker     static status_t audioSourceFromHal(audio_source_t halSource, AudioSource* source);
75*4d7e907cSAndroid Build Coastguard Worker     static status_t audioSourceToHal(const AudioSource& source, audio_source_t* halSource);
76*4d7e907cSAndroid Build Coastguard Worker #if MAJOR_VERSION >= 5
77*4d7e907cSAndroid Build Coastguard Worker     static status_t deviceAddressToHal(const DeviceAddress& device, audio_devices_t* halDeviceType,
78*4d7e907cSAndroid Build Coastguard Worker                                        char* halDeviceAddress);
79*4d7e907cSAndroid Build Coastguard Worker     static status_t deviceAddressFromHal(audio_devices_t halDeviceType,
80*4d7e907cSAndroid Build Coastguard Worker                                          const char* halDeviceAddress, DeviceAddress* device);
81*4d7e907cSAndroid Build Coastguard Worker #endif
82*4d7e907cSAndroid Build Coastguard Worker 
83*4d7e907cSAndroid Build Coastguard Worker #if MAJOR_VERSION >= 7
84*4d7e907cSAndroid Build Coastguard Worker     static constexpr char sAudioTagSeparator = AUDIO_ATTRIBUTES_TAGS_SEPARATOR;
85*4d7e907cSAndroid Build Coastguard Worker 
86*4d7e907cSAndroid Build Coastguard Worker     static status_t audioChannelMaskFromHal(audio_channel_mask_t halChannelMask, bool isInput,
87*4d7e907cSAndroid Build Coastguard Worker                                             AudioChannelMask* channelMask);
88*4d7e907cSAndroid Build Coastguard Worker     static status_t audioChannelMasksFromHal(const std::vector<std::string>& halChannelMasks,
89*4d7e907cSAndroid Build Coastguard Worker                                              hidl_vec<AudioChannelMask>* channelMasks);
90*4d7e907cSAndroid Build Coastguard Worker     static status_t audioChannelMaskToHal(const AudioChannelMask& channelMask,
91*4d7e907cSAndroid Build Coastguard Worker                                           audio_channel_mask_t* halChannelMask);
92*4d7e907cSAndroid Build Coastguard Worker     static status_t audioConfigBaseFromHal(const audio_config_base_t& halConfigBase, bool isInput,
93*4d7e907cSAndroid Build Coastguard Worker                                            AudioConfigBase* configBase);
94*4d7e907cSAndroid Build Coastguard Worker     static status_t audioConfigBaseToHal(const AudioConfigBase& configBase,
95*4d7e907cSAndroid Build Coastguard Worker                                          audio_config_base_t* halConfigBase);
96*4d7e907cSAndroid Build Coastguard Worker     static status_t audioConfigBaseOptionalFromHal(const audio_config_base_t& halConfigBase,
97*4d7e907cSAndroid Build Coastguard Worker                                                    bool isInput, bool formatSpecified,
98*4d7e907cSAndroid Build Coastguard Worker                                                    bool sampleRateSpecified,
99*4d7e907cSAndroid Build Coastguard Worker                                                    bool channelMaskSpecified,
100*4d7e907cSAndroid Build Coastguard Worker                                                    AudioConfigBaseOptional* configBase);
101*4d7e907cSAndroid Build Coastguard Worker     static status_t audioConfigBaseOptionalToHal(const AudioConfigBaseOptional& configBase,
102*4d7e907cSAndroid Build Coastguard Worker                                                  audio_config_base_t* halConfigBase,
103*4d7e907cSAndroid Build Coastguard Worker                                                  bool* formatSpecified, bool* sampleRateSpecified,
104*4d7e907cSAndroid Build Coastguard Worker                                                  bool* channelMaskSpecified);
105*4d7e907cSAndroid Build Coastguard Worker     static status_t audioDeviceTypeFromHal(audio_devices_t halDevice, AudioDevice* device);
106*4d7e907cSAndroid Build Coastguard Worker     static status_t audioDeviceTypeToHal(const AudioDevice& device, audio_devices_t* halDevice);
107*4d7e907cSAndroid Build Coastguard Worker     static status_t audioFormatFromHal(audio_format_t halFormat, AudioFormat* format);
108*4d7e907cSAndroid Build Coastguard Worker     static status_t audioFormatsFromHal(const std::vector<std::string>& halFormats,
109*4d7e907cSAndroid Build Coastguard Worker                                         hidl_vec<AudioFormat>* formats);
110*4d7e907cSAndroid Build Coastguard Worker     static status_t audioFormatToHal(const AudioFormat& format, audio_format_t* halFormat);
111*4d7e907cSAndroid Build Coastguard Worker     static status_t audioGainModeMaskFromHal(audio_gain_mode_t halGainModeMask,
112*4d7e907cSAndroid Build Coastguard Worker                                              hidl_vec<AudioGainMode>* gainModeMask);
113*4d7e907cSAndroid Build Coastguard Worker     static status_t audioGainModeMaskToHal(const hidl_vec<AudioGainMode>& gainModeMask,
114*4d7e907cSAndroid Build Coastguard Worker                                            audio_gain_mode_t* halGainModeMask);
115*4d7e907cSAndroid Build Coastguard Worker     static status_t audioPortFromHal(const struct audio_port_v7& halPort, AudioPort* port);
116*4d7e907cSAndroid Build Coastguard Worker     static status_t audioPortToHal(const AudioPort& port, struct audio_port_v7* halPort);
117*4d7e907cSAndroid Build Coastguard Worker     static status_t audioProfileFromHal(const struct audio_profile& halProfile, bool isInput,
118*4d7e907cSAndroid Build Coastguard Worker                                         AudioProfile* profile);
119*4d7e907cSAndroid Build Coastguard Worker     static status_t audioProfileToHal(const AudioProfile& profile,
120*4d7e907cSAndroid Build Coastguard Worker                                       struct audio_profile* halProfile);
121*4d7e907cSAndroid Build Coastguard Worker     static status_t audioStreamTypeFromHal(audio_stream_type_t halStreamType,
122*4d7e907cSAndroid Build Coastguard Worker                                            AudioStreamType* streamType);
123*4d7e907cSAndroid Build Coastguard Worker     static status_t audioStreamTypeToHal(const AudioStreamType& streamType,
124*4d7e907cSAndroid Build Coastguard Worker                                          audio_stream_type_t* halStreamType);
125*4d7e907cSAndroid Build Coastguard Worker     static status_t audioTagsFromHal(const std::vector<std::string>& strTags,
126*4d7e907cSAndroid Build Coastguard Worker                                      hidl_vec<AudioTag>* tags);
127*4d7e907cSAndroid Build Coastguard Worker     static status_t audioTagsToHal(const hidl_vec<AudioTag>& tags, char* halTags);
128*4d7e907cSAndroid Build Coastguard Worker     static hidl_vec<AudioTag> filterOutNonVendorTags(const hidl_vec<AudioTag>& tags);
129*4d7e907cSAndroid Build Coastguard Worker     static std::vector<std::string> filterOutNonVendorTags(const std::vector<std::string>& tags);
130*4d7e907cSAndroid Build Coastguard Worker     static std::vector<std::string> splitAudioTags(const char* halTags);
131*4d7e907cSAndroid Build Coastguard Worker     static status_t audioTransportsFromHal(const struct audio_port_v7& halPort, bool isInput,
132*4d7e907cSAndroid Build Coastguard Worker                                            hidl_vec<AudioTransport>* transports);
133*4d7e907cSAndroid Build Coastguard Worker     static status_t audioTransportsToHal(const hidl_vec<AudioTransport>& transports,
134*4d7e907cSAndroid Build Coastguard Worker                                          struct audio_port_v7* halTransport);
135*4d7e907cSAndroid Build Coastguard Worker 
136*4d7e907cSAndroid Build Coastguard Worker   private:
137*4d7e907cSAndroid Build Coastguard Worker     static status_t audioIndexChannelMaskFromHal(audio_channel_mask_t halChannelMask,
138*4d7e907cSAndroid Build Coastguard Worker                                                  AudioChannelMask* channelMask);
139*4d7e907cSAndroid Build Coastguard Worker     static status_t audioInputChannelMaskFromHal(audio_channel_mask_t halChannelMask,
140*4d7e907cSAndroid Build Coastguard Worker                                                  AudioChannelMask* channelMask);
141*4d7e907cSAndroid Build Coastguard Worker     static status_t audioOutputChannelMaskFromHal(audio_channel_mask_t halChannelMask,
142*4d7e907cSAndroid Build Coastguard Worker                                                   AudioChannelMask* channelMask);
143*4d7e907cSAndroid Build Coastguard Worker     static status_t audioPortExtendedInfoFromHal(
144*4d7e907cSAndroid Build Coastguard Worker             audio_port_role_t role, audio_port_type_t type,
145*4d7e907cSAndroid Build Coastguard Worker             const struct audio_port_config_device_ext& device,
146*4d7e907cSAndroid Build Coastguard Worker             const struct audio_port_config_mix_ext& mix,
147*4d7e907cSAndroid Build Coastguard Worker             const struct audio_port_config_session_ext& session, AudioPortExtendedInfo* ext,
148*4d7e907cSAndroid Build Coastguard Worker             bool* isInput);
149*4d7e907cSAndroid Build Coastguard Worker     static status_t audioPortExtendedInfoToHal(const AudioPortExtendedInfo& ext,
150*4d7e907cSAndroid Build Coastguard Worker                                                audio_port_role_t* role, audio_port_type_t* type,
151*4d7e907cSAndroid Build Coastguard Worker                                                struct audio_port_config_device_ext* device,
152*4d7e907cSAndroid Build Coastguard Worker                                                struct audio_port_config_mix_ext* mix,
153*4d7e907cSAndroid Build Coastguard Worker                                                struct audio_port_config_session_ext* session);
154*4d7e907cSAndroid Build Coastguard Worker     static status_t encapsulationTypeFromHal(audio_encapsulation_type_t halEncapsulationType,
155*4d7e907cSAndroid Build Coastguard Worker                                              AudioEncapsulationType* encapsulationType);
156*4d7e907cSAndroid Build Coastguard Worker     static status_t encapsulationTypeToHal(const AudioEncapsulationType& encapsulationType,
157*4d7e907cSAndroid Build Coastguard Worker                                            audio_encapsulation_type_t* halEncapsulationType);
158*4d7e907cSAndroid Build Coastguard Worker 
159*4d7e907cSAndroid Build Coastguard Worker #endif  // MAJOR_VERSION >= 7
160*4d7e907cSAndroid Build Coastguard Worker 
161*4d7e907cSAndroid Build Coastguard Worker     // V4 and below have DeviceAddress defined in the 'core' interface.
162*4d7e907cSAndroid Build Coastguard Worker     // To avoid duplicating code, the implementations of deviceAddressTo/FromHal
163*4d7e907cSAndroid Build Coastguard Worker     // are defined as templates. These templates can be only used directly by V4
164*4d7e907cSAndroid Build Coastguard Worker     // and below.
165*4d7e907cSAndroid Build Coastguard Worker #if MAJOR_VERSION >= 5
166*4d7e907cSAndroid Build Coastguard Worker   private:
167*4d7e907cSAndroid Build Coastguard Worker #endif
168*4d7e907cSAndroid Build Coastguard Worker     template <typename DA>
169*4d7e907cSAndroid Build Coastguard Worker     static status_t deviceAddressToHalImpl(const DA& device, audio_devices_t* halDeviceType,
170*4d7e907cSAndroid Build Coastguard Worker                                            char* halDeviceAddress);
171*4d7e907cSAndroid Build Coastguard Worker     template <typename DA>
172*4d7e907cSAndroid Build Coastguard Worker     static status_t deviceAddressFromHalImpl(audio_devices_t halDeviceType,
173*4d7e907cSAndroid Build Coastguard Worker                                              const char* halDeviceAddress, DA* device);
174*4d7e907cSAndroid Build Coastguard Worker };
175*4d7e907cSAndroid Build Coastguard Worker 
176*4d7e907cSAndroid Build Coastguard Worker #if MAJOR_VERSION <= 6
177*4d7e907cSAndroid Build Coastguard Worker #if MAJOR_VERSION >= 4
audioContentTypeFromHal(const audio_content_type_t halContentType,AudioContentType * contentType)178*4d7e907cSAndroid Build Coastguard Worker inline status_t HidlUtils::audioContentTypeFromHal(const audio_content_type_t halContentType,
179*4d7e907cSAndroid Build Coastguard Worker                                                    AudioContentType* contentType) {
180*4d7e907cSAndroid Build Coastguard Worker     *contentType = AudioContentType(halContentType);
181*4d7e907cSAndroid Build Coastguard Worker     return NO_ERROR;
182*4d7e907cSAndroid Build Coastguard Worker }
183*4d7e907cSAndroid Build Coastguard Worker 
audioContentTypeToHal(const AudioContentType & contentType,audio_content_type_t * halContentType)184*4d7e907cSAndroid Build Coastguard Worker inline status_t HidlUtils::audioContentTypeToHal(const AudioContentType& contentType,
185*4d7e907cSAndroid Build Coastguard Worker                                                  audio_content_type_t* halContentType) {
186*4d7e907cSAndroid Build Coastguard Worker     *halContentType = static_cast<audio_content_type_t>(contentType);
187*4d7e907cSAndroid Build Coastguard Worker     return NO_ERROR;
188*4d7e907cSAndroid Build Coastguard Worker }
189*4d7e907cSAndroid Build Coastguard Worker #endif
190*4d7e907cSAndroid Build Coastguard Worker 
audioSourceFromHal(audio_source_t halSource,AudioSource * source)191*4d7e907cSAndroid Build Coastguard Worker inline status_t HidlUtils::audioSourceFromHal(audio_source_t halSource, AudioSource* source) {
192*4d7e907cSAndroid Build Coastguard Worker     *source = AudioSource(halSource);
193*4d7e907cSAndroid Build Coastguard Worker     return NO_ERROR;
194*4d7e907cSAndroid Build Coastguard Worker }
195*4d7e907cSAndroid Build Coastguard Worker 
audioSourceToHal(const AudioSource & source,audio_source_t * halSource)196*4d7e907cSAndroid Build Coastguard Worker inline status_t HidlUtils::audioSourceToHal(const AudioSource& source, audio_source_t* halSource) {
197*4d7e907cSAndroid Build Coastguard Worker     *halSource = static_cast<audio_source_t>(source);
198*4d7e907cSAndroid Build Coastguard Worker     return NO_ERROR;
199*4d7e907cSAndroid Build Coastguard Worker }
200*4d7e907cSAndroid Build Coastguard Worker 
201*4d7e907cSAndroid Build Coastguard Worker template <typename DA>
deviceAddressToHalImpl(const DA & device,audio_devices_t * halDeviceType,char * halDeviceAddress)202*4d7e907cSAndroid Build Coastguard Worker status_t HidlUtils::deviceAddressToHalImpl(const DA& device, audio_devices_t* halDeviceType,
203*4d7e907cSAndroid Build Coastguard Worker                                            char* halDeviceAddress) {
204*4d7e907cSAndroid Build Coastguard Worker     *halDeviceType = static_cast<audio_devices_t>(device.device);
205*4d7e907cSAndroid Build Coastguard Worker     memset(halDeviceAddress, 0, AUDIO_DEVICE_MAX_ADDRESS_LEN);
206*4d7e907cSAndroid Build Coastguard Worker     if (audio_is_a2dp_out_device(*halDeviceType) || audio_is_a2dp_in_device(*halDeviceType)) {
207*4d7e907cSAndroid Build Coastguard Worker         snprintf(halDeviceAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN, "%02X:%02X:%02X:%02X:%02X:%02X",
208*4d7e907cSAndroid Build Coastguard Worker                  device.address.mac[0], device.address.mac[1], device.address.mac[2],
209*4d7e907cSAndroid Build Coastguard Worker                  device.address.mac[3], device.address.mac[4], device.address.mac[5]);
210*4d7e907cSAndroid Build Coastguard Worker     } else if (*halDeviceType == AUDIO_DEVICE_OUT_IP || *halDeviceType == AUDIO_DEVICE_IN_IP) {
211*4d7e907cSAndroid Build Coastguard Worker         snprintf(halDeviceAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN, "%d.%d.%d.%d",
212*4d7e907cSAndroid Build Coastguard Worker                  device.address.ipv4[0], device.address.ipv4[1], device.address.ipv4[2],
213*4d7e907cSAndroid Build Coastguard Worker                  device.address.ipv4[3]);
214*4d7e907cSAndroid Build Coastguard Worker     } else if (audio_is_usb_out_device(*halDeviceType) || audio_is_usb_in_device(*halDeviceType)) {
215*4d7e907cSAndroid Build Coastguard Worker         snprintf(halDeviceAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN, "card=%d;device=%d",
216*4d7e907cSAndroid Build Coastguard Worker                  device.address.alsa.card, device.address.alsa.device);
217*4d7e907cSAndroid Build Coastguard Worker     } else if (*halDeviceType == AUDIO_DEVICE_OUT_BUS || *halDeviceType == AUDIO_DEVICE_IN_BUS) {
218*4d7e907cSAndroid Build Coastguard Worker         snprintf(halDeviceAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN, "%s", device.busAddress.c_str());
219*4d7e907cSAndroid Build Coastguard Worker     } else if (*halDeviceType == AUDIO_DEVICE_OUT_REMOTE_SUBMIX ||
220*4d7e907cSAndroid Build Coastguard Worker                *halDeviceType == AUDIO_DEVICE_IN_REMOTE_SUBMIX) {
221*4d7e907cSAndroid Build Coastguard Worker         snprintf(halDeviceAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN, "%s",
222*4d7e907cSAndroid Build Coastguard Worker                  device.rSubmixAddress.c_str());
223*4d7e907cSAndroid Build Coastguard Worker     } else {
224*4d7e907cSAndroid Build Coastguard Worker         // Fall back to bus address for other device types, e.g. for microphones.
225*4d7e907cSAndroid Build Coastguard Worker         snprintf(halDeviceAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN, "%s", device.busAddress.c_str());
226*4d7e907cSAndroid Build Coastguard Worker     }
227*4d7e907cSAndroid Build Coastguard Worker     return NO_ERROR;
228*4d7e907cSAndroid Build Coastguard Worker }
229*4d7e907cSAndroid Build Coastguard Worker 
230*4d7e907cSAndroid Build Coastguard Worker template <typename DA>
deviceAddressFromHalImpl(audio_devices_t halDeviceType,const char * halDeviceAddress,DA * device)231*4d7e907cSAndroid Build Coastguard Worker status_t HidlUtils::deviceAddressFromHalImpl(audio_devices_t halDeviceType,
232*4d7e907cSAndroid Build Coastguard Worker                                              const char* halDeviceAddress, DA* device) {
233*4d7e907cSAndroid Build Coastguard Worker     if (device == nullptr) {
234*4d7e907cSAndroid Build Coastguard Worker         return BAD_VALUE;
235*4d7e907cSAndroid Build Coastguard Worker     }
236*4d7e907cSAndroid Build Coastguard Worker     device->device = AudioDevice(halDeviceType);
237*4d7e907cSAndroid Build Coastguard Worker     if (halDeviceAddress == nullptr ||
238*4d7e907cSAndroid Build Coastguard Worker         strnlen(halDeviceAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN) == 0) {
239*4d7e907cSAndroid Build Coastguard Worker         return NO_ERROR;
240*4d7e907cSAndroid Build Coastguard Worker     }
241*4d7e907cSAndroid Build Coastguard Worker 
242*4d7e907cSAndroid Build Coastguard Worker     if (audio_is_a2dp_out_device(halDeviceType) || audio_is_a2dp_in_device(halDeviceType)) {
243*4d7e907cSAndroid Build Coastguard Worker         int status =
244*4d7e907cSAndroid Build Coastguard Worker                 sscanf(halDeviceAddress, "%hhX:%hhX:%hhX:%hhX:%hhX:%hhX", &device->address.mac[0],
245*4d7e907cSAndroid Build Coastguard Worker                        &device->address.mac[1], &device->address.mac[2], &device->address.mac[3],
246*4d7e907cSAndroid Build Coastguard Worker                        &device->address.mac[4], &device->address.mac[5]);
247*4d7e907cSAndroid Build Coastguard Worker         return status == 6 ? OK : BAD_VALUE;
248*4d7e907cSAndroid Build Coastguard Worker     } else if (halDeviceType == AUDIO_DEVICE_OUT_IP || halDeviceType == AUDIO_DEVICE_IN_IP) {
249*4d7e907cSAndroid Build Coastguard Worker         int status = sscanf(halDeviceAddress, "%hhu.%hhu.%hhu.%hhu", &device->address.ipv4[0],
250*4d7e907cSAndroid Build Coastguard Worker                             &device->address.ipv4[1], &device->address.ipv4[2],
251*4d7e907cSAndroid Build Coastguard Worker                             &device->address.ipv4[3]);
252*4d7e907cSAndroid Build Coastguard Worker         return status == 4 ? OK : BAD_VALUE;
253*4d7e907cSAndroid Build Coastguard Worker     } else if (audio_is_usb_out_device(halDeviceType) || audio_is_usb_in_device(halDeviceType)) {
254*4d7e907cSAndroid Build Coastguard Worker         int status = sscanf(halDeviceAddress, "card=%d;device=%d", &device->address.alsa.card,
255*4d7e907cSAndroid Build Coastguard Worker                             &device->address.alsa.device);
256*4d7e907cSAndroid Build Coastguard Worker         return status == 2 ? OK : BAD_VALUE;
257*4d7e907cSAndroid Build Coastguard Worker     } else if (halDeviceType == AUDIO_DEVICE_OUT_BUS || halDeviceType == AUDIO_DEVICE_IN_BUS) {
258*4d7e907cSAndroid Build Coastguard Worker         device->busAddress = halDeviceAddress;
259*4d7e907cSAndroid Build Coastguard Worker         return OK;
260*4d7e907cSAndroid Build Coastguard Worker     } else if (halDeviceType == AUDIO_DEVICE_OUT_REMOTE_SUBMIX ||
261*4d7e907cSAndroid Build Coastguard Worker                halDeviceType == AUDIO_DEVICE_IN_REMOTE_SUBMIX) {
262*4d7e907cSAndroid Build Coastguard Worker         device->rSubmixAddress = halDeviceAddress;
263*4d7e907cSAndroid Build Coastguard Worker         return OK;
264*4d7e907cSAndroid Build Coastguard Worker     }
265*4d7e907cSAndroid Build Coastguard Worker     // Fall back to bus address for other device types, e.g. for microphones.
266*4d7e907cSAndroid Build Coastguard Worker     device->busAddress = halDeviceAddress;
267*4d7e907cSAndroid Build Coastguard Worker     return NO_ERROR;
268*4d7e907cSAndroid Build Coastguard Worker }
269*4d7e907cSAndroid Build Coastguard Worker #endif  // MAJOR_VERSION <= 6
270*4d7e907cSAndroid Build Coastguard Worker 
271*4d7e907cSAndroid Build Coastguard Worker }  // namespace implementation
272*4d7e907cSAndroid Build Coastguard Worker }  // namespace COMMON_TYPES_CPP_VERSION
273*4d7e907cSAndroid Build Coastguard Worker }  // namespace common
274*4d7e907cSAndroid Build Coastguard Worker }  // namespace audio
275*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
276*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
277*4d7e907cSAndroid Build Coastguard Worker 
278*4d7e907cSAndroid Build Coastguard Worker #endif  // android_hardware_audio_Hidl_Utils_H_
279