| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 1 | /* | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 2 | ** | 
 | 3 | ** Copyright 2007, The Android Open Source Project | 
 | 4 | ** | 
 | 5 | ** Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 6 | ** you may not use this file except in compliance with the License. | 
 | 7 | ** You may obtain a copy of the License at | 
 | 8 | ** | 
 | 9 | **     http://www.apache.org/licenses/LICENSE-2.0 | 
 | 10 | ** | 
 | 11 | ** Unless required by applicable law or agreed to in writing, software | 
 | 12 | ** distributed under the License is distributed on an "AS IS" BASIS, | 
 | 13 | ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 14 | ** See the License for the specific language governing permissions and | 
 | 15 | ** limitations under the License. | 
 | 16 | */ | 
 | 17 |  | 
 | 18 | #ifndef ANDROID_AUDIO_FLINGER_H | 
 | 19 | #define ANDROID_AUDIO_FLINGER_H | 
 | 20 |  | 
| Glenn Kasten | 5b17c0b | 2014-05-13 10:55:33 -0700 | [diff] [blame] | 21 | #include "Configuration.h" | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 22 | #include <stdint.h> | 
 | 23 | #include <sys/types.h> | 
 | 24 | #include <limits.h> | 
 | 25 |  | 
| John Grossman | 4ff14ba | 2012-02-08 16:37:41 -0800 | [diff] [blame] | 26 | #include <common_time/cc_helper.h> | 
 | 27 |  | 
| Mathias Agopian | e762be9 | 2013-05-09 16:26:45 -0700 | [diff] [blame] | 28 | #include <cutils/compiler.h> | 
 | 29 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 30 | #include <media/IAudioFlinger.h> | 
 | 31 | #include <media/IAudioFlingerClient.h> | 
 | 32 | #include <media/IAudioTrack.h> | 
 | 33 | #include <media/IAudioRecord.h> | 
| Glenn Kasten | 335787f | 2012-01-20 17:00:00 -0800 | [diff] [blame] | 34 | #include <media/AudioSystem.h> | 
| John Grossman | 4ff14ba | 2012-02-08 16:37:41 -0800 | [diff] [blame] | 35 | #include <media/AudioTrack.h> | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 36 |  | 
 | 37 | #include <utils/Atomic.h> | 
 | 38 | #include <utils/Errors.h> | 
 | 39 | #include <utils/threads.h> | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 40 | #include <utils/SortedVector.h> | 
| Dima Zavin | 799a70e | 2011-04-18 16:57:27 -0700 | [diff] [blame] | 41 | #include <utils/TypeHelpers.h> | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 42 | #include <utils/Vector.h> | 
 | 43 |  | 
| Mathias Agopian | 5462fc9 | 2010-07-14 18:41:18 -0700 | [diff] [blame] | 44 | #include <binder/BinderService.h> | 
 | 45 | #include <binder/MemoryDealer.h> | 
 | 46 |  | 
| Dima Zavin | 6476024 | 2011-05-11 14:15:23 -0700 | [diff] [blame] | 47 | #include <system/audio.h> | 
| Dima Zavin | 7394a4f | 2011-06-13 18:16:26 -0700 | [diff] [blame] | 48 | #include <hardware/audio.h> | 
| Eric Laurent | a4c5a55 | 2012-03-29 10:12:40 -0700 | [diff] [blame] | 49 | #include <hardware/audio_policy.h> | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 50 |  | 
| Glenn Kasten | 2dd4bdd | 2012-08-29 11:10:32 -0700 | [diff] [blame] | 51 | #include <media/AudioBufferProvider.h> | 
 | 52 | #include <media/ExtendedAudioBufferProvider.h> | 
| Glenn Kasten | 6dbb5e3 | 2014-05-13 10:38:42 -0700 | [diff] [blame] | 53 |  | 
 | 54 | #include "FastCapture.h" | 
| Glenn Kasten | 5891256 | 2012-04-03 10:45:00 -0700 | [diff] [blame] | 55 | #include "FastMixer.h" | 
| Glenn Kasten | 2dd4bdd | 2012-08-29 11:10:32 -0700 | [diff] [blame] | 56 | #include <media/nbaio/NBAIO.h> | 
| Glenn Kasten | c15d665 | 2012-05-30 14:52:57 -0700 | [diff] [blame] | 57 | #include "AudioWatchdog.h" | 
| Andy Hung | 9a59276 | 2014-07-21 21:56:01 -0700 | [diff] [blame] | 58 | #include "AudioMixer.h" | 
| Phil Burk | 062e67a | 2015-02-11 13:40:50 -0800 | [diff] [blame] | 59 | #include "AudioStreamOut.h" | 
 | 60 | #include "SpdifStreamOut.h" | 
 | 61 | #include "AudioHwDevice.h" | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 62 |  | 
| Eric Laurent | feb0db6 | 2011-07-22 09:04:31 -0700 | [diff] [blame] | 63 | #include <powermanager/IPowerManager.h> | 
 | 64 |  | 
| Glenn Kasten | 9e58b55 | 2013-01-18 15:09:48 -0800 | [diff] [blame] | 65 | #include <media/nbaio/NBLog.h> | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 66 | #include <private/media/AudioTrackShared.h> | 
| Glenn Kasten | 9e58b55 | 2013-01-18 15:09:48 -0800 | [diff] [blame] | 67 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 68 | namespace android { | 
 | 69 |  | 
| Glenn Kasten | 01d3acb | 2014-02-06 08:24:07 -0800 | [diff] [blame] | 70 | struct audio_track_cblk_t; | 
 | 71 | struct effect_param_cblk_t; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 72 | class AudioMixer; | 
 | 73 | class AudioBuffer; | 
 | 74 | class AudioResampler; | 
| Glenn Kasten | 5891256 | 2012-04-03 10:45:00 -0700 | [diff] [blame] | 75 | class FastMixer; | 
| Andy Hung | d330ee4 | 2015-04-20 13:23:41 -0700 | [diff] [blame] | 76 | class PassthruBufferProvider; | 
| Glenn Kasten | e3aa659 | 2012-12-04 12:22:46 -0800 | [diff] [blame] | 77 | class ServerProxy; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 78 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 79 | // ---------------------------------------------------------------------------- | 
 | 80 |  | 
| Andy Hung | d330ee4 | 2015-04-20 13:23:41 -0700 | [diff] [blame] | 81 | // The macro FCC_2 highlights some (but not all) places where there are are 2-channel assumptions. | 
 | 82 | // This is typically due to legacy implementation of stereo input or output. | 
| Glenn Kasten | 53d76db | 2012-03-08 12:32:47 -0800 | [diff] [blame] | 83 | // Search also for "2", "left", "right", "[0]", "[1]", ">> 16", "<< 16", etc. | 
 | 84 | #define FCC_2 2     // FCC_2 = Fixed Channel Count 2 | 
| Andy Hung | d330ee4 | 2015-04-20 13:23:41 -0700 | [diff] [blame] | 85 | // The macro FCC_8 highlights places where there are 8-channel assumptions. | 
 | 86 | // This is typically due to audio mixer and resampler limitations. | 
 | 87 | #define FCC_8 8     // FCC_8 = Fixed Channel Count 8 | 
| Glenn Kasten | 53d76db | 2012-03-08 12:32:47 -0800 | [diff] [blame] | 88 |  | 
| John Grossman | 4ff14ba | 2012-02-08 16:37:41 -0800 | [diff] [blame] | 89 | static const nsecs_t kDefaultStandbyTimeInNsecs = seconds(3); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 90 |  | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 91 | #define INCLUDING_FROM_AUDIOFLINGER_H | 
 | 92 |  | 
| Mathias Agopian | 5462fc9 | 2010-07-14 18:41:18 -0700 | [diff] [blame] | 93 | class AudioFlinger : | 
 | 94 |     public BinderService<AudioFlinger>, | 
 | 95 |     public BnAudioFlinger | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 96 | { | 
| Glenn Kasten | 1998661 | 2012-03-09 12:07:30 -0800 | [diff] [blame] | 97 |     friend class BinderService<AudioFlinger>;   // for AudioFlinger() | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 98 | public: | 
| Mathias Agopian | e762be9 | 2013-05-09 16:26:45 -0700 | [diff] [blame] | 99 |     static const char* getServiceName() ANDROID_API { return "media.audio_flinger"; } | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 100 |  | 
 | 101 |     virtual     status_t    dump(int fd, const Vector<String16>& args); | 
 | 102 |  | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 103 |     // IAudioFlinger interface, in binder opcode order | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 104 |     virtual sp<IAudioTrack> createTrack( | 
| Glenn Kasten | fff6d71 | 2012-01-12 16:38:12 -0800 | [diff] [blame] | 105 |                                 audio_stream_type_t streamType, | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 106 |                                 uint32_t sampleRate, | 
| Glenn Kasten | 58f3021 | 2012-01-12 12:27:51 -0800 | [diff] [blame] | 107 |                                 audio_format_t format, | 
| Glenn Kasten | dd8104c | 2012-07-02 12:42:44 -0700 | [diff] [blame] | 108 |                                 audio_channel_mask_t channelMask, | 
| Glenn Kasten | 74935e4 | 2013-12-19 08:56:45 -0800 | [diff] [blame] | 109 |                                 size_t *pFrameCount, | 
| Glenn Kasten | e0b0717 | 2012-11-06 15:03:34 -0800 | [diff] [blame] | 110 |                                 IAudioFlinger::track_flags_t *flags, | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 111 |                                 const sp<IMemory>& sharedBuffer, | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 112 |                                 audio_io_handle_t output, | 
| Glenn Kasten | 3acbd05 | 2012-02-28 10:39:56 -0800 | [diff] [blame] | 113 |                                 pid_t tid, | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 114 |                                 int *sessionId, | 
| Marco Nelissen | 462fd2f | 2013-01-14 14:12:05 -0800 | [diff] [blame] | 115 |                                 int clientUid, | 
| Glenn Kasten | 9156ef3 | 2013-08-06 15:39:08 -0700 | [diff] [blame] | 116 |                                 status_t *status /*non-NULL*/); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 117 |  | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 118 |     virtual sp<IAudioRecord> openRecord( | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 119 |                                 audio_io_handle_t input, | 
 | 120 |                                 uint32_t sampleRate, | 
 | 121 |                                 audio_format_t format, | 
| Glenn Kasten | dd8104c | 2012-07-02 12:42:44 -0700 | [diff] [blame] | 122 |                                 audio_channel_mask_t channelMask, | 
| Svet Ganov | be71aa2 | 2015-04-28 12:06:02 -0700 | [diff] [blame] | 123 |                                 const String16& opPackageName, | 
| Glenn Kasten | 74935e4 | 2013-12-19 08:56:45 -0800 | [diff] [blame] | 124 |                                 size_t *pFrameCount, | 
| Glenn Kasten | eeca326 | 2013-07-31 16:12:48 -0700 | [diff] [blame] | 125 |                                 IAudioFlinger::track_flags_t *flags, | 
| Glenn Kasten | 1879fff | 2012-07-11 15:36:59 -0700 | [diff] [blame] | 126 |                                 pid_t tid, | 
| Jean-Michel Trivi | 4cb6683 | 2015-05-01 18:34:17 -0700 | [diff] [blame] | 127 |                                 int clientUid, | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 128 |                                 int *sessionId, | 
| Glenn Kasten | 7df8c0b | 2014-07-03 12:23:29 -0700 | [diff] [blame] | 129 |                                 size_t *notificationFrames, | 
| Glenn Kasten | d776ac6 | 2014-05-07 09:16:09 -0700 | [diff] [blame] | 130 |                                 sp<IMemory>& cblk, | 
 | 131 |                                 sp<IMemory>& buffers, | 
| Glenn Kasten | 9156ef3 | 2013-08-06 15:39:08 -0700 | [diff] [blame] | 132 |                                 status_t *status /*non-NULL*/); | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 133 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 134 |     virtual     uint32_t    sampleRate(audio_io_handle_t output) const; | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 135 |     virtual     audio_format_t format(audio_io_handle_t output) const; | 
 | 136 |     virtual     size_t      frameCount(audio_io_handle_t output) const; | 
 | 137 |     virtual     uint32_t    latency(audio_io_handle_t output) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 138 |  | 
 | 139 |     virtual     status_t    setMasterVolume(float value); | 
 | 140 |     virtual     status_t    setMasterMute(bool muted); | 
 | 141 |  | 
 | 142 |     virtual     float       masterVolume() const; | 
 | 143 |     virtual     bool        masterMute() const; | 
 | 144 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 145 |     virtual     status_t    setStreamVolume(audio_stream_type_t stream, float value, | 
 | 146 |                                             audio_io_handle_t output); | 
| Glenn Kasten | fff6d71 | 2012-01-12 16:38:12 -0800 | [diff] [blame] | 147 |     virtual     status_t    setStreamMute(audio_stream_type_t stream, bool muted); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 148 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 149 |     virtual     float       streamVolume(audio_stream_type_t stream, | 
 | 150 |                                          audio_io_handle_t output) const; | 
| Glenn Kasten | fff6d71 | 2012-01-12 16:38:12 -0800 | [diff] [blame] | 151 |     virtual     bool        streamMute(audio_stream_type_t stream) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 152 |  | 
| Glenn Kasten | f78aee7 | 2012-01-04 11:00:47 -0800 | [diff] [blame] | 153 |     virtual     status_t    setMode(audio_mode_t mode); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 154 |  | 
 | 155 |     virtual     status_t    setMicMute(bool state); | 
 | 156 |     virtual     bool        getMicMute() const; | 
 | 157 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 158 |     virtual     status_t    setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs); | 
 | 159 |     virtual     String8     getParameters(audio_io_handle_t ioHandle, const String8& keys) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 160 |  | 
 | 161 |     virtual     void        registerClient(const sp<IAudioFlingerClient>& client); | 
 | 162 |  | 
| Glenn Kasten | dd8104c | 2012-07-02 12:42:44 -0700 | [diff] [blame] | 163 |     virtual     size_t      getInputBufferSize(uint32_t sampleRate, audio_format_t format, | 
 | 164 |                                                audio_channel_mask_t channelMask) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 165 |  | 
| Eric Laurent | cf2c021 | 2014-07-25 16:20:43 -0700 | [diff] [blame] | 166 |     virtual status_t openOutput(audio_module_handle_t module, | 
 | 167 |                                 audio_io_handle_t *output, | 
 | 168 |                                 audio_config_t *config, | 
 | 169 |                                 audio_devices_t *devices, | 
 | 170 |                                 const String8& address, | 
 | 171 |                                 uint32_t *latencyMs, | 
 | 172 |                                 audio_output_flags_t flags); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 173 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 174 |     virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, | 
 | 175 |                                                   audio_io_handle_t output2); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 176 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 177 |     virtual status_t closeOutput(audio_io_handle_t output); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 178 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 179 |     virtual status_t suspendOutput(audio_io_handle_t output); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 180 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 181 |     virtual status_t restoreOutput(audio_io_handle_t output); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 182 |  | 
| Eric Laurent | cf2c021 | 2014-07-25 16:20:43 -0700 | [diff] [blame] | 183 |     virtual status_t openInput(audio_module_handle_t module, | 
 | 184 |                                audio_io_handle_t *input, | 
 | 185 |                                audio_config_t *config, | 
 | 186 |                                audio_devices_t *device, | 
 | 187 |                                const String8& address, | 
 | 188 |                                audio_source_t source, | 
 | 189 |                                audio_input_flags_t flags); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 190 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 191 |     virtual status_t closeInput(audio_io_handle_t input); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 192 |  | 
| Glenn Kasten | d2304db | 2014-02-03 07:40:31 -0800 | [diff] [blame] | 193 |     virtual status_t invalidateStream(audio_stream_type_t stream); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 194 |  | 
 | 195 |     virtual status_t setVoiceVolume(float volume); | 
 | 196 |  | 
