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