blob: b4e07e03edcfbb7af166be6030c33d7016e9aa59 [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 Laurent14dc3cb2020-09-16 18:42:23 -070027#include <media/IAudioPolicyService.h>
Andy Hung4ef19fa2018-05-15 19:35:29 -070028#include <mediautils/ServiceUtilities.h>
Marco Nelissencf90b492019-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 Laurent42896a02019-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 Laurent42896a02019-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,
jiabin43810402019-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 {
jiabin43810402019-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));
jiabin43810402019-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
Ytai Ben-Tsvi9cd89812020-07-01 17:12:06 -0700657 virtual sp<media::IEffect> createEffect(
Eric Laurentbe916aa2010-06-01 23:49:17 -0700658 effect_descriptor_t *pDesc,
Ytai Ben-Tsvi9cd89812020-07-01 17:12:06 -0700659 const sp<media::IEffectClient>& client,
Eric Laurentbe916aa2010-06-01 23:49:17 -0700660 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 Laurent94876032019-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;
Ytai Ben-Tsvi9cd89812020-07-01 17:12:06 -0700672 sp<media::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 Laurent94876032019-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 Laurent94876032019-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 }
Ytai Ben-Tsvi9cd89812020-07-01 17:12:06 -0700709 effect = interface_cast<media::IEffect>(reply.readStrongBinder());
Eric Laurentbe916aa2010-06-01 23:49:17 -0700710 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 Laurent42896a02019-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 Laurent42896a02019-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
Glenn Kasten67f95702020-06-22 16:42:52 -07001005 // 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
Eric Laurent14dc3cb2020-09-16 18:42:23 -07001028 // Make sure we connect to Audio Policy Service before calling into AudioFlinger:
1029 // - AudioFlinger can call into Audio Policy Service with its global mutex held
1030 // - If this is the first time Audio Policy Service is queried from inside audioserver process
1031 // this will trigger Audio Policy Manager initialization.
1032 // - Audio Policy Manager initialization calls into AudioFlinger which will try to lock
1033 // its global mutex and a deadlock will occur.
1034 if (IPCThreadState::self()->getCallingPid() != getpid()) {
1035 AudioSystem::get_audio_policy_service();
1036 }
1037
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001038 switch (code) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001039 case CREATE_TRACK: {
1040 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurent21da6472017-11-09 16:29:26 -08001041
1042 CreateTrackInput input;
1043 if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
1044 reply->writeInt32(DEAD_OBJECT);
1045 return NO_ERROR;
Eric Laurent3d00aa62013-09-24 09:53:27 -07001046 }
Eric Laurent21da6472017-11-09 16:29:26 -08001047
1048 status_t status;
1049 CreateTrackOutput output;
1050
1051 sp<IAudioTrack> track= createTrack(input,
1052 output,
1053 &status);
1054
1055 LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001056 reply->writeInt32(status);
Eric Laurent21da6472017-11-09 16:29:26 -08001057 if (status != NO_ERROR) {
1058 return NO_ERROR;
1059 }
Marco Nelissen06b46062014-11-14 07:58:25 -08001060 reply->writeStrongBinder(IInterface::asBinder(track));
Eric Laurent21da6472017-11-09 16:29:26 -08001061 output.writeToParcel(reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001062 return NO_ERROR;
1063 } break;
Eric Laurentf14db3c2017-12-08 14:20:36 -08001064 case CREATE_RECORD: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001065 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentf14db3c2017-12-08 14:20:36 -08001066
1067 CreateRecordInput input;
1068 if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
1069 reply->writeInt32(DEAD_OBJECT);
1070 return NO_ERROR;
1071 }
1072
1073 status_t status;
1074 CreateRecordOutput output;
1075
1076 sp<media::IAudioRecord> record = createRecord(input,
1077 output,
1078 &status);
1079
Glenn Kastene93cf2c2013-09-24 11:52:37 -07001080 LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001081 reply->writeInt32(status);
Eric Laurentf14db3c2017-12-08 14:20:36 -08001082 if (status != NO_ERROR) {
1083 return NO_ERROR;
1084 }
Marco Nelissen06b46062014-11-14 07:58:25 -08001085 reply->writeStrongBinder(IInterface::asBinder(record));
Eric Laurentf14db3c2017-12-08 14:20:36 -08001086 output.writeToParcel(reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001087 return NO_ERROR;
1088 } break;
1089 case SAMPLE_RATE: {
1090 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001091 reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001092 return NO_ERROR;
1093 } break;
Glenn Kasten4a8308b2016-04-18 14:10:01 -07001094
1095 // RESERVED for channelCount()
1096
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001097 case FORMAT: {
1098 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001099 reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001100 return NO_ERROR;
1101 } break;
1102 case FRAME_COUNT: {
1103 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastene03dd222014-01-28 11:04:39 -08001104 reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001105 return NO_ERROR;
1106 } break;
1107 case LATENCY: {
1108 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001109 reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001110 return NO_ERROR;
1111 } break;
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001112 case SET_MASTER_VOLUME: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001113 CHECK_INTERFACE(IAudioFlinger, data, reply);
1114 reply->writeInt32( setMasterVolume(data.readFloat()) );
1115 return NO_ERROR;
1116 } break;
1117 case SET_MASTER_MUTE: {
1118 CHECK_INTERFACE(IAudioFlinger, data, reply);
1119 reply->writeInt32( setMasterMute(data.readInt32()) );
1120 return NO_ERROR;
1121 } break;
1122 case MASTER_VOLUME: {
1123 CHECK_INTERFACE(IAudioFlinger, data, reply);
1124 reply->writeFloat( masterVolume() );
1125 return NO_ERROR;
1126 } break;
1127 case MASTER_MUTE: {
1128 CHECK_INTERFACE(IAudioFlinger, data, reply);
1129 reply->writeInt32( masterMute() );
1130 return NO_ERROR;
1131 } break;
Richard Folke Tullberg3fae0372017-01-13 09:04:25 +01001132 case SET_MASTER_BALANCE: {
1133 CHECK_INTERFACE(IAudioFlinger, data, reply);
1134 reply->writeInt32( setMasterBalance(data.readFloat()) );
1135 return NO_ERROR;
1136 } break;
1137 case GET_MASTER_BALANCE: {
1138 CHECK_INTERFACE(IAudioFlinger, data, reply);
1139 float f;
1140 const status_t status = getMasterBalance(&f);
1141 reply->writeInt32((int32_t)status);
1142 if (status == NO_ERROR) {
1143 (void)reply->writeFloat(f);
1144 }
1145 return NO_ERROR;
1146 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001147 case SET_STREAM_VOLUME: {
1148 CHECK_INTERFACE(IAudioFlinger, data, reply);
1149 int stream = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001150 float volume = data.readFloat();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001151 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001152 reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001153 return NO_ERROR;
1154 } break;
1155 case SET_STREAM_MUTE: {
1156 CHECK_INTERFACE(IAudioFlinger, data, reply);
1157 int stream = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001158 reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001159 return NO_ERROR;
1160 } break;
1161 case STREAM_VOLUME: {
1162 CHECK_INTERFACE(IAudioFlinger, data, reply);
1163 int stream = data.readInt32();
Eric Laurentfa2877b2009-07-28 08:44:33 -07001164 int output = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001165 reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001166 return NO_ERROR;
1167 } break;
1168 case STREAM_MUTE: {
1169 CHECK_INTERFACE(IAudioFlinger, data, reply);
1170 int stream = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001171 reply->writeInt32( streamMute((audio_stream_type_t) stream) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001172 return NO_ERROR;
1173 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001174 case SET_MODE: {
1175 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastenf78aee72012-01-04 11:00:47 -08001176 audio_mode_t mode = (audio_mode_t) data.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001177 reply->writeInt32( setMode(mode) );
1178 return NO_ERROR;
1179 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001180 case SET_MIC_MUTE: {
1181 CHECK_INTERFACE(IAudioFlinger, data, reply);
1182 int state = data.readInt32();
1183 reply->writeInt32( setMicMute(state) );
1184 return NO_ERROR;
1185 } break;
1186 case GET_MIC_MUTE: {
1187 CHECK_INTERFACE(IAudioFlinger, data, reply);
1188 reply->writeInt32( getMicMute() );
1189 return NO_ERROR;
1190 } break;
Svet Ganovf4ddfef2018-01-16 07:37:58 -08001191 case SET_RECORD_SILENCED: {
1192 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurent5ada82e2019-08-29 17:53:54 -07001193 audio_port_handle_t portId = data.readInt32();
Svet Ganovf4ddfef2018-01-16 07:37:58 -08001194 bool silenced = data.readInt32() == 1;
Eric Laurent5ada82e2019-08-29 17:53:54 -07001195 setRecordSilenced(portId, silenced);
Svet Ganovf4ddfef2018-01-16 07:37:58 -08001196 return NO_ERROR;
1197 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001198 case SET_PARAMETERS: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001199 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001200 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001201 String8 keyValuePairs(data.readString8());
1202 reply->writeInt32(setParameters(ioHandle, keyValuePairs));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001203 return NO_ERROR;
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001204 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001205 case GET_PARAMETERS: {
1206 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001207 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001208 String8 keys(data.readString8());
1209 reply->writeString8(getParameters(ioHandle, keys));
1210 return NO_ERROR;
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001211 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001212
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001213 case REGISTER_CLIENT: {
1214 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001215 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
1216 data.readStrongBinder());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001217 registerClient(client);
1218 return NO_ERROR;
1219 } break;
1220 case GET_INPUTBUFFERSIZE: {
1221 CHECK_INTERFACE(IAudioFlinger, data, reply);
1222 uint32_t sampleRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -08001223 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kastendd8104c2012-07-02 12:42:44 -07001224 audio_channel_mask_t channelMask = data.readInt32();
Glenn Kastene03dd222014-01-28 11:04:39 -08001225 reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001226 return NO_ERROR;
1227 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001228 case OPEN_OUTPUT: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001229 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta4c5a552012-03-29 10:12:40 -07001230 audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
Wei Jiae995e472015-09-09 09:48:34 -07001231 audio_config_t config = {};
1232 if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1233 ALOGE("b/23905951");
1234 }
jiabin43810402019-10-24 14:58:31 -07001235 sp<DeviceDescriptorBase> device = new DeviceDescriptorBase(AUDIO_DEVICE_NONE);
1236 status_t status = NO_ERROR;
1237 if ((status = data.readParcelable(device.get())) != NO_ERROR) {
1238 reply->writeInt32((int32_t)status);
1239 return NO_ERROR;
1240 }
Eric Laurent0ca3cf92012-04-18 09:24:29 -07001241 audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
Wei Jia983dca32015-09-10 09:47:29 -07001242 uint32_t latencyMs = 0;
Wei Jia4cac44b2015-09-16 15:01:16 -07001243 audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
jiabin43810402019-10-24 14:58:31 -07001244 status = openOutput(module, &output, &config, device, &latencyMs, flags);
Glenn Kasten70742962014-02-18 08:00:47 -08001245 ALOGV("OPEN_OUTPUT output, %d", output);
Eric Laurentcf2c0212014-07-25 16:20:43 -07001246 reply->writeInt32((int32_t)status);
1247 if (status == NO_ERROR) {
1248 reply->writeInt32((int32_t)output);
1249 reply->write(&config, sizeof(audio_config_t));
Eric Laurentcf2c0212014-07-25 16:20:43 -07001250 reply->writeInt32(latencyMs);
1251 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001252 return NO_ERROR;
1253 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001254 case OPEN_DUPLICATE_OUTPUT: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001255 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001256 audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
1257 audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
1258 reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001259 return NO_ERROR;
1260 } break;
1261 case CLOSE_OUTPUT: {
1262 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001263 reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001264 return NO_ERROR;
1265 } break;
1266 case SUSPEND_OUTPUT: {
1267 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001268 reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001269 return NO_ERROR;
1270 } break;
1271 case RESTORE_OUTPUT: {
1272 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001273 reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001274 return NO_ERROR;
1275 } break;
1276 case OPEN_INPUT: {
1277 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta4c5a552012-03-29 10:12:40 -07001278 audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
Eric Laurentcf2c0212014-07-25 16:20:43 -07001279 audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
Wei Jiae995e472015-09-09 09:48:34 -07001280 audio_config_t config = {};
1281 if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1282 ALOGE("b/23905951");
1283 }
Eric Laurentcf2c0212014-07-25 16:20:43 -07001284 audio_devices_t device = (audio_devices_t)data.readInt32();
1285 String8 address(data.readString8());
1286 audio_source_t source = (audio_source_t)data.readInt32();
Glenn Kastenec40d282014-07-15 15:31:26 -07001287 audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001288
Eric Laurentcf2c0212014-07-25 16:20:43 -07001289 status_t status = openInput(module, &input, &config,
1290 &device, address, source, flags);
1291 reply->writeInt32((int32_t) status);
1292 if (status == NO_ERROR) {
1293 reply->writeInt32((int32_t) input);
1294 reply->write(&config, sizeof(audio_config_t));
1295 reply->writeInt32(device);
1296 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001297 return NO_ERROR;
1298 } break;
1299 case CLOSE_INPUT: {
1300 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001301 reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001302 return NO_ERROR;
1303 } break;
Glenn Kastend2304db2014-02-03 07:40:31 -08001304 case INVALIDATE_STREAM: {
Eric Laurentc2f1f072009-07-17 12:17:14 -07001305 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend2304db2014-02-03 07:40:31 -08001306 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1307 reply->writeInt32(invalidateStream(stream));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001308 return NO_ERROR;
1309 } break;
Eric Laurentf0ee6f42009-10-21 08:14:22 -07001310 case SET_VOICE_VOLUME: {
1311 CHECK_INTERFACE(IAudioFlinger, data, reply);
1312 float volume = data.readFloat();
1313 reply->writeInt32( setVoiceVolume(volume) );
1314 return NO_ERROR;
1315 } break;
Eric Laurent342e9cf2010-01-19 17:37:09 -08001316 case GET_RENDER_POSITION: {
1317 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001318 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Wei Jia983dca32015-09-10 09:47:29 -07001319 uint32_t halFrames = 0;
1320 uint32_t dspFrames = 0;
Eric Laurent342e9cf2010-01-19 17:37:09 -08001321 status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1322 reply->writeInt32(status);
1323 if (status == NO_ERROR) {
1324 reply->writeInt32(halFrames);
1325 reply->writeInt32(dspFrames);
1326 }
1327 return NO_ERROR;
1328 }
Eric Laurent05bca2f2010-02-26 02:47:27 -08001329 case GET_INPUT_FRAMES_LOST: {
1330 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001331 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Glenn Kasten5f972c02014-01-13 09:59:31 -08001332 reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
Eric Laurent05bca2f2010-02-26 02:47:27 -08001333 return NO_ERROR;
1334 } break;
Glenn Kasten9eae0362016-04-19 09:09:14 -07001335 case NEW_AUDIO_UNIQUE_ID: {
Eric Laurentbe916aa2010-06-01 23:49:17 -07001336 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasteneeecb982016-02-26 10:44:04 -08001337 reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32()));
Eric Laurentbe916aa2010-06-01 23:49:17 -07001338 return NO_ERROR;
1339 } break;
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001340 case ACQUIRE_AUDIO_SESSION_ID: {
1341 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001342 audio_session_t audioSession = (audio_session_t) data.readInt32();
Andy Hung8b0bfd92019-12-23 13:11:11 -08001343 const pid_t pid = (pid_t)data.readInt32();
1344 const uid_t uid = (uid_t)data.readInt32();
1345 acquireAudioSessionId(audioSession, pid, uid);
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001346 return NO_ERROR;
1347 } break;
1348 case RELEASE_AUDIO_SESSION_ID: {
1349 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001350 audio_session_t audioSession = (audio_session_t) data.readInt32();
Marco Nelissend457c972014-02-11 08:47:07 -08001351 int pid = data.readInt32();
1352 releaseAudioSessionId(audioSession, pid);
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001353 return NO_ERROR;
1354 } break;
Eric Laurentbe916aa2010-06-01 23:49:17 -07001355 case QUERY_NUM_EFFECTS: {
1356 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jia983dca32015-09-10 09:47:29 -07001357 uint32_t numEffects = 0;
Eric Laurentbe916aa2010-06-01 23:49:17 -07001358 status_t status = queryNumberEffects(&numEffects);
1359 reply->writeInt32(status);
1360 if (status == NO_ERROR) {
1361 reply->writeInt32((int32_t)numEffects);
1362 }
1363 return NO_ERROR;
1364 }
Eric Laurentffe9c252010-06-23 17:38:20 -07001365 case QUERY_EFFECT: {
Eric Laurentbe916aa2010-06-01 23:49:17 -07001366 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jia983dca32015-09-10 09:47:29 -07001367 effect_descriptor_t desc = {};
Eric Laurentffe9c252010-06-23 17:38:20 -07001368 status_t status = queryEffect(data.readInt32(), &desc);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001369 reply->writeInt32(status);
1370 if (status == NO_ERROR) {
1371 reply->write(&desc, sizeof(effect_descriptor_t));
1372 }
1373 return NO_ERROR;
1374 }
1375 case GET_EFFECT_DESCRIPTOR: {
1376 CHECK_INTERFACE(IAudioFlinger, data, reply);
Andy Hungf85d1292019-08-21 14:45:41 -07001377 effect_uuid_t uuid = {};
1378 if (data.read(&uuid, sizeof(effect_uuid_t)) != NO_ERROR) {
1379 android_errorWriteLog(0x534e4554, "139417189");
1380 }
1381 effect_uuid_t type = {};
1382 if (data.read(&type, sizeof(effect_uuid_t)) != NO_ERROR) {
1383 android_errorWriteLog(0x534e4554, "139417189");
1384 }
Ari Hausman-Cohen2046ec72018-04-24 14:00:55 -07001385 uint32_t preferredTypeFlag = data.readUint32();
Wei Jia983dca32015-09-10 09:47:29 -07001386 effect_descriptor_t desc = {};
Ari Hausman-Cohen2046ec72018-04-24 14:00:55 -07001387 status_t status = getEffectDescriptor(&uuid, &type, preferredTypeFlag, &desc);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001388 reply->writeInt32(status);
1389 if (status == NO_ERROR) {
1390 reply->write(&desc, sizeof(effect_descriptor_t));
1391 }
1392 return NO_ERROR;
1393 }
1394 case CREATE_EFFECT: {
1395 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jiae995e472015-09-09 09:48:34 -07001396 effect_descriptor_t desc = {};
1397 if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) {
1398 ALOGE("b/23905951");
1399 }
Ytai Ben-Tsvi9cd89812020-07-01 17:12:06 -07001400 sp<media::IEffectClient> client =
1401 interface_cast<media::IEffectClient>(data.readStrongBinder());
Eric Laurentbe916aa2010-06-01 23:49:17 -07001402 int32_t priority = data.readInt32();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001403 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kastend848eb42016-03-08 13:42:11 -08001404 audio_session_t sessionId = (audio_session_t) data.readInt32();
Eric Laurent94876032019-11-13 12:45:28 -08001405 AudioDeviceTypeAddr device;
1406 status_t status = NO_ERROR;
1407 if ((status = data.readParcelable(&device)) != NO_ERROR) {
1408 return status;
1409 }
Svet Ganovbe71aa22015-04-28 12:06:02 -07001410 const String16 opPackageName = data.readString16();
Eric Laurentb6436272016-12-07 19:24:50 -08001411 pid_t pid = (pid_t)data.readInt32();
Eric Laurent2fe0acd2020-03-13 14:30:46 -07001412 bool probe = data.readInt32() == 1;
Eric Laurentb6436272016-12-07 19:24:50 -08001413
Wei Jia983dca32015-09-10 09:47:29 -07001414 int id = 0;
1415 int enabled = 0;
Eric Laurent05bca2f2010-02-26 02:47:27 -08001416
Ytai Ben-Tsvi9cd89812020-07-01 17:12:06 -07001417 sp<media::IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
1418 device, opPackageName, pid, probe, &status, &id, &enabled);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001419 reply->writeInt32(status);
1420 reply->writeInt32(id);
1421 reply->writeInt32(enabled);
Marco Nelissen06b46062014-11-14 07:58:25 -08001422 reply->writeStrongBinder(IInterface::asBinder(effect));
Eric Laurentbe916aa2010-06-01 23:49:17 -07001423 reply->write(&desc, sizeof(effect_descriptor_t));
1424 return NO_ERROR;
1425 } break;
Eric Laurentde070132010-07-13 04:45:46 -07001426 case MOVE_EFFECTS: {
1427 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001428 audio_session_t session = (audio_session_t) data.readInt32();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001429 audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
1430 audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -07001431 reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1432 return NO_ERROR;
1433 } break;
Eric Laurentb20cf7d2019-04-05 19:37:34 -07001434 case SET_EFFECT_SUSPENDED: {
1435 CHECK_INTERFACE(IAudioFlinger, data, reply);
1436 int effectId = data.readInt32();
1437 audio_session_t sessionId = (audio_session_t) data.readInt32();
1438 bool suspended = data.readInt32() == 1;
1439 setEffectSuspended(effectId, sessionId, suspended);
1440 return NO_ERROR;
1441 } break;
Eric Laurenta4c5a552012-03-29 10:12:40 -07001442 case LOAD_HW_MODULE: {
1443 CHECK_INTERFACE(IAudioFlinger, data, reply);
1444 reply->writeInt32(loadHwModule(data.readCString()));
1445 return NO_ERROR;
1446 } break;
Glenn Kastencc0f1cf2012-09-24 11:27:18 -07001447 case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1448 CHECK_INTERFACE(IAudioFlinger, data, reply);
1449 reply->writeInt32(getPrimaryOutputSamplingRate());
1450 return NO_ERROR;
1451 } break;
1452 case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1453 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastene03dd222014-01-28 11:04:39 -08001454 reply->writeInt64(getPrimaryOutputFrameCount());
Glenn Kastencc0f1cf2012-09-24 11:27:18 -07001455 return NO_ERROR;
1456 } break;
Glenn Kasten4182c4e2013-07-15 14:45:07 -07001457 case SET_LOW_RAM_DEVICE: {
1458 CHECK_INTERFACE(IAudioFlinger, data, reply);
Andy Hung6f248bb2018-01-23 14:04:37 -08001459 int32_t isLowRamDevice;
1460 int64_t totalMemory;
1461 const status_t status =
1462 data.readInt32(&isLowRamDevice) ?:
1463 data.readInt64(&totalMemory) ?:
1464 setLowRamDevice(isLowRamDevice != 0, totalMemory);
1465 (void)reply->writeInt32(status);
Glenn Kasten4182c4e2013-07-15 14:45:07 -07001466 return NO_ERROR;
1467 } break;
Eric Laurent4b123402014-04-11 09:22:20 -07001468 case LIST_AUDIO_PORTS: {
1469 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001470 unsigned int numPortsReq = data.readInt32();
1471 if (numPortsReq > MAX_ITEMS_PER_LIST) {
1472 numPortsReq = MAX_ITEMS_PER_LIST;
1473 }
1474 unsigned int numPorts = numPortsReq;
Eric Laurent4b123402014-04-11 09:22:20 -07001475 struct audio_port *ports =
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001476 (struct audio_port *)calloc(numPortsReq,
Eric Laurent4b123402014-04-11 09:22:20 -07001477 sizeof(struct audio_port));
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001478 if (ports == NULL) {
1479 reply->writeInt32(NO_MEMORY);
1480 reply->writeInt32(0);
1481 return NO_ERROR;
1482 }
1483 status_t status = listAudioPorts(&numPorts, ports);
Eric Laurent4b123402014-04-11 09:22:20 -07001484 reply->writeInt32(status);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001485 reply->writeInt32(numPorts);
Eric Laurent4b123402014-04-11 09:22:20 -07001486 if (status == NO_ERROR) {
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001487 if (numPortsReq > numPorts) {
1488 numPortsReq = numPorts;
1489 }
1490 reply->write(ports, numPortsReq * sizeof(struct audio_port));
Eric Laurent4b123402014-04-11 09:22:20 -07001491 }
1492 free(ports);
1493 return NO_ERROR;
1494 } break;
1495 case GET_AUDIO_PORT: {
1496 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jiae995e472015-09-09 09:48:34 -07001497 struct audio_port port = {};
1498 if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1499 ALOGE("b/23905951");
1500 }
Eric Laurent4b123402014-04-11 09:22:20 -07001501 status_t status = getAudioPort(&port);
1502 reply->writeInt32(status);
1503 if (status == NO_ERROR) {
1504 reply->write(&port, sizeof(struct audio_port));
1505 }
1506 return NO_ERROR;
1507 } break;
1508 case CREATE_AUDIO_PATCH: {
1509 CHECK_INTERFACE(IAudioFlinger, data, reply);
1510 struct audio_patch patch;
1511 data.read(&patch, sizeof(struct audio_patch));
Glenn Kastena13cde92016-03-28 15:26:02 -07001512 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
Wei Jiae995e472015-09-09 09:48:34 -07001513 if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1514 ALOGE("b/23905951");
1515 }
Eric Laurent4b123402014-04-11 09:22:20 -07001516 status_t status = createAudioPatch(&patch, &handle);
1517 reply->writeInt32(status);
1518 if (status == NO_ERROR) {
1519 reply->write(&handle, sizeof(audio_patch_handle_t));
1520 }
1521 return NO_ERROR;
1522 } break;
1523 case RELEASE_AUDIO_PATCH: {
1524 CHECK_INTERFACE(IAudioFlinger, data, reply);
1525 audio_patch_handle_t handle;
1526 data.read(&handle, sizeof(audio_patch_handle_t));
1527 status_t status = releaseAudioPatch(handle);
1528 reply->writeInt32(status);
1529 return NO_ERROR;
1530 } break;
1531 case LIST_AUDIO_PATCHES: {
1532 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001533 unsigned int numPatchesReq = data.readInt32();
1534 if (numPatchesReq > MAX_ITEMS_PER_LIST) {
1535 numPatchesReq = MAX_ITEMS_PER_LIST;
1536 }
1537 unsigned int numPatches = numPatchesReq;
Eric Laurent4b123402014-04-11 09:22:20 -07001538 struct audio_patch *patches =
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001539 (struct audio_patch *)calloc(numPatchesReq,
Eric Laurent4b123402014-04-11 09:22:20 -07001540 sizeof(struct audio_patch));
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001541 if (patches == NULL) {
1542 reply->writeInt32(NO_MEMORY);
1543 reply->writeInt32(0);
1544 return NO_ERROR;
1545 }
1546 status_t status = listAudioPatches(&numPatches, patches);
Eric Laurent4b123402014-04-11 09:22:20 -07001547 reply->writeInt32(status);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001548 reply->writeInt32(numPatches);
Eric Laurent4b123402014-04-11 09:22:20 -07001549 if (status == NO_ERROR) {
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001550 if (numPatchesReq > numPatches) {
1551 numPatchesReq = numPatches;
1552 }
1553 reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
Eric Laurent4b123402014-04-11 09:22:20 -07001554 }
1555 free(patches);
1556 return NO_ERROR;
1557 } break;
1558 case SET_AUDIO_PORT_CONFIG: {
1559 CHECK_INTERFACE(IAudioFlinger, data, reply);
1560 struct audio_port_config config;
1561 data.read(&config, sizeof(struct audio_port_config));
1562 status_t status = setAudioPortConfig(&config);
1563 reply->writeInt32(status);
1564 return NO_ERROR;
1565 } break;
Glenn Kasten9eae0362016-04-19 09:09:14 -07001566 case GET_AUDIO_HW_SYNC_FOR_SESSION: {
Eric Laurent93c3d412014-08-01 14:48:35 -07001567 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001568 reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32()));
Eric Laurent93c3d412014-08-01 14:48:35 -07001569 return NO_ERROR;
1570 } break;
Eric Laurent72e3f392015-05-20 14:43:50 -07001571 case SYSTEM_READY: {
1572 CHECK_INTERFACE(IAudioFlinger, data, reply);
1573 systemReady();
1574 return NO_ERROR;
1575 } break;
Glenn Kasten4a8308b2016-04-18 14:10:01 -07001576 case FRAME_COUNT_HAL: {
1577 CHECK_INTERFACE(IAudioFlinger, data, reply);
1578 reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) );
1579 return NO_ERROR;
1580 } break;
jiabin9ff780e2018-03-19 18:19:52 -07001581 case GET_MICROPHONES: {
jiabin46a76fa2018-01-05 10:18:21 -08001582 CHECK_INTERFACE(IAudioFlinger, data, reply);
1583 std::vector<media::MicrophoneInfo> microphones;
1584 status_t status = getMicrophones(&microphones);
1585 reply->writeInt32(status);
1586 if (status == NO_ERROR) {
1587 reply->writeParcelableVector(microphones);
1588 }
1589 return NO_ERROR;
1590 }
Eric Laurent42896a02019-09-27 15:40:33 -07001591 case SET_AUDIO_HAL_PIDS: {
1592 CHECK_INTERFACE(IAudioFlinger, data, reply);
1593 std::vector<pid_t> pids;
1594 int32_t size;
1595 status_t status = data.readInt32(&size);
1596 if (status != NO_ERROR) {
1597 return status;
1598 }
1599 if (size < 0) {
1600 return BAD_VALUE;
1601 }
1602 if (size > MAX_ITEMS_PER_LIST) {
1603 size = MAX_ITEMS_PER_LIST;
1604 }
1605 for (int32_t i = 0; i < size; i++) {
1606 int32_t pid;
1607 status = data.readInt32(&pid);
1608 if (status != NO_ERROR) {
1609 return status;
1610 }
1611 pids.push_back(pid);
1612 }
1613 reply->writeInt32(setAudioHalPids(pids));
1614 return NO_ERROR;
1615 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001616 default:
1617 return BBinder::onTransact(code, data, reply, flags);
1618 }
1619}
1620
1621// ----------------------------------------------------------------------------
1622
Glenn Kasten40bc9062015-03-20 09:09:33 -07001623} // namespace android