| 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" | 
| Kevin Rocard | 1238109 | 2018-04-11 09:19:59 -0700 | [diff] [blame] | 22 | #include <atomic> | 
 | 23 | #include <mutex> | 
| Kevin Rocard | 45986c7 | 2018-12-18 18:22:59 -0800 | [diff] [blame] | 24 | #include <chrono> | 
| Andy Hung | 2148bf0 | 2016-11-28 19:01:02 -0800 | [diff] [blame] | 25 | #include <deque> | 
| Andy Hung | dae2770 | 2016-10-31 14:01:16 -0700 | [diff] [blame] | 26 | #include <map> | 
| Kevin Rocard | 153f92d | 2018-12-18 18:33:28 -0800 | [diff] [blame] | 27 | #include <numeric> | 
| Kevin Rocard | 45986c7 | 2018-12-18 18:22:59 -0800 | [diff] [blame] | 28 | #include <optional> | 
| Eric Tan | 5786e01 | 2018-08-15 09:03:47 -0700 | [diff] [blame] | 29 | #include <set> | 
| Eric Tan | 7b65115 | 2018-07-13 10:17:19 -0700 | [diff] [blame] | 30 | #include <string> | 
| Kevin Rocard | 1238109 | 2018-04-11 09:19:59 -0700 | [diff] [blame] | 31 | #include <vector> | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 32 | #include <stdint.h> | 
 | 33 | #include <sys/types.h> | 
 | 34 | #include <limits.h> | 
 | 35 |  | 
| Ytai Ben-Tsvi | bdc293a | 2020-11-02 17:01:38 -0800 | [diff] [blame] | 36 | #include <android/media/BnAudioTrack.h> | 
| Ytai Ben-Tsvi | 10dc0a6 | 2020-09-18 11:31:55 -0700 | [diff] [blame] | 37 | #include <android/media/IAudioFlingerClient.h> | 
| jiabin | f6eb4c3 | 2020-02-25 14:06:25 -0800 | [diff] [blame] | 38 | #include <android/media/IAudioTrackCallback.h> | 
| jiabin | 57303cc | 2018-12-18 15:45:57 -0800 | [diff] [blame] | 39 | #include <android/os/BnExternalVibrationController.h> | 
| Svet Ganov | 3376113 | 2021-05-13 22:51:08 +0000 | [diff] [blame] | 40 | #include <android/content/AttributionSourceState.h> | 
 | 41 |  | 
| Mikhail Naganov | bf49308 | 2017-04-17 17:37:12 -0700 | [diff] [blame] | 42 |  | 
| Ytai Ben-Tsvi | 10dc0a6 | 2020-09-18 11:31:55 -0700 | [diff] [blame] | 43 | #include <android-base/macros.h> | 
| Steven Moreland | f0c02ce | 2018-02-23 14:53:55 -0800 | [diff] [blame] | 44 | #include <cutils/atomic.h> | 
| Mathias Agopian | e762be9 | 2013-05-09 16:26:45 -0700 | [diff] [blame] | 45 | #include <cutils/compiler.h> | 
 | 46 |  | 
| Ytai Ben-Tsvi | 10dc0a6 | 2020-09-18 11:31:55 -0700 | [diff] [blame] | 47 | #include <cutils/properties.h> | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 48 | #include <media/IAudioFlinger.h> | 
| Glenn Kasten | 335787f | 2012-01-20 17:00:00 -0800 | [diff] [blame] | 49 | #include <media/AudioSystem.h> | 
| John Grossman | 4ff14ba | 2012-02-08 16:37:41 -0800 | [diff] [blame] | 50 | #include <media/AudioTrack.h> | 
| Eric Laurent | fc23520 | 2016-12-20 18:48:17 -0800 | [diff] [blame] | 51 | #include <media/MmapStreamInterface.h> | 
 | 52 | #include <media/MmapStreamCallback.h> | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 53 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 54 | #include <utils/Errors.h> | 
 | 55 | #include <utils/threads.h> | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 56 | #include <utils/SortedVector.h> | 
| Dima Zavin | 799a70e | 2011-04-18 16:57:27 -0700 | [diff] [blame] | 57 | #include <utils/TypeHelpers.h> | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 58 | #include <utils/Vector.h> | 
 | 59 |  | 
| Jean-Michel Trivi | 74e01fa | 2019-02-25 12:18:09 -0800 | [diff] [blame] | 60 | #include <binder/AppOpsManager.h> | 
| Mathias Agopian | 5462fc9 | 2010-07-14 18:41:18 -0700 | [diff] [blame] | 61 | #include <binder/BinderService.h> | 
| Jean-Michel Trivi | 74e01fa | 2019-02-25 12:18:09 -0800 | [diff] [blame] | 62 | #include <binder/IAppOpsCallback.h> | 
| Mathias Agopian | 5462fc9 | 2010-07-14 18:41:18 -0700 | [diff] [blame] | 63 | #include <binder/MemoryDealer.h> | 
 | 64 |  | 
| Dima Zavin | 6476024 | 2011-05-11 14:15:23 -0700 | [diff] [blame] | 65 | #include <system/audio.h> | 
| Mikhail Naganov | 61a4fac | 2016-10-13 14:44:18 -0700 | [diff] [blame] | 66 | #include <system/audio_policy.h> | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 67 |  | 
| Mikhail Naganov | 022b995 | 2017-01-04 16:36:51 -0800 | [diff] [blame] | 68 | #include <media/audiohal/EffectBufferHalInterface.h> | 
| Mikhail Naganov | a0c9133 | 2016-09-19 10:01:12 -0700 | [diff] [blame] | 69 | #include <media/audiohal/StreamHalInterface.h> | 
| Glenn Kasten | 2dd4bdd | 2012-08-29 11:10:32 -0700 | [diff] [blame] | 70 | #include <media/AudioBufferProvider.h> | 
| jiabin | c52b1ff | 2019-10-31 17:20:42 -0700 | [diff] [blame] | 71 | #include <media/AudioContainers.h> | 
 | 72 | #include <media/AudioDeviceTypeAddr.h> | 
| Andy Hung | 068561c | 2017-01-03 17:09:32 -0800 | [diff] [blame] | 73 | #include <media/AudioMixer.h> | 
| jiabin | c52b1ff | 2019-10-31 17:20:42 -0700 | [diff] [blame] | 74 | #include <media/DeviceDescriptorBase.h> | 
| Glenn Kasten | 2dd4bdd | 2012-08-29 11:10:32 -0700 | [diff] [blame] | 75 | #include <media/ExtendedAudioBufferProvider.h> | 
| Andy Hung | 9fc8b5c | 2017-01-24 13:36:48 -0800 | [diff] [blame] | 76 | #include <media/VolumeShaper.h> | 
| Andy Hung | 5bdc535 | 2019-12-23 14:36:31 -0800 | [diff] [blame] | 77 | #include <mediautils/ServiceUtilities.h> | 
| Andy Hung | 328d677 | 2021-01-12 12:32:21 -0800 | [diff] [blame] | 78 | #include <mediautils/Synchronization.h> | 
| Glenn Kasten | 6dbb5e3 | 2014-05-13 10:38:42 -0700 | [diff] [blame] | 79 |  | 
| Andy Hung | f323451 | 2018-07-03 14:51:47 -0700 | [diff] [blame] | 80 | #include <audio_utils/clock.h> | 
| Andy Hung | dc099c2 | 2018-09-18 13:46:39 -0700 | [diff] [blame] | 81 | #include <audio_utils/FdToString.h> | 
| jiabin | 63e2c52 | 2019-10-22 16:48:20 -0700 | [diff] [blame] | 82 | #include <audio_utils/LinearMap.h> | 
| Andy Hung | 293558a | 2017-03-21 12:19:20 -0700 | [diff] [blame] | 83 | #include <audio_utils/SimpleLog.h> | 
| Andy Hung | 2e2c0bb | 2018-06-11 19:13:11 -0700 | [diff] [blame] | 84 | #include <audio_utils/TimestampVerifier.h> | 
| Andy Hung | 293558a | 2017-03-21 12:19:20 -0700 | [diff] [blame] | 85 |  | 
| Glenn Kasten | 6dbb5e3 | 2014-05-13 10:38:42 -0700 | [diff] [blame] | 86 | #include "FastCapture.h" | 
| Glenn Kasten | 5891256 | 2012-04-03 10:45:00 -0700 | [diff] [blame] | 87 | #include "FastMixer.h" | 
| Glenn Kasten | 2dd4bdd | 2012-08-29 11:10:32 -0700 | [diff] [blame] | 88 | #include <media/nbaio/NBAIO.h> | 
| Glenn Kasten | c15d665 | 2012-05-30 14:52:57 -0700 | [diff] [blame] | 89 | #include "AudioWatchdog.h" | 
| Phil Burk | 062e67a | 2015-02-11 13:40:50 -0800 | [diff] [blame] | 90 | #include "AudioStreamOut.h" | 
 | 91 | #include "SpdifStreamOut.h" | 
 | 92 | #include "AudioHwDevice.h" | 
