blob: 8c9d3c1b15e9ce6375e88df60ad195176e1b33b9 [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 Laurentf1047e82018-04-16 19:18:20 -070027#include <cutils/multiuser.h>
Eric Laurent3528c932018-02-23 17:17:22 -080028#include <media/TimeCheck.h>
Eric Laurent4980df22018-01-26 18:04:09 -080029#include <private/android_filesystem_config.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080030
Steven Moreland25a9e552017-04-17 14:30:39 -070031#include "IAudioFlinger.h"
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080032
33namespace android {
34
35enum {
36 CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,
Eric Laurentf14db3c2017-12-08 14:20:36 -080037 CREATE_RECORD,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080038 SAMPLE_RATE,
Glenn Kasten5876f2f2012-11-30 10:52:16 -080039 RESERVED, // obsolete, was CHANNEL_COUNT
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080040 FORMAT,
41 FRAME_COUNT,
42 LATENCY,
43 SET_MASTER_VOLUME,
44 SET_MASTER_MUTE,
45 MASTER_VOLUME,
46 MASTER_MUTE,
47 SET_STREAM_VOLUME,
48 SET_STREAM_MUTE,
49 STREAM_VOLUME,
50 STREAM_MUTE,
51 SET_MODE,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080052 SET_MIC_MUTE,
53 GET_MIC_MUTE,
Svet Ganovf4ddfef2018-01-16 07:37:58 -080054 SET_RECORD_SILENCED,
Eric Laurentc2f1f072009-07-17 12:17:14 -070055 SET_PARAMETERS,
56 GET_PARAMETERS,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080057 REGISTER_CLIENT,
58 GET_INPUTBUFFERSIZE,
Eric Laurentc2f1f072009-07-17 12:17:14 -070059 OPEN_OUTPUT,
60 OPEN_DUPLICATE_OUTPUT,
61 CLOSE_OUTPUT,
62 SUSPEND_OUTPUT,
63 RESTORE_OUTPUT,
64 OPEN_INPUT,
65 CLOSE_INPUT,
Glenn Kastend2304db2014-02-03 07:40:31 -080066 INVALIDATE_STREAM,
Eric Laurent342e9cf2010-01-19 17:37:09 -080067 SET_VOICE_VOLUME,
Eric Laurent05bca2f2010-02-26 02:47:27 -080068 GET_RENDER_POSITION,
Eric Laurentbe916aa2010-06-01 23:49:17 -070069 GET_INPUT_FRAMES_LOST,
Glenn Kasten9eae0362016-04-19 09:09:14 -070070 NEW_AUDIO_UNIQUE_ID,
Marco Nelissen3a34bef2011-08-02 13:33:41 -070071 ACQUIRE_AUDIO_SESSION_ID,
72 RELEASE_AUDIO_SESSION_ID,
Eric Laurentbe916aa2010-06-01 23:49:17 -070073 QUERY_NUM_EFFECTS,
Eric Laurentffe9c252010-06-23 17:38:20 -070074 QUERY_EFFECT,
Eric Laurentbe916aa2010-06-01 23:49:17 -070075 GET_EFFECT_DESCRIPTOR,
Eric Laurentde070132010-07-13 04:45:46 -070076 CREATE_EFFECT,
Eric Laurenta4c5a552012-03-29 10:12:40 -070077 MOVE_EFFECTS,
Glenn Kastencc0f1cf2012-09-24 11:27:18 -070078 LOAD_HW_MODULE,
79 GET_PRIMARY_OUTPUT_SAMPLING_RATE,
80 GET_PRIMARY_OUTPUT_FRAME_COUNT,
Glenn Kasten4182c4e2013-07-15 14:45:07 -070081 SET_LOW_RAM_DEVICE,
Eric Laurent4b123402014-04-11 09:22:20 -070082 LIST_AUDIO_PORTS,
83 GET_AUDIO_PORT,
84 CREATE_AUDIO_PATCH,
85 RELEASE_AUDIO_PATCH,
86 LIST_AUDIO_PATCHES,
Eric Laurent93c3d412014-08-01 14:48:35 -070087 SET_AUDIO_PORT_CONFIG,
Glenn Kasten9eae0362016-04-19 09:09:14 -070088 GET_AUDIO_HW_SYNC_FOR_SESSION,
Glenn Kasten4a8308b2016-04-18 14:10:01 -070089 SYSTEM_READY,
90 FRAME_COUNT_HAL,
jiabin9ff780e2018-03-19 18:19:52 -070091 GET_MICROPHONES,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080092};
93
Eric Laurentf75c2fe2015-04-02 13:49:15 -070094#define MAX_ITEMS_PER_LIST 1024
95
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080096class BpAudioFlinger : public BpInterface<IAudioFlinger>
97{
98public:
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -070099 explicit BpAudioFlinger(const sp<IBinder>& impl)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800100 : BpInterface<IAudioFlinger>(impl)
101 {
102 }
103
Eric Laurent21da6472017-11-09 16:29:26 -0800104 virtual sp<IAudioTrack> createTrack(const CreateTrackInput& input,
105 CreateTrackOutput& output,
106 status_t *status)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800107 {
108 Parcel data, reply;
Eric Laurent5841db72009-09-09 05:16:08 -0700109 sp<IAudioTrack> track;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800110 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurent21da6472017-11-09 16:29:26 -0800111
112 if (status == nullptr) {
113 return track;
Eric Laurent3d00aa62013-09-24 09:53:27 -0700114 }
Eric Laurent21da6472017-11-09 16:29:26 -0800115
116 input.writeToParcel(&data);
117
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800118 status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
119 if (lStatus != NO_ERROR) {
Eric Laurent21da6472017-11-09 16:29:26 -0800120 ALOGE("createTrack transaction error %d", lStatus);
121 *status = DEAD_OBJECT;
122 return track;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800123 }
Eric Laurent21da6472017-11-09 16:29:26 -0800124 *status = reply.readInt32();
125 if (*status != NO_ERROR) {
126 ALOGE("createTrack returned error %d", *status);
127 return track;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800128 }
Eric Laurent21da6472017-11-09 16:29:26 -0800129 track = interface_cast<IAudioTrack>(reply.readStrongBinder());
130 if (track == 0) {
131 ALOGE("createTrack returned an NULL IAudioTrack with status OK");
132 *status = DEAD_OBJECT;
133 return track;
134 }
135 output.readFromParcel(&reply);
Eric Laurent5841db72009-09-09 05:16:08 -0700136 return track;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800137 }
138
Eric Laurentf14db3c2017-12-08 14:20:36 -0800139 virtual sp<media::IAudioRecord> createRecord(const CreateRecordInput& input,
140 CreateRecordOutput& output,
141 status_t *status)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800142 {
143 Parcel data, reply;
Ivan Lozanoff6900d2017-08-01 15:47:38 -0700144 sp<media::IAudioRecord> record;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800145 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentf14db3c2017-12-08 14:20:36 -0800146
147 if (status == nullptr) {
148 return record;
Eric Laurentbe916aa2010-06-01 23:49:17 -0700149 }
Eric Laurentf14db3c2017-12-08 14:20:36 -0800150
151 input.writeToParcel(&data);
152
153 status_t lStatus = remote()->transact(CREATE_RECORD, data, &reply);
Eric Laurent5841db72009-09-09 05:16:08 -0700154 if (lStatus != NO_ERROR) {
Eric Laurentf14db3c2017-12-08 14:20:36 -0800155 ALOGE("createRecord transaction error %d", lStatus);
156 *status = DEAD_OBJECT;
157 return record;
Eric Laurent5841db72009-09-09 05:16:08 -0700158 }
Eric Laurentf14db3c2017-12-08 14:20:36 -0800159 *status = reply.readInt32();
160 if (*status != NO_ERROR) {
161 ALOGE("createRecord returned error %d", *status);
162 return record;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800163 }
Eric Laurentf14db3c2017-12-08 14:20:36 -0800164
165 record = interface_cast<media::IAudioRecord>(reply.readStrongBinder());
166 if (record == 0) {
167 ALOGE("createRecord returned a NULL IAudioRecord with status OK");
168 *status = DEAD_OBJECT;
169 return record;
170 }
171 output.readFromParcel(&reply);
Eric Laurent5841db72009-09-09 05:16:08 -0700172 return record;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800173 }
174
Glenn Kasten2c073da2016-02-26 09:14:08 -0800175 virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800176 {
177 Parcel data, reply;
178 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten2c073da2016-02-26 09:14:08 -0800179 data.writeInt32((int32_t) ioHandle);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800180 remote()->transact(SAMPLE_RATE, data, &reply);
181 return reply.readInt32();
182 }
183
Glenn Kasten4a8308b2016-04-18 14:10:01 -0700184 // RESERVED for channelCount()
185
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800186 virtual audio_format_t format(audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800187 {
188 Parcel data, reply;
189 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800190 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800191 remote()->transact(FORMAT, data, &reply);
Glenn Kasten58f30212012-01-12 12:27:51 -0800192 return (audio_format_t) reply.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800193 }
194
Glenn Kasten2c073da2016-02-26 09:14:08 -0800195 virtual size_t frameCount(audio_io_handle_t ioHandle) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800196 {
197 Parcel data, reply;
198 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten2c073da2016-02-26 09:14:08 -0800199 data.writeInt32((int32_t) ioHandle);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800200 remote()->transact(FRAME_COUNT, data, &reply);
Glenn Kastene03dd222014-01-28 11:04:39 -0800201 return reply.readInt64();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800202 }
203
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800204 virtual uint32_t latency(audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800205 {
206 Parcel data, reply;
207 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800208 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800209 remote()->transact(LATENCY, data, &reply);
210 return reply.readInt32();
211 }
212
213 virtual status_t setMasterVolume(float value)
214 {
215 Parcel data, reply;
216 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
217 data.writeFloat(value);
218 remote()->transact(SET_MASTER_VOLUME, data, &reply);
219 return reply.readInt32();
220 }
221
222 virtual status_t setMasterMute(bool muted)
223 {
224 Parcel data, reply;
225 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
226 data.writeInt32(muted);
227 remote()->transact(SET_MASTER_MUTE, data, &reply);
228 return reply.readInt32();
229 }
230
231 virtual float masterVolume() const
232 {
233 Parcel data, reply;
234 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
235 remote()->transact(MASTER_VOLUME, data, &reply);
236 return reply.readFloat();
237 }
238
239 virtual bool masterMute() const
240 {
241 Parcel data, reply;
242 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
243 remote()->transact(MASTER_MUTE, data, &reply);
244 return reply.readInt32();
245 }
246
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800247 virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
248 audio_io_handle_t output)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800249 {
250 Parcel data, reply;
251 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800252 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800253 data.writeFloat(value);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800254 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800255 remote()->transact(SET_STREAM_VOLUME, data, &reply);
256 return reply.readInt32();
257 }
258
Glenn Kastenfff6d712012-01-12 16:38:12 -0800259 virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800260 {
261 Parcel data, reply;
262 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800263 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800264 data.writeInt32(muted);
265 remote()->transact(SET_STREAM_MUTE, data, &reply);
266 return reply.readInt32();
267 }
268
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800269 virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800270 {
271 Parcel data, reply;
272 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800273 data.writeInt32((int32_t) stream);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800274 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800275 remote()->transact(STREAM_VOLUME, data, &reply);
276 return reply.readFloat();
277 }
278
Glenn Kastenfff6d712012-01-12 16:38:12 -0800279 virtual bool streamMute(audio_stream_type_t stream) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800280 {
281 Parcel data, reply;
282 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800283 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800284 remote()->transact(STREAM_MUTE, data, &reply);
285 return reply.readInt32();
286 }
287
Glenn Kastenf78aee72012-01-04 11:00:47 -0800288 virtual status_t setMode(audio_mode_t mode)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800289 {
290 Parcel data, reply;
291 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
292 data.writeInt32(mode);
293 remote()->transact(SET_MODE, data, &reply);
294 return reply.readInt32();
295 }
296
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800297 virtual status_t setMicMute(bool state)
298 {
299 Parcel data, reply;
300 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
301 data.writeInt32(state);
302 remote()->transact(SET_MIC_MUTE, data, &reply);
303 return reply.readInt32();
304 }
305
306 virtual bool getMicMute() const
307 {
308 Parcel data, reply;
309 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
310 remote()->transact(GET_MIC_MUTE, data, &reply);
311 return reply.readInt32();
312 }
313
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800314 virtual void setRecordSilenced(uid_t uid, bool silenced)
315 {
316 Parcel data, reply;
317 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
318 data.writeInt32(uid);
319 data.writeInt32(silenced ? 1 : 0);
320 remote()->transact(SET_RECORD_SILENCED, data, &reply);
321 }
322
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800323 virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800324 {
325 Parcel data, reply;
326 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800327 data.writeInt32((int32_t) ioHandle);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700328 data.writeString8(keyValuePairs);
329 remote()->transact(SET_PARAMETERS, data, &reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800330 return reply.readInt32();
331 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700332
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800333 virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
Eric Laurentc2f1f072009-07-17 12:17:14 -0700334 {
335 Parcel data, reply;
336 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800337 data.writeInt32((int32_t) ioHandle);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700338 data.writeString8(keys);
339 remote()->transact(GET_PARAMETERS, data, &reply);
340 return reply.readString8();
341 }
342
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800343 virtual void registerClient(const sp<IAudioFlingerClient>& client)
344 {
345 Parcel data, reply;
346 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800347 data.writeStrongBinder(IInterface::asBinder(client));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800348 remote()->transact(REGISTER_CLIENT, data, &reply);
349 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700350
Glenn Kastendd8104c2012-07-02 12:42:44 -0700351 virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
352 audio_channel_mask_t channelMask) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800353 {
354 Parcel data, reply;
355 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
356 data.writeInt32(sampleRate);
357 data.writeInt32(format);
Glenn Kastendd8104c2012-07-02 12:42:44 -0700358 data.writeInt32(channelMask);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800359 remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
Glenn Kastene03dd222014-01-28 11:04:39 -0800360 return reply.readInt64();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800361 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700362
Eric Laurentcf2c0212014-07-25 16:20:43 -0700363 virtual status_t openOutput(audio_module_handle_t module,
364 audio_io_handle_t *output,
365 audio_config_t *config,
366 audio_devices_t *devices,
367 const String8& address,
368 uint32_t *latencyMs,
369 audio_output_flags_t flags)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800370 {
Eric Laurentcf2c0212014-07-25 16:20:43 -0700371 if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) {
372 return BAD_VALUE;
373 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800374 Parcel data, reply;
375 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurenta4c5a552012-03-29 10:12:40 -0700376 data.writeInt32(module);
Eric Laurentcf2c0212014-07-25 16:20:43 -0700377 data.write(config, sizeof(audio_config_t));
378 data.writeInt32(*devices);
379 data.writeString8(address);
Glenn Kasten18868c52012-03-07 09:15:37 -0800380 data.writeInt32((int32_t) flags);
Eric Laurentcf2c0212014-07-25 16:20:43 -0700381 status_t status = remote()->transact(OPEN_OUTPUT, data, &reply);
382 if (status != NO_ERROR) {
383 *output = AUDIO_IO_HANDLE_NONE;
384 return status;
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100385 }
Eric Laurentcf2c0212014-07-25 16:20:43 -0700386 status = (status_t)reply.readInt32();
387 if (status != NO_ERROR) {
388 *output = AUDIO_IO_HANDLE_NONE;
389 return status;
Glenn Kasten507b2862013-07-31 16:12:13 -0700390 }
Eric Laurentcf2c0212014-07-25 16:20:43 -0700391 *output = (audio_io_handle_t)reply.readInt32();
392 ALOGV("openOutput() returned output, %d", *output);
393 reply.read(config, sizeof(audio_config_t));
394 *devices = (audio_devices_t)reply.readInt32();
395 *latencyMs = reply.readInt32();
396 return NO_ERROR;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800397 }
398
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800399 virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
400 audio_io_handle_t output2)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800401 {
402 Parcel data, reply;
403 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800404 data.writeInt32((int32_t) output1);
405 data.writeInt32((int32_t) output2);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700406 remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800407 return (audio_io_handle_t) reply.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700408 }
409
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800410 virtual status_t closeOutput(audio_io_handle_t output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700411 {
412 Parcel data, reply;
413 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800414 data.writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700415 remote()->transact(CLOSE_OUTPUT, data, &reply);
416 return reply.readInt32();
417 }
418
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800419 virtual status_t suspendOutput(audio_io_handle_t output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700420 {
421 Parcel data, reply;
422 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800423 data.writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700424 remote()->transact(SUSPEND_OUTPUT, data, &reply);
425 return reply.readInt32();
426 }
427
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800428 virtual status_t restoreOutput(audio_io_handle_t output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700429 {
430 Parcel data, reply;
431 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800432 data.writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700433 remote()->transact(RESTORE_OUTPUT, data, &reply);
434 return reply.readInt32();
435 }
436
Eric Laurentcf2c0212014-07-25 16:20:43 -0700437 virtual status_t openInput(audio_module_handle_t module,
438 audio_io_handle_t *input,
439 audio_config_t *config,
440 audio_devices_t *device,
441 const String8& address,
442 audio_source_t source,
443 audio_input_flags_t flags)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700444 {
Eric Laurentcf2c0212014-07-25 16:20:43 -0700445 if (input == NULL || config == NULL || device == NULL) {
446 return BAD_VALUE;
447 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700448 Parcel data, reply;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700449 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurenta4c5a552012-03-29 10:12:40 -0700450 data.writeInt32(module);
Eric Laurentcf2c0212014-07-25 16:20:43 -0700451 data.writeInt32(*input);
452 data.write(config, sizeof(audio_config_t));
453 data.writeInt32(*device);
454 data.writeString8(address);
455 data.writeInt32(source);
Glenn Kastenec40d282014-07-15 15:31:26 -0700456 data.writeInt32(flags);
Eric Laurentcf2c0212014-07-25 16:20:43 -0700457 status_t status = remote()->transact(OPEN_INPUT, data, &reply);
458 if (status != NO_ERROR) {
459 *input = AUDIO_IO_HANDLE_NONE;
460 return status;
Glenn Kasten507b2862013-07-31 16:12:13 -0700461 }
Eric Laurentcf2c0212014-07-25 16:20:43 -0700462 status = (status_t)reply.readInt32();
463 if (status != NO_ERROR) {
464 *input = AUDIO_IO_HANDLE_NONE;
465 return status;
Glenn Kasten507b2862013-07-31 16:12:13 -0700466 }
Eric Laurentcf2c0212014-07-25 16:20:43 -0700467 *input = (audio_io_handle_t)reply.readInt32();
468 reply.read(config, sizeof(audio_config_t));
469 *device = (audio_devices_t)reply.readInt32();
470 return NO_ERROR;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700471 }
472
Eric Laurentfa2877b2009-07-28 08:44:33 -0700473 virtual status_t closeInput(int input)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700474 {
475 Parcel data, reply;
476 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700477 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700478 remote()->transact(CLOSE_INPUT, data, &reply);
479 return reply.readInt32();
480 }
481
Glenn Kastend2304db2014-02-03 07:40:31 -0800482 virtual status_t invalidateStream(audio_stream_type_t stream)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700483 {
484 Parcel data, reply;
485 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800486 data.writeInt32((int32_t) stream);
Glenn Kastend2304db2014-02-03 07:40:31 -0800487 remote()->transact(INVALIDATE_STREAM, data, &reply);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700488 return reply.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800489 }
Eric Laurentf0ee6f42009-10-21 08:14:22 -0700490
491 virtual status_t setVoiceVolume(float volume)
492 {
493 Parcel data, reply;
494 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
495 data.writeFloat(volume);
496 remote()->transact(SET_VOICE_VOLUME, data, &reply);
497 return reply.readInt32();
498 }
Eric Laurent342e9cf2010-01-19 17:37:09 -0800499
Kévin PETIT377b2ec2014-02-03 12:35:36 +0000500 virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800501 audio_io_handle_t output) const
Eric Laurent342e9cf2010-01-19 17:37:09 -0800502 {
503 Parcel data, reply;
504 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800505 data.writeInt32((int32_t) output);
Eric Laurent342e9cf2010-01-19 17:37:09 -0800506 remote()->transact(GET_RENDER_POSITION, data, &reply);
507 status_t status = reply.readInt32();
508 if (status == NO_ERROR) {
509 uint32_t tmp = reply.readInt32();
Glenn Kasten507b2862013-07-31 16:12:13 -0700510 if (halFrames != NULL) {
Eric Laurent342e9cf2010-01-19 17:37:09 -0800511 *halFrames = tmp;
512 }
513 tmp = reply.readInt32();
Glenn Kasten507b2862013-07-31 16:12:13 -0700514 if (dspFrames != NULL) {
Eric Laurent342e9cf2010-01-19 17:37:09 -0800515 *dspFrames = tmp;
516 }
517 }
518 return status;
519 }
Eric Laurent05bca2f2010-02-26 02:47:27 -0800520
Glenn Kasten5f972c02014-01-13 09:59:31 -0800521 virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const
Eric Laurent05bca2f2010-02-26 02:47:27 -0800522 {
523 Parcel data, reply;
524 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800525 data.writeInt32((int32_t) ioHandle);
Glenn Kasten5f972c02014-01-13 09:59:31 -0800526 status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
527 if (status != NO_ERROR) {
528 return 0;
529 }
530 return (uint32_t) reply.readInt32();
Eric Laurent05bca2f2010-02-26 02:47:27 -0800531 }
Eric Laurentbe916aa2010-06-01 23:49:17 -0700532
Glenn Kasteneeecb982016-02-26 10:44:04 -0800533 virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use)
Eric Laurentbe916aa2010-06-01 23:49:17 -0700534 {
535 Parcel data, reply;
536 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasteneeecb982016-02-26 10:44:04 -0800537 data.writeInt32((int32_t) use);
Glenn Kasten9eae0362016-04-19 09:09:14 -0700538 status_t status = remote()->transact(NEW_AUDIO_UNIQUE_ID, data, &reply);
539 audio_unique_id_t id = AUDIO_UNIQUE_ID_ALLOCATE;
Eric Laurentbe916aa2010-06-01 23:49:17 -0700540 if (status == NO_ERROR) {
541 id = reply.readInt32();
542 }
543 return id;
544 }
545
Glenn Kastend848eb42016-03-08 13:42:11 -0800546 virtual void acquireAudioSessionId(audio_session_t audioSession, int pid)
Marco Nelissen3a34bef2011-08-02 13:33:41 -0700547 {
548 Parcel data, reply;
549 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
550 data.writeInt32(audioSession);
Marco Nelissend457c972014-02-11 08:47:07 -0800551 data.writeInt32(pid);
Marco Nelissen3a34bef2011-08-02 13:33:41 -0700552 remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
553 }
554
Glenn Kastend848eb42016-03-08 13:42:11 -0800555 virtual void releaseAudioSessionId(audio_session_t audioSession, int pid)
Marco Nelissen3a34bef2011-08-02 13:33:41 -0700556 {
557 Parcel data, reply;
558 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
559 data.writeInt32(audioSession);
Marco Nelissend457c972014-02-11 08:47:07 -0800560 data.writeInt32(pid);
Marco Nelissen3a34bef2011-08-02 13:33:41 -0700561 remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
562 }
563
Glenn Kastenf587ba52012-01-26 16:25:10 -0800564 virtual status_t queryNumberEffects(uint32_t *numEffects) const
Eric Laurentbe916aa2010-06-01 23:49:17 -0700565 {
566 Parcel data, reply;
567 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
568 status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
569 if (status != NO_ERROR) {
570 return status;
571 }
572 status = reply.readInt32();
573 if (status != NO_ERROR) {
574 return status;
575 }
Glenn Kasten9d1f02d2012-02-08 17:47:58 -0800576 if (numEffects != NULL) {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700577 *numEffects = (uint32_t)reply.readInt32();
578 }
579 return NO_ERROR;
580 }
581
Glenn Kastenf587ba52012-01-26 16:25:10 -0800582 virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
Eric Laurentbe916aa2010-06-01 23:49:17 -0700583 {
584 if (pDescriptor == NULL) {
585 return BAD_VALUE;
586 }
587 Parcel data, reply;
588 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentffe9c252010-06-23 17:38:20 -0700589 data.writeInt32(index);
590 status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700591 if (status != NO_ERROR) {
592 return status;
593 }
594 status = reply.readInt32();
595 if (status != NO_ERROR) {
596 return status;
597 }
598 reply.read(pDescriptor, sizeof(effect_descriptor_t));
599 return NO_ERROR;
600 }
601
Glenn Kasten5e92a782012-01-30 07:40:52 -0800602 virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
Glenn Kastenf587ba52012-01-26 16:25:10 -0800603 effect_descriptor_t *pDescriptor) const
Eric Laurentbe916aa2010-06-01 23:49:17 -0700604 {
605 if (pUuid == NULL || pDescriptor == NULL) {
606 return BAD_VALUE;
607 }
608 Parcel data, reply;
609 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
610 data.write(pUuid, sizeof(effect_uuid_t));
611 status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
612 if (status != NO_ERROR) {
613 return status;
614 }
615 status = reply.readInt32();
616 if (status != NO_ERROR) {
617 return status;
618 }
619 reply.read(pDescriptor, sizeof(effect_descriptor_t));
620 return NO_ERROR;
621 }
622
Glenn Kasten8d6cc842012-02-03 11:06:53 -0800623 virtual sp<IEffect> createEffect(
Eric Laurentbe916aa2010-06-01 23:49:17 -0700624 effect_descriptor_t *pDesc,
625 const sp<IEffectClient>& client,
626 int32_t priority,
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800627 audio_io_handle_t output,
Glenn Kastend848eb42016-03-08 13:42:11 -0800628 audio_session_t sessionId,
Svet Ganovbe71aa22015-04-28 12:06:02 -0700629 const String16& opPackageName,
Eric Laurentb6436272016-12-07 19:24:50 -0800630 pid_t pid,
Eric Laurentbe916aa2010-06-01 23:49:17 -0700631 status_t *status,
632 int *id,
633 int *enabled)
634 {
635 Parcel data, reply;
636 sp<IEffect> effect;
637
638 if (pDesc == NULL) {
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700639 return effect;
Glenn Kasten507b2862013-07-31 16:12:13 -0700640 if (status != NULL) {
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700641 *status = BAD_VALUE;
642 }
643 }
Eric Laurentbe916aa2010-06-01 23:49:17 -0700644
645 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentbe916aa2010-06-01 23:49:17 -0700646 data.write(pDesc, sizeof(effect_descriptor_t));
Marco Nelissen06b46062014-11-14 07:58:25 -0800647 data.writeStrongBinder(IInterface::asBinder(client));
Eric Laurentbe916aa2010-06-01 23:49:17 -0700648 data.writeInt32(priority);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800649 data.writeInt32((int32_t) output);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700650 data.writeInt32(sessionId);
Svet Ganovbe71aa22015-04-28 12:06:02 -0700651 data.writeString16(opPackageName);
Eric Laurentb6436272016-12-07 19:24:50 -0800652 data.writeInt32((int32_t) pid);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700653
654 status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
655 if (lStatus != NO_ERROR) {
Steve Block29357bc2012-01-06 19:20:56 +0000656 ALOGE("createEffect error: %s", strerror(-lStatus));
Eric Laurentbe916aa2010-06-01 23:49:17 -0700657 } else {
658 lStatus = reply.readInt32();
659 int tmp = reply.readInt32();
Glenn Kasten507b2862013-07-31 16:12:13 -0700660 if (id != NULL) {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700661 *id = tmp;
662 }
663 tmp = reply.readInt32();
Glenn Kastena0d68332012-01-27 16:47:15 -0800664 if (enabled != NULL) {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700665 *enabled = tmp;
666 }
667 effect = interface_cast<IEffect>(reply.readStrongBinder());
668 reply.read(pDesc, sizeof(effect_descriptor_t));
669 }
Glenn Kasten507b2862013-07-31 16:12:13 -0700670 if (status != NULL) {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700671 *status = lStatus;
672 }
673
674 return effect;
675 }
Eric Laurentde070132010-07-13 04:45:46 -0700676
Glenn Kastend848eb42016-03-08 13:42:11 -0800677 virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput,
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800678 audio_io_handle_t dstOutput)
Eric Laurentde070132010-07-13 04:45:46 -0700679 {
680 Parcel data, reply;
681 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
682 data.writeInt32(session);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800683 data.writeInt32((int32_t) srcOutput);
684 data.writeInt32((int32_t) dstOutput);
Eric Laurentde070132010-07-13 04:45:46 -0700685 remote()->transact(MOVE_EFFECTS, data, &reply);
686 return reply.readInt32();
687 }
Eric Laurenta4c5a552012-03-29 10:12:40 -0700688
689 virtual audio_module_handle_t loadHwModule(const char *name)
690 {
691 Parcel data, reply;
692 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
693 data.writeCString(name);
694 remote()->transact(LOAD_HW_MODULE, data, &reply);
695 return (audio_module_handle_t) reply.readInt32();
696 }
Glenn Kastencc0f1cf2012-09-24 11:27:18 -0700697
Glenn Kasten3b16c762012-11-14 08:44:39 -0800698 virtual uint32_t getPrimaryOutputSamplingRate()
Glenn Kastencc0f1cf2012-09-24 11:27:18 -0700699 {
700 Parcel data, reply;
701 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
702 remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
703 return reply.readInt32();
704 }
705
Glenn Kastene33054e2012-11-14 12:54:39 -0800706 virtual size_t getPrimaryOutputFrameCount()
Glenn Kastencc0f1cf2012-09-24 11:27:18 -0700707 {
708 Parcel data, reply;
709 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
710 remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
Glenn Kastene03dd222014-01-28 11:04:39 -0800711 return reply.readInt64();
Glenn Kastencc0f1cf2012-09-24 11:27:18 -0700712 }
713
Andy Hung6f248bb2018-01-23 14:04:37 -0800714 virtual status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) override
Glenn Kasten4182c4e2013-07-15 14:45:07 -0700715 {
716 Parcel data, reply;
Andy Hung6f248bb2018-01-23 14:04:37 -0800717
718 static_assert(NO_ERROR == 0, "NO_ERROR must be 0");
719 return data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor())
720 ?: data.writeInt32((int) isLowRamDevice)
721 ?: data.writeInt64(totalMemory)
722 ?: remote()->transact(SET_LOW_RAM_DEVICE, data, &reply)
723 ?: reply.readInt32();
Glenn Kasten4182c4e2013-07-15 14:45:07 -0700724 }
Andy Hung6f248bb2018-01-23 14:04:37 -0800725
Eric Laurent4b123402014-04-11 09:22:20 -0700726 virtual status_t listAudioPorts(unsigned int *num_ports,
727 struct audio_port *ports)
728 {
729 if (num_ports == NULL || *num_ports == 0 || ports == NULL) {
730 return BAD_VALUE;
731 }
732 Parcel data, reply;
733 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
734 data.writeInt32(*num_ports);
735 status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
736 if (status != NO_ERROR ||
737 (status = (status_t)reply.readInt32()) != NO_ERROR) {
738 return status;
739 }
740 *num_ports = (unsigned int)reply.readInt32();
741 reply.read(ports, *num_ports * sizeof(struct audio_port));
742 return status;
743 }
744 virtual status_t getAudioPort(struct audio_port *port)
745 {
746 if (port == NULL) {
747 return BAD_VALUE;
748 }
749 Parcel data, reply;
750 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
751 data.write(port, sizeof(struct audio_port));
752 status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
753 if (status != NO_ERROR ||
754 (status = (status_t)reply.readInt32()) != NO_ERROR) {
755 return status;
756 }
757 reply.read(port, sizeof(struct audio_port));
758 return status;
759 }
760 virtual status_t createAudioPatch(const struct audio_patch *patch,
761 audio_patch_handle_t *handle)
762 {
763 if (patch == NULL || handle == NULL) {
764 return BAD_VALUE;
765 }
766 Parcel data, reply;
767 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
768 data.write(patch, sizeof(struct audio_patch));
769 data.write(handle, sizeof(audio_patch_handle_t));
770 status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
771 if (status != NO_ERROR ||
772 (status = (status_t)reply.readInt32()) != NO_ERROR) {
773 return status;
774 }
775 reply.read(handle, sizeof(audio_patch_handle_t));
776 return status;
777 }
778 virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
779 {
780 Parcel data, reply;
781 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
782 data.write(&handle, sizeof(audio_patch_handle_t));
783 status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
784 if (status != NO_ERROR) {
785 status = (status_t)reply.readInt32();
786 }
787 return status;
788 }
789 virtual status_t listAudioPatches(unsigned int *num_patches,
790 struct audio_patch *patches)
791 {
792 if (num_patches == NULL || *num_patches == 0 || patches == NULL) {
793 return BAD_VALUE;
794 }
795 Parcel data, reply;
796 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
797 data.writeInt32(*num_patches);
798 status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
799 if (status != NO_ERROR ||
800 (status = (status_t)reply.readInt32()) != NO_ERROR) {
801 return status;
802 }
803 *num_patches = (unsigned int)reply.readInt32();
804 reply.read(patches, *num_patches * sizeof(struct audio_patch));
805 return status;
806 }
807 virtual status_t setAudioPortConfig(const struct audio_port_config *config)
808 {
809 if (config == NULL) {
810 return BAD_VALUE;
811 }
812 Parcel data, reply;
813 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
814 data.write(config, sizeof(struct audio_port_config));
815 status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
816 if (status != NO_ERROR) {
817 status = (status_t)reply.readInt32();
818 }
819 return status;
820 }
Eric Laurent93c3d412014-08-01 14:48:35 -0700821 virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId)
822 {
823 Parcel data, reply;
824 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
825 data.writeInt32(sessionId);
Glenn Kasten9eae0362016-04-19 09:09:14 -0700826 status_t status = remote()->transact(GET_AUDIO_HW_SYNC_FOR_SESSION, data, &reply);
Eric Laurent93c3d412014-08-01 14:48:35 -0700827 if (status != NO_ERROR) {
828 return AUDIO_HW_SYNC_INVALID;
829 }
830 return (audio_hw_sync_t)reply.readInt32();
831 }
Eric Laurent72e3f392015-05-20 14:43:50 -0700832 virtual status_t systemReady()
833 {
834 Parcel data, reply;
835 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
836 return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY);
837 }
Glenn Kasten4a8308b2016-04-18 14:10:01 -0700838 virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const
839 {
840 Parcel data, reply;
841 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
842 data.writeInt32((int32_t) ioHandle);
843 status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply);
844 if (status != NO_ERROR) {
845 return 0;
846 }
847 return reply.readInt64();
848 }
jiabin46a76fa2018-01-05 10:18:21 -0800849 virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones)
850 {
851 Parcel data, reply;
852 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
jiabin9ff780e2018-03-19 18:19:52 -0700853 status_t status = remote()->transact(GET_MICROPHONES, data, &reply);
jiabin46a76fa2018-01-05 10:18:21 -0800854 if (status != NO_ERROR ||
855 (status = (status_t)reply.readInt32()) != NO_ERROR) {
856 return status;
857 }
858 status = reply.readParcelableVector(microphones);
859 return status;
860 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800861};
862
863IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
864
865// ----------------------------------------------------------------------
866
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800867status_t BnAudioFlinger::onTransact(
868 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
869{
Eric Laurentb1cc36b2017-12-11 12:14:16 -0800870 // make sure transactions reserved to AudioPolicyManager do not come from other processes
871 switch (code) {
872 case SET_STREAM_VOLUME:
873 case SET_STREAM_MUTE:
874 case SET_MODE:
875 case OPEN_OUTPUT:
876 case OPEN_DUPLICATE_OUTPUT:
877 case CLOSE_OUTPUT:
878 case SUSPEND_OUTPUT:
879 case RESTORE_OUTPUT:
880 case OPEN_INPUT:
881 case CLOSE_INPUT:
882 case INVALIDATE_STREAM:
883 case SET_VOICE_VOLUME:
884 case MOVE_EFFECTS:
885 case LOAD_HW_MODULE:
886 case LIST_AUDIO_PORTS:
887 case GET_AUDIO_PORT:
888 case CREATE_AUDIO_PATCH:
889 case RELEASE_AUDIO_PATCH:
890 case LIST_AUDIO_PATCHES:
891 case SET_AUDIO_PORT_CONFIG:
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800892 case SET_RECORD_SILENCED:
Eric Laurentb1cc36b2017-12-11 12:14:16 -0800893 ALOGW("%s: transaction %d received from PID %d",
894 __func__, code, IPCThreadState::self()->getCallingPid());
895 return INVALID_OPERATION;
896 default:
897 break;
898 }
899
Eric Laurent4980df22018-01-26 18:04:09 -0800900 // make sure the following transactions come from system components
901 switch (code) {
902 case SET_MASTER_VOLUME:
903 case SET_MASTER_MUTE:
904 case SET_MODE:
905 case SET_MIC_MUTE:
906 case SET_LOW_RAM_DEVICE:
Eric Laurent96c7eed2018-03-26 17:57:01 -0700907 case SYSTEM_READY: {
Eric Laurentf1047e82018-04-16 19:18:20 -0700908 if (multiuser_get_app_id(IPCThreadState::self()->getCallingUid()) >= AID_APP_START) {
Eric Laurent4980df22018-01-26 18:04:09 -0800909 ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
910 __func__, code, IPCThreadState::self()->getCallingPid(),
911 IPCThreadState::self()->getCallingUid());
912 return INVALID_OPERATION;
913 }
Eric Laurent96c7eed2018-03-26 17:57:01 -0700914 } break;
Eric Laurent4980df22018-01-26 18:04:09 -0800915 default:
916 break;
917 }
918
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800919 // Whitelist of relevant events to trigger log merging.
920 // Log merging should activate during audio activity of any kind. This are considered the
921 // most relevant events.
922 // TODO should select more wisely the items from the list
923 switch (code) {
924 case CREATE_TRACK:
Eric Laurentf14db3c2017-12-08 14:20:36 -0800925 case CREATE_RECORD:
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800926 case SET_MASTER_VOLUME:
927 case SET_MASTER_MUTE:
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800928 case SET_MIC_MUTE:
929 case SET_PARAMETERS:
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800930 case CREATE_EFFECT:
931 case SYSTEM_READY: {
932 requestLogMerge();
933 break;
934 }
935 default:
936 break;
937 }
Eric Laurentb1cc36b2017-12-11 12:14:16 -0800938
Eric Laurent3528c932018-02-23 17:17:22 -0800939 TimeCheck check("IAudioFlinger");
940
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700941 switch (code) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800942 case CREATE_TRACK: {
943 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurent21da6472017-11-09 16:29:26 -0800944
945 CreateTrackInput input;
946 if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
947 reply->writeInt32(DEAD_OBJECT);
948 return NO_ERROR;
Eric Laurent3d00aa62013-09-24 09:53:27 -0700949 }
Eric Laurent21da6472017-11-09 16:29:26 -0800950
951 status_t status;
952 CreateTrackOutput output;
953
954 sp<IAudioTrack> track= createTrack(input,
955 output,
956 &status);
957
958 LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800959 reply->writeInt32(status);
Eric Laurent21da6472017-11-09 16:29:26 -0800960 if (status != NO_ERROR) {
961 return NO_ERROR;
962 }
Marco Nelissen06b46062014-11-14 07:58:25 -0800963 reply->writeStrongBinder(IInterface::asBinder(track));
Eric Laurent21da6472017-11-09 16:29:26 -0800964 output.writeToParcel(reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800965 return NO_ERROR;
966 } break;
Eric Laurentf14db3c2017-12-08 14:20:36 -0800967 case CREATE_RECORD: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800968 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentf14db3c2017-12-08 14:20:36 -0800969
970 CreateRecordInput input;
971 if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
972 reply->writeInt32(DEAD_OBJECT);
973 return NO_ERROR;
974 }
975
976 status_t status;
977 CreateRecordOutput output;
978
979 sp<media::IAudioRecord> record = createRecord(input,
980 output,
981 &status);
982
Glenn Kastene93cf2c2013-09-24 11:52:37 -0700983 LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800984 reply->writeInt32(status);
Eric Laurentf14db3c2017-12-08 14:20:36 -0800985 if (status != NO_ERROR) {
986 return NO_ERROR;
987 }
Marco Nelissen06b46062014-11-14 07:58:25 -0800988 reply->writeStrongBinder(IInterface::asBinder(record));
Eric Laurentf14db3c2017-12-08 14:20:36 -0800989 output.writeToParcel(reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800990 return NO_ERROR;
991 } break;
992 case SAMPLE_RATE: {
993 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800994 reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800995 return NO_ERROR;
996 } break;
Glenn Kasten4a8308b2016-04-18 14:10:01 -0700997
998 // RESERVED for channelCount()
999
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001000 case FORMAT: {
1001 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001002 reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001003 return NO_ERROR;
1004 } break;
1005 case FRAME_COUNT: {
1006 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastene03dd222014-01-28 11:04:39 -08001007 reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001008 return NO_ERROR;
1009 } break;
1010 case LATENCY: {
1011 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001012 reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001013 return NO_ERROR;
1014 } break;
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001015 case SET_MASTER_VOLUME: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001016 CHECK_INTERFACE(IAudioFlinger, data, reply);
1017 reply->writeInt32( setMasterVolume(data.readFloat()) );
1018 return NO_ERROR;
1019 } break;
1020 case SET_MASTER_MUTE: {
1021 CHECK_INTERFACE(IAudioFlinger, data, reply);
1022 reply->writeInt32( setMasterMute(data.readInt32()) );
1023 return NO_ERROR;
1024 } break;
1025 case MASTER_VOLUME: {
1026 CHECK_INTERFACE(IAudioFlinger, data, reply);
1027 reply->writeFloat( masterVolume() );
1028 return NO_ERROR;
1029 } break;
1030 case MASTER_MUTE: {
1031 CHECK_INTERFACE(IAudioFlinger, data, reply);
1032 reply->writeInt32( masterMute() );
1033 return NO_ERROR;
1034 } break;
1035 case SET_STREAM_VOLUME: {
1036 CHECK_INTERFACE(IAudioFlinger, data, reply);
1037 int stream = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001038 float volume = data.readFloat();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001039 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001040 reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001041 return NO_ERROR;
1042 } break;
1043 case SET_STREAM_MUTE: {
1044 CHECK_INTERFACE(IAudioFlinger, data, reply);
1045 int stream = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001046 reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001047 return NO_ERROR;
1048 } break;
1049 case STREAM_VOLUME: {
1050 CHECK_INTERFACE(IAudioFlinger, data, reply);
1051 int stream = data.readInt32();
Eric Laurentfa2877b2009-07-28 08:44:33 -07001052 int output = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001053 reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001054 return NO_ERROR;
1055 } break;
1056 case STREAM_MUTE: {
1057 CHECK_INTERFACE(IAudioFlinger, data, reply);
1058 int stream = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001059 reply->writeInt32( streamMute((audio_stream_type_t) stream) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001060 return NO_ERROR;
1061 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001062 case SET_MODE: {
1063 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastenf78aee72012-01-04 11:00:47 -08001064 audio_mode_t mode = (audio_mode_t) data.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001065 reply->writeInt32( setMode(mode) );
1066 return NO_ERROR;
1067 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001068 case SET_MIC_MUTE: {
1069 CHECK_INTERFACE(IAudioFlinger, data, reply);
1070 int state = data.readInt32();
1071 reply->writeInt32( setMicMute(state) );
1072 return NO_ERROR;
1073 } break;
1074 case GET_MIC_MUTE: {
1075 CHECK_INTERFACE(IAudioFlinger, data, reply);
1076 reply->writeInt32( getMicMute() );
1077 return NO_ERROR;
1078 } break;
Svet Ganovf4ddfef2018-01-16 07:37:58 -08001079 case SET_RECORD_SILENCED: {
1080 CHECK_INTERFACE(IAudioFlinger, data, reply);
1081 uid_t uid = data.readInt32();
1082 audio_source_t source;
1083 data.read(&source, sizeof(audio_source_t));
1084 bool silenced = data.readInt32() == 1;
1085 setRecordSilenced(uid, silenced);
1086 return NO_ERROR;
1087 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001088 case SET_PARAMETERS: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001089 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001090 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001091 String8 keyValuePairs(data.readString8());
1092 reply->writeInt32(setParameters(ioHandle, keyValuePairs));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001093 return NO_ERROR;
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001094 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001095 case GET_PARAMETERS: {
1096 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001097 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001098 String8 keys(data.readString8());
1099 reply->writeString8(getParameters(ioHandle, keys));
1100 return NO_ERROR;
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001101 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001102
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001103 case REGISTER_CLIENT: {
1104 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001105 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
1106 data.readStrongBinder());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001107 registerClient(client);
1108 return NO_ERROR;
1109 } break;
1110 case GET_INPUTBUFFERSIZE: {
1111 CHECK_INTERFACE(IAudioFlinger, data, reply);
1112 uint32_t sampleRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -08001113 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kastendd8104c2012-07-02 12:42:44 -07001114 audio_channel_mask_t channelMask = data.readInt32();
Glenn Kastene03dd222014-01-28 11:04:39 -08001115 reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001116 return NO_ERROR;
1117 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001118 case OPEN_OUTPUT: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001119 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta4c5a552012-03-29 10:12:40 -07001120 audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
Wei Jiae995e472015-09-09 09:48:34 -07001121 audio_config_t config = {};
1122 if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1123 ALOGE("b/23905951");
1124 }
Eric Laurenta4c5a552012-03-29 10:12:40 -07001125 audio_devices_t devices = (audio_devices_t)data.readInt32();
Eric Laurentcf2c0212014-07-25 16:20:43 -07001126 String8 address(data.readString8());
Eric Laurent0ca3cf92012-04-18 09:24:29 -07001127 audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
Wei Jia983dca32015-09-10 09:47:29 -07001128 uint32_t latencyMs = 0;
Wei Jia4cac44b2015-09-16 15:01:16 -07001129 audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
Eric Laurentcf2c0212014-07-25 16:20:43 -07001130 status_t status = openOutput(module, &output, &config,
1131 &devices, address, &latencyMs, flags);
Glenn Kasten70742962014-02-18 08:00:47 -08001132 ALOGV("OPEN_OUTPUT output, %d", output);
Eric Laurentcf2c0212014-07-25 16:20:43 -07001133 reply->writeInt32((int32_t)status);
1134 if (status == NO_ERROR) {
1135 reply->writeInt32((int32_t)output);
1136 reply->write(&config, sizeof(audio_config_t));
1137 reply->writeInt32(devices);
1138 reply->writeInt32(latencyMs);
1139 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001140 return NO_ERROR;
1141 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001142 case OPEN_DUPLICATE_OUTPUT: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001143 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001144 audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
1145 audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
1146 reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001147 return NO_ERROR;
1148 } break;
1149 case CLOSE_OUTPUT: {
1150 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001151 reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001152 return NO_ERROR;
1153 } break;
1154 case SUSPEND_OUTPUT: {
1155 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001156 reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001157 return NO_ERROR;
1158 } break;
1159 case RESTORE_OUTPUT: {
1160 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001161 reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001162 return NO_ERROR;
1163 } break;
1164 case OPEN_INPUT: {
1165 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta4c5a552012-03-29 10:12:40 -07001166 audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
Eric Laurentcf2c0212014-07-25 16:20:43 -07001167 audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
Wei Jiae995e472015-09-09 09:48:34 -07001168 audio_config_t config = {};
1169 if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1170 ALOGE("b/23905951");
1171 }
Eric Laurentcf2c0212014-07-25 16:20:43 -07001172 audio_devices_t device = (audio_devices_t)data.readInt32();
1173 String8 address(data.readString8());
1174 audio_source_t source = (audio_source_t)data.readInt32();
Glenn Kastenec40d282014-07-15 15:31:26 -07001175 audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001176
Eric Laurentcf2c0212014-07-25 16:20:43 -07001177 status_t status = openInput(module, &input, &config,
1178 &device, address, source, flags);
1179 reply->writeInt32((int32_t) status);
1180 if (status == NO_ERROR) {
1181 reply->writeInt32((int32_t) input);
1182 reply->write(&config, sizeof(audio_config_t));
1183 reply->writeInt32(device);
1184 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001185 return NO_ERROR;
1186 } break;
1187 case CLOSE_INPUT: {
1188 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001189 reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001190 return NO_ERROR;
1191 } break;
Glenn Kastend2304db2014-02-03 07:40:31 -08001192 case INVALIDATE_STREAM: {
Eric Laurentc2f1f072009-07-17 12:17:14 -07001193 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend2304db2014-02-03 07:40:31 -08001194 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1195 reply->writeInt32(invalidateStream(stream));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001196 return NO_ERROR;
1197 } break;
Eric Laurentf0ee6f42009-10-21 08:14:22 -07001198 case SET_VOICE_VOLUME: {
1199 CHECK_INTERFACE(IAudioFlinger, data, reply);
1200 float volume = data.readFloat();
1201 reply->writeInt32( setVoiceVolume(volume) );
1202 return NO_ERROR;
1203 } break;
Eric Laurent342e9cf2010-01-19 17:37:09 -08001204 case GET_RENDER_POSITION: {
1205 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001206 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Wei Jia983dca32015-09-10 09:47:29 -07001207 uint32_t halFrames = 0;
1208 uint32_t dspFrames = 0;
Eric Laurent342e9cf2010-01-19 17:37:09 -08001209 status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1210 reply->writeInt32(status);
1211 if (status == NO_ERROR) {
1212 reply->writeInt32(halFrames);
1213 reply->writeInt32(dspFrames);
1214 }
1215 return NO_ERROR;
1216 }
Eric Laurent05bca2f2010-02-26 02:47:27 -08001217 case GET_INPUT_FRAMES_LOST: {
1218 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001219 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Glenn Kasten5f972c02014-01-13 09:59:31 -08001220 reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
Eric Laurent05bca2f2010-02-26 02:47:27 -08001221 return NO_ERROR;
1222 } break;
Glenn Kasten9eae0362016-04-19 09:09:14 -07001223 case NEW_AUDIO_UNIQUE_ID: {
Eric Laurentbe916aa2010-06-01 23:49:17 -07001224 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasteneeecb982016-02-26 10:44:04 -08001225 reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32()));
Eric Laurentbe916aa2010-06-01 23:49:17 -07001226 return NO_ERROR;
1227 } break;
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001228 case ACQUIRE_AUDIO_SESSION_ID: {
1229 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001230 audio_session_t audioSession = (audio_session_t) data.readInt32();
Marco Nelissend457c972014-02-11 08:47:07 -08001231 int pid = data.readInt32();
1232 acquireAudioSessionId(audioSession, pid);
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001233 return NO_ERROR;
1234 } break;
1235 case RELEASE_AUDIO_SESSION_ID: {
1236 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001237 audio_session_t audioSession = (audio_session_t) data.readInt32();
Marco Nelissend457c972014-02-11 08:47:07 -08001238 int pid = data.readInt32();
1239 releaseAudioSessionId(audioSession, pid);
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001240 return NO_ERROR;
1241 } break;
Eric Laurentbe916aa2010-06-01 23:49:17 -07001242 case QUERY_NUM_EFFECTS: {
1243 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jia983dca32015-09-10 09:47:29 -07001244 uint32_t numEffects = 0;
Eric Laurentbe916aa2010-06-01 23:49:17 -07001245 status_t status = queryNumberEffects(&numEffects);
1246 reply->writeInt32(status);
1247 if (status == NO_ERROR) {
1248 reply->writeInt32((int32_t)numEffects);
1249 }
1250 return NO_ERROR;
1251 }
Eric Laurentffe9c252010-06-23 17:38:20 -07001252 case QUERY_EFFECT: {
Eric Laurentbe916aa2010-06-01 23:49:17 -07001253 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jia983dca32015-09-10 09:47:29 -07001254 effect_descriptor_t desc = {};
Eric Laurentffe9c252010-06-23 17:38:20 -07001255 status_t status = queryEffect(data.readInt32(), &desc);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001256 reply->writeInt32(status);
1257 if (status == NO_ERROR) {
1258 reply->write(&desc, sizeof(effect_descriptor_t));
1259 }
1260 return NO_ERROR;
1261 }
1262 case GET_EFFECT_DESCRIPTOR: {
1263 CHECK_INTERFACE(IAudioFlinger, data, reply);
1264 effect_uuid_t uuid;
1265 data.read(&uuid, sizeof(effect_uuid_t));
Wei Jia983dca32015-09-10 09:47:29 -07001266 effect_descriptor_t desc = {};
Eric Laurentbe916aa2010-06-01 23:49:17 -07001267 status_t status = getEffectDescriptor(&uuid, &desc);
1268 reply->writeInt32(status);
1269 if (status == NO_ERROR) {
1270 reply->write(&desc, sizeof(effect_descriptor_t));
1271 }
1272 return NO_ERROR;
1273 }
1274 case CREATE_EFFECT: {
1275 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jiae995e472015-09-09 09:48:34 -07001276 effect_descriptor_t desc = {};
1277 if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) {
1278 ALOGE("b/23905951");
1279 }
Eric Laurentbe916aa2010-06-01 23:49:17 -07001280 sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1281 int32_t priority = data.readInt32();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001282 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kastend848eb42016-03-08 13:42:11 -08001283 audio_session_t sessionId = (audio_session_t) data.readInt32();
Svet Ganovbe71aa22015-04-28 12:06:02 -07001284 const String16 opPackageName = data.readString16();
Eric Laurentb6436272016-12-07 19:24:50 -08001285 pid_t pid = (pid_t)data.readInt32();
1286
Wei Jia983dca32015-09-10 09:47:29 -07001287 status_t status = NO_ERROR;
1288 int id = 0;
1289 int enabled = 0;
Eric Laurent05bca2f2010-02-26 02:47:27 -08001290
Glenn Kasten8d6cc842012-02-03 11:06:53 -08001291 sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
Eric Laurentb6436272016-12-07 19:24:50 -08001292 opPackageName, pid, &status, &id, &enabled);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001293 reply->writeInt32(status);
1294 reply->writeInt32(id);
1295 reply->writeInt32(enabled);
Marco Nelissen06b46062014-11-14 07:58:25 -08001296 reply->writeStrongBinder(IInterface::asBinder(effect));
Eric Laurentbe916aa2010-06-01 23:49:17 -07001297 reply->write(&desc, sizeof(effect_descriptor_t));
1298 return NO_ERROR;
1299 } break;
Eric Laurentde070132010-07-13 04:45:46 -07001300 case MOVE_EFFECTS: {
1301 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001302 audio_session_t session = (audio_session_t) data.readInt32();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001303 audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
1304 audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -07001305 reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1306 return NO_ERROR;
1307 } break;
Eric Laurenta4c5a552012-03-29 10:12:40 -07001308 case LOAD_HW_MODULE: {
1309 CHECK_INTERFACE(IAudioFlinger, data, reply);
1310 reply->writeInt32(loadHwModule(data.readCString()));
1311 return NO_ERROR;
1312 } break;
Glenn Kastencc0f1cf2012-09-24 11:27:18 -07001313 case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1314 CHECK_INTERFACE(IAudioFlinger, data, reply);
1315 reply->writeInt32(getPrimaryOutputSamplingRate());
1316 return NO_ERROR;
1317 } break;
1318 case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1319 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastene03dd222014-01-28 11:04:39 -08001320 reply->writeInt64(getPrimaryOutputFrameCount());
Glenn Kastencc0f1cf2012-09-24 11:27:18 -07001321 return NO_ERROR;
1322 } break;
Glenn Kasten4182c4e2013-07-15 14:45:07 -07001323 case SET_LOW_RAM_DEVICE: {
1324 CHECK_INTERFACE(IAudioFlinger, data, reply);
Andy Hung6f248bb2018-01-23 14:04:37 -08001325 int32_t isLowRamDevice;
1326 int64_t totalMemory;
1327 const status_t status =
1328 data.readInt32(&isLowRamDevice) ?:
1329 data.readInt64(&totalMemory) ?:
1330 setLowRamDevice(isLowRamDevice != 0, totalMemory);
1331 (void)reply->writeInt32(status);
Glenn Kasten4182c4e2013-07-15 14:45:07 -07001332 return NO_ERROR;
1333 } break;
Eric Laurent4b123402014-04-11 09:22:20 -07001334 case LIST_AUDIO_PORTS: {
1335 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001336 unsigned int numPortsReq = data.readInt32();
1337 if (numPortsReq > MAX_ITEMS_PER_LIST) {
1338 numPortsReq = MAX_ITEMS_PER_LIST;
1339 }
1340 unsigned int numPorts = numPortsReq;
Eric Laurent4b123402014-04-11 09:22:20 -07001341 struct audio_port *ports =
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001342 (struct audio_port *)calloc(numPortsReq,
Eric Laurent4b123402014-04-11 09:22:20 -07001343 sizeof(struct audio_port));
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001344 if (ports == NULL) {
1345 reply->writeInt32(NO_MEMORY);
1346 reply->writeInt32(0);
1347 return NO_ERROR;
1348 }
1349 status_t status = listAudioPorts(&numPorts, ports);
Eric Laurent4b123402014-04-11 09:22:20 -07001350 reply->writeInt32(status);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001351 reply->writeInt32(numPorts);
Eric Laurent4b123402014-04-11 09:22:20 -07001352 if (status == NO_ERROR) {
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001353 if (numPortsReq > numPorts) {
1354 numPortsReq = numPorts;
1355 }
1356 reply->write(ports, numPortsReq * sizeof(struct audio_port));
Eric Laurent4b123402014-04-11 09:22:20 -07001357 }
1358 free(ports);
1359 return NO_ERROR;
1360 } break;
1361 case GET_AUDIO_PORT: {
1362 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jiae995e472015-09-09 09:48:34 -07001363 struct audio_port port = {};
1364 if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1365 ALOGE("b/23905951");
1366 }
Eric Laurent4b123402014-04-11 09:22:20 -07001367 status_t status = getAudioPort(&port);
1368 reply->writeInt32(status);
1369 if (status == NO_ERROR) {
1370 reply->write(&port, sizeof(struct audio_port));
1371 }
1372 return NO_ERROR;
1373 } break;
1374 case CREATE_AUDIO_PATCH: {
1375 CHECK_INTERFACE(IAudioFlinger, data, reply);
1376 struct audio_patch patch;
1377 data.read(&patch, sizeof(struct audio_patch));
Glenn Kastena13cde92016-03-28 15:26:02 -07001378 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
Wei Jiae995e472015-09-09 09:48:34 -07001379 if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1380 ALOGE("b/23905951");
1381 }
Eric Laurent4b123402014-04-11 09:22:20 -07001382 status_t status = createAudioPatch(&patch, &handle);
1383 reply->writeInt32(status);
1384 if (status == NO_ERROR) {
1385 reply->write(&handle, sizeof(audio_patch_handle_t));
1386 }
1387 return NO_ERROR;
1388 } break;
1389 case RELEASE_AUDIO_PATCH: {
1390 CHECK_INTERFACE(IAudioFlinger, data, reply);
1391 audio_patch_handle_t handle;
1392 data.read(&handle, sizeof(audio_patch_handle_t));
1393 status_t status = releaseAudioPatch(handle);
1394 reply->writeInt32(status);
1395 return NO_ERROR;
1396 } break;
1397 case LIST_AUDIO_PATCHES: {
1398 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001399 unsigned int numPatchesReq = data.readInt32();
1400 if (numPatchesReq > MAX_ITEMS_PER_LIST) {
1401 numPatchesReq = MAX_ITEMS_PER_LIST;
1402 }
1403 unsigned int numPatches = numPatchesReq;
Eric Laurent4b123402014-04-11 09:22:20 -07001404 struct audio_patch *patches =
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001405 (struct audio_patch *)calloc(numPatchesReq,
Eric Laurent4b123402014-04-11 09:22:20 -07001406 sizeof(struct audio_patch));
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001407 if (patches == NULL) {
1408 reply->writeInt32(NO_MEMORY);
1409 reply->writeInt32(0);
1410 return NO_ERROR;
1411 }
1412 status_t status = listAudioPatches(&numPatches, patches);
Eric Laurent4b123402014-04-11 09:22:20 -07001413 reply->writeInt32(status);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001414 reply->writeInt32(numPatches);
Eric Laurent4b123402014-04-11 09:22:20 -07001415 if (status == NO_ERROR) {
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001416 if (numPatchesReq > numPatches) {
1417 numPatchesReq = numPatches;
1418 }
1419 reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
Eric Laurent4b123402014-04-11 09:22:20 -07001420 }
1421 free(patches);
1422 return NO_ERROR;
1423 } break;
1424 case SET_AUDIO_PORT_CONFIG: {
1425 CHECK_INTERFACE(IAudioFlinger, data, reply);
1426 struct audio_port_config config;
1427 data.read(&config, sizeof(struct audio_port_config));
1428 status_t status = setAudioPortConfig(&config);
1429 reply->writeInt32(status);
1430 return NO_ERROR;
1431 } break;
Glenn Kasten9eae0362016-04-19 09:09:14 -07001432 case GET_AUDIO_HW_SYNC_FOR_SESSION: {
Eric Laurent93c3d412014-08-01 14:48:35 -07001433 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001434 reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32()));
Eric Laurent93c3d412014-08-01 14:48:35 -07001435 return NO_ERROR;
1436 } break;
Eric Laurent72e3f392015-05-20 14:43:50 -07001437 case SYSTEM_READY: {
1438 CHECK_INTERFACE(IAudioFlinger, data, reply);
1439 systemReady();
1440 return NO_ERROR;
1441 } break;
Glenn Kasten4a8308b2016-04-18 14:10:01 -07001442 case FRAME_COUNT_HAL: {
1443 CHECK_INTERFACE(IAudioFlinger, data, reply);
1444 reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) );
1445 return NO_ERROR;
1446 } break;
jiabin9ff780e2018-03-19 18:19:52 -07001447 case GET_MICROPHONES: {
jiabin46a76fa2018-01-05 10:18:21 -08001448 CHECK_INTERFACE(IAudioFlinger, data, reply);
1449 std::vector<media::MicrophoneInfo> microphones;
1450 status_t status = getMicrophones(&microphones);
1451 reply->writeInt32(status);
1452 if (status == NO_ERROR) {
1453 reply->writeParcelableVector(microphones);
1454 }
1455 return NO_ERROR;
1456 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001457 default:
1458 return BBinder::onTransact(code, data, reply, flags);
1459 }
1460}
1461
1462// ----------------------------------------------------------------------------
1463
Glenn Kasten40bc9062015-03-20 09:09:33 -07001464} // namespace android