| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2007 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_IAUDIOFLINGER_H | 
|  | 18 | #define ANDROID_IAUDIOFLINGER_H | 
|  | 19 |  | 
|  | 20 | #include <stdint.h> | 
|  | 21 | #include <sys/types.h> | 
|  | 22 | #include <unistd.h> | 
|  | 23 |  | 
|  | 24 | #include <utils/RefBase.h> | 
|  | 25 | #include <utils/Errors.h> | 
| Mathias Agopian | 7562408 | 2009-05-19 19:08:10 -0700 | [diff] [blame] | 26 | #include <binder/IInterface.h> | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 27 | #include <media/IAudioTrack.h> | 
|  | 28 | #include <media/IAudioRecord.h> | 
|  | 29 | #include <media/IAudioFlingerClient.h> | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 30 | #include <system/audio.h> | 
| Glenn Kasten | 18868c5 | 2012-03-07 09:15:37 -0800 | [diff] [blame] | 31 | #include <system/audio_policy.h> | 
| Eric Laurent | a4c5a55 | 2012-03-29 10:12:40 -0700 | [diff] [blame] | 32 | #include <hardware/audio_policy.h> | 
| Eric Laurent | e1315cf | 2011-05-17 19:16:02 -0700 | [diff] [blame] | 33 | #include <hardware/audio_effect.h> | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 34 | #include <media/IEffect.h> | 
|  | 35 | #include <media/IEffectClient.h> | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 36 | #include <utils/String8.h> | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 37 |  | 
|  | 38 | namespace android { | 
|  | 39 |  | 
|  | 40 | // ---------------------------------------------------------------------------- | 
|  | 41 |  | 
|  | 42 | class IAudioFlinger : public IInterface | 
|  | 43 | { | 
|  | 44 | public: | 
|  | 45 | DECLARE_META_INTERFACE(AudioFlinger); | 
|  | 46 |  | 
| Glenn Kasten | a075db4 | 2012-03-06 11:22:44 -0800 | [diff] [blame] | 47 | // or-able bits shared by createTrack and openRecord, but not all combinations make sense | 
|  | 48 | enum { | 
| Glenn Kasten | cc1110d | 2012-03-19 12:07:35 -0700 | [diff] [blame] | 49 | TRACK_DEFAULT = 0,  // client requests a default AudioTrack | 
|  | 50 | TRACK_TIMED   = 1,  // client requests a TimedAudioTrack | 
| Glenn Kasten | 1879fff | 2012-07-11 15:36:59 -0700 | [diff] [blame] | 51 | TRACK_FAST    = 2,  // client requests a fast AudioTrack or AudioRecord | 
| Richard Fitzgerald | ad3af33 | 2013-03-25 16:54:37 +0000 | [diff] [blame] | 52 | TRACK_OFFLOAD = 4,  // client requests offload to hw codec | 
| Glenn Kasten | a075db4 | 2012-03-06 11:22:44 -0800 | [diff] [blame] | 53 | }; | 
|  | 54 | typedef uint32_t track_flags_t; | 
|  | 55 |  | 
| Glenn Kasten | e93cf2c | 2013-09-24 11:52:37 -0700 | [diff] [blame] | 56 | // invariant on exit for all APIs that return an sp<>: | 
|  | 57 | //   (return value != 0) == (*status == NO_ERROR) | 
|  | 58 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 59 | /* create an audio track and registers it with AudioFlinger. | 
|  | 60 | * return null if the track cannot be created. | 
|  | 61 | */ | 
|  | 62 | virtual sp<IAudioTrack> createTrack( | 
| Glenn Kasten | fff6d71 | 2012-01-12 16:38:12 -0800 | [diff] [blame] | 63 | audio_stream_type_t streamType, | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 64 | uint32_t sampleRate, | 
| Glenn Kasten | 58f3021 | 2012-01-12 12:27:51 -0800 | [diff] [blame] | 65 | audio_format_t format, | 
| Glenn Kasten | dd8104c | 2012-07-02 12:42:44 -0700 | [diff] [blame] | 66 | audio_channel_mask_t channelMask, | 
| Glenn Kasten | 74935e4 | 2013-12-19 08:56:45 -0800 | [diff] [blame] | 67 | size_t *pFrameCount, | 
| Glenn Kasten | e0b0717 | 2012-11-06 15:03:34 -0800 | [diff] [blame] | 68 | track_flags_t *flags, | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 69 | const sp<IMemory>& sharedBuffer, | 
| Glenn Kasten | d631d96 | 2014-01-16 12:31:12 -0800 | [diff] [blame] | 70 | // On successful return, AudioFlinger takes over the handle | 
|  | 71 | // reference and will release it when the track is destroyed. | 
|  | 72 | // However on failure, the client is responsible for release. | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 73 | audio_io_handle_t output, | 
| Glenn Kasten | 3acbd05 | 2012-02-28 10:39:56 -0800 | [diff] [blame] | 74 | pid_t tid,  // -1 means unused, otherwise must be valid non-0 | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 75 | int *sessionId, | 
| Glenn Kasten | d054c32 | 2013-07-12 12:59:20 -0700 | [diff] [blame] | 76 | // input: ignored | 
|  | 77 | // output: server's description of IAudioTrack for display in logs. | 
|  | 78 | // Don't attempt to parse, as the format could change. | 
|  | 79 | String8& name, | 
| Marco Nelissen | 462fd2f | 2013-01-14 14:12:05 -0800 | [diff] [blame] | 80 | int clientUid, | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 81 | status_t *status) = 0; | 
|  | 82 |  | 
|  | 83 | virtual sp<IAudioRecord> openRecord( | 
| Glenn Kasten | d631d96 | 2014-01-16 12:31:12 -0800 | [diff] [blame] | 84 | // On successful return, AudioFlinger takes over the handle | 
|  | 85 | // reference and will release it when the track is destroyed. | 
|  | 86 | // However on failure, the client is responsible for release. | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 87 | audio_io_handle_t input, | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 88 | uint32_t sampleRate, | 
| Glenn Kasten | 58f3021 | 2012-01-12 12:27:51 -0800 | [diff] [blame] | 89 | audio_format_t format, | 
| Glenn Kasten | dd8104c | 2012-07-02 12:42:44 -0700 | [diff] [blame] | 90 | audio_channel_mask_t channelMask, | 
| Glenn Kasten | 74935e4 | 2013-12-19 08:56:45 -0800 | [diff] [blame] | 91 | size_t *pFrameCount, | 
| Glenn Kasten | eeca326 | 2013-07-31 16:12:48 -0700 | [diff] [blame] | 92 | track_flags_t *flags, | 
| Glenn Kasten | 1879fff | 2012-07-11 15:36:59 -0700 | [diff] [blame] | 93 | pid_t tid,  // -1 means unused, otherwise must be valid non-0 | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 94 | int *sessionId, | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 95 | status_t *status) = 0; | 
|  | 96 |  | 
|  | 97 | /* query the audio hardware state. This state never changes, | 
|  | 98 | * and therefore can be cached. | 
|  | 99 | */ | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 100 | virtual     uint32_t    sampleRate(audio_io_handle_t output) const = 0; | 
| Glenn Kasten | dd8104c | 2012-07-02 12:42:44 -0700 | [diff] [blame] | 101 | #if 0 | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 102 | virtual     int         channelCount(audio_io_handle_t output) const = 0; | 
| Glenn Kasten | dd8104c | 2012-07-02 12:42:44 -0700 | [diff] [blame] | 103 | #endif | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 104 | virtual     audio_format_t format(audio_io_handle_t output) const = 0; | 
|  | 105 | virtual     size_t      frameCount(audio_io_handle_t output) const = 0; | 
| Glenn Kasten | 688aac7 | 2012-03-09 10:30:26 -0800 | [diff] [blame] | 106 |  | 
|  | 107 | // return estimated latency in milliseconds | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 108 | virtual     uint32_t    latency(audio_io_handle_t output) const = 0; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 109 |  | 
|  | 110 | /* set/get the audio hardware state. This will probably be used by | 
|  | 111 | * the preference panel, mostly. | 
|  | 112 | */ | 
|  | 113 | virtual     status_t    setMasterVolume(float value) = 0; | 
|  | 114 | virtual     status_t    setMasterMute(bool muted) = 0; | 
|  | 115 |  | 
|  | 116 | virtual     float       masterVolume() const = 0; | 
|  | 117 | virtual     bool        masterMute() const = 0; | 
|  | 118 |  | 
|  | 119 | /* set/get stream type state. This will probably be used by | 
|  | 120 | * the preference panel, mostly. | 
|  | 121 | */ | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 122 | virtual     status_t    setStreamVolume(audio_stream_type_t stream, float value, | 
|  | 123 | audio_io_handle_t output) = 0; | 
| Glenn Kasten | fff6d71 | 2012-01-12 16:38:12 -0800 | [diff] [blame] | 124 | virtual     status_t    setStreamMute(audio_stream_type_t stream, bool muted) = 0; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 125 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 126 | virtual     float       streamVolume(audio_stream_type_t stream, | 
|  | 127 | audio_io_handle_t output) const = 0; | 
| Glenn Kasten | fff6d71 | 2012-01-12 16:38:12 -0800 | [diff] [blame] | 128 | virtual     bool        streamMute(audio_stream_type_t stream) const = 0; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 129 |  | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 130 | // set audio mode | 
| Glenn Kasten | f78aee7 | 2012-01-04 11:00:47 -0800 | [diff] [blame] | 131 | virtual     status_t    setMode(audio_mode_t mode) = 0; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 132 |  | 
|  | 133 | // mic mute/state | 
|  | 134 | virtual     status_t    setMicMute(bool state) = 0; | 
|  | 135 | virtual     bool        getMicMute() const = 0; | 
|  | 136 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 137 | virtual     status_t    setParameters(audio_io_handle_t ioHandle, | 
|  | 138 | const String8& keyValuePairs) = 0; | 
| Glenn Kasten | 85ab62c | 2012-11-01 11:11:38 -0700 | [diff] [blame] | 139 | virtual     String8     getParameters(audio_io_handle_t ioHandle, const String8& keys) | 
|  | 140 | const = 0; | 
| Eric Laurent | f0ee6f4 | 2009-10-21 08:14:22 -0700 | [diff] [blame] | 141 |  | 
| Glenn Kasten | fb1fdc9 | 2013-07-10 17:03:19 -0700 | [diff] [blame] | 142 | // Register an object to receive audio input/output change and track notifications. | 
|  | 143 | // For a given calling pid, AudioFlinger disregards any registrations after the first. | 
|  | 144 | // Thus the IAudioFlingerClient must be a singleton per process. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 145 | virtual void registerClient(const sp<IAudioFlingerClient>& client) = 0; | 
| Eric Laurent | f0ee6f4 | 2009-10-21 08:14:22 -0700 | [diff] [blame] | 146 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 147 | // retrieve the audio recording buffer size | 
| Glenn Kasten | dd8104c | 2012-07-02 12:42:44 -0700 | [diff] [blame] | 148 | virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, | 
|  | 149 | audio_channel_mask_t channelMask) const = 0; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 150 |  | 
| Eric Laurent | a4c5a55 | 2012-03-29 10:12:40 -0700 | [diff] [blame] | 151 | virtual audio_io_handle_t openOutput(audio_module_handle_t module, | 
|  | 152 | audio_devices_t *pDevices, | 
|  | 153 | uint32_t *pSamplingRate, | 
|  | 154 | audio_format_t *pFormat, | 
|  | 155 | audio_channel_mask_t *pChannelMask, | 
|  | 156 | uint32_t *pLatencyMs, | 
| Richard Fitzgerald | ad3af33 | 2013-03-25 16:54:37 +0000 | [diff] [blame] | 157 | audio_output_flags_t flags, | 
|  | 158 | const audio_offload_info_t *offloadInfo = NULL) = 0; | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 159 | virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, | 
|  | 160 | audio_io_handle_t output2) = 0; | 
|  | 161 | virtual status_t closeOutput(audio_io_handle_t output) = 0; | 
|  | 162 | virtual status_t suspendOutput(audio_io_handle_t output) = 0; | 
|  | 163 | virtual status_t restoreOutput(audio_io_handle_t output) = 0; | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 164 |  | 
| Eric Laurent | a4c5a55 | 2012-03-29 10:12:40 -0700 | [diff] [blame] | 165 | virtual audio_io_handle_t openInput(audio_module_handle_t module, | 
|  | 166 | audio_devices_t *pDevices, | 
|  | 167 | uint32_t *pSamplingRate, | 
|  | 168 | audio_format_t *pFormat, | 
|  | 169 | audio_channel_mask_t *pChannelMask) = 0; | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 170 | virtual status_t closeInput(audio_io_handle_t input) = 0; | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 171 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 172 | virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output) = 0; | 
| Eric Laurent | f0ee6f4 | 2009-10-21 08:14:22 -0700 | [diff] [blame] | 173 |  | 
|  | 174 | virtual status_t setVoiceVolume(float volume) = 0; | 
| Eric Laurent | 05bca2f | 2010-02-26 02:47:27 -0800 | [diff] [blame] | 175 |  | 
| Glenn Kasten | e33054e | 2012-11-14 12:54:39 -0800 | [diff] [blame] | 176 | virtual status_t getRenderPosition(size_t *halFrames, size_t *dspFrames, | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 177 | audio_io_handle_t output) const = 0; | 
| Eric Laurent | 05bca2f | 2010-02-26 02:47:27 -0800 | [diff] [blame] | 178 |  | 
| Glenn Kasten | 5f972c0 | 2014-01-13 09:59:31 -0800 | [diff] [blame] | 179 | virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const = 0; | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 180 |  | 
|  | 181 | virtual int newAudioSessionId() = 0; | 
|  | 182 |  | 
| Marco Nelissen | 3a34bef | 2011-08-02 13:33:41 -0700 | [diff] [blame] | 183 | virtual void acquireAudioSessionId(int audioSession) = 0; | 
|  | 184 | virtual void releaseAudioSessionId(int audioSession) = 0; | 
|  | 185 |  | 
| Glenn Kasten | f587ba5 | 2012-01-26 16:25:10 -0800 | [diff] [blame] | 186 | virtual status_t queryNumberEffects(uint32_t *numEffects) const = 0; | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 187 |  | 
| Glenn Kasten | f587ba5 | 2012-01-26 16:25:10 -0800 | [diff] [blame] | 188 | virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const = 0; | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 189 |  | 
| Glenn Kasten | 5e92a78 | 2012-01-30 07:40:52 -0800 | [diff] [blame] | 190 | virtual status_t getEffectDescriptor(const effect_uuid_t *pEffectUUID, | 
| Glenn Kasten | f587ba5 | 2012-01-26 16:25:10 -0800 | [diff] [blame] | 191 | effect_descriptor_t *pDescriptor) const = 0; | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 192 |  | 
| Glenn Kasten | 8d6cc84 | 2012-02-03 11:06:53 -0800 | [diff] [blame] | 193 | virtual sp<IEffect> createEffect( | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 194 | effect_descriptor_t *pDesc, | 
|  | 195 | const sp<IEffectClient>& client, | 
|  | 196 | int32_t priority, | 
| Glenn Kasten | d631d96 | 2014-01-16 12:31:12 -0800 | [diff] [blame] | 197 | // AudioFlinger doesn't take over handle reference from client | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 198 | audio_io_handle_t output, | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 199 | int sessionId, | 
|  | 200 | status_t *status, | 
|  | 201 | int *id, | 
|  | 202 | int *enabled) = 0; | 
| Eric Laurent | de07013 | 2010-07-13 04:45:46 -0700 | [diff] [blame] | 203 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 204 | virtual status_t moveEffects(int session, audio_io_handle_t srcOutput, | 
|  | 205 | audio_io_handle_t dstOutput) = 0; | 
| Eric Laurent | a4c5a55 | 2012-03-29 10:12:40 -0700 | [diff] [blame] | 206 |  | 
|  | 207 | virtual audio_module_handle_t loadHwModule(const char *name) = 0; | 
| Glenn Kasten | cc0f1cf | 2012-09-24 11:27:18 -0700 | [diff] [blame] | 208 |  | 
|  | 209 | // helpers for android.media.AudioManager.getProperty(), see description there for meaning | 
|  | 210 | // FIXME move these APIs to AudioPolicy to permit a more accurate implementation | 
|  | 211 | // that looks on primary device for a stream with fast flag, primary flag, or first one. | 
| Glenn Kasten | 3b16c76 | 2012-11-14 08:44:39 -0800 | [diff] [blame] | 212 | virtual uint32_t getPrimaryOutputSamplingRate() = 0; | 
| Glenn Kasten | e33054e | 2012-11-14 12:54:39 -0800 | [diff] [blame] | 213 | virtual size_t getPrimaryOutputFrameCount() = 0; | 
| Glenn Kasten | cc0f1cf | 2012-09-24 11:27:18 -0700 | [diff] [blame] | 214 |  | 
| Glenn Kasten | 4182c4e | 2013-07-15 14:45:07 -0700 | [diff] [blame] | 215 | // Intended for AudioService to inform AudioFlinger of device's low RAM attribute, | 
|  | 216 | // and should be called at most once.  For a definition of what "low RAM" means, see | 
|  | 217 | // android.app.ActivityManager.isLowRamDevice(). | 
|  | 218 | virtual status_t setLowRamDevice(bool isLowRamDevice) = 0; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 219 | }; | 
|  | 220 |  | 
|  | 221 |  | 
|  | 222 | // ---------------------------------------------------------------------------- | 
|  | 223 |  | 
|  | 224 | class BnAudioFlinger : public BnInterface<IAudioFlinger> | 
|  | 225 | { | 
|  | 226 | public: | 
|  | 227 | virtual status_t    onTransact( uint32_t code, | 
|  | 228 | const Parcel& data, | 
|  | 229 | Parcel* reply, | 
|  | 230 | uint32_t flags = 0); | 
|  | 231 | }; | 
|  | 232 |  | 
|  | 233 | // ---------------------------------------------------------------------------- | 
|  | 234 |  | 
|  | 235 | }; // namespace android | 
|  | 236 |  | 
|  | 237 | #endif // ANDROID_IAUDIOFLINGER_H |