| Andy Hung | 8946a28 | 2018-04-19 20:04:56 -0700 | [diff] [blame] | 93 | #include "NBAIO_Tee.h" | 
| Andy Hung | cf10d74 | 2020-04-28 15:38:24 -0700 | [diff] [blame] | 94 | #include "ThreadMetrics.h" | 
| Andy Hung | c2b11cb | 2020-04-22 09:04:01 -0700 | [diff] [blame] | 95 | #include "TrackMetrics.h" | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 96 |  | 
| Chris Ye | 6597d73 | 2020-02-28 22:38:25 -0800 | [diff] [blame] | 97 | #include <android/os/IPowerManager.h> | 
| Eric Laurent | feb0db6 | 2011-07-22 09:04:31 -0700 | [diff] [blame] | 98 |  | 
| Glenn Kasten | 8589ce7 | 2017-09-08 17:03:42 -0700 | [diff] [blame] | 99 | #include <media/nblog/NBLog.h> | 
| Glenn Kasten | 444841f | 2016-12-16 15:36:43 -0800 | [diff] [blame] | 100 | #include <private/media/AudioEffectShared.h> | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 101 | #include <private/media/AudioTrackShared.h> | 
| Glenn Kasten | 9e58b55 | 2013-01-18 15:09:48 -0800 | [diff] [blame] | 102 |  | 
| jiabin | 57303cc | 2018-12-18 15:45:57 -0800 | [diff] [blame] | 103 | #include <vibrator/ExternalVibration.h> | 
| jiabin | e70bc7f | 2020-06-30 22:07:55 -0700 | [diff] [blame] | 104 | #include <vibrator/ExternalVibrationUtils.h> | 
| jiabin | 57303cc | 2018-12-18 15:45:57 -0800 | [diff] [blame] | 105 |  | 
| Ivan Lozano | ff6900d | 2017-08-01 15:47:38 -0700 | [diff] [blame] | 106 | #include "android/media/BnAudioRecord.h" | 
| Ytai Ben-Tsvi | 9cd8981 | 2020-07-01 17:12:06 -0700 | [diff] [blame] | 107 | #include "android/media/BnEffect.h" | 
| Ivan Lozano | ff6900d | 2017-08-01 15:47:38 -0700 | [diff] [blame] | 108 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 109 | namespace android { | 
 | 110 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 111 | class AudioMixer; | 
 | 112 | class AudioBuffer; | 
 | 113 | class AudioResampler; | 
| Mikhail Naganov | e4f1f63 | 2016-08-31 11:35:10 -0700 | [diff] [blame] | 114 | class DeviceHalInterface; | 
| Mikhail Naganov | 88b30d2 | 2020-03-09 19:43:13 +0000 | [diff] [blame] | 115 | class DevicesFactoryHalCallback; | 
| Mikhail Naganov | e4f1f63 | 2016-08-31 11:35:10 -0700 | [diff] [blame] | 116 | class DevicesFactoryHalInterface; | 
| Mikhail Naganov | 4a3d5c2 | 2016-08-15 13:47:42 -0700 | [diff] [blame] | 117 | class EffectsFactoryHalInterface; | 
| Glenn Kasten | 5891256 | 2012-04-03 10:45:00 -0700 | [diff] [blame] | 118 | class FastMixer; | 
| Andy Hung | d330ee4 | 2015-04-20 13:23:41 -0700 | [diff] [blame] | 119 | class PassthruBufferProvider; | 
| Andy Hung | 8981605 | 2017-01-11 17:08:23 -0800 | [diff] [blame] | 120 | class RecordBufferConverter; | 
| Glenn Kasten | e3aa659 | 2012-12-04 12:22:46 -0800 | [diff] [blame] | 121 | class ServerProxy; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 122 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 123 | // ---------------------------------------------------------------------------- | 
 | 124 |  | 
| John Grossman | 4ff14ba | 2012-02-08 16:37:41 -0800 | [diff] [blame] | 125 | static const nsecs_t kDefaultStandbyTimeInNsecs = seconds(3); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 126 |  | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 127 | #define INCLUDING_FROM_AUDIOFLINGER_H | 
 | 128 |  | 
| Svet Ganov | 3376113 | 2021-05-13 22:51:08 +0000 | [diff] [blame] | 129 | using android::content::AttributionSourceState; | 
 | 130 |  | 
| Ytai Ben-Tsvi | 50b8ccb | 2020-11-24 13:47:54 -0800 | [diff] [blame] | 131 | class AudioFlinger : public AudioFlingerServerAdapter::Delegate | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 132 | { | 
 | 133 | public: | 
| Ytai Ben-Tsvi | 50b8ccb | 2020-11-24 13:47:54 -0800 | [diff] [blame] | 134 |     static void instantiate() ANDROID_API; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 135 |  | 
| Svet Ganov | 3376113 | 2021-05-13 22:51:08 +0000 | [diff] [blame] | 136 |     static AttributionSourceState checkAttributionSourcePackage( | 
 | 137 |         const AttributionSourceState& attributionSource); | 
| Eric Laurent | ec376dc | 2021-04-08 20:41:22 +0200 | [diff] [blame] | 138 |  | 
| Ytai Ben-Tsvi | 50b8ccb | 2020-11-24 13:47:54 -0800 | [diff] [blame] | 139 |     status_t dump(int fd, const Vector<String16>& args) override; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 140 |  | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 141 |     // IAudioFlinger interface, in binder opcode order | 
| Ytai Ben-Tsvi | 16d8761 | 2020-11-03 16:32:36 -0800 | [diff] [blame] | 142 |     status_t createTrack(const media::CreateTrackRequest& input, | 
 | 143 |                          media::CreateTrackResponse& output) override; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 144 |  | 
| Ytai Ben-Tsvi | 16d8761 | 2020-11-03 16:32:36 -0800 | [diff] [blame] | 145 |     status_t createRecord(const media::CreateRecordRequest& input, | 
 | 146 |                           media::CreateRecordResponse& output) override; | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 147 |  | 
| Glenn Kasten | 2c073da | 2016-02-26 09:14:08 -0800 | [diff] [blame] | 148 |     virtual     uint32_t    sampleRate(audio_io_handle_t ioHandle) const; | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 149 |     virtual     audio_format_t format(audio_io_handle_t output) const; | 
| Glenn Kasten | 2c073da | 2016-02-26 09:14:08 -0800 | [diff] [blame] | 150 |     virtual     size_t      frameCount(audio_io_handle_t ioHandle) const; | 
| Glenn Kasten | 4a8308b | 2016-04-18 14:10:01 -0700 | [diff] [blame] | 151 |     virtual     size_t      frameCountHAL(audio_io_handle_t ioHandle) const; | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 152 |     virtual     uint32_t    latency(audio_io_handle_t output) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 153 |  | 
 | 154 |     virtual     status_t    setMasterVolume(float value); | 
 | 155 |     virtual     status_t    setMasterMute(bool muted); | 
 | 156 |  | 
 | 157 |     virtual     float       masterVolume() const; | 
 | 158 |     virtual     bool        masterMute() const; | 
 | 159 |  | 
| Richard Folke Tullberg | 3fae037 | 2017-01-13 09:04:25 +0100 | [diff] [blame] | 160 |     // Balance value must be within -1.f (left only) to 1.f (right only) inclusive. | 
 | 161 |                 status_t    setMasterBalance(float balance) override; | 
 | 162 |                 status_t    getMasterBalance(float *balance) const override; | 
 | 163 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 164 |     virtual     status_t    setStreamVolume(audio_stream_type_t stream, float value, | 
 | 165 |                                             audio_io_handle_t output); | 
| Glenn Kasten | fff6d71 | 2012-01-12 16:38:12 -0800 | [diff] [blame] | 166 |     virtual     status_t    setStreamMute(audio_stream_type_t stream, bool muted); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 167 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 168 |     virtual     float       streamVolume(audio_stream_type_t stream, | 
 | 169 |                                          audio_io_handle_t output) const; | 
| Glenn Kasten | fff6d71 | 2012-01-12 16:38:12 -0800 | [diff] [blame] | 170 |     virtual     bool        streamMute(audio_stream_type_t stream) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 171 |  | 
| Glenn Kasten | f78aee7 | 2012-01-04 11:00:47 -0800 | [diff] [blame] | 172 |     virtual     status_t    setMode(audio_mode_t mode); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 173 |  | 
 | 174 |     virtual     status_t    setMicMute(bool state); | 
 | 175 |     virtual     bool        getMicMute() const; | 
 | 176 |  | 
| Eric Laurent | 5ada82e | 2019-08-29 17:53:54 -0700 | [diff] [blame] | 177 |     virtual     void        setRecordSilenced(audio_port_handle_t portId, bool silenced); | 
| Svet Ganov | f4ddfef | 2018-01-16 07:37:58 -0800 | [diff] [blame] | 178 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 179 |     virtual     status_t    setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs); | 
 | 180 |     virtual     String8     getParameters(audio_io_handle_t ioHandle, const String8& keys) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 181 |  | 
| Ytai Ben-Tsvi | 10dc0a6 | 2020-09-18 11:31:55 -0700 | [diff] [blame] | 182 |     virtual     void        registerClient(const sp<media::IAudioFlingerClient>& client); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 183 |  | 
| Glenn Kasten | dd8104c | 2012-07-02 12:42:44 -0700 | [diff] [blame] | 184 |     virtual     size_t      getInputBufferSize(uint32_t sampleRate, audio_format_t format, | 
 | 185 |                                                audio_channel_mask_t channelMask) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 186 |  | 
| Ytai Ben-Tsvi | 50e016a | 2020-11-12 14:26:12 -0800 | [diff] [blame] | 187 |     virtual status_t openOutput(const media::OpenOutputRequest& request, | 
 | 188 |                                 media::OpenOutputResponse* response); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 189 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 190 |     virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, | 
 | 191 |                                                   audio_io_handle_t output2); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 192 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 193 |     virtual status_t closeOutput(audio_io_handle_t output); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 194 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 195 |     virtual status_t suspendOutput(audio_io_handle_t output); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 196 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 197 |     virtual status_t restoreOutput(audio_io_handle_t output); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 198 |  | 
| Ytai Ben-Tsvi | 12a0b84 | 2020-11-05 13:47:32 -0800 | [diff] [blame] | 199 |     virtual status_t openInput(const media::OpenInputRequest& request, | 
 | 200 |                                media::OpenInputResponse* response); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 201 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 202 |     virtual status_t closeInput(audio_io_handle_t input); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 203 |  | 
| Glenn Kasten | d2304db | 2014-02-03 07:40:31 -0800 | [diff] [blame] | 204 |     virtual status_t invalidateStream(audio_stream_type_t stream); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 205 |  | 
 | 206 |     virtual status_t setVoiceVolume(float volume); | 
 | 207 |  | 
| Kévin PETIT | 377b2ec | 2014-02-03 12:35:36 +0000 | [diff] [blame] | 208 |     virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 209 |                                        audio_io_handle_t output) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 210 |  | 
| Glenn Kasten | 5f972c0 | 2014-01-13 09:59:31 -0800 | [diff] [blame] | 211 |     virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const; | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 212 |  | 
| Glenn Kasten | 9d00313 | 2016-04-06 14:38:09 -0700 | [diff] [blame] | 213 |     // This is the binder API.  For the internal API see nextUniqueId(). | 
| Glenn Kasten | eeecb98 | 2016-02-26 10:44:04 -0800 | [diff] [blame] | 214 |     virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 215 |  | 
| Andy Hung | 8b0bfd9 | 2019-12-23 13:11:11 -0800 | [diff] [blame] | 216 |     void acquireAudioSessionId(audio_session_t audioSession, pid_t pid, uid_t uid) override; | 
| Marco Nelissen | 3a34bef | 2011-08-02 13:33:41 -0700 | [diff] [blame] | 217 |  | 
| Glenn Kasten | d848eb4 | 2016-03-08 13:42:11 -0800 | [diff] [blame] | 218 |     virtual void releaseAudioSessionId(audio_session_t audioSession, pid_t pid); | 
| Marco Nelissen | 3a34bef | 2011-08-02 13:33:41 -0700 | [diff] [blame] | 219 |  | 
| Glenn Kasten | f587ba5 | 2012-01-26 16:25:10 -0800 | [diff] [blame] | 220 |     virtual status_t queryNumberEffects(uint32_t *numEffects) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 221 |  | 
| Glenn Kasten | f587ba5 | 2012-01-26 16:25:10 -0800 | [diff] [blame] | 222 |     virtual status_t queryEffect(uint32_t index, effect_descriptor_t *descriptor) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 223 |  | 
| Glenn Kasten | 5e92a78 | 2012-01-30 07:40:52 -0800 | [diff] [blame] | 224 |     virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, | 
| Ari Hausman-Cohen | 2046ec7 | 2018-04-24 14:00:55 -0700 | [diff] [blame] | 225 |                                          const effect_uuid_t *pTypeUuid, | 
 | 226 |                                          uint32_t preferredTypeFlag, | 
| Glenn Kasten | f587ba5 | 2012-01-26 16:25:10 -0800 | [diff] [blame] | 227 |                                          effect_descriptor_t *descriptor) const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 228 |  | 
| Ytai Ben-Tsvi | ce18294 | 2020-11-04 14:48:01 -0800 | [diff] [blame] | 229 |     virtual status_t createEffect(const media::CreateEffectRequest& request, | 
 | 230 |                                   media::CreateEffectResponse* response); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 231 |  | 
| Glenn Kasten | d848eb4 | 2016-03-08 13:42:11 -0800 | [diff] [blame] | 232 |     virtual status_t moveEffects(audio_session_t sessionId, audio_io_handle_t srcOutput, | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 233 |                         audio_io_handle_t dstOutput); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 234 |  | 
| Eric Laurent | b20cf7d | 2019-04-05 19:37:34 -0700 | [diff] [blame] | 235 |             void setEffectSuspended(int effectId, | 
 | 236 |                                     audio_session_t sessionId, | 
 | 237 |                                     bool suspended) override; | 
 | 238 |  | 
| Eric Laurent | a4c5a55 | 2012-03-29 10:12:40 -0700 | [diff] [blame] | 239 |     virtual audio_module_handle_t loadHwModule(const char *name); | 
 | 240 |  | 
| Glenn Kasten | 3b16c76 | 2012-11-14 08:44:39 -0800 | [diff] [blame] | 241 |     virtual uint32_t getPrimaryOutputSamplingRate(); | 
| Glenn Kasten | e33054e | 2012-11-14 12:54:39 -0800 | [diff] [blame] | 242 |     virtual size_t getPrimaryOutputFrameCount(); | 
| Glenn Kasten | cc0f1cf | 2012-09-24 11:27:18 -0700 | [diff] [blame] | 243 |  | 
| Andy Hung | 6f248bb | 2018-01-23 14:04:37 -0800 | [diff] [blame] | 244 |     virtual status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) override; | 
| Glenn Kasten | 4182c4e | 2013-07-15 14:45:07 -0700 | [diff] [blame] | 245 |  | 
| Eric Laurent | 4b12340 | 2014-04-11 09:22:20 -0700 | [diff] [blame] | 246 |     /* List available audio ports and their attributes */ | 
 | 247 |     virtual status_t listAudioPorts(unsigned int *num_ports, | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 248 |                                     struct audio_port *ports); | 
| Eric Laurent | 4b12340 | 2014-04-11 09:22:20 -0700 | [diff] [blame] | 249 |  | 
 | 250 |     /* Get attributes for a given audio port */ | 
| jiabin | b4fed19 | 2020-09-22 14:45:40 -0700 | [diff] [blame] | 251 |     virtual status_t getAudioPort(struct audio_port_v7 *port); | 
| Eric Laurent | 4b12340 | 2014-04-11 09:22:20 -0700 | [diff] [blame] | 252 |  | 
 | 253 |     /* Create an audio patch between several source and sink ports */ | 
 | 254 |     virtual status_t createAudioPatch(const struct audio_patch *patch, | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 255 |                                        audio_patch_handle_t *handle); | 
| Eric Laurent | 4b12340 | 2014-04-11 09:22:20 -0700 | [diff] [blame] | 256 |  | 
 | 257 |     /* Release an audio patch */ | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 258 |     virtual status_t releaseAudioPatch(audio_patch_handle_t handle); | 
| Eric Laurent | 4b12340 | 2014-04-11 09:22:20 -0700 | [diff] [blame] | 259 |  | 
 | 260 |     /* List existing audio patches */ | 
 | 261 |     virtual status_t listAudioPatches(unsigned int *num_patches, | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 262 |                                       struct audio_patch *patches); | 
 | 263 |  | 
