AudioPolicyManager.h revision eb108a4622825688b02d7afc981014d149913cd8
1391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt/*
2391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt * Copyright (C) 2009 The Android Open Source Project
3391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt *
4391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt * Licensed under the Apache License, Version 2.0 (the "License");
5391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt * you may not use this file except in compliance with the License.
6391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt * You may obtain a copy of the License at
7391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt *
8391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt *      http://www.apache.org/licenses/LICENSE-2.0
9391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt *
10391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt * Unless required by applicable law or agreed to in writing, software
11391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt * distributed under the License is distributed on an "AS IS" BASIS,
12391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt * See the License for the specific language governing permissions and
14391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt * limitations under the License.
15391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt */
16cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
17391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
18391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#include <stdint.h>
19391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#include <sys/types.h>
20391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#include <cutils/config_utils.h>
21391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#include <cutils/misc.h>
22391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#include <utils/Timers.h>
23391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#include <utils/Errors.h>
24391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#include <utils/KeyedVector.h>
25391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#include <utils/SortedVector.h>
26391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#include "AudioPolicyInterface.h"
27391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
28391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
29391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtnamespace android {
30391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
31391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt// ----------------------------------------------------------------------------
32391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
33391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt// Attenuation applied to STRATEGY_SONIFICATION streams when a headset is connected: 6dB
34391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#define SONIFICATION_HEADSET_VOLUME_FACTOR 0.5
35391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt// Min volume for STRATEGY_SONIFICATION streams when limited by music volume: -36dB
36391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#define SONIFICATION_HEADSET_VOLUME_MIN  0.016
37391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt// Time in milliseconds during which we consider that music is still active after a music
38391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt// track was stopped - see computeVolume()
39391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#define SONIFICATION_HEADSET_MUSIC_DELAY  5000
40391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt// Time in milliseconds after media stopped playing during which we consider that the
41391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt// sonification should be as unobtrusive as during the time media was playing.
42391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#define SONIFICATION_RESPECTFUL_AFTER_MUSIC_DELAY 5000
43391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt// Time in milliseconds during witch some streams are muted while the audio path
44391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt// is switched
45391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#define MUTE_TIME_MS 2000
46391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
47391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#define NUM_TEST_OUTPUTS 5
48391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
49391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#define NUM_VOL_CURVE_KNEES 2
50391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
51391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt// Default minimum length allowed for offloading a compressed track
52391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt// Can be overridden by the audio.offload.min.duration.secs property
53391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#define OFFLOAD_DEFAULT_MIN_DURATION_SECS 60
54391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
55391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt// ----------------------------------------------------------------------------
56391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt// AudioPolicyManager implements audio policy manager behavior common to all platforms.
57391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt// ----------------------------------------------------------------------------
58391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
59391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtclass AudioPolicyManager: public AudioPolicyInterface
60391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#ifdef AUDIO_POLICY_TEST
61391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt    , public Thread
62391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#endif //AUDIO_POLICY_TEST
63391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt{
64391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
65391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtpublic:
66391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                AudioPolicyManager(AudioPolicyClientInterface *clientInterface);
67391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual ~AudioPolicyManager();
68391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
69391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // AudioPolicyInterface
70391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t setDeviceConnectionState(audio_devices_t device,
71391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                                          audio_policy_dev_state_t state,
72391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                                          const char *device_address);
73391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual audio_policy_dev_state_t getDeviceConnectionState(audio_devices_t device,
74391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                                                              const char *device_address);
75391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual void setPhoneState(audio_mode_t state);
76391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual void setForceUse(audio_policy_force_use_t usage,
77391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                 audio_policy_forced_cfg_t config);
78391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage);
79391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual void setSystemProperty(const char* property, const char* value);
80391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t initCheck();
81391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual audio_io_handle_t getOutput(audio_stream_type_t stream,
82391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                            uint32_t samplingRate,
83391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                            audio_format_t format,
84391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                            audio_channel_mask_t channelMask,
85391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                            audio_output_flags_t flags,
86391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                            const audio_offload_info_t *offloadInfo);
87391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t startOutput(audio_io_handle_t output,
88391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                     audio_stream_type_t stream,
89391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                     int session = 0);
90391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t stopOutput(audio_io_handle_t output,
91391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                    audio_stream_type_t stream,
92391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                    int session = 0);
93391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual void releaseOutput(audio_io_handle_t output);
94391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual audio_io_handle_t getInput(audio_source_t inputSource,
95391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                            uint32_t samplingRate,
96391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                            audio_format_t format,
97391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                            audio_channel_mask_t channelMask,
98391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                            audio_in_acoustics_t acoustics);
99391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
100391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // indicates to the audio policy manager that the input starts being used.
101391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t startInput(audio_io_handle_t input);
102391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
103391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // indicates to the audio policy manager that the input stops being used.
104391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t stopInput(audio_io_handle_t input);
105391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual void releaseInput(audio_io_handle_t input);
106391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual void closeAllInputs();
107391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual void initStreamVolume(audio_stream_type_t stream,
108391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                                    int indexMin,
109391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                                    int indexMax);
110391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
111391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                              int index,
112391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                              audio_devices_t device);
113391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
114391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                              int *index,
115391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                              audio_devices_t device);
116391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
117391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // return the strategy corresponding to a given stream type
118391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual uint32_t getStrategyForStream(audio_stream_type_t stream);
119391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
120391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // return the enabled output devices for the given stream type
121391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream);
122391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
123391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc = NULL);
124391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t registerEffect(const effect_descriptor_t *desc,
125391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                        audio_io_handle_t io,
126391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                        uint32_t strategy,
127391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                        int session,
128391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                        int id);
129391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t unregisterEffect(int id);
130391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t setEffectEnabled(int id, bool enabled);
131391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
132391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const;
133391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // return whether a stream is playing remotely, override to change the definition of
134391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        //   local/remote playback, used for instance by notification manager to not make
135391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        //   media players lose audio focus when not playing locally
136391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs = 0) const;
137391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual bool isSourceActive(audio_source_t source) const;
138391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
139391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t dump(int fd);
140391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
141391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual bool isOffloadSupported(const audio_offload_info_t& offloadInfo);
142391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
143391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t listAudioPorts(audio_port_role_t role,
144391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                        audio_port_type_t type,
145391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                        unsigned int *num_ports,
146391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                        struct audio_port *ports,
147391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                        unsigned int *generation);
148391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t getAudioPort(struct audio_port *port);
149391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t createAudioPatch(const struct audio_patch *patch,
150391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                           audio_patch_handle_t *handle,
151391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                           uid_t uid);
152391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t releaseAudioPatch(audio_patch_handle_t handle,
153391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                              uid_t uid);
154391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t listAudioPatches(unsigned int *num_patches,
155391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                          struct audio_patch *patches,
156391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                          unsigned int *generation);
157391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual status_t setAudioPortConfig(const struct audio_port_config *config);
158391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual void clearAudioPatches(uid_t uid);
159391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
160391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtprotected:
161391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
162391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        enum routing_strategy {
163391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            STRATEGY_MEDIA,
164391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            STRATEGY_PHONE,
165391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            STRATEGY_SONIFICATION,
166391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            STRATEGY_SONIFICATION_RESPECTFUL,
167391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            STRATEGY_DTMF,
168391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            STRATEGY_ENFORCED_AUDIBLE,
169391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            NUM_STRATEGIES
170391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
171391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
172391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // 4 points to define the volume attenuation curve, each characterized by the volume
173391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // index (from 0 to 100) at which they apply, and the attenuation in dB at that index.
174391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // we use 100 steps to avoid rounding errors when computing the volume in volIndexToAmpl()
175391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
176391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        enum { VOLMIN = 0, VOLKNEE1 = 1, VOLKNEE2 = 2, VOLMAX = 3, VOLCNT = 4};
177391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
178391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        class VolumeCurvePoint
179391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        {
180391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        public:
181391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            int mIndex;
182391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            float mDBAttenuation;
183391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
184391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
185391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // device categories used for volume curve management.
186391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        enum device_category {
187391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            DEVICE_CATEGORY_HEADSET,
188391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            DEVICE_CATEGORY_SPEAKER,
189391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            DEVICE_CATEGORY_EARPIECE,
190391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            DEVICE_CATEGORY_CNT
191391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
192391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
193391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        class HwModule;
194391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
195391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        class AudioGain: public RefBase
196391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        {
197391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        public:
198391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            AudioGain(int index, bool useInChannelMask);
199391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            virtual ~AudioGain() {}
200391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
201391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void dump(int fd, int spaces, int index) const;
202391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
203391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void getDefaultConfig(struct audio_gain_config *config);
204391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            status_t checkConfig(const struct audio_gain_config *config);
205391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            int               mIndex;
206391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            struct audio_gain mGain;
207391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            bool              mUseInChannelMask;
208391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
209391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
210391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        class AudioPort: public virtual RefBase
211391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        {
212391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        public:
213391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            AudioPort(const String8& name, audio_port_type_t type,
214391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                      audio_port_role_t role, const sp<HwModule>& module);
215391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            virtual ~AudioPort() {}
216391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
217391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            virtual void toAudioPort(struct audio_port *port) const;
218391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
219391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void loadSamplingRates(char *name);
220391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void loadFormats(char *name);
221391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void loadOutChannels(char *name);
222391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void loadInChannels(char *name);
223391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
224391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_gain_mode_t loadGainMode(char *name);
225391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void loadGain(cnode *root, int index);
226391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void loadGains(cnode *root);
227391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
228391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            status_t checkSamplingRate(uint32_t samplingRate) const;
229391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            status_t checkChannelMask(audio_channel_mask_t channelMask) const;
230391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            status_t checkFormat(audio_format_t format) const;
231391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            status_t checkGain(const struct audio_gain_config *gainConfig, int index) const;
232391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
233391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void dump(int fd, int spaces) const;
234391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
235391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            String8           mName;
236391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_port_type_t mType;
237391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_port_role_t mRole;
238391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            bool              mUseInChannelMask;
239391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            // by convention, "0' in the first entry in mSamplingRates, mChannelMasks or mFormats
240391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            // indicates the supported parameters should be read from the output stream
241391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            // after it is opened for the first time
242391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            Vector <uint32_t> mSamplingRates; // supported sampling rates
243391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            Vector <audio_channel_mask_t> mChannelMasks; // supported channel masks
244391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            Vector <audio_format_t> mFormats; // supported audio formats
245391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            Vector < sp<AudioGain> > mGains; // gain controllers
246391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            sp<HwModule> mModule;                 // audio HW module exposing this I/O stream
247391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
248391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
249391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        class AudioPortConfig: public virtual RefBase
250391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        {
251391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        public:
252391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            AudioPortConfig();
253391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            virtual ~AudioPortConfig() {}
254391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
255391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            status_t applyAudioPortConfig(const struct audio_port_config *config,
256391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                          struct audio_port_config *backupConfig = NULL);
257391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            virtual void toAudioPortConfig(struct audio_port_config *dstConfig,
258391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                   const struct audio_port_config *srcConfig = NULL) const = 0;
259391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            sp<AudioPort> mAudioPort;
260391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            uint32_t mSamplingRate;
261391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_format_t mFormat;
262391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_channel_mask_t mChannelMask;
263391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            struct audio_gain_config mGain;
264391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
265391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
266391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
267391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        class AudioPatch: public RefBase
268391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        {
269391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        public:
270391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            AudioPatch(audio_patch_handle_t handle,
271391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                       const struct audio_patch *patch, uid_t uid) :
272391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                           mHandle(handle), mPatch(*patch), mUid(uid), mAfPatchHandle(0) {}
273391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
274391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_patch_handle_t mHandle;
275391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            struct audio_patch mPatch;
276391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            uid_t mUid;
277391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_patch_handle_t mAfPatchHandle;
278391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
279391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
280391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        class DeviceDescriptor: public AudioPort, public AudioPortConfig
281391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        {
282391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        public:
283fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt            DeviceDescriptor(const String8& name, audio_devices_t type);
284391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
285391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            virtual ~DeviceDescriptor() {}
286391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2872ac5f6049e74103a8fe8e9c78b330020081d7df4Dmitry Shmidt            bool equals(const sp<DeviceDescriptor>& other) const;
288391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            virtual void toAudioPortConfig(struct audio_port_config *dstConfig,
289391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                   const struct audio_port_config *srcConfig = NULL) const;
290391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
291391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            virtual void toAudioPort(struct audio_port *port) const;
292391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
293391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            status_t dump(int fd, int spaces, int index) const;
294391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
295391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_devices_t mDeviceType;
296391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            String8 mAddress;
297391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_channel_mask_t mChannelMask;
298391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_port_handle_t mId;
299391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
300391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
301391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        class DeviceVector : public SortedVector< sp<DeviceDescriptor> >
302391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        {
303391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        public:
304391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            DeviceVector() : SortedVector(), mDeviceTypes(AUDIO_DEVICE_NONE) {}
305391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
306391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            ssize_t         add(const sp<DeviceDescriptor>& item);
307391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            ssize_t         remove(const sp<DeviceDescriptor>& item);
308391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            ssize_t         indexOf(const sp<DeviceDescriptor>& item) const;
309391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
310391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_devices_t types() const { return mDeviceTypes; }
311391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
312391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void loadDevicesFromType(audio_devices_t types);
313391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void loadDevicesFromName(char *name, const DeviceVector& declaredDevices);
314391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
315391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            sp<DeviceDescriptor> getDevice(audio_devices_t type, String8 address) const;
316391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            DeviceVector getDevicesFromType(audio_devices_t types) const;
317391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            sp<DeviceDescriptor> getDeviceFromId(audio_port_handle_t id) const;
318391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            sp<DeviceDescriptor> getDeviceFromName(const String8& name) const;
319391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
320391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        private:
321391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void refreshTypes();
322391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_devices_t mDeviceTypes;
323391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
324391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
325391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // the IOProfile class describes the capabilities of an output or input stream.
326391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // It is currently assumed that all combination of listed parameters are supported.
327391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // It is used by the policy manager to determine if an output or input is suitable for
328391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // a given use case,  open/close it accordingly and connect/disconnect audio tracks
329391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // to/from it.
330391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        class IOProfile : public AudioPort
331391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        {
332391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        public:
333391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            IOProfile(const String8& name, audio_port_role_t role, const sp<HwModule>& module);
334391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            virtual ~IOProfile();
335391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
336391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            bool isCompatibleProfile(audio_devices_t device,
337391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                     uint32_t samplingRate,
338391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                     audio_format_t format,
339391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                     audio_channel_mask_t channelMask,
340391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                     audio_output_flags_t flags) const;
341391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
342391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void dump(int fd);
343391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void log();
344391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
345391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            DeviceVector  mSupportedDevices; // supported devices
346391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                             // (devices this output can be routed to)
347391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_output_flags_t mFlags; // attribute flags (e.g primary output,
348391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                                // direct output...). For outputs only.
349391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
350391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
351391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        class HwModule : public RefBase{
352391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        public:
353391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                    HwModule(const char *name);
354391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                    ~HwModule();
355391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
356391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            status_t loadOutput(cnode *root);
357391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            status_t loadInput(cnode *root);
358391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            status_t loadDevice(cnode *root);
359391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
360391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void dump(int fd);
361391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
362391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            const char *const        mName; // base name of the audio HW module (primary, a2dp ...)
36368d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt            uint32_t                 mHalVersion; // audio HAL API version
364391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_module_handle_t    mHandle;
365391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            Vector < sp<IOProfile> > mOutputProfiles; // output profiles exposed by this module
366391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            Vector < sp<IOProfile> > mInputProfiles;  // input profiles exposed by this module
367391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            DeviceVector             mDeclaredDevices; // devices declared in audio_policy.conf
368391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
369391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
370391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
371a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        // default volume curve
372a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        static const VolumeCurvePoint sDefaultVolumeCurve[AudioPolicyManager::VOLCNT];
373a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        // default volume curve for media strategy
374a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        static const VolumeCurvePoint sDefaultMediaVolumeCurve[AudioPolicyManager::VOLCNT];
375a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        // volume curve for media strategy on speakers
376a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        static const VolumeCurvePoint sSpeakerMediaVolumeCurve[AudioPolicyManager::VOLCNT];
377a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        // volume curve for sonification strategy on speakers
378a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        static const VolumeCurvePoint sSpeakerSonificationVolumeCurve[AudioPolicyManager::VOLCNT];
379a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        static const VolumeCurvePoint sSpeakerSonificationVolumeCurveDrc[AudioPolicyManager::VOLCNT];
380a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        static const VolumeCurvePoint sDefaultSystemVolumeCurve[AudioPolicyManager::VOLCNT];
381a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        static const VolumeCurvePoint sDefaultSystemVolumeCurveDrc[AudioPolicyManager::VOLCNT];
382a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        static const VolumeCurvePoint sHeadsetSystemVolumeCurve[AudioPolicyManager::VOLCNT];
383a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        static const VolumeCurvePoint sDefaultVoiceVolumeCurve[AudioPolicyManager::VOLCNT];
384391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        static const VolumeCurvePoint sSpeakerVoiceVolumeCurve[AudioPolicyManager::VOLCNT];
385391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // default volume curves per stream and device category. See initializeVolumeCurves()
386391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        static const VolumeCurvePoint *sVolumeProfiles[AUDIO_STREAM_CNT][DEVICE_CATEGORY_CNT];
387391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
388391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // descriptor for audio outputs. Used to maintain current configuration of each opened audio output
389391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // and keep track of the usage of this output by each audio stream type.
390391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        class AudioOutputDescriptor: public AudioPortConfig
391391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        {
392391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        public:
393391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            AudioOutputDescriptor(const sp<IOProfile>& profile);
394391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
395391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            status_t    dump(int fd);
396391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
397391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_devices_t device() const;
398391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void changeRefCount(audio_stream_type_t stream, int delta);
399391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
400391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            bool isDuplicated() const { return (mOutput1 != NULL && mOutput2 != NULL); }
401391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            audio_devices_t supportedDevices();
402391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            uint32_t latency();
403391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            bool sharesHwModuleWith(const sp<AudioOutputDescriptor> outputDesc);
404391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            bool isActive(uint32_t inPastMs = 0) const;
405391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            bool isStreamActive(audio_stream_type_t stream,
4064ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt                                uint32_t inPastMs = 0,
4074ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt                                nsecs_t sysTime = 0) const;
4084ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            bool isStrategyActive(routing_strategy strategy,
4094ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt                             uint32_t inPastMs = 0,
4104ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt                             nsecs_t sysTime = 0) const;
4114ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
4124ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            virtual void toAudioPortConfig(struct audio_port_config *dstConfig,
4134ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt                                   const struct audio_port_config *srcConfig = NULL) const;
4144ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            void toAudioPort(struct audio_port *port) const;
4154ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
4164ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            audio_port_handle_t mId;
4174ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            audio_io_handle_t mIoHandle;              // output handle
4184ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            uint32_t mLatency;                  //
4194ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            audio_output_flags_t mFlags;   //
4204ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            audio_devices_t mDevice;                   // current device this output is routed to
4214ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            audio_patch_handle_t mPatchHandle;
4224ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            uint32_t mRefCount[AUDIO_STREAM_CNT]; // number of streams of each type using this output
4234ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            nsecs_t mStopTime[AUDIO_STREAM_CNT];
424391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            sp<AudioOutputDescriptor> mOutput1;    // used by duplicated outputs: first output
425391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            sp<AudioOutputDescriptor> mOutput2;    // used by duplicated outputs: second output
426391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            float mCurVolume[AUDIO_STREAM_CNT];   // current stream volume
427391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            int mMuteCount[AUDIO_STREAM_CNT];     // mute request counter
4284ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            const sp<IOProfile> mProfile;          // I/O profile this output derives from
429391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            bool mStrategyMutedByDevice[NUM_STRATEGIES]; // strategies muted because of incompatible
430391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                                // device selection. See checkDeviceMuteStrategies()
431391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            uint32_t mDirectOpenCount; // number of clients using this output (direct outputs only)
432391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
433391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
434391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // descriptor for audio inputs. Used to maintain current configuration of each opened audio input
4354ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        // and keep track of the usage of this input.
4364ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        class AudioInputDescriptor: public AudioPortConfig
4374ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        {
4384ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        public:
439391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            AudioInputDescriptor(const sp<IOProfile>& profile);
440391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
4414ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            status_t    dump(int fd);
4424ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
4434ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            audio_port_handle_t mId;
4444ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            audio_io_handle_t mIoHandle;              // input handle
4454ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            audio_devices_t mDevice;                    // current device this input is routed to
4464ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            audio_patch_handle_t mPatchHandle;
4474ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            uint32_t mRefCount;                         // number of AudioRecord clients using this output
4484ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            audio_source_t mInputSource;                // input source selected by application (mediarecorder.h)
4494ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            const sp<IOProfile> mProfile;                  // I/O profile this output derives from
4504ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
4514ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            virtual void toAudioPortConfig(struct audio_port_config *dstConfig,
4524ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt                                   const struct audio_port_config *srcConfig = NULL) const;
4534ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt            void toAudioPort(struct audio_port *port) const;
454391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
455391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
456391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // stream descriptor used for volume control
457391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        class StreamDescriptor
458391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        {
459391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        public:
460391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            StreamDescriptor();
461391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
462391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            int getVolumeIndex(audio_devices_t device);
463391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            void dump(int fd);
464391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
465391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            int mIndexMin;      // min volume index
466391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            int mIndexMax;      // max volume index
467391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            KeyedVector<audio_devices_t, int> mIndexCur;   // current volume index per device
468391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            bool mCanBeMuted;   // true is the stream can be muted
469391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
470391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            const VolumeCurvePoint *mVolumeCurve[DEVICE_CATEGORY_CNT];
471391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
472391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
473391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // stream descriptor used for volume control
474391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        class EffectDescriptor : public RefBase
475391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        {
476391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        public:
477391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
478391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            status_t dump(int fd);
479391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
480391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            int mIo;                // io the effect is attached to
481391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            routing_strategy mStrategy; // routing strategy the effect is associated to
482391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            int mSession;               // audio session the effect is on
483391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            effect_descriptor_t mDesc;  // effect descriptor
484391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt            bool mEnabled;              // enabled state: CPU load being used or not
485391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        };
486391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
487391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void addOutput(audio_io_handle_t output, sp<AudioOutputDescriptor> outputDesc);
488391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void addInput(audio_io_handle_t input, sp<AudioInputDescriptor> inputDesc);
489391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
4904ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        // return the strategy corresponding to a given stream type
491391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        static routing_strategy getStrategy(audio_stream_type_t stream);
492391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
493391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // return appropriate device for streams handled by the specified strategy according to current
494391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // phone state, connected devices...
495391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // if fromCache is true, the device is returned from mDeviceForStrategy[],
496391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // otherwise it is determine by current state
497391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // (device connected,phone state, force use, a2dp output...)
498391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // This allows to:
499391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        //  1 speed up process when the state is stable (when starting or stopping an output)
500391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        //  2 access to either current device selection (fromCache == true) or
501391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // "future" device selection (fromCache == false) when called from a context
502391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        //  where conditions are changing (setDeviceConnectionState(), setPhoneState()...) AND
503391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        //  before updateDevicesAndOutputs() is called.
504391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual audio_devices_t getDeviceForStrategy(routing_strategy strategy,
505391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                                     bool fromCache);
506391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
507391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // change the route of the specified output. Returns the number of ms we have slept to
508391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // allow new routing to take effect in certain cases.
509391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        uint32_t setOutputDevice(audio_io_handle_t output,
5104ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt                             audio_devices_t device,
5114ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt                             bool force = false,
512391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                             int delayMs = 0,
513391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                             audio_patch_handle_t *patchHandle = NULL);
514391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        status_t resetOutputDevice(audio_io_handle_t output,
515391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                   int delayMs = 0,
516391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                   audio_patch_handle_t *patchHandle = NULL);
517391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        status_t setInputDevice(audio_io_handle_t input,
518391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                audio_devices_t device,
519391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                bool force = false,
520391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                audio_patch_handle_t *patchHandle = NULL);
521391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        status_t resetInputDevice(audio_io_handle_t input,
522391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                  audio_patch_handle_t *patchHandle = NULL);
523391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
524391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // select input device corresponding to requested audio source
525391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual audio_devices_t getDeviceForInputSource(audio_source_t inputSource);
526391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
527391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // return io handle of active input or 0 if no input is active
528391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        //    Only considers inputs from physical devices (e.g. main mic, headset mic) when
529391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        //    ignoreVirtualInputs is true.
530391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        audio_io_handle_t getActiveInput(bool ignoreVirtualInputs = true);
531391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
532391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // initialize volume curves for each strategy and device category
533391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void initializeVolumeCurves();
534391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
535391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // compute the actual volume for a given stream according to the requested index and a particular
536391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // device
537391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual float computeVolume(audio_stream_type_t stream, int index,
538391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                    audio_io_handle_t output, audio_devices_t device);
539391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
540391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // check that volume change is permitted, compute and send new volume to audio hardware
541391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        status_t checkAndSetVolume(audio_stream_type_t stream, int index, audio_io_handle_t output,
542391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                   audio_devices_t device, int delayMs = 0, bool force = false);
5434ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
544391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // apply all stream volumes to the specified output and device
545391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void applyStreamVolumes(audio_io_handle_t output, audio_devices_t device, int delayMs = 0, bool force = false);
5464ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
547391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // Mute or unmute all streams handled by the specified strategy on the specified output
548391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void setStrategyMute(routing_strategy strategy,
549391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                             bool on,
550391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                             audio_io_handle_t output,
551391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                             int delayMs = 0,
552391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                             audio_devices_t device = (audio_devices_t)0);
553391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
554391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // Mute or unmute the stream on the specified output
555391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void setStreamMute(audio_stream_type_t stream,
556391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                           bool on,
557391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                           audio_io_handle_t output,
558a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt                           int delayMs = 0,
559a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt                           audio_devices_t device = (audio_devices_t)0);
560a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt
561a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        // handle special cases for sonification strategy while in call: mute streams or replace by
562a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        // a special tone in the device used for communication
563a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        void handleIncallSonification(audio_stream_type_t stream, bool starting, bool stateChange);
564a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt
565a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        // true if device is in a telephony or VoIP call
566a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt        virtual bool isInCall();
5674ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
5684ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        // true if given state represents a device in a telephony or VoIP call
5694ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        virtual bool isStateInCall(int state);
570391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
571391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // when a device is connected, checks if an open output can be routed
572391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // to this device. If none is open, tries to open one of the available outputs.
573391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // Returns an output suitable to this device or 0.
574391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // when a device is disconnected, checks if an output is not used any more and
575391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // returns its handle if any.
5764ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        // transfers the audio tracks and effects from one output thread to another accordingly.
5774ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        status_t checkOutputsForDevice(audio_devices_t device,
578391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                       audio_policy_dev_state_t state,
579391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                       SortedVector<audio_io_handle_t>& outputs,
580391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                       const String8 address);
581391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
582391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        status_t checkInputsForDevice(audio_devices_t device,
583391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                      audio_policy_dev_state_t state,
584391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                      SortedVector<audio_io_handle_t>& inputs,
585391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                      const String8 address);
586391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
587391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // close an output and its companion duplicating output.
588391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void closeOutput(audio_io_handle_t output);
589391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
590391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // checks and if necessary changes outputs used for all strategies.
591391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // must be called every time a condition that affects the output choice for a given strategy
592391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // changes: connected device, phone state, force use...
593391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // Must be called before updateDevicesAndOutputs()
594391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void checkOutputForStrategy(routing_strategy strategy);
595391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
5964ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        // Same as checkOutputForStrategy() but for a all strategies in order of priority
597391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void checkOutputForAllStrategies();
598391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
599391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // manages A2DP output suspend/restore according to phone state and BT SCO usage
600391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void checkA2dpSuspend();
6014ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
602391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // returns the A2DP output handle if it is open or 0 otherwise
603391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        audio_io_handle_t getA2dpOutput();
604391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
605391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // selects the most appropriate device on output for current state
6064ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        // must be called every time a condition that affects the device choice for a given output is
607391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // changed: connected device, phone state, force use, output start, output stop..
608391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // see getDeviceForStrategy() for the use of fromCache parameter
609391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        audio_devices_t getNewOutputDevice(audio_io_handle_t output, bool fromCache);
610391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
6114ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        // updates cache of device used by all strategies (mDeviceForStrategy[])
612391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // must be called every time a condition that affects the device choice for a given strategy is
613391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // changed: connected device, phone state, force use...
614391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // cached values are used by getDeviceForStrategy() if parameter fromCache is true.
615391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt         // Must be called after checkOutputForAllStrategies()
616391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void updateDevicesAndOutputs();
617391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
618391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // selects the most appropriate device on input for current state
6194ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        audio_devices_t getNewInputDevice(audio_io_handle_t input);
6204ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
621391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual uint32_t getMaxEffectsCpuLoad();
622391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        virtual uint32_t getMaxEffectsMemory();
623391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#ifdef AUDIO_POLICY_TEST
6244ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        virtual     bool        threadLoop();
6254ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt                    void        exit();
6264ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        int testOutputIndex(audio_io_handle_t output);
6274ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt#endif //AUDIO_POLICY_TEST
628391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
629391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        status_t setEffectEnabled(const sp<EffectDescriptor>& effectDesc, bool enabled);
6304ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
631391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // returns the category the device belongs to with regard to volume curve management
632391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        static device_category getDeviceCategory(audio_devices_t device);
6334ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
6344ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        // extract one device relevant for volume control from multiple device selection
635391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        static audio_devices_t getDeviceForVolume(audio_devices_t device);
6364ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
637391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        SortedVector<audio_io_handle_t> getOutputsForDevice(audio_devices_t device,
638391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                        DefaultKeyedVector<audio_io_handle_t, sp<AudioOutputDescriptor> > openOutputs);
639391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        bool vectorsEqual(SortedVector<audio_io_handle_t>& outputs1,
640391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                           SortedVector<audio_io_handle_t>& outputs2);
641391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
642b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt        // mute/unmute strategies using an incompatible device combination
643b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt        // if muting, wait for the audio in pcm buffer to be drained before proceeding
644391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // if unmuting, unmute only after the specified delay
645391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // Returns the number of ms waited
646391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        uint32_t  checkDeviceMuteStrategies(sp<AudioOutputDescriptor> outputDesc,
647391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                            audio_devices_t prevDevice,
648b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt                                            uint32_t delayMs);
649391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
650391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        audio_io_handle_t selectOutput(const SortedVector<audio_io_handle_t>& outputs,
651b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt                                       audio_output_flags_t flags);
652391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        sp<IOProfile> getInputProfile(audio_devices_t device,
653391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                   uint32_t samplingRate,
654391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                   audio_format_t format,
655391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                   audio_channel_mask_t channelMask);
656391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        sp<IOProfile> getProfileForDirectOutput(audio_devices_t device,
657b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt                                                       uint32_t samplingRate,
658391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                                       audio_format_t format,
659b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt                                                       audio_channel_mask_t channelMask,
660b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt                                                       audio_output_flags_t flags);
661b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt
662391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        audio_io_handle_t selectOutputForEffects(const SortedVector<audio_io_handle_t>& outputs);
663391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
664391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        bool isNonOffloadableEffectEnabled();
665391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
666391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        status_t addAudioPatch(audio_patch_handle_t handle,
667391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                               const sp<AudioPatch>& patch);
668391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        status_t removeAudioPatch(audio_patch_handle_t handle);
669391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
670391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        sp<AudioOutputDescriptor> getOutputFromId(audio_port_handle_t id) const;
671391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        sp<AudioInputDescriptor> getInputFromId(audio_port_handle_t id) const;
672391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        sp<HwModule> getModuleForDevice(audio_devices_t device) const;
673391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        sp<HwModule> getModuleFromName(const char *name) const;
674391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        //
675391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // Audio policy configuration file parsing (audio_policy.conf)
676391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        //
677391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        static uint32_t stringToEnum(const struct StringToEnum *table,
678391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                     size_t size,
679391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                     const char *name);
680391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        static const char *enumToString(const struct StringToEnum *table,
681391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                      size_t size,
682391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                                      uint32_t value);
683391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        static bool stringToBool(const char *value);
684391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        static audio_output_flags_t parseFlagNames(char *name);
685391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        static audio_devices_t parseDeviceNames(char *name);
686391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void loadHwModule(cnode *root);
687391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void loadHwModules(cnode *root);
688391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void loadGlobalConfig(cnode *root, const sp<HwModule>& module);
689391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        status_t loadAudioPolicyConfig(const char *path);
690391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void defaultAudioPolicyConfig(void);
691391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
692391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
693391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        uid_t mUidCached;
694391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        AudioPolicyClientInterface *mpClientInterface;  // audio policy client interface
695391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        audio_io_handle_t mPrimaryOutput;              // primary output handle
696391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // list of descriptors for outputs currently opened
697391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        DefaultKeyedVector<audio_io_handle_t, sp<AudioOutputDescriptor> > mOutputs;
698391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // copy of mOutputs before setDeviceConnectionState() opens new outputs
699391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // reset to mOutputs when updateDevicesAndOutputs() is called.
700391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        DefaultKeyedVector<audio_io_handle_t, sp<AudioOutputDescriptor> > mPreviousOutputs;
701391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        DefaultKeyedVector<audio_io_handle_t, sp<AudioInputDescriptor> > mInputs;     // list of input descriptors
702391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        DeviceVector  mAvailableOutputDevices; // all available output devices
703391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        DeviceVector  mAvailableInputDevices;  // all available input devices
704391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        int mPhoneState;                                                    // current phone state
705391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        audio_policy_forced_cfg_t mForceUse[AUDIO_POLICY_FORCE_USE_CNT];   // current forced use configuration
706391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
707391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        StreamDescriptor mStreams[AUDIO_STREAM_CNT];           // stream descriptors for volume control
708391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        bool    mLimitRingtoneVolume;                                       // limit ringtone volume to music volume if headset connected
709391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        audio_devices_t mDeviceForStrategy[NUM_STRATEGIES];
710391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        float   mLastVoiceVolume;                                           // last voice volume value sent to audio HAL
711391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
712391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // Maximum CPU load allocated to audio effects in 0.1 MIPS (ARMv5TE, 0 WS memory) units
7134ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        static const uint32_t MAX_EFFECTS_CPU_LOAD = 1000;
714391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // Maximum memory allocated to audio effects in KB
715391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        static const uint32_t MAX_EFFECTS_MEMORY = 512;
716391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        uint32_t mTotalEffectsCpuLoad; // current CPU load used by effects
717391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        uint32_t mTotalEffectsMemory;  // current memory used by effects
718391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        KeyedVector<int, sp<EffectDescriptor> > mEffects;  // list of registered audio effects
719391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        bool    mA2dpSuspended;  // true if A2DP output is suspended
720391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        sp<DeviceDescriptor> mDefaultOutputDevice; // output device selected by default at boot time
721391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        bool mSpeakerDrcEnabled;// true on devices that use DRC on the DEVICE_CATEGORY_SPEAKER path
7224ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt                                // to boost soft sounds, used to adjust volume curves accordingly
7234ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
724391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        Vector < sp<HwModule> > mHwModules;
725391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        volatile int32_t mNextUniqueId;
726391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        volatile int32_t mAudioPortGeneration;
727391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
7284ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        DefaultKeyedVector<audio_patch_handle_t, sp<AudioPatch> > mAudioPatches;
729391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
730391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#ifdef AUDIO_POLICY_TEST
731391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        Mutex   mLock;
732391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        Condition mWaitWorkCV;
7334ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
7344ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        int             mCurOutput;
7354ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt        bool            mDirectOutput;
736391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        audio_io_handle_t mTestOutputs[NUM_TEST_OUTPUTS];
737391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        int             mTestInput;
738391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        uint32_t        mTestDevice;
739391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        uint32_t        mTestSamplingRate;
740391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        uint32_t        mTestFormat;
741391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        uint32_t        mTestChannels;
742391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        uint32_t        mTestLatencyMs;
743391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#endif //AUDIO_POLICY_TEST
744391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
745391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtprivate:
746391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        static float volIndexToAmpl(audio_devices_t device, const StreamDescriptor& streamDesc,
747391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt                int indexInUi);
748391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // updates device caching and output for streams that can influence the
749391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        //    routing of notifications
750391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        void handleNotificationRoutingForStream(audio_stream_type_t stream);
751391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        static bool isVirtualInputDevice(audio_devices_t device);
75215907098d1f67c24bb000e593e279af173cf57d7Dmitry Shmidt        uint32_t nextUniqueId();
753391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        uint32_t nextAudioPortGeneration();
754391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        uint32_t curAudioPortGeneration() const { return mAudioPortGeneration; }
755391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        // converts device address to string sent to audio HAL via setParameters
756391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt        static String8 addressToParameter(audio_devices_t device, const String8 address);
757391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt};
758391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
759cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt};
760391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt