1 /*
2 * Copyright (C) 2021 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 #define LOG_TAG "PolicyAidlConversion"
18 //#define LOG_NDEBUG 0
19 #include <utils/Log.h>
20
21 #include "media/PolicyAidlConversion.h"
22
23 #include "media/AidlConversion.h"
24
25 namespace android {
26
27 using base::unexpected;
28 using media::audio::common::AudioDeviceAddress;
29
30 ConversionResult<uint32_t>
aidl2legacy_AudioMixType_uint32_t(media::AudioMixType aidl)31 aidl2legacy_AudioMixType_uint32_t(media::AudioMixType aidl) {
32 switch (aidl) {
33 case media::AudioMixType::PLAYERS:
34 return MIX_TYPE_PLAYERS;
35 case media::AudioMixType::RECORDERS:
36 return MIX_TYPE_RECORDERS;
37 }
38 return unexpected(BAD_VALUE);
39 }
40
41 ConversionResult<media::AudioMixType>
legacy2aidl_uint32_t_AudioMixType(uint32_t legacy)42 legacy2aidl_uint32_t_AudioMixType(uint32_t legacy) {
43 switch (legacy) {
44 case MIX_TYPE_PLAYERS:
45 return media::AudioMixType::PLAYERS;
46 case MIX_TYPE_RECORDERS:
47 return media::AudioMixType::RECORDERS;
48 }
49 return unexpected(BAD_VALUE);
50 }
51
52 ConversionResult<uint32_t>
aidl2legacy_AudioMixCallbackFlag_uint32_t(media::AudioMixCallbackFlag aidl)53 aidl2legacy_AudioMixCallbackFlag_uint32_t(media::AudioMixCallbackFlag aidl) {
54 switch (aidl) {
55 case media::AudioMixCallbackFlag::NOTIFY_ACTIVITY:
56 return AudioMix::kCbFlagNotifyActivity;
57 }
58 return unexpected(BAD_VALUE);
59 }
60
61 ConversionResult<media::AudioMixCallbackFlag>
legacy2aidl_uint32_t_AudioMixCallbackFlag(uint32_t legacy)62 legacy2aidl_uint32_t_AudioMixCallbackFlag(uint32_t legacy) {
63 switch (legacy) {
64 case AudioMix::kCbFlagNotifyActivity:
65 return media::AudioMixCallbackFlag::NOTIFY_ACTIVITY;
66 }
67 return unexpected(BAD_VALUE);
68 }
69
70 ConversionResult<uint32_t>
aidl2legacy_AudioMixCallbackFlag_uint32_t_mask(int32_t aidl)71 aidl2legacy_AudioMixCallbackFlag_uint32_t_mask(int32_t aidl) {
72 return convertBitmask<uint32_t, int32_t, uint32_t, media::AudioMixCallbackFlag>(
73 aidl,
74 aidl2legacy_AudioMixCallbackFlag_uint32_t,
75 indexToEnum_index<media::AudioMixCallbackFlag>,
76 enumToMask_bitmask<uint32_t, uint32_t>);
77 }
78
79 ConversionResult<int32_t>
legacy2aidl_uint32_t_AudioMixCallbackFlag_mask(uint32_t legacy)80 legacy2aidl_uint32_t_AudioMixCallbackFlag_mask(uint32_t legacy) {
81 return convertBitmask<int32_t, uint32_t, media::AudioMixCallbackFlag, uint32_t>(
82 legacy,
83 legacy2aidl_uint32_t_AudioMixCallbackFlag,
84 indexToEnum_bitmask<uint32_t>,
85 enumToMask_index<int32_t, media::AudioMixCallbackFlag>);
86 }
87
88 ConversionResult<uint32_t>
aidl2legacy_AudioMixRouteFlag_uint32_t(media::AudioMixRouteFlag aidl)89 aidl2legacy_AudioMixRouteFlag_uint32_t(media::AudioMixRouteFlag aidl) {
90 switch (aidl) {
91 case media::AudioMixRouteFlag::RENDER:
92 return MIX_ROUTE_FLAG_RENDER;
93 case media::AudioMixRouteFlag::LOOP_BACK:
94 return MIX_ROUTE_FLAG_LOOP_BACK;
95 }
96 return unexpected(BAD_VALUE);
97 }
98
99 ConversionResult<media::AudioMixRouteFlag>
legacy2aidl_uint32_t_AudioMixRouteFlag(uint32_t legacy)100 legacy2aidl_uint32_t_AudioMixRouteFlag(uint32_t legacy) {
101 switch (legacy) {
102 case MIX_ROUTE_FLAG_RENDER:
103 return media::AudioMixRouteFlag::RENDER;
104 case MIX_ROUTE_FLAG_LOOP_BACK:
105 return media::AudioMixRouteFlag::LOOP_BACK;
106 }
107 return unexpected(BAD_VALUE);
108 }
109
110 ConversionResult<uint32_t>
aidl2legacy_AudioMixRouteFlag_uint32_t_mask(int32_t aidl)111 aidl2legacy_AudioMixRouteFlag_uint32_t_mask(int32_t aidl) {
112 return convertBitmask<uint32_t, int32_t, uint32_t, media::AudioMixRouteFlag>(
113 aidl,
114 aidl2legacy_AudioMixRouteFlag_uint32_t,
115 indexToEnum_index<media::AudioMixRouteFlag>,
116 enumToMask_bitmask<uint32_t, uint32_t>);
117 }
118
119 ConversionResult<int32_t>
legacy2aidl_uint32_t_AudioMixRouteFlag_mask(uint32_t legacy)120 legacy2aidl_uint32_t_AudioMixRouteFlag_mask(uint32_t legacy) {
121 return convertBitmask<int32_t, uint32_t, media::AudioMixRouteFlag, uint32_t>(
122 legacy,
123 legacy2aidl_uint32_t_AudioMixRouteFlag,
124 indexToEnum_bitmask<uint32_t>,
125 enumToMask_index<int32_t, media::AudioMixRouteFlag>);
126 }
127
128 // This type is unnamed in the original definition, thus we name it here.
129 using AudioMixMatchCriterionValue = decltype(AudioMixMatchCriterion::mValue);
130
131 ConversionResult<AudioMixMatchCriterionValue>
aidl2legacy_AudioMixMatchCriterionValue(const media::AudioMixMatchCriterionValue & aidl,uint32_t * rule)132 aidl2legacy_AudioMixMatchCriterionValue(
133 const media::AudioMixMatchCriterionValue& aidl,
134 uint32_t* rule) {
135 AudioMixMatchCriterionValue legacy;
136 *rule = 0;
137 switch (aidl.getTag()) {
138 case media::AudioMixMatchCriterionValue::usage:
139 legacy.mUsage = VALUE_OR_RETURN(
140 aidl2legacy_AudioUsage_audio_usage_t(UNION_GET(aidl, usage).value()));
141 *rule |= RULE_MATCH_ATTRIBUTE_USAGE;
142 return legacy;
143
144 case media::AudioMixMatchCriterionValue::source:
145 legacy.mSource = VALUE_OR_RETURN(
146 aidl2legacy_AudioSource_audio_source_t(UNION_GET(aidl, source).value()));
147 *rule |= RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET;
148 return legacy;
149
150 case media::AudioMixMatchCriterionValue::uid:
151 legacy.mUid = VALUE_OR_RETURN(
152 aidl2legacy_int32_t_uid_t(UNION_GET(aidl, uid).value()));
153 *rule |= RULE_MATCH_UID;
154 return legacy;
155
156 case media::AudioMixMatchCriterionValue::userId:
157 legacy.mUserId = VALUE_OR_RETURN(
158 convertIntegral<int>(UNION_GET(aidl, userId).value()));
159 *rule |= RULE_MATCH_USERID;
160 return legacy;
161 }
162 return unexpected(BAD_VALUE);
163 }
164
165 ConversionResult<media::AudioMixMatchCriterionValue>
legacy2aidl_AudioMixMatchCriterionValue(const AudioMixMatchCriterionValue & legacy,uint32_t rule)166 legacy2aidl_AudioMixMatchCriterionValue(
167 const AudioMixMatchCriterionValue& legacy,
168 uint32_t rule) {
169 media::AudioMixMatchCriterionValue aidl;
170 switch (rule) {
171 case RULE_MATCH_ATTRIBUTE_USAGE:
172 UNION_SET(aidl, usage,
173 VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.mUsage)));
174 break;
175
176 case RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET:
177 UNION_SET(aidl, source,
178 VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSource(legacy.mSource)));
179 break;
180
181 case RULE_MATCH_UID:
182 UNION_SET(aidl, uid, VALUE_OR_RETURN(legacy2aidl_uid_t_int32_t(legacy.mUid)));
183 break;
184
185 case RULE_MATCH_USERID:
186 UNION_SET(aidl, userId, VALUE_OR_RETURN(convertReinterpret<uint32_t>(legacy.mUserId)));
187 break;
188
189 default:
190 return unexpected(BAD_VALUE);
191 }
192 return aidl;
193 }
194
195
196 ConversionResult<AudioMixMatchCriterion>
aidl2legacy_AudioMixMatchCriterion(const media::AudioMixMatchCriterion & aidl)197 aidl2legacy_AudioMixMatchCriterion(const media::AudioMixMatchCriterion& aidl) {
198 AudioMixMatchCriterion legacy;
199 legacy.mValue = VALUE_OR_RETURN(
200 aidl2legacy_AudioMixMatchCriterionValue(aidl.value, &legacy.mRule));
201 if (aidl.invert) {
202 legacy.mRule |= RULE_EXCLUSION_MASK;
203 }
204 return legacy;
205 }
206
207 ConversionResult<media::AudioMixMatchCriterion>
legacy2aidl_AudioMixMatchCriterion(const AudioMixMatchCriterion & legacy)208 legacy2aidl_AudioMixMatchCriterion(const AudioMixMatchCriterion& legacy) {
209 media::AudioMixMatchCriterion aidl;
210 uint32_t rule = legacy.mRule;
211 if (rule & RULE_EXCLUSION_MASK) {
212 aidl.invert = true;
213 rule &= ~RULE_EXCLUSION_MASK;
214 }
215 aidl.value = VALUE_OR_RETURN(legacy2aidl_AudioMixMatchCriterionValue(legacy.mValue, rule));
216 return aidl;
217 }
218
219 ConversionResult<AudioMix>
aidl2legacy_AudioMix(const media::AudioMix & aidl)220 aidl2legacy_AudioMix(const media::AudioMix& aidl) {
221 AudioMix legacy;
222 RETURN_IF_ERROR(convertRange(aidl.criteria.begin(), aidl.criteria.end(),
223 std::back_inserter(legacy.mCriteria),
224 aidl2legacy_AudioMixMatchCriterion));
225 legacy.mMixType = VALUE_OR_RETURN(aidl2legacy_AudioMixType_uint32_t(aidl.mixType));
226 // See 'convertAudioMixToNative' in 'android_media_AudioSystem.cpp' -- only
227 // an output mask is expected here.
228 legacy.mFormat = VALUE_OR_RETURN(aidl2legacy_AudioConfig_audio_config_t(
229 aidl.format, false /*isInput*/));
230 legacy.mRouteFlags = VALUE_OR_RETURN(
231 aidl2legacy_AudioMixRouteFlag_uint32_t_mask(aidl.routeFlags));
232 RETURN_IF_ERROR(aidl2legacy_AudioDevice_audio_device(
233 aidl.device, &legacy.mDeviceType, &legacy.mDeviceAddress));
234 legacy.mCbFlags = VALUE_OR_RETURN(aidl2legacy_AudioMixCallbackFlag_uint32_t_mask(aidl.cbFlags));
235 legacy.mAllowPrivilegedMediaPlaybackCapture = aidl.allowPrivilegedMediaPlaybackCapture;
236 legacy.mVoiceCommunicationCaptureAllowed = aidl.voiceCommunicationCaptureAllowed;
237 return legacy;
238 }
239
240 ConversionResult<media::AudioMix>
legacy2aidl_AudioMix(const AudioMix & legacy)241 legacy2aidl_AudioMix(const AudioMix& legacy) {
242 media::AudioMix aidl;
243 aidl.criteria = VALUE_OR_RETURN(
244 convertContainer<std::vector<media::AudioMixMatchCriterion>>(
245 legacy.mCriteria,
246 legacy2aidl_AudioMixMatchCriterion));
247 aidl.mixType = VALUE_OR_RETURN(legacy2aidl_uint32_t_AudioMixType(legacy.mMixType));
248 // See 'convertAudioMixToNative' in 'android_media_AudioSystem.cpp' -- only
249 // an output mask is expected here.
250 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_config_t_AudioConfig(
251 legacy.mFormat, false /*isInput*/));
252 aidl.routeFlags = VALUE_OR_RETURN(
253 legacy2aidl_uint32_t_AudioMixRouteFlag_mask(legacy.mRouteFlags));
254 aidl.device = VALUE_OR_RETURN(
255 legacy2aidl_audio_device_AudioDevice(
256 legacy.mDeviceType, legacy.mDeviceAddress));
257 aidl.cbFlags = VALUE_OR_RETURN(legacy2aidl_uint32_t_AudioMixCallbackFlag_mask(legacy.mCbFlags));
258 aidl.allowPrivilegedMediaPlaybackCapture = legacy.mAllowPrivilegedMediaPlaybackCapture;
259 aidl.voiceCommunicationCaptureAllowed = legacy.mVoiceCommunicationCaptureAllowed;
260 return aidl;
261 }
262
263 ConversionResult<audio_policy_dev_state_t>
aidl2legacy_AudioPolicyDeviceState_audio_policy_dev_state_t(media::AudioPolicyDeviceState aidl)264 aidl2legacy_AudioPolicyDeviceState_audio_policy_dev_state_t(media::AudioPolicyDeviceState aidl) {
265 switch (aidl) {
266 case media::AudioPolicyDeviceState::UNAVAILABLE:
267 return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
268 case media::AudioPolicyDeviceState::AVAILABLE:
269 return AUDIO_POLICY_DEVICE_STATE_AVAILABLE;
270 }
271 return unexpected(BAD_VALUE);
272 }
273
274 ConversionResult<media::AudioPolicyDeviceState>
legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(audio_policy_dev_state_t legacy)275 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(audio_policy_dev_state_t legacy) {
276 switch (legacy) {
277 case AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE:
278 return media::AudioPolicyDeviceState::UNAVAILABLE;
279 case AUDIO_POLICY_DEVICE_STATE_AVAILABLE:
280 return media::AudioPolicyDeviceState::AVAILABLE;
281 case AUDIO_POLICY_DEVICE_STATE_CNT:
282 break;
283 }
284 return unexpected(BAD_VALUE);
285 }
286
287 ConversionResult<audio_policy_force_use_t>
aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(media::AudioPolicyForceUse aidl)288 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(media::AudioPolicyForceUse aidl) {
289 switch (aidl) {
290 case media::AudioPolicyForceUse::COMMUNICATION:
291 return AUDIO_POLICY_FORCE_FOR_COMMUNICATION;
292 case media::AudioPolicyForceUse::MEDIA:
293 return AUDIO_POLICY_FORCE_FOR_MEDIA;
294 case media::AudioPolicyForceUse::RECORD:
295 return AUDIO_POLICY_FORCE_FOR_RECORD;
296 case media::AudioPolicyForceUse::DOCK:
297 return AUDIO_POLICY_FORCE_FOR_DOCK;
298 case media::AudioPolicyForceUse::SYSTEM:
299 return AUDIO_POLICY_FORCE_FOR_SYSTEM;
300 case media::AudioPolicyForceUse::HDMI_SYSTEM_AUDIO:
301 return AUDIO_POLICY_FORCE_FOR_HDMI_SYSTEM_AUDIO;
302 case media::AudioPolicyForceUse::ENCODED_SURROUND:
303 return AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND;
304 case media::AudioPolicyForceUse::VIBRATE_RINGING:
305 return AUDIO_POLICY_FORCE_FOR_VIBRATE_RINGING;
306 }
307 return unexpected(BAD_VALUE);
308 }
309
310 ConversionResult<media::AudioPolicyForceUse>
legacy2aidl_audio_policy_force_use_t_AudioPolicyForceUse(audio_policy_force_use_t legacy)311 legacy2aidl_audio_policy_force_use_t_AudioPolicyForceUse(audio_policy_force_use_t legacy) {
312 switch (legacy) {
313 case AUDIO_POLICY_FORCE_FOR_COMMUNICATION:
314 return media::AudioPolicyForceUse::COMMUNICATION;
315 case AUDIO_POLICY_FORCE_FOR_MEDIA:
316 return media::AudioPolicyForceUse::MEDIA;
317 case AUDIO_POLICY_FORCE_FOR_RECORD:
318 return media::AudioPolicyForceUse::RECORD;
319 case AUDIO_POLICY_FORCE_FOR_DOCK:
320 return media::AudioPolicyForceUse::DOCK;
321 case AUDIO_POLICY_FORCE_FOR_SYSTEM:
322 return media::AudioPolicyForceUse::SYSTEM;
323 case AUDIO_POLICY_FORCE_FOR_HDMI_SYSTEM_AUDIO:
324 return media::AudioPolicyForceUse::HDMI_SYSTEM_AUDIO;
325 case AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND:
326 return media::AudioPolicyForceUse::ENCODED_SURROUND;
327 case AUDIO_POLICY_FORCE_FOR_VIBRATE_RINGING:
328 return media::AudioPolicyForceUse::VIBRATE_RINGING;
329 case AUDIO_POLICY_FORCE_USE_CNT:
330 break;
331 }
332 return unexpected(BAD_VALUE);
333 }
334
335 ConversionResult<audio_policy_forced_cfg_t>
aidl2legacy_AudioPolicyForcedConfig_audio_policy_forced_cfg_t(media::AudioPolicyForcedConfig aidl)336 aidl2legacy_AudioPolicyForcedConfig_audio_policy_forced_cfg_t(media::AudioPolicyForcedConfig aidl) {
337 switch (aidl) {
338 case media::AudioPolicyForcedConfig::NONE:
339 return AUDIO_POLICY_FORCE_NONE;
340 case media::AudioPolicyForcedConfig::SPEAKER:
341 return AUDIO_POLICY_FORCE_SPEAKER;
342 case media::AudioPolicyForcedConfig::HEADPHONES:
343 return AUDIO_POLICY_FORCE_HEADPHONES;
344 case media::AudioPolicyForcedConfig::BT_SCO:
345 return AUDIO_POLICY_FORCE_BT_SCO;
346 case media::AudioPolicyForcedConfig::BT_A2DP:
347 return AUDIO_POLICY_FORCE_BT_A2DP;
348 case media::AudioPolicyForcedConfig::WIRED_ACCESSORY:
349 return AUDIO_POLICY_FORCE_WIRED_ACCESSORY;
350 case media::AudioPolicyForcedConfig::BT_CAR_DOCK:
351 return AUDIO_POLICY_FORCE_BT_CAR_DOCK;
352 case media::AudioPolicyForcedConfig::BT_DESK_DOCK:
353 return AUDIO_POLICY_FORCE_BT_DESK_DOCK;
354 case media::AudioPolicyForcedConfig::ANALOG_DOCK:
355 return AUDIO_POLICY_FORCE_ANALOG_DOCK;
356 case media::AudioPolicyForcedConfig::DIGITAL_DOCK:
357 return AUDIO_POLICY_FORCE_DIGITAL_DOCK;
358 case media::AudioPolicyForcedConfig::NO_BT_A2DP:
359 return AUDIO_POLICY_FORCE_NO_BT_A2DP;
360 case media::AudioPolicyForcedConfig::SYSTEM_ENFORCED:
361 return AUDIO_POLICY_FORCE_SYSTEM_ENFORCED;
362 case media::AudioPolicyForcedConfig::HDMI_SYSTEM_AUDIO_ENFORCED:
363 return AUDIO_POLICY_FORCE_HDMI_SYSTEM_AUDIO_ENFORCED;
364 case media::AudioPolicyForcedConfig::ENCODED_SURROUND_NEVER:
365 return AUDIO_POLICY_FORCE_ENCODED_SURROUND_NEVER;
366 case media::AudioPolicyForcedConfig::ENCODED_SURROUND_ALWAYS:
367 return AUDIO_POLICY_FORCE_ENCODED_SURROUND_ALWAYS;
368 case media::AudioPolicyForcedConfig::ENCODED_SURROUND_MANUAL:
369 return AUDIO_POLICY_FORCE_ENCODED_SURROUND_MANUAL;
370 }
371 return unexpected(BAD_VALUE);
372 }
373
374 ConversionResult<media::AudioPolicyForcedConfig>
legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(audio_policy_forced_cfg_t legacy)375 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(audio_policy_forced_cfg_t legacy) {
376 switch (legacy) {
377 case AUDIO_POLICY_FORCE_NONE:
378 return media::AudioPolicyForcedConfig::NONE;
379 case AUDIO_POLICY_FORCE_SPEAKER:
380 return media::AudioPolicyForcedConfig::SPEAKER;
381 case AUDIO_POLICY_FORCE_HEADPHONES:
382 return media::AudioPolicyForcedConfig::HEADPHONES;
383 case AUDIO_POLICY_FORCE_BT_SCO:
384 return media::AudioPolicyForcedConfig::BT_SCO;
385 case AUDIO_POLICY_FORCE_BT_A2DP:
386 return media::AudioPolicyForcedConfig::BT_A2DP;
387 case AUDIO_POLICY_FORCE_WIRED_ACCESSORY:
388 return media::AudioPolicyForcedConfig::WIRED_ACCESSORY;
389 case AUDIO_POLICY_FORCE_BT_CAR_DOCK:
390 return media::AudioPolicyForcedConfig::BT_CAR_DOCK;
391 case AUDIO_POLICY_FORCE_BT_DESK_DOCK:
392 return media::AudioPolicyForcedConfig::BT_DESK_DOCK;
393 case AUDIO_POLICY_FORCE_ANALOG_DOCK:
394 return media::AudioPolicyForcedConfig::ANALOG_DOCK;
395 case AUDIO_POLICY_FORCE_DIGITAL_DOCK:
396 return media::AudioPolicyForcedConfig::DIGITAL_DOCK;
397 case AUDIO_POLICY_FORCE_NO_BT_A2DP:
398 return media::AudioPolicyForcedConfig::NO_BT_A2DP;
399 case AUDIO_POLICY_FORCE_SYSTEM_ENFORCED:
400 return media::AudioPolicyForcedConfig::SYSTEM_ENFORCED;
401 case AUDIO_POLICY_FORCE_HDMI_SYSTEM_AUDIO_ENFORCED:
402 return media::AudioPolicyForcedConfig::HDMI_SYSTEM_AUDIO_ENFORCED;
403 case AUDIO_POLICY_FORCE_ENCODED_SURROUND_NEVER:
404 return media::AudioPolicyForcedConfig::ENCODED_SURROUND_NEVER;
405 case AUDIO_POLICY_FORCE_ENCODED_SURROUND_ALWAYS:
406 return media::AudioPolicyForcedConfig::ENCODED_SURROUND_ALWAYS;
407 case AUDIO_POLICY_FORCE_ENCODED_SURROUND_MANUAL:
408 return media::AudioPolicyForcedConfig::ENCODED_SURROUND_MANUAL;
409 case AUDIO_POLICY_FORCE_CFG_CNT:
410 break;
411 }
412 return unexpected(BAD_VALUE);
413 }
414
415 ConversionResult<device_role_t>
aidl2legacy_DeviceRole_device_role_t(media::DeviceRole aidl)416 aidl2legacy_DeviceRole_device_role_t(media::DeviceRole aidl) {
417 switch (aidl) {
418 case media::DeviceRole::NONE:
419 return DEVICE_ROLE_NONE;
420 case media::DeviceRole::PREFERRED:
421 return DEVICE_ROLE_PREFERRED;
422 case media::DeviceRole::DISABLED:
423 return DEVICE_ROLE_DISABLED;
424 }
425 return unexpected(BAD_VALUE);
426 }
427
428 ConversionResult<media::DeviceRole>
legacy2aidl_device_role_t_DeviceRole(device_role_t legacy)429 legacy2aidl_device_role_t_DeviceRole(device_role_t legacy) {
430 switch (legacy) {
431 case DEVICE_ROLE_NONE:
432 return media::DeviceRole::NONE;
433 case DEVICE_ROLE_PREFERRED:
434 return media::DeviceRole::PREFERRED;
435 case DEVICE_ROLE_DISABLED:
436 return media::DeviceRole::DISABLED;
437 }
438 return unexpected(BAD_VALUE);
439 }
440
441 ConversionResult<audio_offload_mode_t>
aidl2legacy_AudioOffloadMode_audio_offload_mode_t(media::AudioOffloadMode aidl)442 aidl2legacy_AudioOffloadMode_audio_offload_mode_t(media::AudioOffloadMode aidl) {
443 switch (aidl) {
444 case media::AudioOffloadMode::NOT_SUPPORTED:
445 return AUDIO_OFFLOAD_NOT_SUPPORTED;
446 case media::AudioOffloadMode::SUPPORTED:
447 return AUDIO_OFFLOAD_SUPPORTED;
448 case media::AudioOffloadMode::GAPLESS_SUPPORTED:
449 return AUDIO_OFFLOAD_GAPLESS_SUPPORTED;
450 }
451 return unexpected(BAD_VALUE);
452 }
453
454 ConversionResult<media::AudioOffloadMode>
legacy2aidl_audio_offload_mode_t_AudioOffloadMode(audio_offload_mode_t legacy)455 legacy2aidl_audio_offload_mode_t_AudioOffloadMode(audio_offload_mode_t legacy) {
456 switch (legacy) {
457 case AUDIO_OFFLOAD_NOT_SUPPORTED:
458 return media::AudioOffloadMode::NOT_SUPPORTED;
459 case AUDIO_OFFLOAD_SUPPORTED:
460 return media::AudioOffloadMode::SUPPORTED;
461 case AUDIO_OFFLOAD_GAPLESS_SUPPORTED:
462 return media::AudioOffloadMode::GAPLESS_SUPPORTED;
463 }
464 return unexpected(BAD_VALUE);
465 }
466
467 } // namespace android
468