| Eric Laurent | 4b12340 | 2014-04-11 09:22:20 -0700 | [diff] [blame] | 264 |     /* Set audio port configuration */ | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 265 |     virtual status_t setAudioPortConfig(const struct audio_port_config *config); | 
| Eric Laurent | 4b12340 | 2014-04-11 09:22:20 -0700 | [diff] [blame] | 266 |  | 
| Eric Laurent | 93c3d41 | 2014-08-01 14:48:35 -0700 | [diff] [blame] | 267 |     /* Get the HW synchronization source used for an audio session */ | 
 | 268 |     virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId); | 
 | 269 |  | 
| Eric Laurent | 72e3f39 | 2015-05-20 14:43:50 -0700 | [diff] [blame] | 270 |     /* Indicate JAVA services are ready (scheduling, power management ...) */ | 
 | 271 |     virtual status_t systemReady(); | 
| Eric Laurent | d66d7a1 | 2021-07-13 13:35:32 +0200 | [diff] [blame] | 272 |     virtual status_t audioPolicyReady() { mAudioPolicyReady.store(true); return NO_ERROR; } | 
 | 273 |             bool isAudioPolicyReady() const { return mAudioPolicyReady.load(); } | 
 | 274 |  | 
| Eric Laurent | 72e3f39 | 2015-05-20 14:43:50 -0700 | [diff] [blame] | 275 |  | 
| jiabin | 46a76fa | 2018-01-05 10:18:21 -0800 | [diff] [blame] | 276 |     virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones); | 
 | 277 |  | 
| Eric Laurent | 42896a0 | 2019-09-27 15:40:33 -0700 | [diff] [blame] | 278 |     virtual status_t setAudioHalPids(const std::vector<pid_t>& pids); | 
 | 279 |  | 
| jiabin | 1319f5a | 2021-03-30 22:21:24 +0000 | [diff] [blame] | 280 |     virtual status_t setVibratorInfos(const std::vector<media::AudioVibratorInfo>& vibratorInfos); | 
 | 281 |  | 
| jiabin | f042b9b | 2021-05-07 23:46:28 +0000 | [diff] [blame] | 282 |     virtual status_t updateSecondaryOutputs( | 
 | 283 |             const TrackSecondaryOutputsMap& trackSecondaryOutputs); | 
 | 284 |  | 
| Ytai Ben-Tsvi | 24b33fc | 2021-05-10 13:08:11 -0700 | [diff] [blame] | 285 |     status_t onTransactWrapper(TransactionCode code, const Parcel& data, uint32_t flags, | 
 | 286 |         const std::function<status_t()>& delegate) override; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 287 |  | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 288 |     // end of IAudioFlinger interface | 
 | 289 |  | 
| Glenn Kasten | 9e58b55 | 2013-01-18 15:09:48 -0800 | [diff] [blame] | 290 |     sp<NBLog::Writer>   newWriter_l(size_t size, const char *name); | 
 | 291 |     void                unregisterWriter(const sp<NBLog::Writer>& writer); | 
| Mikhail Naganov | 4a3d5c2 | 2016-08-15 13:47:42 -0700 | [diff] [blame] | 292 |     sp<EffectsFactoryHalInterface> getEffectsFactory(); | 
| Eric Laurent | fc23520 | 2016-12-20 18:48:17 -0800 | [diff] [blame] | 293 |  | 
 | 294 |     status_t openMmapStream(MmapStreamInterface::stream_direction_t direction, | 
 | 295 |                             const audio_attributes_t *attr, | 
 | 296 |                             audio_config_base_t *config, | 
| Eric Laurent | cb4dae2 | 2017-07-01 19:39:32 -0700 | [diff] [blame] | 297 |                             const AudioClient& client, | 
| Eric Laurent | fc23520 | 2016-12-20 18:48:17 -0800 | [diff] [blame] | 298 |                             audio_port_handle_t *deviceId, | 
| Phil Burk | 4e1af9f | 2018-01-03 15:54:35 -0800 | [diff] [blame] | 299 |                             audio_session_t *sessionId, | 
| Eric Laurent | fc23520 | 2016-12-20 18:48:17 -0800 | [diff] [blame] | 300 |                             const sp<MmapStreamCallback>& callback, | 
| Eric Laurent | cb4dae2 | 2017-07-01 19:39:32 -0700 | [diff] [blame] | 301 |                             sp<MmapStreamInterface>& interface, | 
 | 302 |                             audio_port_handle_t *handle); | 
| jiabin | 57303cc | 2018-12-18 15:45:57 -0800 | [diff] [blame] | 303 |  | 
 | 304 |     static int onExternalVibrationStart(const sp<os::ExternalVibration>& externalVibration); | 
 | 305 |     static void onExternalVibrationStop(const sp<os::ExternalVibration>& externalVibration); | 
| Eric Laurent | b82e6b7 | 2019-11-22 17:25:04 -0800 | [diff] [blame] | 306 |  | 
 | 307 |     status_t addEffectToHal(audio_port_handle_t deviceId, | 
 | 308 |             audio_module_handle_t hwModuleId, sp<EffectHalInterface> effect); | 
 | 309 |     status_t removeEffectFromHal(audio_port_handle_t deviceId, | 
 | 310 |             audio_module_handle_t hwModuleId, sp<EffectHalInterface> effect); | 
 | 311 |  | 
| Eric Laurent | 74c38dc | 2020-12-23 18:19:44 +0100 | [diff] [blame] | 312 |     void updateDownStreamPatches_l(const struct audio_patch *patch, | 
 | 313 |                                    const std::set<audio_io_handle_t> streams); | 
 | 314 |  | 
| Lais Andrade | bc3f37a | 2021-07-02 00:13:19 +0100 | [diff] [blame] | 315 |     std::optional<media::AudioVibratorInfo> getDefaultVibratorInfo_l(); | 
| jiabin | 1319f5a | 2021-03-30 22:21:24 +0000 | [diff] [blame] | 316 |  | 
| Glenn Kasten | 9e58b55 | 2013-01-18 15:09:48 -0800 | [diff] [blame] | 317 | private: | 
| Glenn Kasten | eef598c | 2017-04-03 14:41:13 -0700 | [diff] [blame] | 318 |     // FIXME The 400 is temporarily too high until a leak of writers in media.log is fixed. | 
 | 319 |     static const size_t kLogMemorySize = 400 * 1024; | 
| Glenn Kasten | 9e58b55 | 2013-01-18 15:09:48 -0800 | [diff] [blame] | 320 |     sp<MemoryDealer>    mLogMemoryDealer;   // == 0 when NBLog is disabled | 
| Glenn Kasten | 481fb67 | 2013-09-30 14:39:28 -0700 | [diff] [blame] | 321 |     // When a log writer is unregistered, it is done lazily so that media.log can continue to see it | 
 | 322 |     // for as long as possible.  The memory is only freed when it is needed for another log writer. | 
 | 323 |     Vector< sp<NBLog::Writer> > mUnregisteredWriters; | 
 | 324 |     Mutex               mUnregisteredWritersLock; | 
| Eric Laurent | fc23520 | 2016-12-20 18:48:17 -0800 | [diff] [blame] | 325 |  | 
| Glenn Kasten | 9e58b55 | 2013-01-18 15:09:48 -0800 | [diff] [blame] | 326 | public: | 
| Andy Hung | 6626a01 | 2021-01-12 13:38:00 -0800 | [diff] [blame] | 327 |     // Life cycle of gAudioFlinger and AudioFlinger: | 
 | 328 |     // | 
 | 329 |     // AudioFlinger is created once and survives until audioserver crashes | 
 | 330 |     // irrespective of sp<> and wp<> as it is refcounted by ServiceManager and we | 
 | 331 |     // don't issue a ServiceManager::tryUnregisterService(). | 
 | 332 |     // | 
 | 333 |     // gAudioFlinger is an atomic pointer set on AudioFlinger::onFirstRef(). | 
 | 334 |     // After this is set, it is safe to obtain a wp<> or sp<> from it as the | 
 | 335 |     // underlying object does not go away. | 
 | 336 |     // | 
 | 337 |     // Note: For most inner classes, it is acceptable to hold a reference to the outer | 
 | 338 |     // AudioFlinger instance as creation requires AudioFlinger to exist in the first place. | 
 | 339 |     // | 
 | 340 |     // An atomic here ensures underlying writes have completed before setting | 
 | 341 |     // the pointer. Access by memory_order_seq_cst. | 
 | 342 |     // | 
 | 343 |  | 
 | 344 |     static inline std::atomic<AudioFlinger *> gAudioFlinger = nullptr; | 
| Glenn Kasten | 9e58b55 | 2013-01-18 15:09:48 -0800 | [diff] [blame] | 345 |  | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 346 |     class SyncEvent; | 
 | 347 |  | 
 | 348 |     typedef void (*sync_event_callback_t)(const wp<SyncEvent>& event) ; | 
 | 349 |  | 
 | 350 |     class SyncEvent : public RefBase { | 
 | 351 |     public: | 
 | 352 |         SyncEvent(AudioSystem::sync_event_t type, | 
| Glenn Kasten | d848eb4 | 2016-03-08 13:42:11 -0800 | [diff] [blame] | 353 |                   audio_session_t triggerSession, | 
 | 354 |                   audio_session_t listenerSession, | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 355 |                   sync_event_callback_t callBack, | 
| Eric Laurent | 8ea16e4 | 2014-02-20 16:26:11 -0800 | [diff] [blame] | 356 |                   wp<RefBase> cookie) | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 357 |         : mType(type), mTriggerSession(triggerSession), mListenerSession(listenerSession), | 
 | 358 |           mCallback(callBack), mCookie(cookie) | 
 | 359 |         {} | 
 | 360 |  | 
 | 361 |         virtual ~SyncEvent() {} | 
 | 362 |  | 
| Ytai Ben-Tsvi | 3de1bbf | 2020-01-21 16:41:17 -0800 | [diff] [blame] | 363 |         void trigger() { | 
 | 364 |             Mutex::Autolock _l(mLock); | 
 | 365 |             if (mCallback) mCallback(wp<SyncEvent>(this)); | 
 | 366 |         } | 
| Glenn Kasten | 106e8a4 | 2012-08-02 13:37:12 -0700 | [diff] [blame] | 367 |         bool isCancelled() const { Mutex::Autolock _l(mLock); return (mCallback == NULL); } | 
 | 368 |         void cancel() { Mutex::Autolock _l(mLock); mCallback = NULL; } | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 369 |         AudioSystem::sync_event_t type() const { return mType; } | 
| Glenn Kasten | d848eb4 | 2016-03-08 13:42:11 -0800 | [diff] [blame] | 370 |         audio_session_t triggerSession() const { return mTriggerSession; } | 
 | 371 |         audio_session_t listenerSession() const { return mListenerSession; } | 
| Eric Laurent | 8ea16e4 | 2014-02-20 16:26:11 -0800 | [diff] [blame] | 372 |         wp<RefBase> cookie() const { return mCookie; } | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 373 |  | 
 | 374 |     private: | 
 | 375 |           const AudioSystem::sync_event_t mType; | 
| Glenn Kasten | d848eb4 | 2016-03-08 13:42:11 -0800 | [diff] [blame] | 376 |           const audio_session_t mTriggerSession; | 
 | 377 |           const audio_session_t mListenerSession; | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 378 |           sync_event_callback_t mCallback; | 
| Eric Laurent | 8ea16e4 | 2014-02-20 16:26:11 -0800 | [diff] [blame] | 379 |           const wp<RefBase> mCookie; | 
| Glenn Kasten | 106e8a4 | 2012-08-02 13:37:12 -0700 | [diff] [blame] | 380 |           mutable Mutex mLock; | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 381 |     }; | 
 | 382 |  | 
 | 383 |     sp<SyncEvent> createSyncEvent(AudioSystem::sync_event_t type, | 
| Glenn Kasten | d848eb4 | 2016-03-08 13:42:11 -0800 | [diff] [blame] | 384 |                                         audio_session_t triggerSession, | 
 | 385 |                                         audio_session_t listenerSession, | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 386 |                                         sync_event_callback_t callBack, | 
| Chih-Hung Hsieh | 36d0ca1 | 2016-08-09 14:31:32 -0700 | [diff] [blame] | 387 |                                         const wp<RefBase>& cookie); | 
| Eric Laurent | 717e128 | 2012-06-29 16:36:52 -0700 | [diff] [blame] | 388 |  | 
| Eric Laurent | d8365c5 | 2017-07-16 15:27:05 -0700 | [diff] [blame] | 389 |     bool        btNrecIsOff() const { return mBtNrecIsOff.load(); } | 
 | 390 |  | 
 | 391 |  | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 392 | private: | 