| Kévin PETIT | 377b2ec | 2014-02-03 12:35:36 +0000 | [diff] [blame] | 197 |     virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 198 |                                        audio_io_handle_t output) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 199 |  | 
| Glenn Kasten | 5f972c0 | 2014-01-13 09:59:31 -0800 | [diff] [blame] | 200 |     virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const; | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 201 |  | 
| Eric Laurent | de3f839 | 2014-07-27 18:38:22 -0700 | [diff] [blame] | 202 |     virtual audio_unique_id_t newAudioUniqueId(); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 203 |  | 
| Marco Nelissen | d457c97 | 2014-02-11 08:47:07 -0800 | [diff] [blame] | 204 |     virtual void acquireAudioSessionId(int audioSession, pid_t pid); | 
| Marco Nelissen | 3a34bef | 2011-08-02 13:33:41 -0700 | [diff] [blame] | 205 |  | 
| Marco Nelissen | d457c97 | 2014-02-11 08:47:07 -0800 | [diff] [blame] | 206 |     virtual void releaseAudioSessionId(int audioSession, pid_t pid); | 
| Marco Nelissen | 3a34bef | 2011-08-02 13:33:41 -0700 | [diff] [blame] | 207 |  | 
| Glenn Kasten | f587ba5 | 2012-01-26 16:25:10 -0800 | [diff] [blame] | 208 |     virtual status_t queryNumberEffects(uint32_t *numEffects) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 209 |  | 
| Glenn Kasten | f587ba5 | 2012-01-26 16:25:10 -0800 | [diff] [blame] | 210 |     virtual status_t queryEffect(uint32_t index, effect_descriptor_t *descriptor) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 211 |  | 
| Glenn Kasten | 5e92a78 | 2012-01-30 07:40:52 -0800 | [diff] [blame] | 212 |     virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, | 
| Glenn Kasten | f587ba5 | 2012-01-26 16:25:10 -0800 | [diff] [blame] | 213 |                                          effect_descriptor_t *descriptor) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 214 |  | 
| Glenn Kasten | 8d6cc84 | 2012-02-03 11:06:53 -0800 | [diff] [blame] | 215 |     virtual sp<IEffect> createEffect( | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 216 |                         effect_descriptor_t *pDesc, | 
 | 217 |                         const sp<IEffectClient>& effectClient, | 
 | 218 |                         int32_t priority, | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 219 |                         audio_io_handle_t io, | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 220 |                         int sessionId, | 
| Svet Ganov | be71aa2 | 2015-04-28 12:06:02 -0700 | [diff] [blame] | 221 |                         const String16& opPackageName, | 
| Glenn Kasten | 9156ef3 | 2013-08-06 15:39:08 -0700 | [diff] [blame] | 222 |                         status_t *status /*non-NULL*/, | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 223 |                         int *id, | 
 | 224 |                         int *enabled); | 
 | 225 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 226 |     virtual status_t moveEffects(int sessionId, audio_io_handle_t srcOutput, | 
 | 227 |                         audio_io_handle_t dstOutput); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 228 |  | 
| Eric Laurent | a4c5a55 | 2012-03-29 10:12:40 -0700 | [diff] [blame] | 229 |     virtual audio_module_handle_t loadHwModule(const char *name); | 
 | 230 |  | 
| Glenn Kasten | 3b16c76 | 2012-11-14 08:44:39 -0800 | [diff] [blame] | 231 |     virtual uint32_t getPrimaryOutputSamplingRate(); | 
| Glenn Kasten | e33054e | 2012-11-14 12:54:39 -0800 | [diff] [blame] | 232 |     virtual size_t getPrimaryOutputFrameCount(); | 
| Glenn Kasten | cc0f1cf | 2012-09-24 11:27:18 -0700 | [diff] [blame] | 233 |  | 
| Glenn Kasten | 4182c4e | 2013-07-15 14:45:07 -0700 | [diff] [blame] | 234 |     virtual status_t setLowRamDevice(bool isLowRamDevice); | 
 | 235 |  | 
| Eric Laurent | 4b12340 | 2014-04-11 09:22:20 -0700 | [diff] [blame] | 236 |     /* List available audio ports and their attributes */ | 
 | 237 |     virtual status_t listAudioPorts(unsigned int *num_ports, | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 238 |                                     struct audio_port *ports); | 
| Eric Laurent | 4b12340 | 2014-04-11 09:22:20 -0700 | [diff] [blame] | 239 |  | 
 | 240 |     /* Get attributes for a given audio port */ | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 241 |     virtual status_t getAudioPort(struct audio_port *port); | 
| Eric Laurent | 4b12340 | 2014-04-11 09:22:20 -0700 | [diff] [blame] | 242 |  | 
 | 243 |     /* Create an audio patch between several source and sink ports */ | 
 | 244 |     virtual status_t createAudioPatch(const struct audio_patch *patch, | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 245 |                                        audio_patch_handle_t *handle); | 
| Eric Laurent | 4b12340 | 2014-04-11 09:22:20 -0700 | [diff] [blame] | 246 |  | 
 | 247 |     /* Release an audio patch */ | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 248 |     virtual status_t releaseAudioPatch(audio_patch_handle_t handle); | 
| Eric Laurent | 4b12340 | 2014-04-11 09:22:20 -0700 | [diff] [blame] | 249 |  | 
 | 250 |     /* List existing audio patches */ | 
 | 251 |     virtual status_t listAudioPatches(unsigned int *num_patches, | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 252 |                                       struct audio_patch *patches); | 
 | 253 |  | 
| Eric Laurent | 4b12340 | 2014-04-11 09:22:20 -0700 | [diff] [blame] | 254 |     /* Set audio port configuration */ | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 255 |     virtual status_t setAudioPortConfig(const struct audio_port_config *config); | 
| Eric Laurent | 4b12340 | 2014-04-11 09:22:20 -0700 | [diff] [blame] | 256 |  | 
| Eric Laurent | 93c3d41 | 2014-08-01 14:48:35 -0700 | [diff] [blame] | 257 |     /* Get the HW synchronization source used for an audio session */ | 
 | 258 |     virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId); | 
 | 259 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 260 |     virtual     status_t    onTransact( | 
 | 261 |                                 uint32_t code, | 
 | 262 |                                 const Parcel& data, | 
 | 263 |                                 Parcel* reply, | 
 | 264 |                                 uint32_t flags); | 
 | 265 |  | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 266 |     // end of IAudioFlinger interface | 
 | 267 |  | 
| Glenn Kasten | 9e58b55 | 2013-01-18 15:09:48 -0800 | [diff] [blame] | 268 |     sp<NBLog::Writer>   newWriter_l(size_t size, const char *name); | 
 | 269 |     void                unregisterWriter(const sp<NBLog::Writer>& writer); | 
 | 270 | private: | 
| Glenn Kasten | 481fb67 | 2013-09-30 14:39:28 -0700 | [diff] [blame] | 271 |     static const size_t kLogMemorySize = 40 * 1024; | 
| Glenn Kasten | 9e58b55 | 2013-01-18 15:09:48 -0800 | [diff] [blame] | 272 |     sp<MemoryDealer>    mLogMemoryDealer;   // == 0 when NBLog is disabled | 
| Glenn Kasten | 481fb67 | 2013-09-30 14:39:28 -0700 | [diff] [blame] | 273 |     // When a log writer is unregistered, it is done lazily so that media.log can continue to see it | 
 | 274 |     // for as long as possible.  The memory is only freed when it is needed for another log writer. | 
 | 275 |     Vector< sp<NBLog::Writer> > mUnregisteredWriters; | 
 | 276 |     Mutex               mUnregisteredWritersLock; | 
| Glenn Kasten | 9e58b55 | 2013-01-18 15:09:48 -0800 | [diff] [blame] | 277 | public: | 
 | 278 |  | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 279 |     class SyncEvent; | 
 | 280 |  | 
 | 281 |     typedef void (*sync_event_callback_t)(const wp<SyncEvent>& event) ; | 
 | 282 |  | 
 | 283 |     class SyncEvent : public RefBase { | 
 | 284 |     public: | 
 | 285 |         SyncEvent(AudioSystem::sync_event_t type, | 
 | 286 |                   int triggerSession, | 
 | 287 |                   int listenerSession, | 
 | 288 |                   sync_event_callback_t callBack, | 
| Eric Laurent | 8ea16e4 | 2014-02-20 16:26:11 -0800 | [diff] [blame] | 289 |                   wp<RefBase> cookie) | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 290 |         : mType(type), mTriggerSession(triggerSession), mListenerSession(listenerSession), | 
 | 291 |           mCallback(callBack), mCookie(cookie) | 
 | 292 |         {} | 
 | 293 |  | 
 | 294 |         virtual ~SyncEvent() {} | 
 | 295 |  | 
 | 296 |         void trigger() { Mutex::Autolock _l(mLock); if (mCallback) mCallback(this); } | 
| Glenn Kasten | 106e8a4 | 2012-08-02 13:37:12 -0700 | [diff] [blame] | 297 |         bool isCancelled() const { Mutex::Autolock _l(mLock); return (mCallback == NULL); } | 
 | 298 |         void cancel() { Mutex::Autolock _l(mLock); mCallback = NULL; } | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 299 |         AudioSystem::sync_event_t type() const { return mType; } | 
 | 300 |         int triggerSession() const { return mTriggerSession; } | 
 | 301 |         int listenerSession() const { return mListenerSession; } | 
| Eric Laurent | 8ea16e4 | 2014-02-20 16:26:11 -0800 | [diff] [blame] | 302 |         wp<RefBase> cookie() const { return mCookie; } | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 303 |  | 
 | 304 |     private: | 
 | 305 |           const AudioSystem::sync_event_t mType; | 
 | 306 |           const int mTriggerSession; | 
 | 307 |           const int mListenerSession; | 
 | 308 |           sync_event_callback_t mCallback; | 
| Eric Laurent | 8ea16e4 | 2014-02-20 16:26:11 -0800 | [diff] [blame] | 309 |           const wp<RefBase> mCookie; | 
| Glenn Kasten | 106e8a4 | 2012-08-02 13:37:12 -0700 | [diff] [blame] | 310 |           mutable Mutex mLock; | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 311 |     }; | 
 | 312 |  | 
 | 313 |     sp<SyncEvent> createSyncEvent(AudioSystem::sync_event_t type, | 
 | 314 |                                         int triggerSession, | 
 | 315 |                                         int listenerSession, | 
 | 316 |                                         sync_event_callback_t callBack, | 
| Eric Laurent | 8ea16e4 | 2014-02-20 16:26:11 -0800 | [diff] [blame] | 317 |                                         wp<RefBase> cookie); | 
| Eric Laurent | 717e128 | 2012-06-29 16:36:52 -0700 | [diff] [blame] | 318 |  | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 319 | private: | 
| John Grossman | ee578c0 | 2012-07-23 17:05:46 -0700 | [diff] [blame] | 320 |  | 
| Glenn Kasten | f78aee7 | 2012-01-04 11:00:47 -0800 | [diff] [blame] | 321 |                audio_mode_t getMode() const { return mMode; } | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 322 |  | 
| Glenn Kasten | c59c004 | 2012-02-02 14:06:11 -0800 | [diff] [blame] | 323 |                 bool        btNrecIsOff() const { return mBtNrecIsOff; } | 
| Eric Laurent | 59bd0da | 2011-08-01 09:52:20 -0700 | [diff] [blame] | 324 |  | 
| Mathias Agopian | e762be9 | 2013-05-09 16:26:45 -0700 | [diff] [blame] | 325 |                             AudioFlinger() ANDROID_API; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 326 |     virtual                 ~AudioFlinger(); | 
 | 327 |  | 
| Glenn Kasten | 2b213bc | 2012-02-02 14:05:20 -0800 | [diff] [blame] | 328 |     // call in any IAudioFlinger method that accesses mPrimaryHardwareDev | 
| Glenn Kasten | 85ab62c | 2012-11-01 11:11:38 -0700 | [diff] [blame] | 329 |     status_t                initCheck() const { return mPrimaryHardwareDev == NULL ? | 
 | 330 |                                                         NO_INIT : NO_ERROR; } | 
| Glenn Kasten | 2b213bc | 2012-02-02 14:05:20 -0800 | [diff] [blame] | 331 |  | 
| Glenn Kasten | 000f0e3 | 2012-03-01 17:10:56 -0800 | [diff] [blame] | 332 |     // RefBase | 
| Dima Zavin | 5a61d2f | 2011-04-19 19:04:32 -0700 | [diff] [blame] | 333 |     virtual     void        onFirstRef(); | 
| Glenn Kasten | 000f0e3 | 2012-03-01 17:10:56 -0800 | [diff] [blame] | 334 |  | 
| Glenn Kasten | 85ab62c | 2012-11-01 11:11:38 -0700 | [diff] [blame] | 335 |     AudioHwDevice*          findSuitableHwDev_l(audio_module_handle_t module, | 
 | 336 |                                                 audio_devices_t devices); | 
| Marco Nelissen | 3a34bef | 2011-08-02 13:33:41 -0700 | [diff] [blame] | 337 |     void                    purgeStaleEffects_l(); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 338 |  | 
| Andy Hung | 9a59276 | 2014-07-21 21:56:01 -0700 | [diff] [blame] | 339 |     // Set kEnableExtendedChannels to true to enable greater than stereo output | 
 | 340 |     // for the MixerThread and device sink.  Number of channels allowed is | 
 | 341 |     // FCC_2 <= channels <= AudioMixer::MAX_NUM_CHANNELS. | 
| Andy Hung | b1ee395 | 2014-07-28 16:28:06 -0700 | [diff] [blame] | 342 |     static const bool kEnableExtendedChannels = true; | 
| Andy Hung | 9a59276 | 2014-07-21 21:56:01 -0700 | [diff] [blame] | 343 |  | 
 | 344 |     // Returns true if channel mask is permitted for the PCM sink in the MixerThread | 
 | 345 |     static inline bool isValidPcmSinkChannelMask(audio_channel_mask_t channelMask) { | 
 | 346 |         switch (audio_channel_mask_get_representation(channelMask)) { | 
 | 347 |         case AUDIO_CHANNEL_REPRESENTATION_POSITION: { | 
 | 348 |             uint32_t channelCount = FCC_2; // stereo is default | 
 | 349 |             if (kEnableExtendedChannels) { | 
 | 350 |                 channelCount = audio_channel_count_from_out_mask(channelMask); | 
| Andy Hung | 389cfdb | 2014-08-07 17:49:53 -0700 | [diff] [blame] | 351 |                 if (channelCount < FCC_2 // mono is not supported at this time | 
 | 352 |                         || channelCount > AudioMixer::MAX_NUM_CHANNELS) { | 
| Andy Hung | 9a59276 | 2014-07-21 21:56:01 -0700 | [diff] [blame] | 353 |                     return false; | 
 | 354 |                 } | 
 | 355 |             } | 
 | 356 |             // check that channelMask is the "canonical" one we expect for the channelCount. | 
 | 357 |             return channelMask == audio_channel_out_mask_from_count(channelCount); | 
 | 358 |             } | 
| Andy Hung | 64b6cb2 | 2015-05-19 12:32:58 -0700 | [diff] [blame^] | 359 |         case AUDIO_CHANNEL_REPRESENTATION_INDEX: | 
 | 360 |             if (kEnableExtendedChannels) { | 
 | 361 |                 const uint32_t channelCount = audio_channel_count_from_out_mask(channelMask); | 
 | 362 |                 if (channelCount >= FCC_2 // mono is not supported at this time | 
 | 363 |                         && channelCount <= AudioMixer::MAX_NUM_CHANNELS) { | 
 | 364 |                     return true; | 
 | 365 |                 } | 
 | 366 |             } | 
 | 367 |             return false; | 
| Andy Hung | 9a59276 | 2014-07-21 21:56:01 -0700 | [diff] [blame] | 368 |         default: | 
 | 369 |             return false; | 
 | 370 |         } | 
 | 371 |     } | 
 | 372 |  | 
| Andy Hung | 6146c08 | 2014-03-18 11:56:15 -0700 | [diff] [blame] | 373 |     // Set kEnableExtendedPrecision to true to use extended precision in MixerThread | 
| Andy Hung | a494e82 | 2014-07-08 18:09:40 -0700 | [diff] [blame] | 374 |     static const bool kEnableExtendedPrecision = true; | 
| Andy Hung | 6146c08 | 2014-03-18 11:56:15 -0700 | [diff] [blame] | 375 |  | 
 | 376 |     // Returns true if format is permitted for the PCM sink in the MixerThread | 
 | 377 |     static inline bool isValidPcmSinkFormat(audio_format_t format) { | 
 | 378 |         switch (format) { | 
 | 379 |         case AUDIO_FORMAT_PCM_16_BIT: | 
 | 380 |             return true; | 
 | 381 |         case AUDIO_FORMAT_PCM_FLOAT: | 
 | 382 |         case AUDIO_FORMAT_PCM_24_BIT_PACKED: | 
 | 383 |         case AUDIO_FORMAT_PCM_32_BIT: | 
 | 384 |         case AUDIO_FORMAT_PCM_8_24_BIT: | 
 | 385 |             return kEnableExtendedPrecision; | 
 | 386 |         default: | 
 | 387 |             return false; | 
 | 388 |         } | 
 | 389 |     } | 
 | 390 |  | 
| Glenn Kasten | 66fcab9 | 2012-02-24 14:59:21 -0800 | [diff] [blame] | 391 |     // standby delay for MIXER and DUPLICATING playback threads is read from property | 
 | 392 |     // ro.audio.flinger_standbytime_ms or defaults to kDefaultStandbyTimeInNsecs | 
| John Grossman | 4ff14ba | 2012-02-08 16:37:41 -0800 | [diff] [blame] | 393 |     static nsecs_t          mStandbyTimeInNsecs; | 
 | 394 |  | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 395 |     // incremented by 2 when screen state changes, bit 0 == 1 means "off" | 
 | 396 |     // AudioFlinger::setParameters() updates, other threads read w/o lock | 
 | 397 |     static uint32_t         mScreenState; | 
 | 398 |  | 
| Glenn Kasten | be5f05e | 2012-07-18 15:24:02 -0700 | [diff] [blame] | 399 |     // Internal dump utilities. | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 400 |     static const int kDumpLockRetries = 50; | 
 | 401 |     static const int kDumpLockSleepUs = 20000; | 
 | 402 |     static bool dumpTryLock(Mutex& mutex); | 
| Glenn Kasten | be5f05e | 2012-07-18 15:24:02 -0700 | [diff] [blame] | 403 |     void dumpPermissionDenial(int fd, const Vector<String16>& args); | 
 | 404 |     void dumpClients(int fd, const Vector<String16>& args); | 
 | 405 |     void dumpInternals(int fd, const Vector<String16>& args); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 406 |  | 
 | 407 |     // --- Client --- | 
 | 408 |     class Client : public RefBase { | 
 | 409 |     public: | 
 | 410 |                             Client(const sp<AudioFlinger>& audioFlinger, pid_t pid); | 
 | 411 |         virtual             ~Client(); | 
| Glenn Kasten | 435dbe6 | 2012-01-30 10:15:48 -0800 | [diff] [blame] | 412 |         sp<MemoryDealer>    heap() const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 413 |         pid_t               pid() const { return mPid; } | 
| Glenn Kasten | c59c004 | 2012-02-02 14:06:11 -0800 | [diff] [blame] | 414 |         sp<AudioFlinger>    audioFlinger() const { return mAudioFlinger; } | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 415 |  | 
| John Grossman | 4ff14ba | 2012-02-08 16:37:41 -0800 | [diff] [blame] | 416 |         bool reserveTimedTrack(); | 
 | 417 |         void releaseTimedTrack(); | 
 | 418 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 419 |     private: | 
 | 420 |                             Client(const Client&); | 
 | 421 |                             Client& operator = (const Client&); | 
| Glenn Kasten | 84afa3b | 2012-01-25 15:28:08 -0800 | [diff] [blame] | 422 |         const sp<AudioFlinger> mAudioFlinger; | 
 | 423 |         const sp<MemoryDealer> mMemoryDealer; | 
 | 424 |         const pid_t         mPid; | 
| John Grossman | 4ff14ba | 2012-02-08 16:37:41 -0800 | [diff] [blame] | 425 |  | 
 | 426 |         Mutex               mTimedTrackLock; | 
 | 427 |         int                 mTimedTrackCount; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 428 |     }; | 
 | 429 |  | 
 | 430 |     // --- Notification Client --- | 
 | 431 |     class NotificationClient : public IBinder::DeathRecipient { | 
 | 432 |     public: | 
 | 433 |                             NotificationClient(const sp<AudioFlinger>& audioFlinger, | 
 | 434 |                                                 const sp<IAudioFlingerClient>& client, | 
 | 435 |                                                 pid_t pid); | 
 | 436 |         virtual             ~NotificationClient(); | 
 | 437 |  | 
| Glenn Kasten | 84afa3b | 2012-01-25 15:28:08 -0800 | [diff] [blame] | 438 |                 sp<IAudioFlingerClient> audioFlingerClient() const { return mAudioFlingerClient; } | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 439 |  | 
 | 440 |                 // IBinder::DeathRecipient | 
 | 441 |                 virtual     void        binderDied(const wp<IBinder>& who); | 
 | 442 |  | 
 | 443 |     private: | 
 | 444 |                             NotificationClient(const NotificationClient&); | 
 | 445 |                             NotificationClient& operator = (const NotificationClient&); | 
 | 446 |  | 
| Glenn Kasten | 84afa3b | 2012-01-25 15:28:08 -0800 | [diff] [blame] | 447 |         const sp<AudioFlinger>  mAudioFlinger; | 
 | 448 |         const pid_t             mPid; | 
 | 449 |         const sp<IAudioFlingerClient> mAudioFlingerClient; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 450 |     }; | 
 | 451 |  | 
 | 452 |     class TrackHandle; | 
 | 453 |     class RecordHandle; | 
 | 454 |     class RecordThread; | 
 | 455 |     class PlaybackThread; | 
 | 456 |     class MixerThread; | 
 | 457 |     class DirectOutputThread; | 
| Eric Laurent | bfb1b83 | 2013-01-07 09:53:42 -0800 | [diff] [blame] | 458 |     class OffloadThread; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 459 |     class DuplicatingThread; | 
| Eric Laurent | bfb1b83 | 2013-01-07 09:53:42 -0800 | [diff] [blame] | 460 |     class AsyncCallbackThread; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 461 |     class Track; | 
 | 462 |     class RecordTrack; | 
 | 463 |     class EffectModule; | 
 | 464 |     class EffectHandle; | 
 | 465 |     class EffectChain; | 
| Phil Burk | 062e67a | 2015-02-11 13:40:50 -0800 | [diff] [blame] | 466 |  | 
| Dima Zavin | 799a70e | 2011-04-18 16:57:27 -0700 | [diff] [blame] | 467 |     struct AudioStreamIn; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 468 |  | 
| Glenn Kasten | b7bf796 | 2012-02-08 12:36:25 -0800 | [diff] [blame] | 469 |     struct  stream_type_t { | 
 | 470 |         stream_type_t() | 
 | 471 |             :   volume(1.0f), | 
| Eric Laurent | 1a9ed11 | 2012-03-20 18:36:01 -0700 | [diff] [blame] | 472 |                 mute(false) | 
| Glenn Kasten | b7bf796 | 2012-02-08 12:36:25 -0800 | [diff] [blame] | 473 |         { | 
 | 474 |         } | 
 | 475 |         float       volume; | 
 | 476 |         bool        mute; | 
| Glenn Kasten | b7bf796 | 2012-02-08 12:36:25 -0800 | [diff] [blame] | 477 |     }; | 
 | 478 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 479 |     // --- PlaybackThread --- | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 480 |  | 
 | 481 | #include "Threads.h" | 
 | 482 |  | 
 | 483 | #include "Effects.h" | 
 | 484 |  | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 485 | #include "PatchPanel.h" | 
 | 486 |  | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 487 |     // server side of the client's IAudioTrack | 
 | 488 |     class TrackHandle : public android::BnAudioTrack { | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 489 |     public: | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 490 |                             TrackHandle(const sp<PlaybackThread::Track>& track); | 
 | 491 |         virtual             ~TrackHandle(); | 
 | 492 |         virtual sp<IMemory> getCblk() const; | 
 | 493 |         virtual status_t    start(); | 
 | 494 |         virtual void        stop(); | 
 | 495 |         virtual void        flush(); | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 496 |         virtual void        pause(); | 
 | 497 |         virtual status_t    attachAuxEffect(int effectId); | 
 | 498 |         virtual status_t    allocateTimedBuffer(size_t size, | 
 | 499 |                                                 sp<IMemory>* buffer); | 
 | 500 |         virtual status_t    queueTimedBuffer(const sp<IMemory>& buffer, | 
 | 501 |                                              int64_t pts); | 
 | 502 |         virtual status_t    setMediaTimeTransform(const LinearTransform& xform, | 
 | 503 |                                                   int target); | 
| Glenn Kasten | 3dcd00d | 2013-07-17 10:10:23 -0700 | [diff] [blame] | 504 |         virtual status_t    setParameters(const String8& keyValuePairs); | 
| Glenn Kasten | 53cec22 | 2013-08-29 09:01:02 -0700 | [diff] [blame] | 505 |         virtual status_t    getTimestamp(AudioTimestamp& timestamp); | 
| Eric Laurent | 59fe010 | 2013-09-27 18:48:26 -0700 | [diff] [blame] | 506 |         virtual void        signal(); // signal playback thread for a change in control block | 
| Glenn Kasten | 3dcd00d | 2013-07-17 10:10:23 -0700 | [diff] [blame] | 507 |  | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 508 |         virtual status_t onTransact( | 
 | 509 |             uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); | 
| Richard Fitzgerald | ad3af33 | 2013-03-25 16:54:37 +0000 | [diff] [blame] | 510 |  | 
| Glenn Kasten | 9806710 | 2011-12-13 11:47:54 -0800 | [diff] [blame] | 511 |     private: | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 512 |         const sp<PlaybackThread::Track> mTrack; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 513 |     }; | 
 | 514 |  | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 515 |     // server side of the client's IAudioRecord | 
 | 516 |     class RecordHandle : public android::BnAudioRecord { | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 517 |     public: | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 518 |         RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack); | 
 | 519 |         virtual             ~RecordHandle(); | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 520 |         virtual status_t    start(int /*AudioSystem::sync_event_t*/ event, int triggerSession); | 
 | 521 |         virtual void        stop(); | 
 | 522 |         virtual status_t onTransact( | 
 | 523 |             uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); | 
