blob: 00af7e8ea1dc58d153d5541472b2848882574e90 [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:
Eric Laurentb1cc36b2017-12-11 12:14:16 -0800874 case OPEN_OUTPUT:
875 case OPEN_DUPLICATE_OUTPUT:
876 case CLOSE_OUTPUT:
877 case SUSPEND_OUTPUT:
878 case RESTORE_OUTPUT:
879 case OPEN_INPUT:
880 case CLOSE_INPUT:
881 case INVALIDATE_STREAM:
882 case SET_VOICE_VOLUME:
883 case MOVE_EFFECTS:
884 case LOAD_HW_MODULE:
885 case LIST_AUDIO_PORTS:
886 case GET_AUDIO_PORT:
887 case CREATE_AUDIO_PATCH:
888 case RELEASE_AUDIO_PATCH:
889 case LIST_AUDIO_PATCHES:
890 case SET_AUDIO_PORT_CONFIG:
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800891 case SET_RECORD_SILENCED:
Eric Laurentb1cc36b2017-12-11 12:14:16 -0800892 ALOGW("%s: transaction %d received from PID %d",
893 __func__, code, IPCThreadState::self()->getCallingPid());
Eric Laurentef92bff2018-04-26 10:44:50 -0700894 // return status only for non void methods
895 switch (code) {
896 case SET_RECORD_SILENCED:
897 break;
898 default:
899 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
900 break;
901 }
902 return OK;
Eric Laurentb1cc36b2017-12-11 12:14:16 -0800903 default:
904 break;
905 }
906
Eric Laurent4980df22018-01-26 18:04:09 -0800907 // make sure the following transactions come from system components
908 switch (code) {
909 case SET_MASTER_VOLUME:
910 case SET_MASTER_MUTE:
911 case SET_MODE:
912 case SET_MIC_MUTE:
913 case SET_LOW_RAM_DEVICE:
Eric Laurent96c7eed2018-03-26 17:57:01 -0700914 case SYSTEM_READY: {
Eric Laurentf1047e82018-04-16 19:18:20 -0700915 if (multiuser_get_app_id(IPCThreadState::self()->getCallingUid()) >= AID_APP_START) {
Eric Laurent4980df22018-01-26 18:04:09 -0800916 ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
917 __func__, code, IPCThreadState::self()->getCallingPid(),
918 IPCThreadState::self()->getCallingUid());
Eric Laurentef92bff2018-04-26 10:44:50 -0700919 // return status only for non void methods
920 switch (code) {
921 case SYSTEM_READY:
922 break;
923 default:
924 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
925 break;
926 }
927 return OK;
Eric Laurent4980df22018-01-26 18:04:09 -0800928 }
Eric Laurent96c7eed2018-03-26 17:57:01 -0700929 } break;
Eric Laurent4980df22018-01-26 18:04:09 -0800930 default:
931 break;
932 }
933
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800934 // Whitelist of relevant events to trigger log merging.
935 // Log merging should activate during audio activity of any kind. This are considered the
936 // most relevant events.
937 // TODO should select more wisely the items from the list
938 switch (code) {
939 case CREATE_TRACK:
Eric Laurentf14db3c2017-12-08 14:20:36 -0800940 case CREATE_RECORD:
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800941 case SET_MASTER_VOLUME:
942 case SET_MASTER_MUTE:
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800943 case SET_MIC_MUTE:
944 case SET_PARAMETERS:
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800945 case CREATE_EFFECT:
946 case SYSTEM_READY: {
947 requestLogMerge();
948 break;
949 }
950 default:
951 break;
952 }
Eric Laurentb1cc36b2017-12-11 12:14:16 -0800953
Eric Laurent3528c932018-02-23 17:17:22 -0800954 TimeCheck check("IAudioFlinger");
955
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700956 switch (code) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800957 case CREATE_TRACK: {
958 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurent21da6472017-11-09 16:29:26 -0800959
960 CreateTrackInput input;
961 if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
962 reply->writeInt32(DEAD_OBJECT);
963 return NO_ERROR;
Eric Laurent3d00aa62013-09-24 09:53:27 -0700964 }
Eric Laurent21da6472017-11-09 16:29:26 -0800965
966 status_t status;
967 CreateTrackOutput output;
968
969 sp<IAudioTrack> track= createTrack(input,
970 output,
971 &status);
972
973 LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800974 reply->writeInt32(status);
Eric Laurent21da6472017-11-09 16:29:26 -0800975 if (status != NO_ERROR) {
976 return NO_ERROR;
977 }
Marco Nelissen06b46062014-11-14 07:58:25 -0800978 reply->writeStrongBinder(IInterface::asBinder(track));
Eric Laurent21da6472017-11-09 16:29:26 -0800979 output.writeToParcel(reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800980 return NO_ERROR;
981 } break;
Eric Laurentf14db3c2017-12-08 14:20:36 -0800982 case CREATE_RECORD: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800983 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentf14db3c2017-12-08 14:20:36 -0800984
985 CreateRecordInput input;
986 if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
987 reply->writeInt32(DEAD_OBJECT);
988 return NO_ERROR;
989 }
990
991 status_t status;
992 CreateRecordOutput output;
993
994 sp<media::IAudioRecord> record = createRecord(input,
995 output,
996 &status);
997
Glenn Kastene93cf2c2013-09-24 11:52:37 -0700998 LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800999 reply->writeInt32(status);
Eric Laurentf14db3c2017-12-08 14:20:36 -08001000 if (status != NO_ERROR) {
1001 return NO_ERROR;
1002 }
Marco Nelissen06b46062014-11-14 07:58:25 -08001003 reply->writeStrongBinder(IInterface::asBinder(record));
Eric Laurentf14db3c2017-12-08 14:20:36 -08001004 output.writeToParcel(reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001005 return NO_ERROR;
1006 } break;
1007 case SAMPLE_RATE: {
1008 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001009 reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001010 return NO_ERROR;
1011 } break;
Glenn Kasten4a8308b2016-04-18 14:10:01 -07001012
1013 // RESERVED for channelCount()
1014
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001015 case FORMAT: {
1016 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001017 reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001018 return NO_ERROR;
1019 } break;
1020 case FRAME_COUNT: {
1021 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastene03dd222014-01-28 11:04:39 -08001022 reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001023 return NO_ERROR;
1024 } break;
1025 case LATENCY: {
1026 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001027 reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001028 return NO_ERROR;
1029 } break;
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001030 case SET_MASTER_VOLUME: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001031 CHECK_INTERFACE(IAudioFlinger, data, reply);
1032 reply->writeInt32( setMasterVolume(data.readFloat()) );
1033 return NO_ERROR;
1034 } break;
1035 case SET_MASTER_MUTE: {
1036 CHECK_INTERFACE(IAudioFlinger, data, reply);
1037 reply->writeInt32( setMasterMute(data.readInt32()) );
1038 return NO_ERROR;
1039 } break;
1040 case MASTER_VOLUME: {
1041 CHECK_INTERFACE(IAudioFlinger, data, reply);
1042 reply->writeFloat( masterVolume() );
1043 return NO_ERROR;
1044 } break;
1045 case MASTER_MUTE: {
1046 CHECK_INTERFACE(IAudioFlinger, data, reply);
1047 reply->writeInt32( masterMute() );
1048 return NO_ERROR;
1049 } break;
1050 case SET_STREAM_VOLUME: {
1051 CHECK_INTERFACE(IAudioFlinger, data, reply);
1052 int stream = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001053 float volume = data.readFloat();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001054 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001055 reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001056 return NO_ERROR;
1057 } break;
1058 case SET_STREAM_MUTE: {
1059 CHECK_INTERFACE(IAudioFlinger, data, reply);
1060 int stream = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001061 reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001062 return NO_ERROR;
1063 } break;
1064 case STREAM_VOLUME: {
1065 CHECK_INTERFACE(IAudioFlinger, data, reply);
1066 int stream = data.readInt32();
Eric Laurentfa2877b2009-07-28 08:44:33 -07001067 int output = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001068 reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001069 return NO_ERROR;
1070 } break;
1071 case STREAM_MUTE: {
1072 CHECK_INTERFACE(IAudioFlinger, data, reply);
1073 int stream = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001074 reply->writeInt32( streamMute((audio_stream_type_t) stream) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001075 return NO_ERROR;
1076 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001077 case SET_MODE: {
1078 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastenf78aee72012-01-04 11:00:47 -08001079 audio_mode_t mode = (audio_mode_t) data.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001080 reply->writeInt32( setMode(mode) );
1081 return NO_ERROR;
1082 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001083 case SET_MIC_MUTE: {
1084 CHECK_INTERFACE(IAudioFlinger, data, reply);
1085 int state = data.readInt32();
1086 reply->writeInt32( setMicMute(state) );
1087 return NO_ERROR;
1088 } break;
1089 case GET_MIC_MUTE: {
1090 CHECK_INTERFACE(IAudioFlinger, data, reply);
1091 reply->writeInt32( getMicMute() );
1092 return NO_ERROR;
1093 } break;
Svet Ganovf4ddfef2018-01-16 07:37:58 -08001094 case SET_RECORD_SILENCED: {
1095 CHECK_INTERFACE(IAudioFlinger, data, reply);
1096 uid_t uid = data.readInt32();
1097 audio_source_t source;
1098 data.read(&source, sizeof(audio_source_t));
1099 bool silenced = data.readInt32() == 1;
1100 setRecordSilenced(uid, silenced);
1101 return NO_ERROR;
1102 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001103 case SET_PARAMETERS: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001104 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001105 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001106 String8 keyValuePairs(data.readString8());
1107 reply->writeInt32(setParameters(ioHandle, keyValuePairs));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001108 return NO_ERROR;
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001109 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001110 case GET_PARAMETERS: {
1111 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001112 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001113 String8 keys(data.readString8());
1114 reply->writeString8(getParameters(ioHandle, keys));
1115 return NO_ERROR;
Glenn Kastene53b9ea2012-03-12 16:29:55 -07001116 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001117
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001118 case REGISTER_CLIENT: {
1119 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001120 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
1121 data.readStrongBinder());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001122 registerClient(client);
1123 return NO_ERROR;
1124 } break;
1125 case GET_INPUTBUFFERSIZE: {
1126 CHECK_INTERFACE(IAudioFlinger, data, reply);
1127 uint32_t sampleRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -08001128 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kastendd8104c2012-07-02 12:42:44 -07001129 audio_channel_mask_t channelMask = data.readInt32();
Glenn Kastene03dd222014-01-28 11:04:39 -08001130 reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001131 return NO_ERROR;
1132 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001133 case OPEN_OUTPUT: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001134 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta4c5a552012-03-29 10:12:40 -07001135 audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
Wei Jiae995e472015-09-09 09:48:34 -07001136 audio_config_t config = {};
1137 if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1138 ALOGE("b/23905951");
1139 }
Eric Laurenta4c5a552012-03-29 10:12:40 -07001140 audio_devices_t devices = (audio_devices_t)data.readInt32();
Eric Laurentcf2c0212014-07-25 16:20:43 -07001141 String8 address(data.readString8());
Eric Laurent0ca3cf92012-04-18 09:24:29 -07001142 audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
Wei Jia983dca32015-09-10 09:47:29 -07001143 uint32_t latencyMs = 0;
Wei Jia4cac44b2015-09-16 15:01:16 -07001144 audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
Eric Laurentcf2c0212014-07-25 16:20:43 -07001145 status_t status = openOutput(module, &output, &config,
1146 &devices, address, &latencyMs, flags);
Glenn Kasten70742962014-02-18 08:00:47 -08001147 ALOGV("OPEN_OUTPUT output, %d", output);
Eric Laurentcf2c0212014-07-25 16:20:43 -07001148 reply->writeInt32((int32_t)status);
1149 if (status == NO_ERROR) {
1150 reply->writeInt32((int32_t)output);
1151 reply->write(&config, sizeof(audio_config_t));
1152 reply->writeInt32(devices);
1153 reply->writeInt32(latencyMs);
1154 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001155 return NO_ERROR;
1156 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001157 case OPEN_DUPLICATE_OUTPUT: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001158 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001159 audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
1160 audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
1161 reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001162 return NO_ERROR;
1163 } break;
1164 case CLOSE_OUTPUT: {
1165 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001166 reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001167 return NO_ERROR;
1168 } break;
1169 case SUSPEND_OUTPUT: {
1170 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001171 reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001172 return NO_ERROR;
1173 } break;
1174 case RESTORE_OUTPUT: {
1175 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001176 reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001177 return NO_ERROR;
1178 } break;
1179 case OPEN_INPUT: {
1180 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta4c5a552012-03-29 10:12:40 -07001181 audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
Eric Laurentcf2c0212014-07-25 16:20:43 -07001182 audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
Wei Jiae995e472015-09-09 09:48:34 -07001183 audio_config_t config = {};
1184 if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1185 ALOGE("b/23905951");
1186 }
Eric Laurentcf2c0212014-07-25 16:20:43 -07001187 audio_devices_t device = (audio_devices_t)data.readInt32();
1188 String8 address(data.readString8());
1189 audio_source_t source = (audio_source_t)data.readInt32();
Glenn Kastenec40d282014-07-15 15:31:26 -07001190 audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001191
Eric Laurentcf2c0212014-07-25 16:20:43 -07001192 status_t status = openInput(module, &input, &config,
1193 &device, address, source, flags);
1194 reply->writeInt32((int32_t) status);
1195 if (status == NO_ERROR) {
1196 reply->writeInt32((int32_t) input);
1197 reply->write(&config, sizeof(audio_config_t));
1198 reply->writeInt32(device);
1199 }
Eric Laurentc2f1f072009-07-17 12:17:14 -07001200 return NO_ERROR;
1201 } break;
1202 case CLOSE_INPUT: {
1203 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001204 reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001205 return NO_ERROR;
1206 } break;
Glenn Kastend2304db2014-02-03 07:40:31 -08001207 case INVALIDATE_STREAM: {
Eric Laurentc2f1f072009-07-17 12:17:14 -07001208 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend2304db2014-02-03 07:40:31 -08001209 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1210 reply->writeInt32(invalidateStream(stream));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001211 return NO_ERROR;
1212 } break;
Eric Laurentf0ee6f42009-10-21 08:14:22 -07001213 case SET_VOICE_VOLUME: {
1214 CHECK_INTERFACE(IAudioFlinger, data, reply);
1215 float volume = data.readFloat();
1216 reply->writeInt32( setVoiceVolume(volume) );
1217 return NO_ERROR;
1218 } break;
Eric Laurent342e9cf2010-01-19 17:37:09 -08001219 case GET_RENDER_POSITION: {
1220 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001221 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Wei Jia983dca32015-09-10 09:47:29 -07001222 uint32_t halFrames = 0;
1223 uint32_t dspFrames = 0;
Eric Laurent342e9cf2010-01-19 17:37:09 -08001224 status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1225 reply->writeInt32(status);
1226 if (status == NO_ERROR) {
1227 reply->writeInt32(halFrames);
1228 reply->writeInt32(dspFrames);
1229 }
1230 return NO_ERROR;
1231 }
Eric Laurent05bca2f2010-02-26 02:47:27 -08001232 case GET_INPUT_FRAMES_LOST: {
1233 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001234 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Glenn Kasten5f972c02014-01-13 09:59:31 -08001235 reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
Eric Laurent05bca2f2010-02-26 02:47:27 -08001236 return NO_ERROR;
1237 } break;
Glenn Kasten9eae0362016-04-19 09:09:14 -07001238 case NEW_AUDIO_UNIQUE_ID: {
Eric Laurentbe916aa2010-06-01 23:49:17 -07001239 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasteneeecb982016-02-26 10:44:04 -08001240 reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32()));
Eric Laurentbe916aa2010-06-01 23:49:17 -07001241 return NO_ERROR;
1242 } break;
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001243 case ACQUIRE_AUDIO_SESSION_ID: {
1244 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001245 audio_session_t audioSession = (audio_session_t) data.readInt32();
Marco Nelissend457c972014-02-11 08:47:07 -08001246 int pid = data.readInt32();
1247 acquireAudioSessionId(audioSession, pid);
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001248 return NO_ERROR;
1249 } break;
1250 case RELEASE_AUDIO_SESSION_ID: {
1251 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001252 audio_session_t audioSession = (audio_session_t) data.readInt32();
Marco Nelissend457c972014-02-11 08:47:07 -08001253 int pid = data.readInt32();
1254 releaseAudioSessionId(audioSession, pid);
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001255 return NO_ERROR;
1256 } break;
Eric Laurentbe916aa2010-06-01 23:49:17 -07001257 case QUERY_NUM_EFFECTS: {
1258 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jia983dca32015-09-10 09:47:29 -07001259 uint32_t numEffects = 0;
Eric Laurentbe916aa2010-06-01 23:49:17 -07001260 status_t status = queryNumberEffects(&numEffects);
1261 reply->writeInt32(status);
1262 if (status == NO_ERROR) {
1263 reply->writeInt32((int32_t)numEffects);
1264 }
1265 return NO_ERROR;
1266 }
Eric Laurentffe9c252010-06-23 17:38:20 -07001267 case QUERY_EFFECT: {
Eric Laurentbe916aa2010-06-01 23:49:17 -07001268 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jia983dca32015-09-10 09:47:29 -07001269 effect_descriptor_t desc = {};
Eric Laurentffe9c252010-06-23 17:38:20 -07001270 status_t status = queryEffect(data.readInt32(), &desc);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001271 reply->writeInt32(status);
1272 if (status == NO_ERROR) {
1273 reply->write(&desc, sizeof(effect_descriptor_t));
1274 }
1275 return NO_ERROR;
1276 }
1277 case GET_EFFECT_DESCRIPTOR: {
1278 CHECK_INTERFACE(IAudioFlinger, data, reply);
1279 effect_uuid_t uuid;
1280 data.read(&uuid, sizeof(effect_uuid_t));
Wei Jia983dca32015-09-10 09:47:29 -07001281 effect_descriptor_t desc = {};
Eric Laurentbe916aa2010-06-01 23:49:17 -07001282 status_t status = getEffectDescriptor(&uuid, &desc);
1283 reply->writeInt32(status);
1284 if (status == NO_ERROR) {
1285 reply->write(&desc, sizeof(effect_descriptor_t));
1286 }
1287 return NO_ERROR;
1288 }
1289 case CREATE_EFFECT: {
1290 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jiae995e472015-09-09 09:48:34 -07001291 effect_descriptor_t desc = {};
1292 if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) {
1293 ALOGE("b/23905951");
1294 }
Eric Laurentbe916aa2010-06-01 23:49:17 -07001295 sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1296 int32_t priority = data.readInt32();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001297 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kastend848eb42016-03-08 13:42:11 -08001298 audio_session_t sessionId = (audio_session_t) data.readInt32();
Svet Ganovbe71aa22015-04-28 12:06:02 -07001299 const String16 opPackageName = data.readString16();
Eric Laurentb6436272016-12-07 19:24:50 -08001300 pid_t pid = (pid_t)data.readInt32();
1301
Wei Jia983dca32015-09-10 09:47:29 -07001302 status_t status = NO_ERROR;
1303 int id = 0;
1304 int enabled = 0;
Eric Laurent05bca2f2010-02-26 02:47:27 -08001305
Glenn Kasten8d6cc842012-02-03 11:06:53 -08001306 sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
Eric Laurentb6436272016-12-07 19:24:50 -08001307 opPackageName, pid, &status, &id, &enabled);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001308 reply->writeInt32(status);
1309 reply->writeInt32(id);
1310 reply->writeInt32(enabled);
Marco Nelissen06b46062014-11-14 07:58:25 -08001311 reply->writeStrongBinder(IInterface::asBinder(effect));
Eric Laurentbe916aa2010-06-01 23:49:17 -07001312 reply->write(&desc, sizeof(effect_descriptor_t));
1313 return NO_ERROR;
1314 } break;
Eric Laurentde070132010-07-13 04:45:46 -07001315 case MOVE_EFFECTS: {
1316 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001317 audio_session_t session = (audio_session_t) data.readInt32();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001318 audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
1319 audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -07001320 reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1321 return NO_ERROR;
1322 } break;
Eric Laurenta4c5a552012-03-29 10:12:40 -07001323 case LOAD_HW_MODULE: {
1324 CHECK_INTERFACE(IAudioFlinger, data, reply);
1325 reply->writeInt32(loadHwModule(data.readCString()));
1326 return NO_ERROR;
1327 } break;
Glenn Kastencc0f1cf2012-09-24 11:27:18 -07001328 case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1329 CHECK_INTERFACE(IAudioFlinger, data, reply);
1330 reply->writeInt32(getPrimaryOutputSamplingRate());
1331 return NO_ERROR;
1332 } break;
1333 case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1334 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastene03dd222014-01-28 11:04:39 -08001335 reply->writeInt64(getPrimaryOutputFrameCount());
Glenn Kastencc0f1cf2012-09-24 11:27:18 -07001336 return NO_ERROR;
1337 } break;
Glenn Kasten4182c4e2013-07-15 14:45:07 -07001338 case SET_LOW_RAM_DEVICE: {
1339 CHECK_INTERFACE(IAudioFlinger, data, reply);
Andy Hung6f248bb2018-01-23 14:04:37 -08001340 int32_t isLowRamDevice;
1341 int64_t totalMemory;
1342 const status_t status =
1343 data.readInt32(&isLowRamDevice) ?:
1344 data.readInt64(&totalMemory) ?:
1345 setLowRamDevice(isLowRamDevice != 0, totalMemory);
1346 (void)reply->writeInt32(status);
Glenn Kasten4182c4e2013-07-15 14:45:07 -07001347 return NO_ERROR;
1348 } break;
Eric Laurent4b123402014-04-11 09:22:20 -07001349 case LIST_AUDIO_PORTS: {
1350 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001351 unsigned int numPortsReq = data.readInt32();
1352 if (numPortsReq > MAX_ITEMS_PER_LIST) {
1353 numPortsReq = MAX_ITEMS_PER_LIST;
1354 }
1355 unsigned int numPorts = numPortsReq;
Eric Laurent4b123402014-04-11 09:22:20 -07001356 struct audio_port *ports =
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001357 (struct audio_port *)calloc(numPortsReq,
Eric Laurent4b123402014-04-11 09:22:20 -07001358 sizeof(struct audio_port));
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001359 if (ports == NULL) {
1360 reply->writeInt32(NO_MEMORY);
1361 reply->writeInt32(0);
1362 return NO_ERROR;
1363 }
1364 status_t status = listAudioPorts(&numPorts, ports);
Eric Laurent4b123402014-04-11 09:22:20 -07001365 reply->writeInt32(status);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001366 reply->writeInt32(numPorts);
Eric Laurent4b123402014-04-11 09:22:20 -07001367 if (status == NO_ERROR) {
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001368 if (numPortsReq > numPorts) {
1369 numPortsReq = numPorts;
1370 }
1371 reply->write(ports, numPortsReq * sizeof(struct audio_port));
Eric Laurent4b123402014-04-11 09:22:20 -07001372 }
1373 free(ports);
1374 return NO_ERROR;
1375 } break;
1376 case GET_AUDIO_PORT: {
1377 CHECK_INTERFACE(IAudioFlinger, data, reply);
Wei Jiae995e472015-09-09 09:48:34 -07001378 struct audio_port port = {};
1379 if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1380 ALOGE("b/23905951");
1381 }
Eric Laurent4b123402014-04-11 09:22:20 -07001382 status_t status = getAudioPort(&port);
1383 reply->writeInt32(status);
1384 if (status == NO_ERROR) {
1385 reply->write(&port, sizeof(struct audio_port));
1386 }
1387 return NO_ERROR;
1388 } break;
1389 case CREATE_AUDIO_PATCH: {
1390 CHECK_INTERFACE(IAudioFlinger, data, reply);
1391 struct audio_patch patch;
1392 data.read(&patch, sizeof(struct audio_patch));
Glenn Kastena13cde92016-03-28 15:26:02 -07001393 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
Wei Jiae995e472015-09-09 09:48:34 -07001394 if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1395 ALOGE("b/23905951");
1396 }
Eric Laurent4b123402014-04-11 09:22:20 -07001397 status_t status = createAudioPatch(&patch, &handle);
1398 reply->writeInt32(status);
1399 if (status == NO_ERROR) {
1400 reply->write(&handle, sizeof(audio_patch_handle_t));
1401 }
1402 return NO_ERROR;
1403 } break;
1404 case RELEASE_AUDIO_PATCH: {
1405 CHECK_INTERFACE(IAudioFlinger, data, reply);
1406 audio_patch_handle_t handle;
1407 data.read(&handle, sizeof(audio_patch_handle_t));
1408 status_t status = releaseAudioPatch(handle);
1409 reply->writeInt32(status);
1410 return NO_ERROR;
1411 } break;
1412 case LIST_AUDIO_PATCHES: {
1413 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001414 unsigned int numPatchesReq = data.readInt32();
1415 if (numPatchesReq > MAX_ITEMS_PER_LIST) {
1416 numPatchesReq = MAX_ITEMS_PER_LIST;
1417 }
1418 unsigned int numPatches = numPatchesReq;
Eric Laurent4b123402014-04-11 09:22:20 -07001419 struct audio_patch *patches =
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001420 (struct audio_patch *)calloc(numPatchesReq,
Eric Laurent4b123402014-04-11 09:22:20 -07001421 sizeof(struct audio_patch));
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001422 if (patches == NULL) {
1423 reply->writeInt32(NO_MEMORY);
1424 reply->writeInt32(0);
1425 return NO_ERROR;
1426 }
1427 status_t status = listAudioPatches(&numPatches, patches);
Eric Laurent4b123402014-04-11 09:22:20 -07001428 reply->writeInt32(status);
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001429 reply->writeInt32(numPatches);
Eric Laurent4b123402014-04-11 09:22:20 -07001430 if (status == NO_ERROR) {
Eric Laurentf75c2fe2015-04-02 13:49:15 -07001431 if (numPatchesReq > numPatches) {
1432 numPatchesReq = numPatches;
1433 }
1434 reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
Eric Laurent4b123402014-04-11 09:22:20 -07001435 }
1436 free(patches);
1437 return NO_ERROR;
1438 } break;
1439 case SET_AUDIO_PORT_CONFIG: {
1440 CHECK_INTERFACE(IAudioFlinger, data, reply);
1441 struct audio_port_config config;
1442 data.read(&config, sizeof(struct audio_port_config));
1443 status_t status = setAudioPortConfig(&config);
1444 reply->writeInt32(status);
1445 return NO_ERROR;
1446 } break;
Glenn Kasten9eae0362016-04-19 09:09:14 -07001447 case GET_AUDIO_HW_SYNC_FOR_SESSION: {
Eric Laurent93c3d412014-08-01 14:48:35 -07001448 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastend848eb42016-03-08 13:42:11 -08001449 reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32()));
Eric Laurent93c3d412014-08-01 14:48:35 -07001450 return NO_ERROR;
1451 } break;
Eric Laurent72e3f392015-05-20 14:43:50 -07001452 case SYSTEM_READY: {
1453 CHECK_INTERFACE(IAudioFlinger, data, reply);
1454 systemReady();
1455 return NO_ERROR;
1456 } break;
Glenn Kasten4a8308b2016-04-18 14:10:01 -07001457 case FRAME_COUNT_HAL: {
1458 CHECK_INTERFACE(IAudioFlinger, data, reply);
1459 reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) );
1460 return NO_ERROR;
1461 } break;
jiabin9ff780e2018-03-19 18:19:52 -07001462 case GET_MICROPHONES: {
jiabin46a76fa2018-01-05 10:18:21 -08001463 CHECK_INTERFACE(IAudioFlinger, data, reply);
1464 std::vector<media::MicrophoneInfo> microphones;
1465 status_t status = getMicrophones(&microphones);
1466 reply->writeInt32(status);
1467 if (status == NO_ERROR) {
1468 reply->writeParcelableVector(microphones);
1469 }
1470 return NO_ERROR;
1471 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001472 default:
1473 return BBinder::onTransact(code, data, reply, flags);
1474 }
1475}
1476
1477// ----------------------------------------------------------------------------
1478
Glenn Kasten40bc9062015-03-20 09:09:33 -07001479} // namespace android