| John Grossman | ee578c0 | 2012-07-23 17:05:46 -0700 | [diff] [blame] | 393 |  | 
| Glenn Kasten | f78aee7 | 2012-01-04 11:00:47 -0800 | [diff] [blame] | 394 |                audio_mode_t getMode() const { return mMode; } | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 395 |  | 
| Mathias Agopian | e762be9 | 2013-05-09 16:26:45 -0700 | [diff] [blame] | 396 |                             AudioFlinger() ANDROID_API; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 397 |     virtual                 ~AudioFlinger(); | 
 | 398 |  | 
| Glenn Kasten | 2b213bc | 2012-02-02 14:05:20 -0800 | [diff] [blame] | 399 |     // call in any IAudioFlinger method that accesses mPrimaryHardwareDev | 
| Glenn Kasten | 85ab62c | 2012-11-01 11:11:38 -0700 | [diff] [blame] | 400 |     status_t                initCheck() const { return mPrimaryHardwareDev == NULL ? | 
 | 401 |                                                         NO_INIT : NO_ERROR; } | 
| Glenn Kasten | 2b213bc | 2012-02-02 14:05:20 -0800 | [diff] [blame] | 402 |  | 
| Glenn Kasten | 000f0e3 | 2012-03-01 17:10:56 -0800 | [diff] [blame] | 403 |     // RefBase | 
| Dima Zavin | 5a61d2f | 2011-04-19 19:04:32 -0700 | [diff] [blame] | 404 |     virtual     void        onFirstRef(); | 
| Glenn Kasten | 000f0e3 | 2012-03-01 17:10:56 -0800 | [diff] [blame] | 405 |  | 
| Glenn Kasten | 85ab62c | 2012-11-01 11:11:38 -0700 | [diff] [blame] | 406 |     AudioHwDevice*          findSuitableHwDev_l(audio_module_handle_t module, | 
| jiabin | 4381040 | 2019-10-24 14:58:31 -0700 | [diff] [blame] | 407 |                                                 audio_devices_t deviceType); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 408 |  | 
| Andy Hung | 9a59276 | 2014-07-21 21:56:01 -0700 | [diff] [blame] | 409 |     // Set kEnableExtendedChannels to true to enable greater than stereo output | 
 | 410 |     // for the MixerThread and device sink.  Number of channels allowed is | 
 | 411 |     // FCC_2 <= channels <= AudioMixer::MAX_NUM_CHANNELS. | 
| Andy Hung | b1ee395 | 2014-07-28 16:28:06 -0700 | [diff] [blame] | 412 |     static const bool kEnableExtendedChannels = true; | 
| Andy Hung | 9a59276 | 2014-07-21 21:56:01 -0700 | [diff] [blame] | 413 |  | 
 | 414 |     // Returns true if channel mask is permitted for the PCM sink in the MixerThread | 
 | 415 |     static inline bool isValidPcmSinkChannelMask(audio_channel_mask_t channelMask) { | 
 | 416 |         switch (audio_channel_mask_get_representation(channelMask)) { | 
 | 417 |         case AUDIO_CHANNEL_REPRESENTATION_POSITION: { | 
| jiabin | 4057332 | 2018-11-08 12:08:02 -0800 | [diff] [blame] | 418 |             // Haptic channel mask is only applicable for channel position mask. | 
 | 419 |             const uint32_t channelCount = audio_channel_count_from_out_mask( | 
| Mikhail Naganov | 5577303 | 2020-10-01 15:08:13 -0700 | [diff] [blame] | 420 |                     static_cast<audio_channel_mask_t>(channelMask & ~AUDIO_CHANNEL_HAPTIC_ALL)); | 
| jiabin | 4057332 | 2018-11-08 12:08:02 -0800 | [diff] [blame] | 421 |             const uint32_t maxChannelCount = kEnableExtendedChannels | 
 | 422 |                     ? AudioMixer::MAX_NUM_CHANNELS : FCC_2; | 
 | 423 |             if (channelCount < FCC_2 // mono is not supported at this time | 
 | 424 |                     || channelCount > maxChannelCount) { | 
 | 425 |                 return false; | 
| Andy Hung | 9a59276 | 2014-07-21 21:56:01 -0700 | [diff] [blame] | 426 |             } | 
 | 427 |             // check that channelMask is the "canonical" one we expect for the channelCount. | 
| jiabin | 4057332 | 2018-11-08 12:08:02 -0800 | [diff] [blame] | 428 |             return audio_channel_position_mask_is_out_canonical(channelMask); | 
| Andy Hung | 9a59276 | 2014-07-21 21:56:01 -0700 | [diff] [blame] | 429 |             } | 
| Andy Hung | 64b6cb2 | 2015-05-19 12:32:58 -0700 | [diff] [blame] | 430 |         case AUDIO_CHANNEL_REPRESENTATION_INDEX: | 
 | 431 |             if (kEnableExtendedChannels) { | 
 | 432 |                 const uint32_t channelCount = audio_channel_count_from_out_mask(channelMask); | 
 | 433 |                 if (channelCount >= FCC_2 // mono is not supported at this time | 
 | 434 |                         && channelCount <= AudioMixer::MAX_NUM_CHANNELS) { | 
 | 435 |                     return true; | 
 | 436 |                 } | 
 | 437 |             } | 
 | 438 |             return false; | 
| Andy Hung | 9a59276 | 2014-07-21 21:56:01 -0700 | [diff] [blame] | 439 |         default: | 
 | 440 |             return false; | 
 | 441 |         } | 
 | 442 |     } | 
 | 443 |  | 
| Andy Hung | 6146c08 | 2014-03-18 11:56:15 -0700 | [diff] [blame] | 444 |     // Set kEnableExtendedPrecision to true to use extended precision in MixerThread | 
| Andy Hung | a494e82 | 2014-07-08 18:09:40 -0700 | [diff] [blame] | 445 |     static const bool kEnableExtendedPrecision = true; | 
| Andy Hung | 6146c08 | 2014-03-18 11:56:15 -0700 | [diff] [blame] | 446 |  | 
 | 447 |     // Returns true if format is permitted for the PCM sink in the MixerThread | 
 | 448 |     static inline bool isValidPcmSinkFormat(audio_format_t format) { | 
 | 449 |         switch (format) { | 
 | 450 |         case AUDIO_FORMAT_PCM_16_BIT: | 
 | 451 |             return true; | 
 | 452 |         case AUDIO_FORMAT_PCM_FLOAT: | 
 | 453 |         case AUDIO_FORMAT_PCM_24_BIT_PACKED: | 
 | 454 |         case AUDIO_FORMAT_PCM_32_BIT: | 
 | 455 |         case AUDIO_FORMAT_PCM_8_24_BIT: | 
 | 456 |             return kEnableExtendedPrecision; | 
 | 457 |         default: | 
 | 458 |             return false; | 
 | 459 |         } | 
 | 460 |     } | 
 | 461 |  | 
| Glenn Kasten | 66fcab9 | 2012-02-24 14:59:21 -0800 | [diff] [blame] | 462 |     // standby delay for MIXER and DUPLICATING playback threads is read from property | 
 | 463 |     // ro.audio.flinger_standbytime_ms or defaults to kDefaultStandbyTimeInNsecs | 
| John Grossman | 4ff14ba | 2012-02-08 16:37:41 -0800 | [diff] [blame] | 464 |     static nsecs_t          mStandbyTimeInNsecs; | 
 | 465 |  | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 466 |     // incremented by 2 when screen state changes, bit 0 == 1 means "off" | 
 | 467 |     // AudioFlinger::setParameters() updates, other threads read w/o lock | 
 | 468 |     static uint32_t         mScreenState; | 
 | 469 |  | 
| Glenn Kasten | be5f05e | 2012-07-18 15:24:02 -0700 | [diff] [blame] | 470 |     // Internal dump utilities. | 
| Mikhail Naganov | 959e2d0 | 2019-03-28 11:08:19 -0700 | [diff] [blame] | 471 |     static const int kDumpLockTimeoutNs = 1 * NANOS_PER_SECOND; | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 472 |     static bool dumpTryLock(Mutex& mutex); | 
| Glenn Kasten | be5f05e | 2012-07-18 15:24:02 -0700 | [diff] [blame] | 473 |     void dumpPermissionDenial(int fd, const Vector<String16>& args); | 
 | 474 |     void dumpClients(int fd, const Vector<String16>& args); | 
 | 475 |     void dumpInternals(int fd, const Vector<String16>& args); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 476 |  | 
| Andy Hung | dc099c2 | 2018-09-18 13:46:39 -0700 | [diff] [blame] | 477 |     SimpleLog mThreadLog{16}; // 16 Thread history limit | 
 | 478 |  | 
 | 479 |     class ThreadBase; | 
 | 480 |     void dumpToThreadLog_l(const sp<ThreadBase> &thread); | 
| Andy Hung | a8115dc | 2018-08-24 15:51:59 -0700 | [diff] [blame] | 481 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 482 |     // --- Client --- | 
 | 483 |     class Client : public RefBase { | 
 | 484 |     public: | 
 | 485 |                             Client(const sp<AudioFlinger>& audioFlinger, pid_t pid); | 
 | 486 |         virtual             ~Client(); | 
| Glenn Kasten | 435dbe6 | 2012-01-30 10:15:48 -0800 | [diff] [blame] | 487 |         sp<MemoryDealer>    heap() const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 488 |         pid_t               pid() const { return mPid; } | 
| Glenn Kasten | c59c004 | 2012-02-02 14:06:11 -0800 | [diff] [blame] | 489 |         sp<AudioFlinger>    audioFlinger() const { return mAudioFlinger; } | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 490 |  | 
 | 491 |     private: | 
| Mikhail Naganov | bf49308 | 2017-04-17 17:37:12 -0700 | [diff] [blame] | 492 |         DISALLOW_COPY_AND_ASSIGN(Client); | 
 | 493 |  | 
| Glenn Kasten | 84afa3b | 2012-01-25 15:28:08 -0800 | [diff] [blame] | 494 |         const sp<AudioFlinger> mAudioFlinger; | 
| Eric Laurent | da73b6c | 2015-08-20 16:18:53 -0700 | [diff] [blame] | 495 |               sp<MemoryDealer> mMemoryDealer; | 
| Glenn Kasten | 84afa3b | 2012-01-25 15:28:08 -0800 | [diff] [blame] | 496 |         const pid_t         mPid; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 497 |     }; | 
 | 498 |  | 
 | 499 |     // --- Notification Client --- | 
 | 500 |     class NotificationClient : public IBinder::DeathRecipient { | 
 | 501 |     public: | 
 | 502 |                             NotificationClient(const sp<AudioFlinger>& audioFlinger, | 
| Ytai Ben-Tsvi | 10dc0a6 | 2020-09-18 11:31:55 -0700 | [diff] [blame] | 503 |                                                 const sp<media::IAudioFlingerClient>& client, | 
| Andy Hung | 5bdc535 | 2019-12-23 14:36:31 -0800 | [diff] [blame] | 504 |                                                 pid_t pid, | 
 | 505 |                                                 uid_t uid); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 506 |         virtual             ~NotificationClient(); | 
 | 507 |  | 
| Ytai Ben-Tsvi | 10dc0a6 | 2020-09-18 11:31:55 -0700 | [diff] [blame] | 508 |                 sp<media::IAudioFlingerClient> audioFlingerClient() const { return mAudioFlingerClient; } | 
| Andy Hung | 5bdc535 | 2019-12-23 14:36:31 -0800 | [diff] [blame] | 509 |                 pid_t getPid() const { return mPid; } | 
 | 510 |                 uid_t getUid() const { return mUid; } | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 511 |  | 
 | 512 |                 // IBinder::DeathRecipient | 
 | 513 |                 virtual     void        binderDied(const wp<IBinder>& who); | 
 | 514 |  | 
 | 515 |     private: | 
| Mikhail Naganov | bf49308 | 2017-04-17 17:37:12 -0700 | [diff] [blame] | 516 |         DISALLOW_COPY_AND_ASSIGN(NotificationClient); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 517 |  | 
| Glenn Kasten | 84afa3b | 2012-01-25 15:28:08 -0800 | [diff] [blame] | 518 |         const sp<AudioFlinger>  mAudioFlinger; | 
 | 519 |         const pid_t             mPid; | 
| Andy Hung | 5bdc535 | 2019-12-23 14:36:31 -0800 | [diff] [blame] | 520 |         const uid_t             mUid; | 
| Ytai Ben-Tsvi | 10dc0a6 | 2020-09-18 11:31:55 -0700 | [diff] [blame] | 521 |         const sp<media::IAudioFlingerClient> mAudioFlingerClient; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 522 |     }; | 
 | 523 |  | 
