1e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin/* 2e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * Copyright (C) 2011 The Android Open Source Project 3e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * 4e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * Licensed under the Apache License, Version 2.0 (the "License"); 5e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * you may not use this file except in compliance with the License. 6e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * You may obtain a copy of the License at 7e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * 8e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * http://www.apache.org/licenses/LICENSE-2.0 9e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * 10e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * Unless required by applicable law or agreed to in writing, software 11e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * distributed under the License is distributed on an "AS IS" BASIS, 12e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * See the License for the specific language governing permissions and 14e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * limitations under the License. 15e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin */ 16e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 17e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#define LOG_TAG "legacy_audio_policy_hal" 18e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin//#define LOG_NDEBUG 0 19e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 20e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#include <stdint.h> 21e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 22e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#include <hardware/hardware.h> 234a0748be283a8c9efa02243c3e1716c49443a87cDima Zavin#include <system/audio.h> 24d17f66f33276e64e8e288f6ff2b1cb8169650c81Dima Zavin#include <system/audio_policy.h> 25e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#include <hardware/audio_policy.h> 26e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 27e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#include <hardware_legacy/AudioPolicyInterface.h> 28e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#include <hardware_legacy/AudioSystemLegacy.h> 29e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 30e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#include "AudioPolicyCompatClient.h" 31e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 32e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinnamespace android_audio_legacy { 33e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 34e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinextern "C" { 35e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 36e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstruct legacy_ap_module { 37e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct audio_policy_module module; 38e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; 39e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 40e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstruct legacy_ap_device { 41e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct audio_policy_device device; 42e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; 43e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 44e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstruct legacy_audio_policy { 45e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct audio_policy policy; 46e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 47e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin void *service; 48e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct audio_policy_service_ops *aps_ops; 49e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin AudioPolicyCompatClient *service_client; 50e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin AudioPolicyInterface *apm; 51e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; 52e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 53e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic inline struct legacy_audio_policy * to_lap(struct audio_policy *pol) 54e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 55e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return reinterpret_cast<struct legacy_audio_policy *>(pol); 56e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 57e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 58e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic inline const struct legacy_audio_policy * to_clap(const struct audio_policy *pol) 59e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 60e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return reinterpret_cast<const struct legacy_audio_policy *>(pol); 61e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 62e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 63e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 64e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_set_device_connection_state(struct audio_policy *pol, 65e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_devices_t device, 66e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_policy_dev_state_t state, 67e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const char *device_address) 68e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 69e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 70e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->setDeviceConnectionState( 71e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin (AudioSystem::audio_devices)device, 72e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin (AudioSystem::device_connection_state)state, 73e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin device_address); 74e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 75e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 76e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic audio_policy_dev_state_t ap_get_device_connection_state( 77e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct audio_policy *pol, 78e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_devices_t device, 79e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const char *device_address) 80e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 81e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 82e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return (audio_policy_dev_state_t)lap->apm->getDeviceConnectionState( 83e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin (AudioSystem::audio_devices)device, 84e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin device_address); 85e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 86e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 87e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_set_phone_state(struct audio_policy *pol, int state) 88e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 89e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 90e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->apm->setPhoneState(state); 91e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 92e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 93e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin /* indicate a change in ringer mode */ 94e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_set_ringer_mode(struct audio_policy *pol, uint32_t mode, 95e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t mask) 96e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 97e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 98e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->apm->setRingerMode(mode, mask); 99e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 100e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 101e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin /* force using a specific device category for the specified usage */ 102e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_set_force_use(struct audio_policy *pol, 103e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_policy_force_use_t usage, 104e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_policy_forced_cfg_t config) 105e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 106e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 107e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->apm->setForceUse((AudioSystem::force_use)usage, 108e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin (AudioSystem::forced_config)config); 109e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 110e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 111e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin /* retreive current device category forced for a given usage */ 112e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic audio_policy_forced_cfg_t ap_get_force_use( 113e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct audio_policy *pol, 114e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_policy_force_use_t usage) 115e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 116e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 117e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return (audio_policy_forced_cfg_t)lap->apm->getForceUse( 118e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin (AudioSystem::force_use)usage); 119e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 120e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 121e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin/* if can_mute is true, then audio streams that are marked ENFORCED_AUDIBLE 122e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * can still be muted. */ 123e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_set_can_mute_enforced_audible(struct audio_policy *pol, 124e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin bool can_mute) 125e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 126e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 127e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->apm->setSystemProperty("ro.camera.sound.forced", can_mute ? "0" : "1"); 128e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 129e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 130e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_init_check(const struct audio_policy *pol) 131e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 132e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 133e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->initCheck(); 134e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 135e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 136e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic audio_io_handle_t ap_get_output(struct audio_policy *pol, 137e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream, 138e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t sampling_rate, 139e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t format, 140e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t channels, 141e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_policy_output_flags_t flags) 142e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 143e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 144e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 145e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin LOGV("%s: tid %d", __func__, gettid()); 146e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getOutput((AudioSystem::stream_type)stream, 147e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin sampling_rate, format, channels, 148e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin (AudioSystem::output_flags)flags); 149e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 150e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 151e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_start_output(struct audio_policy *pol, audio_io_handle_t output, 152e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream, int session) 153e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 154e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 155e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->startOutput(output, (AudioSystem::stream_type)stream, 156e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin session); 157e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 158e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 159e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_stop_output(struct audio_policy *pol, audio_io_handle_t output, 160e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream, int session) 161e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 162e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 163e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->stopOutput(output, (AudioSystem::stream_type)stream, 164e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin session); 165e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 166e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 167e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_release_output(struct audio_policy *pol, 168e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_io_handle_t output) 169e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 170e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 171e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->apm->releaseOutput(output); 172e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 173e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 174e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic audio_io_handle_t ap_get_input(struct audio_policy *pol, int inputSource, 175e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t sampling_rate, 176e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t format, 177e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t channels, 178e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_in_acoustics_t acoustics) 179e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 180e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 181e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getInput(inputSource, sampling_rate, format, channels, 182e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin (AudioSystem::audio_in_acoustics)acoustics); 183e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 184e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 185e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_start_input(struct audio_policy *pol, audio_io_handle_t input) 186e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 187e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 188e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->startInput(input); 189e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 190e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 191e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_stop_input(struct audio_policy *pol, audio_io_handle_t input) 192e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 193e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 194e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->stopInput(input); 195e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 196e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 197e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_release_input(struct audio_policy *pol, audio_io_handle_t input) 198e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 199e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 200e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->apm->releaseInput(input); 201e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 202e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 203e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_init_stream_volume(struct audio_policy *pol, 204e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream, int index_min, 205e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int index_max) 206e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 207e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 208e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->apm->initStreamVolume((AudioSystem::stream_type)stream, index_min, 209e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin index_max); 210e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 211e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 212e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_set_stream_volume_index(struct audio_policy *pol, 213e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream, 214e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int index) 215e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 216e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 217e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->setStreamVolumeIndex((AudioSystem::stream_type)stream, 218e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin index); 219e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 220e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 221e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_get_stream_volume_index(const struct audio_policy *pol, 222e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream, 223e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int *index) 224e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 225e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 226e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getStreamVolumeIndex((AudioSystem::stream_type)stream, 227e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin index); 228e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 229e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 230e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic uint32_t ap_get_strategy_for_stream(const struct audio_policy *pol, 231e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream) 232e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 233e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 234e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getStrategyForStream((AudioSystem::stream_type)stream); 235e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 236e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 237e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic uint32_t ap_get_devices_for_stream(const struct audio_policy *pol, 238e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream) 239e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 240e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 241e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getDevicesForStream((AudioSystem::stream_type)stream); 242e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 243e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 244e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic audio_io_handle_t ap_get_output_for_effect(struct audio_policy *pol, 245e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct effect_descriptor_s *desc) 246e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 247e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 248e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getOutputForEffect(desc); 249e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 250e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 251e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_register_effect(struct audio_policy *pol, 252e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct effect_descriptor_s *desc, 2531c65a49da0c89f75e528354ef02de5dc93a28232Eric Laurent audio_io_handle_t io, 254e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t strategy, 255e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int session, 256e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int id) 257e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 258e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 2591c65a49da0c89f75e528354ef02de5dc93a28232Eric Laurent return lap->apm->registerEffect(desc, io, strategy, session, id); 260e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 261e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 262e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_unregister_effect(struct audio_policy *pol, int id) 263e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 264e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 265e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->unregisterEffect(id); 266e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 267e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 268582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurentstatic int ap_set_effect_enabled(struct audio_policy *pol, int id, bool enabled) 269582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent{ 270582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent struct legacy_audio_policy *lap = to_lap(pol); 271582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent return lap->apm->setEffectEnabled(id, enabled); 272582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent} 273582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent 274e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic bool ap_is_stream_active(const struct audio_policy *pol, int stream, 275e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t in_past_ms) 276e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 277e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 278e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->isStreamActive(stream, in_past_ms); 279e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 280e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 281e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_dump(const struct audio_policy *pol, int fd) 282e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 283e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 284e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->dump(fd); 285e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 286e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 287e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int create_legacy_ap(const struct audio_policy_device *device, 288e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct audio_policy_service_ops *aps_ops, 289e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin void *service, 290e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct audio_policy **ap) 291e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 292e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap; 293e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int ret; 294e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 295e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!service || !aps_ops) 296e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return -EINVAL; 297e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 298e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap = (struct legacy_audio_policy *)calloc(1, sizeof(*lap)); 299e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!lap) 300e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return -ENOMEM; 301e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 302e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_device_connection_state = ap_set_device_connection_state; 303e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_device_connection_state = ap_get_device_connection_state; 304e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_phone_state = ap_set_phone_state; 305e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_ringer_mode = ap_set_ringer_mode; 306e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_force_use = ap_set_force_use; 307e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_force_use = ap_get_force_use; 308e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_can_mute_enforced_audible = 309e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin ap_set_can_mute_enforced_audible; 310e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.init_check = ap_init_check; 311e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_output = ap_get_output; 312e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.start_output = ap_start_output; 313e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.stop_output = ap_stop_output; 314e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.release_output = ap_release_output; 315e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_input = ap_get_input; 316e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.start_input = ap_start_input; 317e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.stop_input = ap_stop_input; 318e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.release_input = ap_release_input; 319e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.init_stream_volume = ap_init_stream_volume; 320e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_stream_volume_index = ap_set_stream_volume_index; 321e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_stream_volume_index = ap_get_stream_volume_index; 322e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_strategy_for_stream = ap_get_strategy_for_stream; 323e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_devices_for_stream = ap_get_devices_for_stream; 324e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_output_for_effect = ap_get_output_for_effect; 325e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.register_effect = ap_register_effect; 326e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.unregister_effect = ap_unregister_effect; 327582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent lap->policy.set_effect_enabled = ap_set_effect_enabled; 328e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.is_stream_active = ap_is_stream_active; 329e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.dump = ap_dump; 330e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 331e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->service = service; 332e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->aps_ops = aps_ops; 333e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->service_client = 334e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin new AudioPolicyCompatClient(aps_ops, service); 335e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!lap->service_client) { 336e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin ret = -ENOMEM; 337e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin goto err_new_compat_client; 338e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin } 339e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 340e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->apm = createAudioPolicyManager(lap->service_client); 341e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!lap->apm) { 342e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin ret = -ENOMEM; 343e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin goto err_create_apm; 344e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin } 345e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 346e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin *ap = &lap->policy; 347e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 348e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 349e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinerr_create_apm: 350e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin delete lap->service_client; 351e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinerr_new_compat_client: 352e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin free(lap); 353e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin *ap = NULL; 354e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return ret; 355e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 356e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 357e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int destroy_legacy_ap(const struct audio_policy_device *ap_dev, 358e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct audio_policy *ap) 359e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 360e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(ap); 361e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 362e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!lap) 363e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 364e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 365e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (lap->apm) 366e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin destroyAudioPolicyManager(lap->apm); 367e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (lap->service_client) 368e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin delete lap->service_client; 369e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin free(lap); 370e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 371e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 372e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 373e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int legacy_ap_dev_close(hw_device_t* device) 374e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 375e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (device) 376e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin free(device); 377e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 378e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 379e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 380e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int legacy_ap_dev_open(const hw_module_t* module, const char* name, 381e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin hw_device_t** device) 382e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 383e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_ap_device *dev; 384e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 385e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (strcmp(name, AUDIO_POLICY_INTERFACE) != 0) 386e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return -EINVAL; 387e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 388e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev = (struct legacy_ap_device *)calloc(1, sizeof(*dev)); 389e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!dev) 390e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return -ENOMEM; 391e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 392e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.common.tag = HARDWARE_DEVICE_TAG; 393e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.common.version = 0; 394e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.common.module = const_cast<hw_module_t*>(module); 395e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.common.close = legacy_ap_dev_close; 396e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.create_audio_policy = create_legacy_ap; 397e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.destroy_audio_policy = destroy_legacy_ap; 398e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 399e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin *device = &dev->device.common; 400e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 401e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 402e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 403e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 404e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic struct hw_module_methods_t legacy_ap_module_methods = { 405e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin open: legacy_ap_dev_open 406e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; 407e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 408e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstruct legacy_ap_module HAL_MODULE_INFO_SYM = { 409e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin module: { 410e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin common: { 411e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin tag: HARDWARE_MODULE_TAG, 412e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin version_major: 1, 413e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin version_minor: 0, 414e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin id: AUDIO_POLICY_HARDWARE_MODULE_ID, 415e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin name: "LEGACY Audio Policy HAL", 416e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin author: "The Android Open Source Project", 417e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin methods: &legacy_ap_module_methods, 418e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dso : NULL, 419e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin reserved : {0}, 420e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin }, 421e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin }, 422e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; 423e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 424e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; // extern "C" 425e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 426e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; // namespace android_audio_legacy 427