| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2008 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 |  | 
|  | 17 | #ifndef ANDROID_AUDIOSYSTEM_H_ | 
|  | 18 | #define ANDROID_AUDIOSYSTEM_H_ | 
|  | 19 |  | 
|  | 20 | #include <utils/RefBase.h> | 
|  | 21 | #include <utils/threads.h> | 
|  | 22 | #include <media/IAudioFlinger.h> | 
|  | 23 |  | 
|  | 24 | namespace android { | 
|  | 25 |  | 
|  | 26 | typedef void (*audio_error_callback)(status_t err); | 
| Eric Laurent | fa2877b | 2009-07-28 08:44:33 -0700 | [diff] [blame] | 27 | typedef int audio_io_handle_t; | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 28 |  | 
|  | 29 | class IAudioPolicyService; | 
|  | 30 | class String8; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 31 |  | 
|  | 32 | class AudioSystem | 
|  | 33 | { | 
|  | 34 | public: | 
|  | 35 |  | 
|  | 36 | enum stream_type { | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 37 | DEFAULT          =-1, | 
|  | 38 | VOICE_CALL       = 0, | 
|  | 39 | SYSTEM           = 1, | 
|  | 40 | RING             = 2, | 
|  | 41 | MUSIC            = 3, | 
|  | 42 | ALARM            = 4, | 
|  | 43 | NOTIFICATION     = 5, | 
|  | 44 | BLUETOOTH_SCO    = 6, | 
| Eric Laurent | 29a6500 | 2009-03-27 18:18:46 -0700 | [diff] [blame] | 45 | ENFORCED_AUDIBLE = 7, // Sounds that cannot be muted by user and must be routed to speaker | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 46 | DTMF             = 8, | 
|  | 47 | TTS              = 9, | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 48 | NUM_STREAM_TYPES | 
|  | 49 | }; | 
|  | 50 |  | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 51 | // Audio sub formats (see AudioSystem::audio_format). | 
|  | 52 | enum pcm_sub_format { | 
| Eric Laurent | ffe9c25 | 2010-06-23 17:38:20 -0700 | [diff] [blame] | 53 | PCM_SUB_16_BIT          = 0x1, // must be 1 for backward compatibility | 
|  | 54 | PCM_SUB_8_BIT           = 0x2, // must be 2 for backward compatibility | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 55 | }; | 
|  | 56 |  | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 57 | // MP3 sub format field definition : can use 11 LSBs in the same way as MP3 frame header to specify | 
|  | 58 | // bit rate, stereo mode, version... | 
|  | 59 | enum mp3_sub_format { | 
|  | 60 | //TODO | 
|  | 61 | }; | 
|  | 62 |  | 
|  | 63 | // AMR NB/WB sub format field definition: specify frame block interleaving, bandwidth efficient or octet aligned, | 
|  | 64 | // encoding mode for recording... | 
|  | 65 | enum amr_sub_format { | 
|  | 66 | //TODO | 
|  | 67 | }; | 
|  | 68 |  | 
|  | 69 | // AAC sub format field definition: specify profile or bitrate for recording... | 
|  | 70 | enum aac_sub_format { | 
|  | 71 | //TODO | 
|  | 72 | }; | 
|  | 73 |  | 
|  | 74 | // VORBIS sub format field definition: specify quality for recording... | 
|  | 75 | enum vorbis_sub_format { | 
|  | 76 | //TODO | 
|  | 77 | }; | 
|  | 78 |  | 
|  | 79 | // Audio format consists in a main format field (upper 8 bits) and a sub format field (lower 24 bits). | 
|  | 80 | // The main format indicates the main codec type. The sub format field indicates options and parameters | 
|  | 81 | // for each format. The sub format is mainly used for record to indicate for instance the requested bitrate | 
|  | 82 | // or profile. It can also be used for certain formats to give informations not present in the encoded | 
|  | 83 | // audio stream (e.g. octet alignement for AMR). | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 84 | enum audio_format { | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 85 | INVALID_FORMAT      = -1, | 
|  | 86 | FORMAT_DEFAULT      = 0, | 
|  | 87 | PCM                 = 0x00000000, // must be 0 for backward compatibility | 
|  | 88 | MP3                 = 0x01000000, | 
|  | 89 | AMR_NB              = 0x02000000, | 
|  | 90 | AMR_WB              = 0x03000000, | 
|  | 91 | AAC                 = 0x04000000, | 
|  | 92 | HE_AAC_V1           = 0x05000000, | 
|  | 93 | HE_AAC_V2           = 0x06000000, | 
|  | 94 | VORBIS              = 0x07000000, | 
|  | 95 | MAIN_FORMAT_MASK    = 0xFF000000, | 
|  | 96 | SUB_FORMAT_MASK     = 0x00FFFFFF, | 
|  | 97 | // Aliases | 
|  | 98 | PCM_16_BIT          = (PCM|PCM_SUB_16_BIT), | 
|  | 99 | PCM_8_BIT          = (PCM|PCM_SUB_8_BIT) | 
|  | 100 | }; | 
|  | 101 |  | 
|  | 102 |  | 
|  | 103 | // Channel mask definitions must be kept in sync with JAVA values in /media/java/android/media/AudioFormat.java | 
|  | 104 | enum audio_channels { | 
|  | 105 | // output channels | 
| Eric Laurent | ffe9c25 | 2010-06-23 17:38:20 -0700 | [diff] [blame] | 106 | CHANNEL_OUT_FRONT_LEFT = 0x4, | 
|  | 107 | CHANNEL_OUT_FRONT_RIGHT = 0x8, | 
|  | 108 | CHANNEL_OUT_FRONT_CENTER = 0x10, | 
|  | 109 | CHANNEL_OUT_LOW_FREQUENCY = 0x20, | 
|  | 110 | CHANNEL_OUT_BACK_LEFT = 0x40, | 
|  | 111 | CHANNEL_OUT_BACK_RIGHT = 0x80, | 
|  | 112 | CHANNEL_OUT_FRONT_LEFT_OF_CENTER = 0x100, | 
|  | 113 | CHANNEL_OUT_FRONT_RIGHT_OF_CENTER = 0x200, | 
|  | 114 | CHANNEL_OUT_BACK_CENTER = 0x400, | 
|  | 115 | CHANNEL_OUT_MONO = CHANNEL_OUT_FRONT_LEFT, | 
|  | 116 | CHANNEL_OUT_STEREO = (CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT), | 
|  | 117 | CHANNEL_OUT_QUAD = (CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT | | 
|  | 118 | CHANNEL_OUT_BACK_LEFT | CHANNEL_OUT_BACK_RIGHT), | 
|  | 119 | CHANNEL_OUT_SURROUND = (CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT | | 
|  | 120 | CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_BACK_CENTER), | 
|  | 121 | CHANNEL_OUT_5POINT1 = (CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT | | 
|  | 122 | CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_LOW_FREQUENCY | CHANNEL_OUT_BACK_LEFT | CHANNEL_OUT_BACK_RIGHT), | 
|  | 123 | CHANNEL_OUT_7POINT1 = (CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT | | 
|  | 124 | CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_LOW_FREQUENCY | CHANNEL_OUT_BACK_LEFT | CHANNEL_OUT_BACK_RIGHT | | 
|  | 125 | CHANNEL_OUT_FRONT_LEFT_OF_CENTER | CHANNEL_OUT_FRONT_RIGHT_OF_CENTER), | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 126 | CHANNEL_OUT_ALL = (CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT | | 
|  | 127 | CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_LOW_FREQUENCY | CHANNEL_OUT_BACK_LEFT | CHANNEL_OUT_BACK_RIGHT | | 
|  | 128 | CHANNEL_OUT_FRONT_LEFT_OF_CENTER | CHANNEL_OUT_FRONT_RIGHT_OF_CENTER | CHANNEL_OUT_BACK_CENTER), | 
|  | 129 |  | 
|  | 130 | // input channels | 
| Eric Laurent | 9a92037 | 2009-07-27 07:12:26 -0700 | [diff] [blame] | 131 | CHANNEL_IN_LEFT = 0x4, | 
|  | 132 | CHANNEL_IN_RIGHT = 0x8, | 
|  | 133 | CHANNEL_IN_FRONT = 0x10, | 
|  | 134 | CHANNEL_IN_BACK = 0x20, | 
|  | 135 | CHANNEL_IN_LEFT_PROCESSED = 0x40, | 
|  | 136 | CHANNEL_IN_RIGHT_PROCESSED = 0x80, | 
|  | 137 | CHANNEL_IN_FRONT_PROCESSED = 0x100, | 
|  | 138 | CHANNEL_IN_BACK_PROCESSED = 0x200, | 
|  | 139 | CHANNEL_IN_PRESSURE = 0x400, | 
|  | 140 | CHANNEL_IN_X_AXIS = 0x800, | 
|  | 141 | CHANNEL_IN_Y_AXIS = 0x1000, | 
|  | 142 | CHANNEL_IN_Z_AXIS = 0x2000, | 
|  | 143 | CHANNEL_IN_VOICE_UPLINK = 0x4000, | 
|  | 144 | CHANNEL_IN_VOICE_DNLINK = 0x8000, | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 145 | CHANNEL_IN_MONO = CHANNEL_IN_FRONT, | 
|  | 146 | CHANNEL_IN_STEREO = (CHANNEL_IN_LEFT | CHANNEL_IN_RIGHT), | 
|  | 147 | CHANNEL_IN_ALL = (CHANNEL_IN_LEFT | CHANNEL_IN_RIGHT | CHANNEL_IN_FRONT | CHANNEL_IN_BACK| | 
|  | 148 | CHANNEL_IN_LEFT_PROCESSED | CHANNEL_IN_RIGHT_PROCESSED | CHANNEL_IN_FRONT_PROCESSED | CHANNEL_IN_BACK_PROCESSED| | 
|  | 149 | CHANNEL_IN_PRESSURE | CHANNEL_IN_X_AXIS | CHANNEL_IN_Y_AXIS | CHANNEL_IN_Z_AXIS | | 
|  | 150 | CHANNEL_IN_VOICE_UPLINK | CHANNEL_IN_VOICE_DNLINK) | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 151 | }; | 
|  | 152 |  | 
|  | 153 | enum audio_mode { | 
|  | 154 | MODE_INVALID = -2, | 
|  | 155 | MODE_CURRENT = -1, | 
|  | 156 | MODE_NORMAL = 0, | 
|  | 157 | MODE_RINGTONE, | 
|  | 158 | MODE_IN_CALL, | 
| Jean-Michel Trivi | f1fb01a | 2010-11-15 12:11:32 -0800 | [diff] [blame] | 159 | MODE_IN_COMMUNICATION, | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 160 | NUM_MODES  // not a valid entry, denotes end-of-list | 
|  | 161 | }; | 
|  | 162 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 163 | enum audio_in_acoustics { | 
|  | 164 | AGC_ENABLE    = 0x0001, | 
|  | 165 | AGC_DISABLE   = 0, | 
|  | 166 | NS_ENABLE     = 0x0002, | 
|  | 167 | NS_DISABLE    = 0, | 
|  | 168 | TX_IIR_ENABLE = 0x0004, | 
|  | 169 | TX_DISABLE    = 0 | 
|  | 170 | }; | 
|  | 171 |  | 
| Eric Laurent | de07013 | 2010-07-13 04:45:46 -0700 | [diff] [blame] | 172 | // special audio session values | 
|  | 173 | enum audio_sessions { | 
|  | 174 | SESSION_OUTPUT_STAGE = -1, // session for effects attached to a particular output stream | 
|  | 175 | // (value must be less than 0) | 
|  | 176 | SESSION_OUTPUT_MIX = 0,    // session for effects applied to output mix. These effects can | 
|  | 177 | // be moved by audio policy manager to another output stream | 
|  | 178 | // (value must be 0) | 
|  | 179 | }; | 
|  | 180 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 181 | /* These are static methods to control the system-wide AudioFlinger | 
|  | 182 | * only privileged processes can have access to them | 
|  | 183 | */ | 
|  | 184 |  | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 185 | // mute/unmute microphone | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 186 | static status_t muteMicrophone(bool state); | 
|  | 187 | static status_t isMicrophoneMuted(bool *state); | 
|  | 188 |  | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 189 | // set/get master volume | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 190 | static status_t setMasterVolume(float value); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 191 | static status_t getMasterVolume(float* volume); | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 192 | // mute/unmute audio outputs | 
|  | 193 | static status_t setMasterMute(bool mute); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 194 | static status_t getMasterMute(bool* mute); | 
|  | 195 |  | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 196 | // set/get stream volume on specified output | 
| Eric Laurent | fa2877b | 2009-07-28 08:44:33 -0700 | [diff] [blame] | 197 | static status_t setStreamVolume(int stream, float value, int output); | 
|  | 198 | static status_t getStreamVolume(int stream, float* volume, int output); | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 199 |  | 
|  | 200 | // mute/unmute stream | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 201 | static status_t setStreamMute(int stream, bool mute); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 202 | static status_t getStreamMute(int stream, bool* mute); | 
|  | 203 |  | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 204 | // set audio mode in audio hardware (see AudioSystem::audio_mode) | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 205 | static status_t setMode(int mode); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 206 |  | 
| Eric Laurent | eda6c36 | 2011-02-02 09:33:30 -0800 | [diff] [blame] | 207 | // returns true in *state if tracks are active on the specified stream or has been active | 
|  | 208 | // in the past inPastMs milliseconds | 
|  | 209 | static status_t isStreamActive(int stream, bool *state, uint32_t inPastMs = 0); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 210 |  | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 211 | // set/get audio hardware parameters. The function accepts a list of parameters | 
|  | 212 | // key value pairs in the form: key1=value1;key2=value2;... | 
|  | 213 | // Some keys are reserved for standard parameters (See AudioParameter class). | 
|  | 214 | static status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs); | 
|  | 215 | static String8  getParameters(audio_io_handle_t ioHandle, const String8& keys); | 
|  | 216 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 217 | static void setErrorCallback(audio_error_callback cb); | 
|  | 218 |  | 
|  | 219 | // helper function to obtain AudioFlinger service handle | 
|  | 220 | static const sp<IAudioFlinger>& get_audio_flinger(); | 
|  | 221 |  | 
|  | 222 | static float linearToLog(int volume); | 
|  | 223 | static int logToLinear(float volume); | 
|  | 224 |  | 
|  | 225 | static status_t getOutputSamplingRate(int* samplingRate, int stream = DEFAULT); | 
|  | 226 | static status_t getOutputFrameCount(int* frameCount, int stream = DEFAULT); | 
|  | 227 | static status_t getOutputLatency(uint32_t* latency, int stream = DEFAULT); | 
|  | 228 |  | 
|  | 229 | static bool routedToA2dpOutput(int streamType); | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 230 |  | 
|  | 231 | static status_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount, | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 232 | size_t* buffSize); | 
|  | 233 |  | 
| Eric Laurent | f0ee6f4 | 2009-10-21 08:14:22 -0700 | [diff] [blame] | 234 | static status_t setVoiceVolume(float volume); | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 235 |  | 
| Eric Laurent | 342e9cf | 2010-01-19 17:37:09 -0800 | [diff] [blame] | 236 | // return the number of audio frames written by AudioFlinger to audio HAL and | 
|  | 237 | // audio dsp to DAC since the output on which the specificed stream is playing | 
|  | 238 | // has exited standby. | 
|  | 239 | // returned status (from utils/Errors.h) can be: | 
|  | 240 | // - NO_ERROR: successful operation, halFrames and dspFrames point to valid data | 
|  | 241 | // - INVALID_OPERATION: Not supported on current hardware platform | 
|  | 242 | // - BAD_VALUE: invalid parameter | 
|  | 243 | // NOTE: this feature is not supported on all hardware platforms and it is | 
|  | 244 | // necessary to check returned status before using the returned values. | 
|  | 245 | static status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int stream = DEFAULT); | 
|  | 246 |  | 
| Eric Laurent | 05bca2f | 2010-02-26 02:47:27 -0800 | [diff] [blame] | 247 | static unsigned int  getInputFramesLost(audio_io_handle_t ioHandle); | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 248 |  | 
|  | 249 | static int newAudioSessionId(); | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 250 | // | 
|  | 251 | // AudioPolicyService interface | 
|  | 252 | // | 
|  | 253 |  | 
|  | 254 | enum audio_devices { | 
|  | 255 | // output devices | 
| Eric Laurent | ffe9c25 | 2010-06-23 17:38:20 -0700 | [diff] [blame] | 256 | DEVICE_OUT_EARPIECE = 0x1, | 
|  | 257 | DEVICE_OUT_SPEAKER = 0x2, | 
|  | 258 | DEVICE_OUT_WIRED_HEADSET = 0x4, | 
|  | 259 | DEVICE_OUT_WIRED_HEADPHONE = 0x8, | 
|  | 260 | DEVICE_OUT_BLUETOOTH_SCO = 0x10, | 
|  | 261 | DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20, | 
|  | 262 | DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40, | 
|  | 263 | DEVICE_OUT_BLUETOOTH_A2DP = 0x80, | 
|  | 264 | DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100, | 
|  | 265 | DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200, | 
|  | 266 | DEVICE_OUT_AUX_DIGITAL = 0x400, | 
| Praveen Bharathi | b235dee | 2010-10-06 15:23:14 -0500 | [diff] [blame] | 267 | DEVICE_OUT_ANLG_DOCK_HEADSET = 0x800, | 
|  | 268 | DEVICE_OUT_DGTL_DOCK_HEADSET = 0x1000, | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 269 | DEVICE_OUT_DEFAULT = 0x8000, | 
|  | 270 | DEVICE_OUT_ALL = (DEVICE_OUT_EARPIECE | DEVICE_OUT_SPEAKER | DEVICE_OUT_WIRED_HEADSET | | 
|  | 271 | DEVICE_OUT_WIRED_HEADPHONE | DEVICE_OUT_BLUETOOTH_SCO | DEVICE_OUT_BLUETOOTH_SCO_HEADSET | | 
|  | 272 | DEVICE_OUT_BLUETOOTH_SCO_CARKIT | DEVICE_OUT_BLUETOOTH_A2DP | DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | | 
| Praveen Bharathi | b235dee | 2010-10-06 15:23:14 -0500 | [diff] [blame] | 273 | DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | DEVICE_OUT_AUX_DIGITAL | | 
|  | 274 | DEVICE_OUT_ANLG_DOCK_HEADSET | DEVICE_OUT_DGTL_DOCK_HEADSET | | 
|  | 275 | DEVICE_OUT_DEFAULT), | 
| Eric Laurent | 492e666 | 2009-12-10 01:03:50 -0800 | [diff] [blame] | 276 | DEVICE_OUT_ALL_A2DP = (DEVICE_OUT_BLUETOOTH_A2DP | DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | | 
|  | 277 | DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER), | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 278 |  | 
|  | 279 | // input devices | 
|  | 280 | DEVICE_IN_COMMUNICATION = 0x10000, | 
|  | 281 | DEVICE_IN_AMBIENT = 0x20000, | 
|  | 282 | DEVICE_IN_BUILTIN_MIC = 0x40000, | 
|  | 283 | DEVICE_IN_BLUETOOTH_SCO_HEADSET = 0x80000, | 
|  | 284 | DEVICE_IN_WIRED_HEADSET = 0x100000, | 
|  | 285 | DEVICE_IN_AUX_DIGITAL = 0x200000, | 
|  | 286 | DEVICE_IN_VOICE_CALL = 0x400000, | 
| Eric Laurent | 90b75fb | 2009-11-02 05:31:33 -0800 | [diff] [blame] | 287 | DEVICE_IN_BACK_MIC = 0x800000, | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 288 | DEVICE_IN_DEFAULT = 0x80000000, | 
|  | 289 |  | 
|  | 290 | DEVICE_IN_ALL = (DEVICE_IN_COMMUNICATION | DEVICE_IN_AMBIENT | DEVICE_IN_BUILTIN_MIC | | 
|  | 291 | DEVICE_IN_BLUETOOTH_SCO_HEADSET | DEVICE_IN_WIRED_HEADSET | DEVICE_IN_AUX_DIGITAL | | 
| Eric Laurent | 90b75fb | 2009-11-02 05:31:33 -0800 | [diff] [blame] | 292 | DEVICE_IN_VOICE_CALL | DEVICE_IN_BACK_MIC | DEVICE_IN_DEFAULT) | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 293 | }; | 
|  | 294 |  | 
|  | 295 | // device connection states used for setDeviceConnectionState() | 
|  | 296 | enum device_connection_state { | 
|  | 297 | DEVICE_STATE_UNAVAILABLE, | 
|  | 298 | DEVICE_STATE_AVAILABLE, | 
|  | 299 | NUM_DEVICE_STATES | 
|  | 300 | }; | 
|  | 301 |  | 
|  | 302 | // request to open a direct output with getOutput() (by opposition to sharing an output with other AudioTracks) | 
|  | 303 | enum output_flags { | 
|  | 304 | OUTPUT_FLAG_INDIRECT = 0x0, | 
|  | 305 | OUTPUT_FLAG_DIRECT = 0x1 | 
|  | 306 | }; | 
|  | 307 |  | 
|  | 308 | // device categories used for setForceUse() | 
|  | 309 | enum forced_config { | 
|  | 310 | FORCE_NONE, | 
|  | 311 | FORCE_SPEAKER, | 
|  | 312 | FORCE_HEADPHONES, | 
|  | 313 | FORCE_BT_SCO, | 
|  | 314 | FORCE_BT_A2DP, | 
|  | 315 | FORCE_WIRED_ACCESSORY, | 
| Eric Laurent | 7ddd450 | 2009-12-17 03:12:59 -0800 | [diff] [blame] | 316 | FORCE_BT_CAR_DOCK, | 
|  | 317 | FORCE_BT_DESK_DOCK, | 
| Praveen Bharathi | b235dee | 2010-10-06 15:23:14 -0500 | [diff] [blame] | 318 | FORCE_ANALOG_DOCK, | 
|  | 319 | FORCE_DIGITAL_DOCK, | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 320 | NUM_FORCE_CONFIG, | 
|  | 321 | FORCE_DEFAULT = FORCE_NONE | 
|  | 322 | }; | 
|  | 323 |  | 
|  | 324 | // usages used for setForceUse() | 
|  | 325 | enum force_use { | 
|  | 326 | FOR_COMMUNICATION, | 
|  | 327 | FOR_MEDIA, | 
|  | 328 | FOR_RECORD, | 
| Jean-Michel Trivi | 48643f3 | 2009-12-07 18:40:56 -0800 | [diff] [blame] | 329 | FOR_DOCK, | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 330 | NUM_FORCE_USE | 
|  | 331 | }; | 
|  | 332 |  | 
|  | 333 | // types of io configuration change events received with ioConfigChanged() | 
|  | 334 | enum io_config_event { | 
|  | 335 | OUTPUT_OPENED, | 
|  | 336 | OUTPUT_CLOSED, | 
|  | 337 | OUTPUT_CONFIG_CHANGED, | 
|  | 338 | INPUT_OPENED, | 
|  | 339 | INPUT_CLOSED, | 
|  | 340 | INPUT_CONFIG_CHANGED, | 
|  | 341 | STREAM_CONFIG_CHANGED, | 
|  | 342 | NUM_CONFIG_EVENTS | 
|  | 343 | }; | 
|  | 344 |  | 
|  | 345 | // audio output descritor used to cache output configurations in client process to avoid frequent calls | 
|  | 346 | // through IAudioFlinger | 
|  | 347 | class OutputDescriptor { | 
|  | 348 | public: | 
|  | 349 | OutputDescriptor() | 
|  | 350 | : samplingRate(0), format(0), channels(0), frameCount(0), latency(0)  {} | 
|  | 351 |  | 
|  | 352 | uint32_t samplingRate; | 
|  | 353 | int32_t format; | 
|  | 354 | int32_t channels; | 
|  | 355 | size_t frameCount; | 
|  | 356 | uint32_t latency; | 
|  | 357 | }; | 
|  | 358 |  | 
|  | 359 | // | 
|  | 360 | // IAudioPolicyService interface (see AudioPolicyInterface for method descriptions) | 
|  | 361 | // | 
|  | 362 | static status_t setDeviceConnectionState(audio_devices device, device_connection_state state, const char *device_address); | 
|  | 363 | static device_connection_state getDeviceConnectionState(audio_devices device, const char *device_address); | 
|  | 364 | static status_t setPhoneState(int state); | 
|  | 365 | static status_t setRingerMode(uint32_t mode, uint32_t mask); | 
|  | 366 | static status_t setForceUse(force_use usage, forced_config config); | 
|  | 367 | static forced_config getForceUse(force_use usage); | 
|  | 368 | static audio_io_handle_t getOutput(stream_type stream, | 
|  | 369 | uint32_t samplingRate = 0, | 
|  | 370 | uint32_t format = FORMAT_DEFAULT, | 
|  | 371 | uint32_t channels = CHANNEL_OUT_STEREO, | 
|  | 372 | output_flags flags = OUTPUT_FLAG_INDIRECT); | 
| Eric Laurent | de07013 | 2010-07-13 04:45:46 -0700 | [diff] [blame] | 373 | static status_t startOutput(audio_io_handle_t output, | 
|  | 374 | AudioSystem::stream_type stream, | 
|  | 375 | int session = 0); | 
|  | 376 | static status_t stopOutput(audio_io_handle_t output, | 
|  | 377 | AudioSystem::stream_type stream, | 
|  | 378 | int session = 0); | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 379 | static void releaseOutput(audio_io_handle_t output); | 
|  | 380 | static audio_io_handle_t getInput(int inputSource, | 
|  | 381 | uint32_t samplingRate = 0, | 
|  | 382 | uint32_t format = FORMAT_DEFAULT, | 
|  | 383 | uint32_t channels = CHANNEL_IN_MONO, | 
|  | 384 | audio_in_acoustics acoustics = (audio_in_acoustics)0); | 
|  | 385 | static status_t startInput(audio_io_handle_t input); | 
|  | 386 | static status_t stopInput(audio_io_handle_t input); | 
|  | 387 | static void releaseInput(audio_io_handle_t input); | 
|  | 388 | static status_t initStreamVolume(stream_type stream, | 
|  | 389 | int indexMin, | 
|  | 390 | int indexMax); | 
|  | 391 | static status_t setStreamVolumeIndex(stream_type stream, int index); | 
|  | 392 | static status_t getStreamVolumeIndex(stream_type stream, int *index); | 
|  | 393 |  | 
| Eric Laurent | de07013 | 2010-07-13 04:45:46 -0700 | [diff] [blame] | 394 | static uint32_t getStrategyForStream(stream_type stream); | 
| Glenn Kasten | 6b2718c | 2011-02-04 13:54:26 -0800 | [diff] [blame^] | 395 | static uint32_t getDevicesForStream(stream_type stream); | 
| Eric Laurent | de07013 | 2010-07-13 04:45:46 -0700 | [diff] [blame] | 396 |  | 
|  | 397 | static audio_io_handle_t getOutputForEffect(effect_descriptor_t *desc); | 
|  | 398 | static status_t registerEffect(effect_descriptor_t *desc, | 
|  | 399 | audio_io_handle_t output, | 
|  | 400 | uint32_t strategy, | 
|  | 401 | int session, | 
|  | 402 | int id); | 
|  | 403 | static status_t unregisterEffect(int id); | 
|  | 404 |  | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 405 | static const sp<IAudioPolicyService>& get_audio_policy_service(); | 
|  | 406 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 407 | // ---------------------------------------------------------------------------- | 
|  | 408 |  | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 409 | static uint32_t popCount(uint32_t u); | 
|  | 410 | static bool isOutputDevice(audio_devices device); | 
|  | 411 | static bool isInputDevice(audio_devices device); | 
|  | 412 | static bool isA2dpDevice(audio_devices device); | 
|  | 413 | static bool isBluetoothScoDevice(audio_devices device); | 
|  | 414 | static bool isLowVisibility(stream_type stream); | 
|  | 415 | static bool isOutputChannel(uint32_t channel); | 
|  | 416 | static bool isInputChannel(uint32_t channel); | 
|  | 417 | static bool isValidFormat(uint32_t format); | 
|  | 418 | static bool isLinearPCM(uint32_t format); | 
|  | 419 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 420 | private: | 
|  | 421 |  | 
|  | 422 | class AudioFlingerClient: public IBinder::DeathRecipient, public BnAudioFlingerClient | 
|  | 423 | { | 
|  | 424 | public: | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 425 | AudioFlingerClient() { | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 426 | } | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 427 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 428 | // DeathRecipient | 
|  | 429 | virtual void binderDied(const wp<IBinder>& who); | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 430 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 431 | // IAudioFlingerClient | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 432 |  | 
|  | 433 | // indicate a change in the configuration of an output or input: keeps the cached | 
|  | 434 | // values for output/input parameters upto date in client process | 
| Eric Laurent | fa2877b | 2009-07-28 08:44:33 -0700 | [diff] [blame] | 435 | virtual void ioConfigChanged(int event, int ioHandle, void *param2); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 436 | }; | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 437 |  | 
|  | 438 | class AudioPolicyServiceClient: public IBinder::DeathRecipient | 
|  | 439 | { | 
|  | 440 | public: | 
|  | 441 | AudioPolicyServiceClient() { | 
|  | 442 | } | 
|  | 443 |  | 
|  | 444 | // DeathRecipient | 
|  | 445 | virtual void binderDied(const wp<IBinder>& who); | 
|  | 446 | }; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 447 |  | 
|  | 448 | static sp<AudioFlingerClient> gAudioFlingerClient; | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 449 | static sp<AudioPolicyServiceClient> gAudioPolicyServiceClient; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 450 | friend class AudioFlingerClient; | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 451 | friend class AudioPolicyServiceClient; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 452 |  | 
|  | 453 | static Mutex gLock; | 
|  | 454 | static sp<IAudioFlinger> gAudioFlinger; | 
|  | 455 | static audio_error_callback gAudioErrorCallback; | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 456 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 457 | static size_t gInBuffSize; | 
|  | 458 | // previous parameters for recording buffer size queries | 
|  | 459 | static uint32_t gPrevInSamplingRate; | 
|  | 460 | static int gPrevInFormat; | 
|  | 461 | static int gPrevInChannelCount; | 
|  | 462 |  | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 463 | static sp<IAudioPolicyService> gAudioPolicyService; | 
|  | 464 |  | 
|  | 465 | // mapping between stream types and outputs | 
|  | 466 | static DefaultKeyedVector<int, audio_io_handle_t> gStreamOutputMap; | 
|  | 467 | // list of output descritor containing cached parameters (sampling rate, framecount, channel count...) | 
|  | 468 | static DefaultKeyedVector<audio_io_handle_t, OutputDescriptor *> gOutputs; | 
|  | 469 | }; | 
|  | 470 |  | 
|  | 471 | class AudioParameter { | 
|  | 472 |  | 
|  | 473 | public: | 
|  | 474 | AudioParameter() {} | 
|  | 475 | AudioParameter(const String8& keyValuePairs); | 
|  | 476 | virtual ~AudioParameter(); | 
|  | 477 |  | 
| Jean-Michel Trivi | 56ecd20 | 2010-11-09 14:06:52 -0800 | [diff] [blame] | 478 | // reserved parameter keys for changing standard parameters with setParameters() function. | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 479 | // Using these keys is mandatory for AudioFlinger to properly monitor audio output/input | 
|  | 480 | // configuration changes and act accordingly. | 
|  | 481 | //  keyRouting: to change audio routing, value is an int in AudioSystem::audio_devices | 
|  | 482 | //  keySamplingRate: to change sampling rate routing, value is an int | 
|  | 483 | //  keyFormat: to change audio format, value is an int in AudioSystem::audio_format | 
|  | 484 | //  keyChannels: to change audio channel configuration, value is an int in AudioSystem::audio_channels | 
|  | 485 | //  keyFrameCount: to change audio output frame count, value is an int | 
| Jean-Michel Trivi | 56ecd20 | 2010-11-09 14:06:52 -0800 | [diff] [blame] | 486 | //  keyInputSource: to change audio input source, value is an int in audio_source | 
|  | 487 | //     (defined in media/mediarecorder.h) | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 488 | static const char *keyRouting; | 
|  | 489 | static const char *keySamplingRate; | 
|  | 490 | static const char *keyFormat; | 
|  | 491 | static const char *keyChannels; | 
|  | 492 | static const char *keyFrameCount; | 
| Jean-Michel Trivi | 56ecd20 | 2010-11-09 14:06:52 -0800 | [diff] [blame] | 493 | static const char *keyInputSource; | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 494 |  | 
|  | 495 | String8 toString(); | 
|  | 496 |  | 
|  | 497 | status_t add(const String8& key, const String8& value); | 
|  | 498 | status_t addInt(const String8& key, const int value); | 
|  | 499 | status_t addFloat(const String8& key, const float value); | 
|  | 500 |  | 
|  | 501 | status_t remove(const String8& key); | 
|  | 502 |  | 
|  | 503 | status_t get(const String8& key, String8& value); | 
|  | 504 | status_t getInt(const String8& key, int& value); | 
|  | 505 | status_t getFloat(const String8& key, float& value); | 
| Eric Laurent | a9c322e | 2009-08-27 00:48:47 -0700 | [diff] [blame] | 506 | status_t getAt(size_t index, String8& key, String8& value); | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 507 |  | 
|  | 508 | size_t size() { return mParameters.size(); } | 
|  | 509 |  | 
|  | 510 | private: | 
|  | 511 | String8 mKeyValuePairs; | 
|  | 512 | KeyedVector <String8, String8> mParameters; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 513 | }; | 
|  | 514 |  | 
|  | 515 | };  // namespace android | 
|  | 516 |  | 
|  | 517 | #endif  /*ANDROID_AUDIOSYSTEM_H_*/ |