| Glenn Kasten | 5891256 | 2012-04-03 10:45:00 -0700 | [diff] [blame] | 524 |     private: | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 525 |         const sp<RecordThread::RecordTrack> mRecordTrack; | 
| Glenn Kasten | 5891256 | 2012-04-03 10:45:00 -0700 | [diff] [blame] | 526 |  | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 527 |         // for use from destructor | 
 | 528 |         void                stop_nonvirtual(); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 529 |     }; | 
 | 530 |  | 
| Eric Laurent | bfb1b83 | 2013-01-07 09:53:42 -0800 | [diff] [blame] | 531 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 532 |               PlaybackThread *checkPlaybackThread_l(audio_io_handle_t output) const; | 
 | 533 |               MixerThread *checkMixerThread_l(audio_io_handle_t output) const; | 
 | 534 |               RecordThread *checkRecordThread_l(audio_io_handle_t input) const; | 
| Eric Laurent | 83b8808 | 2014-06-20 18:31:16 -0700 | [diff] [blame] | 535 |               sp<RecordThread> openInput_l(audio_module_handle_t module, | 
| Eric Laurent | cf2c021 | 2014-07-25 16:20:43 -0700 | [diff] [blame] | 536 |                                            audio_io_handle_t *input, | 
 | 537 |                                            audio_config_t *config, | 
| Eric Laurent | 83b8808 | 2014-06-20 18:31:16 -0700 | [diff] [blame] | 538 |                                            audio_devices_t device, | 
| Eric Laurent | cf2c021 | 2014-07-25 16:20:43 -0700 | [diff] [blame] | 539 |                                            const String8& address, | 
 | 540 |                                            audio_source_t source, | 
| Eric Laurent | 83b8808 | 2014-06-20 18:31:16 -0700 | [diff] [blame] | 541 |                                            audio_input_flags_t flags); | 
 | 542 |               sp<PlaybackThread> openOutput_l(audio_module_handle_t module, | 
| Eric Laurent | cf2c021 | 2014-07-25 16:20:43 -0700 | [diff] [blame] | 543 |                                               audio_io_handle_t *output, | 
 | 544 |                                               audio_config_t *config, | 
 | 545 |                                               audio_devices_t devices, | 
 | 546 |                                               const String8& address, | 
| Eric Laurent | 83b8808 | 2014-06-20 18:31:16 -0700 | [diff] [blame] | 547 |                                               audio_output_flags_t flags); | 
 | 548 |  | 
 | 549 |               void closeOutputFinish(sp<PlaybackThread> thread); | 
 | 550 |               void closeInputFinish(sp<RecordThread> thread); | 
 | 551 |  | 
| Glenn Kasten | 6637baa | 2012-01-09 09:40:36 -0800 | [diff] [blame] | 552 |               // no range check, AudioFlinger::mLock held | 
 | 553 |               bool streamMute_l(audio_stream_type_t stream) const | 
 | 554 |                                 { return mStreamTypes[stream].mute; } | 
 | 555 |               // no range check, doesn't check per-thread stream volume, AudioFlinger::mLock held | 
 | 556 |               float streamVolume_l(audio_stream_type_t stream) const | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 557 |                                 { return mStreamTypes[stream].volume; } | 
| Eric Laurent | 73e26b6 | 2015-04-27 16:55:58 -0700 | [diff] [blame] | 558 |               void ioConfigChanged(audio_io_config_event event, | 
 | 559 |                                    const sp<AudioIoDescriptor>& ioDesc); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 560 |  | 
| Glenn Kasten | bcefec3 | 2014-01-17 12:09:05 -0800 | [diff] [blame] | 561 |               // Allocate an audio_io_handle_t, session ID, effect ID, or audio_module_handle_t. | 
 | 562 |               // They all share the same ID space, but the namespaces are actually independent | 
 | 563 |               // because there are separate KeyedVectors for each kind of ID. | 
 | 564 |               // The return value is uint32_t, but is cast to signed for some IDs. | 
 | 565 |               // FIXME This API does not handle rollover to zero (for unsigned IDs), | 
 | 566 |               //       or from positive to negative (for signed IDs). | 
 | 567 |               //       Thus it may fail by returning an ID of the wrong sign, | 
 | 568 |               //       or by returning a non-unique ID. | 
| Eric Laurent | 7c7f10b | 2011-06-17 21:29:58 -0700 | [diff] [blame] | 569 |               uint32_t nextUniqueId(); | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 570 |  | 
| Eric Laurent | 59255e4 | 2011-07-27 19:49:51 -0700 | [diff] [blame] | 571 |               status_t moveEffectChain_l(int sessionId, | 
| Glenn Kasten | a111792 | 2012-01-26 10:53:32 -0800 | [diff] [blame] | 572 |                                      PlaybackThread *srcThread, | 
 | 573 |                                      PlaybackThread *dstThread, | 
| Eric Laurent | 39e94f8 | 2010-07-28 01:32:47 -0700 | [diff] [blame] | 574 |                                      bool reRegister); | 
| Glenn Kasten | 02fe1bf | 2012-02-24 15:42:17 -0800 | [diff] [blame] | 575 |               // return thread associated with primary hardware device, or NULL | 
 | 576 |               PlaybackThread *primaryPlaybackThread_l() const; | 
| Glenn Kasten | bb4350d | 2012-07-03 15:56:38 -0700 | [diff] [blame] | 577 |               audio_devices_t primaryOutputDevice_l() const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 578 |  | 
| Eric Laurent | 717e128 | 2012-06-29 16:36:52 -0700 | [diff] [blame] | 579 |               sp<PlaybackThread> getEffectThread_l(int sessionId, int EffectId); | 
 | 580 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 581 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 582 |                 void        removeClient_l(pid_t pid); | 
 | 583 |                 void        removeNotificationClient(pid_t pid); | 
| Eric Laurent | 5baf2af | 2013-09-12 17:37:00 -0700 | [diff] [blame] | 584 |                 bool isNonOffloadableGlobalEffectEnabled_l(); | 
 | 585 |                 void onNonOffloadableGlobalEffectEnable(); | 
| Eric Laurent | 813e2a7 | 2013-08-31 12:59:48 -0700 | [diff] [blame] | 586 |  | 
| Eric Laurent | aaa4447 | 2014-09-12 17:41:50 -0700 | [diff] [blame] | 587 |                 // Store an effect chain to mOrphanEffectChains keyed vector. | 
 | 588 |                 // Called when a thread exits and effects are still attached to it. | 
 | 589 |                 // If effects are later created on the same session, they will reuse the same | 
 | 590 |                 // effect chain and same instances in the effect library. | 
 | 591 |                 // return ALREADY_EXISTS if a chain with the same session already exists in | 
 | 592 |                 // mOrphanEffectChains. Note that this should never happen as there is only one | 
 | 593 |                 // chain for a given session and it is attached to only one thread at a time. | 
 | 594 |                 status_t        putOrphanEffectChain_l(const sp<EffectChain>& chain); | 
 | 595 |                 // Get an effect chain for the specified session in mOrphanEffectChains and remove | 
 | 596 |                 // it if found. Returns 0 if not found (this is the most common case). | 
 | 597 |                 sp<EffectChain> getOrphanEffectChain_l(audio_session_t session); | 
 | 598 |                 // Called when the last effect handle on an effect instance is removed. If this | 
 | 599 |                 // effect belongs to an effect chain in mOrphanEffectChains, the chain is updated | 
 | 600 |                 // and removed from mOrphanEffectChains if it does not contain any effect. | 
 | 601 |                 // Return true if the effect was found in mOrphanEffectChains, false otherwise. | 
 | 602 |                 bool            updateOrphanEffectChains(const sp<EffectModule>& effect); | 
 | 603 |  | 
| Eric Laurent | 054d9d3 | 2015-04-24 08:48:48 -0700 | [diff] [blame] | 604 |                 void broacastParametersToRecordThreads_l(const String8& keyValuePairs); | 
| John Grossman | ee578c0 | 2012-07-23 17:05:46 -0700 | [diff] [blame] | 605 |  | 
| Phil Burk | 062e67a | 2015-02-11 13:40:50 -0800 | [diff] [blame] | 606 |     // AudioStreamIn is immutable, so their fields are const. | 
| Glenn Kasten | aed850d | 2012-01-26 09:46:34 -0800 | [diff] [blame] | 607 |     // For emphasis, we could also make all pointers to them be "const *", | 
 | 608 |     // but that would clutter the code unnecessarily. | 
 | 609 |  | 
| Dima Zavin | 799a70e | 2011-04-18 16:57:27 -0700 | [diff] [blame] | 610 |     struct AudioStreamIn { | 
| John Grossman | ee578c0 | 2012-07-23 17:05:46 -0700 | [diff] [blame] | 611 |         AudioHwDevice* const audioHwDev; | 
| Glenn Kasten | aed850d | 2012-01-26 09:46:34 -0800 | [diff] [blame] | 612 |         audio_stream_in_t* const stream; | 
| Dima Zavin | 799a70e | 2011-04-18 16:57:27 -0700 | [diff] [blame] | 613 |  | 
| John Grossman | ee578c0 | 2012-07-23 17:05:46 -0700 | [diff] [blame] | 614 |         audio_hw_device_t* hwDev() const { return audioHwDev->hwDevice(); } | 
 | 615 |  | 
 | 616 |         AudioStreamIn(AudioHwDevice *dev, audio_stream_in_t *in) : | 
 | 617 |             audioHwDev(dev), stream(in) {} | 
| Dima Zavin | 799a70e | 2011-04-18 16:57:27 -0700 | [diff] [blame] | 618 |     }; | 
 | 619 |  | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 620 |     // for mAudioSessionRefs only | 
| Marco Nelissen | 3a34bef | 2011-08-02 13:33:41 -0700 | [diff] [blame] | 621 |     struct AudioSessionRef { | 
| Glenn Kasten | 012ca6b | 2012-03-06 11:22:01 -0800 | [diff] [blame] | 622 |         AudioSessionRef(int sessionid, pid_t pid) : | 
 | 623 |             mSessionid(sessionid), mPid(pid), mCnt(1) {} | 
 | 624 |         const int   mSessionid; | 
 | 625 |         const pid_t mPid; | 
 | 626 |         int         mCnt; | 
| Marco Nelissen | 3a34bef | 2011-08-02 13:33:41 -0700 | [diff] [blame] | 627 |     }; | 
 | 628 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 629 |     mutable     Mutex                               mLock; | 
| Eric Laurent | 021cf96 | 2014-05-13 10:18:14 -0700 | [diff] [blame] | 630 |                 // protects mClients and mNotificationClients. | 
 | 631 |                 // must be locked after mLock and ThreadBase::mLock if both must be locked | 
 | 632 |                 // avoids acquiring AudioFlinger::mLock from inside thread loop. | 
 | 633 |     mutable     Mutex                               mClientLock; | 
 | 634 |                 // protected by mClientLock | 
| Glenn Kasten | 98ec94c | 2012-01-25 14:28:29 -0800 | [diff] [blame] | 635 |                 DefaultKeyedVector< pid_t, wp<Client> >     mClients;   // see ~Client() | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 636 |  | 
 | 637 |                 mutable     Mutex                   mHardwareLock; | 
| Eric Laurent | a4c5a55 | 2012-03-29 10:12:40 -0700 | [diff] [blame] | 638 |                 // NOTE: If both mLock and mHardwareLock mutexes must be held, | 
 | 639 |                 // always take mLock before mHardwareLock | 
| Glenn Kasten | 2b213bc | 2012-02-02 14:05:20 -0800 | [diff] [blame] | 640 |  | 
 | 641 |                 // These two fields are immutable after onFirstRef(), so no lock needed to access | 
| John Grossman | ee578c0 | 2012-07-23 17:05:46 -0700 | [diff] [blame] | 642 |                 AudioHwDevice*                      mPrimaryHardwareDev; // mAudioHwDevs[0] or NULL | 
| Eric Laurent | a4c5a55 | 2012-03-29 10:12:40 -0700 | [diff] [blame] | 643 |                 DefaultKeyedVector<audio_module_handle_t, AudioHwDevice*>  mAudioHwDevs; | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 644 |  | 
| Glenn Kasten | 8abf44d | 2012-02-02 14:16:03 -0800 | [diff] [blame] | 645 |     // for dump, indicates which hardware operation is currently in progress (but not stream ops) | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 646 |     enum hardware_call_state { | 
| Glenn Kasten | 8abf44d | 2012-02-02 14:16:03 -0800 | [diff] [blame] | 647 |         AUDIO_HW_IDLE = 0,              // no operation in progress | 
 | 648 |         AUDIO_HW_INIT,                  // init_check | 
 | 649 |         AUDIO_HW_OUTPUT_OPEN,           // open_output_stream | 
 | 650 |         AUDIO_HW_OUTPUT_CLOSE,          // unused | 
 | 651 |         AUDIO_HW_INPUT_OPEN,            // unused | 
 | 652 |         AUDIO_HW_INPUT_CLOSE,           // unused | 
 | 653 |         AUDIO_HW_STANDBY,               // unused | 
 | 654 |         AUDIO_HW_SET_MASTER_VOLUME,     // set_master_volume | 
 | 655 |         AUDIO_HW_GET_ROUTING,           // unused | 
 | 656 |         AUDIO_HW_SET_ROUTING,           // unused | 
 | 657 |         AUDIO_HW_GET_MODE,              // unused | 
 | 658 |         AUDIO_HW_SET_MODE,              // set_mode | 
 | 659 |         AUDIO_HW_GET_MIC_MUTE,          // get_mic_mute | 
 | 660 |         AUDIO_HW_SET_MIC_MUTE,          // set_mic_mute | 
 | 661 |         AUDIO_HW_SET_VOICE_VOLUME,      // set_voice_volume | 
 | 662 |         AUDIO_HW_SET_PARAMETER,         // set_parameters | 
 | 663 |         AUDIO_HW_GET_INPUT_BUFFER_SIZE, // get_input_buffer_size | 
 | 664 |         AUDIO_HW_GET_MASTER_VOLUME,     // get_master_volume | 
 | 665 |         AUDIO_HW_GET_PARAMETER,         // get_parameters | 
| John Grossman | d8f178d | 2012-07-20 14:51:35 -0700 | [diff] [blame] | 666 |         AUDIO_HW_SET_MASTER_MUTE,       // set_master_mute | 
 | 667 |         AUDIO_HW_GET_MASTER_MUTE,       // get_master_mute | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 668 |     }; | 
 | 669 |  | 
| Glenn Kasten | a4454b4 | 2012-01-04 11:02:33 -0800 | [diff] [blame] | 670 |     mutable     hardware_call_state                 mHardwareStatus;    // for dump only | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 671 |  | 
 | 672 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 673 |                 DefaultKeyedVector< audio_io_handle_t, sp<PlaybackThread> >  mPlaybackThreads; | 
| Glenn Kasten | b7bf796 | 2012-02-08 12:36:25 -0800 | [diff] [blame] | 674 |                 stream_type_t                       mStreamTypes[AUDIO_STREAM_CNT]; | 
| Glenn Kasten | 9806710 | 2011-12-13 11:47:54 -0800 | [diff] [blame] | 675 |  | 
| Glenn Kasten | c3ae93f | 2012-07-30 10:59:30 -0700 | [diff] [blame] | 676 |                 // member variables below are protected by mLock | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 677 |                 float                               mMasterVolume; | 
 | 678 |                 bool                                mMasterMute; | 
| Glenn Kasten | c3ae93f | 2012-07-30 10:59:30 -0700 | [diff] [blame] | 679 |                 // end of variables protected by mLock | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 680 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 681 |                 DefaultKeyedVector< audio_io_handle_t, sp<RecordThread> >    mRecordThreads; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 682 |  | 
| Eric Laurent | 021cf96 | 2014-05-13 10:18:14 -0700 | [diff] [blame] | 683 |                 // protected by mClientLock | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 684 |                 DefaultKeyedVector< pid_t, sp<NotificationClient> >    mNotificationClients; | 
| Glenn Kasten | bcefec3 | 2014-01-17 12:09:05 -0800 | [diff] [blame] | 685 |  | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 686 |                 volatile int32_t                    mNextUniqueId;  // updated by android_atomic_inc | 
| Glenn Kasten | bcefec3 | 2014-01-17 12:09:05 -0800 | [diff] [blame] | 687 |                 // nextUniqueId() returns uint32_t, but this is declared int32_t | 
 | 688 |                 // because the atomic operations require an int32_t | 
 | 689 |  | 
| Glenn Kasten | f78aee7 | 2012-01-04 11:00:47 -0800 | [diff] [blame] | 690 |                 audio_mode_t                        mMode; | 
| Eric Laurent | bee5337 | 2011-08-29 12:42:48 -0700 | [diff] [blame] | 691 |                 bool                                mBtNrecIsOff; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 692 |  | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 693 |                 // protected by mLock | 
| Marco Nelissen | 3a34bef | 2011-08-02 13:33:41 -0700 | [diff] [blame] | 694 |                 Vector<AudioSessionRef*> mAudioSessionRefs; | 
| Glenn Kasten | 9806710 | 2011-12-13 11:47:54 -0800 | [diff] [blame] | 695 |  | 
| John Grossman | 4ff14ba | 2012-02-08 16:37:41 -0800 | [diff] [blame] | 696 |                 float       masterVolume_l() const; | 
| John Grossman | d8f178d | 2012-07-20 14:51:35 -0700 | [diff] [blame] | 697 |                 bool        masterMute_l() const; | 
| Eric Laurent | a4c5a55 | 2012-03-29 10:12:40 -0700 | [diff] [blame] | 698 |                 audio_module_handle_t loadHwModule_l(const char *name); | 
| Glenn Kasten | 98ec94c | 2012-01-25 14:28:29 -0800 | [diff] [blame] | 699 |  | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 700 |                 Vector < sp<SyncEvent> > mPendingSyncEvents; // sync events awaiting for a session | 
 | 701 |                                                              // to be created | 
 | 702 |  | 