| Nicolas Roulet | dcdfaec | 2017-02-14 10:18:39 -0800 | [diff] [blame] | 524 |     // --- MediaLogNotifier --- | 
 | 525 |     // Thread in charge of notifying MediaLogService to start merging. | 
 | 526 |     // Receives requests from AudioFlinger's binder activity. It is used to reduce the amount of | 
 | 527 |     // binder calls to MediaLogService in case of bursts of AudioFlinger binder calls. | 
 | 528 |     class MediaLogNotifier : public Thread { | 
 | 529 |     public: | 
 | 530 |         MediaLogNotifier(); | 
 | 531 |  | 
 | 532 |         // Requests a MediaLogService notification. It's ignored if there has recently been another | 
 | 533 |         void requestMerge(); | 
 | 534 |     private: | 
 | 535 |         // Every iteration blocks waiting for a request, then interacts with MediaLogService to | 
 | 536 |         // start merging. | 
 | 537 |         // As every MediaLogService binder call is expensive, once it gets a request it ignores the | 
 | 538 |         // following ones for a period of time. | 
 | 539 |         virtual bool threadLoop() override; | 
 | 540 |  | 
 | 541 |         bool mPendingRequests; | 
 | 542 |  | 
 | 543 |         // Mutex and condition variable around mPendingRequests' value | 
 | 544 |         Mutex       mMutex; | 
 | 545 |         Condition   mCond; | 
 | 546 |  | 
 | 547 |         // Duration of the sleep period after a processed request | 
 | 548 |         static const int kPostTriggerSleepPeriod = 1000000; | 
 | 549 |     }; | 
 | 550 |  | 
 | 551 |     const sp<MediaLogNotifier> mMediaLogNotifier; | 
 | 552 |  | 
 | 553 |     // This is a helper that is called during incoming binder calls. | 
| Ytai Ben-Tsvi | 5385847 | 2020-11-30 11:04:46 -0800 | [diff] [blame] | 554 |     // Requests media.log to start merging log buffers | 
| Nicolas Roulet | dcdfaec | 2017-02-14 10:18:39 -0800 | [diff] [blame] | 555 |     void requestLogMerge(); | 
 | 556 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 557 |     class TrackHandle; | 
 | 558 |     class RecordHandle; | 
 | 559 |     class RecordThread; | 
 | 560 |     class PlaybackThread; | 
 | 561 |     class MixerThread; | 
 | 562 |     class DirectOutputThread; | 
| Eric Laurent | bfb1b83 | 2013-01-07 09:53:42 -0800 | [diff] [blame] | 563 |     class OffloadThread; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 564 |     class DuplicatingThread; | 
| Eric Laurent | bfb1b83 | 2013-01-07 09:53:42 -0800 | [diff] [blame] | 565 |     class AsyncCallbackThread; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 566 |     class Track; | 
 | 567 |     class RecordTrack; | 
| Eric Laurent | 4170955 | 2019-12-16 19:34:05 -0800 | [diff] [blame] | 568 |     class EffectBase; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 569 |     class EffectModule; | 
 | 570 |     class EffectHandle; | 
 | 571 |     class EffectChain; | 
| Eric Laurent | b82e6b7 | 2019-11-22 17:25:04 -0800 | [diff] [blame] | 572 |     class DeviceEffectProxy; | 
 | 573 |     class DeviceEffectManager; | 
 | 574 |     class PatchPanel; | 
 | 575 |     class DeviceEffectManagerCallback; | 
| Phil Burk | 062e67a | 2015-02-11 13:40:50 -0800 | [diff] [blame] | 576 |  | 
| Dima Zavin | 799a70e | 2011-04-18 16:57:27 -0700 | [diff] [blame] | 577 |     struct AudioStreamIn; | 
| Kevin Rocard | 153f92d | 2018-12-18 18:33:28 -0800 | [diff] [blame] | 578 |     struct TeePatch; | 
 | 579 |     using TeePatches = std::vector<TeePatch>; | 
 | 580 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 581 |  | 
| Glenn Kasten | b7bf796 | 2012-02-08 12:36:25 -0800 | [diff] [blame] | 582 |     struct  stream_type_t { | 
 | 583 |         stream_type_t() | 
 | 584 |             :   volume(1.0f), | 
| Eric Laurent | 1a9ed11 | 2012-03-20 18:36:01 -0700 | [diff] [blame] | 585 |                 mute(false) | 
| Glenn Kasten | b7bf796 | 2012-02-08 12:36:25 -0800 | [diff] [blame] | 586 |         { | 
 | 587 |         } | 
 | 588 |         float       volume; | 
 | 589 |         bool        mute; | 
| Glenn Kasten | b7bf796 | 2012-02-08 12:36:25 -0800 | [diff] [blame] | 590 |     }; | 
 | 591 |  | 
| Mikhail Naganov | 2534b38 | 2019-09-25 13:05:02 -0700 | [diff] [blame] | 592 |     // Abstraction for the Audio Source for the RecordThread (HAL or PassthruPatchRecord). | 
 | 593 |     struct Source | 
 | 594 |     { | 
 | 595 |         virtual ~Source() = default; | 
 | 596 |         // The following methods have the same signatures as in StreamHalInterface. | 
 | 597 |         virtual status_t read(void *buffer, size_t bytes, size_t *read) = 0; | 
 | 598 |         virtual status_t getCapturePosition(int64_t *frames, int64_t *time) = 0; | 
 | 599 |         virtual status_t standby() = 0; | 
 | 600 |     }; | 
 | 601 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 602 |     // --- PlaybackThread --- | 
| rago | 94a1ee8 | 2017-07-21 15:11:02 -0700 | [diff] [blame] | 603 | #ifdef FLOAT_EFFECT_CHAIN | 
 | 604 | #define EFFECT_BUFFER_FORMAT AUDIO_FORMAT_PCM_FLOAT | 
 | 605 | using effect_buffer_t = float; | 
 | 606 | #else | 
 | 607 | #define EFFECT_BUFFER_FORMAT AUDIO_FORMAT_PCM_16_BIT | 
 | 608 | using effect_buffer_t = int16_t; | 
 | 609 | #endif | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 610 |  | 
 | 611 | #include "Threads.h" | 
 | 612 |  | 
| Eric Laurent | b82e6b7 | 2019-11-22 17:25:04 -0800 | [diff] [blame] | 613 | #include "PatchPanel.h" | 
 | 614 |  | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 615 | #include "Effects.h" | 
 | 616 |  | 
| Eric Laurent | b82e6b7 | 2019-11-22 17:25:04 -0800 | [diff] [blame] | 617 | #include "DeviceEffectManager.h" | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 618 |  | 
| Andy Hung | e778c42 | 2019-03-14 15:04:30 -0700 | [diff] [blame] | 619 |     // Find io handle by session id. | 
 | 620 |     // Preference is given to an io handle with a matching effect chain to session id. | 
 | 621 |     // If none found, AUDIO_IO_HANDLE_NONE is returned. | 
 | 622 |     template <typename T> | 
 | 623 |     static audio_io_handle_t findIoHandleBySessionId_l( | 
 | 624 |             audio_session_t sessionId, const T& threads) { | 
 | 625 |         audio_io_handle_t io = AUDIO_IO_HANDLE_NONE; | 
 | 626 |  | 
 | 627 |         for (size_t i = 0; i < threads.size(); i++) { | 
 | 628 |             const uint32_t sessionType = threads.valueAt(i)->hasAudioSession(sessionId); | 
 | 629 |             if (sessionType != 0) { | 
 | 630 |                 io = threads.keyAt(i); | 
 | 631 |                 if ((sessionType & AudioFlinger::ThreadBase::EFFECT_SESSION) != 0) { | 
 | 632 |                     break; // effect chain here. | 
 | 633 |                 } | 
 | 634 |             } | 
 | 635 |         } | 
 | 636 |         return io; | 
 | 637 |     } | 
 | 638 |  | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 639 |     // server side of the client's IAudioTrack | 
| Ytai Ben-Tsvi | bdc293a | 2020-11-02 17:01:38 -0800 | [diff] [blame] | 640 |     class TrackHandle : public android::media::BnAudioTrack { | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 641 |     public: | 
| Chih-Hung Hsieh | 36d0ca1 | 2016-08-09 14:31:32 -0700 | [diff] [blame] | 642 |         explicit            TrackHandle(const sp<PlaybackThread::Track>& track); | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 643 |         virtual             ~TrackHandle(); | 
| Glenn Kasten | 3dcd00d | 2013-07-17 10:10:23 -0700 | [diff] [blame] | 644 |  | 
| Ytai Ben-Tsvi | bdc293a | 2020-11-02 17:01:38 -0800 | [diff] [blame] | 645 |         binder::Status getCblk(std::optional<media::SharedFileRegion>* _aidl_return) override; | 
 | 646 |         binder::Status start(int32_t* _aidl_return) override; | 
 | 647 |         binder::Status stop() override; | 
 | 648 |         binder::Status flush() override; | 
 | 649 |         binder::Status pause() override; | 
 | 650 |         binder::Status attachAuxEffect(int32_t effectId, int32_t* _aidl_return) override; | 
 | 651 |         binder::Status setParameters(const std::string& keyValuePairs, | 
 | 652 |                                      int32_t* _aidl_return) override; | 
 | 653 |         binder::Status selectPresentation(int32_t presentationId, int32_t programId, | 
 | 654 |                                           int32_t* _aidl_return) override; | 
 | 655 |         binder::Status getTimestamp(media::AudioTimestampInternal* timestamp, | 
 | 656 |                                     int32_t* _aidl_return) override; | 
 | 657 |         binder::Status signal() override; | 
 | 658 |         binder::Status applyVolumeShaper(const media::VolumeShaperConfiguration& configuration, | 
 | 659 |                                          const media::VolumeShaperOperation& operation, | 
 | 660 |                                          int32_t* _aidl_return) override; | 
 | 661 |         binder::Status getVolumeShaperState( | 
 | 662 |                 int32_t id, | 
 | 663 |                 std::optional<media::VolumeShaperState>* _aidl_return) override; | 
| Kuowei Li | d4adbdb | 2020-08-13 14:44:25 +0800 | [diff] [blame] | 664 |         binder::Status getDualMonoMode(media::AudioDualMonoMode* _aidl_return) override; | 
 | 665 |         binder::Status setDualMonoMode(media::AudioDualMonoMode mode) override; | 
 | 666 |         binder::Status getAudioDescriptionMixLevel(float* _aidl_return) override; | 
 | 667 |         binder::Status setAudioDescriptionMixLevel(float leveldB) override; | 
 | 668 |         binder::Status getPlaybackRateParameters( | 
 | 669 |                 media::AudioPlaybackRate* _aidl_return) override; | 
 | 670 |         binder::Status setPlaybackRateParameters( | 
 | 671 |                 const media::AudioPlaybackRate& playbackRate) override; | 
| Richard Fitzgerald | ad3af33 | 2013-03-25 16:54:37 +0000 | [diff] [blame] | 672 |  | 
| Glenn Kasten | 9806710 | 2011-12-13 11:47:54 -0800 | [diff] [blame] | 673 |     private: | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 674 |         const sp<PlaybackThread::Track> mTrack; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 675 |     }; | 
 | 676 |  | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 677 |     // server side of the client's IAudioRecord | 
| Ivan Lozano | ff6900d | 2017-08-01 15:47:38 -0700 | [diff] [blame] | 678 |     class RecordHandle : public android::media::BnAudioRecord { | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 679 |     public: | 
| Chih-Hung Hsieh | 36d0ca1 | 2016-08-09 14:31:32 -0700 | [diff] [blame] | 680 |         explicit RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack); | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 681 |         virtual             ~RecordHandle(); | 
| Ivan Lozano | ff6900d | 2017-08-01 15:47:38 -0700 | [diff] [blame] | 682 |         virtual binder::Status    start(int /*AudioSystem::sync_event_t*/ event, | 
 | 683 |                 int /*audio_session_t*/ triggerSession); | 
 | 684 |         virtual binder::Status   stop(); | 
| jiabin | 653cc0a | 2018-01-17 17:54:10 -0800 | [diff] [blame] | 685 |         virtual binder::Status   getActiveMicrophones( | 
| Ytai Ben-Tsvi | 71109da | 2020-11-03 15:11:13 -0800 | [diff] [blame] | 686 |                 std::vector<media::MicrophoneInfoData>* activeMicrophones); | 
| Paul McLean | 1234008 | 2019-03-19 09:35:05 -0600 | [diff] [blame] | 687 |         virtual binder::Status   setPreferredMicrophoneDirection( | 
| Paul McLean | 03a6e6a | 2018-12-04 10:54:13 -0700 | [diff] [blame] | 688 |                 int /*audio_microphone_direction_t*/ direction); | 
| Paul McLean | 1234008 | 2019-03-19 09:35:05 -0600 | [diff] [blame] | 689 |         virtual binder::Status   setPreferredMicrophoneFieldDimension(float zoom); | 
| Eric Laurent | ec376dc | 2021-04-08 20:41:22 +0200 | [diff] [blame] | 690 |         virtual binder::Status   shareAudioHistory(const std::string& sharedAudioPackageName, | 
 | 691 |                                                    int64_t sharedAudioStartMs); | 
