AudioPolicyService.h revision 9fda4b87441fe17d90d8144639c9de6d9022c3c0
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> 22d1d8f23dde239289ba8c0de0944baaca3586c880Glenn Kasten#include <utils/String8.h> 2365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/Vector.h> 247c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <utils/SortedVector.h> 25d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten#include <binder/BinderService.h> 2664760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h> 277394a4f358fa9908a9f0a7c954b65c399f4268e6Dima Zavin#include <system/audio_policy.h> 28fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin#include <hardware/audio_policy.h> 297c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <media/IAudioPolicyService.h> 307c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <media/ToneGenerator.h> 317c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <media/AudioEffect.h> 32fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 3365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiannamespace android { 3465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 3565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// ---------------------------------------------------------------------------- 3665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 37d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kastenclass AudioPolicyService : 38d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten public BinderService<AudioPolicyService>, 39d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten public BnAudioPolicyService, 40fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin// public AudioPolicyClientInterface, 41de070137f11d346fba77605bd76a44c040a618fcEric Laurent public IBinder::DeathRecipient 4265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 43d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten friend class BinderService<AudioPolicyService>; 4465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 4565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 46d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten // for BinderService 47d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten static const char *getServiceName() { return "media.audio_policy"; } 4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t dump(int fd, const Vector<String16>& args); 5065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 5165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // 5265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // BnAudioPolicyService (see AudioPolicyInterface for method descriptions) 5365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // 5465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 55fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t setDeviceConnectionState(audio_devices_t device, 56fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state, 5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const char *device_address); 58fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_dev_state_t getDeviceConnectionState( 59fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 60de070137f11d346fba77605bd76a44c040a618fcEric Laurent const char *device_address); 61f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setPhoneState(audio_mode_t state); 62fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config); 63fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage); 64fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_io_handle_t getOutput(audio_stream_type_t stream, 6565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t samplingRate = 0, 6658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = AUDIO_FORMAT_DEFAULT, 6765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t channels = 0, 68fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_output_flags_t flags = 69fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin AUDIO_POLICY_OUTPUT_FLAG_INDIRECT); 70de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t startOutput(audio_io_handle_t output, 71fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 72de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = 0); 73de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t stopOutput(audio_io_handle_t output, 74fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 75de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = 0); 7665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void releaseOutput(audio_io_handle_t output); 77eba51fb3a361f67a6a64d5a16eba6084fe27d60eGlenn Kasten virtual audio_io_handle_t getInput(audio_source_t inputSource, 7865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t samplingRate = 0, 7958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = AUDIO_FORMAT_DEFAULT, 8065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t channels = 0, 81fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_in_acoustics_t acoustics = 82de9719b3ec71472e6bf75117152176af51d1a515Glenn Kasten (audio_in_acoustics_t)0 /*AUDIO_IN_ACOUSTICS_NONE*/, 837c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent int audioSession = 0); 8465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t startInput(audio_io_handle_t input); 8565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t stopInput(audio_io_handle_t input); 8665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void releaseInput(audio_io_handle_t input); 87fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t initStreamVolume(audio_stream_type_t stream, 8865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int indexMin, 8965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int indexMax); 9083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 9183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int index, 9283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device); 9383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 9483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int *index, 9583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device); 9665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 97fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual uint32_t getStrategyForStream(audio_stream_type_t stream); 98fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual uint32_t getDevicesForStream(audio_stream_type_t stream); 99de070137f11d346fba77605bd76a44c040a618fcEric Laurent 100de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual audio_io_handle_t getOutputForEffect(effect_descriptor_t *desc); 101de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t registerEffect(effect_descriptor_t *desc, 1027c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io, 103de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy, 104de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session, 105de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id); 106de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t unregisterEffect(int id); 107db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent virtual status_t setEffectEnabled(int id, bool enabled); 108fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const; 109de070137f11d346fba77605bd76a44c040a618fcEric Laurent 11057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent virtual status_t queryDefaultPreProcessing(int audioSession, 11157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent effect_descriptor_t *descriptors, 11257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t *count); 11365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t onTransact( 11465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t code, 11565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const Parcel& data, 11665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Parcel* reply, 11765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t flags); 11865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 11965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // IBinder::DeathRecipient 12065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void binderDied(const wp<IBinder>& who); 12165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 12265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // 123fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin // Helpers for the struct audio_policy_service_ops implementation. 124fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin // This is used by the audio policy manager for certain operations that 125fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin // are implemented by the policy service. 12665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // 127fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual void setParameters(audio_io_handle_t ioHandle, 128fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin const char *keyValuePairs, 129fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin int delayMs); 130fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 131fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t setStreamVolume(audio_stream_type_t stream, 132de070137f11d346fba77605bd76a44c040a618fcEric Laurent float volume, 133de070137f11d346fba77605bd76a44c040a618fcEric Laurent audio_io_handle_t output, 134de070137f11d346fba77605bd76a44c040a618fcEric Laurent int delayMs = 0); 135fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t startTone(audio_policy_tone_t tone, audio_stream_type_t stream); 13665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t stopTone(); 13765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t setVoiceVolume(float volume, int delayMs = 0); 13865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 13965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprivate: 14065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AudioPolicyService(); 14165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual ~AudioPolicyService(); 14265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 14365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian status_t dumpInternals(int fd); 14465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 14565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Thread used for tone playback and to send audio config commands to audio flinger 14665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // For tone playback, using a separate thread is necessary to avoid deadlock with mLock because startTone() 14765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // and stopTone() are normally called with mLock locked and requesting a tone start or stop will cause 14865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // calls to AudioPolicyService and an attempt to lock mLock. 14965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // For audio config commands, it is necessary because audio flinger requires that the calling process (user) 15065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // has permission to modify audio settings. 15165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian class AudioCommandThread : public Thread { 15265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian class AudioCommand; 15365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public: 15465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 15565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // commands for tone AudioCommand 15665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian enum { 15765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian START_TONE, 15865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian STOP_TONE, 15965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian SET_VOLUME, 16065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian SET_PARAMETERS, 16165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian SET_VOICE_VOLUME 16265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 16365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 16465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AudioCommandThread (String8 name); 16565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual ~AudioCommandThread(); 16665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 16765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian status_t dump(int fd); 16865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 16965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Thread virtuals 17065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void onFirstRef(); 17165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual bool threadLoop(); 17265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 17365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void exit(); 1743d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten void startToneCommand(ToneGenerator::tone_type type, 1753d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten audio_stream_type_t stream); 17665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void stopToneCommand(); 17772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten status_t volumeCommand(audio_stream_type_t stream, float volume, 17872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, int delayMs = 0); 17972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten status_t parametersCommand(audio_io_handle_t ioHandle, 18072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten const char *keyValuePairs, int delayMs = 0); 18165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian status_t voiceVolumeCommand(float volume, int delayMs = 0); 18265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void insertCommand_l(AudioCommand *command, int delayMs = 0); 18365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 18465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian private: 18565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // descriptor for requested tone playback event 18665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian class AudioCommand { 18765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 18865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public: 18965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AudioCommand() 19065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian : mCommand(-1) {} 19165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 19265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void dump(char* buffer, size_t size); 19365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 19465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int mCommand; // START_TONE, STOP_TONE ... 19565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian nsecs_t mTime; // time stamp 19665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Condition mCond; // condition for status return 19765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian status_t mStatus; // command status 19865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian bool mWaitStatus; // true if caller is waiting for status 19965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void *mParam; // command parameter (ToneData, VolumeData, ParametersData) 20065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 20165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 20265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian class ToneData { 20365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public: 2043d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten ToneGenerator::tone_type mType; // tone type (START_TONE only) 205fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t mStream; // stream type (START_TONE only) 20665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 20765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 20865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian class VolumeData { 20965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public: 210fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t mStream; 21165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian float mVolume; 21272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t mIO; 21365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 21465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 21565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian class ParametersData { 21665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public: 21772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t mIO; 21865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian String8 mKeyValuePairs; 21965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 22065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 22165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian class VoiceVolumeData { 22265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public: 22365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian float mVolume; 22465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 22565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 22665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex mLock; 22765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Condition mWaitWorkCV; 22865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Vector <AudioCommand *> mAudioCommands; // list of pending commands 22965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ToneGenerator *mpToneGenerator; // the tone generator 23065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AudioCommand mLastCommand; // last processed command (used by dump) 23165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian String8 mName; // string used by wake lock fo delayed commands 23265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 23365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 2347c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent class EffectDesc { 2357c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent public: 2369fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten EffectDesc(const char *name, const effect_uuid_t& uuid) : 2379fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten mName(strdup(name)), 2389fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten mUuid(uuid) { } 2399fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten EffectDesc(const EffectDesc& orig) : 2409fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten mName(strdup(orig.mName)), 2419fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten mUuid(orig.mUuid) { 2429fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten // deep copy mParams 2439fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten for (size_t k = 0; k < orig.mParams.size(); k++) { 2449fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten effect_param_t *origParam = orig.mParams[k]; 2459fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten // psize and vsize are rounded up to an int boundary for allocation 2469fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten size_t origSize = sizeof(effect_param_t) + 2479fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten ((origParam->psize + 3) & ~3) + 2489fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten ((origParam->vsize + 3) & ~3); 2499fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten effect_param_t *dupParam = (effect_param_t *) malloc(origSize); 2509fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten memcpy(dupParam, origParam, origSize); 2519fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten // This works because the param buffer allocation is also done by 2529fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten // multiples of 4 bytes originally. In theory we should memcpy only 2539fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten // the actual param size, that is without rounding vsize. 2549fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten mParams.add(dupParam); 2559fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten } 2569fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten } 2579fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten /*virtual*/ ~EffectDesc() { 2589fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten free(mName); 2599fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten for (size_t k = 0; k < mParams.size(); k++) { 2609fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten free(mParams[k]); 2619fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten } 2629fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten } 2637c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent char *mName; 2647c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent effect_uuid_t mUuid; 2657c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent Vector <effect_param_t *> mParams; 2667c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent }; 2677c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent 2687c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent class InputSourceDesc { 2697c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent public: 2707c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent InputSourceDesc() {} 2719fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten /*virtual*/ ~InputSourceDesc() { 2729fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten for (size_t j = 0; j < mEffects.size(); j++) { 2739fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten delete mEffects[j]; 2749fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten } 2759fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten } 2767c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent Vector <EffectDesc *> mEffects; 2777c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent }; 2787c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent 2797c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent 2807c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent class InputDesc { 2817c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent public: 2827c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent InputDesc() {} 2837c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent virtual ~InputDesc() {} 2847c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent int mSessionId; 2857c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent Vector< sp<AudioEffect> >mEffects; 2867c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent }; 2877c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent 2888dad0e31c2366c501bd1d600261d0af35a6ca786Glenn Kasten static const char * const kInputSourceNames[AUDIO_SOURCE_CNT -1]; 2897c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent 2907c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent void setPreProcessorEnabled(InputDesc *inputDesc, bool enabled); 2917c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent status_t loadPreProcessorConfig(const char *path); 2927c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent status_t loadEffects(cnode *root, Vector <EffectDesc *>& effects); 2937c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent EffectDesc *loadEffect(cnode *root); 2947c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent status_t loadInputSources(cnode *root, const Vector <EffectDesc *>& effects); 2957c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_source_t inputSourceNameToEnum(const char *name); 2967c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent InputSourceDesc *loadInputSource(cnode *root, const Vector <EffectDesc *>& effects); 2977c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent void loadEffectParameters(cnode *root, Vector <effect_param_t *>& params); 2987c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent effect_param_t *loadEffectParameter(cnode *root); 2997c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent size_t readParamValue(cnode *node, 3007c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent char *param, 3017c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent size_t *curSize, 3027c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent size_t *totSize); 3037c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent size_t growParamSize(char *param, 3047c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent size_t size, 3057c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent size_t *curSize, 3067c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent size_t *totSize); 3077c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent 30865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Internal dump utilities. 30965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian status_t dumpPermissionDenial(int fd); 31065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 31165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 312eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent mutable Mutex mLock; // prevents concurrent access to AudioPolicy manager functions changing 313eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent // device connection state or routing 31465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp <AudioCommandThread> mAudioCommandThread; // audio commands thread 31565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp <AudioCommandThread> mTonePlaybackThread; // tone playback thread 316fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin struct audio_policy_device *mpAudioPolicyDev; 317fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin struct audio_policy *mpAudioPolicy; 3187c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent KeyedVector< audio_source_t, InputSourceDesc* > mInputSources; 3197c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent KeyedVector< audio_io_handle_t, InputDesc* > mInputs; 32065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 32165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 32265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; // namespace android 32365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 32465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#endif // ANDROID_AUDIOPOLICYSERVICE_H 325