blob: 08f307d5a7de159cc33395a32f9f0f268369a892 [file] [log] [blame]
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001/*
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08002**
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#define LOG_TAG "IAudioFlinger"
Eric Laurentc2f1f072009-07-17 12:17:14 -070019//#define LOG_NDEBUG 0
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080020#include <utils/Log.h>
21
22#include <stdint.h>
23#include <sys/types.h>
24
Eric Laurentb1cc36b2017-12-11 12:14:16 -080025#include <binder/IPCThreadState.h>
Mathias Agopian75624082009-05-19 19:08:10 -070026#include <binder/Parcel.h>
Eric Laurent2a451152020-10-07 13:48:21 -070027#include <media/AudioSanitizer.h>
Andy Hung4ef19fa2018-05-15 19:35:29 -070028#include <mediautils/ServiceUtilities.h>
Marco Nelissen3230ed82019-09-26 11:20:54 -070029#include <mediautils/TimeCheck.h>
Steven Moreland25a9e552017-04-17 14:30:39 -070030#include "IAudioFlinger.h"
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080031
32namespace android {
33
34enum {
35 CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,
Eric Laurentf14db3c2017-12-08 14:20:36 -080036 CREATE_RECORD,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080037 SAMPLE_RATE,
Glenn Kasten5876f2f2012-11-30 10:52:16 -080038 RESERVED, // obsolete, was CHANNEL_COUNT
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080039 FORMAT,
40 FRAME_COUNT,
41 LATENCY,
42 SET_MASTER_VOLUME,
43 SET_MASTER_MUTE,
44 MASTER_VOLUME,
45 MASTER_MUTE,
46 SET_STREAM_VOLUME,
47 SET_STREAM_MUTE,
48 STREAM_VOLUME,
49 STREAM_MUTE,
50 SET_MODE,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080051 SET_MIC_MUTE,
52 GET_MIC_MUTE,
Svet Ganovf4ddfef2018-01-16 07:37:58 -080053 SET_RECORD_SILENCED,
Eric Laurentc2f1f072009-07-17 12:17:14 -070054 SET_PARAMETERS,
55 GET_PARAMETERS,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080056 REGISTER_CLIENT,
57 GET_INPUTBUFFERSIZE,
Eric Laurentc2f1f072009-07-17 12:17:14 -070058 OPEN_OUTPUT,
59 OPEN_DUPLICATE_OUTPUT,
60 CLOSE_OUTPUT,
61 SUSPEND_OUTPUT,
62 RESTORE_OUTPUT,
63 OPEN_INPUT,
64 CLOSE_INPUT,
Glenn Kastend2304db2014-02-03 07:40:31 -080065 INVALIDATE_STREAM,
Eric Laurent342e9cf2010-01-19 17:37:09 -080066 SET_VOICE_VOLUME,
Eric Laurent05bca2f2010-02-26 02:47:27 -080067 GET_RENDER_POSITION,
Eric Laurentbe916aa2010-06-01 23:49:17 -070068 GET_INPUT_FRAMES_LOST,
Glenn Kasten9eae0362016-04-19 09:09:14 -070069 NEW_AUDIO_UNIQUE_ID,
Marco Nelissen3a34bef2011-08-02 13:33:41 -070070 ACQUIRE_AUDIO_SESSION_ID,
71 RELEASE_AUDIO_SESSION_ID,
Eric Laurentbe916aa2010-06-01 23:49:17 -070072 QUERY_NUM_EFFECTS,
Eric Laurentffe9c252010-06-23 17:38:20 -070073 QUERY_EFFECT,
Eric Laurentbe916aa2010-06-01 23:49:17 -070074 GET_EFFECT_DESCRIPTOR,
Eric Laurentde070132010-07-13 04:45:46 -070075 CREATE_EFFECT,
Eric Laurenta4c5a552012-03-29 10:12:40 -070076 MOVE_EFFECTS,
Glenn Kastencc0f1cf2012-09-24 11:27:18 -070077 LOAD_HW_MODULE,
78 GET_PRIMARY_OUTPUT_SAMPLING_RATE,
79 GET_PRIMARY_OUTPUT_FRAME_COUNT,
Glenn Kasten4182c4e2013-07-15 14:45:07 -070080 SET_LOW_RAM_DEVICE,
Eric Laurent4b123402014-04-11 09:22:20 -070081 LIST_AUDIO_PORTS,
82 GET_AUDIO_PORT,
83 CREATE_AUDIO_PATCH,
84 RELEASE_AUDIO_PATCH,
85 LIST_AUDIO_PATCHES,
Eric Laurent93c3d412014-08-01 14:48:35 -070086 SET_AUDIO_PORT_CONFIG,
Glenn Kasten9eae0362016-04-19 09:09:14 -070087 GET_AUDIO_HW_SYNC_FOR_SESSION,
Glenn Kasten4a8308b2016-04-18 14:10:01 -070088 SYSTEM_READY,
89 FRAME_COUNT_HAL,
jiabin9ff780e2018-03-19 18:19:52 -070090 GET_MICROPHONES,
Richard Folke Tullberg3fae0372017-01-13 09:04:25 +010091 SET_MASTER_BALANCE,
92 GET_MASTER_BALANCE,
Eric Laurentb20cf7d2019-04-05 19:37:34 -070093 SET_EFFECT_SUSPENDED,
Eric Laurentb680e952019-09-27 15:40:33 -070094 SET_AUDIO_HAL_PIDS
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080095};
96
Eric Laurentf75c2fe2015-04-02 13:49:15 -070097#define MAX_ITEMS_PER_LIST 1024
98
Eric Laurentb680e952019-09-27 15:40:33 -070099
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800100class BpAudioFlinger : public BpInterface<IAudioFlinger>
101{
102public:
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -0700103 explicit BpAudioFlinger(const sp<IBinder>& impl)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800104 : BpInterface<IAudioFlinger>(impl)
105 {
106 }
107
Eric Laurent21da6472017-11-09 16:29:26 -0800108 virtual sp<IAudioTrack> createTrack(const CreateTrackInput& input,
109 CreateTrackOutput& output,
110 status_t *status)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800111 {
112 Parcel data, reply;
Eric Laurent5841db72009-09-09 05:16:08 -0700113 sp<IAudioTrack> track;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800114 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurent21da6472017-11-09 16:29:26 -0800115
116 if (status == nullptr) {
117 return track;
Eric Laurent3d00aa62013-09-24 09:53:27 -0700118 }
Eric Laurent21da6472017-11-09 16:29:26 -0800119
120 input.writeToParcel(&data);
121
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800122 status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
123 if (lStatus != NO_ERROR) {
Eric Laurent21da6472017-11-09 16:29:26 -0800124 ALOGE("createTrack transaction error %d", lStatus);
125 *status = DEAD_OBJECT;
126 return track;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800127 }
Eric Laurent21da6472017-11-09 16:29:26 -0800128 *status = reply.readInt32();
129 if (*status != NO_ERROR) {
130 ALOGE("createTrack returned error %d", *status);
131 return track;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800132 }
Eric Laurent21da6472017-11-09 16:29:26 -0800133 track = interface_cast<IAudioTrack>(reply.readStrongBinder());
134 if (track == 0) {
135 ALOGE("createTrack returned an NULL IAudioTrack with status OK");
136 *status = DEAD_OBJECT;
137 return track;
138 }
139 output.readFromParcel(&reply);
Eric Laurent5841db72009-09-09 05:16:08 -0700140 return track;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800141 }
142
Eric Laurentf14db3c2017-12-08 14:20:36 -0800143 virtual sp<media::IAudioRecord> createRecord(const CreateRecordInput& input,
144 CreateRecordOutput& output,
145 status_t *status)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800146 {
147 Parcel data, reply;
Ivan Lozanoff6900d2017-08-01 15:47:38 -0700148 sp<media::IAudioRecord> record;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800149 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentf14db3c2017-12-08 14:20:36 -0800150
151 if (status == nullptr) {
152 return record;
Eric Laurentbe916aa2010-06-01 23:49:17 -0700153 }
Eric Laurentf14db3c2017-12-08 14:20:36 -0800154
155 input.writeToParcel(&data);
156
157 status_t lStatus = remote()->transact(CREATE_RECORD, data, &reply);
Eric Laurent5841db72009-09-09 05:16:08 -0700158 if (lStatus != NO_ERROR) {
Eric Laurentf14db3c2017-12-08 14:20:36 -0800159 ALOGE("createRecord transaction error %d", lStatus);
160 *status = DEAD_OBJECT;
161 return record;
Eric Laurent5841db72009-09-09 05:16:08 -0700162 }
Eric Laurentf14db3c2017-12-08 14:20:36 -0800163 *status = reply.readInt32();
164 if (*status != NO_ERROR) {
165 ALOGE("createRecord returned error %d", *status);
166 return record;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800167 }
Eric Laurentf14db3c2017-12-08 14:20:36 -0800168
169 record = interface_cast<media::IAudioRecord>(reply.readStrongBinder());
170 if (record == 0) {
171 ALOGE("createRecord returned a NULL IAudioRecord with status OK");
172 *status = DEAD_OBJECT;
173 return record;
174 }
175 output.readFromParcel(&reply);
Eric Laurent5841db72009-09-09 05:16:08 -0700176 return record;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800177 }
178
Glenn Kasten2c073da2016-02-26 09:14:08 -0800179 virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800180 {
181 Parcel data, reply;
182 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten2c073da2016-02-26 09:14:08 -0800183 data.writeInt32((int32_t) ioHandle);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800184 remote()->transact(SAMPLE_RATE, data, &reply);
185 return reply.readInt32();
186 }
187
Glenn Kasten4a8308b2016-04-18 14:10:01 -0700188 // RESERVED for channelCount()
189
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800190 virtual audio_format_t format(audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800191 {
192 Parcel data, reply;
193 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800194 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800195 remote()->transact(FORMAT, data, &reply);
Glenn Kasten58f30212012-01-12 12:27:51 -0800196 return (audio_format_t) reply.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800197 }
198
Glenn Kasten2c073da2016-02-26 09:14:08 -0800199 virtual size_t frameCount(audio_io_handle_t ioHandle) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800200 {
201 Parcel data, reply;
202 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten2c073da2016-02-26 09:14:08 -0800203 data.writeInt32((int32_t) ioHandle);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800204 remote()->transact(FRAME_COUNT, data, &reply);
Glenn Kastene03dd222014-01-28 11:04:39 -0800205 return reply.readInt64();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800206 }
207
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800208 virtual uint32_t latency(audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800209 {
210 Parcel data, reply;
211 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800212 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800213 remote()->transact(LATENCY, data, &reply);
214 return reply.readInt32();
215 }
216
217 virtual status_t setMasterVolume(float value)
218 {
219 Parcel data, reply;
220 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
221 data.writeFloat(value);
222 remote()->transact(SET_MASTER_VOLUME, data, &reply);
223 return reply.readInt32();
224 }
225
226 virtual status_t setMasterMute(bool muted)
227 {
228 Parcel data, reply;
229 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
230 data.writeInt32(muted);
231 remote()->transact(SET_MASTER_MUTE, data, &reply);
232 return reply.readInt32();
233 }
234
235 virtual float masterVolume() const
236 {
237 Parcel data, reply;
238 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
239 remote()->transact(MASTER_VOLUME, data, &reply);
240 return reply.readFloat();
241 }
242
243 virtual bool masterMute() const
244 {
245 Parcel data, reply;
246 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
247 remote()->transact(MASTER_MUTE, data, &reply);
248 return reply.readInt32();
249 }
250
Richard Folke Tullberg3fae0372017-01-13 09:04:25 +0100251 status_t setMasterBalance(float balance) override
252 {
253 Parcel data, reply;
254 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
255 data.writeFloat(balance);
256 status_t status = remote()->transact(SET_MASTER_BALANCE, data, &reply);
257 if (status != NO_ERROR) {
258 return status;
259 }
260 return reply.readInt32();
261 }
262
263 status_t getMasterBalance(float *balance) const override
264 {
265 Parcel data, reply;
266 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
267 status_t status = remote()->transact(GET_MASTER_BALANCE, data, &reply);
268 if (status != NO_ERROR) {
269 return status;
270 }
271 status = (status_t)reply.readInt32();
272 if (status != NO_ERROR) {
273 return status;
274 }
275 *balance = reply.readFloat();
276 return NO_ERROR;
277 }
278
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800279 virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
280 audio_io_handle_t output)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800281 {
282 Parcel data, reply;
283 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800284 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800285 data.writeFloat(value);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800286 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800287 remote()->transact(SET_STREAM_VOLUME, data, &reply);
288 return reply.readInt32();
289 }
290
Glenn Kastenfff6d712012-01-12 16:38:12 -0800291 virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800292 {
293 Parcel data, reply;
294 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800295 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800296 data.writeInt32(muted);
297 remote()->transact(SET_STREAM_MUTE, data, &reply);
298 return reply.readInt32();
299 }
300
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800301 virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800302 {
303 Parcel data, reply;
304 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800305 data.writeInt32((int32_t) stream);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800306 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800307 remote()->transact(STREAM_VOLUME, data, &reply);
308 return reply.readFloat();
309 }
310
Glenn Kastenfff6d712012-01-12 16:38:12 -0800311 virtual bool streamMute(audio_stream_type_t stream) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800312 {
313 Parcel data, reply;
314 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800315 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800316 remote()->transact(STREAM_MUTE, data, &reply);
317 return reply.readInt32();
318 }
319
Glenn Kastenf78aee72012-01-04 11:00:47 -0800320 virtual status_t setMode(audio_mode_t mode)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800321 {
322 Parcel data, reply;
323 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
324 data.writeInt32(mode);
325 remote()->transact(SET_MODE, data, &reply);
326 return reply.readInt32();
327 }
328
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800329 virtual status_t setMicMute(bool state)
330 {
331 Parcel data, reply;
332 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
333 data.writeInt32(state);
334 remote()->transact(SET_MIC_MUTE, data, &reply);
335 return reply.readInt32();
336 }
337
338 virtual bool getMicMute() const
339 {
340 Parcel data, reply;
341 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
342 remote()->transact(GET_MIC_MUTE, data, &reply);
343 return reply.readInt32();
344 }
345
Eric Laurent5ada82e2019-08-29 17:53:54 -0700346 virtual void setRecordSilenced(audio_port_handle_t portId, bool silenced)
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800347 {
348 Parcel data, reply;
349 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurent5ada82e2019-08-29 17:53:54 -0700350 data.writeInt32(portId);
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800351 data.writeInt32(silenced ? 1 : 0);
352 remote()->transact(SET_RECORD_SILENCED, data, &reply);
353 }
354
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800355 virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800356 {
357 Parcel data, reply;
358 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800359 data.writeInt32((int32_t) ioHandle);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700360 data.writeString8(keyValuePairs);
361 remote()->transact(SET_PARAMETERS, data, &reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800362 return reply.readInt32();
363 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700364
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800365 virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
Eric Laurentc2f1f072009-07-17 12:17:14 -0700366 {
367 Parcel data, reply;
368 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800369 data.writeInt32((int32_t) ioHandle);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700370 data.writeString8(keys);
371 remote()->transact(GET_PARAMETERS, data, &reply);
372 return reply.readString8();
373 }
374
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800375 virtual void registerClient(const sp<IAudioFlingerClient>& client)
376 {
377 Parcel data, reply;
378 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800379 data.writeStrongBinder(IInterface::asBinder(client));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800380 remote()->transact(REGISTER_CLIENT, data, &reply);
381 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700382
Glenn Kastendd8104c2012-07-02 12:42:44 -0700383 virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
384 audio_channel_mask_t channelMask) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800385 {
386 Parcel data, reply;
387 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
388 data.writeInt32(sampleRate);
389 data.writeInt32(format);
Glenn Kastendd8104c2012-07-02 12:42:44 -0700390 data.writeInt32(channelMask);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800391 remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
Glenn Kastene03dd222014-01-28 11:04:39 -0800392 return reply.readInt64();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800393 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700394
Eric Laurentcf2c0212014-07-25 16:20:43 -0700395 virtual status_t openOutput(audio_module_handle_t module,
396 audio_io_handle_t *output,
397 audio_config_t *config,
jiabinc0106832019-10-24 14:58:31 -0700398 const sp<DeviceDescriptorBase>& device,
Eric Laurentcf2c0212014-07-25 16:20:43 -0700399 uint32_t *latencyMs,
400 audio_output_flags_t flags)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800401 {
jiabinc0106832019-10-24 14:58:31 -0700402 if (output == nullptr || config == nullptr || device == nullptr || latencyMs == nullptr) {
Eric Laurentcf2c0212014-07-25 16:20:43 -0700403 return BAD_VALUE;
404 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800405 Parcel data, reply;
406 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurenta4c5a552012-03-29 10:12:40 -0700407 data.writeInt32(module);
Eric Laurentcf2c0212014-07-25 16:20:43 -0700408 data.write(config, sizeof(audio_config_t));
jiabinc0106832019-10-24 14:58:31 -0700409 data.writeParcelable(*device);
Glenn Kasten18868c52012-03-07 09:15:37 -0800410 data.writeInt32((int32_t) flags);
Eric Laurentcf2c0212014-07-25 16:20:43 -0700411 status_t status = remote()->transact(OPEN_OUTPUT, data, &reply);
412 if (status != NO_ERROR) {
413 *output = AUDIO_IO_HANDLE_NONE;
414 return status;
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100415 }
Eric Laurentcf2c0212014-07-25 16:20:43 -0700416 status = (status_t)reply.readInt32();
417 if (status != NO_ERROR) {
418 *output = AUDIO_IO_HANDLE_NONE;
419 return status;
Glenn Kasten507b2862013-07-31 16:12:13 -0700420 }
Eric Laurentcf2c0212014-07-25 16:20:43 -0700421 *output = (audio_io_handle_t)reply.readInt32();
422 ALOGV("openOutput() returned output, %d", *output);
423 reply.read(config, sizeof(audio_config_t));
Eric Laurentcf2c0212014-07-25 16:20:43 -0700424 *latencyMs = reply.readInt32();
425 return NO_ERROR;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800426 }
427
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800428 virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
429 audio_io_handle_t output2)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800430 {
431 Parcel data, reply;
432 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800433 data.writeInt32((int32_t) output1);
434 data.writeInt32((int32_t) output2);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700435 remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800436 return (audio_io_handle_t) reply.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700437 }
438
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800439 virtual status_t closeOutput(audio_io_handle_t output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700440 {
441 Parcel data, reply;
442 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800443 data.writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700444 remote()->transact(CLOSE_OUTPUT, data, &reply);
445 return reply.readInt32();
446 }
447
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800448 virtual status_t suspendOutput(audio_io_handle_t output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700449 {
450 Parcel data, reply;
451 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800452 data.writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700453 remote()->transact(SUSPEND_OUTPUT, data, &reply);
454 return reply.readInt32();
455 }
456
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800457 virtual status_t restoreOutput(audio_io_handle_t output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700458 {
459 Parcel data, reply;
460 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800461 data.writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700462 remote()->transact(RESTORE_OUTPUT, data, &reply);
463 return reply.readInt32();
464 }
465
Eric Laurentcf2c0212014-07-25 16:20:43 -0700466 virtual status_t openInput(audio_module_handle_t module,
467 audio_io_handle_t *input,
468 audio_config_t *config,
469 audio_devices_t *device,
470 const String8& address,
471 audio_source_t source,
472 audio_input_flags_t flags)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700473 {
Eric Laurentcf2c0212014-07-25 16:20:43 -0700474 if (input == NULL || config == NULL || device == NULL) {
475 return BAD_VALUE;
476 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700477 Parcel data, reply;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700478 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurenta4c5a552012-03-29 10:12:40 -0700479 data.writeInt32(module);
Eric Laurentcf2c0212014-07-25 16:20:43 -0700480 data.writeInt32(*input);
481 data.write(config, sizeof(audio_config_t));
482 data.writeInt32(*device);
483 data.writeString8(address);
484 data.writeInt32(source);
Glenn Kastenec40d282014-07-15 15:31:26 -0700485 data.writeInt32(flags);
Eric Laurentcf2c0212014-07-25 16:20:43 -0700486 status_t status = remote()->transact(OPEN_INPUT, data, &reply);
487 if (status != NO_ERROR) {
488 *input = AUDIO_IO_HANDLE_NONE;
489 return status;
Glenn Kasten507b2862013-07-31 16:12:13 -0700490 }
Eric Laurentcf2c0212014-07-25 16:20:43 -0700491 status = (status_t)reply.readInt32();
492 if (status != NO_ERROR) {
493 *input = AUDIO_IO_HANDLE_NONE;
494 return status;
Glenn Kasten507b2862013-07-31 16:12:13 -0700495 }
Eric Laurentcf2c0212014-07-25 16:20:43 -0700496 *input = (audio_io_handle_t)reply.readInt32();
497 reply.read(config, sizeof(audio_config_t));
498 *device = (audio_devices_t)reply.readInt32();
499 return NO_ERROR;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700500 }
501
Eric Laurentfa2877b2009-07-28 08:44:33 -0700502 virtual status_t closeInput(int input)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700503 {
504 Parcel data, reply;
505 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700506 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700507 remote()->transact(CLOSE_INPUT, data, &reply);
508 return reply.readInt32();
509 }
510
Glenn Kastend2304db2014-02-03 07:40:31 -0800511 virtual status_t invalidateStream(audio_stream_type_t stream)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700512 {
513 Parcel data, reply;
514 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800515 data.writeInt32((int32_t) stream);
Glenn Kastend2304db2014-02-03 07:40:31 -0800516 remote()->transact(INVALIDATE_STREAM, data, &reply);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700517 return reply.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800518 }
Eric Laurentf0ee6f42009-10-21 08:14:22 -0700519
520 virtual status_t setVoiceVolume(float volume)
521 {
522 Parcel data, reply;
523 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
524 data.writeFloat(volume);
525 remote()->transact(SET_VOICE_VOLUME, data, &reply);
526 return reply.readInt32();
527 }
Eric Laurent342e9cf2010-01-19 17:37:09 -0800528
Kévin PETIT377b2ec2014-02-03 12:35:36 +0000529 virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800530 audio_io_handle_t output) const
Eric Laurent342e9cf2010-01-19 17:37:09 -0800531 {
532 Parcel data, reply;
533 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800534 data.writeInt32((int32_t) output);
Eric Laurent342e9cf2010-01-19 17:37:09 -0800535 remote()->transact(GET_RENDER_POSITION, data, &reply);
536 status_t status = reply.readInt32();
537 if (status == NO_ERROR) {
538 uint32_t tmp = reply.readInt32();
Glenn Kasten507b2862013-07-31 16:12:13 -0700539 if (halFrames != NULL) {
Eric Laurent342e9cf2010-01-19 17:37:09 -0800540 *halFrames = tmp;
541 }
542 tmp = reply.readInt32();
Glenn Kasten507b2862013-07-31 16:12:13 -0700543 if (dspFrames != NULL) {
Eric Laurent342e9cf2010-01-19 17:37:09 -0800544 *dspFrames = tmp;
545 }
546 }
547 return status;
548 }
Eric Laurent05bca2f2010-02-26 02:47:27 -0800549
Glenn Kasten5f972c02014-01-13 09:59:31 -0800550 virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const
Eric Laurent05bca2f2010-02-26 02:47:27 -0800551 {
552 Parcel data, reply;
553 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800554 data.writeInt32((int32_t) ioHandle);
Glenn Kasten5f972c02014-01-13 09:59:31 -0800555 status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
556 if (status != NO_ERROR) {
557 return 0;
558 }
559 return (uint32_t) reply.readInt32();
Eric Laurent05bca2f2010-02-26 02:47:27 -0800560 }
Eric Laurentbe916aa2010-06-01 23:49:17 -0700561
Glenn Kasteneeecb982016-02-26 10:44:04 -0800562 virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use)
Eric Laurentbe916aa2010-06-01 23:49:17 -0700563 {
564 Parcel data, reply;
565 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasteneeecb982016-02-26 10:44:04 -0800566 data.writeInt32((int32_t) use);
Glenn Kasten9eae0362016-04-19 09:09:14 -0700567 status_t status = remote()->transact(NEW_AUDIO_UNIQUE_ID, data, &reply);
568 audio_unique_id_t id = AUDIO_UNIQUE_ID_ALLOCATE;
Eric Laurentbe916aa2010-06-01 23:49:17 -0700569 if (status == NO_ERROR) {
570 id = reply.readInt32();
571 }
572 return id;
573 }
574
Andy Hung8b0bfd92019-12-23 13:11:11 -0800575 void acquireAudioSessionId(audio_session_t audioSession, pid_t pid, uid_t uid) override
Marco Nelissen3a34bef2011-08-02 13:33:41 -0700576 {
577 Parcel data, reply;
578 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
579 data.writeInt32(audioSession);
Andy Hung8b0bfd92019-12-23 13:11:11 -0800580 data.writeInt32((int32_t)pid);
581 data.writeInt32((int32_t)uid);
Marco Nelissen3a34bef2011-08-02 13:33:41 -0700582 remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
583 }
584
Glenn Kastend848eb42016-03-08 13:42:11 -0800585 virtual void releaseAudioSessionId(audio_session_t audioSession, int pid)
Marco Nelissen3a34bef2011-08-02 13:33:41 -0700586 {
587 Parcel data, reply;
588 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
589 data.writeInt32(audioSession);
Marco Nelissend457c972014-02-11 08:47:07 -0800590 data.writeInt32(pid);
Marco Nelissen3a34bef2011-08-02 13:33:41 -0700591 remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
592 }
593
Glenn Kastenf587ba52012-01-26 16:25:10 -0800594 virtual status_t queryNumberEffects(uint32_t *numEffects) const
Eric Laurentbe916aa2010-06-01 23:49:17 -0700595 {
596 Parcel data, reply;
597 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
598 status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
599 if (status != NO_ERROR) {
600 return status;
601 }
602 status = reply.readInt32();
603 if (status != NO_ERROR) {
604 return status;
605 }
Glenn Kasten9d1f02d2012-02-08 17:47:58 -0800606 if (numEffects != NULL) {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700607 *numEffects = (uint32_t)reply.readInt32();
608 }
609 return NO_ERROR;
610 }
611
Glenn Kastenf587ba52012-01-26 16:25:10 -0800612 virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
Eric Laurentbe916aa2010-06-01 23:49:17 -0700613 {
614 if (pDescriptor == NULL) {
615 return BAD_VALUE;
616 }
617 Parcel data, reply;
618 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentffe9c252010-06-23 17:38:20 -0700619 data.writeInt32(index);
620 status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700621 if (status != NO_ERROR) {
622 return status;
623 }
624 status = reply.readInt32();
625 if (status != NO_ERROR) {
626 return status;
627 }
628 reply.read(pDescriptor, sizeof(effect_descriptor_t));
629 return NO_ERROR;
630 }
631
Glenn Kasten5e92a782012-01-30 07:40:52 -0800632 virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
Ari Hausman-Cohen2046ec72018-04-24 14:00:55 -0700633 const effect_uuid_t *pType,
634 uint32_t preferredTypeFlag,
635 effect_descriptor_t *pDescriptor) const
Eric Laurentbe916aa2010-06-01 23:49:17 -0700636 {
Ari Hausman-Cohen2046ec72018-04-24 14:00:55 -0700637 if (pUuid == NULL || pType == NULL || pDescriptor == NULL) {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700638 return BAD_VALUE;
639 }
640 Parcel data, reply;
641 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
642 data.write(pUuid, sizeof(effect_uuid_t));
Ari Hausman-Cohen2046ec72018-04-24 14:00:55 -0700643 data.write(pType, sizeof(effect_uuid_t));
644 data.writeUint32(preferredTypeFlag);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700645 status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
646 if (status != NO_ERROR) {
647 return status;
648 }
649 status = reply.readInt32();
650 if (status != NO_ERROR) {
651 return status;
652 }
653 reply.read(pDescriptor, sizeof(effect_descriptor_t));
654 return NO_ERROR;
655 }
656
Glenn Kasten8d6cc842012-02-03 11:06:53 -0800657 virtual sp<IEffect> createEffect(
Eric Laurentbe916aa2010-06-01 23:49:17 -0700658 effect_descriptor_t *pDesc,
659 const sp<IEffectClient>& client,
660 int32_t priority,
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800661 audio_io_handle_t output,
Glenn Kastend848eb42016-03-08 13:42:11 -0800662 audio_session_t sessionId,
Eric Laurentfefebb52019-11-13 12:45:28 -0800663 const AudioDeviceTypeAddr& device,
Svet Ganovbe71aa22015-04-28 12:06:02 -0700664 const String16& opPackageName,
Eric Laurentb6436272016-12-07 19:24:50 -0800665 pid_t pid,
Eric Laurent2fe0acd2020-03-13 14:30:46 -0700666 bool probe,
Eric Laurentbe916aa2010-06-01 23:49:17 -0700667 status_t *status,
668 int *id,
669 int *enabled)
670 {
671 Parcel data, reply;
672 sp<IEffect> effect;
Eric Laurentbe916aa2010-06-01 23:49:17 -0700673 if (pDesc == NULL) {
Glenn Kasten507b2862013-07-31 16:12:13 -0700674 if (status != NULL) {
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700675 *status = BAD_VALUE;
676 }
Eric Laurentfefebb52019-11-13 12:45:28 -0800677 return nullptr;
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700678 }
Eric Laurentbe916aa2010-06-01 23:49:17 -0700679
680 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentbe916aa2010-06-01 23:49:17 -0700681 data.write(pDesc, sizeof(effect_descriptor_t));
Marco Nelissen06b46062014-11-14 07:58:25 -0800682 data.writeStrongBinder(IInterface::asBinder(client));
Eric Laurentbe916aa2010-06-01 23:49:17 -0700683 data.writeInt32(priority);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800684 data.writeInt32((int32_t) output);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700685 data.writeInt32(sessionId);
Eric Laurentfefebb52019-11-13 12:45:28 -0800686 if (data.writeParcelable(device) != NO_ERROR) {
687 if (status != NULL) {
688 *status = NO_INIT;
689 }
690 return nullptr;
691 }
Svet Ganovbe71aa22015-04-28 12:06:02 -0700692 data.writeString16(opPackageName);
Eric Laurentb6436272016-12-07 19:24:50 -0800693 data.writeInt32((int32_t) pid);
Eric Laurent2fe0acd2020-03-13 14:30:46 -0700694 data.writeInt32(probe ? 1 : 0);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700695
696 status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
697 if (lStatus != NO_ERROR) {
Steve Block29357bc2012-01-06 19:20:56 +0000698 ALOGE("createEffect error: %s", strerror(-lStatus));
Eric Laurentbe916aa2010-06-01 23:49:17 -0700699 } else {
700 lStatus = reply.readInt32();
701 int tmp = reply.readInt32();
Glenn Kasten507b2862013-07-31 16:12:13 -0700702 if (id != NULL) {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700703 *id = tmp;
704 }
705 tmp = reply.readInt32();
Glenn Kastena0d68332012-01-27 16:47:15 -0800706 if (enabled != NULL) {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700707 *enabled = tmp;
708 }
709 effect = interface_cast<IEffect>(reply.readStrongBinder());
710 reply.read(pDesc, sizeof(effect_descriptor_t));
711 }
Glenn Kasten507b2862013-07-31 16:12:13 -0700712 if (status != NULL) {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700713 *status = lStatus;
714 }
715
716 return effect;
717 }
Eric Laurentde070132010-07-13 04:45:46 -0700718
Glenn Kastend848eb42016-03-08 13:42:11 -0800719 virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput,
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800720 audio_io_handle_t dstOutput)
Eric Laurentde070132010-07-13 04:45:46 -0700721 {
722 Parcel data, reply;
723 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
724 data.writeInt32(session);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800725 data.writeInt32((int32_t) srcOutput);
726 data.writeInt32((int32_t) dstOutput);
Eric Laurentde070132010-07-13 04:45:46 -0700727 remote()->transact(MOVE_EFFECTS, data, &reply);
728 return reply.readInt32();
729 }
Eric Laurenta4c5a552012-03-29 10:12:40 -0700730
Eric Laurentb20cf7d2019-04-05 19:37:34 -0700731 virtual void setEffectSuspended(int effectId,
732 audio_session_t sessionId,
733 bool suspended)
734 {
735 Parcel data, reply;
736 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
737 data.writeInt32(effectId);
738 data.writeInt32(sessionId);
739 data.writeInt32(suspended ? 1 : 0);
740 remote()->transact(SET_EFFECT_SUSPENDED, data, &reply);
741 }
742
Eric Laurenta4c5a552012-03-29 10:12:40 -0700743 virtual audio_module_handle_t loadHwModule(const char *name)
744 {
745 Parcel data, reply;
746 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
747 data.writeCString(name);
748 remote()->transact(LOAD_HW_MODULE, data, &reply);
749 return (audio_module_handle_t) reply.readInt32();
750 }
Glenn Kastencc0f1cf2012-09-24 11:27:18 -0700751
Glenn Kasten3b16c762012-11-14 08:44:39 -0800752 virtual uint32_t getPrimaryOutputSamplingRate()
Glenn Kastencc0f1cf2012-09-24 11:27:18 -0700753 {
754 Parcel data, reply;
755 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
756 remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
757 return reply.readInt32();
758 }
759
Glenn Kastene33054e2012-11-14 12:54:39 -0800760 virtual size_t getPrimaryOutputFrameCount()
Glenn Kastencc0f1cf2012-09-24 11:27:18 -0700761 {
762 Parcel data, reply;
763 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
764 remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
Glenn Kastene03dd222014-01-28 11:04:39 -0800765 return reply.readInt64();
Glenn Kastencc0f1cf2012-09-24 11:27:18 -0700766 }
767
Andy Hung6f248bb2018-01-23 14:04:37 -0800768 virtual status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) override
Glenn Kasten4182c4e2013-07-15 14:45:07 -0700769 {
770 Parcel data, reply;
Andy Hung6f248bb2018-01-23 14:04:37 -0800771
772 static_assert(NO_ERROR == 0, "NO_ERROR must be 0");
773 return data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor())
774 ?: data.writeInt32((int) isLowRamDevice)
775 ?: data.writeInt64(totalMemory)
776 ?: remote()->transact(SET_LOW_RAM_DEVICE, data, &reply)
777 ?: reply.readInt32();
Glenn Kasten4182c4e2013-07-15 14:45:07 -0700778 }
Andy Hung6f248bb2018-01-23 14:04:37 -0800779
Eric Laurent4b123402014-04-11 09:22:20 -0700780 virtual status_t listAudioPorts(unsigned int *num_ports,
781 struct audio_port *ports)
782 {
783 if (num_ports == NULL || *num_ports == 0 || ports == NULL) {
784 return BAD_VALUE;
785 }
786 Parcel data, reply;
787 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
788 data.writeInt32(*num_ports);
789 status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
790 if (status != NO_ERROR ||
791 (status = (status_t)reply.readInt32()) != NO_ERROR) {
792 return status;
793 }
794 *num_ports = (unsigned int)reply.readInt32();
795 reply.read(ports, *num_ports * sizeof(struct audio_port));
796 return status;
797 }
798 virtual status_t getAudioPort(struct audio_port *port)
799 {
800 if (port == NULL) {
801 return BAD_VALUE;
802 }
803 Parcel data, reply;
804 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
805 data.write(port, sizeof(struct audio_port));
806 status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
807 if (status != NO_ERROR ||
808 (status = (status_t)reply.readInt32()) != NO_ERROR) {
809 return status;
810 }
811 reply.read(port, sizeof(struct audio_port));
812 return status;
813 }
814 virtual status_t createAudioPatch(const struct audio_patch *patch,
815 audio_patch_handle_t *handle)
816 {
817 if (patch == NULL || handle == NULL) {
818 return BAD_VALUE;
819 }
820 Parcel data, reply;
821 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
822 data.write(patch, sizeof(struct audio_patch));
823 data.write(handle, sizeof(audio_patch_handle_t));
824 status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
825 if (status != NO_ERROR ||
826 (status = (status_t)reply.readInt32()) != NO_ERROR) {
827 return status;
828 }
829 reply.read(handle, sizeof(audio_patch_handle_t));
830 return status;
831 }
832 virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
833 {
834 Parcel data, reply;
835 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
836 data.write(&handle, sizeof(audio_patch_handle_t));
837 status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
838 if (status != NO_ERROR) {
839 status = (status_t)reply.readInt32();
840 }
841 return status;
842 }
843 virtual status_t listAudioPatches(unsigned int *num_patches,
844 struct audio_patch *patches)
845 {
846 if (num_patches == NULL || *num_patches == 0 || patches == NULL) {
847 return BAD_VALUE;
848 }
849 Parcel data, reply;
850 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
851 data.writeInt32(*num_patches);
852 status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
853 if (status != NO_ERROR ||
854 (status = (status_t)reply.readInt32()) != NO_ERROR) {
855 return status;
856 }
857 *num_patches = (unsigned int)reply.readInt32();
858 reply.read(patches, *num_patches * sizeof(struct audio_patch));
859 return status;
860 }
861 virtual status_t setAudioPortConfig(const struct audio_port_config *config)
862 {
863 if (config == NULL) {
864 return BAD_VALUE;
865 }
866 Parcel data, reply;
867 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
868 data.write(config, sizeof(struct audio_port_config));
869 status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
870 if (status != NO_ERROR) {
871 status = (status_t)reply.readInt32();
872 }
873 return status;
874 }
Eric Laurent93c3d412014-08-01 14:48:35 -0700875 virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId)
876 {
877 Parcel data, reply;
878 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
879 data.writeInt32(sessionId);
Glenn Kasten9eae0362016-04-19 09:09:14 -0700880 status_t status = remote()->transact(GET_AUDIO_HW_SYNC_FOR_SESSION, data, &reply);
Eric Laurent93c3d412014-08-01 14:48:35 -0700881 if (status != NO_ERROR) {
882 return AUDIO_HW_SYNC_INVALID;
883 }
884 return (audio_hw_sync_t)reply.readInt32();
885 }
Eric Laurent72e3f392015-05-20 14:43:50 -0700886 virtual status_t systemReady()
887 {
888 Parcel data, reply;
889 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
890 return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY);
891 }
Glenn Kasten4a8308b2016-04-18 14:10:01 -0700892 virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const
893 {
894 Parcel data, reply;
895 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
896 data.writeInt32((int32_t) ioHandle);
897 status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply);
898 if (status != NO_ERROR) {
899 return 0;
900 }
901 return reply.readInt64();
902 }
jiabin46a76fa2018-01-05 10:18:21 -0800903 virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones)
904 {
905 Parcel data, reply;
906 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
jiabin9ff780e2018-03-19 18:19:52 -0700907 status_t status = remote()->transact(GET_MICROPHONES, data, &reply);
jiabin46a76fa2018-01-05 10:18:21 -0800908 if (status != NO_ERROR ||
909 (status = (status_t)reply.readInt32()) != NO_ERROR) {
910 return status;
911 }
912 status = reply.readParcelableVector(microphones);
913 return status;
914 }
Eric Laurentb680e952019-09-27 15:40:33 -0700915 virtual status_t setAudioHalPids(const std::vector<pid_t>& pids)
916 {
917 Parcel data, reply;
918 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
919 data.writeInt32(pids.size());
920 for (auto pid : pids) {
921 data.writeInt32(pid);
922 }
923 status_t status = remote()->transact(SET_AUDIO_HAL_PIDS, data, &reply);
924 if (status != NO_ERROR) {
925 return status;
926 }
927 return static_cast <status_t> (reply.readInt32());
928 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800929};
930
931IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
932
933// ----------------------------------------------------------------------
934
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800935status_t BnAudioFlinger::onTransact(
936 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
937{
Eric Laurentb1cc36b2017-12-11 12:14:16 -0800938 // make sure transactions reserved to AudioPolicyManager do not come from other processes
939 switch (code) {
940 case SET_STREAM_VOLUME:
941 case SET_STREAM_MUTE:
Eric Laurentb1cc36b2017-12-11 12:14:16 -0800942 case OPEN_OUTPUT:
943 case OPEN_DUPLICATE_OUTPUT:
944 case CLOSE_OUTPUT:
945 case SUSPEND_OUTPUT:
946 case RESTORE_OUTPUT:
947 case OPEN_INPUT:
948 case CLOSE_INPUT:
949 case INVALIDATE_STREAM:
950 case SET_VOICE_VOLUME:
951 case MOVE_EFFECTS:
Eric Laurentb20cf7d2019-04-05 19:37:34 -0700952 case SET_EFFECT_SUSPENDED:
Eric Laurentb1cc36b2017-12-11 12:14:16 -0800953 case LOAD_HW_MODULE:
954 case LIST_AUDIO_PORTS:
955 case GET_AUDIO_PORT:
956 case CREATE_AUDIO_PATCH:
957 case RELEASE_AUDIO_PATCH:
958 case LIST_AUDIO_PATCHES:
959 case SET_AUDIO_PORT_CONFIG:
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800960 case SET_RECORD_SILENCED:
Eric Laurentb1cc36b2017-12-11 12:14:16 -0800961 ALOGW("%s: transaction %d received from PID %d",
962 __func__, code, IPCThreadState::self()->getCallingPid());
Eric Laurentef92bff2018-04-26 10:44:50 -0700963 // return status only for non void methods
964 switch (code) {
965 case SET_RECORD_SILENCED:
Eric Laurentb20cf7d2019-04-05 19:37:34 -0700966 case SET_EFFECT_SUSPENDED:
Eric Laurentef92bff2018-04-26 10:44:50 -0700967 break;
968 default:
969 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
970 break;
971 }
972 return OK;
Eric Laurentb1cc36b2017-12-11 12:14:16 -0800973 default:
974 break;
975 }
976
Eric Laurent4980df22018-01-26 18:04:09 -0800977 // make sure the following transactions come from system components
978 switch (code) {
979 case SET_MASTER_VOLUME:
980 case SET_MASTER_MUTE:
981 case SET_MODE:
982 case SET_MIC_MUTE:
983 case SET_LOW_RAM_DEVICE:
Eric Laurentb680e952019-09-27 15:40:33 -0700984 case SYSTEM_READY:
985 case SET_AUDIO_HAL_PIDS: {
Andy Hung4ef19fa2018-05-15 19:35:29 -0700986 if (!isServiceUid(IPCThreadState::self()->getCallingUid())) {
Eric Laurent4980df22018-01-26 18:04:09 -0800987 ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
988 __func__, code, IPCThreadState::self()->getCallingPid(),
989 IPCThreadState::self()->getCallingUid());
Eric Laurentef92bff2018-04-26 10:44:50 -0700990 // return status only for non void methods
991 switch (code) {
992 case SYSTEM_READY:
993 break;
994 default:
995 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
996 break;
997 }
998 return OK;
Eric Laurent4980df22018-01-26 18:04:09 -0800999 }
Eric Laurent96c7eed2018-03-26 17:57:01 -07001000 } break;
Eric Laurent4980df22018-01-26 18:04:09 -08001001 default:
1002 break;
1003 }
1004
Kensuke Miyagi639d96c2020-07-27 19:31:34 +00001005 // List of relevant events that trigger log merging.
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -08001006 // Log merging should activate during audio activity of any kind. This are considered the
1007 // most relevant events.
1008 // TODO should select more wisely the items from the list
1009 switch (code) {
1010 case CREATE_TRACK:
Eric Laurentf14db3c2017-12-08 14:20:36 -08001011 case CREATE_RECORD:
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -08001012 case SET_MASTER_VOLUME:
1013 case SET_MASTER_MUTE:
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -08001014 case SET_MIC_MUTE:
1015 case SET_PARAMETERS:
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -08001016 case CREATE_EFFECT:
1017 case SYSTEM_READY: {
1018 requestLogMerge();
1019 break;
1020 }
1021 default:
1022 break;
1023 }
Eric Laurentb1cc36b2017-12-11 12:14:16 -08001024
Eric Laurent39b09b52018-06-29 12:24:40 -07001025 std::string tag("IAudioFlinger command " + std::to_string(code));
1026 TimeCheck check(tag.c_str());
Eric Laurent3528c932018-02-23 17:17:22 -08001027
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001028 switch (code) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001029 case CREATE_TRACK: {
1030 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurent21da6472017-11-09 16:29:26 -08001031
1032 CreateTrackInput input;
1033 if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
1034 reply->writeInt32(DEAD_OBJECT);
1035 return NO_ERROR;
Eric Laurent3d00aa62013-09-24 09:53:27 -07001036 }
Eric Laurent21da6472017-11-09 16:29:26 -08001037
1038 status_t status;
1039 CreateTrackOutput output;
1040
1041 sp<IAudioTrack> track= createTrack(input,
1042 output,
1043 &status);
1044
1045 LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001046 reply->writeInt32(status);
Eric Laurent21da6472017-11-09 16:29:26 -08001047 if (status != NO_ERROR) {
1048 return NO_ERROR;
1049 }
Marco Nelissen06b46062014-11-14 07:58:25 -08001050 reply->writeStrongBinder(IInterface::asBinder(track));
Eric Laurent21da6472017-11-09 16:29:26 -08001051 output.writeToParcel(reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001052 return NO_ERROR;
1053 } break;
Eric Laurentf14db3c2017-12-08 14:20:36 -08001054 case CREATE_RECORD: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001055 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentf14db3c2017-12-08 14:20:36 -08001056
1057 CreateRecordInput input;
1058 if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
1059 reply->writeInt32(DEAD_OBJECT);
1060 return NO_ERROR;
1061 }
1062
1063 status_t status;
1064 CreateRecordOutput output;
1065
1066 sp<media::IAudioRecord> record = createRecord(input,
1067 output,
1068 &status);
1069
Glenn Kastene93cf2c2013-09-24 11:52:37 -07001070 LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001071 reply->writeInt32(status);
Eric Laurentf14db3c2017-12-08 14:20:36 -08001072 if (status != NO_ERROR) {
1073 return NO_ERROR;
1074 }
Marco Nelissen06b46062014-11-14 07:58:25 -08001075 reply->writeStrongBinder(IInterface::asBinder(record));
Eric Laurentf14db3c2017-12-08 14:20:36 -08001076 output.writeToParcel(reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001077 return NO_ERROR;
1078 } break;
1079 case SAMPLE_RATE: {
1080 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001081 reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001082 return NO_ERROR;
1083 } break;
Glenn Kasten4a8308b2016-04-18 14:10:01 -07001084
1085 // RESERVED for channelCount()
1086
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001087 case FORMAT: {
1088 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001089 reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001090 return NO_ERROR;
1091 } break;
1092 case FRAME_COUNT: {
1093 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastene03dd222014-01-28 11:04:39 -08001094 reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001095 return NO_ERROR;
1096 } break;
1097 case LATENCY: {
1098 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001099 reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001100 return NO_ERROR;
1101 } break;
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001102 case SET_MASTER_VOLUME: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001103 CHECK_INTERFACE(IAudioFlinger, data, reply);
1104 reply->writeInt32( setMasterVolume(data.readFloat()) );
1105 return NO_ERROR;
1106 } break;
1107 case SET_MASTER_MUTE: {
1108 CHECK_INTERFACE(IAudioFlinger, data, reply);
1109 reply->writeInt32( setMasterMute(data.readInt32()) );
1110 return NO_ERROR;
1111 } break;
1112 case MASTER_VOLUME: {
1113 CHECK_INTERFACE(IAudioFlinger, data, reply);
1114 reply->writeFloat( masterVolume() );
1115 return NO_ERROR;
1116 } break;
1117 case MASTER_MUTE: {
1118 CHECK_INTERFACE(IAudioFlinger, data, reply);
1119 reply->writeInt32( masterMute() );
1120 return NO_ERROR;
1121 } break;
Richard Folke Tullberg3fae0372017-01-13 09:04:25 +01001122 case SET_MASTER_BALANCE: {
1123 CHECK_INTERFACE(IAudioFlinger, data, reply);
1124 reply->writeInt32( setMasterBalance(data.readFloat()) );
1125 return NO_ERROR;
1126 } break;
1127 case GET_MASTER_BALANCE: {
1128 CHECK_INTERFACE(IAudioFlinger, data, reply);
1129 float f;
1130 const status_t status = getMasterBalance(&f);
1131 reply->writeInt32((int32_t)status);
1132 if (status == NO_ERROR) {
1133 (void)reply->writeFloat(f);
1134 }
1135 return NO_ERROR;
1136 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001137 case SET_STREAM_VOLUME: {
1138 CHECK_INTERFACE(IAudioFlinger, data, reply);
1139 int stream = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001140 float volume = data.readFloat();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001141 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001142 reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001143 return NO_ERROR;
1144 } break;
1145 case SET_STREAM_MUTE: {
1146 CHECK_INTERFACE(IAudioFlinger, data, reply);
1147 int stream = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001148 reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001149 return NO_ERROR;
1150 } break;
1151 case STREAM_VOLUME: {
1152 CHECK_INTERFACE(IAudioFlinger, data, reply);
1153 int stream = data.readInt32();
Eric Laurentfa2877b2009-07-28 08:44:33 -07001154 int output = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001155 reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001156 return NO_ERROR;
1157 } break;
1158 case STREAM_MUTE: {
1159 CHECK_INTERFACE(IAudioFlinger, data, reply);
1160 int stream = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001161 reply->writeInt32( streamMute((audio_stream_type_t) stream) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001162 return NO_ERROR;
1163 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001164 case SET_MODE: {
1165 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastenf78aee72012-01-04 11:00:47 -08001166 audio_mode_t mode = (audio_mode_t) data.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001167 reply->writeInt32( setMode(mode) );
1168 return NO_ERROR;
1169 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001170 case SET_MIC_MUTE: {
1171 CHECK_INTERFACE(IAudioFlinger, data, reply);
1172 int state = data.readInt32();
1173 reply->writeInt32( setMicMute(state) );
1174 return NO_ERROR;
1175 } break;
1176 case GET_MIC_MUTE: {
1177 CHECK_INTERFACE(IAudioFlinger, data, reply);
1178 reply->writeInt32( getMicMute() );
1179 return NO_ERROR;
1180 } break;
Svet Ganovf4ddfef2018-01-16 07:37:58 -08001181 case SET_RECORD_SILENCED: {
1182 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurent5ada82e2019-08-29 17:53:54 -07001183 audio_port_handle_t portId = data.readInt32();
Svet Ganovf4ddfef2018-01-16 07:37:58 -08001184 bool silenced = data.readInt32() == 1;
Eric Laurent5ada82e2019-08-29 17:53:54 -07001185 setRecordSilenced(portId, silenced);
Svet Ganovf4ddfef2018-01-16 07:37:58 -08001186 return NO_ERROR;
1187 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001188 case SET_PARAMETERS: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001189 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001190 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001191 String8 keyValuePairs(data.readString8());
1192 reply->writeInt32(setParameters(ioHandle, keyValuePairs));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001193 return NO_ERROR;
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001194 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001195 case GET_PARAMETERS: {
1196 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001197 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001198 String8 keys(data.readString8());
1199 reply->writeString8(getParameters(ioHandle, keys));
1200 return NO_ERROR;
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001201 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001202
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001203 case REGISTER_CLIENT: {
1204 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001205 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
1206 data.readStrongBinder());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001207 registerClient(client);
1208 return NO_ERROR;
1209 } break;
1210 case GET_INPUTBUFFERSIZE: {
1211 CHECK_INTERFACE(IAudioFlinger, data, reply);
1212 uint32_t sampleRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -08001213 audio_format_t format = (audio_format_t) data.readInt32();
Mikhail Naganove3b59ac2020-10-01 15:08:13 -07001214 audio_channel_mask_t channelMask = (audio_channel_mask_t) data.readInt32();
Glenn Kastene03dd222014-01-28 11:04:39 -08001215 reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001216 return NO_ERROR;
1217 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001218 case OPEN_OUTPUT: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001219 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta4c5a552012-03-29 10:12:40 -07001220 audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
Wei Jiae995e472015-09-09 09:48:34 -07001221 audio_config_t config = {};
1222 if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1223 ALOGE("b/23905951");
1224 }
jiabinc0106832019-10-24 14:58:31 -07001225 sp<DeviceDescriptorBase> device = new DeviceDescriptorBase(AUDIO_DEVICE_NONE);
1226 status_t status = NO_ERROR;
1227 if ((status = data.readParcelable(device.get())) != NO_ERROR) {
1228 reply->writeInt32((int32_t)status);
1229 return NO_ERROR;
1230 }
Eric Laurent0ca3cf92012-04-18 09:24:29 -07001231 audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
Wei Jia983dca32015-09-10 09:47:29 -07001232 uint32_t latencyMs = 0;
Wei Jia4cac44b2015-09-16 15:01:16 -07001233 audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
jiabinc0106832019-10-24 14:58:31 -07001234 status = openOutput(module, &output, &config, device, &latencyMs, flags);
Glenn Kasten70742962014-02-18 08:00:47 -08001235 ALOGV("OPEN_OUTPUT output, %d", output);
Eric Laurentcf2c0212014-07-25 16:20:43 -07001236 reply->writeInt32((int32_t)status);
1237 if (status == NO_ERROR) {
1238 reply->writeInt32((int32_t)output);
1239 reply->write(&config, sizeof(audio_config_t));
Eric Laurentcf2c0212014-07-25 16:20:43 -07001240 reply->writeInt32(latencyMs);
1241 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001242 return NO_ERROR;
1243 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001244 case OPEN_DUPLICATE_OUTPUT: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001245 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001246 audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
1247 audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
1248 reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001249 return NO_ERROR;
1250 } break;
1251 case CLOSE_OUTPUT: {
1252 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001253 reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001254 return NO_ERROR;
1255 } break;
1256 case SUSPEND_OUTPUT: {
1257 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001258 reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001259 return NO_ERROR;
1260 } break;
1261 case RESTORE_OUTPUT: {
1262 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001263 reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001264 return NO_ERROR;
1265 } break;
1266 case OPEN_INPUT: {
1267 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta4c5a552012-03-29 10:12:40 -07001268 audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
Eric Laurentcf2c0212014-07-25 16:20:43 -07001269 audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
Wei Jiae995e472015-09-09 09:48:34 -07001270 audio_config_t config = {};
1271 if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1272 ALOGE("b/23905951");
1273 }
Eric Laurentcf2c0212014-07-25 16:20:43 -07001274 audio_devices_t device = (audio_devices_t)data.readInt32();
1275 String8 address(data.readString8());
1276 audio_source_t source = (audio_source_t)data.readInt32();
Glenn Kastenec40d282014-07-15 15:31:26 -07001277 audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001278
Eric Laurentcf2c0212014-07-25 16:20:43 -07001279 status_t status = openInput(module, &input, &config,
1280 &device, address, source, flags);
1281 reply->writeInt32((int32_t) status);
1282 if (status == NO_ERROR) {
1283 reply->writeInt32((int32_t) input);
1284 reply->write(&config, sizeof(audio_config_t));
1285 reply->writeInt32(device);
1286 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001287 return NO_ERROR;
1288 } break;
1289 case CLOSE_INPUT: {
1290 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001291 reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001292 return NO_ERROR;
1293 } break;
Glenn Kastend2304db2014-02-03 07:40:31 -08001294 case INVALIDATE_STREAM: {
Eric Laurentc2f1f072009-07-17 12:17:14 -07001295 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend2304db2014-02-03 07:40:31 -08001296 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1297 reply->writeInt32(invalidateStream(stream));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001298 return NO_ERROR;
1299 } break;
Eric Laurentf0ee6f42009-10-21 08:14:22 -07001300 case SET_VOICE_VOLUME: {
1301 CHECK_INTERFACE(IAudioFlinger, data, reply);
1302 float volume = data.readFloat();
1303 reply->writeInt32( setVoiceVolume(volume) );
1304 return NO_ERROR;
1305 } break;
Eric Laurent342e9cf2010-01-19 17:37:09 -08001306 case GET_RENDER_POSITION: {
1307 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001308 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Wei Jia983dca32015-09-10 09:47:29 -07001309 uint32_t halFrames = 0;
1310 uint32_t dspFrames = 0;
Eric Laurent342e9cf2010-01-19 17:37:09 -08001311 status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1312 reply->writeInt32(status);
1313 if (status == NO_ERROR) {
1314 reply->writeInt32(halFrames);
1315 reply->writeInt32(dspFrames);
1316 }
1317 return NO_ERROR;
1318 }
Eric Laurent05bca2f2010-02-26 02:47:27 -08001319 case GET_INPUT_FRAMES_LOST: {
1320 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001321 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Glenn Kasten5f972c02014-01-13 09:59:31 -08001322 reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
Eric Laurent05bca2f2010-02-26 02:47:27 -08001323 return NO_ERROR;
1324 } break;
Glenn Kasten9eae0362016-04-19 09:09:14 -07001325 case NEW_AUDIO_UNIQUE_ID: {
Eric Laurentbe916aa2010-06-01 23:49:17 -07001326 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasteneeecb982016-02-26 10:44:04 -08001327 reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32()));
Eric Laurentbe916aa2010-06-01 23:49:17 -07001328 return NO_ERROR;
1329 } break;
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001330 case ACQUIRE_AUDIO_SESSION_ID: {
1331 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001332 audio_session_t audioSession = (audio_session_t) data.readInt32();
Andy Hung8b0bfd92019-12-23 13:11:11 -08001333 const pid_t pid = (pid_t)data.readInt32();
1334 const uid_t uid = (uid_t)data.readInt32();
1335 acquireAudioSessionId(audioSession, pid, uid);
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001336 return NO_ERROR;
1337 } break;
1338 case RELEASE_AUDIO_SESSION_ID: {
1339 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001340 audio_session_t audioSession = (audio_session_t) data.readInt32();
Marco Nelissend457c972014-02-11 08:47:07 -08001341 int pid = data.readInt32();
1342 releaseAudioSessionId(audioSession, pid);
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001343 return NO_ERROR;
1344 } break;
Eric Laurentbe916aa2010-06-01 23:49:17 -07001345 case QUERY_NUM_EFFECTS: {
1346 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jia983dca32015-09-10 09:47:29 -07001347 uint32_t numEffects = 0;
Eric Laurentbe916aa2010-06-01 23:49:17 -07001348 status_t status = queryNumberEffects(&numEffects);
1349 reply->writeInt32(status);
1350 if (status == NO_ERROR) {
1351 reply->writeInt32((int32_t)numEffects);
1352 }
1353 return NO_ERROR;
1354 }
Eric Laurentffe9c252010-06-23 17:38:20 -07001355 case QUERY_EFFECT: {
Eric Laurentbe916aa2010-06-01 23:49:17 -07001356 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jia983dca32015-09-10 09:47:29 -07001357 effect_descriptor_t desc = {};
Eric Laurentffe9c252010-06-23 17:38:20 -07001358 status_t status = queryEffect(data.readInt32(), &desc);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001359 reply->writeInt32(status);
1360 if (status == NO_ERROR) {
1361 reply->write(&desc, sizeof(effect_descriptor_t));
1362 }
1363 return NO_ERROR;
1364 }
1365 case GET_EFFECT_DESCRIPTOR: {
1366 CHECK_INTERFACE(IAudioFlinger, data, reply);
Andy Hung18824a92019-08-21 14:45:41 -07001367 effect_uuid_t uuid = {};
1368 if (data.read(&uuid, sizeof(effect_uuid_t)) != NO_ERROR) {
1369 android_errorWriteLog(0x534e4554, "139417189");
1370 }
1371 effect_uuid_t type = {};
1372 if (data.read(&type, sizeof(effect_uuid_t)) != NO_ERROR) {
1373 android_errorWriteLog(0x534e4554, "139417189");
1374 }
Ari Hausman-Cohen2046ec72018-04-24 14:00:55 -07001375 uint32_t preferredTypeFlag = data.readUint32();
Wei Jia983dca32015-09-10 09:47:29 -07001376 effect_descriptor_t desc = {};
Ari Hausman-Cohen2046ec72018-04-24 14:00:55 -07001377 status_t status = getEffectDescriptor(&uuid, &type, preferredTypeFlag, &desc);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001378 reply->writeInt32(status);
1379 if (status == NO_ERROR) {
1380 reply->write(&desc, sizeof(effect_descriptor_t));
1381 }
1382 return NO_ERROR;
1383 }
1384 case CREATE_EFFECT: {
1385 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jiae995e472015-09-09 09:48:34 -07001386 effect_descriptor_t desc = {};
1387 if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) {
1388 ALOGE("b/23905951");
1389 }
Eric Laurentbe916aa2010-06-01 23:49:17 -07001390 sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1391 int32_t priority = data.readInt32();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001392 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kastend848eb42016-03-08 13:42:11 -08001393 audio_session_t sessionId = (audio_session_t) data.readInt32();
Eric Laurentfefebb52019-11-13 12:45:28 -08001394 AudioDeviceTypeAddr device;
1395 status_t status = NO_ERROR;
1396 if ((status = data.readParcelable(&device)) != NO_ERROR) {
1397 return status;
1398 }
Svet Ganovbe71aa22015-04-28 12:06:02 -07001399 const String16 opPackageName = data.readString16();
Eric Laurentb6436272016-12-07 19:24:50 -08001400 pid_t pid = (pid_t)data.readInt32();
Eric Laurent2fe0acd2020-03-13 14:30:46 -07001401 bool probe = data.readInt32() == 1;
Eric Laurentb6436272016-12-07 19:24:50 -08001402
Wei Jia983dca32015-09-10 09:47:29 -07001403 int id = 0;
1404 int enabled = 0;
Eric Laurent05bca2f2010-02-26 02:47:27 -08001405
Eric Laurentfefebb52019-11-13 12:45:28 -08001406 sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, device,
Eric Laurent2fe0acd2020-03-13 14:30:46 -07001407 opPackageName, pid, probe, &status, &id, &enabled);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001408 reply->writeInt32(status);
1409 reply->writeInt32(id);
1410 reply->writeInt32(enabled);
Marco Nelissen06b46062014-11-14 07:58:25 -08001411 reply->writeStrongBinder(IInterface::asBinder(effect));
Eric Laurentbe916aa2010-06-01 23:49:17 -07001412 reply->write(&desc, sizeof(effect_descriptor_t));
1413 return NO_ERROR;
1414 } break;
Eric Laurentde070132010-07-13 04:45:46 -07001415 case MOVE_EFFECTS: {
1416 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001417 audio_session_t session = (audio_session_t) data.readInt32();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001418 audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
1419 audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -07001420 reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1421 return NO_ERROR;
1422 } break;
Eric Laurentb20cf7d2019-04-05 19:37:34 -07001423 case SET_EFFECT_SUSPENDED: {
1424 CHECK_INTERFACE(IAudioFlinger, data, reply);
1425 int effectId = data.readInt32();
1426 audio_session_t sessionId = (audio_session_t) data.readInt32();
1427 bool suspended = data.readInt32() == 1;
1428 setEffectSuspended(effectId, sessionId, suspended);
1429 return NO_ERROR;
1430 } break;
Eric Laurenta4c5a552012-03-29 10:12:40 -07001431 case LOAD_HW_MODULE: {
1432 CHECK_INTERFACE(IAudioFlinger, data, reply);
1433 reply->writeInt32(loadHwModule(data.readCString()));
1434 return NO_ERROR;
1435 } break;
Glenn Kastencc0f1cf2012-09-24 11:27:18 -07001436 case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1437 CHECK_INTERFACE(IAudioFlinger, data, reply);
1438 reply->writeInt32(getPrimaryOutputSamplingRate());
1439 return NO_ERROR;
1440 } break;
1441 case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1442 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastene03dd222014-01-28 11:04:39 -08001443 reply->writeInt64(getPrimaryOutputFrameCount());
Glenn Kastencc0f1cf2012-09-24 11:27:18 -07001444 return NO_ERROR;
1445 } break;
Glenn Kasten4182c4e2013-07-15 14:45:07 -07001446 case SET_LOW_RAM_DEVICE: {
1447 CHECK_INTERFACE(IAudioFlinger, data, reply);
Andy Hung6f248bb2018-01-23 14:04:37 -08001448 int32_t isLowRamDevice;
1449 int64_t totalMemory;
1450 const status_t status =
1451 data.readInt32(&isLowRamDevice) ?:
1452 data.readInt64(&totalMemory) ?:
1453 setLowRamDevice(isLowRamDevice != 0, totalMemory);
1454 (void)reply->writeInt32(status);
Glenn Kasten4182c4e2013-07-15 14:45:07 -07001455 return NO_ERROR;
1456 } break;
Eric Laurent4b123402014-04-11 09:22:20 -07001457 case LIST_AUDIO_PORTS: {
1458 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001459 unsigned int numPortsReq = data.readInt32();
1460 if (numPortsReq > MAX_ITEMS_PER_LIST) {
1461 numPortsReq = MAX_ITEMS_PER_LIST;
1462 }
1463 unsigned int numPorts = numPortsReq;
Eric Laurent4b123402014-04-11 09:22:20 -07001464 struct audio_port *ports =
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001465 (struct audio_port *)calloc(numPortsReq,
Eric Laurent4b123402014-04-11 09:22:20 -07001466 sizeof(struct audio_port));
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001467 if (ports == NULL) {
1468 reply->writeInt32(NO_MEMORY);
1469 reply->writeInt32(0);
1470 return NO_ERROR;
1471 }
1472 status_t status = listAudioPorts(&numPorts, ports);
Eric Laurent4b123402014-04-11 09:22:20 -07001473 reply->writeInt32(status);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001474 reply->writeInt32(numPorts);
Eric Laurent4b123402014-04-11 09:22:20 -07001475 if (status == NO_ERROR) {
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001476 if (numPortsReq > numPorts) {
1477 numPortsReq = numPorts;
1478 }
1479 reply->write(ports, numPortsReq * sizeof(struct audio_port));
Eric Laurent4b123402014-04-11 09:22:20 -07001480 }
1481 free(ports);
1482 return NO_ERROR;
1483 } break;
1484 case GET_AUDIO_PORT: {
1485 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jiae995e472015-09-09 09:48:34 -07001486 struct audio_port port = {};
Eric Laurent2a451152020-10-07 13:48:21 -07001487 status_t status = data.read(&port, sizeof(struct audio_port));
1488 if (status != NO_ERROR) {
Wei Jiae995e472015-09-09 09:48:34 -07001489 ALOGE("b/23905951");
Eric Laurent2a451152020-10-07 13:48:21 -07001490 return status;
Wei Jiae995e472015-09-09 09:48:34 -07001491 }
Eric Laurent2a451152020-10-07 13:48:21 -07001492 status = AudioSanitizer::sanitizeAudioPort(&port);
1493 if (status == NO_ERROR) {
1494 status = getAudioPort(&port);
1495 }
Eric Laurent4b123402014-04-11 09:22:20 -07001496 reply->writeInt32(status);
1497 if (status == NO_ERROR) {
1498 reply->write(&port, sizeof(struct audio_port));
1499 }
1500 return NO_ERROR;
1501 } break;
1502 case CREATE_AUDIO_PATCH: {
1503 CHECK_INTERFACE(IAudioFlinger, data, reply);
1504 struct audio_patch patch;
Eric Laurent2a451152020-10-07 13:48:21 -07001505 status_t status = data.read(&patch, sizeof(struct audio_patch));
1506 if (status != NO_ERROR) {
1507 return status;
Wei Jiae995e472015-09-09 09:48:34 -07001508 }
Eric Laurent2a451152020-10-07 13:48:21 -07001509 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
1510 status = data.read(&handle, sizeof(audio_patch_handle_t));
1511 if (status != NO_ERROR) {
1512 ALOGE("b/23905951");
1513 return status;
1514 }
1515 status = AudioSanitizer::sanitizeAudioPatch(&patch);
1516 if (status == NO_ERROR) {
1517 status = createAudioPatch(&patch, &handle);
1518 }
Eric Laurent4b123402014-04-11 09:22:20 -07001519 reply->writeInt32(status);
1520 if (status == NO_ERROR) {
1521 reply->write(&handle, sizeof(audio_patch_handle_t));
1522 }
1523 return NO_ERROR;
1524 } break;
1525 case RELEASE_AUDIO_PATCH: {
1526 CHECK_INTERFACE(IAudioFlinger, data, reply);
1527 audio_patch_handle_t handle;
1528 data.read(&handle, sizeof(audio_patch_handle_t));
1529 status_t status = releaseAudioPatch(handle);
1530 reply->writeInt32(status);
1531 return NO_ERROR;
1532 } break;
1533 case LIST_AUDIO_PATCHES: {
1534 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001535 unsigned int numPatchesReq = data.readInt32();
1536 if (numPatchesReq > MAX_ITEMS_PER_LIST) {
1537 numPatchesReq = MAX_ITEMS_PER_LIST;
1538 }
1539 unsigned int numPatches = numPatchesReq;
Eric Laurent4b123402014-04-11 09:22:20 -07001540 struct audio_patch *patches =
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001541 (struct audio_patch *)calloc(numPatchesReq,
Eric Laurent4b123402014-04-11 09:22:20 -07001542 sizeof(struct audio_patch));
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001543 if (patches == NULL) {
1544 reply->writeInt32(NO_MEMORY);
1545 reply->writeInt32(0);
1546 return NO_ERROR;
1547 }
1548 status_t status = listAudioPatches(&numPatches, patches);
Eric Laurent4b123402014-04-11 09:22:20 -07001549 reply->writeInt32(status);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001550 reply->writeInt32(numPatches);
Eric Laurent4b123402014-04-11 09:22:20 -07001551 if (status == NO_ERROR) {
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001552 if (numPatchesReq > numPatches) {
1553 numPatchesReq = numPatches;
1554 }
1555 reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
Eric Laurent4b123402014-04-11 09:22:20 -07001556 }
1557 free(patches);
1558 return NO_ERROR;
1559 } break;
1560 case SET_AUDIO_PORT_CONFIG: {
1561 CHECK_INTERFACE(IAudioFlinger, data, reply);
1562 struct audio_port_config config;
Eric Laurent2a451152020-10-07 13:48:21 -07001563 status_t status = data.read(&config, sizeof(struct audio_port_config));
1564 if (status != NO_ERROR) {
1565 return status;
1566 }
1567 status = AudioSanitizer::sanitizeAudioPortConfig(&config);
1568 if (status == NO_ERROR) {
1569 status = setAudioPortConfig(&config);
1570 }
Eric Laurent4b123402014-04-11 09:22:20 -07001571 reply->writeInt32(status);
1572 return NO_ERROR;
1573 } break;
Glenn Kasten9eae0362016-04-19 09:09:14 -07001574 case GET_AUDIO_HW_SYNC_FOR_SESSION: {
Eric Laurent93c3d412014-08-01 14:48:35 -07001575 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001576 reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32()));
Eric Laurent93c3d412014-08-01 14:48:35 -07001577 return NO_ERROR;
1578 } break;
Eric Laurent72e3f392015-05-20 14:43:50 -07001579 case SYSTEM_READY: {
1580 CHECK_INTERFACE(IAudioFlinger, data, reply);
1581 systemReady();
1582 return NO_ERROR;
1583 } break;
Glenn Kasten4a8308b2016-04-18 14:10:01 -07001584 case FRAME_COUNT_HAL: {
1585 CHECK_INTERFACE(IAudioFlinger, data, reply);
1586 reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) );
1587 return NO_ERROR;
1588 } break;
jiabin9ff780e2018-03-19 18:19:52 -07001589 case GET_MICROPHONES: {
jiabin46a76fa2018-01-05 10:18:21 -08001590 CHECK_INTERFACE(IAudioFlinger, data, reply);
1591 std::vector<media::MicrophoneInfo> microphones;
1592 status_t status = getMicrophones(&microphones);
1593 reply->writeInt32(status);
1594 if (status == NO_ERROR) {
1595 reply->writeParcelableVector(microphones);
1596 }
1597 return NO_ERROR;
1598 }
Eric Laurentb680e952019-09-27 15:40:33 -07001599 case SET_AUDIO_HAL_PIDS: {
1600 CHECK_INTERFACE(IAudioFlinger, data, reply);
1601 std::vector<pid_t> pids;
1602 int32_t size;
1603 status_t status = data.readInt32(&size);
1604 if (status != NO_ERROR) {
1605 return status;
1606 }
1607 if (size < 0) {
1608 return BAD_VALUE;
1609 }
1610 if (size > MAX_ITEMS_PER_LIST) {
1611 size = MAX_ITEMS_PER_LIST;
1612 }
1613 for (int32_t i = 0; i < size; i++) {
1614 int32_t pid;
1615 status = data.readInt32(&pid);
1616 if (status != NO_ERROR) {
1617 return status;
1618 }
1619 pids.push_back(pid);
1620 }
1621 reply->writeInt32(setAudioHalPids(pids));
1622 return NO_ERROR;
1623 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001624 default:
1625 return BBinder::onTransact(code, data, reply, flags);
1626 }
1627}
1628
1629// ----------------------------------------------------------------------------
1630
Glenn Kasten40bc9062015-03-20 09:09:33 -07001631} // namespace android