blob: eec47c0945176b6f8f6df8f11c56ae3e79abf192 [file] [log] [blame]
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001/* //device/extlibs/pv/android/IAudioflinger.cpp
2**
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,
35 CHANNEL_COUNT,
36 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,
66 LOAD_EFFECT_LIBRARY,
67 UNLOAD_EFFECT_LIBRARY,
68 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,
72 MOVE_EFFECTS
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080073};
74
75class BpAudioFlinger : public BpInterface<IAudioFlinger>
76{
77public:
78 BpAudioFlinger(const sp<IBinder>& impl)
79 : BpInterface<IAudioFlinger>(impl)
80 {
81 }
82
83 virtual sp<IAudioTrack> createTrack(
84 pid_t pid,
85 int streamType,
86 uint32_t sampleRate,
87 int format,
88 int channelCount,
89 int frameCount,
90 uint32_t flags,
91 const sp<IMemory>& sharedBuffer,
Eric Laurentfa2877b2009-07-28 08:44:33 -070092 int output,
Eric Laurentbe916aa2010-06-01 23:49:17 -070093 int *sessionId,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080094 status_t *status)
95 {
96 Parcel data, reply;
Eric Laurent5841db72009-09-09 05:16:08 -070097 sp<IAudioTrack> track;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080098 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
99 data.writeInt32(pid);
100 data.writeInt32(streamType);
101 data.writeInt32(sampleRate);
102 data.writeInt32(format);
103 data.writeInt32(channelCount);
104 data.writeInt32(frameCount);
105 data.writeInt32(flags);
106 data.writeStrongBinder(sharedBuffer->asBinder());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700107 data.writeInt32(output);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700108 int lSessionId = 0;
109 if (sessionId != NULL) {
110 lSessionId = *sessionId;
111 }
112 data.writeInt32(lSessionId);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800113 status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
114 if (lStatus != NO_ERROR) {
115 LOGE("createTrack error: %s", strerror(-lStatus));
Eric Laurent5841db72009-09-09 05:16:08 -0700116 } else {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700117 lSessionId = reply.readInt32();
118 if (sessionId != NULL) {
119 *sessionId = lSessionId;
120 }
Eric Laurent5841db72009-09-09 05:16:08 -0700121 lStatus = reply.readInt32();
122 track = interface_cast<IAudioTrack>(reply.readStrongBinder());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800123 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800124 if (status) {
125 *status = lStatus;
126 }
Eric Laurent5841db72009-09-09 05:16:08 -0700127 return track;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800128 }
129
130 virtual sp<IAudioRecord> openRecord(
131 pid_t pid,
Eric Laurentfa2877b2009-07-28 08:44:33 -0700132 int input,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800133 uint32_t sampleRate,
134 int format,
135 int channelCount,
136 int frameCount,
137 uint32_t flags,
Eric Laurentbe916aa2010-06-01 23:49:17 -0700138 int *sessionId,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800139 status_t *status)
140 {
141 Parcel data, reply;
Eric Laurent5841db72009-09-09 05:16:08 -0700142 sp<IAudioRecord> record;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800143 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
144 data.writeInt32(pid);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700145 data.writeInt32(input);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800146 data.writeInt32(sampleRate);
147 data.writeInt32(format);
148 data.writeInt32(channelCount);
149 data.writeInt32(frameCount);
150 data.writeInt32(flags);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700151 int lSessionId = 0;
152 if (sessionId != NULL) {
153 lSessionId = *sessionId;
154 }
155 data.writeInt32(lSessionId);
Eric Laurent5841db72009-09-09 05:16:08 -0700156 status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
157 if (lStatus != NO_ERROR) {
158 LOGE("openRecord error: %s", strerror(-lStatus));
159 } else {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700160 lSessionId = reply.readInt32();
161 if (sessionId != NULL) {
162 *sessionId = lSessionId;
163 }
Eric Laurent5841db72009-09-09 05:16:08 -0700164 lStatus = reply.readInt32();
165 record = interface_cast<IAudioRecord>(reply.readStrongBinder());
166 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800167 if (status) {
168 *status = lStatus;
169 }
Eric Laurent5841db72009-09-09 05:16:08 -0700170 return record;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800171 }
172
Eric Laurentfa2877b2009-07-28 08:44:33 -0700173 virtual uint32_t sampleRate(int output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800174 {
175 Parcel data, reply;
176 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700177 data.writeInt32(output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800178 remote()->transact(SAMPLE_RATE, data, &reply);
179 return reply.readInt32();
180 }
181
Eric Laurentfa2877b2009-07-28 08:44:33 -0700182 virtual int channelCount(int output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800183 {
184 Parcel data, reply;
185 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700186 data.writeInt32(output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800187 remote()->transact(CHANNEL_COUNT, data, &reply);
188 return reply.readInt32();
189 }
190
Eric Laurentfa2877b2009-07-28 08:44:33 -0700191 virtual int format(int output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800192 {
193 Parcel data, reply;
194 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700195 data.writeInt32(output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800196 remote()->transact(FORMAT, data, &reply);
197 return reply.readInt32();
198 }
199
Eric Laurentfa2877b2009-07-28 08:44:33 -0700200 virtual size_t frameCount(int output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800201 {
202 Parcel data, reply;
203 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700204 data.writeInt32(output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800205 remote()->transact(FRAME_COUNT, data, &reply);
206 return reply.readInt32();
207 }
208
Eric Laurentfa2877b2009-07-28 08:44:33 -0700209 virtual uint32_t latency(int output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800210 {
211 Parcel data, reply;
212 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700213 data.writeInt32(output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800214 remote()->transact(LATENCY, data, &reply);
215 return reply.readInt32();
216 }
217
218 virtual status_t setMasterVolume(float value)
219 {
220 Parcel data, reply;
221 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
222 data.writeFloat(value);
223 remote()->transact(SET_MASTER_VOLUME, data, &reply);
224 return reply.readInt32();
225 }
226
227 virtual status_t setMasterMute(bool muted)
228 {
229 Parcel data, reply;
230 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
231 data.writeInt32(muted);
232 remote()->transact(SET_MASTER_MUTE, data, &reply);
233 return reply.readInt32();
234 }
235
236 virtual float masterVolume() const
237 {
238 Parcel data, reply;
239 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
240 remote()->transact(MASTER_VOLUME, data, &reply);
241 return reply.readFloat();
242 }
243
244 virtual bool masterMute() const
245 {
246 Parcel data, reply;
247 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
248 remote()->transact(MASTER_MUTE, data, &reply);
249 return reply.readInt32();
250 }
251
Eric Laurentfa2877b2009-07-28 08:44:33 -0700252 virtual status_t setStreamVolume(int stream, float value, int output)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800253 {
254 Parcel data, reply;
255 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
256 data.writeInt32(stream);
257 data.writeFloat(value);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700258 data.writeInt32(output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800259 remote()->transact(SET_STREAM_VOLUME, data, &reply);
260 return reply.readInt32();
261 }
262
263 virtual status_t setStreamMute(int stream, bool muted)
264 {
265 Parcel data, reply;
266 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
267 data.writeInt32(stream);
268 data.writeInt32(muted);
269 remote()->transact(SET_STREAM_MUTE, data, &reply);
270 return reply.readInt32();
271 }
272
Eric Laurentfa2877b2009-07-28 08:44:33 -0700273 virtual float streamVolume(int stream, int output) const
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800274 {
275 Parcel data, reply;
276 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
277 data.writeInt32(stream);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700278 data.writeInt32(output);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800279 remote()->transact(STREAM_VOLUME, data, &reply);
280 return reply.readFloat();
281 }
282
283 virtual bool streamMute(int stream) const
284 {
285 Parcel data, reply;
286 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
287 data.writeInt32(stream);
288 remote()->transact(STREAM_MUTE, data, &reply);
289 return reply.readInt32();
290 }
291
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800292 virtual status_t setMode(int mode)
293 {
294 Parcel data, reply;
295 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
296 data.writeInt32(mode);
297 remote()->transact(SET_MODE, data, &reply);
298 return reply.readInt32();
299 }
300
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800301 virtual status_t setMicMute(bool state)
302 {
303 Parcel data, reply;
304 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
305 data.writeInt32(state);
306 remote()->transact(SET_MIC_MUTE, data, &reply);
307 return reply.readInt32();
308 }
309
310 virtual bool getMicMute() const
311 {
312 Parcel data, reply;
313 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
314 remote()->transact(GET_MIC_MUTE, data, &reply);
315 return reply.readInt32();
316 }
317
Eric Laurentfa2877b2009-07-28 08:44:33 -0700318 virtual status_t setParameters(int ioHandle, const String8& keyValuePairs)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800319 {
320 Parcel data, reply;
321 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700322 data.writeInt32(ioHandle);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700323 data.writeString8(keyValuePairs);
324 remote()->transact(SET_PARAMETERS, data, &reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800325 return reply.readInt32();
326 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700327
Eric Laurentfa2877b2009-07-28 08:44:33 -0700328 virtual String8 getParameters(int ioHandle, const String8& keys)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700329 {
330 Parcel data, reply;
331 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700332 data.writeInt32(ioHandle);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700333 data.writeString8(keys);
334 remote()->transact(GET_PARAMETERS, data, &reply);
335 return reply.readString8();
336 }
337
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800338 virtual void registerClient(const sp<IAudioFlingerClient>& client)
339 {
340 Parcel data, reply;
341 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
342 data.writeStrongBinder(client->asBinder());
343 remote()->transact(REGISTER_CLIENT, data, &reply);
344 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700345
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800346 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
347 {
348 Parcel data, reply;
349 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
350 data.writeInt32(sampleRate);
351 data.writeInt32(format);
352 data.writeInt32(channelCount);
353 remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
354 return reply.readInt32();
355 }
Eric Laurentc2f1f072009-07-17 12:17:14 -0700356
Eric Laurentfa2877b2009-07-28 08:44:33 -0700357 virtual int openOutput(uint32_t *pDevices,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700358 uint32_t *pSamplingRate,
359 uint32_t *pFormat,
360 uint32_t *pChannels,
361 uint32_t *pLatencyMs,
362 uint32_t flags)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800363 {
364 Parcel data, reply;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700365 uint32_t devices = pDevices ? *pDevices : 0;
366 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
367 uint32_t format = pFormat ? *pFormat : 0;
368 uint32_t channels = pChannels ? *pChannels : 0;
369 uint32_t latency = pLatencyMs ? *pLatencyMs : 0;
370
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800371 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700372 data.writeInt32(devices);
373 data.writeInt32(samplingRate);
374 data.writeInt32(format);
375 data.writeInt32(channels);
376 data.writeInt32(latency);
377 data.writeInt32(flags);
378 remote()->transact(OPEN_OUTPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700379 int output = reply.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700380 LOGV("openOutput() returned output, %p", output);
381 devices = reply.readInt32();
382 if (pDevices) *pDevices = devices;
383 samplingRate = reply.readInt32();
384 if (pSamplingRate) *pSamplingRate = samplingRate;
385 format = reply.readInt32();
386 if (pFormat) *pFormat = format;
387 channels = reply.readInt32();
388 if (pChannels) *pChannels = channels;
389 latency = reply.readInt32();
390 if (pLatencyMs) *pLatencyMs = latency;
391 return output;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800392 }
393
Eric Laurentfa2877b2009-07-28 08:44:33 -0700394 virtual int openDuplicateOutput(int output1, int output2)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800395 {
396 Parcel data, reply;
397 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700398 data.writeInt32(output1);
399 data.writeInt32(output2);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700400 remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700401 return reply.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700402 }
403
Eric Laurentfa2877b2009-07-28 08:44:33 -0700404 virtual status_t closeOutput(int output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700405 {
406 Parcel data, reply;
407 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700408 data.writeInt32(output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700409 remote()->transact(CLOSE_OUTPUT, data, &reply);
410 return reply.readInt32();
411 }
412
Eric Laurentfa2877b2009-07-28 08:44:33 -0700413 virtual status_t suspendOutput(int output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700414 {
415 Parcel data, reply;
416 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700417 data.writeInt32(output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700418 remote()->transact(SUSPEND_OUTPUT, data, &reply);
419 return reply.readInt32();
420 }
421
Eric Laurentfa2877b2009-07-28 08:44:33 -0700422 virtual status_t restoreOutput(int output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700423 {
424 Parcel data, reply;
425 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700426 data.writeInt32(output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700427 remote()->transact(RESTORE_OUTPUT, data, &reply);
428 return reply.readInt32();
429 }
430
Eric Laurentfa2877b2009-07-28 08:44:33 -0700431 virtual int openInput(uint32_t *pDevices,
432 uint32_t *pSamplingRate,
433 uint32_t *pFormat,
434 uint32_t *pChannels,
435 uint32_t acoustics)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700436 {
437 Parcel data, reply;
438 uint32_t devices = pDevices ? *pDevices : 0;
439 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
440 uint32_t format = pFormat ? *pFormat : 0;
441 uint32_t channels = pChannels ? *pChannels : 0;
442
443 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
444 data.writeInt32(devices);
445 data.writeInt32(samplingRate);
446 data.writeInt32(format);
447 data.writeInt32(channels);
448 data.writeInt32(acoustics);
449 remote()->transact(OPEN_INPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700450 int input = reply.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700451 devices = reply.readInt32();
452 if (pDevices) *pDevices = devices;
453 samplingRate = reply.readInt32();
454 if (pSamplingRate) *pSamplingRate = samplingRate;
455 format = reply.readInt32();
456 if (pFormat) *pFormat = format;
457 channels = reply.readInt32();
458 if (pChannels) *pChannels = channels;
459 return input;
460 }
461
Eric Laurentfa2877b2009-07-28 08:44:33 -0700462 virtual status_t closeInput(int input)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700463 {
464 Parcel data, reply;
465 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700466 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700467 remote()->transact(CLOSE_INPUT, data, &reply);
468 return reply.readInt32();
469 }
470
Eric Laurentfa2877b2009-07-28 08:44:33 -0700471 virtual status_t setStreamOutput(uint32_t stream, int output)
Eric Laurentc2f1f072009-07-17 12:17:14 -0700472 {
473 Parcel data, reply;
474 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
475 data.writeInt32(stream);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700476 data.writeInt32(output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700477 remote()->transact(SET_STREAM_OUTPUT, data, &reply);
478 return reply.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800479 }
Eric Laurentf0ee6f42009-10-21 08:14:22 -0700480
481 virtual status_t setVoiceVolume(float volume)
482 {
483 Parcel data, reply;
484 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
485 data.writeFloat(volume);
486 remote()->transact(SET_VOICE_VOLUME, data, &reply);
487 return reply.readInt32();
488 }
Eric Laurent342e9cf2010-01-19 17:37:09 -0800489
490 virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output)
491 {
492 Parcel data, reply;
493 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
494 data.writeInt32(output);
495 remote()->transact(GET_RENDER_POSITION, data, &reply);
496 status_t status = reply.readInt32();
497 if (status == NO_ERROR) {
498 uint32_t tmp = reply.readInt32();
499 if (halFrames) {
500 *halFrames = tmp;
501 }
502 tmp = reply.readInt32();
503 if (dspFrames) {
504 *dspFrames = tmp;
505 }
506 }
507 return status;
508 }
Eric Laurent05bca2f2010-02-26 02:47:27 -0800509
510 virtual unsigned int getInputFramesLost(int ioHandle)
511 {
512 Parcel data, reply;
513 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
514 data.writeInt32(ioHandle);
515 remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
516 return reply.readInt32();
517 }
Eric Laurentbe916aa2010-06-01 23:49:17 -0700518
519 virtual int newAudioSessionId()
520 {
521 Parcel data, reply;
522 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
523 status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
524 int id = 0;
525 if (status == NO_ERROR) {
526 id = reply.readInt32();
527 }
528 return id;
529 }
530
531 virtual status_t loadEffectLibrary(const char *libPath, int *handle)
532 {
533 if (libPath == NULL || handle == NULL) {
534 return BAD_VALUE;
535 }
536 *handle = 0;
537 Parcel data, reply;
538 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
539 data.writeCString(libPath);
540 status_t status = remote()->transact(LOAD_EFFECT_LIBRARY, data, &reply);
541 if (status == NO_ERROR) {
542 status = reply.readInt32();
543 if (status == NO_ERROR) {
544 *handle = reply.readInt32();
545 }
546 }
547 return status;
548 }
549
550 virtual status_t unloadEffectLibrary(int handle)
551 {
552 Parcel data, reply;
553 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
554 data.writeInt32(handle);
555 status_t status = remote()->transact(UNLOAD_EFFECT_LIBRARY, data, &reply);
556 if (status == NO_ERROR) {
557 status = reply.readInt32();
558 }
559 return status;
560 }
561
562 virtual status_t queryNumberEffects(uint32_t *numEffects)
563 {
564 Parcel data, reply;
565 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
566 status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
567 if (status != NO_ERROR) {
568 return status;
569 }
570 status = reply.readInt32();
571 if (status != NO_ERROR) {
572 return status;
573 }
574 if (numEffects) {
575 *numEffects = (uint32_t)reply.readInt32();
576 }
577 return NO_ERROR;
578 }
579
Eric Laurentffe9c252010-06-23 17:38:20 -0700580 virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor)
Eric Laurentbe916aa2010-06-01 23:49:17 -0700581 {
582 if (pDescriptor == NULL) {
583 return BAD_VALUE;
584 }
585 Parcel data, reply;
586 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentffe9c252010-06-23 17:38:20 -0700587 data.writeInt32(index);
588 status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700589 if (status != NO_ERROR) {
590 return status;
591 }
592 status = reply.readInt32();
593 if (status != NO_ERROR) {
594 return status;
595 }
596 reply.read(pDescriptor, sizeof(effect_descriptor_t));
597 return NO_ERROR;
598 }
599
600 virtual status_t getEffectDescriptor(effect_uuid_t *pUuid, effect_descriptor_t *pDescriptor)
601 {
602 if (pUuid == NULL || pDescriptor == NULL) {
603 return BAD_VALUE;
604 }
605 Parcel data, reply;
606 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
607 data.write(pUuid, sizeof(effect_uuid_t));
608 status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
609 if (status != NO_ERROR) {
610 return status;
611 }
612 status = reply.readInt32();
613 if (status != NO_ERROR) {
614 return status;
615 }
616 reply.read(pDescriptor, sizeof(effect_descriptor_t));
617 return NO_ERROR;
618 }
619
620 virtual sp<IEffect> createEffect(pid_t pid,
621 effect_descriptor_t *pDesc,
622 const sp<IEffectClient>& client,
623 int32_t priority,
624 int output,
625 int sessionId,
626 status_t *status,
627 int *id,
628 int *enabled)
629 {
630 Parcel data, reply;
631 sp<IEffect> effect;
632
633 if (pDesc == NULL) {
634 return effect;
635 if (status) {
636 *status = BAD_VALUE;
637 }
638 }
639
640 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
641 data.writeInt32(pid);
642 data.write(pDesc, sizeof(effect_descriptor_t));
643 data.writeStrongBinder(client->asBinder());
644 data.writeInt32(priority);
645 data.writeInt32(output);
646 data.writeInt32(sessionId);
647
648 status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
649 if (lStatus != NO_ERROR) {
650 LOGE("createEffect error: %s", strerror(-lStatus));
651 } else {
652 lStatus = reply.readInt32();
653 int tmp = reply.readInt32();
654 if (id) {
655 *id = tmp;
656 }
657 tmp = reply.readInt32();
658 if (enabled) {
659 *enabled = tmp;
660 }
661 effect = interface_cast<IEffect>(reply.readStrongBinder());
662 reply.read(pDesc, sizeof(effect_descriptor_t));
663 }
664 if (status) {
665 *status = lStatus;
666 }
667
668 return effect;
669 }
Eric Laurentde070132010-07-13 04:45:46 -0700670
671 virtual status_t moveEffects(int session, int srcOutput, int dstOutput)
672 {
673 Parcel data, reply;
674 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
675 data.writeInt32(session);
676 data.writeInt32(srcOutput);
677 data.writeInt32(dstOutput);
678 remote()->transact(MOVE_EFFECTS, data, &reply);
679 return reply.readInt32();
680 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800681};
682
683IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
684
685// ----------------------------------------------------------------------
686
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800687status_t BnAudioFlinger::onTransact(
688 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
689{
690 switch(code) {
691 case CREATE_TRACK: {
692 CHECK_INTERFACE(IAudioFlinger, data, reply);
693 pid_t pid = data.readInt32();
694 int streamType = data.readInt32();
695 uint32_t sampleRate = data.readInt32();
696 int format = data.readInt32();
697 int channelCount = data.readInt32();
698 size_t bufferCount = data.readInt32();
699 uint32_t flags = data.readInt32();
700 sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700701 int output = data.readInt32();
Eric Laurentbe916aa2010-06-01 23:49:17 -0700702 int sessionId = data.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800703 status_t status;
704 sp<IAudioTrack> track = createTrack(pid,
705 streamType, sampleRate, format,
Eric Laurentbe916aa2010-06-01 23:49:17 -0700706 channelCount, bufferCount, flags, buffer, output, &sessionId, &status);
707 reply->writeInt32(sessionId);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800708 reply->writeInt32(status);
709 reply->writeStrongBinder(track->asBinder());
710 return NO_ERROR;
711 } break;
712 case OPEN_RECORD: {
713 CHECK_INTERFACE(IAudioFlinger, data, reply);
714 pid_t pid = data.readInt32();
Eric Laurentfa2877b2009-07-28 08:44:33 -0700715 int input = data.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800716 uint32_t sampleRate = data.readInt32();
717 int format = data.readInt32();
718 int channelCount = data.readInt32();
719 size_t bufferCount = data.readInt32();
720 uint32_t flags = data.readInt32();
Eric Laurentbe916aa2010-06-01 23:49:17 -0700721 int sessionId = data.readInt32();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800722 status_t status;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700723 sp<IAudioRecord> record = openRecord(pid, input,
Eric Laurentbe916aa2010-06-01 23:49:17 -0700724 sampleRate, format, channelCount, bufferCount, flags, &sessionId, &status);
725 reply->writeInt32(sessionId);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800726 reply->writeInt32(status);
727 reply->writeStrongBinder(record->asBinder());
728 return NO_ERROR;
729 } break;
730 case SAMPLE_RATE: {
731 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700732 reply->writeInt32( sampleRate(data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800733 return NO_ERROR;
734 } break;
735 case CHANNEL_COUNT: {
736 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700737 reply->writeInt32( channelCount(data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800738 return NO_ERROR;
739 } break;
740 case FORMAT: {
741 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700742 reply->writeInt32( format(data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800743 return NO_ERROR;
744 } break;
745 case FRAME_COUNT: {
746 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700747 reply->writeInt32( frameCount(data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800748 return NO_ERROR;
749 } break;
750 case LATENCY: {
751 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700752 reply->writeInt32( latency(data.readInt32()) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800753 return NO_ERROR;
754 } break;
755 case SET_MASTER_VOLUME: {
756 CHECK_INTERFACE(IAudioFlinger, data, reply);
757 reply->writeInt32( setMasterVolume(data.readFloat()) );
758 return NO_ERROR;
759 } break;
760 case SET_MASTER_MUTE: {
761 CHECK_INTERFACE(IAudioFlinger, data, reply);
762 reply->writeInt32( setMasterMute(data.readInt32()) );
763 return NO_ERROR;
764 } break;
765 case MASTER_VOLUME: {
766 CHECK_INTERFACE(IAudioFlinger, data, reply);
767 reply->writeFloat( masterVolume() );
768 return NO_ERROR;
769 } break;
770 case MASTER_MUTE: {
771 CHECK_INTERFACE(IAudioFlinger, data, reply);
772 reply->writeInt32( masterMute() );
773 return NO_ERROR;
774 } break;
775 case SET_STREAM_VOLUME: {
776 CHECK_INTERFACE(IAudioFlinger, data, reply);
777 int stream = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700778 float volume = data.readFloat();
Eric Laurentfa2877b2009-07-28 08:44:33 -0700779 int output = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700780 reply->writeInt32( setStreamVolume(stream, volume, output) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800781 return NO_ERROR;
782 } break;
783 case SET_STREAM_MUTE: {
784 CHECK_INTERFACE(IAudioFlinger, data, reply);
785 int stream = data.readInt32();
786 reply->writeInt32( setStreamMute(stream, data.readInt32()) );
787 return NO_ERROR;
788 } break;
789 case STREAM_VOLUME: {
790 CHECK_INTERFACE(IAudioFlinger, data, reply);
791 int stream = data.readInt32();
Eric Laurentfa2877b2009-07-28 08:44:33 -0700792 int output = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700793 reply->writeFloat( streamVolume(stream, output) );
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800794 return NO_ERROR;
795 } break;
796 case STREAM_MUTE: {
797 CHECK_INTERFACE(IAudioFlinger, data, reply);
798 int stream = data.readInt32();
799 reply->writeInt32( streamMute(stream) );
800 return NO_ERROR;
801 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800802 case SET_MODE: {
803 CHECK_INTERFACE(IAudioFlinger, data, reply);
804 int mode = data.readInt32();
805 reply->writeInt32( setMode(mode) );
806 return NO_ERROR;
807 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800808 case SET_MIC_MUTE: {
809 CHECK_INTERFACE(IAudioFlinger, data, reply);
810 int state = data.readInt32();
811 reply->writeInt32( setMicMute(state) );
812 return NO_ERROR;
813 } break;
814 case GET_MIC_MUTE: {
815 CHECK_INTERFACE(IAudioFlinger, data, reply);
816 reply->writeInt32( getMicMute() );
817 return NO_ERROR;
818 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700819 case SET_PARAMETERS: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800820 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700821 int ioHandle = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700822 String8 keyValuePairs(data.readString8());
823 reply->writeInt32(setParameters(ioHandle, keyValuePairs));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800824 return NO_ERROR;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700825 } break;
826 case GET_PARAMETERS: {
827 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700828 int ioHandle = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700829 String8 keys(data.readString8());
830 reply->writeString8(getParameters(ioHandle, keys));
831 return NO_ERROR;
832 } break;
833
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800834 case REGISTER_CLIENT: {
835 CHECK_INTERFACE(IAudioFlinger, data, reply);
836 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder());
837 registerClient(client);
838 return NO_ERROR;
839 } break;
840 case GET_INPUTBUFFERSIZE: {
841 CHECK_INTERFACE(IAudioFlinger, data, reply);
842 uint32_t sampleRate = data.readInt32();
843 int format = data.readInt32();
844 int channelCount = data.readInt32();
845 reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) );
846 return NO_ERROR;
847 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700848 case OPEN_OUTPUT: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800849 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700850 uint32_t devices = data.readInt32();
851 uint32_t samplingRate = data.readInt32();
852 uint32_t format = data.readInt32();
853 uint32_t channels = data.readInt32();
854 uint32_t latency = data.readInt32();
855 uint32_t flags = data.readInt32();
Eric Laurentfa2877b2009-07-28 08:44:33 -0700856 int output = openOutput(&devices,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700857 &samplingRate,
858 &format,
859 &channels,
860 &latency,
861 flags);
862 LOGV("OPEN_OUTPUT output, %p", output);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700863 reply->writeInt32(output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700864 reply->writeInt32(devices);
865 reply->writeInt32(samplingRate);
866 reply->writeInt32(format);
867 reply->writeInt32(channels);
868 reply->writeInt32(latency);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800869 return NO_ERROR;
870 } break;
Eric Laurentc2f1f072009-07-17 12:17:14 -0700871 case OPEN_DUPLICATE_OUTPUT: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800872 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700873 int output1 = data.readInt32();
874 int output2 = data.readInt32();
875 reply->writeInt32(openDuplicateOutput(output1, output2));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700876 return NO_ERROR;
877 } break;
878 case CLOSE_OUTPUT: {
879 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700880 reply->writeInt32(closeOutput(data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700881 return NO_ERROR;
882 } break;
883 case SUSPEND_OUTPUT: {
884 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700885 reply->writeInt32(suspendOutput(data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700886 return NO_ERROR;
887 } break;
888 case RESTORE_OUTPUT: {
889 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700890 reply->writeInt32(restoreOutput(data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700891 return NO_ERROR;
892 } break;
893 case OPEN_INPUT: {
894 CHECK_INTERFACE(IAudioFlinger, data, reply);
895 uint32_t devices = data.readInt32();
896 uint32_t samplingRate = data.readInt32();
897 uint32_t format = data.readInt32();
898 uint32_t channels = data.readInt32();
899 uint32_t acoutics = data.readInt32();
900
Eric Laurentfa2877b2009-07-28 08:44:33 -0700901 int input = openInput(&devices,
Eric Laurentc2f1f072009-07-17 12:17:14 -0700902 &samplingRate,
903 &format,
904 &channels,
905 acoutics);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700906 reply->writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700907 reply->writeInt32(devices);
908 reply->writeInt32(samplingRate);
909 reply->writeInt32(format);
910 reply->writeInt32(channels);
911 return NO_ERROR;
912 } break;
913 case CLOSE_INPUT: {
914 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700915 reply->writeInt32(closeInput(data.readInt32()));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700916 return NO_ERROR;
917 } break;
918 case SET_STREAM_OUTPUT: {
919 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700920 uint32_t stream = data.readInt32();
Eric Laurentfa2877b2009-07-28 08:44:33 -0700921 int output = data.readInt32();
Eric Laurentc2f1f072009-07-17 12:17:14 -0700922 reply->writeInt32(setStreamOutput(stream, output));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800923 return NO_ERROR;
924 } break;
Eric Laurentf0ee6f42009-10-21 08:14:22 -0700925 case SET_VOICE_VOLUME: {
926 CHECK_INTERFACE(IAudioFlinger, data, reply);
927 float volume = data.readFloat();
928 reply->writeInt32( setVoiceVolume(volume) );
929 return NO_ERROR;
930 } break;
Eric Laurent342e9cf2010-01-19 17:37:09 -0800931 case GET_RENDER_POSITION: {
932 CHECK_INTERFACE(IAudioFlinger, data, reply);
933 int output = data.readInt32();
934 uint32_t halFrames;
935 uint32_t dspFrames;
936 status_t status = getRenderPosition(&halFrames, &dspFrames, output);
937 reply->writeInt32(status);
938 if (status == NO_ERROR) {
939 reply->writeInt32(halFrames);
940 reply->writeInt32(dspFrames);
941 }
942 return NO_ERROR;
943 }
Eric Laurent05bca2f2010-02-26 02:47:27 -0800944 case GET_INPUT_FRAMES_LOST: {
945 CHECK_INTERFACE(IAudioFlinger, data, reply);
946 int ioHandle = data.readInt32();
947 reply->writeInt32(getInputFramesLost(ioHandle));
948 return NO_ERROR;
949 } break;
Eric Laurentbe916aa2010-06-01 23:49:17 -0700950 case NEW_AUDIO_SESSION_ID: {
951 CHECK_INTERFACE(IAudioFlinger, data, reply);
952 reply->writeInt32(newAudioSessionId());
953 return NO_ERROR;
954 } break;
955 case LOAD_EFFECT_LIBRARY: {
956 CHECK_INTERFACE(IAudioFlinger, data, reply);
957 int handle;
958 status_t status = loadEffectLibrary(data.readCString(), &handle);
959 reply->writeInt32(status);
960 if (status == NO_ERROR) {
961 reply->writeInt32(handle);
962 }
963 return NO_ERROR;
964 }
965 case UNLOAD_EFFECT_LIBRARY: {
966 CHECK_INTERFACE(IAudioFlinger, data, reply);
967 reply->writeInt32(unloadEffectLibrary(data.readInt32()));
968 return NO_ERROR;
969 }
970 case QUERY_NUM_EFFECTS: {
971 CHECK_INTERFACE(IAudioFlinger, data, reply);
972 uint32_t numEffects;
973 status_t status = queryNumberEffects(&numEffects);
974 reply->writeInt32(status);
975 if (status == NO_ERROR) {
976 reply->writeInt32((int32_t)numEffects);
977 }
978 return NO_ERROR;
979 }
Eric Laurentffe9c252010-06-23 17:38:20 -0700980 case QUERY_EFFECT: {
Eric Laurentbe916aa2010-06-01 23:49:17 -0700981 CHECK_INTERFACE(IAudioFlinger, data, reply);
982 effect_descriptor_t desc;
Eric Laurentffe9c252010-06-23 17:38:20 -0700983 status_t status = queryEffect(data.readInt32(), &desc);
Eric Laurentbe916aa2010-06-01 23:49:17 -0700984 reply->writeInt32(status);
985 if (status == NO_ERROR) {
986 reply->write(&desc, sizeof(effect_descriptor_t));
987 }
988 return NO_ERROR;
989 }
990 case GET_EFFECT_DESCRIPTOR: {
991 CHECK_INTERFACE(IAudioFlinger, data, reply);
992 effect_uuid_t uuid;
993 data.read(&uuid, sizeof(effect_uuid_t));
994 effect_descriptor_t desc;
995 status_t status = getEffectDescriptor(&uuid, &desc);
996 reply->writeInt32(status);
997 if (status == NO_ERROR) {
998 reply->write(&desc, sizeof(effect_descriptor_t));
999 }
1000 return NO_ERROR;
1001 }
1002 case CREATE_EFFECT: {
1003 CHECK_INTERFACE(IAudioFlinger, data, reply);
1004 pid_t pid = data.readInt32();
1005 effect_descriptor_t desc;
1006 data.read(&desc, sizeof(effect_descriptor_t));
1007 sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1008 int32_t priority = data.readInt32();
1009 int output = data.readInt32();
1010 int sessionId = data.readInt32();
1011 status_t status;
1012 int id;
1013 int enabled;
Eric Laurent05bca2f2010-02-26 02:47:27 -08001014
Eric Laurentbe916aa2010-06-01 23:49:17 -07001015 sp<IEffect> effect = createEffect(pid, &desc, client, priority, output, sessionId, &status, &id, &enabled);
1016 reply->writeInt32(status);
1017 reply->writeInt32(id);
1018 reply->writeInt32(enabled);
1019 reply->writeStrongBinder(effect->asBinder());
1020 reply->write(&desc, sizeof(effect_descriptor_t));
1021 return NO_ERROR;
1022 } break;
Eric Laurentde070132010-07-13 04:45:46 -07001023 case MOVE_EFFECTS: {
1024 CHECK_INTERFACE(IAudioFlinger, data, reply);
1025 int session = data.readInt32();
1026 int srcOutput = data.readInt32();
1027 int dstOutput = data.readInt32();
1028 reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1029 return NO_ERROR;
1030 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001031 default:
1032 return BBinder::onTransact(code, data, reply, flags);
1033 }
1034}
1035
1036// ----------------------------------------------------------------------------
1037
1038}; // namespace android