audio_policy_hal.cpp revision dc3bf1a37425697277f6ed04fc8cfe4a52fd678a
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, 1410977cf534ffb71c2abac622716510ae8ea25f3e9Eric Laurent audio_output_flags_t flags) 142e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 143e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 144e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 1456a70518b93928d1c91457ff805e375c82d76b0e5Steve Block ALOGV("%s: tid %d", __func__, gettid()); 146e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getOutput((AudioSystem::stream_type)stream, 147551b6a3b5cbf314b4021da64fada0c9119b2535fGlenn Kasten sampling_rate, (int) format, channelMask, 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 174f3b5a0736ef9545f82f3d4ceea3359776d6f0c92Glenn Kastenstatic audio_io_handle_t ap_get_input(struct audio_policy *pol, audio_source_t inputSource, 175e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t sampling_rate, 17653e2cfab45b411db0bf6c4b5d146cd9d8b1b1425Glenn Kasten audio_format_t format, 177551b6a3b5cbf314b4021da64fada0c9119b2535fGlenn Kasten audio_channel_mask_t channelMask, 178e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_in_acoustics_t acoustics) 179e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 180e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 181551b6a3b5cbf314b4021da64fada0c9119b2535fGlenn Kasten return lap->apm->getInput((int) inputSource, sampling_rate, (int) format, channelMask, 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, 218c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent index, 219c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent AUDIO_DEVICE_OUT_DEFAULT); 220e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 221e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 222e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_get_stream_volume_index(const struct audio_policy *pol, 223e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream, 224e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int *index) 225e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 226e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 227e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getStreamVolumeIndex((AudioSystem::stream_type)stream, 228c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent index, 229c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent AUDIO_DEVICE_OUT_DEFAULT); 230c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent} 231c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent 232c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurentstatic int ap_set_stream_volume_index_for_device(struct audio_policy *pol, 233c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent audio_stream_type_t stream, 234c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent int index, 235c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent audio_devices_t device) 236c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent{ 237c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent struct legacy_audio_policy *lap = to_lap(pol); 238c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent return lap->apm->setStreamVolumeIndex((AudioSystem::stream_type)stream, 239c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent index, 240c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent device); 241c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent} 242c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent 243c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurentstatic int ap_get_stream_volume_index_for_device(const struct audio_policy *pol, 244c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent audio_stream_type_t stream, 245c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent int *index, 246c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent audio_devices_t device) 247c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent{ 248c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent const struct legacy_audio_policy *lap = to_clap(pol); 249c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent return lap->apm->getStreamVolumeIndex((AudioSystem::stream_type)stream, 250c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent index, 251c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent device); 252e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 253e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 254e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic uint32_t ap_get_strategy_for_stream(const struct audio_policy *pol, 255e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream) 256e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 257e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 258e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getStrategyForStream((AudioSystem::stream_type)stream); 259e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 260e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 261f9a4e2eccfbbe451512337af0806cfc54be0eaf9Eric Laurentstatic audio_devices_t ap_get_devices_for_stream(const struct audio_policy *pol, 262e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin audio_stream_type_t stream) 263e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 264e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 265e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getDevicesForStream((AudioSystem::stream_type)stream); 266e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 267e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 268e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic audio_io_handle_t ap_get_output_for_effect(struct audio_policy *pol, 269c94dccc97cc3ed5171b45f46a0f7f8762d37156fGlenn Kasten const struct effect_descriptor_s *desc) 270e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 271e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 272e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->getOutputForEffect(desc); 273e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 274e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 275e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_register_effect(struct audio_policy *pol, 276c94dccc97cc3ed5171b45f46a0f7f8762d37156fGlenn Kasten const struct effect_descriptor_s *desc, 2771c65a49da0c89f75e528354ef02de5dc93a28232Eric Laurent audio_io_handle_t io, 278e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t strategy, 279e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int session, 280e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int id) 281e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 282e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 2831c65a49da0c89f75e528354ef02de5dc93a28232Eric Laurent return lap->apm->registerEffect(desc, io, strategy, session, id); 284e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 285e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 286e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_unregister_effect(struct audio_policy *pol, int id) 287e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 288e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(pol); 289e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->unregisterEffect(id); 290e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 291e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 292582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurentstatic int ap_set_effect_enabled(struct audio_policy *pol, int id, bool enabled) 293582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent{ 294582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent struct legacy_audio_policy *lap = to_lap(pol); 295582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent return lap->apm->setEffectEnabled(id, enabled); 296582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent} 297582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent 298d97809bca3b086fe85475f462b6fdba6775f5ae1Glenn Kastenstatic bool ap_is_stream_active(const struct audio_policy *pol, audio_stream_type_t stream, 299e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin uint32_t in_past_ms) 300e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 301e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 302d97809bca3b086fe85475f462b6fdba6775f5ae1Glenn Kasten return lap->apm->isStreamActive((int) stream, in_past_ms); 303e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 304e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 305dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivistatic bool ap_is_stream_active_remotely(const struct audio_policy *pol, audio_stream_type_t stream, 306dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi uint32_t in_past_ms) 307dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi{ 308dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi const struct legacy_audio_policy *lap = to_clap(pol); 309dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi return lap->apm->isStreamActiveRemotely((int) stream, in_past_ms); 310dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi} 311dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi 312abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivistatic bool ap_is_source_active(const struct audio_policy *pol, audio_source_t source) 313abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi{ 314abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi const struct legacy_audio_policy *lap = to_clap(pol); 315abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi return lap->apm->isSourceActive(source); 316abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi} 317abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi 318e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_dump(const struct audio_policy *pol, int fd) 319e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 320e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin const struct legacy_audio_policy *lap = to_clap(pol); 321e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return lap->apm->dump(fd); 322e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 323e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 324e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int create_legacy_ap(const struct audio_policy_device *device, 325e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct audio_policy_service_ops *aps_ops, 326e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin void *service, 327e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct audio_policy **ap) 328e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 329e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap; 330e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin int ret; 331e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 332e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!service || !aps_ops) 333e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return -EINVAL; 334e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 335e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap = (struct legacy_audio_policy *)calloc(1, sizeof(*lap)); 336e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!lap) 337e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return -ENOMEM; 338e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 339e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_device_connection_state = ap_set_device_connection_state; 340e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_device_connection_state = ap_get_device_connection_state; 341e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_phone_state = ap_set_phone_state; 342e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_ringer_mode = ap_set_ringer_mode; 343e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_force_use = ap_set_force_use; 344e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_force_use = ap_get_force_use; 345e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_can_mute_enforced_audible = 346e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin ap_set_can_mute_enforced_audible; 347e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.init_check = ap_init_check; 348e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_output = ap_get_output; 349e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.start_output = ap_start_output; 350e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.stop_output = ap_stop_output; 351e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.release_output = ap_release_output; 352e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_input = ap_get_input; 353e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.start_input = ap_start_input; 354e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.stop_input = ap_stop_input; 355e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.release_input = ap_release_input; 356e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.init_stream_volume = ap_init_stream_volume; 357e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.set_stream_volume_index = ap_set_stream_volume_index; 358e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_stream_volume_index = ap_get_stream_volume_index; 359c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent lap->policy.set_stream_volume_index_for_device = ap_set_stream_volume_index_for_device; 360c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent lap->policy.get_stream_volume_index_for_device = ap_get_stream_volume_index_for_device; 361e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_strategy_for_stream = ap_get_strategy_for_stream; 362e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_devices_for_stream = ap_get_devices_for_stream; 363e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.get_output_for_effect = ap_get_output_for_effect; 364e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.register_effect = ap_register_effect; 365e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.unregister_effect = ap_unregister_effect; 366582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent lap->policy.set_effect_enabled = ap_set_effect_enabled; 367e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.is_stream_active = ap_is_stream_active; 368dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi lap->policy.is_stream_active_remotely = ap_is_stream_active_remotely; 369abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi lap->policy.is_source_active = ap_is_source_active; 370e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->policy.dump = ap_dump; 371e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 372e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->service = service; 373e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->aps_ops = aps_ops; 374e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->service_client = 375e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin new AudioPolicyCompatClient(aps_ops, service); 376e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!lap->service_client) { 377e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin ret = -ENOMEM; 378e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin goto err_new_compat_client; 379e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin } 380e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 381e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin lap->apm = createAudioPolicyManager(lap->service_client); 382e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!lap->apm) { 383e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin ret = -ENOMEM; 384e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin goto err_create_apm; 385e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin } 386e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 387e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin *ap = &lap->policy; 388e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 389e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 390e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinerr_create_apm: 391e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin delete lap->service_client; 392e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinerr_new_compat_client: 393e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin free(lap); 394e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin *ap = NULL; 395e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return ret; 396e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 397e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 398e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int destroy_legacy_ap(const struct audio_policy_device *ap_dev, 399e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct audio_policy *ap) 400e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 401e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_audio_policy *lap = to_lap(ap); 402e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 403e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!lap) 404e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 405e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 406e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (lap->apm) 407e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin destroyAudioPolicyManager(lap->apm); 408e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (lap->service_client) 409e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin delete lap->service_client; 410e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin free(lap); 411e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 412e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 413e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 414e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int legacy_ap_dev_close(hw_device_t* device) 415e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 416e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (device) 417e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin free(device); 418e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 419e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 420e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 421e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int legacy_ap_dev_open(const hw_module_t* module, const char* name, 422e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin hw_device_t** device) 423e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{ 424e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin struct legacy_ap_device *dev; 425e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 426e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (strcmp(name, AUDIO_POLICY_INTERFACE) != 0) 427e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return -EINVAL; 428e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 429e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev = (struct legacy_ap_device *)calloc(1, sizeof(*dev)); 430e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin if (!dev) 431e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return -ENOMEM; 432e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 433e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.common.tag = HARDWARE_DEVICE_TAG; 434e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.common.version = 0; 435e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.common.module = const_cast<hw_module_t*>(module); 436e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.common.close = legacy_ap_dev_close; 437e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.create_audio_policy = create_legacy_ap; 438e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dev->device.destroy_audio_policy = destroy_legacy_ap; 439e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 440e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin *device = &dev->device.common; 441e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 442e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin return 0; 443e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin} 444e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 445e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic struct hw_module_methods_t legacy_ap_module_methods = { 446e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin open: legacy_ap_dev_open 447e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; 448e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 449e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstruct legacy_ap_module HAL_MODULE_INFO_SYM = { 450e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin module: { 451e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin common: { 452e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin tag: HARDWARE_MODULE_TAG, 453e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin version_major: 1, 454e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin version_minor: 0, 455e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin id: AUDIO_POLICY_HARDWARE_MODULE_ID, 456e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin name: "LEGACY Audio Policy HAL", 457e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin author: "The Android Open Source Project", 458e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin methods: &legacy_ap_module_methods, 459e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin dso : NULL, 460e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin reserved : {0}, 461e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin }, 462e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin }, 463e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; 464e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 465e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; // extern "C" 466e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin 467e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; // namespace android_audio_legacy 468