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 875c1ebdc9db8d7e5ff51704f80c55f460638eb095Glenn Kastenstatic void ap_set_phone_state(struct audio_policy *pol, audio_mode_t state) 88e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 89e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 905c1ebdc9db8d7e5ff51704f80c55f460638eb095Glenn Kasten // as this is the legacy API, don't change it to use audio_mode_t instead of int 915c1ebdc9db8d7e5ff51704f80c55f460638eb095Glenn Kasten lap->apm->setPhoneState((int) state); 92e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 93e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 94e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin /* indicate a change in ringer mode */ 95e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_set_ringer_mode(struct audio_policy *pol, uint32_t mode, 96e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t mask) 97e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 98ca0657a1ca087a6d474a75fcfedd6aac3901d587Glenn Kasten // deprecated, never called 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, 13953e2cfab45b411db0bf6c4b5d146cd9d8b1b1425Glenn Kasten audio_format_t format, 140551b6a3b5cbf314b4021da64fada0c9119b2535fGlenn Kasten audio_channel_mask_t channelMask, 141b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald audio_output_flags_t flags, 142b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald const audio_offload_info_t *offloadInfo) 143e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 144e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 145e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 1466a70518b93928d1c91457ff805e375c82d76b0e5Steve Block ALOGV("%s: tid %d", __func__, gettid()); 147e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getOutput((AudioSystem::stream_type)stream, 148551b6a3b5cbf314b4021da64fada0c9119b2535fGlenn Kasten sampling_rate, (int) format, channelMask, 149b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald (AudioSystem::output_flags)flags, 150b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald offloadInfo); 151e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 152e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 153e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_start_output(struct audio_policy *pol, audio_io_handle_t output, 154e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream, int session) 155e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 156e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 157e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->startOutput(output, (AudioSystem::stream_type)stream, 158e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin session); 159e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 160e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 161e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_stop_output(struct audio_policy *pol, audio_io_handle_t output, 162e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream, int session) 163e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 164e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 165e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->stopOutput(output, (AudioSystem::stream_type)stream, 166e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin session); 167e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 168e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 169e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_release_output(struct audio_policy *pol, 170e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_io_handle_t output) 171e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 172e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 173e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->apm->releaseOutput(output); 174e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 175e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 176f3b5a0736ef9545f82f3d4ceea3359776d6f0c92Glenn Kastenstatic audio_io_handle_t ap_get_input(struct audio_policy *pol, audio_source_t inputSource, 177e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t sampling_rate, 17853e2cfab45b411db0bf6c4b5d146cd9d8b1b1425Glenn Kasten audio_format_t format, 179551b6a3b5cbf314b4021da64fada0c9119b2535fGlenn Kasten audio_channel_mask_t channelMask, 180e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_in_acoustics_t acoustics) 181e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 182e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 183551b6a3b5cbf314b4021da64fada0c9119b2535fGlenn Kasten return lap->apm->getInput((int) inputSource, sampling_rate, (int) format, channelMask, 184e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin (AudioSystem::audio_in_acoustics)acoustics); 185e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 186e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 187e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_start_input(struct audio_policy *pol, audio_io_handle_t input) 188e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 189e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 190e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->startInput(input); 191e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 192e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 193e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_stop_input(struct audio_policy *pol, audio_io_handle_t input) 194e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 195e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 196e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->stopInput(input); 197e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 198e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 199e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_release_input(struct audio_policy *pol, audio_io_handle_t input) 200e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 201e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 202e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->apm->releaseInput(input); 203e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 204e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 205e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_init_stream_volume(struct audio_policy *pol, 206e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream, int index_min, 207e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int index_max) 208e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 209e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 210e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->apm->initStreamVolume((AudioSystem::stream_type)stream, index_min, 211e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin index_max); 212e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 213e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 214e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_set_stream_volume_index(struct audio_policy *pol, 215e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream, 216e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int index) 217e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 218e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 219e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->setStreamVolumeIndex((AudioSystem::stream_type)stream, 220c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent index, 221c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent AUDIO_DEVICE_OUT_DEFAULT); 222e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 223e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 224e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_get_stream_volume_index(const struct audio_policy *pol, 225e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream, 226e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int *index) 227e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 228e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 229e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getStreamVolumeIndex((AudioSystem::stream_type)stream, 230c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent index, 231c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent AUDIO_DEVICE_OUT_DEFAULT); 232c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent} 233c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent 234c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurentstatic int ap_set_stream_volume_index_for_device(struct audio_policy *pol, 235c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent audio_stream_type_t stream, 236c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent int index, 237c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent audio_devices_t device) 238c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent{ 239c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent struct legacy_audio_policy *lap = to_lap(pol); 240c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent return lap->apm->setStreamVolumeIndex((AudioSystem::stream_type)stream, 241c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent index, 242c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent device); 243c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent} 244c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent 245c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurentstatic int ap_get_stream_volume_index_for_device(const struct audio_policy *pol, 246c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent audio_stream_type_t stream, 247c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent int *index, 248c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent audio_devices_t device) 249c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent{ 250c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent const struct legacy_audio_policy *lap = to_clap(pol); 251c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent return lap->apm->getStreamVolumeIndex((AudioSystem::stream_type)stream, 252c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent index, 253c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent device); 254e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 255e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 256e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic uint32_t ap_get_strategy_for_stream(const struct audio_policy *pol, 257e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream) 258e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 259e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 260e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getStrategyForStream((AudioSystem::stream_type)stream); 261e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 262e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 263f9a4e2eccfbbe451512337af0806cfc54be0eaf9Eric Laurentstatic audio_devices_t ap_get_devices_for_stream(const struct audio_policy *pol, 264e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream) 265e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 266e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 267e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getDevicesForStream((AudioSystem::stream_type)stream); 268e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 269e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 270e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic audio_io_handle_t ap_get_output_for_effect(struct audio_policy *pol, 271c94dccc97cc3ed5171b45f46a0f7f8762d37156fGlenn Kasten const struct effect_descriptor_s *desc) 272e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 273e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 274e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getOutputForEffect(desc); 275e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 276e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 277e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_register_effect(struct audio_policy *pol, 278c94dccc97cc3ed5171b45f46a0f7f8762d37156fGlenn Kasten const struct effect_descriptor_s *desc, 2791c65a49da0c89f75e528354ef02de5dc93a28232Eric Laurent audio_io_handle_t io, 280e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t strategy, 281e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int session, 282e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int id) 283e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 284e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 2851c65a49da0c89f75e528354ef02de5dc93a28232Eric Laurent return lap->apm->registerEffect(desc, io, strategy, session, id); 286e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 287e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 288e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_unregister_effect(struct audio_policy *pol, int id) 289e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 290e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 291e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->unregisterEffect(id); 292e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 293e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 294582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurentstatic int ap_set_effect_enabled(struct audio_policy *pol, int id, bool enabled) 295582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent{ 296582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent struct legacy_audio_policy *lap = to_lap(pol); 297582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent return lap->apm->setEffectEnabled(id, enabled); 298582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent} 299582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent 300d97809bca3b086fe85475f462b6fdba6775f5ae1Glenn Kastenstatic bool ap_is_stream_active(const struct audio_policy *pol, audio_stream_type_t stream, 301e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t in_past_ms) 302e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 303e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 304d97809bca3b086fe85475f462b6fdba6775f5ae1Glenn Kasten return lap->apm->isStreamActive((int) stream, in_past_ms); 305e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 306e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 307dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivistatic bool ap_is_stream_active_remotely(const struct audio_policy *pol, audio_stream_type_t stream, 308dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi uint32_t in_past_ms) 309dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi{ 310dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi const struct legacy_audio_policy *lap = to_clap(pol); 311dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi return lap->apm->isStreamActiveRemotely((int) stream, in_past_ms); 312dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi} 313dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi 314abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivistatic bool ap_is_source_active(const struct audio_policy *pol, audio_source_t source) 315abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi{ 316abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi const struct legacy_audio_policy *lap = to_clap(pol); 317abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi return lap->apm->isSourceActive(source); 318abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi} 319abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi 320e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_dump(const struct audio_policy *pol, int fd) 321e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 322e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 323e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->dump(fd); 324e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 325e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 326b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgeraldstatic bool ap_is_offload_supported(const struct audio_policy *pol, 327b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald const audio_offload_info_t *info) 328b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald{ 329b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald const struct legacy_audio_policy *lap = to_clap(pol); 330b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald return lap->apm->isOffloadSupported(*info); 331b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald} 332b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald 333e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int create_legacy_ap(const struct audio_policy_device *device, 334e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct audio_policy_service_ops *aps_ops, 335e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin void *service, 336e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct audio_policy **ap) 337e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 338e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap; 339e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int ret; 340e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 341e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!service || !aps_ops) 342e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return -EINVAL; 343e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 344e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap = (struct legacy_audio_policy *)calloc(1, sizeof(*lap)); 345e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!lap) 346e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return -ENOMEM; 347e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 348e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_device_connection_state = ap_set_device_connection_state; 349e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_device_connection_state = ap_get_device_connection_state; 350e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_phone_state = ap_set_phone_state; 351e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_ringer_mode = ap_set_ringer_mode; 352e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_force_use = ap_set_force_use; 353e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_force_use = ap_get_force_use; 354e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_can_mute_enforced_audible = 355e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin ap_set_can_mute_enforced_audible; 356e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.init_check = ap_init_check; 357e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_output = ap_get_output; 358e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.start_output = ap_start_output; 359e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.stop_output = ap_stop_output; 360e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.release_output = ap_release_output; 361e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_input = ap_get_input; 362e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.start_input = ap_start_input; 363e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.stop_input = ap_stop_input; 364e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.release_input = ap_release_input; 365e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.init_stream_volume = ap_init_stream_volume; 366e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_stream_volume_index = ap_set_stream_volume_index; 367e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_stream_volume_index = ap_get_stream_volume_index; 368c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent lap->policy.set_stream_volume_index_for_device = ap_set_stream_volume_index_for_device; 369c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent lap->policy.get_stream_volume_index_for_device = ap_get_stream_volume_index_for_device; 370e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_strategy_for_stream = ap_get_strategy_for_stream; 371e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_devices_for_stream = ap_get_devices_for_stream; 372e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_output_for_effect = ap_get_output_for_effect; 373e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.register_effect = ap_register_effect; 374e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.unregister_effect = ap_unregister_effect; 375582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent lap->policy.set_effect_enabled = ap_set_effect_enabled; 376e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.is_stream_active = ap_is_stream_active; 377dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi lap->policy.is_stream_active_remotely = ap_is_stream_active_remotely; 378abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi lap->policy.is_source_active = ap_is_source_active; 379e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.dump = ap_dump; 380b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald lap->policy.is_offload_supported = ap_is_offload_supported; 381e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 382e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->service = service; 383e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->aps_ops = aps_ops; 384e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->service_client = 385e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin new AudioPolicyCompatClient(aps_ops, service); 386e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!lap->service_client) { 387e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin ret = -ENOMEM; 388e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin goto err_new_compat_client; 389e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin } 390e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 391e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->apm = createAudioPolicyManager(lap->service_client); 392e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!lap->apm) { 393e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin ret = -ENOMEM; 394e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin goto err_create_apm; 395e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin } 396e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 397e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin *ap = &lap->policy; 398e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 399e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 400e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinerr_create_apm: 401e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin delete lap->service_client; 402e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinerr_new_compat_client: 403e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin free(lap); 404e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin *ap = NULL; 405e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return ret; 406e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 407e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 408e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int destroy_legacy_ap(const struct audio_policy_device *ap_dev, 409e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct audio_policy *ap) 410e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 411e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(ap); 412e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 413e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!lap) 414e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 415e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 416e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (lap->apm) 417e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin destroyAudioPolicyManager(lap->apm); 418e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (lap->service_client) 419e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin delete lap->service_client; 420e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin free(lap); 421e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 422e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 423e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 424e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int legacy_ap_dev_close(hw_device_t* device) 425e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 426e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (device) 427e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin free(device); 428e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 429e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 430e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 431e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int legacy_ap_dev_open(const hw_module_t* module, const char* name, 432e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin hw_device_t** device) 433e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 434e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_ap_device *dev; 435e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 436e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (strcmp(name, AUDIO_POLICY_INTERFACE) != 0) 437e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return -EINVAL; 438e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 439e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev = (struct legacy_ap_device *)calloc(1, sizeof(*dev)); 440e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!dev) 441e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return -ENOMEM; 442e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 443e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.common.tag = HARDWARE_DEVICE_TAG; 444e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.common.version = 0; 445e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.common.module = const_cast<hw_module_t*>(module); 446e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.common.close = legacy_ap_dev_close; 447e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.create_audio_policy = create_legacy_ap; 448e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.destroy_audio_policy = destroy_legacy_ap; 449e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 450e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin *device = &dev->device.common; 451e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 452e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 453e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 454e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 455e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic struct hw_module_methods_t legacy_ap_module_methods = { 456e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin open: legacy_ap_dev_open 457e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; 458e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 459e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstruct legacy_ap_module HAL_MODULE_INFO_SYM = { 460e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin module: { 461e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin common: { 462e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin tag: HARDWARE_MODULE_TAG, 463e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin version_major: 1, 464e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin version_minor: 0, 465e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin id: AUDIO_POLICY_HARDWARE_MODULE_ID, 466e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin name: "LEGACY Audio Policy HAL", 467e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin author: "The Android Open Source Project", 468e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin methods: &legacy_ap_module_methods, 469e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dso : NULL, 470e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin reserved : {0}, 471e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin }, 472e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin }, 473e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; 474e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 475e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; // extern "C" 476e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 477e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; // namespace android_audio_legacy 478