AudioPolicyManager.h revision 223fd5c9738e9665e495904d37d4632414b68c1e
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project 3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License. 6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at 7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software 11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and 14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License. 15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */ 16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include <stdint.h> 19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include <sys/types.h> 205ae678f2e68e25bd74cdc408df354c3b6fe481bfMathias Agopian#include <cutils/config_utils.h> 216b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams#include <cutils/misc.h> 22afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams#include <utils/Timers.h> 239b97c2906aed2b6dea9e0824f91f27c08d3690a7Mathias Agopian#include <utils/Errors.h> 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include <utils/KeyedVector.h> 25158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams#include <utils/SortedVector.h> 26158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams#include "AudioPolicyInterface.h" 277bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 28158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams 2976371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onoratonamespace android { 3076371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato 311aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams// ---------------------------------------------------------------------------- 321aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams 334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams// Attenuation applied to STRATEGY_SONIFICATION streams when a headset is connected: 6dB 344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams#define SONIFICATION_HEADSET_VOLUME_FACTOR 0.5 351aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams// Min volume for STRATEGY_SONIFICATION streams when limited by music volume: -36dB 36158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams#define SONIFICATION_HEADSET_VOLUME_MIN 0.016 378d957fa762eff6c03a93ddea9405d9575665f1ecJason Sams// Time in milliseconds during which we consider that music is still active after a music 388d957fa762eff6c03a93ddea9405d9575665f1ecJason Sams// track was stopped - see computeVolume() 39158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams#define SONIFICATION_HEADSET_MUSIC_DELAY 5000 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// Time in milliseconds after media stopped playing during which we consider that the 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// sonification should be as unobtrusive as during the time media was playing. 42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#define SONIFICATION_RESPECTFUL_AFTER_MUSIC_DELAY 5000 43e57691037aea219562ac686429b4b98202aab7bcJason Sams// Time in milliseconds during witch some streams are muted while the audio path 44fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams// is switched 4533b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams#define MUTE_TIME_MS 2000 46fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#define NUM_TEST_OUTPUTS 5 4833b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams 4933b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams#define NUM_VOL_CURVE_KNEES 2 5033b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams 5133b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams// Default minimum length allowed for offloading a compressed track 5233b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams// Can be overridden by the audio.offload.min.duration.secs property 5333b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams#define OFFLOAD_DEFAULT_MIN_DURATION_SECS 60 5433b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams 5533b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams#define MAX_MIXER_SAMPLING_RATE 48000 5633b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams#define MAX_MIXER_CHANNEL_COUNT 8 5733b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams 5833b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams// ---------------------------------------------------------------------------- 5933b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams// AudioPolicyManager implements audio policy manager behavior common to all platforms. 606b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams// ---------------------------------------------------------------------------- 616b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 626b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Samsclass AudioPolicyManager: public AudioPolicyInterface 636b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams#ifdef AUDIO_POLICY_TEST 646b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams , public Thread 656b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams#endif //AUDIO_POLICY_TEST 666b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams{ 676b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 686b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Samspublic: 696b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams AudioPolicyManager(AudioPolicyClientInterface *clientInterface); 706b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual ~AudioPolicyManager(); 716b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 726b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams // AudioPolicyInterface 736b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual status_t setDeviceConnectionState(audio_devices_t device, 746b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_policy_dev_state_t state, 756b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams const char *device_address); 766b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual audio_policy_dev_state_t getDeviceConnectionState(audio_devices_t device, 776b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams const char *device_address); 786b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual void setPhoneState(audio_mode_t state); 796b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual void setForceUse(audio_policy_force_use_t usage, 806b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_policy_forced_cfg_t config); 816b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage); 826b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual void setSystemProperty(const char* property, const char* value); 836b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual status_t initCheck(); 846b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual audio_io_handle_t getOutput(audio_stream_type_t stream, 856b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams uint32_t samplingRate, 866b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_format_t format, 876b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_channel_mask_t channelMask, 886b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_output_flags_t flags, 896b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams const audio_offload_info_t *offloadInfo); 906b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual audio_io_handle_t getOutputForAttr(const audio_attributes_t *attr, 916b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams uint32_t samplingRate, 926b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_format_t format, 936b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_channel_mask_t channelMask, 946b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_output_flags_t flags, 956b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams const audio_offload_info_t *offloadInfo); 966b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual status_t startOutput(audio_io_handle_t output, 976b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_stream_type_t stream, 986b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams int session = 0); 996b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual status_t stopOutput(audio_io_handle_t output, 1006b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_stream_type_t stream, 1016b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams int session = 0); 1026b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual void releaseOutput(audio_io_handle_t output); 1036b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual audio_io_handle_t getInput(audio_source_t inputSource, 1046b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams uint32_t samplingRate, 1056b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_format_t format, 1066b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_channel_mask_t channelMask, 1076b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_session_t session, 1086b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_input_flags_t flags); 1096b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 1106b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams // indicates to the audio policy manager that the input starts being used. 111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams virtual status_t startInput(audio_io_handle_t input, 1126b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_session_t session); 1136b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 1146b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams // indicates to the audio policy manager that the input stops being used. 115afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams virtual status_t stopInput(audio_io_handle_t input, 116afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams audio_session_t session); 117afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams virtual void releaseInput(audio_io_handle_t input, 118c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams audio_session_t session); 119afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams virtual void closeAllInputs(); 120afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams virtual void initStreamVolume(audio_stream_type_t stream, 121afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams int indexMin, 122afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams int indexMax); 123afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 124afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams int index, 125afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams audio_devices_t device); 1266b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 1276b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams int *index, 1286b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_devices_t device); 129c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 1306b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams // return the strategy corresponding to a given stream type 131afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams virtual uint32_t getStrategyForStream(audio_stream_type_t stream); 1326b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams // return the strategy corresponding to the given audio attributes 133afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams virtual uint32_t getStrategyForAttr(const audio_attributes_t *attr); 134afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams 1359397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams // return the enabled output devices for the given stream type 1365fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream); 1375fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams 1385fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc = NULL); 1395fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams virtual status_t registerEffect(const effect_descriptor_t *desc, 1405fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams audio_io_handle_t io, 1415fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams uint32_t strategy, 142afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams int session, 143afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams int id); 144afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams virtual status_t unregisterEffect(int id); 1454c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams virtual status_t setEffectEnabled(int id, bool enabled); 146afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams 14733b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const; 14833b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams // return whether a stream is playing remotely, override to change the definition of 149afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams // local/remote playback, used for instance by notification manager to not make 15033b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams // media players lose audio focus when not playing locally 151afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs = 0) const; 1526b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual bool isSourceActive(audio_source_t source) const; 1536b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 1546b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual status_t dump(int fd); 1556b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 1566b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual bool isOffloadSupported(const audio_offload_info_t& offloadInfo); 1576b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 1586b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual status_t listAudioPorts(audio_port_role_t role, 159afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams audio_port_type_t type, 1604c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams unsigned int *num_ports, 161afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams struct audio_port *ports, 1626b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams unsigned int *generation); 1636b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual status_t getAudioPort(struct audio_port *port); 164c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams virtual status_t createAudioPatch(const struct audio_patch *patch, 1656b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_patch_handle_t *handle, 1666b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams uid_t uid); 1676b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual status_t releaseAudioPatch(audio_patch_handle_t handle, 1686b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams uid_t uid); 1696b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual status_t listAudioPatches(unsigned int *num_patches, 17033b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams struct audio_patch *patches, 17133b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams unsigned int *generation); 1724c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams virtual status_t setAudioPortConfig(const struct audio_port_config *config); 17333b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams virtual void clearAudioPatches(uid_t uid); 17433b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams 1756b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual status_t acquireSoundTriggerSession(audio_session_t *session, 1766b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_io_handle_t *ioHandle, 1776b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_devices_t *device); 1786b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 1796b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual status_t releaseSoundTriggerSession(audio_session_t session); 1806b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 1816b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Samsprotected: 1826b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 1836b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams enum routing_strategy { 1846b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams STRATEGY_MEDIA, 1856b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams STRATEGY_PHONE, 1866b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams STRATEGY_SONIFICATION, 1876b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams STRATEGY_SONIFICATION_RESPECTFUL, 1886b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams STRATEGY_DTMF, 1896b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams STRATEGY_ENFORCED_AUDIBLE, 1906b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams STRATEGY_TRANSMITTED_THROUGH_SPEAKER, 1916b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams STRATEGY_ACCESSIBILITY, 1926b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams STRATEGY_REROUTING, 1936b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams NUM_STRATEGIES 1946b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams }; 1956b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 1966b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams // 4 points to define the volume attenuation curve, each characterized by the volume 1976b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams // index (from 0 to 100) at which they apply, and the attenuation in dB at that index. 1986b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams // we use 100 steps to avoid rounding errors when computing the volume in volIndexToAmpl() 1996b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 2006b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams enum { VOLMIN = 0, VOLKNEE1 = 1, VOLKNEE2 = 2, VOLMAX = 3, VOLCNT = 4}; 2016b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 2026b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams class VolumeCurvePoint 2036b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams { 2046b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams public: 2056b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams int mIndex; 2066b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams float mDBAttenuation; 2076b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams }; 2086b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 2096b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams // device categories used for volume curve management. 2106b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams enum device_category { 2116b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams DEVICE_CATEGORY_HEADSET, 2126b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams DEVICE_CATEGORY_SPEAKER, 2136b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams DEVICE_CATEGORY_EARPIECE, 2146b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams DEVICE_CATEGORY_EXT_MEDIA, 2156b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams DEVICE_CATEGORY_CNT 2166b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams }; 2176b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 2186b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams class HwModule; 2196b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 2206b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams class AudioGain: public RefBase 2216b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams { 2226b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams public: 2236b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams AudioGain(int index, bool useInChannelMask); 2246b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams virtual ~AudioGain() {} 2256b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 2266b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams void dump(int fd, int spaces, int index) const; 2276b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 2286b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams void getDefaultConfig(struct audio_gain_config *config); 2296b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams status_t checkConfig(const struct audio_gain_config *config); 2306b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams int mIndex; 2316b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams struct audio_gain mGain; 2326b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams bool mUseInChannelMask; 233326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams }; 234326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 23533b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams class AudioPort: public virtual RefBase 23633b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams { 2374c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams public: 2386b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams AudioPort(const String8& name, audio_port_type_t type, 2396b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_port_role_t role, const sp<HwModule>& module); 24033b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams virtual ~AudioPort() {} 24133b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams 24233b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams virtual void toAudioPort(struct audio_port *port) const; 24333b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams 24433b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams void importAudioPort(const sp<AudioPort> port); 24533b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams void clearCapabilities(); 24633b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams 24733b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams void loadSamplingRates(char *name); 24833b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams void loadFormats(char *name); 24933b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams void loadOutChannels(char *name); 250c61346b91434307c5003029017b54ce9c49112beJason Sams void loadInChannels(char *name); 2511030893d9b99b72468034da13df025bda479bb97Jason Sams 2521030893d9b99b72468034da13df025bda479bb97Jason Sams audio_gain_mode_t loadGainMode(char *name); 2531030893d9b99b72468034da13df025bda479bb97Jason Sams void loadGain(cnode *root, int index); 254ccc010bb7c0f89e162bf60033968a20be90a903aJason Sams void loadGains(cnode *root); 255b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams 256d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk // searches for an exact match 2571030893d9b99b72468034da13df025bda479bb97Jason Sams status_t checkExactSamplingRate(uint32_t samplingRate) const; 258c61346b91434307c5003029017b54ce9c49112beJason Sams // searches for a compatible match, and returns the best match via updatedSamplingRate 2591030893d9b99b72468034da13df025bda479bb97Jason Sams status_t checkCompatibleSamplingRate(uint32_t samplingRate, 260a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams uint32_t *updatedSamplingRate) const; 261a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams // searches for an exact match 262a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams status_t checkExactChannelMask(audio_channel_mask_t channelMask) const; 263b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams // searches for a compatible match, currently implemented for input channel masks only 264d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk status_t checkCompatibleChannelMask(audio_channel_mask_t channelMask) const; 265c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams status_t checkFormat(audio_format_t format) const; 2661030893d9b99b72468034da13df025bda479bb97Jason Sams status_t checkGain(const struct audio_gain_config *gainConfig, int index) const; 2671030893d9b99b72468034da13df025bda479bb97Jason Sams 268d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams uint32_t pickSamplingRate() const; 269d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams audio_channel_mask_t pickChannelMask() const; 270d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams audio_format_t pickFormat() const; 271d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 2724c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams static const audio_format_t sPcmFormatCompareTable[]; 273d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams static int compareFormats(audio_format_t format1, audio_format_t format2); 274d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 2751030893d9b99b72468034da13df025bda479bb97Jason Sams void dump(int fd, int spaces) const; 2762dca84dd6c07992f78ad050177975f16486dd77eJason Sams 277326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams String8 mName; 278771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams audio_port_type_t mType; 279306fb23e57c4a389eaf3159b9701a64cb56e284eJason Sams audio_port_role_t mRole; 2802dca84dd6c07992f78ad050177975f16486dd77eJason Sams bool mUseInChannelMask; 2818c401effb0837155fc39ca0364f57a882d127d38Jason Sams // by convention, "0' in the first entry in mSamplingRates, mChannelMasks or mFormats 282c61346b91434307c5003029017b54ce9c49112beJason Sams // indicates the supported parameters should be read from the output stream 2838cfdd24fec22080b72266d33f61befc4a98b77c6Jason Sams // after it is opened for the first time 284d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams Vector <uint32_t> mSamplingRates; // supported sampling rates 28524371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams Vector <audio_channel_mask_t> mChannelMasks; // supported channel masks 28624371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams Vector <audio_format_t> mFormats; // supported audio formats 287cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams Vector < sp<AudioGain> > mGains; // gain controllers 28824371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams sp<HwModule> mModule; // audio HW module exposing this I/O stream 28924371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams uint32_t mFlags; // attribute flags (e.g primary output, 29024371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams // direct output...). 29124371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams }; 29224371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams 29324371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams class AudioPortConfig: public virtual RefBase 294cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams { 29524371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams public: 29624371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams AudioPortConfig(); 29724371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams virtual ~AudioPortConfig() {} 29824371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams 29924371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams status_t applyAudioPortConfig(const struct audio_port_config *config, 30024371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams struct audio_port_config *backupConfig = NULL); 301cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams virtual void toAudioPortConfig(struct audio_port_config *dstConfig, 30224371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams const struct audio_port_config *srcConfig = NULL) const = 0; 30324371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams virtual sp<AudioPort> getAudioPort() const = 0; 30424371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams uint32_t mSamplingRate; 3051d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams audio_format_t mFormat; 3061d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams audio_channel_mask_t mChannelMask; 30724371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams struct audio_gain_config mGain; 308c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk }; 309c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk 310c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk 31124371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams class AudioPatch: public RefBase 31224371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams { 31324371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams public: 3141d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams AudioPatch(audio_patch_handle_t handle, 3151d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams const struct audio_patch *patch, uid_t uid) : 3161d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams mHandle(handle), mPatch(*patch), mUid(uid), mAfPatchHandle(0) {} 3171d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams 318c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk status_t dump(int fd, int spaces, int index) const; 319c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk 320c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk audio_patch_handle_t mHandle; 321c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk struct audio_patch mPatch; 322c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk uid_t mUid; 323c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk audio_patch_handle_t mAfPatchHandle; 324c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk }; 325c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk 326c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk class DeviceDescriptor: public AudioPort, public AudioPortConfig 327c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk { 3281d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams public: 3291d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams DeviceDescriptor(const String8& name, audio_devices_t type); 33024371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams 33124371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams virtual ~DeviceDescriptor() {} 33224371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams 33324371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams bool equals(const sp<DeviceDescriptor>& other) const; 33424371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams virtual void toAudioPortConfig(struct audio_port_config *dstConfig, 33524371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams const struct audio_port_config *srcConfig = NULL) const; 33624371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams virtual sp<AudioPort> getAudioPort() const { return (AudioPort*) this; } 33724371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams 33824371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams virtual void toAudioPort(struct audio_port *port) const; 33924371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams 34024371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams status_t dump(int fd, int spaces, int index) const; 34124371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams 34224371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams audio_devices_t mDeviceType; 34324371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams String8 mAddress; 3441d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams audio_port_handle_t mId; 3452dca84dd6c07992f78ad050177975f16486dd77eJason Sams }; 3462dca84dd6c07992f78ad050177975f16486dd77eJason Sams 3472dca84dd6c07992f78ad050177975f16486dd77eJason Sams class DeviceVector : public SortedVector< sp<DeviceDescriptor> > 34824371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams { 3492dca84dd6c07992f78ad050177975f16486dd77eJason Sams public: 3502dca84dd6c07992f78ad050177975f16486dd77eJason Sams DeviceVector() : SortedVector(), mDeviceTypes(AUDIO_DEVICE_NONE) {} 351c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk 3522dca84dd6c07992f78ad050177975f16486dd77eJason Sams ssize_t add(const sp<DeviceDescriptor>& item); 3532dca84dd6c07992f78ad050177975f16486dd77eJason Sams ssize_t remove(const sp<DeviceDescriptor>& item); 3542dca84dd6c07992f78ad050177975f16486dd77eJason Sams ssize_t indexOf(const sp<DeviceDescriptor>& item) const; 3552dca84dd6c07992f78ad050177975f16486dd77eJason Sams 356c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk audio_devices_t types() const { return mDeviceTypes; } 357c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk 3582dca84dd6c07992f78ad050177975f16486dd77eJason Sams void loadDevicesFromType(audio_devices_t types); 359326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams void loadDevicesFromName(char *name, const DeviceVector& declaredDevices); 360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 361a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams sp<DeviceDescriptor> getDevice(audio_devices_t type, String8 address) const; 362326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams DeviceVector getDevicesFromType(audio_devices_t types) const; 363900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams sp<DeviceDescriptor> getDeviceFromId(audio_port_handle_t id) const; 364900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams sp<DeviceDescriptor> getDeviceFromName(const String8& name) const; 365900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams DeviceVector getDevicesFromTypeAddr(audio_devices_t type, String8 address) 366c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams const; 367900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams 368900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams private: 369900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams void refreshTypes(); 370900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams audio_devices_t mDeviceTypes; 371900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams }; 372a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams 373326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // the IOProfile class describes the capabilities of an output or input stream. 374326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // It is currently assumed that all combination of listed parameters are supported. 375889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk // It is used by the policy manager to determine if an output or input is suitable for 376889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk // a given use case, open/close it accordingly and connect/disconnect audio tracks 377889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk // to/from it. 378889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk class IOProfile : public AudioPort 3791fddd90849deaae89b546ff492c345d485bbce42Jason Sams { 38076371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato public: 38176371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato IOProfile(const String8& name, audio_port_role_t role, const sp<HwModule>& module); 3821fddd90849deaae89b546ff492c345d485bbce42Jason Sams virtual ~IOProfile(); 38376371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato 38476371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato // This method is used for both output and input. 385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // If parameter updatedSamplingRate is non-NULL, it is assigned the actual sample rate. 3860cae59f7d8dd63d1bf0ca4abedecb4cfa3ab1921Alex Sakhartchouk // For input, flags is interpreted as audio_input_flags_t. 3870cae59f7d8dd63d1bf0ca4abedecb4cfa3ab1921Alex Sakhartchouk // TODO: merge audio_output_flags_t and audio_input_flags_t. 3880cae59f7d8dd63d1bf0ca4abedecb4cfa3ab1921Alex Sakhartchouk bool isCompatibleProfile(audio_devices_t device, 389c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk uint32_t samplingRate, 390ca5a454e022caec6c6d3cbb404cc09ea095ba97aAlex Sakhartchouk uint32_t *updatedSamplingRate, 391ca5a454e022caec6c6d3cbb404cc09ea095ba97aAlex Sakhartchouk audio_format_t format, 39209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk audio_channel_mask_t channelMask, 3930cae59f7d8dd63d1bf0ca4abedecb4cfa3ab1921Alex Sakhartchouk uint32_t flags) const; 39409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 395ca5a454e022caec6c6d3cbb404cc09ea095ba97aAlex Sakhartchouk void dump(int fd); 396c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk void log(); 3970cae59f7d8dd63d1bf0ca4abedecb4cfa3ab1921Alex Sakhartchouk 39809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk DeviceVector mSupportedDevices; // supported devices 399c8fb69e4a3e01501a3d38a6d3ea185e583d3f493Alex Sakhartchouk // (devices this output can be routed to) 4000cae59f7d8dd63d1bf0ca4abedecb4cfa3ab1921Alex Sakhartchouk }; 401ca5a454e022caec6c6d3cbb404cc09ea095ba97aAlex Sakhartchouk 4020cae59f7d8dd63d1bf0ca4abedecb4cfa3ab1921Alex Sakhartchouk class HwModule : public RefBase 4030cae59f7d8dd63d1bf0ca4abedecb4cfa3ab1921Alex Sakhartchouk { 404326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams public: 405326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams HwModule(const char *name); 406326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ~HwModule(); 407158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams 408158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams status_t loadOutput(cnode *root); 409158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams status_t loadInput(cnode *root); 4102dca84dd6c07992f78ad050177975f16486dd77eJason Sams status_t loadDevice(cnode *root); 411326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 4121fddd90849deaae89b546ff492c345d485bbce42Jason Sams void dump(int fd); 4131fddd90849deaae89b546ff492c345d485bbce42Jason Sams 414433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams const char *const mName; // base name of the audio HW module (primary, a2dp ...) 415433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams uint32_t mHalVersion; // audio HAL API version 416886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk audio_module_handle_t mHandle; 417886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk Vector < sp<IOProfile> > mOutputProfiles; // output profiles exposed by this module 4180cae59f7d8dd63d1bf0ca4abedecb4cfa3ab1921Alex Sakhartchouk Vector < sp<IOProfile> > mInputProfiles; // input profiles exposed by this module 41976371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato DeviceVector mDeclaredDevices; // devices declared in audio_policy.conf 420605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams 421605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams }; 422e57691037aea219562ac686429b4b98202aab7bcJason Sams 423e57691037aea219562ac686429b4b98202aab7bcJason Sams // default volume curve 424e57691037aea219562ac686429b4b98202aab7bcJason Sams static const VolumeCurvePoint sDefaultVolumeCurve[AudioPolicyManager::VOLCNT]; 425605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams // default volume curve for media strategy 426605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams static const VolumeCurvePoint sDefaultMediaVolumeCurve[AudioPolicyManager::VOLCNT]; 427605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams // volume curve for non-media audio on ext media outputs (HDMI, Line, etc) 428e57691037aea219562ac686429b4b98202aab7bcJason Sams static const VolumeCurvePoint sExtMediaSystemVolumeCurve[AudioPolicyManager::VOLCNT]; 429e57691037aea219562ac686429b4b98202aab7bcJason Sams // volume curve for media strategy on speakers 430e57691037aea219562ac686429b4b98202aab7bcJason Sams static const VolumeCurvePoint sSpeakerMediaVolumeCurve[AudioPolicyManager::VOLCNT]; 431e57691037aea219562ac686429b4b98202aab7bcJason Sams static const VolumeCurvePoint sSpeakerMediaVolumeCurveDrc[AudioPolicyManager::VOLCNT]; 4326b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams // volume curve for sonification strategy on speakers 4336b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams static const VolumeCurvePoint sSpeakerSonificationVolumeCurve[AudioPolicyManager::VOLCNT]; 43401b7d2995f9cbd33a9ccdf861fe959743a4b9954Stephen Hines static const VolumeCurvePoint sSpeakerSonificationVolumeCurveDrc[AudioPolicyManager::VOLCNT]; 4354820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams static const VolumeCurvePoint sDefaultSystemVolumeCurve[AudioPolicyManager::VOLCNT]; 436771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams static const VolumeCurvePoint sDefaultSystemVolumeCurveDrc[AudioPolicyManager::VOLCNT]; 4374820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams static const VolumeCurvePoint sHeadsetSystemVolumeCurve[AudioPolicyManager::VOLCNT]; 438771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams static const VolumeCurvePoint sDefaultVoiceVolumeCurve[AudioPolicyManager::VOLCNT]; 4394820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams static const VolumeCurvePoint sSpeakerVoiceVolumeCurve[AudioPolicyManager::VOLCNT]; 440771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams static const VolumeCurvePoint sLinearVolumeCurve[AudioPolicyManager::VOLCNT]; 4414820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams static const VolumeCurvePoint sSilentVolumeCurve[AudioPolicyManager::VOLCNT]; 442771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams static const VolumeCurvePoint sFullScaleVolumeCurve[AudioPolicyManager::VOLCNT]; 4434820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams // default volume curves per stream and device category. See initializeVolumeCurves() 444d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk static const VolumeCurvePoint *sVolumeProfiles[AUDIO_STREAM_CNT][DEVICE_CATEGORY_CNT]; 445d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 4464820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams // descriptor for audio outputs. Used to maintain current configuration of each opened audio output 4474820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams // and keep track of the usage of this output by each audio stream type. 4488ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams class AudioOutputDescriptor: public AudioPortConfig 449326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams { 450a44cb29164726cd9d812117819abdd7b60dfdd93Jason Sams public: 451326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams AudioOutputDescriptor(const sp<IOProfile>& profile); 452fcd3192ebff8ab58d841836b7e94361d0998338cJason Sams 453732f1c0a29cc468ea271ca3bd654239a0a973fd5Jason Sams status_t dump(int fd); 454458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams 455326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams audio_devices_t device() const; 4562dca84dd6c07992f78ad050177975f16486dd77eJason Sams void changeRefCount(audio_stream_type_t stream, int delta); 4574820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams 4582dca84dd6c07992f78ad050177975f16486dd77eJason Sams bool isDuplicated() const { return (mOutput1 != NULL && mOutput2 != NULL); } 4590cae59f7d8dd63d1bf0ca4abedecb4cfa3ab1921Alex Sakhartchouk audio_devices_t supportedDevices(); 4600cae59f7d8dd63d1bf0ca4abedecb4cfa3ab1921Alex Sakhartchouk uint32_t latency(); 4610cae59f7d8dd63d1bf0ca4abedecb4cfa3ab1921Alex Sakhartchouk bool sharesHwModuleWith(const sp<AudioOutputDescriptor> outputDesc); 4620cae59f7d8dd63d1bf0ca4abedecb4cfa3ab1921Alex Sakhartchouk bool isActive(uint32_t inPastMs = 0) const; 4630cae59f7d8dd63d1bf0ca4abedecb4cfa3ab1921Alex Sakhartchouk bool isStreamActive(audio_stream_type_t stream, 4642dca84dd6c07992f78ad050177975f16486dd77eJason Sams uint32_t inPastMs = 0, 4652dca84dd6c07992f78ad050177975f16486dd77eJason Sams nsecs_t sysTime = 0) const; 466afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams bool isStrategyActive(routing_strategy strategy, 4672dca84dd6c07992f78ad050177975f16486dd77eJason Sams uint32_t inPastMs = 0, 4682dca84dd6c07992f78ad050177975f16486dd77eJason Sams nsecs_t sysTime = 0) const; 4692dca84dd6c07992f78ad050177975f16486dd77eJason Sams 4702dca84dd6c07992f78ad050177975f16486dd77eJason Sams virtual void toAudioPortConfig(struct audio_port_config *dstConfig, 47124371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams const struct audio_port_config *srcConfig = NULL) const; 4722dca84dd6c07992f78ad050177975f16486dd77eJason Sams virtual sp<AudioPort> getAudioPort() const { return mProfile; } 4732dca84dd6c07992f78ad050177975f16486dd77eJason Sams void toAudioPort(struct audio_port *port) const; 4742dca84dd6c07992f78ad050177975f16486dd77eJason Sams 4752dca84dd6c07992f78ad050177975f16486dd77eJason Sams audio_port_handle_t mId; 4762dca84dd6c07992f78ad050177975f16486dd77eJason Sams audio_io_handle_t mIoHandle; // output handle 4772dca84dd6c07992f78ad050177975f16486dd77eJason Sams uint32_t mLatency; // 478326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams audio_output_flags_t mFlags; // 479326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams audio_devices_t mDevice; // current device this output is routed to 4804c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams audio_patch_handle_t mPatchHandle; 4814820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams uint32_t mRefCount[AUDIO_STREAM_CNT]; // number of streams of each type using this output 4824820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams nsecs_t mStopTime[AUDIO_STREAM_CNT]; 4834820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams sp<AudioOutputDescriptor> mOutput1; // used by duplicated outputs: first output 4844820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams sp<AudioOutputDescriptor> mOutput2; // used by duplicated outputs: second output 4854820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams float mCurVolume[AUDIO_STREAM_CNT]; // current stream volume 486d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk int mMuteCount[AUDIO_STREAM_CNT]; // mute request counter 4874820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams const sp<IOProfile> mProfile; // I/O profile this output derives from 4884820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams bool mStrategyMutedByDevice[NUM_STRATEGIES]; // strategies muted because of incompatible 4894820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams // device selection. See checkDeviceMuteStrategies() 4904820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams uint32_t mDirectOpenCount; // number of clients using this output (direct outputs only) 4914820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams }; 492d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 4934820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams // descriptor for audio inputs. Used to maintain current configuration of each opened audio input 494e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams // and keep track of the usage of this input. 495e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams class AudioInputDescriptor: public AudioPortConfig 4964820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams { 4974820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams public: 4984820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams AudioInputDescriptor(const sp<IOProfile>& profile); 4994820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams 5004820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams status_t dump(int fd); 501605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams 50233b6e3b91329080e5cdd0b8fdbcd3e6a906032aeJason Sams audio_port_handle_t mId; 5034c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams audio_io_handle_t mIoHandle; // input handle 504326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams audio_devices_t mDevice; // current device this input is routed to 505326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams audio_patch_handle_t mPatchHandle; 506326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t mRefCount; // number of AudioRecord clients using 5077bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams // this input 5087bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t mOpenRefCount; 5097bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams audio_source_t mInputSource; // input source selected by application 5107bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams //(mediarecorder.h) 5117bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams const sp<IOProfile> mProfile; // I/O profile this output derives from 512181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams SortedVector<audio_session_t> mSessions; // audio sessions attached to this input 5137bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams bool mIsSoundTrigger; // used by a soundtrigger capture 5147bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 5157bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams virtual void toAudioPortConfig(struct audio_port_config *dstConfig, 5167bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams const struct audio_port_config *srcConfig = NULL) const; 5178d957fa762eff6c03a93ddea9405d9575665f1ecJason Sams virtual sp<AudioPort> getAudioPort() const { return mProfile; } 5188d957fa762eff6c03a93ddea9405d9575665f1ecJason Sams void toAudioPort(struct audio_port *port) const; 5198d957fa762eff6c03a93ddea9405d9575665f1ecJason Sams }; 5208d957fa762eff6c03a93ddea9405d9575665f1ecJason Sams 5218d957fa762eff6c03a93ddea9405d9575665f1ecJason Sams // stream descriptor used for volume control 5228d957fa762eff6c03a93ddea9405d9575665f1ecJason Sams class StreamDescriptor 523886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk { 5248d957fa762eff6c03a93ddea9405d9575665f1ecJason Sams public: 5258d957fa762eff6c03a93ddea9405d9575665f1ecJason Sams StreamDescriptor(); 5267bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 5277bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams int getVolumeIndex(audio_devices_t device); 528605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams void dump(int fd); 529605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams 530605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams int mIndexMin; // min volume index 531605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams int mIndexMax; // max volume index 532605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams KeyedVector<audio_devices_t, int> mIndexCur; // current volume index per device 5337bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams bool mCanBeMuted; // true is the stream can be muted 5347bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 5357bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams const VolumeCurvePoint *mVolumeCurve[DEVICE_CATEGORY_CNT]; 5367bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams }; 5377bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 5387bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams // stream descriptor used for volume control 5397bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams class EffectDescriptor : public RefBase 5407bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams { 541181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams public: 542181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams 5437bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams status_t dump(int fd); 5447bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 5457bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams int mIo; // io the effect is attached to 5467bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams routing_strategy mStrategy; // routing strategy the effect is associated to 5477bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams int mSession; // audio session the effect is on 5487bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams effect_descriptor_t mDesc; // effect descriptor 5497bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams bool mEnabled; // enabled state: CPU load being used or not 5507bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams }; 5517bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 5527bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams void addOutput(audio_io_handle_t output, sp<AudioOutputDescriptor> outputDesc); 5537bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams void addInput(audio_io_handle_t input, sp<AudioInputDescriptor> inputDesc); 5547bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 5557bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams // return the strategy corresponding to a given stream type 5567bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams static routing_strategy getStrategy(audio_stream_type_t stream); 5577bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 5587bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams // return appropriate device for streams handled by the specified strategy according to current 559158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams // phone state, connected devices... 560158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams // if fromCache is true, the device is returned from mDeviceForStrategy[], 561158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams // otherwise it is determine by current state 562158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams // (device connected,phone state, force use, a2dp output...) 563158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams // This allows to: 564158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams // 1 speed up process when the state is stable (when starting or stopping an output) 5652dca84dd6c07992f78ad050177975f16486dd77eJason Sams // 2 access to either current device selection (fromCache == true) or 566158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams // "future" device selection (fromCache == false) when called from a context 567158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams // where conditions are changing (setDeviceConnectionState(), setPhoneState()...) AND 568158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams // before updateDevicesAndOutputs() is called. 569158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams virtual audio_devices_t getDeviceForStrategy(routing_strategy strategy, 570158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams bool fromCache); 571158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams 572158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams // change the route of the specified output. Returns the number of ms we have slept to 573158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams // allow new routing to take effect in certain cases. 574158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams uint32_t setOutputDevice(audio_io_handle_t output, 5757bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams audio_devices_t device, 5767bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams bool force = false, 5777bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams int delayMs = 0, 5787bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams audio_patch_handle_t *patchHandle = NULL, 579158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams const char* address = NULL); 580158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams status_t resetOutputDevice(audio_io_handle_t output, 581158324456b8dbf40f684dd0a4af3493b9549f3f5Jason Sams int delayMs = 0, 5826b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_patch_handle_t *patchHandle = NULL); 583326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams status_t setInputDevice(audio_io_handle_t input, 584fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams audio_devices_t device, 585fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams bool force = false, 586326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams audio_patch_handle_t *patchHandle = NULL); 587326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams status_t resetInputDevice(audio_io_handle_t input, 588326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams audio_patch_handle_t *patchHandle = NULL); 589326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 59086f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams // select input device corresponding to requested audio source 591e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams virtual audio_devices_t getDeviceForInputSource(audio_source_t inputSource); 592a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams 593a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams // return io handle of active input or 0 if no input is active 5946b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams // Only considers inputs from physical devices (e.g. main mic, headset mic) when 5956b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams // ignoreVirtualInputs is true. 5966b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams audio_io_handle_t getActiveInput(bool ignoreVirtualInputs = true); 5976b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 5986b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams uint32_t activeInputsCount() const; 599a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams 600613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams // initialize volume curves for each strategy and device category 6014820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams void initializeVolumeCurves(); 6026b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 603326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // compute the actual volume for a given stream according to the requested index and a particular 604a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams // device 605a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams virtual float computeVolume(audio_stream_type_t stream, int index, 606a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams audio_io_handle_t output, audio_devices_t device); 607fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams 6089e4e13d87e834b1cb770407cef0778c262b02b72Jason Sams // check that volume change is permitted, compute and send new volume to audio hardware 6099e4e13d87e834b1cb770407cef0778c262b02b72Jason Sams virtual status_t checkAndSetVolume(audio_stream_type_t stream, int index, 6109e4e13d87e834b1cb770407cef0778c262b02b72Jason Sams audio_io_handle_t output, 611fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams audio_devices_t device, 6129e4e13d87e834b1cb770407cef0778c262b02b72Jason Sams int delayMs = 0, bool force = false); 6139e4e13d87e834b1cb770407cef0778c262b02b72Jason Sams 614e57691037aea219562ac686429b4b98202aab7bcJason Sams // apply all stream volumes to the specified output and device 615fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams void applyStreamVolumes(audio_io_handle_t output, audio_devices_t device, int delayMs = 0, bool force = false); 6166b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 617fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams // Mute or unmute all streams handled by the specified strategy on the specified output 618fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams void setStrategyMute(routing_strategy strategy, 619fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams bool on, 620e57691037aea219562ac686429b4b98202aab7bcJason Sams audio_io_handle_t output, 621a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams int delayMs = 0, 622a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams audio_devices_t device = (audio_devices_t)0); 623a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams 624a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams // Mute or unmute the stream on the specified output 625a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams void setStreamMute(audio_stream_type_t stream, 626a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams bool on, 627613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams audio_io_handle_t output, 628992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams int delayMs = 0, 62924371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams audio_devices_t device = (audio_devices_t)0); 630a891933b4c5ab1b63103add167269cfc404c2adfJason Sams 6315086938044e0a9b6b1138f915d0d252fe046e102Jason Sams // handle special cases for sonification strategy while in call: mute streams or replace by 6327c7c78ad8b2d77e38ba6e1d719c828def9437e8eJason Sams // a special tone in the device used for communication 6337c7c78ad8b2d77e38ba6e1d719c828def9437e8eJason Sams void handleIncallSonification(audio_stream_type_t stream, bool starting, bool stateChange); 6347c7c78ad8b2d77e38ba6e1d719c828def9437e8eJason Sams 6357c7c78ad8b2d77e38ba6e1d719c828def9437e8eJason Sams // true if device is in a telephony or VoIP call 6367c7c78ad8b2d77e38ba6e1d719c828def9437e8eJason Sams virtual bool isInCall(); 6377bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 6387bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams // true if given state represents a device in a telephony or VoIP call 6397bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams virtual bool isStateInCall(int state); 6407bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 641a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams // when a device is connected, checks if an open output can be routed 642326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // to this device. If none is open, tries to open one of the available outputs. 643326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // Returns an output suitable to this device or 0. 6447bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams // when a device is disconnected, checks if an output is not used any more and 6457bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams // returns its handle if any. 646181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams // transfers the audio tracks and effects from one output thread to another accordingly. 647181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams status_t checkOutputsForDevice(const sp<DeviceDescriptor> devDesc, 648181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams audio_policy_dev_state_t state, 649181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams SortedVector<audio_io_handle_t>& outputs, 6508d957fa762eff6c03a93ddea9405d9575665f1ecJason Sams const String8 address); 6517bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 6527bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams status_t checkInputsForDevice(audio_devices_t device, 6537bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams audio_policy_dev_state_t state, 6547bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams SortedVector<audio_io_handle_t>& inputs, 6557bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams const String8 address); 6567bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 6577bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams // close an output and its companion duplicating output. 6587bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams void closeOutput(audio_io_handle_t output); 6597bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 660326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // close an input. 661a658e905f14fe500bfee3812b213a73cb37ef6f2Jason Sams void closeInput(audio_io_handle_t input); 662326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 663326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // checks and if necessary changes outputs used for all strategies. 664326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // must be called every time a condition that affects the output choice for a given strategy 665326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // changes: connected device, phone state, force use... 6668c0ee6567b3c874dd472843eb7918ae68d1b9739Jason Sams // Must be called before updateDevicesAndOutputs() 667326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams void checkOutputForStrategy(routing_strategy strategy); 66886f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams 669326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // Same as checkOutputForStrategy() but for a all strategies in order of priority 670326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams void checkOutputForAllStrategies(); 6718c0ee6567b3c874dd472843eb7918ae68d1b9739Jason Sams 672326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // manages A2DP output suspend/restore according to phone state and BT SCO usage 673326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams void checkA2dpSuspend(); 674fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams 675fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams // returns the A2DP output handle if it is open or 0 otherwise 676326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams audio_io_handle_t getA2dpOutput(); 677326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 678fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams // selects the most appropriate device on output for current state 679fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams // must be called every time a condition that affects the device choice for a given output is 680fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams // changed: connected device, phone state, force use, output start, output stop.. 681fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams // see getDeviceForStrategy() for the use of fromCache parameter 682bf3c14ebf456c745c084605dddeda08afdfc7987Jason Sams audio_devices_t getNewOutputDevice(audio_io_handle_t output, bool fromCache); 683326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 684fb03a22ad2adadc1ff50a8b50d43ad7fcc3fa6edJason Sams // updates cache of device used by all strategies (mDeviceForStrategy[]) 685326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // must be called every time a condition that affects the device choice for a given strategy is 686326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // changed: connected device, phone state, force use... 6871c769c3d0e5f08e78ecdb4508c6bc69fcb69bfa8Dianne Hackborn // cached values are used by getDeviceForStrategy() if parameter fromCache is true. 688458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams // Must be called after checkOutputForAllStrategies() 6894820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams void updateDevicesAndOutputs(); 690613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams 691458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams // selects the most appropriate device on input for current state 692458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams audio_devices_t getNewInputDevice(audio_io_handle_t input); 6936b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 694458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams virtual uint32_t getMaxEffectsCpuLoad(); 695458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams virtual uint32_t getMaxEffectsMemory(); 696458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams#ifdef AUDIO_POLICY_TEST 697458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams virtual bool threadLoop(); 698458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams void exit(); 699458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams int testOutputIndex(audio_io_handle_t output); 7006b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams#endif //AUDIO_POLICY_TEST 7016b8552a4f6a44848255d77222e66aa92dd21b1b5Jason Sams 702458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams status_t setEffectEnabled(const sp<EffectDescriptor>& effectDesc, bool enabled); 703458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams 704458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams // returns the category the device belongs to with regard to volume curve management 705458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams static device_category getDeviceCategory(audio_devices_t device); 706771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams 707771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams // extract one device relevant for volume control from multiple device selection 708613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams static audio_devices_t getDeviceForVolume(audio_devices_t device); 709458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams 710458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams SortedVector<audio_io_handle_t> getOutputsForDevice(audio_devices_t device, 711458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams DefaultKeyedVector<audio_io_handle_t, sp<AudioOutputDescriptor> > openOutputs); 712458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams bool vectorsEqual(SortedVector<audio_io_handle_t>& outputs1, 713458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams SortedVector<audio_io_handle_t>& outputs2); 714458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams 715458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams // mute/unmute strategies using an incompatible device combination 716458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams // if muting, wait for the audio in pcm buffer to be drained before proceeding 717613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams // if unmuting, unmute only after the specified delay 718771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams // Returns the number of ms waited 719458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams uint32_t checkDeviceMuteStrategies(sp<AudioOutputDescriptor> outputDesc, 720458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams audio_devices_t prevDevice, 721458f2dc26b7d34c2138c7bfbd95914240084e6bdJason Sams uint32_t delayMs); 72286f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams 72386f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams audio_io_handle_t selectOutput(const SortedVector<audio_io_handle_t>& outputs, 7244820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams audio_output_flags_t flags, 72586f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams audio_format_t format); 72686f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams // samplingRate parameter is an in/out and so may be modified 72786f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams sp<IOProfile> getInputProfile(audio_devices_t device, 72886f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams uint32_t& samplingRate, 72986f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams audio_format_t format, 7304820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams audio_channel_mask_t channelMask, 73186f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams audio_input_flags_t flags); 73286f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams sp<IOProfile> getProfileForDirectOutput(audio_devices_t device, 73386f1b23aaaf9b8822a009d8c3e585e46768abb6aJason Sams uint32_t samplingRate, 734326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams audio_format_t format, 735326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams audio_channel_mask_t channelMask, 7364820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams audio_output_flags_t flags); 737326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 738326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams audio_io_handle_t selectOutputForEffects(const SortedVector<audio_io_handle_t>& outputs); 739326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 740ccc010bb7c0f89e162bf60033968a20be90a903aJason Sams bool isNonOffloadableEffectEnabled(); 741326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 7424820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams status_t addAudioPatch(audio_patch_handle_t handle, 7438ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams const sp<AudioPatch>& patch); 7448ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams status_t removeAudioPatch(audio_patch_handle_t handle); 7458ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams 7468ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams sp<AudioOutputDescriptor> getOutputFromId(audio_port_handle_t id) const; 7478ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams sp<AudioInputDescriptor> getInputFromId(audio_port_handle_t id) const; 748326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams sp<HwModule> getModuleForDevice(audio_devices_t device) const; 749326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams sp<HwModule> getModuleFromName(const char *name) const; 750326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams audio_devices_t availablePrimaryOutputDevices(); 751326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams audio_devices_t availablePrimaryInputDevices(); 7524820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams 7538ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams void updateCallRouting(audio_devices_t rxDevice, int delayMs = 0); 7548ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams 7558ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams // 7568ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams // Audio policy configuration file parsing (audio_policy.conf) 7578ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams // 758cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams static uint32_t stringToEnum(const struct StringToEnum *table, 759cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams size_t size, 7605fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams const char *name); 7615fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams static const char *enumToString(const struct StringToEnum *table, 7624820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams size_t size, 7635fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams uint32_t value); 7645fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams static bool stringToBool(const char *value); 7655fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams static uint32_t parseOutputFlagNames(char *name); 7665fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams static uint32_t parseInputFlagNames(char *name); 7675fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams static audio_devices_t parseDeviceNames(char *name); 7685fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams void loadHwModule(cnode *root); 7695fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams void loadHwModules(cnode *root); 770326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams void loadGlobalConfig(cnode *root, const sp<HwModule>& module); 771326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams status_t loadAudioPolicyConfig(const char *path); 7724820e8bb83b1f78e6232ebe853221f737da2a1eaJason Sams void defaultAudioPolicyConfig(void); 7738ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams 7748ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams 7758ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams uid_t mUidCached; 7768ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams AudioPolicyClientInterface *mpClientInterface; // audio policy client interface 7778ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams audio_io_handle_t mPrimaryOutput; // primary output handle 778326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // list of descriptors for outputs currently opened 779326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams DefaultKeyedVector<audio_io_handle_t, sp<AudioOutputDescriptor> > mOutputs; 780d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk // copy of mOutputs before setDeviceConnectionState() opens new outputs 781d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk // reset to mOutputs when updateDevicesAndOutputs() is called. 782d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk DefaultKeyedVector<audio_io_handle_t, sp<AudioOutputDescriptor> > mPreviousOutputs; 783d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk DefaultKeyedVector<audio_io_handle_t, sp<AudioInputDescriptor> > mInputs; // list of input descriptors 784d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk DeviceVector mAvailableOutputDevices; // all available output devices 785d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk DeviceVector mAvailableInputDevices; // all available input devices 786d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk int mPhoneState; // current phone state 787d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk audio_policy_forced_cfg_t mForceUse[AUDIO_POLICY_FORCE_USE_CNT]; // current forced use configuration 788d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 789d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk StreamDescriptor mStreams[AUDIO_STREAM_CNT]; // stream descriptors for volume control 790a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams bool mLimitRingtoneVolume; // limit ringtone volume to music volume if headset connected 791a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams audio_devices_t mDeviceForStrategy[NUM_STRATEGIES]; 792a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams float mLastVoiceVolume; // last voice volume value sent to audio HAL 793a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams 794a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams // Maximum CPU load allocated to audio effects in 0.1 MIPS (ARMv5TE, 0 WS memory) units 795a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams static const uint32_t MAX_EFFECTS_CPU_LOAD = 1000; 796a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams // Maximum memory allocated to audio effects in KB 797a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams static const uint32_t MAX_EFFECTS_MEMORY = 512; 798a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams uint32_t mTotalEffectsCpuLoad; // current CPU load used by effects 799a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams uint32_t mTotalEffectsMemory; // current memory used by effects 800a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams KeyedVector<int, sp<EffectDescriptor> > mEffects; // list of registered audio effects 801a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams bool mA2dpSuspended; // true if A2DP output is suspended 802a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams sp<DeviceDescriptor> mDefaultOutputDevice; // output device selected by default at boot time 803a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams bool mSpeakerDrcEnabled;// true on devices that use DRC on the DEVICE_CATEGORY_SPEAKER path 804a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams // to boost soft sounds, used to adjust volume curves accordingly 805a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams 806a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams Vector < sp<HwModule> > mHwModules; 8078c401effb0837155fc39ca0364f57a882d127d38Jason Sams volatile int32_t mNextUniqueId; 8088c401effb0837155fc39ca0364f57a882d127d38Jason Sams volatile int32_t mAudioPortGeneration; 8098c401effb0837155fc39ca0364f57a882d127d38Jason Sams 81039cd317d983410055d780d00666f724c5faeaba9Jason Sams DefaultKeyedVector<audio_patch_handle_t, sp<AudioPatch> > mAudioPatches; 8118c401effb0837155fc39ca0364f57a882d127d38Jason Sams 8128c401effb0837155fc39ca0364f57a882d127d38Jason Sams DefaultKeyedVector<audio_session_t, audio_io_handle_t> mSoundTriggerSessions; 8138c401effb0837155fc39ca0364f57a882d127d38Jason Sams 8148c401effb0837155fc39ca0364f57a882d127d38Jason Sams sp<AudioPatch> mCallTxPatch; 8158c401effb0837155fc39ca0364f57a882d127d38Jason Sams sp<AudioPatch> mCallRxPatch; 8168c401effb0837155fc39ca0364f57a882d127d38Jason Sams 8178c401effb0837155fc39ca0364f57a882d127d38Jason Sams // for supporting "beacon" streams, i.e. streams that only play on speaker, and never 8188c401effb0837155fc39ca0364f57a882d127d38Jason Sams // when something other than STREAM_TTS (a.k.a. "Transmitted Through Speaker") is playing 8198c401effb0837155fc39ca0364f57a882d127d38Jason Sams enum { 8208c401effb0837155fc39ca0364f57a882d127d38Jason Sams STARTING_OUTPUT, 8218c401effb0837155fc39ca0364f57a882d127d38Jason Sams STARTING_BEACON, 8228c401effb0837155fc39ca0364f57a882d127d38Jason Sams STOPPING_OUTPUT, 8238c401effb0837155fc39ca0364f57a882d127d38Jason Sams STOPPING_BEACON 8248c401effb0837155fc39ca0364f57a882d127d38Jason Sams }; 8258c401effb0837155fc39ca0364f57a882d127d38Jason Sams uint32_t mBeaconMuteRefCount; // ref count for stream that would mute beacon 8268c401effb0837155fc39ca0364f57a882d127d38Jason Sams uint32_t mBeaconPlayingRefCount;// ref count for the playing beacon streams 8278c401effb0837155fc39ca0364f57a882d127d38Jason Sams bool mBeaconMuted; // has STREAM_TTS been muted 8288c401effb0837155fc39ca0364f57a882d127d38Jason Sams 8298c401effb0837155fc39ca0364f57a882d127d38Jason Sams#ifdef AUDIO_POLICY_TEST 8308c401effb0837155fc39ca0364f57a882d127d38Jason Sams Mutex mLock; 8318c401effb0837155fc39ca0364f57a882d127d38Jason Sams Condition mWaitWorkCV; 8328c401effb0837155fc39ca0364f57a882d127d38Jason Sams 8338c401effb0837155fc39ca0364f57a882d127d38Jason Sams int mCurOutput; 8348c401effb0837155fc39ca0364f57a882d127d38Jason Sams bool mDirectOutput; 8358c401effb0837155fc39ca0364f57a882d127d38Jason Sams audio_io_handle_t mTestOutputs[NUM_TEST_OUTPUTS]; 8368c401effb0837155fc39ca0364f57a882d127d38Jason Sams int mTestInput; 8378c401effb0837155fc39ca0364f57a882d127d38Jason Sams uint32_t mTestDevice; 8388c401effb0837155fc39ca0364f57a882d127d38Jason Sams uint32_t mTestSamplingRate; 8398c401effb0837155fc39ca0364f57a882d127d38Jason Sams uint32_t mTestFormat; 8408c401effb0837155fc39ca0364f57a882d127d38Jason Sams uint32_t mTestChannels; 8418c46b10a1af7151f9453651f9e6def0237a6f7d8Jason Sams uint32_t mTestLatencyMs; 8428c401effb0837155fc39ca0364f57a882d127d38Jason Sams#endif //AUDIO_POLICY_TEST 8438c401effb0837155fc39ca0364f57a882d127d38Jason Sams static float volIndexToAmpl(audio_devices_t device, const StreamDescriptor& streamDesc, 8448c401effb0837155fc39ca0364f57a882d127d38Jason Sams int indexInUi); 8458c401effb0837155fc39ca0364f57a882d127d38Jason Samsprivate: 8468c401effb0837155fc39ca0364f57a882d127d38Jason Sams // updates device caching and output for streams that can influence the 847ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams // routing of notifications 848ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams void handleNotificationRoutingForStream(audio_stream_type_t stream); 849ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams static bool isVirtualInputDevice(audio_devices_t device); 850ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams static bool deviceDistinguishesOnAddress(audio_devices_t device); 851ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams // find the outputs on a given output descriptor that have the given address. 852ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams // to be called on an AudioOutputDescriptor whose supported devices (as defined 853ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams // in mProfile->mSupportedDevices) matches the device whose address is to be matched. 8548c401effb0837155fc39ca0364f57a882d127d38Jason Sams // see deviceDistinguishesOnAddress(audio_devices_t) for whether the device type is one 8558c401effb0837155fc39ca0364f57a882d127d38Jason Sams // where addresses are used to distinguish between one connected device and another. 8568c401effb0837155fc39ca0364f57a882d127d38Jason Sams void findIoHandlesByAddress(sp<AudioOutputDescriptor> desc /*in*/, 8578c401effb0837155fc39ca0364f57a882d127d38Jason Sams const String8 address /*in*/, 8588c401effb0837155fc39ca0364f57a882d127d38Jason Sams SortedVector<audio_io_handle_t>& outputs /*out*/); 8598c401effb0837155fc39ca0364f57a882d127d38Jason Sams uint32_t nextUniqueId(); 8608c401effb0837155fc39ca0364f57a882d127d38Jason Sams uint32_t nextAudioPortGeneration(); 8618c401effb0837155fc39ca0364f57a882d127d38Jason Sams uint32_t curAudioPortGeneration() const { return mAudioPortGeneration; } 8628c401effb0837155fc39ca0364f57a882d127d38Jason Sams // internal method to return the output handle for the given device and format 8638c401effb0837155fc39ca0364f57a882d127d38Jason Sams audio_io_handle_t getOutputForDevice( 8648c401effb0837155fc39ca0364f57a882d127d38Jason Sams audio_devices_t device, 8658c401effb0837155fc39ca0364f57a882d127d38Jason Sams audio_stream_type_t stream, 8668c401effb0837155fc39ca0364f57a882d127d38Jason Sams uint32_t samplingRate, 8678c401effb0837155fc39ca0364f57a882d127d38Jason Sams audio_format_t format, 8688c401effb0837155fc39ca0364f57a882d127d38Jason Sams audio_channel_mask_t channelMask, 8695086938044e0a9b6b1138f915d0d252fe046e102Jason Sams audio_output_flags_t flags, 870a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams const audio_offload_info_t *offloadInfo); 871a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams // internal function to derive a stream type value from audio attributes 872a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams audio_stream_type_t streamTypefromAttributesInt(const audio_attributes_t *attr); 873a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams // return true if any output is playing anything besides the stream to ignore 874a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams bool isAnyOutputActive(audio_stream_type_t streamToIgnore); 875a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams // event is one of STARTING_OUTPUT, STARTING_BEACON, STOPPING_OUTPUT, STOPPING_BEACON 876a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams // returns 0 if no mute/unmute event happened, the largest latency of the device where 877a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams // the mute/unmute happened 878a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams uint32_t handleEventForBeacon(int event); 879a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams uint32_t setBeaconMute(bool mute); 880a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams}; 881a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams 882a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams}; 883a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams