| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2009 The Android Open Source Project | 
 | 3 |  * | 
 | 4 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 5 |  * you may not use this file except in compliance with the License. | 
 | 6 |  * You may obtain a copy of the License at | 
 | 7 |  * | 
 | 8 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 | 9 |  * | 
 | 10 |  * Unless required by applicable law or agreed to in writing, software | 
 | 11 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 | 12 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 13 |  * See the License for the specific language governing permissions and | 
 | 14 |  * limitations under the License. | 
 | 15 |  */ | 
 | 16 |  | 
| Eric Laurent | dce54a1 | 2014-03-10 12:19:46 -0700 | [diff] [blame] | 17 | #ifndef ANDROID_AUDIOPOLICY_INTERFACE_H | 
 | 18 | #define ANDROID_AUDIOPOLICY_INTERFACE_H | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 19 |  | 
 | 20 | #include <media/AudioSystem.h> | 
| Eric Laurent | baac183 | 2014-12-01 17:52:59 -0800 | [diff] [blame] | 21 | #include <media/AudioPolicy.h> | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 22 | #include <utils/String8.h> | 
 | 23 |  | 
| Eric Laurent | 3b73df7 | 2014-03-11 09:06:29 -0700 | [diff] [blame] | 24 | namespace android { | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 25 |  | 
 | 26 | // ---------------------------------------------------------------------------- | 
 | 27 |  | 
 | 28 | // The AudioPolicyInterface and AudioPolicyClientInterface classes define the communication interfaces | 
 | 29 | // between the platform specific audio policy manager and Android generic audio policy manager. | 
 | 30 | // The platform specific audio policy manager must implement methods of the AudioPolicyInterface class. | 
 | 31 | // This implementation makes use of the AudioPolicyClientInterface to control the activity and | 
 | 32 | // configuration of audio input and output streams. | 
 | 33 | // | 
 | 34 | // The platform specific audio policy manager is in charge of the audio routing and volume control | 
 | 35 | // policies for a given platform. | 
 | 36 | // The main roles of this module are: | 
 | 37 | //   - keep track of current system state (removable device connections, phone state, user requests...). | 
 | 38 | //   System state changes and user actions are notified to audio policy manager with methods of the AudioPolicyInterface. | 
 | 39 | //   - process getOutput() queries received when AudioTrack objects are created: Those queries | 
 | 40 | //   return a handler on an output that has been selected, configured and opened by the audio policy manager and that | 
 | 41 | //   must be used by the AudioTrack when registering to the AudioFlinger with the createTrack() method. | 
 | 42 | //   When the AudioTrack object is released, a putOutput() query is received and the audio policy manager can decide | 
 | 43 | //   to close or reconfigure the output depending on other streams using this output and current system state. | 
 | 44 | //   - similarly process getInput() and putInput() queries received from AudioRecord objects and configure audio inputs. | 
 | 45 | //   - process volume control requests: the stream volume is converted from an index value (received from UI) to a float value | 
 | 46 | //   applicable to each output as a function of platform specific settings and current output route (destination device). It | 
 | 47 | //   also make sure that streams are not muted if not allowed (e.g. camera shutter sound in some countries). | 
 | 48 | // | 
 | 49 | // The platform specific audio policy manager is provided as a shared library by platform vendors (as for libaudio.so) | 
 | 50 | // and is linked with libaudioflinger.so | 
 | 51 |  | 
 | 52 |  | 
 | 53 | //    Audio Policy Manager Interface | 
 | 54 | class AudioPolicyInterface | 
 | 55 | { | 
 | 56 |  | 
 | 57 | public: | 
| Jean-Michel Trivi | 97bb33f | 2014-12-12 16:23:43 -0800 | [diff] [blame] | 58 |     typedef enum { | 
 | 59 |         API_INPUT_INVALID = -1, | 
 | 60 |         API_INPUT_LEGACY  = 0,// e.g. audio recording from a microphone | 
| Kevin Rocard | 25f9b05 | 2019-02-27 15:08:54 -0800 | [diff] [blame] | 61 |         API_INPUT_MIX_CAPTURE,// used for "remote submix" legacy mode (no DAP), | 
 | 62 |                               // capture of the media to play it remotely | 
| Jean-Michel Trivi | 97bb33f | 2014-12-12 16:23:43 -0800 | [diff] [blame] | 63 |         API_INPUT_MIX_EXT_POLICY_REROUTE,// used for platform audio rerouting, where mixes are | 
 | 64 |                                          // handled by external and dynamically installed | 
 | 65 |                                          // policies which reroute audio mixes | 
| Kevin Rocard | 25f9b05 | 2019-02-27 15:08:54 -0800 | [diff] [blame] | 66 |         API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK,  // used for playback capture with a MediaProjection | 
| Eric Laurent | 82db269 | 2015-08-07 13:59:42 -0700 | [diff] [blame] | 67 |         API_INPUT_TELEPHONY_RX, // used for capture from telephony RX path | 
| Jean-Michel Trivi | 97bb33f | 2014-12-12 16:23:43 -0800 | [diff] [blame] | 68 |     } input_type_t; | 
 | 69 |  | 
 | 70 | public: | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 71 |     virtual ~AudioPolicyInterface() {} | 
 | 72 |     // | 
 | 73 |     // configuration functions | 
 | 74 |     // | 
 | 75 |  | 
 | 76 |     // indicate a change in device connection status | 
 | 77 |     virtual status_t setDeviceConnectionState(audio_devices_t device, | 
| Eric Laurent | 3b73df7 | 2014-03-11 09:06:29 -0700 | [diff] [blame] | 78 |                                               audio_policy_dev_state_t state, | 
| Paul McLean | e743a47 | 2015-01-28 11:07:31 -0800 | [diff] [blame] | 79 |                                               const char *device_address, | 
| Aniket Kumar Lata | 4e46470 | 2019-01-10 23:38:46 -0800 | [diff] [blame] | 80 |                                               const char *device_name, | 
 | 81 |                                               audio_format_t encodedFormat) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 82 |     // retrieve a device connection status | 
| Eric Laurent | 3b73df7 | 2014-03-11 09:06:29 -0700 | [diff] [blame] | 83 |     virtual audio_policy_dev_state_t getDeviceConnectionState(audio_devices_t device, | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 84 |                                                                           const char *device_address) = 0; | 
| Pavlin Radoslavov | f862bc6 | 2016-12-26 18:57:22 -0800 | [diff] [blame] | 85 |     // indicate a change in device configuration | 
 | 86 |     virtual status_t handleDeviceConfigChange(audio_devices_t device, | 
 | 87 |                                               const char *device_address, | 
| Aniket Kumar Lata | 4e46470 | 2019-01-10 23:38:46 -0800 | [diff] [blame] | 88 |                                               const char *device_name, | 
 | 89 |                                               audio_format_t encodedFormat) = 0; | 
| Eric Laurent | 3b73df7 | 2014-03-11 09:06:29 -0700 | [diff] [blame] | 90 |     // indicate a change in phone state. Valid phones states are defined by audio_mode_t | 
 | 91 |     virtual void setPhoneState(audio_mode_t state) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 92 |     // force using a specific device category for the specified usage | 
| Eric Laurent | 3b73df7 | 2014-03-11 09:06:29 -0700 | [diff] [blame] | 93 |     virtual void setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 94 |     // retrieve current device category forced for a given usage | 
| Eric Laurent | 3b73df7 | 2014-03-11 09:06:29 -0700 | [diff] [blame] | 95 |     virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 96 |     // set a system property (e.g. camera sound always audible) | 
 | 97 |     virtual void setSystemProperty(const char* property, const char* value) = 0; | 
 | 98 |     // check proper initialization | 
 | 99 |     virtual status_t initCheck() = 0; | 
 | 100 |  | 
 | 101 |     // | 
 | 102 |     // Audio routing query functions | 
 | 103 |     // | 
 | 104 |  | 
 | 105 |     // request an output appropriate for playback of the supplied stream type and parameters | 
| Eric Laurent | f4e6345 | 2017-11-06 19:31:46 +0000 | [diff] [blame] | 106 |     virtual audio_io_handle_t getOutput(audio_stream_type_t stream) = 0; | 
| Eric Laurent | e83b55d | 2014-11-14 10:06:21 -0800 | [diff] [blame] | 107 |     virtual status_t getOutputForAttr(const audio_attributes_t *attr, | 
 | 108 |                                         audio_io_handle_t *output, | 
 | 109 |                                         audio_session_t session, | 
 | 110 |                                         audio_stream_type_t *stream, | 
| Eric Laurent | 8c7e6da | 2015-04-21 17:37:00 -0700 | [diff] [blame] | 111 |                                         uid_t uid, | 
| Eric Laurent | 20b9ef0 | 2016-12-05 11:03:16 -0800 | [diff] [blame] | 112 |                                         const audio_config_t *config, | 
| Nadav Bar | 766fb02 | 2018-01-07 12:18:03 +0200 | [diff] [blame] | 113 |                                         audio_output_flags_t *flags, | 
| Eric Laurent | 9ae8c59 | 2017-06-22 17:17:09 -0700 | [diff] [blame] | 114 |                                         audio_port_handle_t *selectedDeviceId, | 
| Kevin Rocard | 153f92d | 2018-12-18 18:33:28 -0800 | [diff] [blame] | 115 |                                         audio_port_handle_t *portId, | 
 | 116 |                                         std::vector<audio_io_handle_t> *secondaryOutputs) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 117 |     // indicates to the audio policy manager that the output starts being used by corresponding stream. | 
| Eric Laurent | 8fc147b | 2018-07-22 19:13:55 -0700 | [diff] [blame] | 118 |     virtual status_t startOutput(audio_port_handle_t portId) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 119 |     // indicates to the audio policy manager that the output stops being used by corresponding stream. | 
| Eric Laurent | 8fc147b | 2018-07-22 19:13:55 -0700 | [diff] [blame] | 120 |     virtual status_t stopOutput(audio_port_handle_t portId) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 121 |     // releases the output. | 
| Eric Laurent | 8fc147b | 2018-07-22 19:13:55 -0700 | [diff] [blame] | 122 |     virtual void releaseOutput(audio_port_handle_t portId) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 123 |  | 
 | 124 |     // request an input appropriate for record from the supplied device with supplied parameters. | 
| Eric Laurent | caf7f48 | 2014-11-25 17:50:47 -0800 | [diff] [blame] | 125 |     virtual status_t getInputForAttr(const audio_attributes_t *attr, | 
 | 126 |                                      audio_io_handle_t *input, | 
| Mikhail Naganov | 2996f67 | 2019-04-18 12:29:59 -0700 | [diff] [blame] | 127 |                                      audio_unique_id_t riid, | 
| Eric Laurent | caf7f48 | 2014-11-25 17:50:47 -0800 | [diff] [blame] | 128 |                                      audio_session_t session, | 
| Eric Laurent | 8c7e6da | 2015-04-21 17:37:00 -0700 | [diff] [blame] | 129 |                                      uid_t uid, | 
| Eric Laurent | 20b9ef0 | 2016-12-05 11:03:16 -0800 | [diff] [blame] | 130 |                                      const audio_config_base_t *config, | 
| Jean-Michel Trivi | 97bb33f | 2014-12-12 16:23:43 -0800 | [diff] [blame] | 131 |                                      audio_input_flags_t flags, | 
| Eric Laurent | 9ae8c59 | 2017-06-22 17:17:09 -0700 | [diff] [blame] | 132 |                                      audio_port_handle_t *selectedDeviceId, | 
| Eric Laurent | 20b9ef0 | 2016-12-05 11:03:16 -0800 | [diff] [blame] | 133 |                                      input_type_t *inputType, | 
 | 134 |                                      audio_port_handle_t *portId) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 135 |     // indicates to the audio policy manager that the input starts being used. | 
| Eric Laurent | 4eb58f1 | 2018-12-07 16:41:02 -0800 | [diff] [blame] | 136 |     virtual status_t startInput(audio_port_handle_t portId) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 137 |     // indicates to the audio policy manager that the input stops being used. | 
| Eric Laurent | 8fc147b | 2018-07-22 19:13:55 -0700 | [diff] [blame] | 138 |     virtual status_t stopInput(audio_port_handle_t portId) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 139 |     // releases the input. | 
| Eric Laurent | 8fc147b | 2018-07-22 19:13:55 -0700 | [diff] [blame] | 140 |     virtual void releaseInput(audio_port_handle_t portId) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 141 |  | 
 | 142 |     // | 
 | 143 |     // volume control functions | 
 | 144 |     // | 
 | 145 |  | 
 | 146 |     // initialises stream volume conversion parameters by specifying volume index range. | 
| Eric Laurent | 3b73df7 | 2014-03-11 09:06:29 -0700 | [diff] [blame] | 147 |     virtual void initStreamVolume(audio_stream_type_t stream, | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 148 |                                       int indexMin, | 
 | 149 |                                       int indexMax) = 0; | 
 | 150 |  | 
 | 151 |     // sets the new stream volume at a level corresponding to the supplied index for the | 
| Eric Laurent | 5a2b629 | 2016-04-14 18:05:57 -0700 | [diff] [blame] | 152 |     // supplied device. By convention, specifying AUDIO_DEVICE_OUT_DEFAULT_FOR_VOLUME means | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 153 |     // setting volume for all devices | 
| Eric Laurent | 3b73df7 | 2014-03-11 09:06:29 -0700 | [diff] [blame] | 154 |     virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 155 |                                           int index, | 
 | 156 |                                           audio_devices_t device) = 0; | 
 | 157 |  | 
 | 158 |     // retrieve current volume index for the specified stream and the | 
| Eric Laurent | 5a2b629 | 2016-04-14 18:05:57 -0700 | [diff] [blame] | 159 |     // specified device. By convention, specifying AUDIO_DEVICE_OUT_DEFAULT_FOR_VOLUME means | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 160 |     // querying the volume of the active device. | 
| Eric Laurent | 3b73df7 | 2014-03-11 09:06:29 -0700 | [diff] [blame] | 161 |     virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 162 |                                           int *index, | 
 | 163 |                                           audio_devices_t device) = 0; | 
 | 164 |  | 
| François Gaffie | cfe1732 | 2018-11-07 13:41:29 +0100 | [diff] [blame] | 165 |     virtual status_t setVolumeIndexForAttributes(const audio_attributes_t &attr, | 
 | 166 |                                                  int index, | 
 | 167 |                                                  audio_devices_t device) = 0; | 
 | 168 |     virtual status_t getVolumeIndexForAttributes(const audio_attributes_t &attr, | 
 | 169 |                                                  int &index, | 
 | 170 |                                                  audio_devices_t device) = 0; | 
 | 171 |  | 
 | 172 |     virtual status_t getMaxVolumeIndexForAttributes(const audio_attributes_t &attr, | 
 | 173 |                                                     int &index) = 0; | 
 | 174 |  | 
 | 175 |     virtual status_t getMinVolumeIndexForAttributes(const audio_attributes_t &attr, | 
 | 176 |                                                     int &index) = 0; | 
 | 177 |  | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 178 |     // return the strategy corresponding to a given stream type | 
| Eric Laurent | 3b73df7 | 2014-03-11 09:06:29 -0700 | [diff] [blame] | 179 |     virtual uint32_t getStrategyForStream(audio_stream_type_t stream) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 180 |  | 
 | 181 |     // return the enabled output devices for the given stream type | 
| Eric Laurent | 3b73df7 | 2014-03-11 09:06:29 -0700 | [diff] [blame] | 182 |     virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 183 |  | 
 | 184 |     // Audio effect management | 
 | 185 |     virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) = 0; | 
 | 186 |     virtual status_t registerEffect(const effect_descriptor_t *desc, | 
 | 187 |                                     audio_io_handle_t io, | 
 | 188 |                                     uint32_t strategy, | 
 | 189 |                                     int session, | 
 | 190 |                                     int id) = 0; | 
 | 191 |     virtual status_t unregisterEffect(int id) = 0; | 
 | 192 |     virtual status_t setEffectEnabled(int id, bool enabled) = 0; | 
| Eric Laurent | 6c79632 | 2019-04-09 14:13:17 -0700 | [diff] [blame] | 193 |     virtual status_t moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 194 |  | 
| Eric Laurent | 3b73df7 | 2014-03-11 09:06:29 -0700 | [diff] [blame] | 195 |     virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const = 0; | 
 | 196 |     virtual bool isStreamActiveRemotely(audio_stream_type_t stream, | 
 | 197 |                                         uint32_t inPastMs = 0) const = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 198 |     virtual bool isSourceActive(audio_source_t source) const = 0; | 
 | 199 |  | 
 | 200 |     //dump state | 
 | 201 |     virtual status_t    dump(int fd) = 0; | 
 | 202 |  | 
| Kevin Rocard | b99cc75 | 2019-03-21 20:52:24 -0700 | [diff] [blame] | 203 |     virtual status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 204 |     virtual bool isOffloadSupported(const audio_offload_info_t& offloadInfo) = 0; | 
| Michael Chan | a94fbb2 | 2018-04-24 14:31:19 +1000 | [diff] [blame] | 205 |     virtual bool isDirectOutputSupported(const audio_config_base_t& config, | 
 | 206 |                                          const audio_attributes_t& attributes) = 0; | 
| Eric Laurent | 6a94d69 | 2014-05-20 11:18:06 -0700 | [diff] [blame] | 207 |  | 
 | 208 |     virtual status_t listAudioPorts(audio_port_role_t role, | 
 | 209 |                                     audio_port_type_t type, | 
 | 210 |                                     unsigned int *num_ports, | 
 | 211 |                                     struct audio_port *ports, | 
 | 212 |                                     unsigned int *generation) = 0; | 
 | 213 |     virtual status_t getAudioPort(struct audio_port *port) = 0; | 
 | 214 |     virtual status_t createAudioPatch(const struct audio_patch *patch, | 
 | 215 |                                        audio_patch_handle_t *handle, | 
 | 216 |                                        uid_t uid) = 0; | 
 | 217 |     virtual status_t releaseAudioPatch(audio_patch_handle_t handle, | 
 | 218 |                                           uid_t uid) = 0; | 
 | 219 |     virtual status_t listAudioPatches(unsigned int *num_patches, | 
 | 220 |                                       struct audio_patch *patches, | 
 | 221 |                                       unsigned int *generation) = 0; | 
 | 222 |     virtual status_t setAudioPortConfig(const struct audio_port_config *config) = 0; | 
| Eric Laurent | 8c7e6da | 2015-04-21 17:37:00 -0700 | [diff] [blame] | 223 |     virtual void releaseResourcesForUid(uid_t uid) = 0; | 
| Eric Laurent | 6a94d69 | 2014-05-20 11:18:06 -0700 | [diff] [blame] | 224 |  | 
| Eric Laurent | df3dc7e | 2014-07-27 18:39:40 -0700 | [diff] [blame] | 225 |     virtual status_t acquireSoundTriggerSession(audio_session_t *session, | 
 | 226 |                                            audio_io_handle_t *ioHandle, | 
 | 227 |                                            audio_devices_t *device) = 0; | 
 | 228 |  | 
 | 229 |     virtual status_t releaseSoundTriggerSession(audio_session_t session) = 0; | 
| Eric Laurent | baac183 | 2014-12-01 17:52:59 -0800 | [diff] [blame] | 230 |  | 
| Chih-Hung Hsieh | e964d4e | 2016-08-09 14:31:32 -0700 | [diff] [blame] | 231 |     virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes) = 0; | 
| Eric Laurent | baac183 | 2014-12-01 17:52:59 -0800 | [diff] [blame] | 232 |     virtual status_t unregisterPolicyMixes(Vector<AudioMix> mixes) = 0; | 
| Eric Laurent | 554a277 | 2015-04-10 11:29:24 -0700 | [diff] [blame] | 233 |  | 
| Jean-Michel Trivi | bda70da | 2018-12-19 07:30:15 -0800 | [diff] [blame] | 234 |     virtual status_t setUidDeviceAffinities(uid_t uid, const Vector<AudioDeviceTypeAddr>& devices) | 
 | 235 |             = 0; | 
 | 236 |     virtual status_t removeUidDeviceAffinities(uid_t uid) = 0; | 
 | 237 |  | 
| Eric Laurent | 554a277 | 2015-04-10 11:29:24 -0700 | [diff] [blame] | 238 |     virtual status_t startAudioSource(const struct audio_port_config *source, | 
 | 239 |                                       const audio_attributes_t *attributes, | 
| Eric Laurent | 3e6c7e1 | 2018-07-27 17:09:23 -0700 | [diff] [blame] | 240 |                                       audio_port_handle_t *portId, | 
| Eric Laurent | d60560a | 2015-04-10 11:31:20 -0700 | [diff] [blame] | 241 |                                       uid_t uid) = 0; | 
| Eric Laurent | 3e6c7e1 | 2018-07-27 17:09:23 -0700 | [diff] [blame] | 242 |     virtual status_t stopAudioSource(audio_port_handle_t portId) = 0; | 
| Andy Hung | 2ddee19 | 2015-12-18 17:34:44 -0800 | [diff] [blame] | 243 |  | 
 | 244 |     virtual status_t setMasterMono(bool mono) = 0; | 
 | 245 |     virtual status_t getMasterMono(bool *mono) = 0; | 
| Eric Laurent | ac9cef5 | 2017-06-09 15:46:26 -0700 | [diff] [blame] | 246 |  | 
 | 247 |     virtual float    getStreamVolumeDB( | 
 | 248 |                 audio_stream_type_t stream, int index, audio_devices_t device) = 0; | 
| Svet Ganov | f4ddfef | 2018-01-16 07:37:58 -0800 | [diff] [blame] | 249 |  | 
| jiabin | 8177290 | 2018-04-02 17:52:27 -0700 | [diff] [blame] | 250 |     virtual status_t getSurroundFormats(unsigned int *numSurroundFormats, | 
 | 251 |                                         audio_format_t *surroundFormats, | 
 | 252 |                                         bool *surroundFormatsEnabled, | 
 | 253 |                                         bool reported) = 0; | 
 | 254 |     virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled) = 0; | 
 | 255 |  | 
| jiabin | 6012f91 | 2018-11-02 17:06:30 -0700 | [diff] [blame] | 256 |     virtual bool     isHapticPlaybackSupported() = 0; | 
 | 257 |  | 
| Arun Mirpuri | 11029ad | 2018-12-19 20:45:19 -0800 | [diff] [blame] | 258 |     virtual status_t getHwOffloadEncodingFormatsSupportedForA2DP( | 
 | 259 |                 std::vector<audio_format_t> *formats) = 0; | 
 | 260 |  | 
| Eric Laurent | 5ada82e | 2019-08-29 17:53:54 -0700 | [diff] [blame^] | 261 |     virtual void     setAppState(audio_port_handle_t portId, app_state_t state) = 0; | 
| François Gaffie | d0ba9ed | 2018-11-05 11:50:42 +0100 | [diff] [blame] | 262 |  | 
 | 263 |     virtual status_t listAudioProductStrategies(AudioProductStrategyVector &strategies) = 0; | 
 | 264 |  | 
| François Gaffie | 4b2018b | 2018-11-07 11:18:59 +0100 | [diff] [blame] | 265 |     virtual status_t getProductStrategyFromAudioAttributes(const AudioAttributes &aa, | 
 | 266 |                                                            product_strategy_t &productStrategy) = 0; | 
 | 267 |  | 
 | 268 |     virtual status_t listAudioVolumeGroups(AudioVolumeGroupVector &groups) = 0; | 
 | 269 |  | 
 | 270 |     virtual status_t getVolumeGroupFromAudioAttributes(const AudioAttributes &aa, | 
 | 271 |                                                        volume_group_t &volumeGroup) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 272 | }; | 
 | 273 |  | 
 | 274 |  | 
 | 275 | // Audio Policy client Interface | 
 | 276 | class AudioPolicyClientInterface | 
 | 277 | { | 
 | 278 | public: | 
 | 279 |     virtual ~AudioPolicyClientInterface() {} | 
 | 280 |  | 
 | 281 |     // | 
 | 282 |     // Audio HW module functions | 
 | 283 |     // | 
 | 284 |  | 
 | 285 |     // loads a HW module. | 
 | 286 |     virtual audio_module_handle_t loadHwModule(const char *name) = 0; | 
 | 287 |  | 
 | 288 |     // | 
 | 289 |     // Audio output Control functions | 
 | 290 |     // | 
 | 291 |  | 
 | 292 |     // opens an audio output with the requested parameters. The parameter values can indicate to use the default values | 
 | 293 |     // in case the audio policy manager has no specific requirements for the output being opened. | 
 | 294 |     // When the function returns, the parameter values reflect the actual values used by the audio hardware output stream. | 
 | 295 |     // The audio policy manager can check if the proposed parameters are suitable or not and act accordingly. | 
| Eric Laurent | cf2c021 | 2014-07-25 16:20:43 -0700 | [diff] [blame] | 296 |     virtual status_t openOutput(audio_module_handle_t module, | 
 | 297 |                                 audio_io_handle_t *output, | 
 | 298 |                                 audio_config_t *config, | 
 | 299 |                                 audio_devices_t *devices, | 
 | 300 |                                 const String8& address, | 
 | 301 |                                 uint32_t *latencyMs, | 
 | 302 |                                 audio_output_flags_t flags) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 303 |     // creates a special output that is duplicated to the two outputs passed as arguments. The duplication is performed by | 
 | 304 |     // a special mixer thread in the AudioFlinger. | 
 | 305 |     virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, audio_io_handle_t output2) = 0; | 
 | 306 |     // closes the output stream | 
 | 307 |     virtual status_t closeOutput(audio_io_handle_t output) = 0; | 
 | 308 |     // suspends the output. When an output is suspended, the corresponding audio hardware output stream is placed in | 
 | 309 |     // standby and the AudioTracks attached to the mixer thread are still processed but the output mix is discarded. | 
 | 310 |     virtual status_t suspendOutput(audio_io_handle_t output) = 0; | 
 | 311 |     // restores a suspended output. | 
 | 312 |     virtual status_t restoreOutput(audio_io_handle_t output) = 0; | 
 | 313 |  | 
 | 314 |     // | 
 | 315 |     // Audio input Control functions | 
 | 316 |     // | 
 | 317 |  | 
 | 318 |     // opens an audio input | 
| Eric Laurent | cf2c021 | 2014-07-25 16:20:43 -0700 | [diff] [blame] | 319 |     virtual status_t openInput(audio_module_handle_t module, | 
 | 320 |                                audio_io_handle_t *input, | 
 | 321 |                                audio_config_t *config, | 
 | 322 |                                audio_devices_t *device, | 
 | 323 |                                const String8& address, | 
 | 324 |                                audio_source_t source, | 
 | 325 |                                audio_input_flags_t flags) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 326 |     // closes an audio input | 
 | 327 |     virtual status_t closeInput(audio_io_handle_t input) = 0; | 
 | 328 |     // | 
 | 329 |     // misc control functions | 
 | 330 |     // | 
 | 331 |  | 
 | 332 |     // set a stream volume for a particular output. For the same user setting, a given stream type can have different volumes | 
 | 333 |     // for each output (destination device) it is attached to. | 
| Eric Laurent | 3b73df7 | 2014-03-11 09:06:29 -0700 | [diff] [blame] | 334 |     virtual status_t setStreamVolume(audio_stream_type_t stream, float volume, audio_io_handle_t output, int delayMs = 0) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 335 |  | 
 | 336 |     // invalidate a stream type, causing a reroute to an unspecified new output | 
| Eric Laurent | 3b73df7 | 2014-03-11 09:06:29 -0700 | [diff] [blame] | 337 |     virtual status_t invalidateStream(audio_stream_type_t stream) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 338 |  | 
 | 339 |     // function enabling to send proprietary informations directly from audio policy manager to audio hardware interface. | 
 | 340 |     virtual void setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs, int delayMs = 0) = 0; | 
 | 341 |     // function enabling to receive proprietary informations directly from audio hardware interface to audio policy manager. | 
 | 342 |     virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) = 0; | 
 | 343 |  | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 344 |     // set down link audio volume. | 
 | 345 |     virtual status_t setVoiceVolume(float volume, int delayMs = 0) = 0; | 
 | 346 |  | 
 | 347 |     // move effect to the specified output | 
| Glenn Kasten | d848eb4 | 2016-03-08 13:42:11 -0800 | [diff] [blame] | 348 |     virtual status_t moveEffects(audio_session_t session, | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 349 |                                      audio_io_handle_t srcOutput, | 
 | 350 |                                      audio_io_handle_t dstOutput) = 0; | 
 | 351 |  | 
| Eric Laurent | b20cf7d | 2019-04-05 19:37:34 -0700 | [diff] [blame] | 352 |     virtual void setEffectSuspended(int effectId, | 
 | 353 |                                     audio_session_t sessionId, | 
 | 354 |                                     bool suspended) = 0; | 
 | 355 |  | 
| Eric Laurent | 951f455 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 356 |     /* Create a patch between several source and sink ports */ | 
 | 357 |     virtual status_t createAudioPatch(const struct audio_patch *patch, | 
 | 358 |                                        audio_patch_handle_t *handle, | 
 | 359 |                                        int delayMs) = 0; | 
 | 360 |  | 
 | 361 |     /* Release a patch */ | 
 | 362 |     virtual status_t releaseAudioPatch(audio_patch_handle_t handle, | 
 | 363 |                                        int delayMs) = 0; | 
 | 364 |  | 
| Eric Laurent | e1715a4 | 2014-05-20 11:30:42 -0700 | [diff] [blame] | 365 |     /* Set audio port configuration */ | 
 | 366 |     virtual status_t setAudioPortConfig(const struct audio_port_config *config, int delayMs) = 0; | 
 | 367 |  | 
| Eric Laurent | b52c152 | 2014-05-20 11:27:36 -0700 | [diff] [blame] | 368 |     virtual void onAudioPortListUpdate() = 0; | 
 | 369 |  | 
 | 370 |     virtual void onAudioPatchListUpdate() = 0; | 
| Eric Laurent | de3f839 | 2014-07-27 18:38:22 -0700 | [diff] [blame] | 371 |  | 
| François Gaffie | cfe1732 | 2018-11-07 13:41:29 +0100 | [diff] [blame] | 372 |     virtual void onAudioVolumeGroupChanged(volume_group_t group, int flags) = 0; | 
 | 373 |  | 
| Glenn Kasten | f0c6d7d | 2016-02-26 10:44:04 -0800 | [diff] [blame] | 374 |     virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use) = 0; | 
| Jean-Michel Trivi | de80105 | 2015-04-14 19:10:14 -0700 | [diff] [blame] | 375 |  | 
 | 376 |     virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state) = 0; | 
| Jean-Michel Trivi | 2f4fe9f | 2015-12-04 16:20:59 -0800 | [diff] [blame] | 377 |  | 
| Jean-Michel Trivi | ac4e429 | 2016-12-22 11:39:31 -0800 | [diff] [blame] | 378 |     virtual void onRecordingConfigurationUpdate(int event, | 
| Eric Laurent | a9f8665 | 2018-11-28 17:23:11 -0800 | [diff] [blame] | 379 |                                                 const record_client_info_t *clientInfo, | 
 | 380 |                                                 const audio_config_base_t *clientConfig, | 
 | 381 |                                                 std::vector<effect_descriptor_t> clientEffects, | 
 | 382 |                                                 const audio_config_base_t *deviceConfig, | 
 | 383 |                                                 std::vector<effect_descriptor_t> effects, | 
 | 384 |                                                 audio_patch_handle_t patchHandle, | 
 | 385 |                                                 audio_source_t source) = 0; | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 386 | }; | 
 | 387 |  | 
 | 388 | extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface); | 
 | 389 | extern "C" void destroyAudioPolicyManager(AudioPolicyInterface *interface); | 
 | 390 |  | 
 | 391 |  | 
| Mikhail Naganov | 1b2a794 | 2017-12-08 10:18:09 -0800 | [diff] [blame] | 392 | } // namespace android | 
| Eric Laurent | e552edb | 2014-03-10 17:42:56 -0700 | [diff] [blame] | 393 |  | 
| Eric Laurent | dce54a1 | 2014-03-10 12:19:46 -0700 | [diff] [blame] | 394 | #endif // ANDROID_AUDIOPOLICY_INTERFACE_H |