blob: 448a82e1eb60693030ad1e65b5b606b0dc8460cb [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
Mathias Agopian75624082009-05-19 19:08:10 -070025#include <binder/Parcel.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080026
27#include <media/IAudioFlinger.h>
28
29namespace android {
30
31enum {
32 CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,
33 OPEN_RECORD,
34 SAMPLE_RATE,
Glenn Kasten5876f2f2012-11-30 10:52:16 -080035 RESERVED, // obsolete, was CHANNEL_COUNT
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080036 FORMAT,
37 FRAME_COUNT,
38 LATENCY,
39 SET_MASTER_VOLUME,
40 SET_MASTER_MUTE,
41 MASTER_VOLUME,
42 MASTER_MUTE,
43 SET_STREAM_VOLUME,
44 SET_STREAM_MUTE,
45 STREAM_VOLUME,
46 STREAM_MUTE,
47 SET_MODE,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080048 SET_MIC_MUTE,
49 GET_MIC_MUTE,
Eric Laurentc2f1f072009-07-17 12:17:14 -070050 SET_PARAMETERS,
51 GET_PARAMETERS,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080052 REGISTER_CLIENT,
53 GET_INPUTBUFFERSIZE,
Eric Laurentc2f1f072009-07-17 12:17:14 -070054 OPEN_OUTPUT,
55 OPEN_DUPLICATE_OUTPUT,
56 CLOSE_OUTPUT,
57 SUSPEND_OUTPUT,
58 RESTORE_OUTPUT,
59 OPEN_INPUT,
60 CLOSE_INPUT,
Eric Laurentf0ee6f42009-10-21 08:14:22 -070061 SET_STREAM_OUTPUT,
Eric Laurent342e9cf2010-01-19 17:37:09 -080062 SET_VOICE_VOLUME,
Eric Laurent05bca2f2010-02-26 02:47:27 -080063 GET_RENDER_POSITION,
Eric Laurentbe916aa2010-06-01 23:49:17 -070064 GET_INPUT_FRAMES_LOST,
65 NEW_AUDIO_SESSION_ID,
Marco Nelissen3a34bef2011-08-02 13:33:41 -070066 ACQUIRE_AUDIO_SESSION_ID,
67 RELEASE_AUDIO_SESSION_ID,
Eric Laurentbe916aa2010-06-01 23:49:17 -070068 QUERY_NUM_EFFECTS,
Eric Laurentffe9c252010-06-23 17:38:20 -070069 QUERY_EFFECT,
Eric Laurentbe916aa2010-06-01 23:49:17 -070070 GET_EFFECT_DESCRIPTOR,
Eric Laurentde070132010-07-13 04:45:46 -070071 CREATE_EFFECT,
Eric Laurenta4c5a552012-03-29 10:12:40 -070072 MOVE_EFFECTS,
Glenn Kastencc0f1cf2012-09-24 11:27:18 -070073 LOAD_HW_MODULE,
74 GET_PRIMARY_OUTPUT_SAMPLING_RATE,
75 GET_PRIMARY_OUTPUT_FRAME_COUNT,
Glenn Kasten4182c4e2013-07-15 14:45:07 -070076 SET_LOW_RAM_DEVICE,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080077};
78
79class BpAudioFlinger : public BpInterface<IAudioFlinger>
80{
81public:
82 BpAudioFlinger(const sp<IBinder>& impl)
83 : BpInterface<IAudioFlinger>(impl)
84 {
85 }
86
87 virtual sp<IAudioTrack> createTrack(
Glenn Kastenfff6d712012-01-12 16:38:12 -080088 audio_stream_type_t streamType,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080089 uint32_t sampleRate,
Glenn Kasten58f30212012-01-12 12:27:51 -080090 audio_format_t format,
Glenn Kastendd8104c2012-07-02 12:42:44 -070091 audio_channel_mask_t channelMask,
Glenn Kastene33054e2012-11-14 12:54:39 -080092 size_t frameCount,
Glenn Kastene0b07172012-11-06 15:03:34 -080093 track_flags_t *flags,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080094 const sp<IMemory>& sharedBuffer,
Glenn Kasten72ef00d2012-01-17 11:09:42 -080095 audio_io_handle_t output,
Glenn Kasten3acbd052012-02-28 10:39:56 -080096 pid_t tid,
Eric Laurentbe916aa2010-06-01 23:49:17 -070097 int *sessionId,
Glenn Kastend054c322013-07-12 12:59:20 -070098 String8& name,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080099 status_t *status)
100 {
101 Parcel data, reply;
Eric Laurent5841db72009-09-09 05:16:08 -0700102 sp<IAudioTrack> track;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800103 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800104 data.writeInt32((int32_t) streamType);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800105 data.writeInt32(sampleRate);
106 data.writeInt32(format);
Jean-Michel Trivi0d255b22011-05-24 15:53:33 -0700107 data.writeInt32(channelMask);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800108 data.writeInt32(frameCount);
Glenn Kastenb26e3e92012-11-14 08:32:08 -0800109 track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT;
Glenn Kastene0b07172012-11-06 15:03:34 -0800110 data.writeInt32(lFlags);
Eric Laurent3d00aa62013-09-24 09:53:27 -0700111 if (sharedBuffer != 0) {
112 data.writeInt32(true);
113 data.writeStrongBinder(sharedBuffer->asBinder());
114 } else {
115 data.writeInt32(false);
116 }
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800117 data.writeInt32((int32_t) output);
Glenn Kasten3acbd052012-02-28 10:39:56 -0800118 data.writeInt32((int32_t) tid);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700119 int lSessionId = 0;
120 if (sessionId != NULL) {
121 lSessionId = *sessionId;
122 }
123 data.writeInt32(lSessionId);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800124 status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
125 if (lStatus != NO_ERROR) {
Steve Block29357bc2012-01-06 19:20:56 +0000126 ALOGE("createTrack error: %s", strerror(-lStatus));
Eric Laurent5841db72009-09-09 05:16:08 -0700127 } else {
Glenn Kastene0b07172012-11-06 15:03:34 -0800128 lFlags = reply.readInt32();
129 if (flags != NULL) {
130 *flags = lFlags;
131 }
Eric Laurentbe916aa2010-06-01 23:49:17 -0700132 lSessionId = reply.readInt32();
133 if (sessionId != NULL) {
134 *sessionId = lSessionId;
135 }
Glenn Kastend054c322013-07-12 12:59:20 -0700136 name = reply.readString8();
Eric Laurent5841db72009-09-09 05:16:08 -0700137 lStatus = reply.readInt32();
138 track = interface_cast<IAudioTrack>(reply.readStrongBinder());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800139 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800140 if (status) {
141 *status = lStatus;
142 }
Eric Laurent5841db72009-09-09 05:16:08 -0700143 return track;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800144 }
145
146 virtual sp<IAudioRecord> openRecord(
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800147 audio_io_handle_t input,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800148 uint32_t sampleRate,
Glenn Kasten58f30212012-01-12 12:27:51 -0800149 audio_format_t format,
Glenn Kasten28b76b32012-07-03 17:24:41 -0700150 audio_channel_mask_t channelMask,
Glenn Kastene33054e2012-11-14 12:54:39 -0800151 size_t frameCount,
Glenn Kasteneeca3262013-07-31 16:12:48 -0700152 track_flags_t *flags,
Glenn Kasten1879fff2012-07-11 15:36:59 -0700153 pid_t tid,
Eric Laurentbe916aa2010-06-01 23:49:17 -0700154 int *sessionId,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800155 status_t *status)
156 {
157 Parcel data, reply;
Eric Laurent5841db72009-09-09 05:16:08 -0700158 sp<IAudioRecord> record;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800159 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800160 data.writeInt32((int32_t) input);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800161 data.writeInt32(sampleRate);
162 data.writeInt32(format);
Jean-Michel Trivi0d255b22011-05-24 15:53:33 -0700163 data.writeInt32(channelMask);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800164 data.writeInt32(frameCount);
Glenn Kasteneeca3262013-07-31 16:12:48 -0700165 track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT;
166 data.writeInt32(lFlags);
Glenn Kasten1879fff2012-07-11 15:36:59 -0700167 data.writeInt32((int32_t) tid);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700168 int lSessionId = 0;
169 if (sessionId != NULL) {
170 lSessionId = *sessionId;
171 }
172 data.writeInt32(lSessionId);
Eric Laurent5841db72009-09-09 05:16:08 -0700173 status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
174 if (lStatus != NO_ERROR) {
Steve Block29357bc2012-01-06 19:20:56 +0000175 ALOGE("openRecord error: %s", strerror(-lStatus));
Eric Laurent5841db72009-09-09 05:16:08 -0700176 } else {
Glenn Kasteneeca3262013-07-31 16:12:48 -0700177 lFlags = reply.readInt32();
178 if (flags != NULL) {
179 *flags = lFlags;
180 }
Eric Laurentbe916aa2010-06-01 23:49:17 -0700181 lSessionId = reply.readInt32();
182 if (sessionId != NULL) {
183 *sessionId = lSessionId;
184 }
Eric Laurent5841db72009-09-09 05:16:08 -0700185 lStatus = reply.readInt32();
186 record = interface_cast<IAudioRecord>(reply.readStrongBinder());
Glenn Kastene93cf2c2013-09-24 11:52:37 -0700187 if (lStatus == NO_ERROR) {
188 if (record == 0) {
189 ALOGE("openRecord should have returned an IAudioRecord");
190 lStatus = UNKNOWN_ERROR;
191 }
192 } else {
193 if (record != 0) {
194 ALOGE("openRecord returned an IAudioRecord but with status %d", lStatus);
195 record.clear();
196 }
197 }
Eric Laurent5841db72009-09-09 05:16:08 -0700198 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800199 if (status) {
200 *status = lStatus;
201 }
Eric Laurent5841db72009-09-09 05:16:08 -0700202 return record;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800203 }
204
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800205 virtual uint32_t sampleRate(audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800206 {
207 Parcel data, reply;
208 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800209 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800210 remote()->transact(SAMPLE_RATE, data, &reply);
211 return reply.readInt32();
212 }
213
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800214 virtual audio_format_t format(audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800215 {
216 Parcel data, reply;
217 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800218 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800219 remote()->transact(FORMAT, data, &reply);
Glenn Kasten58f30212012-01-12 12:27:51 -0800220 return (audio_format_t) reply.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800221 }
222
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800223 virtual size_t frameCount(audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800224 {
225 Parcel data, reply;
226 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800227 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800228 remote()->transact(FRAME_COUNT, data, &reply);
229 return reply.readInt32();
230 }
231
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800232 virtual uint32_t latency(audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800233 {
234 Parcel data, reply;
235 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800236 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800237 remote()->transact(LATENCY, data, &reply);
238 return reply.readInt32();
239 }
240
241 virtual status_t setMasterVolume(float value)
242 {
243 Parcel data, reply;
244 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
245 data.writeFloat(value);
246 remote()->transact(SET_MASTER_VOLUME, data, &reply);
247 return reply.readInt32();
248 }
249
250 virtual status_t setMasterMute(bool muted)
251 {
252 Parcel data, reply;
253 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
254 data.writeInt32(muted);
255 remote()->transact(SET_MASTER_MUTE, data, &reply);
256 return reply.readInt32();
257 }
258
259 virtual float masterVolume() const
260 {
261 Parcel data, reply;
262 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
263 remote()->transact(MASTER_VOLUME, data, &reply);
264 return reply.readFloat();
265 }
266
267 virtual bool masterMute() const
268 {
269 Parcel data, reply;
270 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
271 remote()->transact(MASTER_MUTE, data, &reply);
272 return reply.readInt32();
273 }
274
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800275 virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
276 audio_io_handle_t output)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800277 {
278 Parcel data, reply;
279 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800280 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800281 data.writeFloat(value);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800282 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800283 remote()->transact(SET_STREAM_VOLUME, data, &reply);
284 return reply.readInt32();
285 }
286
Glenn Kastenfff6d712012-01-12 16:38:12 -0800287 virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800288 {
289 Parcel data, reply;
290 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800291 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800292 data.writeInt32(muted);
293 remote()->transact(SET_STREAM_MUTE, data, &reply);
294 return reply.readInt32();
295 }
296
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800297 virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800298 {
299 Parcel data, reply;
300 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800301 data.writeInt32((int32_t) stream);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800302 data.writeInt32((int32_t) output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800303 remote()->transact(STREAM_VOLUME, data, &reply);
304 return reply.readFloat();
305 }
306
Glenn Kastenfff6d712012-01-12 16:38:12 -0800307 virtual bool streamMute(audio_stream_type_t stream) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800308 {
309 Parcel data, reply;
310 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800311 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800312 remote()->transact(STREAM_MUTE, data, &reply);
313 return reply.readInt32();
314 }
315
Glenn Kastenf78aee72012-01-04 11:00:47 -0800316 virtual status_t setMode(audio_mode_t mode)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800317 {
318 Parcel data, reply;
319 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
320 data.writeInt32(mode);
321 remote()->transact(SET_MODE, data, &reply);
322 return reply.readInt32();
323 }
324
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800325 virtual status_t setMicMute(bool state)
326 {
327 Parcel data, reply;
328 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
329 data.writeInt32(state);
330 remote()->transact(SET_MIC_MUTE, data, &reply);
331 return reply.readInt32();
332 }
333
334 virtual bool getMicMute() const
335 {
336 Parcel data, reply;
337 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
338 remote()->transact(GET_MIC_MUTE, data, &reply);
339 return reply.readInt32();
340 }
341
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800342 virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800343 {
344 Parcel data, reply;
345 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800346 data.writeInt32((int32_t) ioHandle);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700347 data.writeString8(keyValuePairs);
348 remote()->transact(SET_PARAMETERS, data, &reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800349 return reply.readInt32();
350 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700351
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800352 virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
Eric Laurentc2f1f072009-07-17 12:17:14 -0700353 {
354 Parcel data, reply;
355 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800356 data.writeInt32((int32_t) ioHandle);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700357 data.writeString8(keys);
358 remote()->transact(GET_PARAMETERS, data, &reply);
359 return reply.readString8();
360 }
361
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800362 virtual void registerClient(const sp<IAudioFlingerClient>& client)
363 {
364 Parcel data, reply;
365 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
366 data.writeStrongBinder(client->asBinder());
367 remote()->transact(REGISTER_CLIENT, data, &reply);
368 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700369
Glenn Kastendd8104c2012-07-02 12:42:44 -0700370 virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
371 audio_channel_mask_t channelMask) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800372 {
373 Parcel data, reply;
374 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
375 data.writeInt32(sampleRate);
376 data.writeInt32(format);
Glenn Kastendd8104c2012-07-02 12:42:44 -0700377 data.writeInt32(channelMask);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800378 remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
379 return reply.readInt32();
380 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700381
Eric Laurenta4c5a552012-03-29 10:12:40 -0700382 virtual audio_io_handle_t openOutput(audio_module_handle_t module,
383 audio_devices_t *pDevices,
384 uint32_t *pSamplingRate,
385 audio_format_t *pFormat,
386 audio_channel_mask_t *pChannelMask,
387 uint32_t *pLatencyMs,
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000388 audio_output_flags_t flags,
389 const audio_offload_info_t *offloadInfo)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800390 {
391 Parcel data, reply;
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700392 audio_devices_t devices = pDevices != NULL ? *pDevices : (audio_devices_t)0;
393 uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0;
394 audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT;
395 audio_channel_mask_t channelMask = pChannelMask != NULL ?
396 *pChannelMask : (audio_channel_mask_t)0;
397 uint32_t latency = pLatencyMs != NULL ? *pLatencyMs : 0;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800398 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurenta4c5a552012-03-29 10:12:40 -0700399 data.writeInt32(module);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700400 data.writeInt32(devices);
401 data.writeInt32(samplingRate);
402 data.writeInt32(format);
Eric Laurenta4c5a552012-03-29 10:12:40 -0700403 data.writeInt32(channelMask);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700404 data.writeInt32(latency);
Glenn Kasten18868c52012-03-07 09:15:37 -0800405 data.writeInt32((int32_t) flags);
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100406 if (offloadInfo == NULL) {
407 data.writeInt32(0);
408 } else {
409 data.writeInt32(1);
410 data.write(offloadInfo, sizeof(audio_offload_info_t));
411 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700412 remote()->transact(OPEN_OUTPUT, data, &reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800413 audio_io_handle_t output = (audio_io_handle_t) reply.readInt32();
414 ALOGV("openOutput() returned output, %d", output);
Eric Laurenta4c5a552012-03-29 10:12:40 -0700415 devices = (audio_devices_t)reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700416 if (pDevices != NULL) *pDevices = devices;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700417 samplingRate = reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700418 if (pSamplingRate != NULL) *pSamplingRate = samplingRate;
Glenn Kasten58f30212012-01-12 12:27:51 -0800419 format = (audio_format_t) reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700420 if (pFormat != NULL) *pFormat = format;
Eric Laurenta4c5a552012-03-29 10:12:40 -0700421 channelMask = (audio_channel_mask_t)reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700422 if (pChannelMask != NULL) *pChannelMask = channelMask;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700423 latency = reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700424 if (pLatencyMs != NULL) *pLatencyMs = latency;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700425 return output;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800426 }
427
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800428 virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
429 audio_io_handle_t output2)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800430 {
431 Parcel data, reply;
432 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800433 data.writeInt32((int32_t) output1);
434 data.writeInt32((int32_t) output2);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700435 remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800436 return (audio_io_handle_t) reply.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700437 }
438
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800439 virtual status_t closeOutput(audio_io_handle_t output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700440 {
441 Parcel data, reply;
442 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800443 data.writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700444 remote()->transact(CLOSE_OUTPUT, data, &reply);
445 return reply.readInt32();
446 }
447
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800448 virtual status_t suspendOutput(audio_io_handle_t output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700449 {
450 Parcel data, reply;
451 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800452 data.writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700453 remote()->transact(SUSPEND_OUTPUT, data, &reply);
454 return reply.readInt32();
455 }
456
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800457 virtual status_t restoreOutput(audio_io_handle_t output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700458 {
459 Parcel data, reply;
460 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800461 data.writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700462 remote()->transact(RESTORE_OUTPUT, data, &reply);
463 return reply.readInt32();
464 }
465
Eric Laurenta4c5a552012-03-29 10:12:40 -0700466 virtual audio_io_handle_t openInput(audio_module_handle_t module,
467 audio_devices_t *pDevices,
468 uint32_t *pSamplingRate,
469 audio_format_t *pFormat,
470 audio_channel_mask_t *pChannelMask)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700471 {
472 Parcel data, reply;
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700473 audio_devices_t devices = pDevices != NULL ? *pDevices : (audio_devices_t)0;
474 uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0;
475 audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT;
476 audio_channel_mask_t channelMask = pChannelMask != NULL ?
477 *pChannelMask : (audio_channel_mask_t)0;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700478
479 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurenta4c5a552012-03-29 10:12:40 -0700480 data.writeInt32(module);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700481 data.writeInt32(devices);
482 data.writeInt32(samplingRate);
483 data.writeInt32(format);
Eric Laurenta4c5a552012-03-29 10:12:40 -0700484 data.writeInt32(channelMask);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700485 remote()->transact(OPEN_INPUT, data, &reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800486 audio_io_handle_t input = (audio_io_handle_t) reply.readInt32();
Eric Laurenta4c5a552012-03-29 10:12:40 -0700487 devices = (audio_devices_t)reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700488 if (pDevices != NULL) *pDevices = devices;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700489 samplingRate = reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700490 if (pSamplingRate != NULL) *pSamplingRate = samplingRate;
Glenn Kasten58f30212012-01-12 12:27:51 -0800491 format = (audio_format_t) reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700492 if (pFormat != NULL) *pFormat = format;
Eric Laurenta4c5a552012-03-29 10:12:40 -0700493 channelMask = (audio_channel_mask_t)reply.readInt32();
Glenn Kasten7c5977f2013-07-02 14:17:22 -0700494 if (pChannelMask != NULL) *pChannelMask = channelMask;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700495 return input;
496 }
497
Eric Laurentfa2877b2009-07-28 08:44:33 -0700498 virtual status_t closeInput(int input)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700499 {
500 Parcel data, reply;
501 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700502 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700503 remote()->transact(CLOSE_INPUT, data, &reply);
504 return reply.readInt32();
505 }
506
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800507 virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700508 {
509 Parcel data, reply;
510 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800511 data.writeInt32((int32_t) stream);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800512 data.writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700513 remote()->transact(SET_STREAM_OUTPUT, data, &reply);
514 return reply.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800515 }
Eric Laurentf0ee6f42009-10-21 08:14:22 -0700516
517 virtual status_t setVoiceVolume(float volume)
518 {
519 Parcel data, reply;
520 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
521 data.writeFloat(volume);
522 remote()->transact(SET_VOICE_VOLUME, data, &reply);
523 return reply.readInt32();
524 }
Eric Laurent342e9cf2010-01-19 17:37:09 -0800525
Glenn Kasten26c77552012-11-16 12:01:44 -0800526 virtual status_t getRenderPosition(size_t *halFrames, size_t *dspFrames,
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800527 audio_io_handle_t output) const
Eric Laurent342e9cf2010-01-19 17:37:09 -0800528 {
529 Parcel data, reply;
530 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800531 data.writeInt32((int32_t) output);
Eric Laurent342e9cf2010-01-19 17:37:09 -0800532 remote()->transact(GET_RENDER_POSITION, data, &reply);
533 status_t status = reply.readInt32();
534 if (status == NO_ERROR) {
535 uint32_t tmp = reply.readInt32();
536 if (halFrames) {
537 *halFrames = tmp;
538 }
539 tmp = reply.readInt32();
540 if (dspFrames) {
541 *dspFrames = tmp;
542 }
543 }
544 return status;
545 }
Eric Laurent05bca2f2010-02-26 02:47:27 -0800546
Glenn Kastene33054e2012-11-14 12:54:39 -0800547 virtual size_t getInputFramesLost(audio_io_handle_t ioHandle) const
Eric Laurent05bca2f2010-02-26 02:47:27 -0800548 {
549 Parcel data, reply;
550 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800551 data.writeInt32((int32_t) ioHandle);
Eric Laurent05bca2f2010-02-26 02:47:27 -0800552 remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
553 return reply.readInt32();
554 }
Eric Laurentbe916aa2010-06-01 23:49:17 -0700555
556 virtual int newAudioSessionId()
557 {
558 Parcel data, reply;
559 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
560 status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
561 int id = 0;
562 if (status == NO_ERROR) {
563 id = reply.readInt32();
564 }
565 return id;
566 }
567
Marco Nelissen3a34bef2011-08-02 13:33:41 -0700568 virtual void acquireAudioSessionId(int audioSession)
569 {
570 Parcel data, reply;
571 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
572 data.writeInt32(audioSession);
573 remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
574 }
575
576 virtual void releaseAudioSessionId(int audioSession)
577 {
578 Parcel data, reply;
579 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
580 data.writeInt32(audioSession);
581 remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
582 }
583
Glenn Kastenf587ba52012-01-26 16:25:10 -0800584 virtual status_t queryNumberEffects(uint32_t *numEffects) const
Eric Laurentbe916aa2010-06-01 23:49:17 -0700585 {
586 Parcel data, reply;
587 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
588 status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
589 if (status != NO_ERROR) {
590 return status;
591 }
592 status = reply.readInt32();
593 if (status != NO_ERROR) {
594 return status;
595 }
Glenn Kasten9d1f02d2012-02-08 17:47:58 -0800596 if (numEffects != NULL) {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700597 *numEffects = (uint32_t)reply.readInt32();
598 }
599 return NO_ERROR;
600 }
601
Glenn Kastenf587ba52012-01-26 16:25:10 -0800602 virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
Eric Laurentbe916aa2010-06-01 23:49:17 -0700603 {
604 if (pDescriptor == NULL) {
605 return BAD_VALUE;
606 }
607 Parcel data, reply;
608 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentffe9c252010-06-23 17:38:20 -0700609 data.writeInt32(index);
610 status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700611 if (status != NO_ERROR) {
612 return status;
613 }
614 status = reply.readInt32();
615 if (status != NO_ERROR) {
616 return status;
617 }
618 reply.read(pDescriptor, sizeof(effect_descriptor_t));
619 return NO_ERROR;
620 }
621
Glenn Kasten5e92a782012-01-30 07:40:52 -0800622 virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
Glenn Kastenf587ba52012-01-26 16:25:10 -0800623 effect_descriptor_t *pDescriptor) const
Eric Laurentbe916aa2010-06-01 23:49:17 -0700624 {
625 if (pUuid == NULL || pDescriptor == NULL) {
626 return BAD_VALUE;
627 }
628 Parcel data, reply;
629 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
630 data.write(pUuid, sizeof(effect_uuid_t));
631 status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
632 if (status != NO_ERROR) {
633 return status;
634 }
635 status = reply.readInt32();
636 if (status != NO_ERROR) {
637 return status;
638 }
639 reply.read(pDescriptor, sizeof(effect_descriptor_t));
640 return NO_ERROR;
641 }
642
Glenn Kasten8d6cc842012-02-03 11:06:53 -0800643 virtual sp<IEffect> createEffect(
Eric Laurentbe916aa2010-06-01 23:49:17 -0700644 effect_descriptor_t *pDesc,
645 const sp<IEffectClient>& client,
646 int32_t priority,
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800647 audio_io_handle_t output,
Eric Laurentbe916aa2010-06-01 23:49:17 -0700648 int sessionId,
649 status_t *status,
650 int *id,
651 int *enabled)
652 {
653 Parcel data, reply;
654 sp<IEffect> effect;
655
656 if (pDesc == NULL) {
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700657 return effect;
658 if (status) {
659 *status = BAD_VALUE;
660 }
661 }
Eric Laurentbe916aa2010-06-01 23:49:17 -0700662
663 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentbe916aa2010-06-01 23:49:17 -0700664 data.write(pDesc, sizeof(effect_descriptor_t));
665 data.writeStrongBinder(client->asBinder());
666 data.writeInt32(priority);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800667 data.writeInt32((int32_t) output);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700668 data.writeInt32(sessionId);
669
670 status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
671 if (lStatus != NO_ERROR) {
Steve Block29357bc2012-01-06 19:20:56 +0000672 ALOGE("createEffect error: %s", strerror(-lStatus));
Eric Laurentbe916aa2010-06-01 23:49:17 -0700673 } else {
674 lStatus = reply.readInt32();
675 int tmp = reply.readInt32();
676 if (id) {
677 *id = tmp;
678 }
679 tmp = reply.readInt32();
Glenn Kastena0d68332012-01-27 16:47:15 -0800680 if (enabled != NULL) {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700681 *enabled = tmp;
682 }
683 effect = interface_cast<IEffect>(reply.readStrongBinder());
684 reply.read(pDesc, sizeof(effect_descriptor_t));
685 }
686 if (status) {
687 *status = lStatus;
688 }
689
690 return effect;
691 }
Eric Laurentde070132010-07-13 04:45:46 -0700692
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800693 virtual status_t moveEffects(int session, audio_io_handle_t srcOutput,
694 audio_io_handle_t dstOutput)
Eric Laurentde070132010-07-13 04:45:46 -0700695 {
696 Parcel data, reply;
697 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
698 data.writeInt32(session);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800699 data.writeInt32((int32_t) srcOutput);
700 data.writeInt32((int32_t) dstOutput);
Eric Laurentde070132010-07-13 04:45:46 -0700701 remote()->transact(MOVE_EFFECTS, data, &reply);
702 return reply.readInt32();
703 }
Eric Laurenta4c5a552012-03-29 10:12:40 -0700704
705 virtual audio_module_handle_t loadHwModule(const char *name)
706 {
707 Parcel data, reply;
708 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
709 data.writeCString(name);
710 remote()->transact(LOAD_HW_MODULE, data, &reply);
711 return (audio_module_handle_t) reply.readInt32();
712 }
Glenn Kastencc0f1cf2012-09-24 11:27:18 -0700713
Glenn Kasten3b16c762012-11-14 08:44:39 -0800714 virtual uint32_t getPrimaryOutputSamplingRate()
Glenn Kastencc0f1cf2012-09-24 11:27:18 -0700715 {
716 Parcel data, reply;
717 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
718 remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
719 return reply.readInt32();
720 }
721
Glenn Kastene33054e2012-11-14 12:54:39 -0800722 virtual size_t getPrimaryOutputFrameCount()
Glenn Kastencc0f1cf2012-09-24 11:27:18 -0700723 {
724 Parcel data, reply;
725 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
726 remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
727 return reply.readInt32();
728 }
729
Glenn Kasten4182c4e2013-07-15 14:45:07 -0700730 virtual status_t setLowRamDevice(bool isLowRamDevice)
731 {
732 Parcel data, reply;
733 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
734 data.writeInt32((int) isLowRamDevice);
735 remote()->transact(SET_LOW_RAM_DEVICE, data, &reply);
736 return reply.readInt32();
737 }
738
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800739};
740
741IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
742
743// ----------------------------------------------------------------------
744
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800745status_t BnAudioFlinger::onTransact(
746 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
747{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700748 switch (code) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800749 case CREATE_TRACK: {
750 CHECK_INTERFACE(IAudioFlinger, data, reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800751 int streamType = data.readInt32();
752 uint32_t sampleRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800753 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kastendd8104c2012-07-02 12:42:44 -0700754 audio_channel_mask_t channelMask = data.readInt32();
Glenn Kastene33054e2012-11-14 12:54:39 -0800755 size_t frameCount = data.readInt32();
Glenn Kastena075db42012-03-06 11:22:44 -0800756 track_flags_t flags = (track_flags_t) data.readInt32();
Eric Laurent3d00aa62013-09-24 09:53:27 -0700757 bool haveSharedBuffer = data.readInt32() != 0;
758 sp<IMemory> buffer;
759 if (haveSharedBuffer) {
760 buffer = interface_cast<IMemory>(data.readStrongBinder());
761 }
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800762 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kasten3acbd052012-02-28 10:39:56 -0800763 pid_t tid = (pid_t) data.readInt32();
Eric Laurentbe916aa2010-06-01 23:49:17 -0700764 int sessionId = data.readInt32();
Glenn Kastend054c322013-07-12 12:59:20 -0700765 String8 name;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800766 status_t status;
Eric Laurent3d00aa62013-09-24 09:53:27 -0700767 sp<IAudioTrack> track;
768 if ((haveSharedBuffer && (buffer == 0)) ||
769 ((buffer != 0) && (buffer->pointer() == NULL))) {
770 ALOGW("CREATE_TRACK: cannot retrieve shared memory");
771 status = DEAD_OBJECT;
772 } else {
773 track = createTrack(
774 (audio_stream_type_t) streamType, sampleRate, format,
775 channelMask, frameCount, &flags, buffer, output, tid,
776 &sessionId, name, &status);
777 }
Glenn Kastene0b07172012-11-06 15:03:34 -0800778 reply->writeInt32(flags);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700779 reply->writeInt32(sessionId);
Glenn Kastend054c322013-07-12 12:59:20 -0700780 reply->writeString8(name);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800781 reply->writeInt32(status);
782 reply->writeStrongBinder(track->asBinder());
783 return NO_ERROR;
784 } break;
785 case OPEN_RECORD: {
786 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800787 audio_io_handle_t input = (audio_io_handle_t) data.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800788 uint32_t sampleRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800789 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kastendd8104c2012-07-02 12:42:44 -0700790 audio_channel_mask_t channelMask = data.readInt32();
Glenn Kastene33054e2012-11-14 12:54:39 -0800791 size_t frameCount = data.readInt32();
Glenn Kastena075db42012-03-06 11:22:44 -0800792 track_flags_t flags = (track_flags_t) data.readInt32();
Glenn Kasten1879fff2012-07-11 15:36:59 -0700793 pid_t tid = (pid_t) data.readInt32();
Eric Laurentbe916aa2010-06-01 23:49:17 -0700794 int sessionId = data.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800795 status_t status;
Glenn Kasten8d6cc842012-02-03 11:06:53 -0800796 sp<IAudioRecord> record = openRecord(input,
Glenn Kasteneeca3262013-07-31 16:12:48 -0700797 sampleRate, format, channelMask, frameCount, &flags, tid, &sessionId, &status);
Glenn Kastene93cf2c2013-09-24 11:52:37 -0700798 LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
Glenn Kasteneeca3262013-07-31 16:12:48 -0700799 reply->writeInt32(flags);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700800 reply->writeInt32(sessionId);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800801 reply->writeInt32(status);
802 reply->writeStrongBinder(record->asBinder());
803 return NO_ERROR;
804 } break;
805 case SAMPLE_RATE: {
806 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800807 reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800808 return NO_ERROR;
809 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800810 case FORMAT: {
811 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800812 reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800813 return NO_ERROR;
814 } break;
815 case FRAME_COUNT: {
816 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800817 reply->writeInt32( frameCount((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800818 return NO_ERROR;
819 } break;
820 case LATENCY: {
821 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800822 reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800823 return NO_ERROR;
824 } break;
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700825 case SET_MASTER_VOLUME: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800826 CHECK_INTERFACE(IAudioFlinger, data, reply);
827 reply->writeInt32( setMasterVolume(data.readFloat()) );
828 return NO_ERROR;
829 } break;
830 case SET_MASTER_MUTE: {
831 CHECK_INTERFACE(IAudioFlinger, data, reply);
832 reply->writeInt32( setMasterMute(data.readInt32()) );
833 return NO_ERROR;
834 } break;
835 case MASTER_VOLUME: {
836 CHECK_INTERFACE(IAudioFlinger, data, reply);
837 reply->writeFloat( masterVolume() );
838 return NO_ERROR;
839 } break;
840 case MASTER_MUTE: {
841 CHECK_INTERFACE(IAudioFlinger, data, reply);
842 reply->writeInt32( masterMute() );
843 return NO_ERROR;
844 } break;
845 case SET_STREAM_VOLUME: {
846 CHECK_INTERFACE(IAudioFlinger, data, reply);
847 int stream = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700848 float volume = data.readFloat();
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800849 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -0800850 reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800851 return NO_ERROR;
852 } break;
853 case SET_STREAM_MUTE: {
854 CHECK_INTERFACE(IAudioFlinger, data, reply);
855 int stream = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -0800856 reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800857 return NO_ERROR;
858 } break;
859 case STREAM_VOLUME: {
860 CHECK_INTERFACE(IAudioFlinger, data, reply);
861 int stream = data.readInt32();
Eric Laurentfa2877b2009-07-28 08:44:33 -0700862 int output = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -0800863 reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800864 return NO_ERROR;
865 } break;
866 case STREAM_MUTE: {
867 CHECK_INTERFACE(IAudioFlinger, data, reply);
868 int stream = data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -0800869 reply->writeInt32( streamMute((audio_stream_type_t) stream) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800870 return NO_ERROR;
871 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800872 case SET_MODE: {
873 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kastenf78aee72012-01-04 11:00:47 -0800874 audio_mode_t mode = (audio_mode_t) data.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800875 reply->writeInt32( setMode(mode) );
876 return NO_ERROR;
877 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800878 case SET_MIC_MUTE: {
879 CHECK_INTERFACE(IAudioFlinger, data, reply);
880 int state = data.readInt32();
881 reply->writeInt32( setMicMute(state) );
882 return NO_ERROR;
883 } break;
884 case GET_MIC_MUTE: {
885 CHECK_INTERFACE(IAudioFlinger, data, reply);
886 reply->writeInt32( getMicMute() );
887 return NO_ERROR;
888 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700889 case SET_PARAMETERS: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800890 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800891 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700892 String8 keyValuePairs(data.readString8());
893 reply->writeInt32(setParameters(ioHandle, keyValuePairs));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800894 return NO_ERROR;
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700895 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700896 case GET_PARAMETERS: {
897 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800898 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700899 String8 keys(data.readString8());
900 reply->writeString8(getParameters(ioHandle, keys));
901 return NO_ERROR;
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700902 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700903
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800904 case REGISTER_CLIENT: {
905 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten85ab62c2012-11-01 11:11:38 -0700906 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
907 data.readStrongBinder());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800908 registerClient(client);
909 return NO_ERROR;
910 } break;
911 case GET_INPUTBUFFERSIZE: {
912 CHECK_INTERFACE(IAudioFlinger, data, reply);
913 uint32_t sampleRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800914 audio_format_t format = (audio_format_t) data.readInt32();
Glenn Kastendd8104c2012-07-02 12:42:44 -0700915 audio_channel_mask_t channelMask = data.readInt32();
916 reply->writeInt32( getInputBufferSize(sampleRate, format, channelMask) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800917 return NO_ERROR;
918 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700919 case OPEN_OUTPUT: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800920 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta4c5a552012-03-29 10:12:40 -0700921 audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
922 audio_devices_t devices = (audio_devices_t)data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700923 uint32_t samplingRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800924 audio_format_t format = (audio_format_t) data.readInt32();
Eric Laurenta4c5a552012-03-29 10:12:40 -0700925 audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700926 uint32_t latency = data.readInt32();
Eric Laurent0ca3cf92012-04-18 09:24:29 -0700927 audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100928 bool hasOffloadInfo = data.readInt32() != 0;
929 audio_offload_info_t offloadInfo;
930 if (hasOffloadInfo) {
931 data.read(&offloadInfo, sizeof(audio_offload_info_t));
932 }
Eric Laurenta4c5a552012-03-29 10:12:40 -0700933 audio_io_handle_t output = openOutput(module,
934 &devices,
935 &samplingRate,
936 &format,
937 &channelMask,
938 &latency,
Richard Fitzgeraldb1a270d2013-05-14 12:12:21 +0100939 flags,
940 hasOffloadInfo ? &offloadInfo : NULL);
Steve Block3856b092011-10-20 11:56:00 +0100941 ALOGV("OPEN_OUTPUT output, %p", output);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800942 reply->writeInt32((int32_t) output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700943 reply->writeInt32(devices);
944 reply->writeInt32(samplingRate);
945 reply->writeInt32(format);
Eric Laurenta4c5a552012-03-29 10:12:40 -0700946 reply->writeInt32(channelMask);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700947 reply->writeInt32(latency);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800948 return NO_ERROR;
949 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700950 case OPEN_DUPLICATE_OUTPUT: {
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 output1 = (audio_io_handle_t) data.readInt32();
953 audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
954 reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700955 return NO_ERROR;
956 } break;
957 case CLOSE_OUTPUT: {
958 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800959 reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700960 return NO_ERROR;
961 } break;
962 case SUSPEND_OUTPUT: {
963 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800964 reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700965 return NO_ERROR;
966 } break;
967 case RESTORE_OUTPUT: {
968 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800969 reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700970 return NO_ERROR;
971 } break;
972 case OPEN_INPUT: {
973 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta4c5a552012-03-29 10:12:40 -0700974 audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
975 audio_devices_t devices = (audio_devices_t)data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700976 uint32_t samplingRate = data.readInt32();
Glenn Kasten58f30212012-01-12 12:27:51 -0800977 audio_format_t format = (audio_format_t) data.readInt32();
Eric Laurenta4c5a552012-03-29 10:12:40 -0700978 audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700979
Eric Laurenta4c5a552012-03-29 10:12:40 -0700980 audio_io_handle_t input = openInput(module,
981 &devices,
982 &samplingRate,
983 &format,
984 &channelMask);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800985 reply->writeInt32((int32_t) input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700986 reply->writeInt32(devices);
987 reply->writeInt32(samplingRate);
988 reply->writeInt32(format);
Eric Laurenta4c5a552012-03-29 10:12:40 -0700989 reply->writeInt32(channelMask);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700990 return NO_ERROR;
991 } break;
992 case CLOSE_INPUT: {
993 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -0800994 reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700995 return NO_ERROR;
996 } break;
997 case SET_STREAM_OUTPUT: {
998 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700999 uint32_t stream = data.readInt32();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001000 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kastenfff6d712012-01-12 16:38:12 -08001001 reply->writeInt32(setStreamOutput((audio_stream_type_t) stream, output));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001002 return NO_ERROR;
1003 } break;
Eric Laurentf0ee6f42009-10-21 08:14:22 -07001004 case SET_VOICE_VOLUME: {
1005 CHECK_INTERFACE(IAudioFlinger, data, reply);
1006 float volume = data.readFloat();
1007 reply->writeInt32( setVoiceVolume(volume) );
1008 return NO_ERROR;
1009 } break;
Eric Laurent342e9cf2010-01-19 17:37:09 -08001010 case GET_RENDER_POSITION: {
1011 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001012 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Glenn Kastene33054e2012-11-14 12:54:39 -08001013 size_t halFrames;
1014 size_t dspFrames;
Eric Laurent342e9cf2010-01-19 17:37:09 -08001015 status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1016 reply->writeInt32(status);
1017 if (status == NO_ERROR) {
1018 reply->writeInt32(halFrames);
1019 reply->writeInt32(dspFrames);
1020 }
1021 return NO_ERROR;
1022 }
Eric Laurent05bca2f2010-02-26 02:47:27 -08001023 case GET_INPUT_FRAMES_LOST: {
1024 CHECK_INTERFACE(IAudioFlinger, data, reply);
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001025 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
Eric Laurent05bca2f2010-02-26 02:47:27 -08001026 reply->writeInt32(getInputFramesLost(ioHandle));
1027 return NO_ERROR;
1028 } break;
Eric Laurentbe916aa2010-06-01 23:49:17 -07001029 case NEW_AUDIO_SESSION_ID: {
1030 CHECK_INTERFACE(IAudioFlinger, data, reply);
1031 reply->writeInt32(newAudioSessionId());
1032 return NO_ERROR;
1033 } break;
Marco Nelissen3a34bef2011-08-02 13:33:41 -07001034 case ACQUIRE_AUDIO_SESSION_ID: {
1035 CHECK_INTERFACE(IAudioFlinger, data, reply);
1036 int audioSession = data.readInt32();
1037 acquireAudioSessionId(audioSession);
1038 return NO_ERROR;
1039 } break;
1040 case RELEASE_AUDIO_SESSION_ID: {
1041 CHECK_INTERFACE(IAudioFlinger, data, reply);
1042 int audioSession = data.readInt32();
1043 releaseAudioSessionId(audioSession);
1044 return NO_ERROR;
1045 } break;
Eric Laurentbe916aa2010-06-01 23:49:17 -07001046 case QUERY_NUM_EFFECTS: {
1047 CHECK_INTERFACE(IAudioFlinger, data, reply);
1048 uint32_t numEffects;
1049 status_t status = queryNumberEffects(&numEffects);
1050 reply->writeInt32(status);
1051 if (status == NO_ERROR) {
1052 reply->writeInt32((int32_t)numEffects);
1053 }
1054 return NO_ERROR;
1055 }
Eric Laurentffe9c252010-06-23 17:38:20 -07001056 case QUERY_EFFECT: {
Eric Laurentbe916aa2010-06-01 23:49:17 -07001057 CHECK_INTERFACE(IAudioFlinger, data, reply);
1058 effect_descriptor_t desc;
Eric Laurentffe9c252010-06-23 17:38:20 -07001059 status_t status = queryEffect(data.readInt32(), &desc);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001060 reply->writeInt32(status);
1061 if (status == NO_ERROR) {
1062 reply->write(&desc, sizeof(effect_descriptor_t));
1063 }
1064 return NO_ERROR;
1065 }
1066 case GET_EFFECT_DESCRIPTOR: {
1067 CHECK_INTERFACE(IAudioFlinger, data, reply);
1068 effect_uuid_t uuid;
1069 data.read(&uuid, sizeof(effect_uuid_t));
1070 effect_descriptor_t desc;
1071 status_t status = getEffectDescriptor(&uuid, &desc);
1072 reply->writeInt32(status);
1073 if (status == NO_ERROR) {
1074 reply->write(&desc, sizeof(effect_descriptor_t));
1075 }
1076 return NO_ERROR;
1077 }
1078 case CREATE_EFFECT: {
1079 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001080 effect_descriptor_t desc;
1081 data.read(&desc, sizeof(effect_descriptor_t));
1082 sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1083 int32_t priority = data.readInt32();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001084 audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
Eric Laurentbe916aa2010-06-01 23:49:17 -07001085 int sessionId = data.readInt32();
1086 status_t status;
1087 int id;
1088 int enabled;
Eric Laurent05bca2f2010-02-26 02:47:27 -08001089
Glenn Kasten8d6cc842012-02-03 11:06:53 -08001090 sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
Glenn Kasten85ab62c2012-11-01 11:11:38 -07001091 &status, &id, &enabled);
Eric Laurentbe916aa2010-06-01 23:49:17 -07001092 reply->writeInt32(status);
1093 reply->writeInt32(id);
1094 reply->writeInt32(enabled);
1095 reply->writeStrongBinder(effect->asBinder());
1096 reply->write(&desc, sizeof(effect_descriptor_t));
1097 return NO_ERROR;
1098 } break;
Eric Laurentde070132010-07-13 04:45:46 -07001099 case MOVE_EFFECTS: {
1100 CHECK_INTERFACE(IAudioFlinger, data, reply);
1101 int session = data.readInt32();
Glenn Kasten72ef00d2012-01-17 11:09:42 -08001102 audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
1103 audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
Eric Laurentde070132010-07-13 04:45:46 -07001104 reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1105 return NO_ERROR;
1106 } break;
Eric Laurenta4c5a552012-03-29 10:12:40 -07001107 case LOAD_HW_MODULE: {
1108 CHECK_INTERFACE(IAudioFlinger, data, reply);
1109 reply->writeInt32(loadHwModule(data.readCString()));
1110 return NO_ERROR;
1111 } break;
Glenn Kastencc0f1cf2012-09-24 11:27:18 -07001112 case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1113 CHECK_INTERFACE(IAudioFlinger, data, reply);
1114 reply->writeInt32(getPrimaryOutputSamplingRate());
1115 return NO_ERROR;
1116 } break;
1117 case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1118 CHECK_INTERFACE(IAudioFlinger, data, reply);
1119 reply->writeInt32(getPrimaryOutputFrameCount());
1120 return NO_ERROR;
1121 } break;
Glenn Kasten4182c4e2013-07-15 14:45:07 -07001122 case SET_LOW_RAM_DEVICE: {
1123 CHECK_INTERFACE(IAudioFlinger, data, reply);
1124 bool isLowRamDevice = data.readInt32() != 0;
1125 reply->writeInt32(setLowRamDevice(isLowRamDevice));
1126 return NO_ERROR;
1127 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001128 default:
1129 return BBinder::onTransact(code, data, reply, flags);
1130 }
1131}
1132
1133// ----------------------------------------------------------------------------
1134
1135}; // namespace android