blob: d248d19a82ce451a401c0c3109156575de89e3b5 [file] [log] [blame]
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001/*
Alok Kediya601e9b52013-09-27 11:55:10 +05302** Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
3** Not a Contribution.
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08004** Copyright 2007, The Android Open Source Project
5**
6** Licensed under the Apache License, Version 2.0 (the "License");
7** you may not use this file except in compliance with the License.
8** You may obtain a copy of the License at
9**
10** http://www.apache.org/licenses/LICENSE-2.0
11**
12** Unless required by applicable law or agreed to in writing, software
13** distributed under the License is distributed on an "AS IS" BASIS,
14** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15** See the License for the specific language governing permissions and
16** limitations under the License.
17*/
18
19#define LOG_TAG "IAudioFlinger"
Eric Laurentc2f1f072009-07-17 12:17:14 -070020//#define LOG_NDEBUG 0
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080021#include <utils/Log.h>
22
23#include <stdint.h>
24#include <sys/types.h>
25
Mathias Agopian75624082009-05-19 19:08:10 -070026#include <binder/Parcel.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080027
28#include <media/IAudioFlinger.h>
29
30namespace android {
31
32enum {
33 CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,
34 OPEN_RECORD,
35 SAMPLE_RATE,
Glenn Kasten5876f2f2012-11-30 10:52:16 -080036 RESERVED, // obsolete, was CHANNEL_COUNT
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080037 FORMAT,
38 FRAME_COUNT,
39 LATENCY,
40 SET_MASTER_VOLUME,
41 SET_MASTER_MUTE,
42 MASTER_VOLUME,
43 MASTER_MUTE,
44 SET_STREAM_VOLUME,
45 SET_STREAM_MUTE,
46 STREAM_VOLUME,
47 STREAM_MUTE,
48 SET_MODE,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080049 SET_MIC_MUTE,
50 GET_MIC_MUTE,
Eric Laurentc2f1f072009-07-17 12:17:14 -070051 SET_PARAMETERS,
52 GET_PARAMETERS,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080053 REGISTER_CLIENT,
54 GET_INPUTBUFFERSIZE,
Eric Laurentc2f1f072009-07-17 12:17:14 -070055 OPEN_OUTPUT,
56 OPEN_DUPLICATE_OUTPUT,
57 CLOSE_OUTPUT,
58 SUSPEND_OUTPUT,
59 RESTORE_OUTPUT,
60 OPEN_INPUT,
61 CLOSE_INPUT,
Eric Laurentf0ee6f42009-10-21 08:14:22 -070062 SET_STREAM_OUTPUT,
Eric Laurent342e9cf2010-01-19 17:37:09 -080063 SET_VOICE_VOLUME,
Eric Laurent05bca2f2010-02-26 02:47:27 -080064 GET_RENDER_POSITION,
Eric Laurentbe916aa2010-06-01 23:49:17 -070065 GET_INPUT_FRAMES_LOST,
66 NEW_AUDIO_SESSION_ID,
Marco Nelissen3a34bef2011-08-02 13:33:41 -070067 ACQUIRE_AUDIO_SESSION_ID,
68 RELEASE_AUDIO_SESSION_ID,
Eric Laurentbe916aa2010-06-01 23:49:17 -070069 QUERY_NUM_EFFECTS,
Eric Laurentffe9c252010-06-23 17:38:20 -070070 QUERY_EFFECT,
Eric Laurentbe916aa2010-06-01 23:49:17 -070071 GET_EFFECT_DESCRIPTOR,
Eric Laurentde070132010-07-13 04:45:46 -070072 CREATE_EFFECT,
Eric Laurenta4c5a552012-03-29 10:12:40 -070073 MOVE_EFFECTS,
Glenn Kastencc0f1cf2012-09-24 11:27:18 -070074 LOAD_HW_MODULE,
75 GET_PRIMARY_OUTPUT_SAMPLING_RATE,
76 GET_PRIMARY_OUTPUT_FRAME_COUNT,
Glenn Kasten4182c4e2013-07-15 14:45:07 -070077 SET_LOW_RAM_DEVICE,
Alok Kediya601e9b52013-09-27 11:55:10 +053078 CREATE_DIRECT_TRACK,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080079};
80
81class BpAudioFlinger : public BpInterface<IAudioFlinger>
82{
83public:
84 BpAudioFlinger(const sp<IBinder>& impl)
85 : BpInterface<IAudioFlinger>(impl)
86 {
87 }
88
89 virtual sp<IAudioTrack> createTrack(
Glenn Kastenfff6d712012-01-12 16:38:12 -080090 audio_stream_type_t streamType,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080091 uint32_t sampleRate,
Glenn Kasten58f30212012-01-12 12:27:51 -080092 audio_format_t format,
Glenn Kastendd8104c2012-07-02 12:42:44 -070093 audio_channel_mask_t channelMask,
Glenn Kastene33054e2012-11-14 12:54:39 -080094 size_t frameCount,
Glenn Kastene0b07172012-11-06 15:03:34 -080095 track_flags_t *flags,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080096 const sp<IMemory>& sharedBuffer,
Glenn Kasten72ef00d2012-01-17 11:09:42 -080097 audio_io_handle_t output,
Glenn Kasten3acbd052012-02-28 10:39:56 -080098 pid_t tid,
Eric Laurentbe916aa2010-06-01 23:49:17 -070099 int *sessionId,
Glenn Kastend054c322013-07-12 12:59:20 -0700100 String8& name,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800101 status_t *status)
102 {
103 Parcel data, reply;
Eric Laurent5841db72009-09-09 05:16:08 -0700104 sp<IAudioTrack> track;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800105 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800106 data.writeInt32((int32_t) streamType);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800107 data.writeInt32(sampleRate);
108 data.writeInt32(format);
Jean-Michel Trivi0d255b22011-05-24 15:53:33 -0700109 data.writeInt32(channelMask);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800110 data.writeInt32(frameCount);
Glenn Kastenb26e3e92012-11-14 08:32:08 -0800111 track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT;
Glenn Kastene0b07172012-11-06 15:03:34 -0800112 data.writeInt32(lFlags);
Eric Laurent3d00aa62013-09-24 09:53:27 -0700113 if (sharedBuffer != 0) {
114 data.writeInt32(true);
115 data.writeStrongBinder(sharedBuffer->asBinder());
116 } else {
117 data.writeInt32(false);
118 }
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800119 data.writeInt32((int32_t) output);
Glenn Kasten3acbd052012-02-28 10:39:56 -0800120 data.writeInt32((int32_t) tid);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700121 int lSessionId = 0;
122 if (sessionId != NULL) {
123 lSessionId = *sessionId;
124 }
125 data.writeInt32(lSessionId);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800126 status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
127 if (lStatus != NO_ERROR) {
Steve Block29357bc2012-01-06 19:20:56 +0000128 ALOGE("createTrack error: %s", strerror(-lStatus));
Eric Laurent5841db72009-09-09 05:16:08 -0700129 } else {
Glenn Kastene0b07172012-11-06 15:03:34 -0800130 lFlags = reply.readInt32();
131 if (flags != NULL) {
132 *flags = lFlags;
133 }
Eric Laurentbe916aa2010-06-01 23:49:17 -0700134 lSessionId = reply.readInt32();
135 if (sessionId != NULL) {
136 *sessionId = lSessionId;
137 }
Glenn Kastend054c322013-07-12 12:59:20 -0700138 name = reply.readString8();
Eric Laurent5841db72009-09-09 05:16:08 -0700139 lStatus = reply.readInt32();
140 track = interface_cast<IAudioTrack>(reply.readStrongBinder());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800141 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800142 if (status) {
143 *status = lStatus;
144 }
Eric Laurent5841db72009-09-09 05:16:08 -0700145 return track;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800146 }
147
Alok Kediya601e9b52013-09-27 11:55:10 +0530148 virtual sp<IDirectTrack> createDirectTrack(
149 pid_t pid,
150 uint32_t sampleRate,
151 audio_channel_mask_t channelMask,
152 audio_io_handle_t output,
153 int *sessionId,
154 IDirectTrackClient* client,
155 audio_stream_type_t streamType,
156 status_t *status)
157 {
158 Parcel data, reply;
159 sp<IDirectTrack> track;
160 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
161 data.writeInt32(pid);
162 data.writeInt32(sampleRate);
163 data.writeInt32(channelMask);
164 data.writeInt32((int32_t)output);
165 int lSessionId = 0;
166 if (sessionId != NULL) {
167 lSessionId = *sessionId;
168 }
169 data.writeInt32(lSessionId);
170 data.write(client, sizeof(IDirectTrackClient));
171 data.writeInt32((int32_t) streamType);
172 status_t lStatus = remote()->transact(CREATE_DIRECT_TRACK, data, &reply);
173 if (lStatus != NO_ERROR) {
174 ALOGE("createDirectTrack error: %s", strerror(-lStatus));
175 } else {
176 lSessionId = reply.readInt32();
177 if (sessionId != NULL) {
178 *sessionId = lSessionId;
179 }
180 lStatus = reply.readInt32();
181 track = interface_cast<IDirectTrack>(reply.readStrongBinder());
182 }
183 if (status) {
184 *status = lStatus;
185 }
186 return track;
187 }
188
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800189 virtual sp<IAudioRecord> openRecord(
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800190 audio_io_handle_t input,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800191 uint32_t sampleRate,
Glenn Kasten58f30212012-01-12 12:27:51 -0800192 audio_format_t format,
Glenn Kasten28b76b32012-07-03 17:24:41 -0700193 audio_channel_mask_t channelMask,
Glenn Kastene33054e2012-11-14 12:54:39 -0800194 size_t frameCount,
Glenn Kasteneeca3262013-07-31 16:12:48 -0700195 track_flags_t *flags,
Glenn Kasten1879fff2012-07-11 15:36:59 -0700196 pid_t tid,
Eric Laurentbe916aa2010-06-01 23:49:17 -0700197 int *sessionId,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800198 status_t *status)
199 {
200 Parcel data, reply;
Eric Laurent5841db72009-09-09 05:16:08 -0700201 sp<IAudioRecord> record;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800202 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800203 data.writeInt32((int32_t) input);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800204 data.writeInt32(sampleRate);
205 data.writeInt32(format);
Jean-Michel Trivi0d255b22011-05-24 15:53:33 -0700206 data.writeInt32(channelMask);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800207 data.writeInt32(frameCount);
Glenn Kasteneeca3262013-07-31 16:12:48 -0700208 track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT;
209 data.writeInt32(lFlags);
Glenn Kasten1879fff2012-07-11 15:36:59 -0700210 data.writeInt32((int32_t) tid);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700211 int lSessionId = 0;
212 if (sessionId != NULL) {
213 lSessionId = *sessionId;
214 }
215 data.writeInt32(lSessionId);
Eric Laurent5841db72009-09-09 05:16:08 -0700216 status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
217 if (lStatus != NO_ERROR) {
Steve Block29357bc2012-01-06 19:20:56 +0000218 ALOGE("openRecord error: %s", strerror(-lStatus));
Eric Laurent5841db72009-09-09 05:16:08 -0700219 } else {
Glenn Kasteneeca3262013-07-31 16:12:48 -0700220 lFlags = reply.readInt32();
221 if (flags != NULL) {
222 *flags = lFlags;
223 }
Eric Laurentbe916aa2010-06-01 23:49:17 -0700224 lSessionId = reply.readInt32();
225 if (sessionId != NULL) {
226 *sessionId = lSessionId;
227 }
Eric Laurent5841db72009-09-09 05:16:08 -0700228 lStatus = reply.readInt32();
229 record = interface_cast<IAudioRecord>(reply.readStrongBinder());
Glenn Kastene93cf2c2013-09-24 11:52:37 -0700230 if (lStatus == NO_ERROR) {
231 if (record == 0) {
232 ALOGE("openRecord should have returned an IAudioRecord");
233 lStatus = UNKNOWN_ERROR;
234 }
235 } else {
236 if (record != 0) {
237 ALOGE("openRecord returned an IAudioRecord but with status %d", lStatus);
238 record.clear();
239 }
240 }
Eric Laurent5841db72009-09-09 05:16:08 -0700241 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800242 if (status) {
243 *status = lStatus;
244 }
Eric Laurent5841db72009-09-09 05:16:08 -0700245 return record;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800246 }
247
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800248 virtual uint32_t sampleRate(audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800249 {
250 Parcel data, reply;
251 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800252 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800253 remote()->transact(SAMPLE_RATE, data, &reply);
254 return reply.readInt32();
255 }
256
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800257 virtual audio_format_t format(audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800258 {
259 Parcel data, reply;
260 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800261 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800262 remote()->transact(FORMAT, data, &reply);
Glenn Kasten58f30212012-01-12 12:27:51 -0800263 return (audio_format_t) reply.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800264 }
265
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800266 virtual size_t frameCount(audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800267 {
268 Parcel data, reply;
269 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800270 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800271 remote()->transact(FRAME_COUNT, data, &reply);
272 return reply.readInt32();
273 }
274
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800275 virtual uint32_t latency(audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800276 {
277 Parcel data, reply;
278 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800279 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800280 remote()->transact(LATENCY, data, &reply);
281 return reply.readInt32();
282 }
283
284 virtual status_t setMasterVolume(float value)
285 {
286 Parcel data, reply;
287 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
288 data.writeFloat(value);
289 remote()->transact(SET_MASTER_VOLUME, data, &reply);
290 return reply.readInt32();
291 }
292
293 virtual status_t setMasterMute(bool muted)
294 {
295 Parcel data, reply;
296 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
297 data.writeInt32(muted);
298 remote()->transact(SET_MASTER_MUTE, data, &reply);
299 return reply.readInt32();
300 }
301
302 virtual float masterVolume() const
303 {
304 Parcel data, reply;
305 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
306 remote()->transact(MASTER_VOLUME, data, &reply);
307 return reply.readFloat();
308 }
309
310 virtual bool masterMute() const
311 {
312 Parcel data, reply;
313 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
314 remote()->transact(MASTER_MUTE, data, &reply);
315 return reply.readInt32();
316 }
317
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800318 virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
319 audio_io_handle_t output)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800320 {
321 Parcel data, reply;
322 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800323 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800324 data.writeFloat(value);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800325 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800326 remote()->transact(SET_STREAM_VOLUME, data, &reply);
327 return reply.readInt32();
328 }
329
Glenn Kastenfff6d712012-01-12 16:38:12 -0800330 virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800331 {
332 Parcel data, reply;
333 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800334 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800335 data.writeInt32(muted);
336 remote()->transact(SET_STREAM_MUTE, data, &reply);
337 return reply.readInt32();
338 }
339
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800340 virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800341 {
342 Parcel data, reply;
343 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800344 data.writeInt32((int32_t) stream);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800345 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800346 remote()->transact(STREAM_VOLUME, data, &reply);
347 return reply.readFloat();
348 }
349
Glenn Kastenfff6d712012-01-12 16:38:12 -0800350 virtual bool streamMute(audio_stream_type_t stream) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800351 {
352 Parcel data, reply;
353 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800354 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800355 remote()->transact(STREAM_MUTE, data, &reply);
356 return reply.readInt32();
357 }
358
Glenn Kastenf78aee72012-01-04 11:00:47 -0800359 virtual status_t setMode(audio_mode_t mode)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800360 {
361 Parcel data, reply;
362 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
363 data.writeInt32(mode);
364 remote()->transact(SET_MODE, data, &reply);
365 return reply.readInt32();
366 }
367
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800368 virtual status_t setMicMute(bool state)
369 {
370 Parcel data, reply;
371 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
372 data.writeInt32(state);
373 remote()->transact(SET_MIC_MUTE, data, &reply);
374 return reply.readInt32();
375 }
376
377 virtual bool getMicMute() const
378 {
379 Parcel data, reply;
380 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
381 remote()->transact(GET_MIC_MUTE, data, &reply);
382 return reply.readInt32();
383 }
384
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800385 virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800386 {
387 Parcel data, reply;
388 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800389 data.writeInt32((int32_t) ioHandle);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700390 data.writeString8(keyValuePairs);
391 remote()->transact(SET_PARAMETERS, data, &reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800392 return reply.readInt32();
393 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700394
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800395 virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
Eric Laurentc2f1f072009-07-17 12:17:14 -0700396 {
397 Parcel data, reply;
398 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800399 data.writeInt32((int32_t) ioHandle);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700400 data.writeString8(keys);
401 remote()->transact(GET_PARAMETERS, data, &reply);
402 return reply.readString8();
403 }
404
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800405 virtual void registerClient(const sp<IAudioFlingerClient>& client)
406 {
407 Parcel data, reply;
408 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
409 data.writeStrongBinder(client->asBinder());
410 remote()->transact(REGISTER_CLIENT, data, &reply);
411 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700412
Glenn Kastendd8104c2012-07-02 12:42:44 -0700413 virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
414 audio_channel_mask_t channelMask) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800415 {
416 Parcel data, reply;
417 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
418 data.writeInt32(sampleRate);
419 data.writeInt32(format);
Glenn Kastendd8104c2012-07-02 12:42:44 -0700420 data.writeInt32(channelMask);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800421 remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
422 return reply.readInt32();
423 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700424
Eric Laurenta4c5a552012-03-29 10:12:40 -0700425 virtual audio_io_handle_t openOutput(audio_module_handle_t module,
426 audio_devices_t *pDevices,
427 uint32_t *pSamplingRate,
428 audio_format_t *pFormat,
429 audio_channel_mask_t *pChannelMask,
430 uint32_t *pLatencyMs,
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000431 audio_output_flags_t flags,
432 const audio_offload_info_t *offloadInfo)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800433 {
434 Parcel data, reply;
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700435 audio_devices_t devices = pDevices != NULL ? *pDevices : (audio_devices_t)0;
436 uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0;
437 audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT;
438 audio_channel_mask_t channelMask = pChannelMask != NULL ?
439 *pChannelMask : (audio_channel_mask_t)0;
440 uint32_t latency = pLatencyMs != NULL ? *pLatencyMs : 0;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800441 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurenta4c5a552012-03-29 10:12:40 -0700442 data.writeInt32(module);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700443 data.writeInt32(devices);
444 data.writeInt32(samplingRate);
445 data.writeInt32(format);
Eric Laurenta4c5a552012-03-29 10:12:40 -0700446 data.writeInt32(channelMask);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700447 data.writeInt32(latency);
Glenn Kasten18868c52012-03-07 09:15:37 -0800448 data.writeInt32((int32_t) flags);
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100449 if (offloadInfo == NULL) {
450 data.writeInt32(0);
451 } else {
452 data.writeInt32(1);
453 data.write(offloadInfo, sizeof(audio_offload_info_t));
454 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700455 remote()->transact(OPEN_OUTPUT, data, &reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800456 audio_io_handle_t output = (audio_io_handle_t) reply.readInt32();
457 ALOGV("openOutput() returned output, %d", output);
Eric Laurenta4c5a552012-03-29 10:12:40 -0700458 devices = (audio_devices_t)reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700459 if (pDevices != NULL) *pDevices = devices;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700460 samplingRate = reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700461 if (pSamplingRate != NULL) *pSamplingRate = samplingRate;
Glenn Kasten58f30212012-01-12 12:27:51 -0800462 format = (audio_format_t) reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700463 if (pFormat != NULL) *pFormat = format;
Eric Laurenta4c5a552012-03-29 10:12:40 -0700464 channelMask = (audio_channel_mask_t)reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700465 if (pChannelMask != NULL) *pChannelMask = channelMask;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700466 latency = reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700467 if (pLatencyMs != NULL) *pLatencyMs = latency;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700468 return output;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800469 }
470
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800471 virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
472 audio_io_handle_t output2)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800473 {
474 Parcel data, reply;
475 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800476 data.writeInt32((int32_t) output1);
477 data.writeInt32((int32_t) output2);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700478 remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800479 return (audio_io_handle_t) reply.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700480 }
481
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800482 virtual status_t closeOutput(audio_io_handle_t output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700483 {
484 Parcel data, reply;
485 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800486 data.writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700487 remote()->transact(CLOSE_OUTPUT, data, &reply);
488 return reply.readInt32();
489 }
490
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800491 virtual status_t suspendOutput(audio_io_handle_t output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700492 {
493 Parcel data, reply;
494 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800495 data.writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700496 remote()->transact(SUSPEND_OUTPUT, data, &reply);
497 return reply.readInt32();
498 }
499
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800500 virtual status_t restoreOutput(audio_io_handle_t output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700501 {
502 Parcel data, reply;
503 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800504 data.writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700505 remote()->transact(RESTORE_OUTPUT, data, &reply);
506 return reply.readInt32();
507 }
508
Eric Laurenta4c5a552012-03-29 10:12:40 -0700509 virtual audio_io_handle_t openInput(audio_module_handle_t module,
510 audio_devices_t *pDevices,
511 uint32_t *pSamplingRate,
512 audio_format_t *pFormat,
513 audio_channel_mask_t *pChannelMask)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700514 {
515 Parcel data, reply;
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700516 audio_devices_t devices = pDevices != NULL ? *pDevices : (audio_devices_t)0;
517 uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0;
518 audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT;
519 audio_channel_mask_t channelMask = pChannelMask != NULL ?
520 *pChannelMask : (audio_channel_mask_t)0;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700521
522 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurenta4c5a552012-03-29 10:12:40 -0700523 data.writeInt32(module);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700524 data.writeInt32(devices);
525 data.writeInt32(samplingRate);
526 data.writeInt32(format);
Eric Laurenta4c5a552012-03-29 10:12:40 -0700527 data.writeInt32(channelMask);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700528 remote()->transact(OPEN_INPUT, data, &reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800529 audio_io_handle_t input = (audio_io_handle_t) reply.readInt32();
Eric Laurenta4c5a552012-03-29 10:12:40 -0700530 devices = (audio_devices_t)reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700531 if (pDevices != NULL) *pDevices = devices;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700532 samplingRate = reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700533 if (pSamplingRate != NULL) *pSamplingRate = samplingRate;
Glenn Kasten58f30212012-01-12 12:27:51 -0800534 format = (audio_format_t) reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700535 if (pFormat != NULL) *pFormat = format;
Eric Laurenta4c5a552012-03-29 10:12:40 -0700536 channelMask = (audio_channel_mask_t)reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700537 if (pChannelMask != NULL) *pChannelMask = channelMask;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700538 return input;
539 }
540
Eric Laurentfa2877b2009-07-28 08:44:33 -0700541 virtual status_t closeInput(int input)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700542 {
543 Parcel data, reply;
544 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700545 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700546 remote()->transact(CLOSE_INPUT, data, &reply);
547 return reply.readInt32();
548 }
549
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800550 virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700551 {
552 Parcel data, reply;
553 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800554 data.writeInt32((int32_t) stream);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800555 data.writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700556 remote()->transact(SET_STREAM_OUTPUT, data, &reply);
557 return reply.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800558 }
Eric Laurentf0ee6f42009-10-21 08:14:22 -0700559
560 virtual status_t setVoiceVolume(float volume)
561 {
562 Parcel data, reply;
563 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
564 data.writeFloat(volume);
565 remote()->transact(SET_VOICE_VOLUME, data, &reply);
566 return reply.readInt32();
567 }
Eric Laurent342e9cf2010-01-19 17:37:09 -0800568
Glenn Kasten26c77552012-11-16 12:01:44 -0800569 virtual status_t getRenderPosition(size_t *halFrames, size_t *dspFrames,
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800570 audio_io_handle_t output) const
Eric Laurent342e9cf2010-01-19 17:37:09 -0800571 {
572 Parcel data, reply;
573 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800574 data.writeInt32((int32_t) output);
Eric Laurent342e9cf2010-01-19 17:37:09 -0800575 remote()->transact(GET_RENDER_POSITION, data, &reply);
576 status_t status = reply.readInt32();
577 if (status == NO_ERROR) {
578 uint32_t tmp = reply.readInt32();
579 if (halFrames) {
580 *halFrames = tmp;
581 }
582 tmp = reply.readInt32();
583 if (dspFrames) {
584 *dspFrames = tmp;
585 }
586 }
587 return status;
588 }
Eric Laurent05bca2f2010-02-26 02:47:27 -0800589
Glenn Kastene33054e2012-11-14 12:54:39 -0800590 virtual size_t getInputFramesLost(audio_io_handle_t ioHandle) const
Eric Laurent05bca2f2010-02-26 02:47:27 -0800591 {
592 Parcel data, reply;
593 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800594 data.writeInt32((int32_t) ioHandle);
Eric Laurent05bca2f2010-02-26 02:47:27 -0800595 remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
596 return reply.readInt32();
597 }
Eric Laurentbe916aa2010-06-01 23:49:17 -0700598
599 virtual int newAudioSessionId()
600 {
601 Parcel data, reply;
602 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
603 status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
604 int id = 0;
605 if (status == NO_ERROR) {
606 id = reply.readInt32();
607 }
608 return id;
609 }
610
Marco Nelissen3a34bef2011-08-02 13:33:41 -0700611 virtual void acquireAudioSessionId(int audioSession)
612 {
613 Parcel data, reply;
614 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
615 data.writeInt32(audioSession);
616 remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
617 }
618
619 virtual void releaseAudioSessionId(int audioSession)
620 {
621 Parcel data, reply;
622 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
623 data.writeInt32(audioSession);
624 remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
625 }
626
Glenn Kastenf587ba52012-01-26 16:25:10 -0800627 virtual status_t queryNumberEffects(uint32_t *numEffects) const
Eric Laurentbe916aa2010-06-01 23:49:17 -0700628 {
629 Parcel data, reply;
630 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
631 status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
632 if (status != NO_ERROR) {
633 return status;
634 }
635 status = reply.readInt32();
636 if (status != NO_ERROR) {
637 return status;
638 }
Glenn Kasten9d1f02d2012-02-08 17:47:58 -0800639 if (numEffects != NULL) {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700640 *numEffects = (uint32_t)reply.readInt32();
641 }
642 return NO_ERROR;
643 }
644
Glenn Kastenf587ba52012-01-26 16:25:10 -0800645 virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
Eric Laurentbe916aa2010-06-01 23:49:17 -0700646 {
647 if (pDescriptor == NULL) {
648 return BAD_VALUE;
649 }
650 Parcel data, reply;
651 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentffe9c252010-06-23 17:38:20 -0700652 data.writeInt32(index);
653 status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700654 if (status != NO_ERROR) {
655 return status;
656 }
657 status = reply.readInt32();
658 if (status != NO_ERROR) {
659 return status;
660 }
661 reply.read(pDescriptor, sizeof(effect_descriptor_t));
662 return NO_ERROR;
663 }
664
Glenn Kasten5e92a782012-01-30 07:40:52 -0800665 virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
Glenn Kastenf587ba52012-01-26 16:25:10 -0800666 effect_descriptor_t *pDescriptor) const
Eric Laurentbe916aa2010-06-01 23:49:17 -0700667 {
668 if (pUuid == NULL || pDescriptor == NULL) {
669 return BAD_VALUE;
670 }
671 Parcel data, reply;
672 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
673 data.write(pUuid, sizeof(effect_uuid_t));
674 status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
675 if (status != NO_ERROR) {
676 return status;
677 }
678 status = reply.readInt32();
679 if (status != NO_ERROR) {
680 return status;
681 }
682 reply.read(pDescriptor, sizeof(effect_descriptor_t));
683 return NO_ERROR;
684 }
685
Glenn Kasten8d6cc842012-02-03 11:06:53 -0800686 virtual sp<IEffect> createEffect(
Eric Laurentbe916aa2010-06-01 23:49:17 -0700687 effect_descriptor_t *pDesc,
688 const sp<IEffectClient>& client,
689 int32_t priority,
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800690 audio_io_handle_t output,
Eric Laurentbe916aa2010-06-01 23:49:17 -0700691 int sessionId,
692 status_t *status,
693 int *id,
694 int *enabled)
695 {
696 Parcel data, reply;
697 sp<IEffect> effect;
698
699 if (pDesc == NULL) {
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700700 return effect;
701 if (status) {
702 *status = BAD_VALUE;
703 }
704 }
Eric Laurentbe916aa2010-06-01 23:49:17 -0700705
706 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentbe916aa2010-06-01 23:49:17 -0700707 data.write(pDesc, sizeof(effect_descriptor_t));
708 data.writeStrongBinder(client->asBinder());
709 data.writeInt32(priority);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800710 data.writeInt32((int32_t) output);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700711 data.writeInt32(sessionId);
712
713 status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
714 if (lStatus != NO_ERROR) {
Steve Block29357bc2012-01-06 19:20:56 +0000715 ALOGE("createEffect error: %s", strerror(-lStatus));
Eric Laurentbe916aa2010-06-01 23:49:17 -0700716 } else {
717 lStatus = reply.readInt32();
718 int tmp = reply.readInt32();
719 if (id) {
720 *id = tmp;
721 }
722 tmp = reply.readInt32();
Glenn Kastena0d68332012-01-27 16:47:15 -0800723 if (enabled != NULL) {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700724 *enabled = tmp;
725 }
726 effect = interface_cast<IEffect>(reply.readStrongBinder());
727 reply.read(pDesc, sizeof(effect_descriptor_t));
728 }
729 if (status) {
730 *status = lStatus;
731 }
732
733 return effect;
734 }
Eric Laurentde070132010-07-13 04:45:46 -0700735
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800736 virtual status_t moveEffects(int session, audio_io_handle_t srcOutput,
737 audio_io_handle_t dstOutput)
Eric Laurentde070132010-07-13 04:45:46 -0700738 {
739 Parcel data, reply;
740 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
741 data.writeInt32(session);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800742 data.writeInt32((int32_t) srcOutput);
743 data.writeInt32((int32_t) dstOutput);
Eric Laurentde070132010-07-13 04:45:46 -0700744 remote()->transact(MOVE_EFFECTS, data, &reply);
745 return reply.readInt32();
746 }
Eric Laurenta4c5a552012-03-29 10:12:40 -0700747
748 virtual audio_module_handle_t loadHwModule(const char *name)
749 {
750 Parcel data, reply;
751 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
752 data.writeCString(name);
753 remote()->transact(LOAD_HW_MODULE, data, &reply);
754 return (audio_module_handle_t) reply.readInt32();
755 }
Glenn Kastencc0f1cf2012-09-24 11:27:18 -0700756
Glenn Kasten3b16c762012-11-14 08:44:39 -0800757 virtual uint32_t getPrimaryOutputSamplingRate()
Glenn Kastencc0f1cf2012-09-24 11:27:18 -0700758 {
759 Parcel data, reply;
760 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
761 remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
762 return reply.readInt32();
763 }
764
Glenn Kastene33054e2012-11-14 12:54:39 -0800765 virtual size_t getPrimaryOutputFrameCount()
Glenn Kastencc0f1cf2012-09-24 11:27:18 -0700766 {
767 Parcel data, reply;
768 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
769 remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
770 return reply.readInt32();
771 }
772
Glenn Kasten4182c4e2013-07-15 14:45:07 -0700773 virtual status_t setLowRamDevice(bool isLowRamDevice)
774 {
775 Parcel data, reply;
776 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
777 data.writeInt32((int) isLowRamDevice);
778 remote()->transact(SET_LOW_RAM_DEVICE, data, &reply);
779 return reply.readInt32();
780 }
781
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800782};
783
784IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
785
786// ----------------------------------------------------------------------
787
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800788status_t BnAudioFlinger::onTransact(
789 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
790{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700791 switch (code) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800792 case CREATE_TRACK: {
793 CHECK_INTERFACE(IAudioFlinger, data, reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800794 int streamType = data.readInt32();
795 uint32_t sampleRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800796 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kastendd8104c2012-07-02 12:42:44 -0700797 audio_channel_mask_t channelMask = data.readInt32();
Glenn Kastene33054e2012-11-14 12:54:39 -0800798 size_t frameCount = data.readInt32();
Glenn Kastena075db42012-03-06 11:22:44 -0800799 track_flags_t flags = (track_flags_t) data.readInt32();
Eric Laurent3d00aa62013-09-24 09:53:27 -0700800 bool haveSharedBuffer = data.readInt32() != 0;
801 sp<IMemory> buffer;
802 if (haveSharedBuffer) {
803 buffer = interface_cast<IMemory>(data.readStrongBinder());
804 }
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800805 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kasten3acbd052012-02-28 10:39:56 -0800806 pid_t tid = (pid_t) data.readInt32();
Eric Laurentbe916aa2010-06-01 23:49:17 -0700807 int sessionId = data.readInt32();
Glenn Kastend054c322013-07-12 12:59:20 -0700808 String8 name;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800809 status_t status;
Eric Laurent3d00aa62013-09-24 09:53:27 -0700810 sp<IAudioTrack> track;
811 if ((haveSharedBuffer && (buffer == 0)) ||
812 ((buffer != 0) && (buffer->pointer() == NULL))) {
813 ALOGW("CREATE_TRACK: cannot retrieve shared memory");
814 status = DEAD_OBJECT;
815 } else {
816 track = createTrack(
817 (audio_stream_type_t) streamType, sampleRate, format,
818 channelMask, frameCount, &flags, buffer, output, tid,
819 &sessionId, name, &status);
820 }
Glenn Kastene0b07172012-11-06 15:03:34 -0800821 reply->writeInt32(flags);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700822 reply->writeInt32(sessionId);
Glenn Kastend054c322013-07-12 12:59:20 -0700823 reply->writeString8(name);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800824 reply->writeInt32(status);
825 reply->writeStrongBinder(track->asBinder());
826 return NO_ERROR;
827 } break;
Alok Kediya601e9b52013-09-27 11:55:10 +0530828 case CREATE_DIRECT_TRACK: {
829 CHECK_INTERFACE(IAudioFlinger, data, reply);
830 pid_t pid = data.readInt32();
831 uint32_t sampleRate = data.readInt32();
832 audio_channel_mask_t channelMask = data.readInt32();
833 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
834 int sessionId = data.readInt32();
835 IDirectTrackClient* client;
836 data.read(client,sizeof(IDirectTrackClient));
837 int streamType = data.readInt32();
838 status_t status;
839 sp<IDirectTrack> track = createDirectTrack(pid,
840 sampleRate, channelMask, output, &sessionId, client,(audio_stream_type_t) streamType, &status);
841 reply->writeInt32(sessionId);
842 reply->writeInt32(status);
843 reply->writeStrongBinder(track->asBinder());
844 return NO_ERROR;
845 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800846 case OPEN_RECORD: {
847 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800848 audio_io_handle_t input = (audio_io_handle_t) data.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800849 uint32_t sampleRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800850 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kastendd8104c2012-07-02 12:42:44 -0700851 audio_channel_mask_t channelMask = data.readInt32();
Glenn Kastene33054e2012-11-14 12:54:39 -0800852 size_t frameCount = data.readInt32();
Glenn Kastena075db42012-03-06 11:22:44 -0800853 track_flags_t flags = (track_flags_t) data.readInt32();
Glenn Kasten1879fff2012-07-11 15:36:59 -0700854 pid_t tid = (pid_t) data.readInt32();
Eric Laurentbe916aa2010-06-01 23:49:17 -0700855 int sessionId = data.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800856 status_t status;
Glenn Kasten8d6cc842012-02-03 11:06:53 -0800857 sp<IAudioRecord> record = openRecord(input,
Glenn Kasteneeca3262013-07-31 16:12:48 -0700858 sampleRate, format, channelMask, frameCount, &flags, tid, &sessionId, &status);
Glenn Kastene93cf2c2013-09-24 11:52:37 -0700859 LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
Glenn Kasteneeca3262013-07-31 16:12:48 -0700860 reply->writeInt32(flags);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700861 reply->writeInt32(sessionId);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800862 reply->writeInt32(status);
863 reply->writeStrongBinder(record->asBinder());
864 return NO_ERROR;
865 } break;
866 case SAMPLE_RATE: {
867 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800868 reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800869 return NO_ERROR;
870 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800871 case FORMAT: {
872 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800873 reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800874 return NO_ERROR;
875 } break;
876 case FRAME_COUNT: {
877 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800878 reply->writeInt32( frameCount((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800879 return NO_ERROR;
880 } break;
881 case LATENCY: {
882 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800883 reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800884 return NO_ERROR;
885 } break;
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700886 case SET_MASTER_VOLUME: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800887 CHECK_INTERFACE(IAudioFlinger, data, reply);
888 reply->writeInt32( setMasterVolume(data.readFloat()) );
889 return NO_ERROR;
890 } break;
891 case SET_MASTER_MUTE: {
892 CHECK_INTERFACE(IAudioFlinger, data, reply);
893 reply->writeInt32( setMasterMute(data.readInt32()) );
894 return NO_ERROR;
895 } break;
896 case MASTER_VOLUME: {
897 CHECK_INTERFACE(IAudioFlinger, data, reply);
898 reply->writeFloat( masterVolume() );
899 return NO_ERROR;
900 } break;
901 case MASTER_MUTE: {
902 CHECK_INTERFACE(IAudioFlinger, data, reply);
903 reply->writeInt32( masterMute() );
904 return NO_ERROR;
905 } break;
906 case SET_STREAM_VOLUME: {
907 CHECK_INTERFACE(IAudioFlinger, data, reply);
908 int stream = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700909 float volume = data.readFloat();
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800910 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -0800911 reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800912 return NO_ERROR;
913 } break;
914 case SET_STREAM_MUTE: {
915 CHECK_INTERFACE(IAudioFlinger, data, reply);
916 int stream = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -0800917 reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800918 return NO_ERROR;
919 } break;
920 case STREAM_VOLUME: {
921 CHECK_INTERFACE(IAudioFlinger, data, reply);
922 int stream = data.readInt32();
Eric Laurentfa2877b2009-07-28 08:44:33 -0700923 int output = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -0800924 reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800925 return NO_ERROR;
926 } break;
927 case STREAM_MUTE: {
928 CHECK_INTERFACE(IAudioFlinger, data, reply);
929 int stream = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -0800930 reply->writeInt32( streamMute((audio_stream_type_t) stream) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800931 return NO_ERROR;
932 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800933 case SET_MODE: {
934 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastenf78aee72012-01-04 11:00:47 -0800935 audio_mode_t mode = (audio_mode_t) data.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800936 reply->writeInt32( setMode(mode) );
937 return NO_ERROR;
938 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800939 case SET_MIC_MUTE: {
940 CHECK_INTERFACE(IAudioFlinger, data, reply);
941 int state = data.readInt32();
942 reply->writeInt32( setMicMute(state) );
943 return NO_ERROR;
944 } break;
945 case GET_MIC_MUTE: {
946 CHECK_INTERFACE(IAudioFlinger, data, reply);
947 reply->writeInt32( getMicMute() );
948 return NO_ERROR;
949 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700950 case SET_PARAMETERS: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800951 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800952 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700953 String8 keyValuePairs(data.readString8());
954 reply->writeInt32(setParameters(ioHandle, keyValuePairs));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800955 return NO_ERROR;
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700956 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700957 case GET_PARAMETERS: {
958 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800959 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700960 String8 keys(data.readString8());
961 reply->writeString8(getParameters(ioHandle, keys));
962 return NO_ERROR;
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700963 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700964
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800965 case REGISTER_CLIENT: {
966 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -0700967 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
968 data.readStrongBinder());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800969 registerClient(client);
970 return NO_ERROR;
971 } break;
972 case GET_INPUTBUFFERSIZE: {
973 CHECK_INTERFACE(IAudioFlinger, data, reply);
974 uint32_t sampleRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800975 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kastendd8104c2012-07-02 12:42:44 -0700976 audio_channel_mask_t channelMask = data.readInt32();
977 reply->writeInt32( getInputBufferSize(sampleRate, format, channelMask) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800978 return NO_ERROR;
979 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700980 case OPEN_OUTPUT: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800981 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta4c5a552012-03-29 10:12:40 -0700982 audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
983 audio_devices_t devices = (audio_devices_t)data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700984 uint32_t samplingRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800985 audio_format_t format = (audio_format_t) data.readInt32();
Eric Laurenta4c5a552012-03-29 10:12:40 -0700986 audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700987 uint32_t latency = data.readInt32();
Eric Laurent0ca3cf92012-04-18 09:24:29 -0700988 audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100989 bool hasOffloadInfo = data.readInt32() != 0;
990 audio_offload_info_t offloadInfo;
991 if (hasOffloadInfo) {
992 data.read(&offloadInfo, sizeof(audio_offload_info_t));
993 }
Eric Laurenta4c5a552012-03-29 10:12:40 -0700994 audio_io_handle_t output = openOutput(module,
995 &devices,
996 &samplingRate,
997 &format,
998 &channelMask,
999 &latency,
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +01001000 flags,
1001 hasOffloadInfo ? &offloadInfo : NULL);
Steve Block3856b092011-10-20 11:56:00 +01001002 ALOGV("OPEN_OUTPUT output, %p", output);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001003 reply->writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001004 reply->writeInt32(devices);
1005 reply->writeInt32(samplingRate);
1006 reply->writeInt32(format);
Eric Laurenta4c5a552012-03-29 10:12:40 -07001007 reply->writeInt32(channelMask);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001008 reply->writeInt32(latency);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001009 return NO_ERROR;
1010 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -07001011 case OPEN_DUPLICATE_OUTPUT: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001012 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001013 audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
1014 audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
1015 reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001016 return NO_ERROR;
1017 } break;
1018 case CLOSE_OUTPUT: {
1019 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001020 reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001021 return NO_ERROR;
1022 } break;
1023 case SUSPEND_OUTPUT: {
1024 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001025 reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001026 return NO_ERROR;
1027 } break;
1028 case RESTORE_OUTPUT: {
1029 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001030 reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001031 return NO_ERROR;
1032 } break;
1033 case OPEN_INPUT: {
1034 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta4c5a552012-03-29 10:12:40 -07001035 audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1036 audio_devices_t devices = (audio_devices_t)data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001037 uint32_t samplingRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -08001038 audio_format_t format = (audio_format_t) data.readInt32();
Eric Laurenta4c5a552012-03-29 10:12:40 -07001039 audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -07001040
Eric Laurenta4c5a552012-03-29 10:12:40 -07001041 audio_io_handle_t input = openInput(module,
1042 &devices,
1043 &samplingRate,
1044 &format,
1045 &channelMask);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001046 reply->writeInt32((int32_t) input);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001047 reply->writeInt32(devices);
1048 reply->writeInt32(samplingRate);
1049 reply->writeInt32(format);
Eric Laurenta4c5a552012-03-29 10:12:40 -07001050 reply->writeInt32(channelMask);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001051 return NO_ERROR;
1052 } break;
1053 case CLOSE_INPUT: {
1054 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001055 reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -07001056 return NO_ERROR;
1057 } break;
1058 case SET_STREAM_OUTPUT: {
1059 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentc2f1f072009-07-17 12:17:14 -07001060 uint32_t stream = data.readInt32();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001061 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001062 reply->writeInt32(setStreamOutput((audio_stream_type_t) stream, output));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001063 return NO_ERROR;
1064 } break;
Eric Laurentf0ee6f42009-10-21 08:14:22 -07001065 case SET_VOICE_VOLUME: {
1066 CHECK_INTERFACE(IAudioFlinger, data, reply);
1067 float volume = data.readFloat();
1068 reply->writeInt32( setVoiceVolume(volume) );
1069 return NO_ERROR;
1070 } break;
Eric Laurent342e9cf2010-01-19 17:37:09 -08001071 case GET_RENDER_POSITION: {
1072 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001073 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kastene33054e2012-11-14 12:54:39 -08001074 size_t halFrames;
1075 size_t dspFrames;
Eric Laurent342e9cf2010-01-19 17:37:09 -08001076 status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1077 reply->writeInt32(status);
1078 if (status == NO_ERROR) {
1079 reply->writeInt32(halFrames);
1080 reply->writeInt32(dspFrames);
1081 }
1082 return NO_ERROR;
1083 }
Eric Laurent05bca2f2010-02-26 02:47:27 -08001084 case GET_INPUT_FRAMES_LOST: {
1085 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001086 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Eric Laurent05bca2f2010-02-26 02:47:27 -08001087 reply->writeInt32(getInputFramesLost(ioHandle));
1088 return NO_ERROR;
1089 } break;
Eric Laurentbe916aa2010-06-01 23:49:17 -07001090 case NEW_AUDIO_SESSION_ID: {
1091 CHECK_INTERFACE(IAudioFlinger, data, reply);
1092 reply->writeInt32(newAudioSessionId());
1093 return NO_ERROR;
1094 } break;
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001095 case ACQUIRE_AUDIO_SESSION_ID: {
1096 CHECK_INTERFACE(IAudioFlinger, data, reply);
1097 int audioSession = data.readInt32();
1098 acquireAudioSessionId(audioSession);
1099 return NO_ERROR;
1100 } break;
1101 case RELEASE_AUDIO_SESSION_ID: {
1102 CHECK_INTERFACE(IAudioFlinger, data, reply);
1103 int audioSession = data.readInt32();
1104 releaseAudioSessionId(audioSession);
1105 return NO_ERROR;
1106 } break;
Eric Laurentbe916aa2010-06-01 23:49:17 -07001107 case QUERY_NUM_EFFECTS: {
1108 CHECK_INTERFACE(IAudioFlinger, data, reply);
1109 uint32_t numEffects;
1110 status_t status = queryNumberEffects(&numEffects);
1111 reply->writeInt32(status);
1112 if (status == NO_ERROR) {
1113 reply->writeInt32((int32_t)numEffects);
1114 }
1115 return NO_ERROR;
1116 }
Eric Laurentffe9c252010-06-23 17:38:20 -07001117 case QUERY_EFFECT: {
Eric Laurentbe916aa2010-06-01 23:49:17 -07001118 CHECK_INTERFACE(IAudioFlinger, data, reply);
1119 effect_descriptor_t desc;
Eric Laurentffe9c252010-06-23 17:38:20 -07001120 status_t status = queryEffect(data.readInt32(), &desc);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001121 reply->writeInt32(status);
1122 if (status == NO_ERROR) {
1123 reply->write(&desc, sizeof(effect_descriptor_t));
1124 }
1125 return NO_ERROR;
1126 }
1127 case GET_EFFECT_DESCRIPTOR: {
1128 CHECK_INTERFACE(IAudioFlinger, data, reply);
1129 effect_uuid_t uuid;
1130 data.read(&uuid, sizeof(effect_uuid_t));
1131 effect_descriptor_t desc;
1132 status_t status = getEffectDescriptor(&uuid, &desc);
1133 reply->writeInt32(status);
1134 if (status == NO_ERROR) {
1135 reply->write(&desc, sizeof(effect_descriptor_t));
1136 }
1137 return NO_ERROR;
1138 }
1139 case CREATE_EFFECT: {
1140 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001141 effect_descriptor_t desc;
1142 data.read(&desc, sizeof(effect_descriptor_t));
1143 sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1144 int32_t priority = data.readInt32();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001145 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Eric Laurentbe916aa2010-06-01 23:49:17 -07001146 int sessionId = data.readInt32();
1147 status_t status;
1148 int id;
1149 int enabled;
Eric Laurent05bca2f2010-02-26 02:47:27 -08001150
Glenn Kasten8d6cc842012-02-03 11:06:53 -08001151 sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001152 &status, &id, &enabled);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001153 reply->writeInt32(status);
1154 reply->writeInt32(id);
1155 reply->writeInt32(enabled);
1156 reply->writeStrongBinder(effect->asBinder());
1157 reply->write(&desc, sizeof(effect_descriptor_t));
1158 return NO_ERROR;
1159 } break;
Eric Laurentde070132010-07-13 04:45:46 -07001160 case MOVE_EFFECTS: {
1161 CHECK_INTERFACE(IAudioFlinger, data, reply);
1162 int session = data.readInt32();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001163 audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
1164 audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -07001165 reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1166 return NO_ERROR;
1167 } break;
Eric Laurenta4c5a552012-03-29 10:12:40 -07001168 case LOAD_HW_MODULE: {
1169 CHECK_INTERFACE(IAudioFlinger, data, reply);
1170 reply->writeInt32(loadHwModule(data.readCString()));
1171 return NO_ERROR;
1172 } break;
Glenn Kastencc0f1cf2012-09-24 11:27:18 -07001173 case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1174 CHECK_INTERFACE(IAudioFlinger, data, reply);
1175 reply->writeInt32(getPrimaryOutputSamplingRate());
1176 return NO_ERROR;
1177 } break;
1178 case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1179 CHECK_INTERFACE(IAudioFlinger, data, reply);
1180 reply->writeInt32(getPrimaryOutputFrameCount());
1181 return NO_ERROR;
1182 } break;
Glenn Kasten4182c4e2013-07-15 14:45:07 -07001183 case SET_LOW_RAM_DEVICE: {
1184 CHECK_INTERFACE(IAudioFlinger, data, reply);
1185 bool isLowRamDevice = data.readInt32() != 0;
1186 reply->writeInt32(setLowRamDevice(isLowRamDevice));
1187 return NO_ERROR;
1188 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001189 default:
1190 return BBinder::onTransact(code, data, reply, flags);
1191 }
1192}
1193
1194// ----------------------------------------------------------------------------
1195
1196}; // namespace android