• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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