| Paul McLean | 03a6e6a | 2018-12-04 10:54:13 -0700 | [diff] [blame] | 692 |  | 
| Glenn Kasten | 5891256 | 2012-04-03 10:45:00 -0700 | [diff] [blame] | 693 |     private: | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 694 |         const sp<RecordThread::RecordTrack> mRecordTrack; | 
| Glenn Kasten | 5891256 | 2012-04-03 10:45:00 -0700 | [diff] [blame] | 695 |  | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 696 |         // for use from destructor | 
 | 697 |         void                stop_nonvirtual(); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 698 |     }; | 
 | 699 |  | 
| Eric Laurent | 6acd1d4 | 2017-01-04 14:23:29 -0800 | [diff] [blame] | 700 |     // Mmap stream control interface implementation. Each MmapThreadHandle controls one | 
 | 701 |     // MmapPlaybackThread or MmapCaptureThread instance. | 
 | 702 |     class MmapThreadHandle : public MmapStreamInterface { | 
 | 703 |     public: | 
 | 704 |         explicit            MmapThreadHandle(const sp<MmapThread>& thread); | 
 | 705 |         virtual             ~MmapThreadHandle(); | 
 | 706 |  | 
 | 707 |         // MmapStreamInterface virtuals | 
 | 708 |         virtual status_t createMmapBuffer(int32_t minSizeFrames, | 
 | 709 |                                           struct audio_mmap_buffer_info *info); | 
 | 710 |         virtual status_t getMmapPosition(struct audio_mmap_position *position); | 
| jiabin | b7d8c5a | 2020-08-26 17:24:52 -0700 | [diff] [blame] | 711 |         virtual status_t getExternalPosition(uint64_t *position, int64_t *timeNanos); | 
| Eric Laurent | cb4dae2 | 2017-07-01 19:39:32 -0700 | [diff] [blame] | 712 |         virtual status_t start(const AudioClient& client, | 
| jiabin | d1f1cb6 | 2020-03-24 11:57:57 -0700 | [diff] [blame] | 713 |                                const audio_attributes_t *attr, | 
 | 714 |                                audio_port_handle_t *handle); | 
| Eric Laurent | 6acd1d4 | 2017-01-04 14:23:29 -0800 | [diff] [blame] | 715 |         virtual status_t stop(audio_port_handle_t handle); | 
| Eric Laurent | 18b5701 | 2017-02-13 16:23:52 -0800 | [diff] [blame] | 716 |         virtual status_t standby(); | 
| Eric Laurent | 6acd1d4 | 2017-01-04 14:23:29 -0800 | [diff] [blame] | 717 |  | 
 | 718 |     private: | 
| Phil Burk | 9fabbf8 | 2017-08-03 12:02:00 -0700 | [diff] [blame] | 719 |         const sp<MmapThread> mThread; | 
| Eric Laurent | 6acd1d4 | 2017-01-04 14:23:29 -0800 | [diff] [blame] | 720 |     }; | 
| Eric Laurent | bfb1b83 | 2013-01-07 09:53:42 -0800 | [diff] [blame] | 721 |  | 
| Glenn Kasten | eeecb98 | 2016-02-26 10:44:04 -0800 | [diff] [blame] | 722 |               ThreadBase *checkThread_l(audio_io_handle_t ioHandle) const; | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 723 |               PlaybackThread *checkPlaybackThread_l(audio_io_handle_t output) const; | 
 | 724 |               MixerThread *checkMixerThread_l(audio_io_handle_t output) const; | 
 | 725 |               RecordThread *checkRecordThread_l(audio_io_handle_t input) const; | 
| Eric Laurent | 6acd1d4 | 2017-01-04 14:23:29 -0800 | [diff] [blame] | 726 |               MmapThread *checkMmapThread_l(audio_io_handle_t io) const; | 
 | 727 |               VolumeInterface *getVolumeInterface_l(audio_io_handle_t output) const; | 
 | 728 |               Vector <VolumeInterface *> getAllVolumeInterfaces_l() const; | 
 | 729 |  | 
 | 730 |               sp<ThreadBase> openInput_l(audio_module_handle_t module, | 
| Eric Laurent | cf2c021 | 2014-07-25 16:20:43 -0700 | [diff] [blame] | 731 |                                            audio_io_handle_t *input, | 
 | 732 |                                            audio_config_t *config, | 
| Eric Laurent | 83b8808 | 2014-06-20 18:31:16 -0700 | [diff] [blame] | 733 |                                            audio_devices_t device, | 
| Ytai Ben-Tsvi | 12a0b84 | 2020-11-05 13:47:32 -0800 | [diff] [blame] | 734 |                                            const char* address, | 
| Eric Laurent | cf2c021 | 2014-07-25 16:20:43 -0700 | [diff] [blame] | 735 |                                            audio_source_t source, | 
| Mikhail Naganov | b4e037e | 2019-01-14 15:56:33 -0800 | [diff] [blame] | 736 |                                            audio_input_flags_t flags, | 
 | 737 |                                            audio_devices_t outputDevice, | 
 | 738 |                                            const String8& outputDeviceAddress); | 
| Eric Laurent | 6acd1d4 | 2017-01-04 14:23:29 -0800 | [diff] [blame] | 739 |               sp<ThreadBase> openOutput_l(audio_module_handle_t module, | 
| jiabin | 4381040 | 2019-10-24 14:58:31 -0700 | [diff] [blame] | 740 |                                           audio_io_handle_t *output, | 
| Eric Laurent | f1f22e7 | 2021-07-13 14:04:14 +0200 | [diff] [blame] | 741 |                                           audio_config_t *halConfig, | 
 | 742 |                                           audio_config_base_t *mixerConfig, | 
| jiabin | 4381040 | 2019-10-24 14:58:31 -0700 | [diff] [blame] | 743 |                                           audio_devices_t deviceType, | 
 | 744 |                                           const String8& address, | 
 | 745 |                                           audio_output_flags_t flags); | 
| Eric Laurent | 83b8808 | 2014-06-20 18:31:16 -0700 | [diff] [blame] | 746 |  | 
| Chih-Hung Hsieh | 36d0ca1 | 2016-08-09 14:31:32 -0700 | [diff] [blame] | 747 |               void closeOutputFinish(const sp<PlaybackThread>& thread); | 
 | 748 |               void closeInputFinish(const sp<RecordThread>& thread); | 
| Eric Laurent | 83b8808 | 2014-06-20 18:31:16 -0700 | [diff] [blame] | 749 |  | 
| Glenn Kasten | 6637baa | 2012-01-09 09:40:36 -0800 | [diff] [blame] | 750 |               // no range check, AudioFlinger::mLock held | 
 | 751 |               bool streamMute_l(audio_stream_type_t stream) const | 
 | 752 |                                 { return mStreamTypes[stream].mute; } | 
| Eric Laurent | 73e26b6 | 2015-04-27 16:55:58 -0700 | [diff] [blame] | 753 |               void ioConfigChanged(audio_io_config_event event, | 
| Eric Laurent | 7c1ec5f | 2015-07-09 14:52:47 -0700 | [diff] [blame] | 754 |                                    const sp<AudioIoDescriptor>& ioDesc, | 
 | 755 |                                    pid_t pid = 0); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 756 |  | 
| Glenn Kasten | eeecb98 | 2016-02-26 10:44:04 -0800 | [diff] [blame] | 757 |               // Allocate an audio_unique_id_t. | 
 | 758 |               // Specific types are audio_io_handle_t, audio_session_t, effect ID (int), | 
 | 759 |               // audio_module_handle_t, and audio_patch_handle_t. | 
| Glenn Kasten | bcefec3 | 2014-01-17 12:09:05 -0800 | [diff] [blame] | 760 |               // They all share the same ID space, but the namespaces are actually independent | 
 | 761 |               // because there are separate KeyedVectors for each kind of ID. | 
| Glenn Kasten | eeecb98 | 2016-02-26 10:44:04 -0800 | [diff] [blame] | 762 |               // The return value is cast to the specific type depending on how the ID will be used. | 
| Glenn Kasten | bcefec3 | 2014-01-17 12:09:05 -0800 | [diff] [blame] | 763 |               // FIXME This API does not handle rollover to zero (for unsigned IDs), | 
 | 764 |               //       or from positive to negative (for signed IDs). | 
 | 765 |               //       Thus it may fail by returning an ID of the wrong sign, | 
 | 766 |               //       or by returning a non-unique ID. | 
| Glenn Kasten | 9d00313 | 2016-04-06 14:38:09 -0700 | [diff] [blame] | 767 |               // This is the internal API.  For the binder API see newAudioUniqueId(). | 
| Glenn Kasten | eeecb98 | 2016-02-26 10:44:04 -0800 | [diff] [blame] | 768 |               audio_unique_id_t nextUniqueId(audio_unique_id_use_t use); | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 769 |  | 
| Glenn Kasten | d848eb4 | 2016-03-08 13:42:11 -0800 | [diff] [blame] | 770 |               status_t moveEffectChain_l(audio_session_t sessionId, | 
| Glenn Kasten | a111792 | 2012-01-26 10:53:32 -0800 | [diff] [blame] | 771 |                                      PlaybackThread *srcThread, | 
| Eric Laurent | 6c79632 | 2019-04-09 14:13:17 -0700 | [diff] [blame] | 772 |                                      PlaybackThread *dstThread); | 
 | 773 |  | 
 | 774 |               status_t moveAuxEffectToIo(int EffectId, | 
 | 775 |                                          const sp<PlaybackThread>& dstThread, | 
 | 776 |                                          sp<PlaybackThread> *srcThread); | 
| Glenn Kasten | 7fd0422 | 2016-02-02 12:38:16 -0800 | [diff] [blame] | 777 |  | 
| Glenn Kasten | 02fe1bf | 2012-02-24 15:42:17 -0800 | [diff] [blame] | 778 |               // return thread associated with primary hardware device, or NULL | 
 | 779 |               PlaybackThread *primaryPlaybackThread_l() const; | 
| jiabin | c52b1ff | 2019-10-31 17:20:42 -0700 | [diff] [blame] | 780 |               DeviceTypeSet primaryOutputDevice_l() const; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 781 |  | 
| Glenn Kasten | a733563 | 2016-06-09 17:09:53 -0700 | [diff] [blame] | 782 |               // return the playback thread with smallest HAL buffer size, and prefer fast | 
 | 783 |               PlaybackThread *fastPlaybackThread_l() const; | 
 | 784 |  | 
| Eric Laurent | b20cf7d | 2019-04-05 19:37:34 -0700 | [diff] [blame] | 785 |               sp<ThreadBase> getEffectThread_l(audio_session_t sessionId, int effectId); | 
| Eric Laurent | 717e128 | 2012-06-29 16:36:52 -0700 | [diff] [blame] | 786 |  | 
| jiabin | eb3bda0 | 2020-06-30 14:07:03 -0700 | [diff] [blame] | 787 |               ThreadBase *hapticPlaybackThread_l() const; | 
 | 788 |  | 
| jiabin | f042b9b | 2021-05-07 23:46:28 +0000 | [diff] [blame] | 789 |               void updateSecondaryOutputsForTrack_l( | 
 | 790 |                       PlaybackThread::Track* track, | 
 | 791 |                       PlaybackThread* thread, | 
 | 792 |                       const std::vector<audio_io_handle_t>& secondaryOutputs) const; | 
 | 793 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 794 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 795 |                 void        removeClient_l(pid_t pid); | 
 | 796 |                 void        removeNotificationClient(pid_t pid); | 
| Eric Laurent | 5baf2af | 2013-09-12 17:37:00 -0700 | [diff] [blame] | 797 |                 bool isNonOffloadableGlobalEffectEnabled_l(); | 
 | 798 |                 void onNonOffloadableGlobalEffectEnable(); | 
