165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* 265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Copyright (C) 2009 The Android Open Source Project 365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * you may not use this file except in compliance with the License. 665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * You may obtain a copy of the License at 765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 1065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Unless required by applicable law or agreed to in writing, software 1165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 1265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * See the License for the specific language governing permissions and 1465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * limitations under the License. 1565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */ 1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#ifndef ANDROID_AUDIOPOLICYSERVICE_H 1865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define ANDROID_AUDIOPOLICYSERVICE_H 1965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 207c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <cutils/misc.h> 217c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <cutils/config_utils.h> 22e762be91c3280d837b1d48455cba90459ced7511Mathias Agopian#include <cutils/compiler.h> 23d1d8f23dde239289ba8c0de0944baaca3586c880Glenn Kasten#include <utils/String8.h> 2465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/Vector.h> 257c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <utils/SortedVector.h> 26d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten#include <binder/BinderService.h> 2764760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h> 287394a4f358fa9908a9f0a7c954b65c399f4268e6Dima Zavin#include <system/audio_policy.h> 297c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <media/IAudioPolicyService.h> 307c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <media/ToneGenerator.h> 317c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <media/AudioEffect.h> 32baac183f3808d7b68f184647a97bd381620415feEric Laurent#include <media/AudioPolicy.h> 33ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu#include "AudioPolicyEffects.h" 3456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi#include "managerdefault/AudioPolicyManager.h" 35fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 36ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu 3765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiannamespace android { 3865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 3965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// ---------------------------------------------------------------------------- 4065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 41d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kastenclass AudioPolicyService : 42d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten public BinderService<AudioPolicyService>, 43d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten public BnAudioPolicyService, 44de070137f11d346fba77605bd76a44c040a618fcEric Laurent public IBinder::DeathRecipient 4565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 46d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten friend class BinderService<AudioPolicyService>; 4765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 49d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten // for BinderService 50e762be91c3280d837b1d48455cba90459ced7511Mathias Agopian static const char *getServiceName() ANDROID_API { return "media.audio_policy"; } 5165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 5265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t dump(int fd, const Vector<String16>& args); 5365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 5465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // 5565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // BnAudioPolicyService (see AudioPolicyInterface for method descriptions) 5665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // 5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 58fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t setDeviceConnectionState(audio_devices_t device, 59fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state, 60e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_address, 61e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name); 62fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_dev_state_t getDeviceConnectionState( 63fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 64de070137f11d346fba77605bd76a44c040a618fcEric Laurent const char *device_address); 65f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov virtual status_t handleDeviceConfigChange(audio_devices_t device, 66f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov const char *device_address, 67f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov const char *device_name); 68f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setPhoneState(audio_mode_t state); 69fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config); 70fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage); 71fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_io_handle_t getOutput(audio_stream_type_t stream, 7265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t samplingRate = 0, 7358f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = AUDIO_FORMAT_DEFAULT, 74254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = 0, 750ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = 76ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald AUDIO_OUTPUT_FLAG_NONE, 77ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald const audio_offload_info_t *offloadInfo = NULL); 78e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual status_t getOutputForAttr(const audio_attributes_t *attr, 79e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t *output, 80e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session, 81e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t *stream, 828c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 8320b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent const audio_config_t *config, 8420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_output_flags_t flags, 8520b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t selectedDeviceId, 8620b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t *portId); 87de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t startOutput(audio_io_handle_t output, 88fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 89e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session); 90de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t stopOutput(audio_io_handle_t output, 91fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 92e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session); 93e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual void releaseOutput(audio_io_handle_t output, 94e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 95e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session); 96caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent virtual status_t getInputForAttr(const audio_attributes_t *attr, 97caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_io_handle_t *input, 98caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session, 99b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent pid_t pid, 1008c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 10120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent const audio_config_base_t *config, 102466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_input_flags_t flags, 10320b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE, 10420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t *portId = NULL); 1054dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t startInput(audio_io_handle_t input, 1064dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session); 1074dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t stopInput(audio_io_handle_t input, 1084dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session); 1094dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual void releaseInput(audio_io_handle_t input, 1104dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session); 111fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t initStreamVolume(audio_stream_type_t stream, 11265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int indexMin, 11365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int indexMax); 11483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 11583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int index, 11683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device); 11783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 11883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int *index, 11983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device); 12065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 121fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual uint32_t getStrategyForStream(audio_stream_type_t stream); 1226374252107fd6539397598195ea6defd5870fafbEric Laurent virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream); 123de070137f11d346fba77605bd76a44c040a618fcEric Laurent 12458e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc); 12558e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual status_t registerEffect(const effect_descriptor_t *desc, 1267c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io, 127de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy, 128d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session, 129de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id); 130de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t unregisterEffect(int id); 131db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent virtual status_t setEffectEnabled(int id, bool enabled); 132fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const; 133272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs = 0) const; 134d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi virtual bool isSourceActive(audio_source_t source) const; 135de070137f11d346fba77605bd76a44c040a618fcEric Laurent 136d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual status_t queryDefaultPreProcessing(audio_session_t audioSession, 13757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent effect_descriptor_t *descriptors, 13857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t *count); 13965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t onTransact( 14065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t code, 14165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const Parcel& data, 14265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Parcel* reply, 14365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t flags); 14465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 14565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // IBinder::DeathRecipient 14665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void binderDied(const wp<IBinder>& who); 14765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 148f5ada6edcc83bb1b313abcd4c4fbdc4f7724f04dEric Laurent // RefBase 149f5ada6edcc83bb1b313abcd4c4fbdc4f7724f04dEric Laurent virtual void onFirstRef(); 150f5ada6edcc83bb1b313abcd4c4fbdc4f7724f04dEric Laurent 15165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // 152fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin // Helpers for the struct audio_policy_service_ops implementation. 153fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin // This is used by the audio policy manager for certain operations that 154fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin // are implemented by the policy service. 15565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // 156fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual void setParameters(audio_io_handle_t ioHandle, 157fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin const char *keyValuePairs, 158fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin int delayMs); 159fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 160fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t setStreamVolume(audio_stream_type_t stream, 161de070137f11d346fba77605bd76a44c040a618fcEric Laurent float volume, 162de070137f11d346fba77605bd76a44c040a618fcEric Laurent audio_io_handle_t output, 163de070137f11d346fba77605bd76a44c040a618fcEric Laurent int delayMs = 0); 164fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t startTone(audio_policy_tone_t tone, audio_stream_type_t stream); 16565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t stopTone(); 16665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t setVoiceVolume(float volume, int delayMs = 0); 167ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald virtual bool isOffloadSupported(const audio_offload_info_t &config); 16865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 169203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPorts(audio_port_role_t role, 170203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type, 171203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *num_ports, 172203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports, 173203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation); 174203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t getAudioPort(struct audio_port *port); 175203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 176203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t *handle); 177203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle); 178203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 179203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches, 180203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation); 181203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config); 182203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 183b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent virtual void registerClient(const sp<IAudioPolicyServiceClient>& client); 184b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent 185e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent virtual void setAudioPortCallbacksEnabled(bool enabled); 186e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent 187df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t acquireSoundTriggerSession(audio_session_t *session, 188df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t *ioHandle, 189df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t *device); 190df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 191df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t releaseSoundTriggerSession(audio_session_t session); 192df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 193bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent virtual audio_mode_t getPhoneState(); 194bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 195e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration); 196baac183f3808d7b68f184647a97bd381620415feEric Laurent 197554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent virtual status_t startAudioSource(const struct audio_port_config *source, 198554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent const audio_attributes_t *attributes, 199559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten audio_patch_handle_t *handle); 200559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten virtual status_t stopAudioSource(audio_patch_handle_t handle); 201554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 2022ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung virtual status_t setMasterMono(bool mono); 2032ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung virtual status_t getMasterMono(bool *mono); 2042ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 205bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent status_t doStopOutput(audio_io_handle_t output, 206bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent audio_stream_type_t stream, 207e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session); 208e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent void doReleaseOutput(audio_io_handle_t output, 209e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 210e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session); 211bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent 212951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent status_t clientCreateAudioPatch(const struct audio_patch *patch, 213951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent audio_patch_handle_t *handle, 214951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent int delayMs); 215951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent status_t clientReleaseAudioPatch(audio_patch_handle_t handle, 216951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent int delayMs); 217e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent virtual status_t clientSetAudioPortConfig(const struct audio_port_config *config, 218e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent int delayMs); 219e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent 220b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent void removeNotificationClient(uid_t uid); 221b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent void onAudioPortListUpdate(); 222b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent void doOnAudioPortListUpdate(); 223b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent void onAudioPatchListUpdate(); 224b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent void doOnAudioPatchListUpdate(); 225951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent 226e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh void onDynamicPolicyMixStateUpdate(const String8& regId, int32_t state); 227e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh void doOnDynamicPolicyMixStateUpdate(const String8& regId, int32_t state); 2282f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi void onRecordingConfigurationUpdate(int event, audio_session_t session, 2297281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi audio_source_t source, const audio_config_base_t *clientConfig, 2308c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_config_base_t *deviceConfig, audio_patch_handle_t patchHandle); 2312f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi void doOnRecordingConfigurationUpdate(int event, audio_session_t session, 2327281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi audio_source_t source, const audio_config_base_t *clientConfig, 2338c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_config_base_t *deviceConfig, audio_patch_handle_t patchHandle); 234de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi 23565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprivate: 236e762be91c3280d837b1d48455cba90459ced7511Mathias Agopian AudioPolicyService() ANDROID_API; 23765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual ~AudioPolicyService(); 23865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 23965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian status_t dumpInternals(int fd); 24065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 24165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Thread used for tone playback and to send audio config commands to audio flinger 24285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten // For tone playback, using a separate thread is necessary to avoid deadlock with mLock because 24385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten // startTone() and stopTone() are normally called with mLock locked and requesting a tone start 24485ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten // or stop will cause calls to AudioPolicyService and an attempt to lock mLock. 24585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten // For audio config commands, it is necessary because audio flinger requires that the calling 24685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten // process (user) has permission to modify audio settings. 24765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian class AudioCommandThread : public Thread { 24865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian class AudioCommand; 24965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public: 25065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 25165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // commands for tone AudioCommand 25265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian enum { 25365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian START_TONE, 25465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian STOP_TONE, 25565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian SET_VOLUME, 25665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian SET_PARAMETERS, 257bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent SET_VOICE_VOLUME, 258bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent STOP_OUTPUT, 259951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent RELEASE_OUTPUT, 260951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent CREATE_AUDIO_PATCH, 261951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent RELEASE_AUDIO_PATCH, 262b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent UPDATE_AUDIOPORT_LIST, 263e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent UPDATE_AUDIOPATCH_LIST, 264e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent SET_AUDIOPORT_CONFIG, 2652f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi DYN_POLICY_MIX_STATE_UPDATE, 2662f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi RECORDING_CONFIGURATION_UPDATE 26765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 26865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 269bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent AudioCommandThread (String8 name, const wp<AudioPolicyService>& service); 27065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual ~AudioCommandThread(); 27165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 27265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian status_t dump(int fd); 27365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 27465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Thread virtuals 27565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void onFirstRef(); 27665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual bool threadLoop(); 27765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 27865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void exit(); 2793d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten void startToneCommand(ToneGenerator::tone_type type, 2803d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten audio_stream_type_t stream); 28165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void stopToneCommand(); 28272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten status_t volumeCommand(audio_stream_type_t stream, float volume, 28372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, int delayMs = 0); 28472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten status_t parametersCommand(audio_io_handle_t ioHandle, 28572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten const char *keyValuePairs, int delayMs = 0); 28665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian status_t voiceVolumeCommand(float volume, int delayMs = 0); 287bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent void stopOutputCommand(audio_io_handle_t output, 288bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent audio_stream_type_t stream, 289e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session); 290e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent void releaseOutputCommand(audio_io_handle_t output, 291e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 292e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session); 2930ede8924b98c2967be2795e8d4f9837d8d3f094cEric Laurent status_t sendCommand(sp<AudioCommand>& command, int delayMs = 0); 2940ede8924b98c2967be2795e8d4f9837d8d3f094cEric Laurent void insertCommand_l(sp<AudioCommand>& command, int delayMs = 0); 295951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent status_t createAudioPatchCommand(const struct audio_patch *patch, 296951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent audio_patch_handle_t *handle, 297951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent int delayMs); 298951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent status_t releaseAudioPatchCommand(audio_patch_handle_t handle, 299951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent int delayMs); 300b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent void updateAudioPortListCommand(); 301b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent void updateAudioPatchListCommand(); 302e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent status_t setAudioPortConfigCommand(const struct audio_port_config *config, 303e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent int delayMs); 304e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh void dynamicPolicyMixStateUpdateCommand(const String8& regId, int32_t state); 3052f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi void recordingConfigurationUpdateCommand( 3062f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi int event, audio_session_t session, 3077281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi audio_source_t source, 3087281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi const audio_config_base_t *clientConfig, 3098c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_config_base_t *deviceConfig, 3108c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi audio_patch_handle_t patchHandle); 311951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent void insertCommand_l(AudioCommand *command, int delayMs = 0); 31265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 31365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian private: 31448412dc92c4cc92a3f4821616e12290f5eeabd07Jesper Tragardh class AudioCommandData; 31548412dc92c4cc92a3f4821616e12290f5eeabd07Jesper Tragardh 31665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // descriptor for requested tone playback event 3170ede8924b98c2967be2795e8d4f9837d8d3f094cEric Laurent class AudioCommand: public RefBase { 31865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 31965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public: 32065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AudioCommand() 3210ede8924b98c2967be2795e8d4f9837d8d3f094cEric Laurent : mCommand(-1), mStatus(NO_ERROR), mWaitStatus(false) {} 32265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 32365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void dump(char* buffer, size_t size); 32465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 32565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int mCommand; // START_TONE, STOP_TONE ... 32665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian nsecs_t mTime; // time stamp 3270ede8924b98c2967be2795e8d4f9837d8d3f094cEric Laurent Mutex mLock; // mutex associated to mCond 32865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Condition mCond; // condition for status return 32965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian status_t mStatus; // command status 33065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian bool mWaitStatus; // true if caller is waiting for status 3310ede8924b98c2967be2795e8d4f9837d8d3f094cEric Laurent sp<AudioCommandData> mParam; // command specific parameter data 33248412dc92c4cc92a3f4821616e12290f5eeabd07Jesper Tragardh }; 33348412dc92c4cc92a3f4821616e12290f5eeabd07Jesper Tragardh 3340ede8924b98c2967be2795e8d4f9837d8d3f094cEric Laurent class AudioCommandData: public RefBase { 33548412dc92c4cc92a3f4821616e12290f5eeabd07Jesper Tragardh public: 33648412dc92c4cc92a3f4821616e12290f5eeabd07Jesper Tragardh virtual ~AudioCommandData() {} 33748412dc92c4cc92a3f4821616e12290f5eeabd07Jesper Tragardh protected: 33848412dc92c4cc92a3f4821616e12290f5eeabd07Jesper Tragardh AudioCommandData() {} 33965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 34065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 34148412dc92c4cc92a3f4821616e12290f5eeabd07Jesper Tragardh class ToneData : public AudioCommandData { 34265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public: 3433d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten ToneGenerator::tone_type mType; // tone type (START_TONE only) 344fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t mStream; // stream type (START_TONE only) 34565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 34665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 34748412dc92c4cc92a3f4821616e12290f5eeabd07Jesper Tragardh class VolumeData : public AudioCommandData { 34865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public: 349fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t mStream; 35065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian float mVolume; 35172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t mIO; 35265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 35365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 35448412dc92c4cc92a3f4821616e12290f5eeabd07Jesper Tragardh class ParametersData : public AudioCommandData { 35565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public: 35672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t mIO; 35765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian String8 mKeyValuePairs; 35865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 35965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 36048412dc92c4cc92a3f4821616e12290f5eeabd07Jesper Tragardh class VoiceVolumeData : public AudioCommandData { 36165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public: 36265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian float mVolume; 36365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 36465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 36548412dc92c4cc92a3f4821616e12290f5eeabd07Jesper Tragardh class StopOutputData : public AudioCommandData { 366bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent public: 367bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent audio_io_handle_t mIO; 368bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent audio_stream_type_t mStream; 369e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t mSession; 370bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent }; 371bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent 37248412dc92c4cc92a3f4821616e12290f5eeabd07Jesper Tragardh class ReleaseOutputData : public AudioCommandData { 373bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent public: 374bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent audio_io_handle_t mIO; 375e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t mStream; 376e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t mSession; 377bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent }; 378bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent 379951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent class CreateAudioPatchData : public AudioCommandData { 380951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent public: 381951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent struct audio_patch mPatch; 382951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent audio_patch_handle_t mHandle; 383951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent }; 384951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent 385951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent class ReleaseAudioPatchData : public AudioCommandData { 386951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent public: 387951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent audio_patch_handle_t mHandle; 388951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent }; 389951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent 390e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent class SetAudioPortConfigData : public AudioCommandData { 391e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent public: 392e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent struct audio_port_config mConfig; 393e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent }; 394e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent 395de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi class DynPolicyMixStateUpdateData : public AudioCommandData { 396de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi public: 397de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi String8 mRegId; 398de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi int32_t mState; 399de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi }; 400de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi 4012f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi class RecordingConfigurationUpdateData : public AudioCommandData { 4022f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi public: 4032f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi int mEvent; 4042f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi audio_session_t mSession; 4052f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi audio_source_t mSource; 4067281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi struct audio_config_base mClientConfig; 4077281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi struct audio_config_base mDeviceConfig; 4088c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi audio_patch_handle_t mPatchHandle; 4092f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi }; 4102f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi 41165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex mLock; 41265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Condition mWaitWorkCV; 4130ede8924b98c2967be2795e8d4f9837d8d3f094cEric Laurent Vector < sp<AudioCommand> > mAudioCommands; // list of pending commands 41465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ToneGenerator *mpToneGenerator; // the tone generator 4150ede8924b98c2967be2795e8d4f9837d8d3f094cEric Laurent sp<AudioCommand> mLastCommand; // last processed command (used by dump) 41665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian String8 mName; // string used by wake lock fo delayed commands 417bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent wp<AudioPolicyService> mService; 41865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 41965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 420dce54a1492c410ad0d93253b341fb33305337505Eric Laurent class AudioPolicyClient : public AudioPolicyClientInterface 421dce54a1492c410ad0d93253b341fb33305337505Eric Laurent { 422dce54a1492c410ad0d93253b341fb33305337505Eric Laurent public: 423e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh explicit AudioPolicyClient(AudioPolicyService *service) : mAudioPolicyService(service) {} 424dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual ~AudioPolicyClient() {} 425dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 426dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // 427dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // Audio HW module functions 428dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // 429dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 430dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // loads a HW module. 431dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual audio_module_handle_t loadHwModule(const char *name); 432dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 433dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // 434dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // Audio output Control functions 435dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // 436dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 437dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // opens an audio output with the requested parameters. The parameter values can indicate to use the default values 438dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // in case the audio policy manager has no specific requirements for the output being opened. 439dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // When the function returns, the parameter values reflect the actual values used by the audio hardware output stream. 440dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // The audio policy manager can check if the proposed parameters are suitable or not and act accordingly. 441cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent virtual status_t openOutput(audio_module_handle_t module, 442cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t *output, 443cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t *config, 444cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t *devices, 445cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent const String8& address, 446cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent uint32_t *latencyMs, 447cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_output_flags_t flags); 448dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // creates a special output that is duplicated to the two outputs passed as arguments. The duplication is performed by 449dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // a special mixer thread in the AudioFlinger. 450dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, audio_io_handle_t output2); 451dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // closes the output stream 452dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual status_t closeOutput(audio_io_handle_t output); 453dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // suspends the output. When an output is suspended, the corresponding audio hardware output stream is placed in 454dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // standby and the AudioTracks attached to the mixer thread are still processed but the output mix is discarded. 455dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual status_t suspendOutput(audio_io_handle_t output); 456dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // restores a suspended output. 457dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual status_t restoreOutput(audio_io_handle_t output); 458dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 459dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // 460dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // Audio input Control functions 461dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // 462dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 463dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // opens an audio input 464dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual audio_io_handle_t openInput(audio_module_handle_t module, 465cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t *input, 466cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t *config, 467cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t *devices, 468cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent const String8& address, 469cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_source_t source, 470ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten audio_input_flags_t flags); 471dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // closes an audio input 472dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual status_t closeInput(audio_io_handle_t input); 473dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // 474dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // misc control functions 475dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // 476dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 477dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // set a stream volume for a particular output. For the same user setting, a given stream type can have different volumes 478dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // for each output (destination device) it is attached to. 479dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual status_t setStreamVolume(audio_stream_type_t stream, float volume, audio_io_handle_t output, int delayMs = 0); 480dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 481dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // invalidate a stream type, causing a reroute to an unspecified new output 482dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual status_t invalidateStream(audio_stream_type_t stream); 483dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 484dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // function enabling to send proprietary informations directly from audio policy manager to audio hardware interface. 485dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual void setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs, int delayMs = 0); 486dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // function enabling to receive proprietary informations directly from audio hardware interface to audio policy manager. 487dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys); 488dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 489dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // request the playback of a tone on the specified stream: used for instance to replace notification sounds when playing 490dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // over a telephony device during a phone call. 491dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual status_t startTone(audio_policy_tone_t tone, audio_stream_type_t stream); 492dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual status_t stopTone(); 493dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 494dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // set down link audio volume. 495dce54a1492c410ad0d93253b341fb33305337505Eric Laurent virtual status_t setVoiceVolume(float volume, int delayMs = 0); 496dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 497dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // move effect to the specified output 498d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual status_t moveEffects(audio_session_t session, 499dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_io_handle_t srcOutput, 500dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_io_handle_t dstOutput); 501dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 502951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent /* Create a patch between several source and sink ports */ 503951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 504951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent audio_patch_handle_t *handle, 505951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent int delayMs); 506951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent 507951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent /* Release a patch */ 508951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle, 509951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent int delayMs); 510951f455566775e5f01e67c5ee26863d7d19209d7Eric Laurent 511e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent /* Set audio port configuration */ 512e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config, int delayMs); 513e1715a465a29db625da9d0ea365edf371e39e201Eric Laurent 514b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent virtual void onAudioPortListUpdate(); 515b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent virtual void onAudioPatchListUpdate(); 516de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state); 5172f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi virtual void onRecordingConfigurationUpdate(int event, 5187281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi audio_session_t session, audio_source_t source, 5197281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi const audio_config_base_t *clientConfig, 5208c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_config_base_t *deviceConfig, audio_patch_handle_t patchHandle); 521b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent 522eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use); 523de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent 524dce54a1492c410ad0d93253b341fb33305337505Eric Laurent private: 525dce54a1492c410ad0d93253b341fb33305337505Eric Laurent AudioPolicyService *mAudioPolicyService; 526dce54a1492c410ad0d93253b341fb33305337505Eric Laurent }; 527dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 528b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent // --- Notification Client --- 529b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent class NotificationClient : public IBinder::DeathRecipient { 530b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent public: 531b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent NotificationClient(const sp<AudioPolicyService>& service, 532b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent const sp<IAudioPolicyServiceClient>& client, 533b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent uid_t uid); 534b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent virtual ~NotificationClient(); 535b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent 536de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi void onAudioPortListUpdate(); 537de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi void onAudioPatchListUpdate(); 538e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh void onDynamicPolicyMixStateUpdate(const String8& regId, int32_t state); 5392f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi void onRecordingConfigurationUpdate( 5402f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi int event, audio_session_t session, 5417281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi audio_source_t source, 5427281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi const audio_config_base_t *clientConfig, 5438c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_config_base_t *deviceConfig, 5448c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi audio_patch_handle_t patchHandle); 545e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent void setAudioPortCallbacksEnabled(bool enabled); 546b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent 547b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent // IBinder::DeathRecipient 548b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent virtual void binderDied(const wp<IBinder>& who); 549b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent 550b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent private: 551b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent NotificationClient(const NotificationClient&); 552b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent NotificationClient& operator = (const NotificationClient&); 553b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent 554b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent const wp<AudioPolicyService> mService; 555b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent const uid_t mUid; 556b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent const sp<IAudioPolicyServiceClient> mAudioPolicyServiceClient; 557e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent bool mAudioPortCallbacksEnabled; 558b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent }; 559b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent 56065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Internal dump utilities. 56165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian status_t dumpPermissionDenial(int fd); 56265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 56365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 564eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent mutable Mutex mLock; // prevents concurrent access to AudioPolicy manager functions changing 565eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent // device connection state or routing 566bab7bf46e15f7e2e304081c5cc56f8d58f5f09f3Haynes Mathew George mutable Mutex mEffectsLock; // serialize access to Effect state within APM. 567bab7bf46e15f7e2e304081c5cc56f8d58f5f09f3Haynes Mathew George // Note: lock acquisition order is always mLock > mEffectsLock: 568bab7bf46e15f7e2e304081c5cc56f8d58f5f09f3Haynes Mathew George // mLock protects AudioPolicyManager methods that can call into audio flinger 569bab7bf46e15f7e2e304081c5cc56f8d58f5f09f3Haynes Mathew George // and possibly back in to audio policy service and acquire mEffectsLock. 570e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten sp<AudioCommandThread> mAudioCommandThread; // audio commands thread 571e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten sp<AudioCommandThread> mTonePlaybackThread; // tone playback thread 572bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent sp<AudioCommandThread> mOutputCommandThread; // process stop and release output 573fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin struct audio_policy_device *mpAudioPolicyDev; 574fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin struct audio_policy *mpAudioPolicy; 575f269b8e0e9ab950fc6652b9594b7a3431c81630cEric Laurent AudioPolicyInterface *mAudioPolicyManager; 576dce54a1492c410ad0d93253b341fb33305337505Eric Laurent AudioPolicyClient *mAudioPolicyClient; 577dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 578b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent DefaultKeyedVector< uid_t, sp<NotificationClient> > mNotificationClients; 5790ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent Mutex mNotificationClientsLock; // protects mNotificationClients 580ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu // Manage all effects configured in audio_effects.conf 581ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu sp<AudioPolicyEffects> mAudioPolicyEffects; 582bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent audio_mode_t mPhoneState; 58365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 58465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 58565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; // namespace android 58665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 58765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#endif // ANDROID_AUDIOPOLICYSERVICE_H 588