| Eric Laurent | aaa4447 | 2014-09-12 17:41:50 -0700 | [diff] [blame] | 703 |                 // Effect chains without a valid thread | 
 | 704 |                 DefaultKeyedVector< audio_session_t , sp<EffectChain> > mOrphanEffectChains; | 
 | 705 |  | 
| Eric Laurent | fa90e84 | 2014-10-17 18:12:31 -0700 | [diff] [blame] | 706 |                 // list of sessions for which a valid HW A/V sync ID was retrieved from the HAL | 
 | 707 |                 DefaultKeyedVector< audio_session_t , audio_hw_sync_t >mHwAvSyncIds; | 
| Glenn Kasten | 98ec94c | 2012-01-25 14:28:29 -0800 | [diff] [blame] | 708 | private: | 
| Eric Laurent | 021cf96 | 2014-05-13 10:18:14 -0700 | [diff] [blame] | 709 |     sp<Client>  registerPid(pid_t pid);    // always returns non-0 | 
| Glenn Kasten | 98ec94c | 2012-01-25 14:28:29 -0800 | [diff] [blame] | 710 |  | 
| Glenn Kasten | d96c572 | 2012-04-25 13:44:49 -0700 | [diff] [blame] | 711 |     // for use from destructor | 
 | 712 |     status_t    closeOutput_nonvirtual(audio_io_handle_t output); | 
| Eric Laurent | 83b8808 | 2014-06-20 18:31:16 -0700 | [diff] [blame] | 713 |     void        closeOutputInternal_l(sp<PlaybackThread> thread); | 
| Glenn Kasten | d96c572 | 2012-04-25 13:44:49 -0700 | [diff] [blame] | 714 |     status_t    closeInput_nonvirtual(audio_io_handle_t input); | 
| Eric Laurent | 83b8808 | 2014-06-20 18:31:16 -0700 | [diff] [blame] | 715 |     void        closeInputInternal_l(sp<RecordThread> thread); | 
| Eric Laurent | fa90e84 | 2014-10-17 18:12:31 -0700 | [diff] [blame] | 716 |     void        setAudioHwSyncForSession_l(PlaybackThread *thread, audio_session_t sessionId); | 
| Glenn Kasten | d06785b | 2012-09-30 12:29:28 -0700 | [diff] [blame] | 717 |  | 
| Eric Laurent | 223fd5c | 2014-11-11 13:43:36 -0800 | [diff] [blame] | 718 |     status_t    checkStreamType(audio_stream_type_t stream) const; | 
 | 719 |  | 
| Glenn Kasten | 0d61251 | 2013-07-15 16:09:26 -0700 | [diff] [blame] | 720 | #ifdef TEE_SINK | 
| Glenn Kasten | d06785b | 2012-09-30 12:29:28 -0700 | [diff] [blame] | 721 |     // all record threads serially share a common tee sink, which is re-created on format change | 
 | 722 |     sp<NBAIO_Sink>   mRecordTeeSink; | 
 | 723 |     sp<NBAIO_Source> mRecordTeeSource; | 
| Glenn Kasten | 0d61251 | 2013-07-15 16:09:26 -0700 | [diff] [blame] | 724 | #endif | 
| Glenn Kasten | d06785b | 2012-09-30 12:29:28 -0700 | [diff] [blame] | 725 |  | 
 | 726 | public: | 
| Glenn Kasten | 46909e7 | 2013-02-26 09:20:22 -0800 | [diff] [blame] | 727 |  | 
 | 728 | #ifdef TEE_SINK | 
| Glenn Kasten | da6ef13 | 2013-01-10 12:31:01 -0800 | [diff] [blame] | 729 |     // tee sink, if enabled by property, allows dumpsys to write most recent audio to .wav file | 
| Glenn Kasten | d06785b | 2012-09-30 12:29:28 -0700 | [diff] [blame] | 730 |     static void dumpTee(int fd, const sp<NBAIO_Source>& source, audio_io_handle_t id = 0); | 
| Glenn Kasten | da6ef13 | 2013-01-10 12:31:01 -0800 | [diff] [blame] | 731 |  | 
 | 732 |     // whether tee sink is enabled by property | 
 | 733 |     static bool mTeeSinkInputEnabled; | 
 | 734 |     static bool mTeeSinkOutputEnabled; | 
 | 735 |     static bool mTeeSinkTrackEnabled; | 
 | 736 |  | 
 | 737 |     // runtime configured size of each tee sink pipe, in frames | 
 | 738 |     static size_t mTeeSinkInputFrames; | 
 | 739 |     static size_t mTeeSinkOutputFrames; | 
 | 740 |     static size_t mTeeSinkTrackFrames; | 
 | 741 |  | 
 | 742 |     // compile-time default size of tee sink pipes, in frames | 
 | 743 |     // 0x200000 stereo 16-bit PCM frames = 47.5 seconds at 44.1 kHz, 8 megabytes | 
 | 744 |     static const size_t kTeeSinkInputFramesDefault = 0x200000; | 
 | 745 |     static const size_t kTeeSinkOutputFramesDefault = 0x200000; | 
| Glenn Kasten | f66b422 | 2014-02-20 10:23:28 -0800 | [diff] [blame] | 746 |     static const size_t kTeeSinkTrackFramesDefault = 0x200000; | 
| Glenn Kasten | 46909e7 | 2013-02-26 09:20:22 -0800 | [diff] [blame] | 747 | #endif | 
 | 748 |  | 
| Glenn Kasten | 4182c4e | 2013-07-15 14:45:07 -0700 | [diff] [blame] | 749 |     // This method reads from a variable without mLock, but the variable is updated under mLock.  So | 
 | 750 |     // we might read a stale value, or a value that's inconsistent with respect to other variables. | 
 | 751 |     // In this case, it's safe because the return value isn't used for making an important decision. | 
 | 752 |     // The reason we don't want to take mLock is because it could block the caller for a long time. | 
 | 753 |     bool    isLowRamDevice() const { return mIsLowRamDevice; } | 
 | 754 |  | 
 | 755 | private: | 
 | 756 |     bool    mIsLowRamDevice; | 
 | 757 |     bool    mIsDeviceTypeKnown; | 
| Eric Laurent | 813e2a7 | 2013-08-31 12:59:48 -0700 | [diff] [blame] | 758 |     nsecs_t mGlobalEffectEnableTime;  // when a global effect was last enabled | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 759 |  | 
 | 760 |     sp<PatchPanel> mPatchPanel; | 
| Glenn Kasten | 4ea00a2 | 2014-06-02 08:29:22 -0700 | [diff] [blame] | 761 |  | 
 | 762 |     uint32_t    mPrimaryOutputSampleRate;   // sample rate of the primary output, or zero if none | 
 | 763 |                                             // protected by mHardwareLock | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 764 | }; | 
 | 765 |  | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 766 | #undef INCLUDING_FROM_AUDIOFLINGER_H | 
| Dima Zavin | 799a70e | 2011-04-18 16:57:27 -0700 | [diff] [blame] | 767 |  | 
| Marco Nelissen | b220884 | 2014-02-07 14:00:50 -0800 | [diff] [blame] | 768 | const char *formatToString(audio_format_t format); | 
| Glenn Kasten | 0f5b562 | 2015-02-18 14:33:30 -0800 | [diff] [blame] | 769 | String8 inputFlagsToString(audio_input_flags_t flags); | 
 | 770 | String8 outputFlagsToString(audio_output_flags_t flags); | 
 | 771 | String8 devicesToString(audio_devices_t devices); | 
 | 772 | const char *sourceToString(audio_source_t source); | 
| Marco Nelissen | b220884 | 2014-02-07 14:00:50 -0800 | [diff] [blame] | 773 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 774 | // ---------------------------------------------------------------------------- | 
 | 775 |  | 
| Glenn Kasten | 63238ef | 2015-03-02 15:50:29 -0800 | [diff] [blame] | 776 | } // namespace android | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 777 |  | 
 | 778 | #endif // ANDROID_AUDIO_FLINGER_H |