| Eric Laurent | 0d5a2ed | 2016-12-01 15:28:29 -0800 | [diff] [blame] | 799 |                 bool isSessionAcquired_l(audio_session_t audioSession); | 
| Eric Laurent | 813e2a7 | 2013-08-31 12:59:48 -0700 | [diff] [blame] | 800 |  | 
| Eric Laurent | aaa4447 | 2014-09-12 17:41:50 -0700 | [diff] [blame] | 801 |                 // Store an effect chain to mOrphanEffectChains keyed vector. | 
 | 802 |                 // Called when a thread exits and effects are still attached to it. | 
 | 803 |                 // If effects are later created on the same session, they will reuse the same | 
 | 804 |                 // effect chain and same instances in the effect library. | 
 | 805 |                 // return ALREADY_EXISTS if a chain with the same session already exists in | 
 | 806 |                 // mOrphanEffectChains. Note that this should never happen as there is only one | 
 | 807 |                 // chain for a given session and it is attached to only one thread at a time. | 
 | 808 |                 status_t        putOrphanEffectChain_l(const sp<EffectChain>& chain); | 
 | 809 |                 // Get an effect chain for the specified session in mOrphanEffectChains and remove | 
 | 810 |                 // it if found. Returns 0 if not found (this is the most common case). | 
 | 811 |                 sp<EffectChain> getOrphanEffectChain_l(audio_session_t session); | 
 | 812 |                 // Called when the last effect handle on an effect instance is removed. If this | 
 | 813 |                 // effect belongs to an effect chain in mOrphanEffectChains, the chain is updated | 
 | 814 |                 // and removed from mOrphanEffectChains if it does not contain any effect. | 
 | 815 |                 // Return true if the effect was found in mOrphanEffectChains, false otherwise. | 
 | 816 |                 bool            updateOrphanEffectChains(const sp<EffectModule>& effect); | 
 | 817 |  | 
| Eric Laurent | 6c79632 | 2019-04-09 14:13:17 -0700 | [diff] [blame] | 818 |                 std::vector< sp<EffectModule> > purgeStaleEffects_l(); | 
 | 819 |  | 
| Andy Hung | d9ef4b1 | 2020-11-11 15:13:18 -0800 | [diff] [blame] | 820 |                 void broadcastParametersToRecordThreads_l(const String8& keyValuePairs); | 
| jiabin | c52b1ff | 2019-10-31 17:20:42 -0700 | [diff] [blame] | 821 |                 void updateOutDevicesForRecordThreads_l(const DeviceDescriptorBaseVector& devices); | 
| Mikhail Naganov | b261ef5 | 2018-07-16 13:34:38 -0700 | [diff] [blame] | 822 |                 void forwardParametersToDownstreamPatches_l( | 
 | 823 |                         audio_io_handle_t upStream, const String8& keyValuePairs, | 
 | 824 |                         std::function<bool(const sp<PlaybackThread>&)> useThread = nullptr); | 
| John Grossman | ee578c0 | 2012-07-23 17:05:46 -0700 | [diff] [blame] | 825 |  | 
| Phil Burk | 062e67a | 2015-02-11 13:40:50 -0800 | [diff] [blame] | 826 |     // AudioStreamIn is immutable, so their fields are const. | 
| Glenn Kasten | aed850d | 2012-01-26 09:46:34 -0800 | [diff] [blame] | 827 |     // For emphasis, we could also make all pointers to them be "const *", | 
 | 828 |     // but that would clutter the code unnecessarily. | 
 | 829 |  | 
| Mikhail Naganov | 2534b38 | 2019-09-25 13:05:02 -0700 | [diff] [blame] | 830 |     struct AudioStreamIn : public Source { | 
| John Grossman | ee578c0 | 2012-07-23 17:05:46 -0700 | [diff] [blame] | 831 |         AudioHwDevice* const audioHwDev; | 
| Mikhail Naganov | 1dc9867 | 2016-08-18 17:50:29 -0700 | [diff] [blame] | 832 |         sp<StreamInHalInterface> stream; | 
| Eric Laurent | 0506778 | 2016-06-01 18:27:28 -0700 | [diff] [blame] | 833 |         audio_input_flags_t flags; | 
| Dima Zavin | 799a70e | 2011-04-18 16:57:27 -0700 | [diff] [blame] | 834 |  | 
| Mikhail Naganov | e4f1f63 | 2016-08-31 11:35:10 -0700 | [diff] [blame] | 835 |         sp<DeviceHalInterface> hwDev() const { return audioHwDev->hwDevice(); } | 
| John Grossman | ee578c0 | 2012-07-23 17:05:46 -0700 | [diff] [blame] | 836 |  | 
| Mikhail Naganov | 1dc9867 | 2016-08-18 17:50:29 -0700 | [diff] [blame] | 837 |         AudioStreamIn(AudioHwDevice *dev, sp<StreamInHalInterface> in, audio_input_flags_t flags) : | 
| Eric Laurent | 0506778 | 2016-06-01 18:27:28 -0700 | [diff] [blame] | 838 |             audioHwDev(dev), stream(in), flags(flags) {} | 
| Mikhail Naganov | 2534b38 | 2019-09-25 13:05:02 -0700 | [diff] [blame] | 839 |         status_t read(void *buffer, size_t bytes, size_t *read) override { | 
 | 840 |             return stream->read(buffer, bytes, read); | 
 | 841 |         } | 
 | 842 |         status_t getCapturePosition(int64_t *frames, int64_t *time) override { | 
 | 843 |             return stream->getCapturePosition(frames, time); | 
 | 844 |         } | 
 | 845 |         status_t standby() override { return stream->standby(); } | 
| Dima Zavin | 799a70e | 2011-04-18 16:57:27 -0700 | [diff] [blame] | 846 |     }; | 
 | 847 |  | 
| Kevin Rocard | 153f92d | 2018-12-18 18:33:28 -0800 | [diff] [blame] | 848 |     struct TeePatch { | 
 | 849 |         sp<RecordThread::PatchRecord> patchRecord; | 
 | 850 |         sp<PlaybackThread::PatchTrack> patchTrack; | 
 | 851 |     }; | 
 | 852 |  | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 853 |     // for mAudioSessionRefs only | 
| Marco Nelissen | 3a34bef | 2011-08-02 13:33:41 -0700 | [diff] [blame] | 854 |     struct AudioSessionRef { | 
| Andy Hung | 8b0bfd9 | 2019-12-23 13:11:11 -0800 | [diff] [blame] | 855 |         AudioSessionRef(audio_session_t sessionid, pid_t pid, uid_t uid) : | 
 | 856 |             mSessionid(sessionid), mPid(pid), mUid(uid), mCnt(1) {} | 
| Glenn Kasten | d848eb4 | 2016-03-08 13:42:11 -0800 | [diff] [blame] | 857 |         const audio_session_t mSessionid; | 
| Glenn Kasten | 012ca6b | 2012-03-06 11:22:01 -0800 | [diff] [blame] | 858 |         const pid_t mPid; | 
| Andy Hung | 8b0bfd9 | 2019-12-23 13:11:11 -0800 | [diff] [blame] | 859 |         const uid_t mUid; | 
| Glenn Kasten | 012ca6b | 2012-03-06 11:22:01 -0800 | [diff] [blame] | 860 |         int         mCnt; | 
| Marco Nelissen | 3a34bef | 2011-08-02 13:33:41 -0700 | [diff] [blame] | 861 |     }; | 
 | 862 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 863 |     mutable     Mutex                               mLock; | 
| Eric Laurent | 021cf96 | 2014-05-13 10:18:14 -0700 | [diff] [blame] | 864 |                 // protects mClients and mNotificationClients. | 
 | 865 |                 // must be locked after mLock and ThreadBase::mLock if both must be locked | 
 | 866 |                 // avoids acquiring AudioFlinger::mLock from inside thread loop. | 
 | 867 |     mutable     Mutex                               mClientLock; | 
 | 868 |                 // protected by mClientLock | 
| Glenn Kasten | 98ec94c | 2012-01-25 14:28:29 -0800 | [diff] [blame] | 869 |                 DefaultKeyedVector< pid_t, wp<Client> >     mClients;   // see ~Client() | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 870 |  | 
 | 871 |                 mutable     Mutex                   mHardwareLock; | 
| Eric Laurent | a4c5a55 | 2012-03-29 10:12:40 -0700 | [diff] [blame] | 872 |                 // NOTE: If both mLock and mHardwareLock mutexes must be held, | 
 | 873 |                 // always take mLock before mHardwareLock | 
| Glenn Kasten | 2b213bc | 2012-02-02 14:05:20 -0800 | [diff] [blame] | 874 |  | 
| Eric Laurent | 00abf0d | 2020-04-22 19:28:22 -0700 | [diff] [blame] | 875 |                 // guarded by mHardwareLock | 
 | 876 |                 AudioHwDevice* mPrimaryHardwareDev; | 
| Eric Laurent | a4c5a55 | 2012-03-29 10:12:40 -0700 | [diff] [blame] | 877 |                 DefaultKeyedVector<audio_module_handle_t, AudioHwDevice*>  mAudioHwDevs; | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 878 |  | 
| Eric Laurent | 00abf0d | 2020-04-22 19:28:22 -0700 | [diff] [blame] | 879 |                 // These two fields are immutable after onFirstRef(), so no lock needed to access | 
| Mikhail Naganov | e4f1f63 | 2016-08-31 11:35:10 -0700 | [diff] [blame] | 880 |                 sp<DevicesFactoryHalInterface> mDevicesFactoryHal; | 
| Mikhail Naganov | 88b30d2 | 2020-03-09 19:43:13 +0000 | [diff] [blame] | 881 |                 sp<DevicesFactoryHalCallback> mDevicesFactoryHalCallback; | 
| Mikhail Naganov | e4f1f63 | 2016-08-31 11:35:10 -0700 | [diff] [blame] | 882 |  | 
| Glenn Kasten | 8abf44d | 2012-02-02 14:16:03 -0800 | [diff] [blame] | 883 |     // 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] | 884 |     enum hardware_call_state { | 
| Glenn Kasten | 8abf44d | 2012-02-02 14:16:03 -0800 | [diff] [blame] | 885 |         AUDIO_HW_IDLE = 0,              // no operation in progress | 
 | 886 |         AUDIO_HW_INIT,                  // init_check | 
 | 887 |         AUDIO_HW_OUTPUT_OPEN,           // open_output_stream | 
 | 888 |         AUDIO_HW_OUTPUT_CLOSE,          // unused | 
 | 889 |         AUDIO_HW_INPUT_OPEN,            // unused | 
 | 890 |         AUDIO_HW_INPUT_CLOSE,           // unused | 
 | 891 |         AUDIO_HW_STANDBY,               // unused | 
 | 892 |         AUDIO_HW_SET_MASTER_VOLUME,     // set_master_volume | 
 | 893 |         AUDIO_HW_GET_ROUTING,           // unused | 
 | 894 |         AUDIO_HW_SET_ROUTING,           // unused | 
 | 895 |         AUDIO_HW_GET_MODE,              // unused | 
 | 896 |         AUDIO_HW_SET_MODE,              // set_mode | 
 | 897 |         AUDIO_HW_GET_MIC_MUTE,          // get_mic_mute | 
 | 898 |         AUDIO_HW_SET_MIC_MUTE,          // set_mic_mute | 
 | 899 |         AUDIO_HW_SET_VOICE_VOLUME,      // set_voice_volume | 
 | 900 |         AUDIO_HW_SET_PARAMETER,         // set_parameters | 
 | 901 |         AUDIO_HW_GET_INPUT_BUFFER_SIZE, // get_input_buffer_size | 
 | 902 |         AUDIO_HW_GET_MASTER_VOLUME,     // get_master_volume | 
 | 903 |         AUDIO_HW_GET_PARAMETER,         // get_parameters | 
| John Grossman | d8f178d | 2012-07-20 14:51:35 -0700 | [diff] [blame] | 904 |         AUDIO_HW_SET_MASTER_MUTE,       // set_master_mute | 
 | 905 |         AUDIO_HW_GET_MASTER_MUTE,       // get_master_mute | 
| Eric Laurent | 00abf0d | 2020-04-22 19:28:22 -0700 | [diff] [blame] | 906 |         AUDIO_HW_GET_MICROPHONES,       // getMicrophones | 
| Glenn Kasten | 2f732eb | 2012-01-26 09:48:03 -0800 | [diff] [blame] | 907 |     }; | 
 | 908 |  | 
| Glenn Kasten | a4454b4 | 2012-01-04 11:02:33 -0800 | [diff] [blame] | 909 |     mutable     hardware_call_state                 mHardwareStatus;    // for dump only | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 910 |  | 
 | 911 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 912 |                 DefaultKeyedVector< audio_io_handle_t, sp<PlaybackThread> >  mPlaybackThreads; | 
| Glenn Kasten | b7bf796 | 2012-02-08 12:36:25 -0800 | [diff] [blame] | 913 |                 stream_type_t                       mStreamTypes[AUDIO_STREAM_CNT]; | 
| Glenn Kasten | 9806710 | 2011-12-13 11:47:54 -0800 | [diff] [blame] | 914 |  | 
| Glenn Kasten | c3ae93f | 2012-07-30 10:59:30 -0700 | [diff] [blame] | 915 |                 // member variables below are protected by mLock | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 916 |                 float                               mMasterVolume; | 
 | 917 |                 bool                                mMasterMute; | 
| Richard Folke Tullberg | 3fae037 | 2017-01-13 09:04:25 +0100 | [diff] [blame] | 918 |                 float                               mMasterBalance = 0.f; | 
| Glenn Kasten | c3ae93f | 2012-07-30 10:59:30 -0700 | [diff] [blame] | 919 |                 // end of variables protected by mLock | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 920 |  | 
| Glenn Kasten | 72ef00d | 2012-01-17 11:09:42 -0800 | [diff] [blame] | 921 |                 DefaultKeyedVector< audio_io_handle_t, sp<RecordThread> >    mRecordThreads; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 922 |  | 
| Eric Laurent | 021cf96 | 2014-05-13 10:18:14 -0700 | [diff] [blame] | 923 |                 // protected by mClientLock | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 924 |                 DefaultKeyedVector< pid_t, sp<NotificationClient> >    mNotificationClients; | 
| Glenn Kasten | bcefec3 | 2014-01-17 12:09:05 -0800 | [diff] [blame] | 925 |  | 
| Glenn Kasten | d2e67e1 | 2016-04-11 08:26:37 -0700 | [diff] [blame] | 926 |                 // updated by atomic_fetch_add_explicit | 
 | 927 |                 volatile atomic_uint_fast32_t       mNextUniqueIds[AUDIO_UNIQUE_ID_USE_MAX]; | 
| Glenn Kasten | bcefec3 | 2014-01-17 12:09:05 -0800 | [diff] [blame] | 928 |  | 
| Glenn Kasten | f78aee7 | 2012-01-04 11:00:47 -0800 | [diff] [blame] | 929 |                 audio_mode_t                        mMode; | 
| Eric Laurent | d8365c5 | 2017-07-16 15:27:05 -0700 | [diff] [blame] | 930 |                 std::atomic_bool                    mBtNrecIsOff; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 931 |  | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 932 |                 // protected by mLock | 
| Marco Nelissen | 3a34bef | 2011-08-02 13:33:41 -0700 | [diff] [blame] | 933 |                 Vector<AudioSessionRef*> mAudioSessionRefs; | 
| Glenn Kasten | 9806710 | 2011-12-13 11:47:54 -0800 | [diff] [blame] | 934 |  | 
| John Grossman | 4ff14ba | 2012-02-08 16:37:41 -0800 | [diff] [blame] | 935 |                 float       masterVolume_l() const; | 
| Richard Folke Tullberg | 3fae037 | 2017-01-13 09:04:25 +0100 | [diff] [blame] | 936 |                 float       getMasterBalance_l() const; | 
| John Grossman | d8f178d | 2012-07-20 14:51:35 -0700 | [diff] [blame] | 937 |                 bool        masterMute_l() const; | 
| Eric Laurent | a4c5a55 | 2012-03-29 10:12:40 -0700 | [diff] [blame] | 938 |                 audio_module_handle_t loadHwModule_l(const char *name); | 
| Glenn Kasten | 98ec94c | 2012-01-25 14:28:29 -0800 | [diff] [blame] | 939 |  | 
| Eric Laurent | a011e35 | 2012-03-29 15:51:43 -0700 | [diff] [blame] | 940 |                 Vector < sp<SyncEvent> > mPendingSyncEvents; // sync events awaiting for a session | 
 | 941 |                                                              // to be created | 
 | 942 |  | 
| Eric Laurent | aaa4447 | 2014-09-12 17:41:50 -0700 | [diff] [blame] | 943 |                 // Effect chains without a valid thread | 
 | 944 |                 DefaultKeyedVector< audio_session_t , sp<EffectChain> > mOrphanEffectChains; | 
 | 945 |  | 
| Eric Laurent | fa90e84 | 2014-10-17 18:12:31 -0700 | [diff] [blame] | 946 |                 // list of sessions for which a valid HW A/V sync ID was retrieved from the HAL | 
 | 947 |                 DefaultKeyedVector< audio_session_t , audio_hw_sync_t >mHwAvSyncIds; | 
| Eric Laurent | 6acd1d4 | 2017-01-04 14:23:29 -0800 | [diff] [blame] | 948 |  | 
 | 949 |                 // list of MMAP stream control threads. Those threads allow for wake lock, routing | 
 | 950 |                 // and volume control for activity on the associated MMAP stream at the HAL. | 
 | 951 |                 // Audio data transfer is directly handled by the client creating the MMAP stream | 
 | 952 |                 DefaultKeyedVector< audio_io_handle_t, sp<MmapThread> >  mMmapThreads; | 
 | 953 |  | 
| Glenn Kasten | 98ec94c | 2012-01-25 14:28:29 -0800 | [diff] [blame] | 954 | private: | 
| Eric Laurent | 021cf96 | 2014-05-13 10:18:14 -0700 | [diff] [blame] | 955 |     sp<Client>  registerPid(pid_t pid);    // always returns non-0 | 
| Glenn Kasten | 98ec94c | 2012-01-25 14:28:29 -0800 | [diff] [blame] | 956 |  | 
| Glenn Kasten | d96c572 | 2012-04-25 13:44:49 -0700 | [diff] [blame] | 957 |     // for use from destructor | 
 | 958 |     status_t    closeOutput_nonvirtual(audio_io_handle_t output); | 
| Mikhail Naganov | 444ecc3 | 2018-05-01 17:40:05 -0700 | [diff] [blame] | 959 |     void        closeThreadInternal_l(const sp<PlaybackThread>& thread); | 
| Glenn Kasten | d96c572 | 2012-04-25 13:44:49 -0700 | [diff] [blame] | 960 |     status_t    closeInput_nonvirtual(audio_io_handle_t input); | 
| Mikhail Naganov | 444ecc3 | 2018-05-01 17:40:05 -0700 | [diff] [blame] | 961 |     void        closeThreadInternal_l(const sp<RecordThread>& thread); | 
| Eric Laurent | fa90e84 | 2014-10-17 18:12:31 -0700 | [diff] [blame] | 962 |     void        setAudioHwSyncForSession_l(PlaybackThread *thread, audio_session_t sessionId); | 
| Glenn Kasten | d06785b | 2012-09-30 12:29:28 -0700 | [diff] [blame] | 963 |  | 
| Eric Laurent | 223fd5c | 2014-11-11 13:43:36 -0800 | [diff] [blame] | 964 |     status_t    checkStreamType(audio_stream_type_t stream) const; | 
 | 965 |  | 
| Eric Laurent | f1047e8 | 2018-04-16 19:18:20 -0700 | [diff] [blame] | 966 |     void        filterReservedParameters(String8& keyValuePairs, uid_t callingUid); | 
| Kevin Rocard | a0a5d2a | 2018-08-06 15:03:18 -0700 | [diff] [blame] | 967 |     void        logFilteredParameters(size_t originalKVPSize, const String8& originalKVPs, | 
 | 968 |                                       size_t rejectedKVPSize, const String8& rejectedKVPs, | 
 | 969 |                                       uid_t callingUid); | 
| Eric Laurent | f1047e8 | 2018-04-16 19:18:20 -0700 | [diff] [blame] | 970 |  | 
| Glenn Kasten | d06785b | 2012-09-30 12:29:28 -0700 | [diff] [blame] | 971 | public: | 
| Andy Hung | 6f248bb | 2018-01-23 14:04:37 -0800 | [diff] [blame] | 972 |     // These methods read variables atomically without mLock, | 
 | 973 |     // though the variables are updated with mLock. | 
| Glenn Kasten | 4182c4e | 2013-07-15 14:45:07 -0700 | [diff] [blame] | 974 |     bool    isLowRamDevice() const { return mIsLowRamDevice; } | 
| Andy Hung | 6f248bb | 2018-01-23 14:04:37 -0800 | [diff] [blame] | 975 |     size_t getClientSharedHeapSize() const; | 
| Glenn Kasten | 4182c4e | 2013-07-15 14:45:07 -0700 | [diff] [blame] | 976 |  | 
 | 977 | private: | 
| Andy Hung | 6f248bb | 2018-01-23 14:04:37 -0800 | [diff] [blame] | 978 |     std::atomic<bool> mIsLowRamDevice; | 
| Glenn Kasten | 4182c4e | 2013-07-15 14:45:07 -0700 | [diff] [blame] | 979 |     bool    mIsDeviceTypeKnown; | 
| Andy Hung | 6f248bb | 2018-01-23 14:04:37 -0800 | [diff] [blame] | 980 |     int64_t mTotalMemory; | 
 | 981 |     std::atomic<size_t> mClientSharedHeapSize; | 
 | 982 |     static constexpr size_t kMinimumClientSharedHeapSizeBytes = 1024 * 1024; // 1MB | 
 | 983 |  | 
| Eric Laurent | 813e2a7 | 2013-08-31 12:59:48 -0700 | [diff] [blame] | 984 |     nsecs_t mGlobalEffectEnableTime;  // when a global effect was last enabled | 
| Eric Laurent | 1c333e2 | 2014-05-20 10:48:17 -0700 | [diff] [blame] | 985 |  | 
| Mikhail Naganov | dea5304 | 2018-04-26 13:10:21 -0700 | [diff] [blame] | 986 |     // protected by mLock | 
 | 987 |     PatchPanel mPatchPanel; | 
| Mikhail Naganov | 4a3d5c2 | 2016-08-15 13:47:42 -0700 | [diff] [blame] | 988 |     sp<EffectsFactoryHalInterface> mEffectsFactoryHal; | 
| Glenn Kasten | 4ea00a2 | 2014-06-02 08:29:22 -0700 | [diff] [blame] | 989 |  | 
| Eric Laurent | b82e6b7 | 2019-11-22 17:25:04 -0800 | [diff] [blame] | 990 |     DeviceEffectManager mDeviceEffectManager; | 
 | 991 |  | 
| Kevin Rocard | a0a5d2a | 2018-08-06 15:03:18 -0700 | [diff] [blame] | 992 |     bool       mSystemReady; | 
| Eric Laurent | d66d7a1 | 2021-07-13 13:35:32 +0200 | [diff] [blame] | 993 |     std::atomic_bool mAudioPolicyReady{}; | 
| Kevin Rocard | a0a5d2a | 2018-08-06 15:03:18 -0700 | [diff] [blame] | 994 |  | 
| Andy Hung | 5bdc535 | 2019-12-23 14:36:31 -0800 | [diff] [blame] | 995 |     mediautils::UidInfo mUidInfo; | 
 | 996 |  | 
| Kevin Rocard | a0a5d2a | 2018-08-06 15:03:18 -0700 | [diff] [blame] | 997 |     SimpleLog  mRejectedSetParameterLog; | 
 | 998 |     SimpleLog  mAppSetParameterLog; | 
 | 999 |     SimpleLog  mSystemSetParameterLog; | 
| Andy Hung | b68f5eb | 2019-12-03 16:49:17 -0800 | [diff] [blame] | 1000 |  | 
| jiabin | 1319f5a | 2021-03-30 22:21:24 +0000 | [diff] [blame] | 1001 |     std::vector<media::AudioVibratorInfo> mAudioVibratorInfos; | 
 | 1002 |  | 
| Andy Hung | b68f5eb | 2019-12-03 16:49:17 -0800 | [diff] [blame] | 1003 |     static inline constexpr const char *mMetricsId = AMEDIAMETRICS_KEY_AUDIO_FLINGER; | 
| Eric Laurent | ec376dc | 2021-04-08 20:41:22 +0200 | [diff] [blame] | 1004 |  | 
 | 1005 |     // Keep in sync with java definition in media/java/android/media/AudioRecord.java | 
 | 1006 |     static constexpr int32_t kMaxSharedAudioHistoryMs = 5000; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 1007 | }; | 
 | 1008 |  | 
| Eric Laurent | 81784c3 | 2012-11-19 14:55:58 -0800 | [diff] [blame] | 1009 | #undef INCLUDING_FROM_AUDIOFLINGER_H | 
| Dima Zavin | 799a70e | 2011-04-18 16:57:27 -0700 | [diff] [blame] | 1010 |  | 
| Mikhail Naganov | 913d06c | 2016-11-01 12:49:22 -0700 | [diff] [blame] | 1011 | std::string formatToString(audio_format_t format); | 
 | 1012 | std::string inputFlagsToString(audio_input_flags_t flags); | 
 | 1013 | std::string outputFlagsToString(audio_output_flags_t flags); | 
 | 1014 | std::string devicesToString(audio_devices_t devices); | 
| Glenn Kasten | 0f5b562 | 2015-02-18 14:33:30 -0800 | [diff] [blame] | 1015 | const char *sourceToString(audio_source_t source); | 
| Marco Nelissen | b220884 | 2014-02-07 14:00:50 -0800 | [diff] [blame] | 1016 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 1017 | // ---------------------------------------------------------------------------- | 
 | 1018 |  | 
| Glenn Kasten | 63238ef | 2015-03-02 15:50:29 -0800 | [diff] [blame] | 1019 | } // namespace android | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 1020 |  | 
 | 1021 | #endif // ANDROID_AUDIO_FLINGER_H |